ZGlmZiAtLWdpdCBhL2FhYy9BbmRyb2lkLm1rIGIvYWFjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5ZTgyMAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2FhY2RlY19zb3VyY2VzIDo9ICQoc29ydCAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvbGliQUFDZGVjL3NyYy8qLmNwcCkpCithYWNkZWNfc291cmNlcyA6PSAkKGFhY2RlY19zb3VyY2VzOiQoTE9DQUxfUEFUSCkvbGliQUFDZGVjL3NyYy8lPSUpCisKK2FhY2VuY19zb3VyY2VzIDo9ICQoc29ydCAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvbGliQUFDZW5jL3NyYy8qLmNwcCkpCithYWNlbmNfc291cmNlcyA6PSAkKGFhY2VuY19zb3VyY2VzOiQoTE9DQUxfUEFUSCkvbGliQUFDZW5jL3NyYy8lPSUpCisKK3BjbXV0aWxzX3NvdXJjZXMgOj0gJChzb3J0ICQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9saWJQQ011dGlscy9zcmMvKi5jcHApKQorcGNtdXRpbHNfc291cmNlcyA6PSAkKHBjbXV0aWxzX3NvdXJjZXM6JChMT0NBTF9QQVRIKS9saWJQQ011dGlscy9zcmMvJT0lKQorCitmZGtfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYkZESy9zcmMvKi5jcHApKQorZmRrX3NvdXJjZXMgOj0gJChmZGtfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYkZESy9zcmMvJT0lKQorCitzeXNfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYlNZUy9zcmMvKi5jcHApKQorc3lzX3NvdXJjZXMgOj0gJChzeXNfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYlNZUy9zcmMvJT0lKQorCittcGVndHBkZWNfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYk1wZWdUUERlYy9zcmMvKi5jcHApKQorbXBlZ3RwZGVjX3NvdXJjZXMgOj0gJChtcGVndHBkZWNfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYk1wZWdUUERlYy9zcmMvJT0lKQorCittcGVndHBlbmNfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYk1wZWdUUEVuYy9zcmMvKi5jcHApKQorbXBlZ3RwZW5jX3NvdXJjZXMgOj0gJChtcGVndHBlbmNfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYk1wZWdUUEVuYy9zcmMvJT0lKQorCitzYnJkZWNfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYlNCUmRlYy9zcmMvKi5jcHApKQorc2JyZGVjX3NvdXJjZXMgOj0gJChzYnJkZWNfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYlNCUmRlYy9zcmMvJT0lKQorCitzYnJlbmNfc291cmNlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL2xpYlNCUmVuYy9zcmMvKi5jcHApKQorc2JyZW5jX3NvdXJjZXMgOj0gJChzYnJlbmNfc291cmNlczokKExPQ0FMX1BBVEgpL2xpYlNCUmVuYy9zcmMvJT0lKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICAkKGFhY2RlY19zb3VyY2VzOiU9bGliQUFDZGVjL3NyYy8lKSBcCisgICAgICAgICQoYWFjZW5jX3NvdXJjZXM6JT1saWJBQUNlbmMvc3JjLyUpIFwKKyAgICAgICAgJChwY211dGlsc19zb3VyY2VzOiU9bGliUENNdXRpbHMvc3JjLyUpIFwKKyAgICAgICAgJChmZGtfc291cmNlczolPWxpYkZESy9zcmMvJSkgXAorICAgICAgICAkKHN5c19zb3VyY2VzOiU9bGliU1lTL3NyYy8lKSBcCisgICAgICAgICQobXBlZ3RwZGVjX3NvdXJjZXM6JT1saWJNcGVnVFBEZWMvc3JjLyUpIFwKKyAgICAgICAgJChtcGVndHBlbmNfc291cmNlczolPWxpYk1wZWdUUEVuYy9zcmMvJSkgXAorICAgICAgICAkKHNicmRlY19zb3VyY2VzOiU9bGliU0JSZGVjL3NyYy8lKSBcCisgICAgICAgICQoc2JyZW5jX3NvdXJjZXM6JT1saWJTQlJlbmMvc3JjLyUpCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXNlcXVlbmNlLXBvaW50IC1Xbm8tZXh0cmEKK0xPQ0FMX0NGTEFHUyArPSAiLVduby1cI3dhcm5pbmdzIiAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2xpYkFBQ2RlYy9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9saWJBQUNlbmMvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvbGliUENNdXRpbHMvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvbGliRkRLL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2xpYlNZUy9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9saWJNcGVnVFBEZWMvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvbGliTXBlZ1RQRW5jL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2xpYlNCUmRlYy9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9saWJTQlJlbmMvaW5jbHVkZQorCisKK0xPQ0FMX0NQUEZMQUdTICs9IC1zdGQ9YysrOTgKKworTE9DQUxfTU9EVUxFOj0gbGliRnJhdW5ob2ZlckFBQworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9hYWMvTU9EVUxFX0xJQ0VOU0VfRlJBVU5IT0ZFUiBiL2FhYy9NT0RVTEVfTElDRU5TRV9GUkFVTkhPRkVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvTU9EVUxFX0xJQ0VOU0VfRlJBVU5IT0ZFUgpkaWZmIC0tZ2l0IGEvYWFjL05PVElDRSBiL2FhYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0ODhjYwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9OT1RJQ0UKQEAgLTAsMCArMSw4MCBAQAorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTIgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKzEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCisKZGlmZiAtLWdpdCBhL2FhYy9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmIGIvYWFjL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4ODU3NgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FhYy9kb2N1bWVudGF0aW9uL2FhY0VuY29kZXIucGRmIGIvYWFjL2RvY3VtZW50YXRpb24vYWFjRW5jb2Rlci5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0MjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9kb2N1bWVudGF0aW9uL2FhY0VuY29kZXIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oIGIvYWFjL2xpYkFBQ2RlYy9pbmNsdWRlL2FhY2RlY29kZXJfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjMDg1NAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oCkBAIC0wLDAgKzEsNzU2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcZmlsZSAgIGFhY2RlY29kZXJfbGliLmgKKyAqIFxicmllZiAgRkRLIEFBQyBkZWNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgorICoKKworXHBhZ2UgSU5UUk8gSW50cm9kdWN0aW9uCisKK1xzZWN0aW9uIFNDT1BFIFNjb3BlCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBhbmQgdXNhZ2Ugb2YgdGhlIElTTy9NUEVHLTIvNCBBQUMgRGVjb2RlcgorbGlicmFyeSBkZXZlbG9wZWQgYnkgdGhlIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIChJSVMpLgorRGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24sIGl0IGltcGxlbWVudHMgZGVjb2Rpbmcgb2YgQUFDLUxDIChMb3ctQ29tcGxleGl0eSksCitIRS1BQUMgKEhpZ2gtRWZmaWNpZW5jeSBBQUMsIHYxIGFuZCB2MiksIEFBQy1MRCAoTG93LURlbGF5KSBhbmQgQUFDLUVMRCAoRW5oYW5jZWQgTG93LURlbGF5KS4KKworQWxsIHJlZmVyZW5jZXMgdG8gU0JSIChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyBhbmQgQUFDLUVMRAordmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuIEFsbCByZWZlcmVuY2VzIHRvIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgYXJlIG9ubHkgYXBwbGljYWJsZSB0bworSEUtQUFDIHYyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LgorCitcc2VjdGlvbiBEZWNvZGVyQmFzaWNzIERlY29kZXIgQmFzaWNzCisKK1RoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00IEFBQyBhdWRpbworY29kaW5nIHN0YW5kYXJkLiBUbyB1bmRlcnN0YW5kIGFsbCB0aGUgdGVybXMgaW4gdGhpcyBkb2N1bWVudCwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHJlYWQKK3RoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgorCistIElTTy9JRUMgMTM4MTgtNyAoTVBFRy0yIEFBQyksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTIgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCistIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydCAxIGFuZCA0KSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctNCBBQUMgYXVkaW8gYml0c3RyZWFtcy4KKy0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAorCitNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlIHNpZ25hbC4gVGhlIHNpZ25hbAoraXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKK2NvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC5cbgorQW4gTVBFRzIgb3IgTVBFRzQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yIExheWVyLTMgKG1wMyksCit0aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KK2FueSBsZW5ndGggYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCisKKworXHBhZ2UgTElCVVNFIExpYnJhcnkgVXNhZ2UKKworXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpdHBpb24gQVBJIERlc2NyaXB0aW9uCisKK0FsbCBBUEkgaGVhZGVyIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgL2luY2x1ZGUgb2YgdGhlIHJlbGVhc2UgcGFja2FnZS4gVGhleSBhcmUgZGVzY3JpYmVkIGluCitkZXRhaWwgaW4gdGhpcyBkb2N1bWVudC4gQWxsIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGRlY29kZXIgbGlicmFyeQorQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdCBhYWNkZWNvZGVyX2xpYi5oLgorCitJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGRlY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZSBsaWJBQUNkZWMuYSwKKyhMaW51eCkgb3IgRkRLX2FhY0RlY19saWIgKE1pY3Jvc29mdCBWaXN1YWwgQysrKS4KKworXHNlY3Rpb24gQ2FsbGluZ19TZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCisKK0ZvciBkZWNvZGluZyBvZiBJU08vTVBFRy0yLzQgQUFDIG9yIEhFLUFBQyB2MiBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LiBJbnB1dCByZWFkCithbmQgb3V0cHV0IHdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kIGNsb3NlIGZ1bmN0aW9ucyBhcmUgbGVmdCBvdXQsIHNpbmNlIHRoZXkKK21heSBiZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBzcGVjaWZpYyByZXF1aXJlbWVudHMuIFRoZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIGluCittYWluLmNwcCB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LCBhbmQgaW4gc3VjaCBjYXNlIGNhbGwgbXBlZ0ZpbGVSZWFkX09wZW4oKSB0byBvcGVuIGFuIGlucHV0IGZpbGUgYW5kCit0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkgdG8gY2xvc2Ugb3BlbmVkCitmaWxlcyBhbmQgdG8gZGUtYWxsb2NhdGUgYXNzb2NpYXRlZCBzdHJ1Y3R1cmVzLiBtcGVnRmlsZVJlYWRfT3BlbigpIHRyaWVzIHRvIGRldGVjdCB0aGUgYml0c3RyZWFtIGZvcm1hdCBhbmQKK2luIGNhc2Ugb2YgTVBFRy00IGZpbGUgZm9ybWF0IG9yIFJhdyBQYWNrZXRzIGZpbGUgZm9ybWF0IChhIEZyYXVuaG9mZXIgSUlTIHByb3ByaWV0YXJ5IGZvcm1hdCkgcmVhZHMgdGhlIEF1ZGlvCitTcGVjaWZpYyBDb25maWcgZGF0YSAoQVNDKS4gQW4gdW5zdWNjZXNzZnVsIGF0dGVtcHQgdG8gcmVjb2duaXplIHRoZSBiaXRzdHJlYW0gZm9ybWF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvCitwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gbWFudWFsbHkuIEZvciBhbnkgb3RoZXIgYml0c3RyZWFtIGZvcm1hdHMgdGhhdCBhcmUgdXN1YWxseSBhcHBsaWNhYmxlIGluIHN0cmVhbWluZworYXBwbGljYXRpb25zLCB0aGUgZGVjb2RlciBpdHNlbGYgd2lsbCB0cnkgdG8gc3luY2hyb25pemUgYW5kIHBhcnNlIHRoZSBnaXZlbiBiaXRzdHJlYW0gZnJhZ21lbnQgdXNpbmcgdGhlCitGREsgdHJhbnNwb3J0IGxpYnJhcnkuIEhlbmNlLCBmb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyAod2l0aG91dCBmaWxlIGFjY2VzcykgdGhpcyBzdGVwIGlzIG5vdCBuZWNlc3NhcnkuCisKKy0jIENhbGwgYWFjRGVjb2Rlcl9PcGVuKCkgdG8gb3BlbiBhbmQgcmV0cmlldmUgYSBoYW5kbGUgdG8gYSBuZXcgQUFDIGRlY29kZXIgaW5zdGFuY2UuCitcZG9udGluY2x1ZGUgbWFpbi5jcHAKK1xza2lwbGluZSBhYWNEZWNvZGVyX09wZW4KKy0jIElmIG91dC1vZi1iYW5kIGNvbmZpZyBkYXRhIChBdWRpbyBTcGVjaWZpYyBDb25maWcgKEFTQykgb3IgU3RyZWFtIE11eCBDb25maWcgKFNNQykpIGlzIGF2YWlsYWJsZSwgY2FsbAorYWFjRGVjb2Rlcl9Db25maWdSYXcoKSB0byBwYXNzIGl0IHRvIHRoZSBkZWNvZGVyIGFuZCBiZWZvcmUgdGhlIGRlY29kaW5nIHByb2Nlc3Mgc3RhcnRzLiBJZiB0aGlzIGRhdGEgaXMKK25vdCBhdmFpbGFibGUgaW4gYWR2YW5jZSwgdGhlIGRlY29kZXIgd2lsbCBnZXQgaXQgZnJvbSB0aGUgYml0c3RyZWFtICBhbmQgY29uZmlndXJlIGl0c2VsZiB3aGlsZSBkZWNvZGluZword2l0aCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuCistIyBCZWdpbiBkZWNvZGluZyBsb29wLgorXHNraXBsaW5lIGRvIHsKKy0jIFJlYWQgZGF0YSBmcm9tIGJpdHN0cmVhbSBmaWxlIG9yIHN0cmVhbSBpbnRvIGEgY2xpZW50LXN1cHBsaWVkIGlucHV0IGJ1ZmZlciAoImluQnVmZmVyIiBpbiBtYWluLmNwcCkuCitJZiBpdCBpcyB2ZXJ5IHNtYWxsIGxpa2UganVzdCA0LCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2lsbAorcmVwZWF0ZWRseSByZXR1cm4gOjpBQUNfREVDX05PVF9FTk9VR0hfQklUUyB1bnRpbCBlbm91Z2ggYml0cyB3ZXJlIGZlZCBieSBhYWNEZWNvZGVyX0ZpbGwoKS4gT25seSByZWFkIGRhdGEKK3doZW4gdGhpcyBidWZmZXIgaGFzIGNvbXBsZXRlbHkgYmVlbiBwcm9jZXNzZWQgYW5kIGlzIHRoZW4gZW1wdHkuIEZvciBmaWxlLWJhc2VkIGlucHV0IGV4ZWN1dGUKK21wZWdGaWxlUmVhZF9SZWFkKCkgb3IgYW55IG90aGVyIGltcGxlbWVudGF0aW9uIHdpdGggc2ltaWxhciBmdW5jdGlvbmFsaXR5LgorLSMgQ2FsbCBhYWNEZWNvZGVyX0ZpbGwoKSB0byBmaWxsIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGlucHV0IGJ1ZmZlciB3aXRoIHRoZSBjbGllbnQtc3VwcGxpZWQKK2V4dGVybmFsIGJpdHN0cmVhbSBpbnB1dCBidWZmZXIuCitcc2tpcGxpbmUgYWFjRGVjb2Rlcl9GaWxsCistIyBDYWxsIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSB3aGljaCB3cml0ZXMgZGVjb2RlZCBQQ00gYXVkaW8gZGF0YSB0byBhIGNsaWVudC1zdXBwbGllZCBidWZmZXIuIEl0IGlzIHRoZQorY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWxsb2NhdGUgYSBidWZmZXIgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhpcyBvdXRwdXQgZGF0YS4KK1xza2lwbGluZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lCitJZiB0aGUgYml0c3RyZWFtJ3MgY29uZmlndXJhdGlvbiAobnVtYmVyIG9mIGNoYW5uZWxzLCBzYW1wbGUgcmF0ZSwgZnJhbWUgc2l6ZSkgaXMgbm90IGtub3duIGluIGFkdmFuY2UsIHlvdSBtYXkKK2NhbGwgYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCkgdG8gcmV0cmlldmUgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVuIGluaXRpYWxpemUgYW4gYXVkaW8KK291dHB1dCBkZXZpY2UuIEluIHRoZSBleGFtcGxlIG1haW4uY3BwLCBpZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBzaW5jZSBwcm9ncmFtCitzdGFydCBvciBzaW5jZSB0aGUgcHJldmlvdXNseSBkZWNvZGVkIGZyYW1lLCB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSB3aWxsIGJlIHJlLWluaXRpYWxpemVkLiBJZiBXQVZFIGZpbGUgb3V0cHV0CitpcyBjaG9zZW4sIGEgbmV3IFdBVkUgZmlsZSBmb3IgZWFjaCBuZXcgY29uZmlndXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQuCitcc2tpcGxpbmUgYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvCistIyBSZXBlYXQgc3RlcHMgNSB0byA3IHVudGlsIG5vIGRhdGEgdG8gZGVjb2RlIGlzIGF2YWlsYWJsZSBhbnltb3JlLCBvciBpZiBhbiBlcnJvciBvY2N1cmVkLgorXHNraXBsaW5lIH0gd2hpbGUKKy0jIENhbGwgYWFjRGVjb2Rlcl9DbG9zZSgpIHRvIGRlLWFsbG9jYXRlIGFsbCBBQUMgZGVjb2RlciBhbmQgdHJhbnNwb3J0IGxheWVyIHN0cnVjdHVyZXMuCitcc2tpcGxpbmUgYWFjRGVjb2Rlcl9DbG9zZQorCitcc2VjdGlvbiBCdWZmZXJTeXN0ZW0gQnVmZmVyIFN5c3RlbQorCitUaGVyZSBhcmUgdGhyZWUgbWFpbiBidWZmZXJzIGluIGFuIEFBQyBkZWNvZGVyIGFwcGxpY2F0aW9uLiBPbmUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHRvIGhvbGQgYml0c3RyZWFtCitkYXRhIGZyb20gZmlsZSBJL08gb3IgZWxzZXdoZXJlLCBvbmUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIGFuZCBvbmUgdG8gaG9sZCB0aGUgZGVjb2RlZCBvdXRwdXQKK1BDTSBzYW1wbGUgZGF0YSwgd2hlcmVhcyB0aGlzIG91dHB1dCBidWZmZXIgbWF5IG92ZXJsYXAgd2l0aCB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgorCitUaGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIHNldCBpbiB0aGUgZXhhbXBsZSBmcmFtZXdvcmsgbWFpbi5jcHAgYW5kIGl0cyBzaXplIGlzIGRlZmluZWQgYnkgOjpJTl9CVUZfU0laRS4KK1lvdSBtYXkgZnJlZWx5IGNob29zZSBkaWZmZXJlbnQgc2l6ZXMgaGVyZS4gVG8gZmVlZCB0aGUgZGF0YSB0byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIHVzZSB0aGUKK2Z1bmN0aW9uIGFhY0RlY29kZXJfRmlsbCgpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IGhvdyBtYW55IGJ5dGVzIGluIHRoZQorZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBpbnRlcm5hbCBpbnB1dCBidWZmZXIgKHZhcmlhYmxlIGJ5dGVzVmFsaWQpLgorT25jZSB0aGUgZXh0ZXJuYWwgYnVmZmVyIGhhcyBiZWVuIGZ1bGx5IGNvcGllZCwgaXQgY2FuIGJlIHJlLWZpbGxlZCBhZ2Fpbi4KK0luIGNhc2UgeW91IHdhbnQgdG8gcmUtZmlsbCBpdCB3aGVuIHRoZXJlIGFyZSBzdGlsbCB1bnByb2Nlc3NlZCBieXRlcyAoYnl0ZXNWYWxpZCBpcyB1bmVxdWFsIDApLCB5b3UKK3dvdWxkIGhhdmUgdG8gYWRkaXRpb25hbGx5IHBlcmZvcm0gYSBtZW1jcHkoKSwgc28gdGhhdCBqdXN0IG1lYW5zIHVubmVjZXNzYXJ5IGNvbXB1dGF0aW9uYWwgb3ZlcmhlYWQKK2FuZCB0aGVyZWZvcmUgd2UgcmVjb21tZW5kIHRvIHJlLWZpbGwgdGhlIGJ1ZmZlciBvbmx5IHdoZW4gYnl0ZXNWYWxpZCBpcyAwLgorCitcaW1hZ2UgbGF0ZXggZGVjX2J1ZmZlci5wbmcgIkxpZmVjeWNsZSBvZiB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIiB3aWR0aD05Y20KKworVGhlIHNpemUgb2YgdGhlIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIHNldCBpbiB0cGRlY19saWIuaCAoc2VlIGRlZmluZSA6OlRSQU5TUE9SVERFQ19JTkJVRl9TSVpFKS4KK1lvdSBtYXkgY2hvb3NlIGEgc21hbGxlciBzaXplIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uc2lkZXJhdGlvbnM6CisKKy0gZWFjaCBpbnB1dCBjaGFubmVsIHJlcXVpcmVzIDc2OCBieXRlcworLSB0aGUgd2hvbGUgYnVmZmVyIG11c3QgYmUgb2Ygc2l6ZSAyXm4KKworU28gZm9yIGV4YW1wbGUgYSBzdGVyZW8gZGVjb2RlcjoKKworXGZbCitUUkFOU1BPUlRERUNcX0lOQlVGXF9TSVpFID0gMiAqIDc2OCA9IDE1MzYgPT4gMjA0OAorXGZdCisKK3RwZGVjX2xpYi5oIGFuZCBUUkFOU1BPUlRERUNfSU5CVUZfU0laRSBhcmUgbm90IHBhcnQgb2YgdGhlIGRlY29kZXIncyBsaWJyYXJ5IGludGVyZmFjZS4gVGhlcmVmb3JlCitvbmx5IHNvdXJjZS1jb2RlIGNsaWVudHMgbWF5IGNoYW5nZSB0aGlzIHNldHRpbmcuIElmIHlvdSByZWNlaXZlZCBhIGxpYnJhcnkgcmVsZWFzZSwgcGxlYXNlIGFzayB1cyBhbmQKK3dlIGNhbiBjaGFuZ2UgdGhpcyBpbiBvcmRlciB0byBtZWV0IHlvdXIgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworXHBhZ2UgT3V0cHV0Rm9ybWF0IERlY29kZXIgYXVkaW8gb3V0cHV0CisKK1xzZWN0aW9uIE91dHB1dEZvcm1hdE9idGFpbmluZyBPYnRhaW5pbmcgY2hhbm5lbCBtYXBwaW5nIGluZm9ybWF0aW9uCisKK1RoZSBkZWNvZGVkIGF1ZGlvIG91dHB1dCBmb3JtYXQgaXMgaW5kaWNhdGVkIGJ5IGEgc2V0IG9mIHZhcmlhYmxlcyBvZiB0aGUgQ1N0cmVhbUluZm8gc3RydWN0dXJlLgorV2hpbGUgdGhlIG1lbWJlcnMgc2FtcGxlUmF0ZSwgZnJhbWVTaXplIGFuZCBudW1DaGFubmVscyBtaWdodCBiZSBxdWl0ZSBzZWxmIGV4cGxhaW5pbmcsCitwQ2hhbm5lbFR5cGUgYW5kIHBDaGFubmVsSW5kaWNlcyBtaWdodCByZXF1aXJlIHNvbWUgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi4KKworVGhlc2UgdHdvIGFycmF5cyBpbmRpY2F0ZSB3aGF0IGlzIGVhY2ggb3V0cHV0IGNoYW5uZWwgc3VwcG9zZWQgdG8gYmUuIEJvdGggYXJyYXkgaGF2ZQorQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzIGNlbGxzLiBFYWNoIGNlbGwgb2YgcENoYW5uZWxUeXBlIGluZGljYXRlcyB0aGUgY2hhbm5lbCB0eXBlLCBkZXNjcmliZWQgaW4KK3RoZSBlbnVtIDo6QVVESU9fQ0hBTk5FTF9UWVBFIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmguIFRoZSBjZWxscyBvZiBwQ2hhbm5lbEluZGljZXMgaW5kaWNhdGUgdGhlIHN1YiBpbmRleAorYW1vbmcgdGhlIGNoYW5uZWxzIHN0YXJ0aW5nIHdpdGggMCBhbW9uZyBhbGwgY2hhbm5lbHMgb2YgdGhlIHNhbWUgYXVkaW8gY2hhbm5lbCB0eXBlLgorCitUaGUgaW5kZXhpbmcgc2NoZW1lIGlzIHRoZSBzYW1lIGFzIGZvciBNUEVHLTIvNC4gVGh1cyBpbmRpY2VzIGFyZSBjb3VudGVkIHVwd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgZnJvbnQKK2RpcmVjdGlvbiAodGh1cyBhIGNlbnRlciBjaGFubmVsIGlmIGFueSwgd2lsbCBhbHdheXMgYmUgaW5kZXggMCkuIFRoZW4gdGhlIGluZGljZXMgY291bnQgdXAsIHN0YXJ0aW5nIGFsd2F5cword2l0aCB0aGUgbGVmdCBzaWRlLCBwYWlyd2lzZSBmcm9tIGZyb250IHRvd2FyZCBiYWNrLiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24sIHBsZWFzZSByZWZlciB0bworSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIGNoYXB0ZXIgOC41LjMuMi4KKworSW4gY2FzZSBhIFByb2dyYW0gQ29uZmlnIGlzIGluY2x1ZGVkIGluIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uLCB0aGUgY2hhbm5lbCBtYXBwaW5nIGRlc2NyaWJlZCB3aXRoaW4KK2l0IHdpbGwgYmUgYWRvcHRlZC4KKworSW4gY2FzZSBvZiBNUEVHLUQgU3Vycm91bmQgdGhlIGNoYW5uZWwgbWFwcGluZyB3aWxsIGZvbGxvdyB0aGUgc2FtZSBjcml0ZXJpYSBkZXNjcmliZWQgaW4gSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksCitidXQgYWRkaW5nIGNvcnJlc3BvbmRpbmcgdG9wIGNoYW5uZWxzIHRvIHRoZSBjaGFubmVsIHR5cGVzIGZyb250LCBzaWRlIGFuZCBiYWNrLCBpbiBvcmRlciB0byBhdm9pZCBhbnkKK2xvc3Mgb2YgaW5mb3JtYXRpb24uCisKK1xzZWN0aW9uIE91dHB1dEZvcm1hdENoYW5nZSBDaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGZvcm1hdAorCitUaGUgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc2NoZW1lIGFuZCB0aGUgYWN0dWFsIGNoYW5uZWwgb3JkZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQorcGFyYW1ldGVycyA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZQorcGFyYW1ldGVycyBhbmQgdGhlIGRlY29kZXIgbGlicmFyeSBmdW5jdGlvbiBhYWNEZWNvZGVyX1NldFBhcmFtKCkgZm9yIG1vcmUgZGV0YWlsLgorCitcc2VjdGlvbiBPdXRwdXRGb3JtYXRFeGFtcGxlIENoYW5uZWwgbWFwcGluZyBleGFtcGxlcworCitUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhlIGxvY2F0aW9uIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoYXQKK2lzIHBhc3NlZCB0byBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgYW5kIHRoZSBleHBlY3RlZCBkYXRhIGluIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUgd2hpY2ggY2FuIGJlIG9idGFpbmVkCitieSBjYWxsaW5nIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbygpLgorCitcc3Vic2VjdGlvbiBFeGFtcGxlc1N0ZXJlbyBTdGVyZW8KKworSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIHNldCB0byAwIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKK2EgQUFDLUxDIGJpdCBzdHJlYW0gd2hpY2ggaGFzIGNoYW5uZWxDb25maWd1cmF0aW9uID0gMiBpbiBpdHMgYXVkaW8gc3BlY2lmaWMgY29uZmlnIHdvdWxkIGxlYWQKK3RvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgorCitDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSAyCisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCB9CisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEgfQorCitTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAwLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBsb2NhdGVkIGFzIGNvbnRpZ3VvdXMgYmxvY2tzCitpbiB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBmb2xsb3dzOgorCitcdmVyYmF0aW0KKyAgPGxlZnQgc2FtcGxlIDA+ICA8bGVmdCBzYW1wbGUgMT4gIDxsZWZ0IHNhbXBsZSAyPiAgLi4uIDxsZWZ0IHNhbXBsZSBOPgorICA8cmlnaHQgc2FtcGxlIDA+IDxyaWdodCBzYW1wbGUgMT4gPHJpZ2h0IHNhbXBsZSAyPiAuLi4gPHJpZ2h0IHNhbXBsZSBOPgorXGVuZHZlcmJhdGltCisKK1doZXJlIE4gZXF1YWxzIHRvIENTdHJlYW1JbmZvOjpmcmFtZVNpemUgLgorCitcc3Vic2VjdGlvbiBFeGFtcGxlc1N1cnJvdW5kIFN1cnJvdW5kIDUuMQorCitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDEgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAorYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSA2IGluIGl0cyBhdWRpbyBzcGVjaWZpYyBjb25maWcsIHdvdWxkIGxlYWQKK3RvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgorCitDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSA2CisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0xGRSwgOjpBQ1RfQkFDSywgOjpBQ1RfQkFDSyB9CisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDEsIDIsIDAsIDAsIDAsIDEgfQorCitTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBpcyAxLCBXQVYgZmlsZSBjaGFubmVsIG9yZGVyaW5nIHdpbGwgYmUgdXNlZC4gRm9yIGEgNS4xIGNoYW5uZWwKK3NjaGVtZSwgdGh1cyB0aGUgY2hhbm5lbHMgd291bGQgYmU6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBjZW50ZXIsIExGRSwgc3Vycm91bmQgbGVmdCwgc3Vycm91bmQgcmlnaHQuCitUaHVzIHRoZSB0aGlyZCBjaGFubmVsIGlzIHRoZSBjZW50ZXIgY2hhbm5lbCwgcmVjZWl2aW5nIHRoZSBpbmRleCAwLiBUaGUgb3RoZXIgZnJvbnQgY2hhbm5lbHMgYXJlCitmcm9udCBsZWZ0LCBmcm9udCByaWdodCBiZWluZyBwbGFjZWQgYXMgZmlyc3QgYW5kIHNlY29uZCBjaGFubmVscyB3aXRoIGluZGljZXMgMSBhbmQgMiBjb3JyZXNwb25kaW5nbHkuCitUaGVyZSBpcyBvbmx5IG9uZSBMRkUsIHBsYWNlZCBhcyB0aGUgZm91cnRoIGNoYW5uZWwgYW5kIGluZGV4IDAuIEZpbmFsbHkgYm90aCBzdXJyb3VuZAorY2hhbm5lbHMgZ2V0IHRoZSB0eXBlIGRlZmluaXRpb24gQUNUX0JBQ0ssIGFuZCB0aGUgaW5kaWNlcyAwIGFuZCAxLgorCitTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAxLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKK2FzIGZvbGxvd3M6CisKK1x2ZXJiYXRpbQorPGZyb250IGxlZnQgc2FtcGxlIDA+IDxmcm9udCByaWdodCBzYW1wbGUgMD4KKzxjZW50ZXIgc2FtcGxlIDA+IDxMRkUgc2FtcGxlIDA+Cis8c3Vycm91bmQgbGVmdCBzYW1wbGUgMD4gPHN1cnJvdW5kIHJpZ2h0IHNhbXBsZSAwPgorCis8ZnJvbnQgbGVmdCBzYW1wbGUgMT4gPGZyb250IHJpZ2h0IHNhbXBsZSAxPgorPGNlbnRlciBzYW1wbGUgMT4gPExGRSBzYW1wbGUgMT4KKzxzdXJyb3VuZCBsZWZ0IHNhbXBsZSAxPiA8c3Vycm91bmQgcmlnaHQgc2FtcGxlIDE+CisKKy4uLgorCis8ZnJvbnQgbGVmdCBzYW1wbGUgTj4gPGZyb250IHJpZ2h0IHNhbXBsZSBOPgorPGNlbnRlciBzYW1wbGUgTj4gPExGRSBzYW1wbGUgTj4KKzxzdXJyb3VuZCBsZWZ0IHNhbXBsZSBOPiA8c3Vycm91bmQgcmlnaHQgc2FtcGxlIE4+CitcZW5kdmVyYmF0aW0KKworV2hlcmUgTiBlcXVhbHMgdG8gQ1N0cmVhbUluZm86OmZyYW1lU2l6ZSAuCisKK1xzdWJzZWN0aW9uIEV4YW1wbGVzQXJpYiBBUklCIGNvZGluZyBtb2RlIDIvMQorCitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDEgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAoraW4gY2FzZSBvZiBhIEFSSUIgYml0IHN0cmVhbSB1c2luZyBjb2RpbmcgbW9kZSAyLzEgYXMgZGVzY3JpYmVkIGluIEFSSUIgU1RELUIzMiBQYXJ0IDIgVmVyc2lvbiAyLjEtRTEsIHBhZ2UgNjEsCit3b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgorCitDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSAzCisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCw6OiBBQ1RfQkFDSyB9CisKK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEsIDAgfQorCitUaGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgYXMgZm9sbG93cyBpbiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlcjoKKworXHZlcmJhdGltCis8ZnJvbnQgbGVmdCBzYW1wbGUgMD4gPGZyb250IHJpZ2h0IHNhbXBsZSAwPiAgPG1pZCBzdXJyb3VuZCBzYW1wbGUgMD4KKworPGZyb250IGxlZnQgc2FtcGxlIDE+IDxmcm9udCByaWdodCBzYW1wbGUgMT4gPG1pZCBzdXJyb3VuZCBzYW1wbGUgMT4KKworLi4uCisKKzxmcm9udCBsZWZ0IHNhbXBsZSBOPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIE4+IDxtaWQgc3Vycm91bmQgc2FtcGxlIE4+CisKK1doZXJlIE4gZXF1YWxzIHRvIENTdHJlYW1JbmZvOjpmcmFtZVNpemUgLgorCitcZW5kdmVyYmF0aW0KKworKi8KKworI2lmbmRlZiBBQUNERUNPREVSX0xJQl9ICisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0gKKworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworLyoqCisgKiBcYnJpZWYgIEFBQyBkZWNvZGVyIGVycm9yIGNvZGVzLgorICovCit0eXBlZGVmIGVudW0geworICBBQUNfREVDX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgTm8gZXJyb3Igb2NjdXJlZC4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZCBhbmQgZXJyb3IgZnJlZS4gKi8KKyAgQUFDX0RFQ19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IEhlYXAgcmV0dXJuZWQgTlVMTCBwb2ludGVyLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCisgIEFBQ19ERUNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1LCAgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSBhbm90aGVyIG1vZHVsZS4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLworCisgIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KKyAgYWFjX2RlY19zeW5jX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgICAgPSAweDEwMDAsCisgIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IgICAgICAgICAgID0gMHgxMDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgaGFkIHN5bmNyb25pc2F0aW9uIHByb2JsZW1zLiBEbyBub3QgZXhpdCBkZWNvZGluZy4gSnVzdCBmZWVkIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGRhdGEuICovCisgIEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTICAgICAgICAgICAgICAgID0gMHgxMDAyLCAgLyohPCBUaGUgaW5wdXQgYnVmZmVyIHJhbiBvdXQgb2YgYml0cy4gKi8KKyAgYWFjX2RlY19zeW5jX2Vycm9yX2VuZCAgICAgICAgICAgICAgICAgPSAweDFGRkYsCisKKyAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCisgIGFhY19kZWNfaW5pdF9lcnJvcl9zdGFydCAgICAgICAgICAgICAgID0gMHgyMDAwLAorICBBQUNfREVDX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICA9IDB4MjAwMSwgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKE5VTEwpLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVCAgICAgICAgICAgICAgICA9IDB4MjAwMiwgIC8qITwgVGhlIEFPVCBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVCAgICAgICAgICAgICA9IDB4MjAwMywgIC8qITwgVGhlIGJpdHN0cmVhbSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgICAgID0gMHgyMDA0LCAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0VQQ09ORklHICAgICAgICAgICA9IDB4MjAwNSwgIC8qITwgVGhlIGVycm9yIHByb3RlY3Rpb24gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfTVVMVElMQVlFUiAgICAgICAgID0gMHgyMDA2LCAgLyohPCBNb3JlIHRoYW4gb25lIGxheWVyIGZvciBBQUMgc2NhbGFibGUgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICAgICAgPSAweDIwMDcsICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFICAgICAgID0gMHgyMDA4LCAgLyohPCBUaGUgc2FtcGxlIHJhdGUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfSU5WQUxJRF9TQlJfQ09ORklHICAgICAgICAgICAgID0gMHgyMDA5LCAgLyohPCBUaGUgU0JSIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0RFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyIHRoZSB2YWx1ZSB3YXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBwYXJhbWV0ZXIgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLworICBBQUNfREVDX05FRURfVE9fUkVTVEFSVCAgICAgICAgICAgICAgICA9IDB4MjAwQiwgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZSB0aGUgcmVxdWllcmVkIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLworICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKKworICAvKiBEZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCisgIGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgID0gMHg0MDAwLAorICBBQUNfREVDX1RSQU5TUE9SVF9FUlJPUiAgICAgICAgICAgICAgICA9IDB4NDAwMSwgIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IuICovCisgIEFBQ19ERUNfUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyLCAgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBiaXRzdHJlYW0uIE1vc3QgcHJvYmFibHkgaXQgaXMgY29ycnVwdGVkLCBvciB0aGUgc3lzdGVtIGNyYXNoZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRVhURU5TSU9OX1BBWUxPQUQgID0gMHg0MDAzLCAgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBleHRlbnNpb24gcGF5bG9hZCBvZiB0aGUgYml0c3RyZWFtLiBUaGUgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1IgICAgICAgICAgICAgPSAweDQwMDQsICAvKiE8IFRoZSBwYXJzZWQgYml0c3RyZWFtIHZhbHVlIGlzIG91dCBvZiByYW5nZS4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3lzdGVtIGNyYXNoZWQuICovCisgIEFBQ19ERUNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1LCAgLyohPCBUaGUgZW1iZWRkZWQgQ1JDIGRpZCBub3QgbWF0Y2guICovCisgIEFBQ19ERUNfSU5WQUxJRF9DT0RFX0JPT0sgICAgICAgICAgICAgID0gMHg0MDA2LCAgLyohPCBBbiBpbnZhbGlkIGNvZGVib29rIHdhcyBzaWduYWxsZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciB0aGUgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX1BSRURJQ1RJT04gICAgICAgICA9IDB4NDAwNywgIC8qITwgUHJlZGljdG9yIGZvdW5kLCBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgQUFDIExvdyBDb21wbGV4aXR5IHByb2ZpbGUuIE1vc3QgcHJvYmFibHkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0NDRSAgICAgICAgICAgICAgICA9IDB4NDAwOCwgIC8qITwgQSBDQ0UgZWxlbWVudCB3YXMgZm91bmQgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYSB3cm9uZyBmb3JtYXQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfTEZFICAgICAgICAgICAgICAgID0gMHg0MDA5LCAgLyohPCBBIExGRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9HQUlOX0NPTlRST0xfREFUQSAgPSAweDQwMEEsICAvKiE8IEdhaW4gY29udHJvbCBkYXRhIGZvdW5kIGJ1dCBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHdyb25nIGZvcm1hdC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9TQkEgICAgICAgICAgICAgICAgPSAweDQwMEIsICAvKiE8IFNCQSBmb3VuZCwgYnV0IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIHRoZSBCU0FDIHByb2ZpbGUuICovCisgIEFBQ19ERUNfVE5TX1JFQURfRVJST1IgICAgICAgICAgICAgICAgID0gMHg0MDBDLCAgLyohPCBFcnJvciB3aGlsZSByZWFkaW5nIFROUyBkYXRhLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCBvciB0aGUgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLworICBBQUNfREVDX1JWTENfRVJST1IgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwRCwgIC8qITwgRXJyb3Igd2hpbGUgZGVjb2RpbmcgZXJyb3IgcmVzaWxsaWVudCBkYXRhLiAqLworICBhYWNfZGVjX2RlY29kZV9lcnJvcl9lbmQgICAgICAgICAgICAgICA9IDB4NEZGRiwKKworICAvKiBBbmNpbGxhcnkgZGF0YSBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQuICovCisgIGFhY19kZWNfYW5jX2RhdGFfZXJyb3Jfc3RhcnQgICAgICAgICAgID0gMHg4MDAwLAorICBBQUNfREVDX0FOQ19EQVRBX0VSUk9SICAgICAgICAgICAgICAgICA9IDB4ODAwMSwgIC8qITwgTm9uIHNldmVyZSBlcnJvciBjb25jZXJuaW5nIHRoZSBhbmNpbGxhcnkgZGF0YSBoYW5kbGluZy4gKi8KKyAgQUFDX0RFQ19UT09fU01BTExfQU5DX0JVRkZFUiAgICAgICAgICAgPSAweDgwMDIsICAvKiE8IFRoZSByZWdpc3RlcmVkIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBpcyB0b28gc21hbGwgdG8gcmVjZWl2ZSB0aGUgcGFyc2VkIGRhdGEuICovCisgIEFBQ19ERUNfVE9PX01BTllfQU5DX0VMRU1FTlRTICAgICAgICAgID0gMHg4MDAzLCAgLyohPCBNb3JlIHRoYW4gdGhlIGFsbG93ZWQgbnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnRzIHNob3VsZCBiZSB3cml0dGVuIHRvIGJ1ZmZlci4gKi8KKyAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9lbmQgICAgICAgICAgICAgPSAweDhGRkYKKworCit9IEFBQ19ERUNPREVSX0VSUk9SOworCisKKy8qKiBNYWNybyB0byBpZGVudGlmeSBpbml0aWFsaXphdGlvbiBlcnJvcnMuICovCisjZGVmaW5lIElTX0lOSVRfRVJST1IoZXJyKSAgICggKCgoZXJyKT49YWFjX2RlY19pbml0X2Vycm9yX3N0YXJ0KSAgICYmICgoZXJyKTw9YWFjX2RlY19pbml0X2Vycm9yX2VuZCkpICAgPyAxIDogMCkKKy8qKiBNYWNybyB0byBpZGVudGlmeSBkZWNvZGUgZXJyb3JzLiAqLworI2RlZmluZSBJU19ERUNPREVfRVJST1IoZXJyKSAoICgoKGVycik+PWFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiAoKGVycik8PWFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCkpID8gMSA6IDApCisvKiogTWFjcm8gdG8gaWRlbnRpZnkgaWYgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIgY29udGFpbnMgdmFsaWQgc2FtcGxlcyBhZnRlciBjYWxsaW5nIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4gKi8KKyNkZWZpbmUgSVNfT1VUUFVUX1ZBTElEKGVycikgKCAoKGVycikgPT0gQUFDX0RFQ19PSykgfHwgSVNfREVDT0RFX0VSUk9SKGVycikgKQorCisvKioKKyAqIFxicmllZiBBQUMgZGVjb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIEFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgUENNIG91dHB1dCBtb2RlICgxOiBpbnRlcmxlYXZlZCAoZGVmYXVsdCk7IDA6IG5vdCBpbnRlcmxlYXZlZCkuICovCisgIEFBQ19QQ01fRFVBTF9DSEFOTkVMX09VVFBVVF9NT0RFICAgICAgICA9IDB4MDAwMiwgIC8qITwgRGVmaW5lcyBob3cgdGhlIGRlY29kZXIgcHJvY2Vzc2VzIHR3byBjaGFubmVsIHNpZ25hbHM6IFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTGVhdmUgYm90aCBzaWduYWxzIGFzIHRoZXkgYXJlIChkZWZhdWx0KS4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMi4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgYm90aCBjaGFubmVscyAoTCcgPSBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyKS4gKi8KKyAgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HICAgICAgICAgID0gMHgwMDAzLCAgLyohPCBPdXRwdXQgYnVmZmVyIGNoYW5uZWwgb3JkZXJpbmcuIDA6IE1QRUcgUENFIHN0eWxlIG9yZGVyLCAxOiBXQVYgZmlsZSBjaGFubmVsIG9yZGVyIChkZWZhdWx0KS4gKi8KKyAgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgLyohPCBFbmFibGUgc2lnbmFsIGxldmVsIGxpbWl0aW5nLiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBBdXRvLWNvbmZpZy4gRW5hYmxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgY29uZmlndXJhdGlvbnMgYnkgZGVmYXVsdC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBsaW1pdGVyIGluIGdlbmVyYWwuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEVuYWJsZSBsaW1pdGVyIGFsd2F5cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byBjYWxsIHRoZSBkZWNvZGVyIHdpdGggYSBBQUNERUNfQ0xSSElTVCBmbGFnIHRvIHJlc2V0IGFsbCBzdGF0ZXMgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW1pdGVyIHN3aXRjaCBpcyBjaGFuZ2VkIGV4cGxpY2l0bHkuICovCisgIEFBQ19QQ01fTElNSVRFUl9BVFRBQ0tfVElNRSAgICAgICAgICAgICA9IDB4MDAwNSwgIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIGF0dGFjayB0aW1lIGluIG1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgY29uZmd1cmF0aW9uIGlzIDE1IG1zLiBBZGp1c3RhYmxlIHJhbmdlIGZyb20gMSBtcyB0byAxNSBtcy4gKi8KKyAgQUFDX1BDTV9MSU1JVEVSX1JFTEVBU19USU1FICAgICAgICAgICAgID0gMHgwMDA2LCAgLyohPCBTaWduYWwgbGV2ZWwgbGltaXRpbmcgcmVsZWFzZSB0aW1lIGluIG1zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyA1MCBtcy4gQWRqdXN0YWJsZSB0aW1lIG11c3QgYmUgbGFyZ2VyIHRoYW4gMCBtcy4gKi8KKyAgQUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTICAgICAgICAgICAgID0gMHgwMDExLCAgLyohPCBNaW5pbXVtIG51bWJlciBvZiBQQ00gb3V0cHV0IGNoYW5uZWxzLiBJZiBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW1wbGUgY2hhbm5lbCBleHRlbnNpb24gaXMgYXBwbGllZC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMDogRGlzYWJsZSBjaGFubmVsIGV4dGVuc3Rpb24gZmVhdHVyZS4gVGhlIGRlY29kZXIgb3V0cHV0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBhcyB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6ICAgIFRoaXMgdmFsdWUgaXMgY3VycmVudGx5IG5lZWRlZCBvbmx5IHRvZ2V0aGVyIHdpdGggdGhlIG1peC1kb3duIGZlYXR1cmUuIFNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBhbmQgbm90ZSAyIGJlbG93LiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiAgICBFbmNvZGVkIG1vbm8gc2lnbmFscyB3aWxsIGJlIGR1cGxpY2F0ZWQgdG8gYWNoaWV2ZSBhIDIvMC8wLjAgY2hhbm5lbCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjogICAgVGhlIGRlY29kZXIgdHJ5cyB0byByZW9yZGVyIGVuY29kZWQgc2lnbmFscyB3aXRoIGxlc3MgdGhhbiBzaXggY2hhbm5lbHMgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIDMvMC8yLjEgY2hhbm5lbCBvdXRwdXQgc2lnbmFsLiBNaXNzaW5nIGNoYW5uZWxzIHdpbGwgYmUgZmlsbGVkIHdpdGggYSB6ZXJvIHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcmVvcmRlcmluZyBpcyBub3QgcG9zc2libGUgdGhlIGVtcHR5IGNoYW5uZWxzIHdpbGwgc2ltcGx5IGJlIGFwcGVuZGVkLiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogICAgVGhlIGRlY29kZXIgdHJ5cyB0byByZW9yZGVyIGVuY29kZWQgc2lnbmFscyB3aXRoIGxlc3MgdGhhbiBlaWdodCBjaGFubmVscyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2hpZXZlIGEgMy8wLzQuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuIE1pc3NpbmcgY2hhbm5lbHMgd2lsbCBiZSBmaWxsZWQgd2l0aCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gc2lnbmFsLiBJZiByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LlxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFRoZSBjaGFubmVsIHNpZ25hbGxpbmcgKENTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgYW5kIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZC4gQWRkZWQgZW1wdHkgY2hhbm5lbHMgd2lsbCBiZSBzaWduYWxsZWQgd2l0aCBjaGFubmVsIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRTo6QUNUX05PTkUuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBJZiB0aGUgcGFyYW1ldGVyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGF0IG9mIDo6QUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTIGJvdGggd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlLiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gVGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgYWZmZWN0IE1QRUcgU3Vycm91bmQgcHJvY2Vzc2luZy4gKi8KKyAgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTICAgICAgICAgICAgID0gMHgwMDEyLCAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBQQ00gb3V0cHV0IGNoYW5uZWxzLiBJZiBsb3dlciB0aGFuIHRoZSBudW1iZXIgb2YgZW5jb2RlZCBhdWRpbyBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4aW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nbHkuIElmIGRlZGljYXRlZCBtZXRhZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBhY2hpZXZlIGJldHRlciBtaXhpbmcgcmVzdWx0cy4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMDogRGlzYWJsZSBkb3dubWl4aW5nIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiAgICBBbGwgZW5jb2RlZCBhdWRpbyBjb25maWd1cmF0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUgY2hhbm5lbCB3aWxsIGJlIG1peGVkIGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1vbm8gb3V0cHV0IHNpZ25hbC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogICAgVGhlIGRlY29kZXIgcGVyZm9ybXMgYSBzdGVyZW8gbWl4LWRvd24gaWYgdGhlIG51bWJlciBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB0d28uIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6ICAgIElmIHRoZSBudW1iZXIgb2YgZW5jb2RlZCBhdWRpbyBjaGFubmVscyBpcyBncmVhdGVyIHRoYW4gc2l4IHRoZSBkZWNvZGVyIHBlcmZvcm1zIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LWRvd24gdG8gbWVldCB0aGUgdGFyZ2V0IG91dHB1dCBjb25maWd1cmF0aW9uIG9mIDMvMC8yLjEgY2hhbm5lbHMuIE9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OiAgICBUaGlzIHZhbHVlIGlzIGN1cnJlbnRseSBuZWVkZWQgb25seSB0b2dldGhlciB3aXRoIHRoZSBjaGFubmVsIGV4dGVuc2lvbiBmZWF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgOjpBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gT25seSBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIERvd24tbWl4aW5nIG9mIGFueSBzZXZlbiBvciBlaWdodCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gbm90IGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREFNIDQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNvZnR3YXJlIHZlcnNpb24uIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBJZiB0aGUgcGFyYW1ldGVyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIGJ1dCBzbWFsbGVyIHRoYW4gOjpBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGggd2lsbCBiZSBzZXQgdG8gc2FtZSB2YWx1ZS4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgTVBFRyBTdXJyb3VuZCBtb2R1bGUgd2lsbCBiZSBzZXQgYWNjb3JkaW5nbHkuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LiBTZXR0aW5nIHRoaXMgcGFyYW0gd2l0aCBhbnkgdmFsdWUgd2lsbCBkaXNhYmxlIHRoZSBiaW5hdXJhbCBwcm9jZXNzaW5nIG9mIHRoZSBNUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJyb3VuZCBtb2R1bGUgKDo6QUFDX01QRUdTX0JJTkFVUkFMX0VOQUJMRT0wKS4gKi8KKworICBBQUNfQ09OQ0VBTF9NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDAsICAvKiE8IEVycm9yIGNvbmNlYWxtZW50OiBQcm9jZXNzaW5nIG1ldGhvZC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBTcGVjdHJhbCBtdXRpbmcuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogTm9pc2Ugc3Vic3RpdHV0aW9uIChzZWUgOjpDT05DRUFMX05PSVNFKS4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBFbmVyZ3kgaW50ZXJwb2xhdGlvbiAoYWRkcyBhZGRpdGlvbmFsIHNpZ25hbCBkZWxheSBvZiBvbmUgZnJhbWUsIHNlZSA6OkNPTkNFQUxfSU5URVIpLiBcbiAqLworCisgIEFBQ19EUkNfQk9PU1RfRkFDVE9SICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMCwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBTY2FsaW5nIGZhY3RvciBmb3IgYm9vc3RpbmcgZ2FpbiB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyBob3cgdGhlIGJvb3N0aW5nIERSQyBmYWN0b3JzIChjb252ZXllZCBpbiB0aGUgYml0c3RyZWFtKSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBzaWduYWwuIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChkb24ndCBhcHBseSBib29zdCBmYWN0b3JzKSB0byAxMjcgKGZ1bGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkgYWxsIGJvb3N0aW5nIGZhY3RvcnMpLiAqLworICBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiAgICAgICAgICAgICAgPSAweDAyMDEsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGF0dGVudWF0aW5nIGdhaW4gdmFsdWVzLiBTYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0RSQ19CT09TVF9GQUNUT1IgYnV0IGZvciBhdHRlbnVhdGluZyBEUkMgZmFjdG9ycy4gKi8KKyAgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgICAgICAgICAgICAgICAgID0gMHgwMjAyLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFRhcmdldCByZWZlcmVuY2UgbGV2ZWwuIERlZmluZXMgdGhlIGxldmVsIGJlbG93IGZ1bGwtc2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocXVhbnRpemVkIGluIHN0ZXBzIG9mIDAuMjVkQikgdG8gd2hpY2ggdGhlIG91dHB1dCBhdWRpbyBzaWduYWwgd2lsbCBiZSBub3JtYWxpemVkIHRvIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERSQyBtb2R1bGUuIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChmdWxsLXNjYWxlKSB0byAxMjcgKDMxLjc1IGRCIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1zY2FsZSkuIFRoZSB2YWx1ZSBzbWFsbGVyIHRoYW4gMCBzd2l0Y2hlcyBvZmYgbm9ybWFsaXphdGlvbi4gKi8KKyAgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiAgICAgICAgICAgICAgID0gMHgwMjAzLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IEVuLS9EaXNhYmxlIERWQiBzcGVjaWZpYyBoZWF2eSBjb21wcmVzc2lvbiAoYWthIFJGIG1vZGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byAxLCB0aGUgZGVjb2RlciB3aWxsIGFwcGx5IHRoZSBjb21wcmVzc2lvbiB2YWx1ZXMgZnJvbSB0aGUgRFZCIHNwZWNpZmljIGFuY2lsbGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgZmllbGQuIEF0IHRoZSBzYW1lIHRpbWUgdGhlIE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbCB3aWxsIGJlIGRpc2FibGVkLiBCeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaGVhdnkgY29tcHJlc3Npb24gaXMgZGlzYWJsZWQuICovCisKKyAgQUFDX1FNRl9MT1dQT1dFUiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBRdWFkcmF0dXJlIE1pcnJvciBGaWx0ZXIgKFFNRikgQmFuayBwcm9jZXNzaW5nIG1vZGUuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IFVzZSBpbnRlcm5hbCBkZWZhdWx0LiBJbXBsaWVzIE1QRUcgU3Vycm91bmQgcGFydGlhbGx5IGNvbXBsZXggYWNjb3JkaW5nbHkuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFVzZSBjb21wbGV4IFFNRiBkYXRhIG1vZGUuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFVzZSByZWFsIChsb3cgcG93ZXIpIFFNRiBkYXRhIG1vZGUuIFxuICovCisKKyAgQUFDX01QRUdTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwLCAgLyohPCBNUEVHIFN1cnJvdW5kOiBBbGxvdy9EaXNhYmxlIGRlY29kaW5nIG9mIE1QUyBjb250ZW50LiBBdmFpbGFibGUgb25seSBmb3IgZGVjb2RlcnMgd2l0aCBNUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgc3VwcG9ydC4gKi8KKworICBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSICAgICAgICAgICAgICAgICAgPSAweDA2MDMgICAvKiE8IENsZWFyIGludGVybmFsIGJpdCBzdHJlYW0gYnVmZmVyIG9mIHRyYW5zcG9ydCBsYXllcnMuIFRoZSBkZWNvZGVyIHdpbGwgc3RhcnQgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBuZXcgZGF0YSBwYXNzZWQgYWZ0ZXIgdGhpcyBldmVudCBhbmQgYW55IHByZXZpb3VzIGRhdGEgaXMgZGlzY2FyZGVkLiAqLworCit9IEFBQ0RFQ19QQVJBTTsKKworLyoqCisgKiBcYnJpZWYgVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBkZWNvZGVkIGF1ZGlvIGRhdGEuCisgKiAgICAgICAgQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBUaGVzZSBmaXZlIG1lbWJlcnMgYXJlIHRoZSBvbmx5IHJlYWxseSByZWxldmFudCBvbmVzIGZvciB0aGUgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAvKiE8IFRoZSBzYW1wbGVyYXRlIGluIEh6IG9mIHRoZSBmdWxseSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwgKGFmdGVyIFNCUiBwcm9jZXNzaW5nKS4gICAqLworICBJTlQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFRoZSBmcmFtZSBzaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCBvciA5NjAgZm9yIEFBQy1MQyBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggb3IgMTkyMCBmb3IgSEUtQUFDICh2MikgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHM7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBhdWRpbyBjaGFubmVscyBpbiB0aGUgZGVjb2RlZCBhbmQgaW50ZXJsZWF2ZWQgUENNIGF1ZGlvIHNpZ25hbC4gKi8KKyAgQVVESU9fQ0hBTk5FTF9UWVBFICpwQ2hhbm5lbFR5cGU7ICAgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgICAgICAgICAgICAgKnBDaGFubmVsSW5kaWNlczsgICAgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEgcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCisgIC8qIERlY29kZXIgaW50ZXJuYWwgbWVtYmVycy4gKi8KKyAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlUmF0ZTsgICAgICAgLyohPCBTYW1wbGluZyByYXRlIGluIEh6IHdpdGhvdXQgU0JSIChmcm9tIGNvbmZpZ3VyYXRpb24gaW5mbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgcHJvZmlsZTsgICAgICAgICAgICAgLyohPCBNUEVHLTIgcHJvZmlsZSAoZnJvbSBmaWxlIGhlYWRlcikgKC0xOiBub3QgYXBwbGljYWJsZSAoZS4gZy4gTVBFRy00KSkuICAgICAgICAgICAgICAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgYW90OyAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpOiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KKyAgSU5UICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZzsgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKDA6IFBDRSBkZWZpbmVkLCAxOiBtb25vLCAyOiBzdGVyZW8sIC4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgYml0UmF0ZTsgICAgICAgICAgICAgLyohPCBJbnN0YW50YW5lb3VzIGJpdCByYXRlLiAgICAgICAgICAgICAgICAgICAqLworICBJTlQgICAgICAgICAgICAgICBhYWNTYW1wbGVzUGVyRnJhbWU7ICAvKiE8IFNhbXBsZXMgcGVyIGZyYW1lIGZvciB0aGUgQUFDIGNvcmUgKGZyb20gQVNDKS4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyIG9yIDQ4MCBmb3IgQUFDLUxEIGFuZCBBQUMtRUxEICAgICAgICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgYWFjTnVtQ2hhbm5lbHM7ICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIGFmdGVyIEFBQyBjb3JlIHByb2Nlc3NpbmcgKGJlZm9yZSBQUyBvciBNUFMgcHJvY2Vzc2luZykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBhcmUgbm90IHRoZSBmaW5hbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzISAqLworICBBVURJT19PQkpFQ1RfVFlQRSBleHRBb3Q7ICAgICAgICAgICAgICAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpICovCisKKyAgVUlOVCAgICAgICAgICAgICAgb3V0cHV0RGVsYXk7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIG91dHB1dCBpcyBhZGRpdGlvbmFsbHkgZGVsYXllZCBieSB0aGUgZGVjb2Rlci4gKi8KKworICBVSU5UICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgICAvKiE8IENvcHkgb2YgaW50ZXJuYWwgZmxhZ3MuIE9ubHkgdG8gYmUgd3JpdHRlbiBieSB0aGUgZGVjb2RlciwgYW5kIG9ubHkgdG8gYmUgcmVhZCBleHRlcm5hbGx5LiAqLworCisgIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnOyAgICAgICAgICAgIC8qITwgZXBDb25maWcgbGV2ZWwgKGZyb20gQVNDKTogb25seSBsZXZlbCAwIHN1cHBvcnRlZCwgLTEgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KKworICAvKiBTdGF0aXN0aWNzICovCisgIElOVCAgICAgICAgICAgICAgIG51bUxvc3RBY2Nlc3NVbml0czsgIC8qITwgVGhpcyBpbnRlZ2VyIHdpbGwgcmVmbGVjdCB0aGUgZXN0aW1hdGVkIGFtb3VudCBvZiBsb3N0IGFjY2VzcyB1bml0cyBpbiBjYXNlIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUi4gSXQgd2lsbCBiZSA8IDAgaWYgdGhlIGVzdGltYXRpb24gZmFpbGVkLiAqLworCisgIFVJTlQgICAgICAgICAgICAgIG51bVRvdGFsQnl0ZXM7ICAgICAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KKyAgVUlOVCAgICAgICAgICAgICAgbnVtQmFkQnl0ZXM7ICAgICAgICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgdGhhdCB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLworICBVSU5UICAgICAgICAgICAgICBudW1Ub3RhbEFjY2Vzc1VuaXRzOyAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyLiAqLworICBVSU5UICAgICAgICAgICAgICBudW1CYWRBY2Nlc3NVbml0czsgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdCB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLworCisgIC8qIE1ldGFkYXRhICovCisgIFNDSEFSICAgICAgICAgICAgIGRyY1Byb2dSZWZMZXY7ICAgICAgIC8qITwgRFJDIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSByZWZlcmVuY2UgbGV2ZWwgYmVsb3cgZnVsbC1zY2FsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIHJlZmxlY3QgdGhlIGF2ZXJhZ2UgbG91ZG5lc3Mgb2YgdGhlIGF1ZGlvIGluIExLRlMgYWNjb3JpbmcgdG8gSVRVLVIgQlMgMTc3MC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZSB2YWx1ZSBpcyAtMS4gKi8KKyAgU0NIQVIgICAgICAgICAgICAgZHJjUHJlc01vZGU7ICAgICAgICAgLyohPCBEUkMgcHJlc2VudGF0aW9uIG1vZGUuIEFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAoTVBFRy00IER5bmFtaWMgUmFuZ2UgQ29udHJvbCB0b29sKSBvciBoZWF2eSBjb21wcmVzc2lvbiAoRFZCIGhlYXZ5IGNvbXByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgcmFuZ2UgY29udHJvbCBzaGFsbCB0YWtlIHByaW9yaXR5IG9uIHRoZSBvdXRwdXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgRVRTSSBUUyAxMDEgMTU0LCB0YWJsZSBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBObyBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRFJDIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogUmVzZXJ2ZWQgKi8KKworfSBDU3RyZWFtSW5mbzsKKworCit0eXBlZGVmIHN0cnVjdCBBQUNfREVDT0RFUl9JTlNUQU5DRSAqSEFORExFX0FBQ0RFQ09ERVI7ICAvKiE8IFBvaW50ZXIgdG8gYSBBQUMgZGVjb2RlciBpbnN0YW5jZS4gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6ZSBhbmNpbGxhcnkgZGF0YSBidWZmZXIuCisgKgorICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGJ1ZmZlciAgUG9pbnRlciB0byAoZXh0ZXJuYWwpIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KKyAqIFxwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJ1ZmZlci4KKyAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCisgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKK2FhY0RlY29kZXJfQW5jRGF0YUluaXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaXplICk7CisKKy8qKgorICogXGJyaWVmIEdldCBvbmUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KKyAqCisgKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQgdG8gZ2V0LgorICogXHBhcmFtIHB0ciAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgorICogXHBhcmFtIHNpemUgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KKyAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KKyAqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgorYWFjRGVjb2Rlcl9BbmNEYXRhR2V0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICoqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc2l6ZSApOworCisvKioKKyAqIFxicmllZiBTZXQgb25lIHNpbmdsZSBkZWNvZGVyIHBhcmFtZXRlci4KKyAqCisgKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwYXJhbSAgUGFyYW1ldGVyIHRvIGJlIHNldC4KKyAqIFxwYXJhbSB2YWx1ZSAgUGFyYW1ldGVyIHZhbHVlLgorICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgorICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX1NldFBhcmFtICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSApOworCisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICBHZXQgZnJlZSBieXRlcyBpbnNpZGUgZGVjb2RlciBpbnRlcm5hbCBidWZmZXIKKyAqIFxwYXJhbSBzZWxmICAgIEhhbmRsZSBvZiBBQUMgZGVjb2RlciBpbnN0YW5jZQorICogXHBhcmFtIHBGcmVlQnl0ZXMgUG9pbnRlciB0byB2YXJpYWJsZSByZWNldmluZyBhbW91bnQgb2YgZnJlZSBieXRlcyBpbnNpZGUgZGVjb2RlciBpbnRlcm5hbCBidWZmZXIKKyAqIFxyZXR1cm4gICAgICAgICAgICAgRXJyb3IgY29kZQorICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0dldEZyZWVCeXRlcyAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwRnJlZUJ5dGVzKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICBPcGVuIGFuIEFBQyBkZWNvZGVyIGluc3RhbmNlCisgKiBccGFyYW0gdHJhbnNwb3J0Rm10ICBUaGUgdHJhbnNwb3J0IHR5cGUgdG8gYmUgdXNlZAorICogXHJldHVybiAgICAgICAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlCisgKi8KK0xJTktTUEVDX0ggSEFORExFX0FBQ0RFQ09ERVIKK2FhY0RlY29kZXJfT3BlbiAoIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwgVUlOVCBuck9mTGF5ZXJzICk7CisKKy8qKgorICogXGJyaWVmIEV4cGxpY2l0bHkgY29uZmlndXJlIHRoZSBkZWNvZGVyIGJ5IHBhc3NpbmcgYSByYXcgQXVkaW9TcGVjaWZpY0NvbmZpZyAoQVNDKSBvciBhIFN0cmVhbU11eENvbmZpZyAoU01DKSwKKyAqICBjb250YWluZWQgaW4gYSBiaW5hcnkgYnVmZmVyLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBNUEVHLTQgYW5kIFJhdyBQYWNrZXRzIGZpbGUgZm9ybWF0IGJpdHN0cmVhbXMKKyAqICBhcyB3ZWxsIGFzIGZvciBMQVRNIGJpdHN0cmVhbXMgd2l0aCBubyBpbi1iYW5kIFNNQy4gSWYgdGhlIHRyYW5zcG9ydCBmb3JtYXQgaXMgTEFUTSB3aXRoIG9yIHdpdGhvdXQKKyAqICBMT0FTLCBjb25maWd1cmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgYW4gU01DLCBmb3IgYWxsIG90aGVyIGZpbGUgZm9ybWF0cyBhbiBBU0MuCisgKgorICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGNvbmYgICAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgY29uZmlndXJhdGlvbiBidWZmZXIgKGVpdGhlciBBU0Mgb3IgU01DKS4KKyAqIFxwYXJhbSBsZW5ndGggIExlbmd0aCBvZiB0aGUgY29uZmlndXJhdGlvbiBidWZmZXIgaW4gYnl0ZXMuCisgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgorICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0NvbmZpZ1JhdyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmNvbmZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgbGVuZ3RoW10gKTsKKworCisvKioKKyAqIFxicmllZiBGaWxsIEFBQyBkZWNvZGVyJ3MgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgorICogIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuCisgKiAgU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20gcEJ1ZmZlciBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhCisgKiAgc3Vic2VxdWVudCBjYWxsIG9mICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KKyAqICBncmFiIHRoZSBuZXh0IGRhdGEuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwQnVmZmVyICAgICBQb2ludGVyIHRvIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4gVGhpcyBhcmd1bWVudCBpcyByZXF1aXJlZCBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseQorICogICAgICAgICAgICAgICAgICAgIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHRvIHBCdWZmZXIsIHdoZXJlIHRoZSBuZXh0CisgKiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4gZmVkIGludG8gdGhlIGRlY29kZXItaW50ZXJuYWwgYnVmZmVyIChhcyBtdWNoCisgKiAgICAgICAgICAgICAgICAgICAgYXMgcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlIGJ1ZmZlciBhdCBwQnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgYWdhaW4sIG9uY2UgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlIHZhbGlkIGJ5dGVzIGFueW1vcmUgKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICBjb3BpZWQgaW50byB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIG5ld2x5IGNvcGllZCBieXRlcy4KKyAqIFxyZXR1cm4gICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0ZpbGwgKCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKKyAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICpwQnVmZmVyW10sCisgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgYnVmZmVyU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgKmJ5dGVzVmFsaWQgKTsKKworI2RlZmluZSBBQUNERUNfQ09OQ0VBTCAgMSAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogVHJpZ2dlciB0aGUgYnVpbHQtaW4gZXJyb3IgY29uY2VhbG1lbnQgbW9kdWxlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdlbmVyYXRlIGEgc3Vic3RpdHV0ZSBzaWduYWwgZm9yIG9uZSBsb3N0IGZyYW1lLiBOZXcgaW5wdXQgZGF0YSB3aWxsIG5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZC4gKi8KKyNkZWZpbmUgQUFDREVDX0ZMVVNIICAgIDIgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IEZsdXNoIGFsbCBmaWx0ZXJiYW5rcyB0byBnZXQgYWxsIGRlbGF5ZWQgYXVkaW8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBoYXZpbmcgbmV3IGlucHV0IGRhdGEuIFRodXMgbmV3IGlucHV0IGRhdGEgd2lsbCBub3QgYmUgY29uc2lkZXJlZC4qLworI2RlZmluZSBBQUNERUNfSU5UUiAgICAgNCAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogU2lnbmFsIGFuIGlucHV0IGJpdCBzdHJlYW0gZGF0YSBkaXNjb250aW51aXR5LiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN5bmMgYW55IGludGVybmFscyBhcyBuZWNlc3NhcnkuICovCisjZGVmaW5lIEFBQ0RFQ19DTFJISVNUICA4IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBDbGVhciBhbGwgc2lnbmFsIGRlbGF5IGxpbmVzIGFuZCBoaXN0b3J5IGJ1ZmZlcnMuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBjYW4gY2F1c2UgZGlzY29udGludWl0aWVzIGluIHRoZSBvdXRwdXQgc2lnbmFsLiAqLworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgIERlY29kZSBvbmUgYXVkaW8gZnJhbWUKKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcFRpbWVEYXRhICBQb2ludGVyIHRvIGV4dGVybmFsIG91dHB1dCBidWZmZXIgd2hlcmUgdGhlIGRlY29kZWQgUENNIHNhbXBsZXMgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBmbGFncyAgICAgIEJpdCBmaWVsZCB3aXRoIGZsYWdzIGZvciB0aGUgZGVjb2RlcjogXG4KKyAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSA9PSAxOiBEbyBjb25jZWFsbWVudC4gXG4KKyAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgPT0gMjogRGlzY2FyZCBpbnB1dCBkYXRhLiBGbHVzaCBmaWx0ZXIgYmFua3MgKG91dHB1dCBkZWxheWVkIGF1ZGlvKS4gXG4KKyAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19JTlRSKSA9PSA0OiBJbnB1dCBkYXRhIGlzIGRpc2NvbnRpbnVvdXMuIFJlc3luY2hyb25pemUgYW55IGludGVybmFscyBhcyBuZWNlc3NhcnkuCisgKiBccmV0dXJuICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0RlY29kZUZyYW1lICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgKnBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncyApOworCisvKioKKyAqIFxicmllZiAgICAgICBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIG9mIGFuIEFBQyBkZWNvZGVyIGluc3RhbmNlLgorICoKKyAqIFxwYXJhbSBzZWxmICBBQUMgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgdm9pZAorICovCitMSU5LU1BFQ19IIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgR2V0IENTdHJlYW1JbmZvIGhhbmRsZSBmcm9tIGRlY29kZXIuCisgKgorICogXHBhcmFtIHNlbGYgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICBSZWZlcmVuY2UgdG8gcmVxdWVzdGVkIENTdHJlYW1JbmZvLgorICovCitMSU5LU1BFQ19IIENTdHJlYW1JbmZvKiBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgR2V0IGRlY29kZXIgbGlicmFyeSBpbmZvLgorICoKKyAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuICAgICAgMCBvbiBzdWNjZXNzCisgKi8KK0xJTktTUEVDX0ggSU5UIGFhY0RlY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQUFDREVDT0RFUl9MSUJfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYyODliCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBKb3NlZiBIb2VwZmwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjX3JhbS5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworI2RlZmluZSBXT1JLQlVGRkVSMV9UQUcgMAorI2RlZmluZSBXT1JLQlVGRkVSMl9UQUcgMQorCisvKiEgVGhlIHN0cnVjdHVyZSBBQUNfREVDT0RFUl9JTlNUQU5DRSBpcyB0aGUgdG9wIGxldmVsIHN0cnVjdHVyZSBob2xkaW5nIGFsbCBkZWNvZGVyIGNvbmZpZ3VyYXRpb25zLAorICAgIGhhbmRsZXMgYW5kIHN0cnVjdHMuCisgKi8KK0NfQUxMT0NfTUVNKEFhY0RlY29kZXIsIEFBQ19ERUNPREVSX0lOU1RBTkNFLCAxKQorCisvKiEKKyAgXG5hbWUgU3RhdGljQWFjRGF0YQorCisgIFN0YXRpYyBtZW1vcnkgYXJlYXMsIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIGluIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBkZWNvZGVyCisqLworLyogQHsgKi8KKworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBjb250YWlucyB0aGUgc3RhdGljIHNpZGVpbmZvIHdoaWNoIGlzIG5lZWRlZAorICAgIGZvciB0aGUgZGVjb2Rpbmcgb2Ygb25lIGFhYyBjaGFubmVsLiA8YnI+CisgICAgRGltZW5zaW9uOiAjQWFjRGVjb2RlckNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIDEsICg4KSkKKworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyBjb250YWlucyB0aGUgZHluYW1pYyBzaWRlaW5mbyB3aGljaCBpcyBuZWVkZWQKKyAgICBmb3IgdGhlIGRlY29kaW5nIG9mIG9uZSBhYWMgY2hhbm5lbC4gPGJyPgorICAgIERpbWVuc2lvbjogI0FhY0RlY29kZXJDaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FBTExPQ19NRU0yKEFhY0RlY29kZXJDaGFubmVsSW5mbywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbywgMSwgKDgpKQorCisvKiEgT3ZlcmxhcCBidWZmZXIgKi8KK0NfQUxMT0NfTUVNMihPdmVybGFwQnVmZmVyLCBGSVhQX0RCTCwgT3ZlcmxhcEJ1ZmZlclNpemUsICg4KSkKKworQ19BTExPQ19NRU0oRHJjSW5mbywgQ0RyY0luZm8sIDEpCisKKy8qIEB9ICovCisKKy8qIQorICBcbmFtZSBEeW5hbWljQWFjRGF0YQorCisgIER5bmFtaWMgbWVtb3J5IGFyZWFzLCBtaWdodCBiZSByZXVzZWQgaW4gb3RoZXIgYWxnb3JpdGhtIHNlY3Rpb25zLAorICBlLmcuIHRoZSBzYnIgZGVjb2RlcgorKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCwgKCg4KSoxMDI0KSwgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSMl9UQUcpCisKKworQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTEsIENXb3JrQnVmZmVyQ29yZTEsIDEsIFNFQ1RfREFUQV9MMSwgV09SS0JVRkZFUjFfVEFHKQorCisvKiBAeyAqLworCisKKy8qIEB9ICovCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmggYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyN2UyNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY19yYW0uaApAQCAtMCwwICsxLDEyMCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFBQ19SQU1fSAorI2RlZmluZSBBQUNfUkFNX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgImFhY2RlY29kZXIuaCIKKworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKKyNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCisKKy8qIEVuZCBvZiBmb3JtYWwgZml4LmggKi8KKworI2RlZmluZSBNQVhfU1lOQ0hTICAgICAgICAxMAorI2RlZmluZSBTQU1QTF9GUkVRUyAgICAgICAxMgorCitIX0FMTE9DX01FTShBYWNEZWNvZGVyLCBBQUNfREVDT0RFUl9JTlNUQU5DRSkKKworSF9BTExPQ19NRU0oRHJjSW5mbywgQ0RyY0luZm8pCisKK0hfQUxMT0NfTUVNKEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbykKK0hfQUxMT0NfTUVNKEFhY0RlY29kZXJDaGFubmVsSW5mbywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbykKK0hfQUxMT0NfTUVNKE92ZXJsYXBCdWZmZXIsIEZJWFBfREJMKQorCitIX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlMSwgQ1dvcmtCdWZmZXJDb3JlMSkKK0hfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCkKKworCisjZW5kaWYgLyogI2lmbmRlZiBBQUNfUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3Y2IzYgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwCkBAIC0wLDAgKzEsMTg3OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorCisKKy8qIFByZXNjYWxlIEludmVyc2VRdWFudFRhYmxlIGJ5IDQgdG8gc2F2ZQorICAgcmVkdW5kYW50IHNoaWZ0cyBpbiBpbnZlcnMgcXVhbnRpemF0aW9uCisgKi8KKyNkZWZpbmUgU0NMX1RBQihhKSAoYT4+NCkKK2NvbnN0IEZJWFBfREJMIEludmVyc2VRdWFudFRhYmxlIFtJTlZfUVVBTlRfVEFCTEVTSVpFICsgMV0gPQoreworICBTQ0xfVEFCKDB4MzJDQkZENDApLCBTQ0xfVEFCKDB4MzMwRkMzNDApLCBTQ0xfVEFCKDB4MzM1MzlGQzApLCBTQ0xfVEFCKDB4MzM5NzkyODApLCBTQ0xfVEFCKDB4MzNEQjlCQzApLCBTQ0xfVEFCKDB4MzQxRkJCODApLCBTQ0xfVEFCKDB4MzQ2M0YxODApLCBTQ0xfVEFCKDB4MzRBODNEQzApLAorICBTQ0xfVEFCKDB4MzRFQ0EwMDApLCBTQ0xfVEFCKDB4MzUzMTE4ODApLCBTQ0xfVEFCKDB4MzU3NUE3MDApLCBTQ0xfVEFCKDB4MzVCQTRCODApLCBTQ0xfVEFCKDB4MzVGRjA2MDApLCBTQ0xfVEFCKDB4MzY0M0Q2ODApLCBTQ0xfVEFCKDB4MzY4OEJDQzApLCBTQ0xfVEFCKDB4MzZDREI4ODApLAorICBTQ0xfVEFCKDB4MzcxMkNBNDApLCBTQ0xfVEFCKDB4Mzc1N0YxQzApLCBTQ0xfVEFCKDB4Mzc5RDJGMDApLCBTQ0xfVEFCKDB4MzdFMjgxODApLCBTQ0xfVEFCKDB4MzgyN0U5QzApLCBTQ0xfVEFCKDB4Mzg2RDY3NDApLCBTQ0xfVEFCKDB4MzhCMkZBNDApLCBTQ0xfVEFCKDB4MzhGOEEyQzApLAorICBTQ0xfVEFCKDB4MzkzRTYwODApLCBTQ0xfVEFCKDB4Mzk4NDMzODApLCBTQ0xfVEFCKDB4MzlDQTFCQzApLCBTQ0xfVEFCKDB4M0ExMDE5NDApLCBTQ0xfVEFCKDB4M0E1NjJCQzApLCBTQ0xfVEFCKDB4M0E5QzUzNDApLCBTQ0xfVEFCKDB4M0FFMjhGQzApLCBTQ0xfVEFCKDB4M0IyOEUxODApLAorICBTQ0xfVEFCKDB4M0I2RjQ4MDApLCBTQ0xfVEFCKDB4M0JCNUMzNDApLCBTQ0xfVEFCKDB4M0JGQzUzODApLCBTQ0xfVEFCKDB4M0M0MkY4ODApLCBTQ0xfVEFCKDB4M0M4OUIyMDApLCBTQ0xfVEFCKDB4M0NEMDgwODApLCBTQ0xfVEFCKDB4M0QxNzYzNDApLCBTQ0xfVEFCKDB4M0Q1RTVCMDApLAorICBTQ0xfVEFCKDB4M0RBNTY3MDApLCBTQ0xfVEFCKDB4M0RFQzg3QzApLCBTQ0xfVEFCKDB4M0UzM0JDQzApLCBTQ0xfVEFCKDB4M0U3QjA2NDApLCBTQ0xfVEFCKDB4M0VDMjY0MDApLCBTQ0xfVEFCKDB4M0YwOUQ2NDApLCBTQ0xfVEFCKDB4M0Y1MTVDODApLCBTQ0xfVEFCKDB4M0Y5OEY3NDApLAorICBTQ0xfVEFCKDB4M0ZFMEE2MDApLCBTQ0xfVEFCKDB4NDAyODY5MDApLCBTQ0xfVEFCKDB4NDA3MDQwMDApLCBTQ0xfVEFCKDB4NDBCODJCMDApLCBTQ0xfVEFCKDB4NDEwMDJBMDApLCBTQ0xfVEFCKDB4NDE0ODNEMDApLCBTQ0xfVEFCKDB4NDE5MDY0MDApLCBTQ0xfVEFCKDB4NDFEODlGMDApLAorICBTQ0xfVEFCKDB4NDIyMEVEODApLCBTQ0xfVEFCKDB4NDI2OTUwMDApLCBTQ0xfVEFCKDB4NDJCMUM2MDApLCBTQ0xfVEFCKDB4NDJGQTUwMDApLCBTQ0xfVEFCKDB4NDM0MkVEODApLCBTQ0xfVEFCKDB4NDM4QjlFODApLCBTQ0xfVEFCKDB4NDNENDYzODApLCBTQ0xfVEFCKDB4NDQxRDNCODApLAorICBTQ0xfVEFCKDB4NDQ2NjI3ODApLCBTQ0xfVEFCKDB4NDRBRjI2ODApLCBTQ0xfVEFCKDB4NDRGODM5MDApLCBTQ0xfVEFCKDB4NDU0MTVGMDApLCBTQ0xfVEFCKDB4NDU4QTk4ODApLCBTQ0xfVEFCKDB4NDVEM0U1MDApLCBTQ0xfVEFCKDB4NDYxRDQ1MDApLCBTQ0xfVEFCKDB4NDY2NkI4MDApLAorICBTQ0xfVEFCKDB4NDZCMDNFODApLCBTQ0xfVEFCKDB4NDZGOUQ4MDApLCBTQ0xfVEFCKDB4NDc0Mzg0ODApLCBTQ0xfVEFCKDB4NDc4RDQ0MDApLCBTQ0xfVEFCKDB4NDdENzE2ODApLCBTQ0xfVEFCKDB4NDgyMEZDMDApLCBTQ0xfVEFCKDB4NDg2QUY1MDApLCBTQ0xfVEFCKDB4NDhCNTAwMDApLAorICBTQ0xfVEFCKDB4NDhGRjFFODApLCBTQ0xfVEFCKDB4NDk0OTRGODApLCBTQ0xfVEFCKDB4NDk5MzkzODApLCBTQ0xfVEFCKDB4NDlEREVBODApLCBTQ0xfVEFCKDB4NEEyODU0MDApLCBTQ0xfVEFCKDB4NEE3MkQwMDApLCBTQ0xfVEFCKDB4NEFCRDVFODApLCBTQ0xfVEFCKDB4NEIwODAwMDApLAorICBTQ0xfVEFCKDB4NEI1MkI0MDApLCBTQ0xfVEFCKDB4NEI5RDdBODApLCBTQ0xfVEFCKDB4NEJFODUzODApLCBTQ0xfVEFCKDB4NEMzMzNGMDApLCBTQ0xfVEFCKDB4NEM3RTNEMDApLCBTQ0xfVEFCKDB4NENDOTREMDApLCBTQ0xfVEFCKDB4NEQxNDZGODApLCBTQ0xfVEFCKDB4NEQ1RkE1MDApLAorICBTQ0xfVEFCKDB4NERBQUVDMDApLCBTQ0xfVEFCKDB4NERGNjQ1ODApLCBTQ0xfVEFCKDB4NEU0MUIxODApLCBTQ0xfVEFCKDB4NEU4RDJGMDApLCBTQ0xfVEFCKDB4NEVEOEJGODApLCBTQ0xfVEFCKDB4NEYyNDYxODApLCBTQ0xfVEFCKDB4NEY3MDE2MDApLCBTQ0xfVEFCKDB4NEZCQkRDMDApLAorICBTQ0xfVEFCKDB4NTAwN0I0ODApLCBTQ0xfVEFCKDB4NTA1MzlGMDApLCBTQ0xfVEFCKDB4NTA5RjlCODApLCBTQ0xfVEFCKDB4NTBFQkE5ODApLCBTQ0xfVEFCKDB4NTEzN0M5ODApLCBTQ0xfVEFCKDB4NTE4M0ZCODApLCBTQ0xfVEFCKDB4NTFEMDNGODApLCBTQ0xfVEFCKDB4NTIxQzk1MDApLAorICBTQ0xfVEFCKDB4NTI2OEZDODApLCBTQ0xfVEFCKDB4NTJCNTc1ODApLCBTQ0xfVEFCKDB4NTMwMjAwMDApLCBTQ0xfVEFCKDB4NTM0RTlDODApLCBTQ0xfVEFCKDB4NTM5QjRBODApLCBTQ0xfVEFCKDB4NTNFODBBODApLCBTQ0xfVEFCKDB4NTQzNERCODApLCBTQ0xfVEFCKDB4NTQ4MUJFODApLAorICBTQ0xfVEFCKDB4NTRDRUIyODApLCBTQ0xfVEFCKDB4NTUxQkI4ODApLCBTQ0xfVEFCKDB4NTU2OENGODApLCBTQ0xfVEFCKDB4NTVCNUY4MDApLCBTQ0xfVEFCKDB4NTYwMzMyMDApLCBTQ0xfVEFCKDB4NTY1MDdEODApLCBTQ0xfVEFCKDB4NTY5RERBMDApLCBTQ0xfVEFCKDB4NTZFQjQ4MDApLAorICBTQ0xfVEFCKDB4NTczOEM3MDApLCBTQ0xfVEFCKDB4NTc4NjU3ODApLCBTQ0xfVEFCKDB4NTdEM0Y5MDApLCBTQ0xfVEFCKDB4NTgyMUFDMDApLCBTQ0xfVEFCKDB4NTg2RjcwMDApLCBTQ0xfVEFCKDB4NThCRDQ1MDApLCBTQ0xfVEFCKDB4NTkwQjJCMDApLCBTQ0xfVEFCKDB4NTk1OTIyMDApLAorICBTQ0xfVEFCKDB4NTlBNzJBODApLCBTQ0xfVEFCKDB4NTlGNTQzODApLCBTQ0xfVEFCKDB4NUE0MzZEODApLCBTQ0xfVEFCKDB4NUE5MUE5MDApLCBTQ0xfVEFCKDB4NUFERkY1MDApLCBTQ0xfVEFCKDB4NUIyRTUxODApLCBTQ0xfVEFCKDB4NUI3Q0JGODApLCBTQ0xfVEFCKDB4NUJDQjNFMDApLAorICBTQ0xfVEFCKDB4NUMxOUNEMDApLCBTQ0xfVEFCKDB4NUM2ODZEODApLCBTQ0xfVEFCKDB4NUNCNzFFMDApLCBTQ0xfVEFCKDB4NUQwNURGODApLCBTQ0xfVEFCKDB4NUQ1NEIyMDApLCBTQ0xfVEFCKDB4NURBMzk1MDApLCBTQ0xfVEFCKDB4NURGMjg4ODApLCBTQ0xfVEFCKDB4NUU0MThDODApLAorICBTQ0xfVEFCKDB4NUU5MEExMDApLCBTQ0xfVEFCKDB4NUVERkM2ODApLCBTQ0xfVEFCKDB4NUYyRUZDMDApLCBTQ0xfVEFCKDB4NUY3RTQyODApLCBTQ0xfVEFCKDB4NUZDRDk5MDApLCBTQ0xfVEFCKDB4NjAxRDAwODApLCBTQ0xfVEFCKDB4NjA2Qzc4MDApLCBTQ0xfVEFCKDB4NjBCQzAwMDApLAorICBTQ0xfVEFCKDB4NjEwQjk4MDApLCBTQ0xfVEFCKDB4NjE1QjQxMDApLCBTQ0xfVEFCKDB4NjFBQUY5ODApLCBTQ0xfVEFCKDB4NjFGQUMzMDApLCBTQ0xfVEFCKDB4NjI0QTlDODApLCBTQ0xfVEFCKDB4NjI5QTg2MDApLCBTQ0xfVEFCKDB4NjJFQTgwMDApLCBTQ0xfVEFCKDB4NjMzQThBMDApLAorICBTQ0xfVEFCKDB4NjM4QUE0ODApLCBTQ0xfVEFCKDB4NjNEQUNGMDApLCBTQ0xfVEFCKDB4NjQyQjA5ODApLCBTQ0xfVEFCKDB4NjQ3QjU0MDApLCBTQ0xfVEFCKDB4NjRDQkFFODApLCBTQ0xfVEFCKDB4NjUxQzE5MDApLCBTQ0xfVEFCKDB4NjU2Qzk0MDApLCBTQ0xfVEFCKDB4NjVCRDFFODApLAorICBTQ0xfVEFCKDB4NjYwREI5MDApLCBTQ0xfVEFCKDB4NjY1RTYzODApLCBTQ0xfVEFCKDB4NjZBRjFFMDApLCBTQ0xfVEFCKDB4NjZGRkU4ODApLCBTQ0xfVEFCKDB4Njc1MEMyODApLCBTQ0xfVEFCKDB4NjdBMUFDODApLCBTQ0xfVEFCKDB4NjdGMkE2MDApLCBTQ0xfVEFCKDB4Njg0M0IwMDApLAorICBTQ0xfVEFCKDB4Njg5NEM5MDApLCBTQ0xfVEFCKDB4NjhFNUYyMDApLCBTQ0xfVEFCKDB4NjkzNzJCMDApLCBTQ0xfVEFCKDB4Njk4ODczODApLCBTQ0xfVEFCKDB4NjlEOUNCODApLCBTQ0xfVEFCKDB4NkEyQjMzMDApLCBTQ0xfVEFCKDB4NkE3Q0FBODApLCBTQ0xfVEFCKDB4NkFDRTMxODApLAorICBTQ0xfVEFCKDB4NkIxRkM4MDApLCBTQ0xfVEFCKDB4NkI3MTZFMDApLCBTQ0xfVEFCKDB4NkJDMzI0MDApLCBTQ0xfVEFCKDB4NkMxNEU5MDApLCBTQ0xfVEFCKDB4NkM2NkJEODApLCBTQ0xfVEFCKDB4NkNCOEExODApLCBTQ0xfVEFCKDB4NkQwQTk1MDApLCBTQ0xfVEFCKDB4NkQ1Qzk4MDApLAorICBTQ0xfVEFCKDB4NkRBRUFBMDApLCBTQ0xfVEFCKDB4NkUwMENCODApLCBTQ0xfVEFCKDB4NkU1MkZDODApLCBTQ0xfVEFCKDB4NkVBNTNEMDApLCBTQ0xfVEFCKDB4NkVGNzhDODApLCBTQ0xfVEFCKDB4NkY0OUVCODApLCBTQ0xfVEFCKDB4NkY5QzU5ODApLCBTQ0xfVEFCKDB4NkZFRUQ3MDApLAorICBTQ0xfVEFCKDB4NzA0MTYzODApLCBTQ0xfVEFCKDB4NzA5M0ZGMDApLCBTQ0xfVEFCKDB4NzBFNkFBMDApLCBTQ0xfVEFCKDB4NzEzOTY0MDApLCBTQ0xfVEFCKDB4NzE4QzJEMDApLCBTQ0xfVEFCKDB4NzFERjA1ODApLCBTQ0xfVEFCKDB4NzIzMUVEMDApLCBTQ0xfVEFCKDB4NzI4NEUzMDApLAorICBTQ0xfVEFCKDB4NzJEN0U4ODApLCBTQ0xfVEFCKDB4NzMyQUZEMDApLCBTQ0xfVEFCKDB4NzM3RTIwODApLCBTQ0xfVEFCKDB4NzNEMTUzMDApLCBTQ0xfVEFCKDB4NzQyNDk0ODApLCBTQ0xfVEFCKDB4NzQ3N0U0ODApLCBTQ0xfVEFCKDB4NzRDQjQ0MDApLCBTQ0xfVEFCKDB4NzUxRUIyMDApLAorICBTQ0xfVEFCKDB4NzU3MjJGMDApLCBTQ0xfVEFCKDB4NzVDNUJCMDApLCBTQ0xfVEFCKDB4NzYxOTU1ODApLCBTQ0xfVEFCKDB4NzY2Q0ZGMDApLCBTQ0xfVEFCKDB4NzZDMEI3MDApLCBTQ0xfVEFCKDB4NzcxNDdFMDApLCBTQ0xfVEFCKDB4Nzc2ODU0MDApLCBTQ0xfVEFCKDB4NzdCQzM4ODApLAorICBTQ0xfVEFCKDB4NzgxMDJCODApLCBTQ0xfVEFCKDB4Nzg2NDJEODApLCBTQ0xfVEFCKDB4NzhCODNFMDApLCBTQ0xfVEFCKDB4NzkwQzVEMDApLCBTQ0xfVEFCKDB4Nzk2MDhCMDApLCBTQ0xfVEFCKDB4NzlCNEM3ODApLCBTQ0xfVEFCKDB4N0EwOTEyODApLCBTQ0xfVEFCKDB4N0E1RDZDMDApLAorICBTQ0xfVEFCKDB4N0FCMUQ0MDApLCBTQ0xfVEFCKDB4N0IwNjRBODApLCBTQ0xfVEFCKDB4N0I1QUNGODApLCBTQ0xfVEFCKDB4N0JBRjYzODApLCBTQ0xfVEFCKDB4N0MwNDA1ODApLCBTQ0xfVEFCKDB4N0M1OEI2MDApLCBTQ0xfVEFCKDB4N0NBRDc1MDApLCBTQ0xfVEFCKDB4N0QwMjQyMDApLAorICBTQ0xfVEFCKDB4N0Q1NzFFMDApLCBTQ0xfVEFCKDB4N0RBQzA4MDApLCBTQ0xfVEFCKDB4N0UwMTAwODApLCBTQ0xfVEFCKDB4N0U1NjA3ODApLCBTQ0xfVEFCKDB4N0VBQjFDODApLCBTQ0xfVEFCKDB4N0YwMDQwMDApLCBTQ0xfVEFCKDB4N0Y1NTcyMDApLCBTQ0xfVEFCKDB4N0ZBQUIyMDApLAorICBTQ0xfVEFCKDB4N0ZGRkZGRkYpCit9IDsKKworLyoqCisgKiBcYnJpZWYgVGFibGUgcmVwcmVzZW50aW5nIHNjYWxlIGZhY3RvciBnYWlucy4gR2l2ZW4gYSBzY2FsZSBmYWN0b3Igc2YsIGFuZCBhIHZhbHVlIHBTcGVjW2ldIHRoZQorICogZ2FpbiBpcyBnaXZlbiBieTogTWFudGlzc2FUYWJsZVtzZiAlIDRdW21zYl0gPSAyXihzZiAlIDQpIC8gKDE8PEV4cG9uZW50VGFibGVbc2YgJSA0XVttc2JdCisgKiBUaGUgc2Vjb25kIGRpbWVuc2lvbiAibXNiIiByZXByZXNlbnRzIHRoZSB1cHBlciBzY2FsZSBmYWN0b3IgYml0IGNvdW50IGZsb29yKGxvZzIoc2NhbGVmYWN0b3IgPj4gMikpCisgKiBUaGUgY29ycmVzcG9uZGluZyBleHBvbmVudHMgZm9yIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZXMgYXJlIHN0b3JlZCBpbiBFeHBvbmVudFRhYmxlW3NmICUgNF1bbXNiXSBiZWxvdy4KKyAqLworY29uc3QgRklYUF9EQkwgTWFudGlzc2FUYWJsZSBbNF1bMTRdID0KK3sKKyAgeworICAgIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAsIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAsIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAsCisgICAgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMAorICB9LAorICB7CisgICAgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MCwgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MCwgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MCwKKyAgICAweDc4RDBERjgwLCAweDRDMUJGODAwLCAweDVGRTQ0MzgwLCAweDc4RDBERjgwLCAweDRDMUJGODAwLCAweDVGRTQ0MzgwCisgIH0sCisgIHsKKyAgICAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLAorICAgIDB4NDdENjZCMDAsIDB4NUE4Mjc5ODAsIDB4NzIwOEY4MDAsIDB4NDdENjZCMDAsIDB4NUE4Mjc5ODAsIDB4NzIwOEY4MDAKKyAgfSwKKyAgeworICAgIDB4NkJBMjdFODAsIDB4NDNDRTNFODAsIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAsIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAsCisgICAgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MAorICB9Cit9IDsKKworY29uc3QgU0NIQVIgRXhwb25lbnRUYWJsZSBbNF1bMTRdID0KK3sKKyAgeyAxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOCB9LAorICB7IDEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4IH0sCisgIHsgMSwgMiwgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTggfSwKKyAgeyAxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOSB9Cit9IDsKKworCisKKy8qIDQ5IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEwMjRbNTBdID0geworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LAorICAgIDcyLCAgODAsICA4OCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAgMTQ0LCAxNjAsIDE3NiwgMTk2LCAyMTYsIDI0MCwgMjY0LAorICAgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCAgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LAorICAgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0Cit9OworLyogMTQgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfMTI4WzE1XSA9Cit7CisgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjgsICAgMzYsICA0NCwgIDU2LCAgNjgsICA4MCwgIDk2LCAxMTIsCisgICAxMjgKK307CisKKy8qIDUxIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzEwMjRbNTJdID0KK3sKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwKKyAgICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwKKyAgIDI5MiwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwKKyAgIDczNiwgNzY4LCA4MDAsIDgzMiwgODY0LCA4OTYsIDkyOCwgIDk2MCwgOTkyLDEwMjQKK307CisKKy8qIDQ3IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzEwMjRbNDhdID0KK3sKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwKKyAgICA2OCwgIDc2LCAgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgIDEyNCwgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODgsIDIwNCwKKyAgIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgICAzOTYsIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsCisgICA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwxMDI0Cit9OworCisvKiAxNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF8xMjhbMTZdID0KK3sKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDM2LCAgNDQsICA1MiwgIDY0LCAgNzYsICA5MiwKKyAgIDEwOCwgMTI4Cit9OworCisvKiA0MyBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl8xMDI0WzQ0XSA9Cit7CisgICAgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgMTAwLCAxMTIsCisgICAxMjQsIDEzNiwgMTQ4LCAxNjAsIDE3MiwgMTg0LCAxOTYsICAyMTIsIDIyOCwgMjQ0LCAyNjAsIDI4MCwgMzAwLCAzMjAsCisgICAzNDQsIDM2OCwgMzk2LCA0MjQsIDQ1NiwgNDkyLCA1MzIsICA1NzIsIDYxNiwgNjY0LCA3MTYsIDc3MiwgODMyLCA4OTYsCisgICA5NjAsMTAyNAorfTsKKworLyogMTUgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTI4WzE2XSA9Cit7CisgICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAgMjgsICAzMiwgIDQwLCAgNDgsICA2MCwgIDcyLCAgODgsCisgICAxMDgsIDEyOAorfTsKKworLyogNDAgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF8xMDI0WzQxXSA9Cit7CisgICAgIDAsICAxMiwgIDI0LCAgMzYsICA0OCwgIDYwLCAgNzIsICAgODQsICA5NiwgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsCisgICAxNzIsIDE4OCwgMjA0LCAyMjAsIDIzNiwgMjUyLCAyNjgsICAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgMzk2LCA0MjAsCisgICA0NDgsIDQ3NiwgNTA4LCA1NDQsIDU4MCwgNjIwLCA2NjQsICA3MTIsIDc2NCwgODIwLCA4ODAsIDk0NCwxMDI0Cit9OworCisvKiAxNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl84XzEyOFsxNl0gPQoreworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzYsICA0NCwgIDUyLCAgNjAsICA3MiwgIDg4LAorICAgMTA4LCAxMjgKK307CisKKworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4Xzk2MFs1MF0gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0OCwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICA5NiwgICAgIDEwOCwgICAgMTIwLAorICAxMzIsICAgIDE0NCwgICAgMTYwLCAgICAxNzYsICAgIDE5NiwgICAgMjE2LCAgICAyNDAsICAgIDI2NCwgICAgMjkyLCAgICAzMjAsCisgIDM1MiwgICAgMzg0LCAgICA0MTYsICAgIDQ0OCwgICAgNDgwLCAgICA1MTIsICAgIDU0NCwgICAgNTc2LCAgICA2MDgsICAgIDY0MCwKKyAgNjcyLCAgICA3MDQsICAgIDczNiwgICAgNzY4LCAgICA4MDAsICAgIDgzMiwgICAgODY0LCAgICA4OTYsICAgIDkyOCwgICAgOTYwCit9OyAgIC8qIDQ5IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEyMFsxNV0gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyOCwgICAgIDM2LCAgICAgNDQsICAgICA1NiwKKyAgNjgsICAgICA4MCwgICAgIDk2LCAgICAgMTEyLCAgICAxMjAKK307ICAgLyogMTQgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8zMl85NjBbNTBdID0KK3sKKyAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCisgIDQwLCAgICAgNDgsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsICAgICAxMDgsICAgIDEyMCwKKyAgMTMyLCAgICAxNDQsICAgIDE2MCwgICAgMTc2LCAgICAxOTYsICAgIDIxNiwgICAgMjQwLCAgICAyNjQsICAgIDI5MiwgICAgMzIwLAorICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MCwgICAgNTEyLCAgICA1NDQsICAgIDU3NiwgICAgNjA4LCAgICA2NDAsCisgIDY3MiwgICAgNzA0LCAgICA3MzYsICAgIDc2OCwgICAgODAwLCAgICA4MzIsICAgIDg2NCwgICAgODk2LCAgICA5MjgsICAgIDk2MAorfTsgICAvKiA0OSBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0Xzk2MFs0N10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0NCwgICAgIDUyLCAgICAgNjAsICAgICA2OCwgICAgIDc2LCAgICAgODQsICAgICA5MiwgICAgIDEwMCwgICAgMTA4LAorICAxMTYsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2MCwgICAgMTcyLCAgICAxODgsICAgIDIwNCwgICAgMjIwLCAgICAyNDAsCisgIDI2MCwgICAgMjg0LCAgICAzMDgsICAgIDMzNiwgICAgMzY0LCAgICAzOTYsICAgIDQzMiwgICAgNDY4LCAgICA1MDgsICAgIDU1MiwKKyAgNjAwLCAgICA2NTIsICAgIDcwNCwgICAgNzY4LCAgICA4MzIsICAgIDg5NiwgICAgOTYwCit9OyAgIC8qIDQ2IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfMTIwWzE2XSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzNiwgICAgIDQ0LAorICA1MiwgICAgIDY0LCAgICAgNzYsICAgICA5MiwgICAgIDEwOCwgICAgMTIwCit9OyAgIC8qIDE1IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfOTYwWzQzXSA9Cit7CisgIDAsICAgICAgOCwgICAgICAxNiwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LCAgICAgNTYsICAgICA2NCwgICAgIDcyLAorICA4MCwgICAgIDg4LCAgICAgMTAwLCAgICAxMTIsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2MCwgICAgMTcyLCAgICAxODQsCisgIDE5NiwgICAgMjEyLCAgICAyMjgsICAgIDI0NCwgICAgMjYwLCAgICAyODAsICAgIDMwMCwgICAgMzIwLCAgICAzNDQsICAgIDM2OCwKKyAgMzk2LCAgICA0MjQsICAgIDQ1NiwgICAgNDkyLCAgICA1MzIsICAgIDU3MiwgICAgNjE2LCAgICA2NjQsICAgIDcxNiwgICAgNzcyLAorICA4MzIsICAgIDg5NiwgICAgOTYwCit9OyAgIC8qIDQyIHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTIwWzE2XSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDQwLAorICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4OCwgICAgIDEwOCwgICAgMTIwCit9OyAgIC8qIDE1IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF85NjBbNDFdID0KK3sKKyAgMCwgICAgICAxMiwgICAgIDI0LCAgICAgMzYsICAgICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4NCwgICAgIDk2LCAgICAgMTA4LAorICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMDQsICAgIDIyMCwgICAgMjM2LCAgICAyNTIsCisgIDI2OCwgICAgMjg4LCAgICAzMDgsICAgIDMyOCwgICAgMzQ4LCAgICAzNzIsICAgIDM5NiwgICAgNDIwLCAgICA0NDgsICAgIDQ3NiwKKyAgNTA4LCAgICA1NDQsICAgIDU4MCwgICAgNjIwLCAgICA2NjQsICAgIDcxMiwgICAgNzY0LCAgICA4MjAsICAgIDg4MCwgICAgOTQ0LAorICA5NjAKK307ICAgLyogNDAgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl84XzEyMFsxNl0gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzYsICAgICA0NCwKKyAgNTIsICAgICA2MCwgICAgIDcyLCAgICAgODgsICAgICAxMDgsICAgIDEyMAorfTsgICAvKiAxNSBzY2ZiYW5kcyAqLworCisKKworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzUxMlszN10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDYwLCAgICAgNjgsICAgICA3NiwgICAgIDg0LCAgICAgOTIsCisgIDEwMCwgICAgMTEyLCAgICAxMjQsICAgIDEzNiwgICAgMTQ4LCAgICAxNjQsICAgIDE4NCwgICAgMjA4LCAgICAyMzYsICAgIDI2OCwKKyAgMzAwLCAgICAzMzIsICAgIDM2NCwgICAgMzk2LCAgICA0MjgsICAgIDQ2MCwgICAgNTEyCit9OyAgIC8qIDM2IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzUxMlszOF0gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsCisgIDEwOCwgICAgMTIwLCAgICAxMzIsICAgIDE0NCwgICAgMTYwLCAgICAxNzYsICAgIDE5MiwgICAgMjEyLCAgICAyMzYsICAgIDI2MCwKKyAgMjg4LCAgICAzMjAsICAgIDM1MiwgICAgMzg0LCAgICA0MTYsICAgIDQ0OCwgICAgNDgwLCAgICA1MTIKK307ICAgLyogMzcgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfNTEyWzMyXSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAorICA0MCwgICAgIDQ0LCAgICAgNTIsICAgICA2MCwgICAgIDY4LCAgICAgODAsICAgICA5MiwgICAgIDEwNCwgICAgMTIwLCAgICAxNDAsCisgIDE2NCwgICAgMTkyLCAgICAyMjQsICAgIDI1NiwgICAgMjg4LCAgICAzMjAsICAgIDM1MiwgICAgMzg0LCAgICA0MTYsICAgIDQ0OCwKKyAgNDgwLCAgICA1MTIKK307ICAgLyogMzEgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF80ODBbMzZdID0KK3sKKyAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCisgIDQwLCAgICAgNDQsICAgICA0OCwgICAgIDUyLCAgICAgNTYsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwgICAgIDk2LAorICAxMDgsICAgIDEyMCwgICAgMTMyLCAgICAxNDQsICAgIDE1NiwgICAgMTcyLCAgICAxODgsICAgIDIxMiwgICAgMjQwLCAgICAyNzIsCisgIDMwNCwgICAgMzM2LCAgICAzNjgsICAgIDQwMCwgICAgNDMyLCAgICA0ODAKK307ICAgLyogMzUgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMzJfNDgwWzM4XSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAorICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjAsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwKKyAgOTYsICAgICAxMDQsICAgIDExMiwgICAgMTI0LCAgICAxMzYsICAgIDE0OCwgICAgMTY0LCAgICAxODAsICAgIDIwMCwgICAgMjI0LAorICAyNTYsICAgIDI4OCwgICAgMzIwLCAgICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MAorfTsgICAvKiAzNyBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF80ODBbMzFdID0KK3sKKyAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCisgIDQwLCAgICAgNDQsICAgICA1MiwgICAgIDYwLCAgICAgNjgsICAgICA4MCwgICAgIDkyLCAgICAgMTA0LCAgICAxMjAsICAgIDE0MCwKKyAgMTY0LCAgICAxOTIsICAgIDIyNCwgICAgMjU2LCAgICAyODgsICAgIDMyMCwgICAgMzUyLCAgICAzODQsICAgIDQxNiwgICAgNDQ4LAorICA0ODAKK307ICAgLyogMzAgc2NmYmFuZHMgKi8KKworY29uc3QgU0ZCX0lORk8gc2ZiT2Zmc2V0VGFibGVzWzVdWzE2XSA9Cit7CisgIHsKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKKyAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKKyAgICB7IHNmYl8zMl8xMDI0LCBzZmJfNDhfMTI4LCA1MSwgMTQgfSwKKyAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKKyAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKKyAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKKyAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKKyAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKKyAgICB7IHNmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1IH0sCisgICAgeyBzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNSB9LAorICB9LCB7CisgICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTQgfSwKKyAgICB7IHNmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNCB9LAorICAgIHsgc2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0IH0sCisgICAgeyBzZmJfMjRfOTYwLCBzZmJfMjRfMTIwLCA0NiwgMTUgfSwKKyAgICB7IHNmYl8yNF85NjAsIHNmYl8yNF8xMjAsIDQ2LCAxNSB9LAorICAgIHsgc2ZiXzE2Xzk2MCwgc2ZiXzE2XzEyMCwgNDIsIDE1IH0sCisgICAgeyBzZmJfMTZfOTYwLCBzZmJfMTZfMTIwLCA0MiwgMTUgfSwKKyAgICB7IHNmYl8xNl85NjAsIHNmYl8xNl8xMjAsIDQyLCAxNSB9LAorICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAorICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAorICB9LCB7CisgICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgIH0sIHsKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAorICAgIHsgc2ZiXzQ4XzUxMiwgTlVMTCwgMzYsIDB9LAorICAgIHsgc2ZiXzMyXzUxMiwgTlVMTCwgMzcsIDAgfSwKKyAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCisgICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAorICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKKyAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCisgICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAorICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKKyAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCisgIH0sIHsKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IE5VTEwsIE5VTEwsIDAsIDAgfSwKKyAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCisgICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAorICAgIHsgc2ZiXzMyXzQ4MCwgTlVMTCwgMzcsIDAgfSwKKyAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCisgICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAorICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKKyAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCisgICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAorICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKKyAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCisgIH0KK307CisKKworLyojIGRvbid0IHVzZSAxIGJpdCBodWZtYW4gdGFibGVzICovCisvKgorICBNUEVHLTIgQUFDIDIgQklUUyBwYXJhbGxlbCBIdWZtYW4gVGFibGVzCisKKyAgQml0IDA6ICAgICA9IDE9RU5ETk9ERSwgMD1JTkRFWAorICBCaXQgMTogICAgID0gQ09ERVdPUkQgTEVOIE1PRCAyCisgIEJpdCAyLi45OiAgPSBWQUxVRS9SRUYgVGFibGVzIDEuLjEwLFNDTAorICBCaXQgMi4uMTE6ID0gVkFMVUUvUkVGIFRhYmxlIDExCisqLworICBjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzFbNTFdWzRdID0KK3sKKyAgezB4MDE1NywweDAxNTcsMHgwMDA0LDB4MDAxOH0sIHsweDAwMDgsMHgwMDBjLDB4MDAxMCwweDAwMTR9LCB7MHgwMTViLDB4MDE1YiwweDAxNTMsMHgwMTUzfSwgezB4MDA1NywweDAwNTcsMHgwMTY3LDB4MDE2N30sCisgIHsweDAyNTcsMHgwMjU3LDB4MDExNywweDAxMTd9LCB7MHgwMTk3LDB4MDE5NywweDAxNDcsMHgwMTQ3fSwgezB4MDAxYywweDAwMzAsMHgwMDQ0LDB4MDA1OH0sIHsweDAwMjAsMHgwMDI0LDB4MDAyOCwweDAwMmN9LAorICB7MHgwMTRiLDB4MDE0YiwweDAxNjMsMHgwMTYzfSwgezB4MDIxNywweDAyMTcsMHgwMTI3LDB4MDEyN30sIHsweDAxODcsMHgwMTg3LDB4MDA5NywweDAwOTd9LCB7MHgwMTZiLDB4MDE2YiwweDAwMTcsMHgwMDE3fSwKKyAgezB4MDAzNCwweDAwMzgsMHgwMDNjLDB4MDA0MH0sIHsweDAxNDMsMHgwMTQzLDB4MDEwNywweDAxMDd9LCB7MHgwMTFiLDB4MDExYiwweDAwNjcsMHgwMDY3fSwgezB4MDE5MywweDAxOTMsMHgwMjk3LDB4MDI5N30sCisgIHsweDAxOWIsMHgwMTliLDB4MDI0NywweDAyNDd9LCB7MHgwMDQ4LDB4MDA0YywweDAwNTAsMHgwMDU0fSwgezB4MDFhNywweDAxYTcsMHgwMjY3LDB4MDI2N30sIHsweDAxMTMsMHgwMTEzLDB4MDI1YiwweDAyNWJ9LAorICB7MHgwMDUzLDB4MDA1MywweDAwNWIsMHgwMDVifSwgezB4MDI1MywweDAyNTMsMHgwMDQ3LDB4MDA0N30sIHsweDAwNWMsMHgwMDcwLDB4MDA4NCwweDAwOTh9LCB7MHgwMDYwLDB4MDA2NCwweDAwNjgsMHgwMDZjfSwKKyAgezB4MDEyYiwweDAxMmIsMHgwMTIzLDB4MDEyM30sIHsweDAxOGIsMHgwMThiLDB4MDBhNywweDAwYTd9LCB7MHgwMjI3LDB4MDIyNywweDAyODcsMHgwMjg3fSwgezB4MDA4NywweDAwODcsMHgwMTBiLDB4MDEwYn0sCisgIHsweDAwNzQsMHgwMDc4LDB4MDA3YywweDAwODB9LCB7MHgwMjFiLDB4MDIxYiwweDAwMjcsMHgwMDI3fSwgezB4MDFhMywweDAxYTMsMHgwMDkzLDB4MDA5M30sIHsweDAxODMsMHgwMTgzLDB4MDIwNywweDAyMDd9LAorICB7MHgwMjRiLDB4MDI0YiwweDAwNGIsMHgwMDRifSwgezB4MDA4OCwweDAwOGMsMHgwMDkwLDB4MDA5NH0sIHsweDAwNjMsMHgwMDYzLDB4MDEwMywweDAxMDN9LCB7MHgwMDA3LDB4MDAwNywweDAyYTcsMHgwMmE3fSwKKyAgezB4MDA5YiwweDAwOWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyNjMsMHgwMjYzLDB4MDFhYiwweDAxYWJ9LCB7MHgwMDljLDB4MDBhMCwweDAwYTQsMHgwMGI4fSwgezB4MDI0MSwweDAwMTEsMHgwMDY5LDB4MDAxOX0sCisgIHsweDAyMTEsMHgwMDQxLDB4MDI5MSwweDAyOTl9LCB7MHgwMGE4LDB4MDBhYywweDAwYjAsMHgwMGI0fSwgezB4MDA4YiwweDAwOGIsMHgwMjIzLDB4MDIyM30sIHsweDAwYTMsMHgwMGEzLDB4MDIwYiwweDAyMGJ9LAorICB7MHgwMmFiLDB4MDJhYiwweDAyODMsMHgwMjgzfSwgezB4MDAyYiwweDAwMmIsMHgwMDgzLDB4MDA4M30sIHsweDAwYmMsMHgwMGMwLDB4MDBjNCwweDAwYzh9LCB7MHgwMDAzLDB4MDAwMywweDAyMmIsMHgwMjJifSwKKyAgezB4MDI4YiwweDAyOGIsMHgwMmEzLDB4MDJhM30sIHsweDAwMjMsMHgwMDIzLDB4MDIwMywweDAyMDN9LCB7MHgwMDBiLDB4MDAwYiwweDAwYWIsMHgwMGFifQorfTsKKworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18yWzM5XVs0XSA9Cit7CisgIHsweDAwMDQsMHgwMDBjLDB4MDAyMCwweDAwMzR9LCB7MHgwMTU3LDB4MDE1NywweDAxNTksMHgwMDA4fSwgezB4MDE1MywweDAxNTMsMHgwMjU3LDB4MDI1N30sIHsweDAwMTAsMHgwMDE0LDB4MDAxOCwweDAwMWN9LAorICB7MHgwMTE3LDB4MDExNywweDAwNTcsMHgwMDU3fSwgezB4MDE0NywweDAxNDcsMHgwMTk3LDB4MDE5N30sIHsweDAxNjcsMHgwMTY3LDB4MDE4NSwweDAxNjF9LCB7MHgwMTI1LDB4MDA5NSwweDAwNjUsMHgwMjE1fSwKKyAgezB4MDAyNCwweDAwMjgsMHgwMDJjLDB4MDAzMH0sIHsweDAwNTEsMHgwMTQ5LDB4MDExOSwweDAxNDF9LCB7MHgwMDE1LDB4MDE5OSwweDAyNTksMHgwMjQ1fSwgezB4MDE5MSwweDAyNjUsMHgwMTA1LDB4MDI1MX0sCisgIHsweDAwNDUsMHgwMTExLDB4MDE2OSwweDAxYTV9LCB7MHgwMDM4LDB4MDA0NCwweDAwNTgsMHgwMDZjfSwgezB4MDI5NSwweDAwNTksMHgwMDNjLDB4MDA0MH0sIHsweDAyMjcsMHgwMjI3LDB4MDIxYiwweDAyMWJ9LAorICB7MHgwMTIzLDB4MDEyMywweDAwODcsMHgwMDg3fSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAxOGIsMHgwMThiLDB4MDA2YiwweDAwNmJ9LCB7MHgwMjliLDB4MDI5YiwweDAxYTMsMHgwMWEzfSwKKyAgezB4MDIwNywweDAyMDcsMHgwMWFiLDB4MDFhYn0sIHsweDAwOTMsMHgwMDkzLDB4MDEwMywweDAxMDN9LCB7MHgwMDVjLDB4MDA2MCwweDAwNjQsMHgwMDY4fSwgezB4MDIxMywweDAyMTMsMHgwMTBiLDB4MDEwYn0sCisgIHsweDAxMmIsMHgwMTJiLDB4MDI0OSwweDAwNjF9LCB7MHgwMTgxLDB4MDI5MSwweDAyNDEsMHgwMDQxfSwgezB4MDAwNSwweDAwOTksMHgwMDE5LDB4MDAyNX0sIHsweDAwNzAsMHgwMDc0LDB4MDA3OCwweDAwODh9LAorICB7MHgwMmE1LDB4MDI2MSwweDAwMTEsMHgwMGE1fSwgezB4MDA0OSwweDAyODUsMHgwMjY5LDB4MDA4OX0sIHsweDAyMjEsMHgwMDdjLDB4MDA4MCwweDAwODR9LCB7MHgwMjBiLDB4MDIwYiwweDAwMDMsMHgwMDAzfSwKKyAgezB4MDBhMywweDAwYTMsMHgwMmEzLDB4MDJhM30sIHsweDAyYWIsMHgwMmFiLDB4MDA4MywweDAwODN9LCB7MHgwMDhjLDB4MDA5MCwweDAwOTQsMHgwMDk4fSwgezB4MDI4YiwweDAyOGIsMHgwMDIzLDB4MDAyM30sCisgIHsweDAyODMsMHgwMjgzLDB4MDAyYiwweDAwMmJ9LCB7MHgwMDBiLDB4MDAwYiwweDAyMDMsMHgwMjAzfSwgezB4MDIyYiwweDAyMmIsMHgwMGFiLDB4MDBhYn0KK307CisKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfM1szOV1bNF0gPQoreworICB7MHgwMDAzLDB4MDAwMywweDAwMDQsMHgwMDA4fSwgezB4MDAwNSwweDAxMDEsMHgwMDExLDB4MDA0MX0sIHsweDAwMGMsMHgwMDEwLDB4MDAxNCwweDAwMjB9LCB7MHgwMDE3LDB4MDAxNywweDAxNDMsMHgwMTQzfSwKKyAgezB4MDA1MSwweDAxMTEsMHgwMDQ1LDB4MDE1MX0sIHsweDAxMDUsMHgwMDU1LDB4MDAxOCwweDAwMWN9LCB7MHgwMTU3LDB4MDE1NywweDAxNDcsMHgwMTQ3fSwgezB4MDExNywweDAxMTcsMHgwMDA5LDB4MDIwMX0sCisgIHsweDAwMjQsMHgwMDJjLDB4MDA0MCwweDAwNTR9LCB7MHgwMjQxLDB4MDAxOSwweDAwNjUsMHgwMDI4fSwgezB4MDE4MywweDAxODMsMHgwMTkzLDB4MDE5M30sIHsweDAwMzAsMHgwMDM0LDB4MDAzOCwweDAwM2N9LAorICB7MHgwMDI3LDB4MDAyNywweDAyNTMsMHgwMjUzfSwgezB4MDA1YiwweDAwNWIsMHgwMDgzLDB4MDA4M30sIHsweDAwNjMsMHgwMDYzLDB4MDA5MywweDAwOTN9LCB7MHgwMDIzLDB4MDAyMywweDAyMTMsMHgwMjEzfSwKKyAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1MH0sIHsweDAwNGIsMHgwMDRiLDB4MDE2NywweDAxNjd9LCB7MHgwMTYzLDB4MDE2MywweDAwOTcsMHgwMDk3fSwgezB4MDE5NywweDAxOTcsMHgwMTI1LDB4MDA4NX0sCisgIHsweDAxODUsMHgwMTIxLDB4MDE1OSwweDAyNTV9LCB7MHgwMDU4LDB4MDA1YywweDAwNjAsMHgwMDcwfSwgezB4MDExOSwweDAyNDUsMHgwMjgxLDB4MDI5MX0sIHsweDAwNjksMHgwMGE1LDB4MDIwNSwweDAxMDl9LAorICB7MHgwMWExLDB4MDA2NCwweDAwNjgsMHgwMDZjfSwgezB4MDAyYiwweDAwMmIsMHgwMWE3LDB4MDFhN30sIHsweDAyMTcsMHgwMjE3LDB4MDE0YiwweDAxNGJ9LCB7MHgwMjk3LDB4MDI5NywweDAxNmIsMHgwMTZifSwKKyAgezB4MDA3NCwweDAwNzgsMHgwMDdjLDB4MDA4MH0sIHsweDAwYTMsMHgwMGEzLDB4MDI2MywweDAyNjN9LCB7MHgwMjg1LDB4MDEyOSwweDAwOTksMHgwMGE5fSwgezB4MDJhMSwweDAxYTksMHgwMTk5LDB4MDI2NX0sCisgIHsweDAyYTUsMHgwMDg0LDB4MDA4OCwweDAwOGN9LCB7MHgwMjIzLDB4MDIyMywweDAwOGIsMHgwMDhifSwgezB4MDIyNywweDAyMjcsMHgwMTg5LDB4MDI1OX0sIHsweDAyMTksMHgwMDkwLDB4MDA5NCwweDAwOTh9LAorICB7MHgwMmFiLDB4MDJhYiwweDAyNmIsMHgwMjZifSwgezB4MDI5YiwweDAyOWIsMHgwMjRiLDB4MDI0Yn0sIHsweDAyMGIsMHgwMjBiLDB4MDIyOSwweDAyODl9Cit9OworCitjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzRbMzhdWzRdID0KK3sKKyAgezB4MDAwNCwweDAwMDgsMHgwMDBjLDB4MDAxOH0sIHsweDAxNTUsMHgwMTUxLDB4MDExNSwweDAwNTV9LCB7MHgwMTQ1LDB4MDAwNSwweDAwMTUsMHgwMDAxfSwgezB4MDE0MSwweDAwNDUsMHgwMDEwLDB4MDAxNH0sCisgIHsweDAxMDcsMHgwMTA3LDB4MDA1MywweDAwNTN9LCB7MHgwMTAzLDB4MDEwMywweDAxMTMsMHgwMTEzfSwgezB4MDAxYywweDAwMjAsMHgwMDM0LDB4MDA0OH0sIHsweDAwNDMsMHgwMDQzLDB4MDAxMywweDAwMTN9LAorICB7MHgwMDI0LDB4MDAyOCwweDAwMmMsMHgwMDMwfSwgezB4MDE1YiwweDAxNWIsMHgwMTk3LDB4MDE5N30sIHsweDAxNjcsMHgwMTY3LDB4MDI1NywweDAyNTd9LCB7MHgwMDViLDB4MDA1YiwweDAxMWIsMHgwMTFifSwKKyAgezB4MDA2NywweDAwNjcsMHgwMTRiLDB4MDE0Yn0sIHsweDAwMzgsMHgwMDNjLDB4MDA0MCwweDAwNDR9LCB7MHgwMTkzLDB4MDE5MywweDAyNTEsMHgwMDk1fSwgezB4MDE2MSwweDAyNDUsMHgwMTI1LDB4MDIxNX0sCisgIHsweDAxODUsMHgwMDE5LDB4MDA0OSwweDAwMjV9LCB7MHgwMTA5LDB4MDIxMSwweDAwNjEsMHgwMjQxfSwgezB4MDA0YywweDAwNTAsMHgwMDU4LDB4MDA2Y30sIHsweDAwOTEsMHgwMTIxLDB4MDIwNSwweDAxODF9LAorICB7MHgwMDg1LDB4MDAwOSwweDAyMDEsMHgwMDU0fSwgezB4MDAyMywweDAwMjMsMHgwMDgzLDB4MDA4M30sIHsweDAwNWMsMHgwMDYwLDB4MDA2NCwweDAwNjh9LCB7MHgwMWE3LDB4MDFhNywweDAxNmIsMHgwMTZifSwKKyAgezB4MDE5YiwweDAxOWIsMHgwMjk3LDB4MDI5N30sIHsweDAyNjcsMHgwMjY3LDB4MDI1YiwweDAyNWJ9LCB7MHgwMGE1LDB4MDA2OSwweDAwOTksMHgwMWExfSwgezB4MDA3MCwweDAwNzQsMHgwMDc4LDB4MDA4NH0sCisgIHsweDAyOTEsMHgwMTI5LDB4MDI2MSwweDAxODl9LCB7MHgwMjg1LDB4MDFhOSwweDAyMjUsMHgwMjQ5fSwgezB4MDIxOSwweDAyYTUsMHgwMDdjLDB4MDA4MH0sIHsweDAyOWIsMHgwMjliLDB4MDI2YiwweDAyNmJ9LAorICB7MHgwMGEzLDB4MDBhMywweDAwMmIsMHgwMDJifSwgezB4MDA4OCwweDAwOGMsMHgwMDkwLDB4MDA5NH0sIHsweDAyODMsMHgwMjgzLDB4MDA4YiwweDAwOGJ9LCB7MHgwMjIzLDB4MDIyMywweDAyMGIsMHgwMjBifSwKKyAgezB4MDJhYiwweDAyYWIsMHgwMmEzLDB4MDJhM30sIHsweDAwYWIsMHgwMGFiLDB4MDIyOSwweDAyODl9Cit9OworCitjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzVbNDFdWzRdID0KK3sKKyAgezB4MDExMywweDAxMTMsMHgwMDA0LDB4MDAwOH0sIHsweDAxMGQsMHgwMTE1LDB4MDE1MSwweDAwZDF9LCB7MHgwMDBjLDB4MDAxMCwweDAwMTQsMHgwMDI4fSwgezB4MDBkNywweDAwZDcsMHgwMTRmLDB4MDE0Zn0sCisgIHsweDAwY2YsMHgwMGNmLDB4MDE1NywweDAxNTd9LCB7MHgwMDE4LDB4MDAxYywweDAwMjAsMHgwMDI0fSwgezB4MDEwYiwweDAxMGIsMHgwMTkzLDB4MDE5M30sIHsweDAxMWIsMHgwMTFiLDB4MDA5MywweDAwOTN9LAorICB7MHgwMGM5LDB4MDE1OSwweDAwOGQsMHgwMTk1fSwgezB4MDE0OSwweDAwZDksMHgwMThkLDB4MDA5NX0sIHsweDAwMmMsMHgwMDMwLDB4MDA0NCwweDAwNTh9LCB7MHgwMTA1LDB4MDExZCwweDAwNTEsMHgwMWQxfSwKKyAgezB4MDAzNCwweDAwMzgsMHgwMDNjLDB4MDA0MH0sIHsweDAwYzcsMHgwMGM3LDB4MDFkNywweDAxZDd9LCB7MHgwMTVmLDB4MDE1ZiwweDAwNGYsMHgwMDRmfSwgezB4MDE0NywweDAxNDcsMHgwMGRmLDB4MDBkZn0sCisgIHsweDAwNTcsMHgwMDU3LDB4MDFjZiwweDAxY2Z9LCB7MHgwMDQ4LDB4MDA0YywweDAwNTAsMHgwMDU0fSwgezB4MDE4YiwweDAxOGIsMHgwMTliLDB4MDE5Yn0sIHsweDAwOGIsMHgwMDhiLDB4MDA5YiwweDAwOWJ9LAorICB7MHgwMDg1LDB4MDA5ZCwweDAxYzksMHgwMDU5fSwgezB4MDE5ZCwweDAxZDksMHgwMTg1LDB4MDA0OX0sIHsweDAwNWMsMHgwMDYwLDB4MDA3NCwweDAwODh9LCB7MHgwMDExLDB4MDEwMSwweDAxNjEsMHgwMTIxfSwKKyAgezB4MDA2NCwweDAwNjgsMHgwMDZjLDB4MDA3MH0sIHsweDAwYzMsMHgwMGMzLDB4MDIxMywweDAyMTN9LCB7MHgwMGUzLDB4MDBlMywweDAwMGYsMHgwMDBmfSwgezB4MDIxNywweDAyMTcsMHgwMjBmLDB4MDIwZn0sCisgIHsweDAxNDMsMHgwMTQzLDB4MDAxNywweDAwMTd9LCB7MHgwMDc4LDB4MDA3YywweDAwODAsMHgwMDg0fSwgezB4MDA1ZiwweDAwNWYsMHgwMDQ3LDB4MDA0N30sIHsweDAxYzcsMHgwMWM3LDB4MDIwYiwweDAyMGJ9LAorICB7MHgwMDgzLDB4MDA4MywweDAxYTMsMHgwMWEzfSwgezB4MDAxYiwweDAwMWIsMHgwMjFiLDB4MDIxYn0sIHsweDAwOGMsMHgwMDkwLDB4MDA5NCwweDAwOTh9LCB7MHgwMWRmLDB4MDFkZiwweDAxODMsMHgwMTgzfSwKKyAgezB4MDAwOSwweDAwYTEsMHgwMDFkLDB4MDA0MX0sIHsweDAxYzEsMHgwMjFkLDB4MDIwNSwweDAxZTF9LCB7MHgwMDYxLDB4MDAwNSwweDAwOWMsMHgwMGEwfSwgezB4MDAyMywweDAwMjMsMHgwMjAzLDB4MDIwM30sCisgIHsweDAyMjMsMHgwMjIzLDB4MDAwMywweDAwMDN9Cit9OworCitjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzZbNDBdWzRdID0KK3sKKyAgezB4MDAwNCwweDAwMDgsMHgwMDBjLDB4MDAxY30sIHsweDAxMTEsMHgwMTE1LDB4MDBkMSwweDAxNTF9LCB7MHgwMTBkLDB4MDE1NSwweDAxNGQsMHgwMGQ1fSwgezB4MDBjZCwweDAwMTAsMHgwMDE0LDB4MDAxOH0sCisgIHsweDAwZDksMHgwMTU5LDB4MDE0OSwweDAwYzl9LCB7MHgwMTA5LDB4MDE4ZCwweDAxMTksMHgwMDk1fSwgezB4MDE5NSwweDAwOTEsMHgwMDhkLDB4MDE5MX0sIHsweDAwMjAsMHgwMDI0LDB4MDAzOCwweDAwNGN9LAorICB7MHgwMDk5LDB4MDE4OSwweDAwODksMHgwMTk5fSwgezB4MDAyOCwweDAwMmMsMHgwMDMwLDB4MDAzNH0sIHsweDAxNDcsMHgwMTQ3LDB4MDE1ZiwweDAxNWZ9LCB7MHgwMGRmLDB4MDBkZiwweDAxY2YsMHgwMWNmfSwKKyAgezB4MDBjNywweDAwYzcsMHgwMWQ3LDB4MDFkN30sIHsweDAwNTcsMHgwMDU3LDB4MDA0ZiwweDAwNGZ9LCB7MHgwMDNjLDB4MDA0MCwweDAwNDQsMHgwMDQ4fSwgezB4MDExZiwweDAxMWYsMHgwMTA3LDB4MDEwN30sCisgIHsweDAwNTMsMHgwMDUzLDB4MDFkMywweDAxZDN9LCB7MHgwMTlmLDB4MDE5ZiwweDAwODUsMHgwMWM5fSwgezB4MDFkOSwweDAwOWQsMHgwMDU5LDB4MDA0OX0sIHsweDAwNTAsMHgwMDVjLDB4MDA3MCwweDAwODR9LAorICB7MHgwMTg1LDB4MDFkZCwweDAwNTQsMHgwMDU4fSwgezB4MDA1ZiwweDAwNWYsMHgwMDQ3LDB4MDA0N30sIHsweDAxYzcsMHgwMWM3LDB4MDAxNywweDAwMTd9LCB7MHgwMDYwLDB4MDA2NCwweDAwNjgsMHgwMDZjfSwKKyAgezB4MDAwZiwweDAwMGYsMHgwMTYzLDB4MDE2M30sIHsweDAxNDMsMHgwMTQzLDB4MDBjMywweDAwYzN9LCB7MHgwMjE3LDB4MDIxNywweDAwZTMsMHgwMGUzfSwgezB4MDIwZiwweDAyMGYsMHgwMDEzLDB4MDAxM30sCisgIHsweDAwNzQsMHgwMDc4LDB4MDA3YywweDAwODB9LCB7MHgwMTgzLDB4MDE4MywweDAwODMsMHgwMDgzfSwgezB4MDIxYiwweDAyMWIsMHgwMDBiLDB4MDAwYn0sIHsweDAxMDMsMHgwMTAzLDB4MDFhMywweDAxYTN9LAorICB7MHgwMGEzLDB4MDBhMywweDAyMGIsMHgwMjBifSwgezB4MDA4OCwweDAwOGMsMHgwMDkwLDB4MDA5NH0sIHsweDAxMjMsMHgwMTIzLDB4MDAxYiwweDAwMWJ9LCB7MHgwMjEzLDB4MDIxMywweDAwMDUsMHgwMjA1fSwKKyAgezB4MDAxZCwweDAwNjEsMHgwMjFkLDB4MDFlMX0sIHsweDAxYzEsMHgwMDQxLDB4MDA5OCwweDAwOWN9LCB7MHgwMjIzLDB4MDIyMywweDAyMDMsMHgwMjAzfSwgezB4MDAwMywweDAwMDMsMHgwMDIzLDB4MDAyM30KK307CisKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfN1szMV1bNF0gPQoreworICB7MHgwMDAzLDB4MDAwMywweDAwMDQsMHgwMDA4fSwgezB4MDAwNywweDAwMDcsMHgwMDQzLDB4MDA0M30sIHsweDAwNDUsMHgwMDBjLDB4MDAxMCwweDAwMjR9LCB7MHgwMDQ5LDB4MDA4NSwweDAwMDksMHgwMDgxfSwKKyAgezB4MDAxNCwweDAwMTgsMHgwMDFjLDB4MDAyMH0sIHsweDAwNGYsMHgwMDRmLDB4MDBjNywweDAwYzd9LCB7MHgwMDhiLDB4MDA4YiwweDAwMGYsMHgwMDBmfSwgezB4MDBjMywweDAwYzMsMHgwMGM5LDB4MDA4ZH0sCisgIHsweDAxMDUsMHgwMDUxLDB4MDE0NSwweDAwNTV9LCB7MHgwMDI4LDB4MDAyYywweDAwNDAsMHgwMDU0fSwgezB4MDBjZCwweDAxMDksMHgwMTAxLDB4MDAxMX0sIHsweDAwMzAsMHgwMDM0LDB4MDAzOCwweDAwM2N9LAorICB7MHgwMDkzLDB4MDA5MywweDAxNGIsMHgwMTRifSwgezB4MDA5NywweDAwOTcsMHgwMTQzLDB4MDE0M30sIHsweDAwNWIsMHgwMDViLDB4MDAxNywweDAwMTd9LCB7MHgwMTg3LDB4MDE4NywweDAwZDMsMHgwMGQzfSwKKyAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1MH0sIHsweDAxNGYsMHgwMTRmLDB4MDEwZiwweDAxMGZ9LCB7MHgwMGQ3LDB4MDBkNywweDAxOGIsMHgwMThifSwgezB4MDA5YiwweDAwOWIsMHgwMWM3LDB4MDFjN30sCisgIHsweDAxOGQsMHgwMTgxLDB4MDAxOSwweDAxMTF9LCB7MHgwMDU4LDB4MDA1YywweDAwNjAsMHgwMDY4fSwgezB4MDA1ZCwweDAxNTEsMHgwMDlkLDB4MDExNX0sIHsweDAwZDksMHgwMWM5LDB4MDBkZCwweDAxMTl9LAorICB7MHgwMTU1LDB4MDE5MSwweDAxY2QsMHgwMDY0fSwgezB4MDAxZiwweDAwMWYsMHgwMWMzLDB4MDFjM30sIHsweDAwNmMsMHgwMDcwLDB4MDA3NCwweDAwNzh9LCB7MHgwMTViLDB4MDE1YiwweDAxOTcsMHgwMTk3fSwKKyAgezB4MDExZiwweDAxMWYsMHgwMWQzLDB4MDFkM30sIHsweDAxZDcsMHgwMWQ3LDB4MDE1ZiwweDAxNWZ9LCB7MHgwMTlkLDB4MDE5OSwweDAxZDksMHgwMWRkfQorfTsKKworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va184WzMxXVs0XSA9Cit7CisgIHsweDAwMDQsMHgwMDA4LDB4MDAxMCwweDAwMjR9LCB7MHgwMDQ3LDB4MDA0NywweDAwNDksMHgwMDA1fSwgezB4MDA4NSwweDAwNDEsMHgwMDg5LDB4MDAwY30sIHsweDAwMDMsMHgwMDAzLDB4MDAwYiwweDAwMGJ9LAorICB7MHgwMDE0LDB4MDAxOCwweDAwMWMsMHgwMDIwfSwgezB4MDA4MywweDAwODMsMHgwMDRmLDB4MDA0Zn0sIHsweDAwYzcsMHgwMGM3LDB4MDA4ZiwweDAwOGZ9LCB7MHgwMGNiLDB4MDBjYiwweDAwY2QsMHgwMDUxfSwKKyAgezB4MDEwNSwweDAwOTEsMHgwMTA5LDB4MDAwZH0sIHsweDAwMjgsMHgwMDJjLDB4MDA0MCwweDAwNTR9LCB7MHgwMGMxLDB4MDBkMSwweDAxMGQsMHgwMDk1fSwgezB4MDAzMCwweDAwMzQsMHgwMDM4LDB4MDAzY30sCisgIHsweDAwNTcsMHgwMDU3LDB4MDE0YiwweDAxNGJ9LCB7MHgwMTQ3LDB4MDE0NywweDAwZDcsMHgwMGQ3fSwgezB4MDE0ZiwweDAxNGYsMHgwMTEzLDB4MDExM30sIHsweDAxMTcsMHgwMTE3LDB4MDEwMywweDAxMDN9LAorICB7MHgwMDQ0LDB4MDA0OCwweDAwNGMsMHgwMDUwfSwgezB4MDE1MywweDAxNTMsMHgwMDEzLDB4MDAxM30sIHsweDAxOGIsMHgwMThiLDB4MDA5YiwweDAwOWJ9LCB7MHgwMDViLDB4MDA1YiwweDAxODcsMHgwMTg3fSwKKyAgezB4MDE4ZCwweDAwZDksMHgwMTU1LDB4MDAxNX0sIHsweDAwNTgsMHgwMDVjLDB4MDA2MCwweDAwNjh9LCB7MHgwMTE5LDB4MDE0MSwweDAxOTEsMHgwMDVkfSwgezB4MDA5ZCwweDAxYzksMHgwMTU5LDB4MDBkZH0sCisgIHsweDAxYzUsMHgwMTk1LDB4MDFjZCwweDAwNjR9LCB7MHgwMTliLDB4MDE5YiwweDAxMWYsMHgwMTFmfSwgezB4MDA2YywweDAwNzAsMHgwMDc0LDB4MDA3OH0sIHsweDAwMWIsMHgwMDFiLDB4MDFkMywweDAxZDN9LAorICB7MHgwMTgzLDB4MDE4MywweDAxNWYsMHgwMTVmfSwgezB4MDE5ZiwweDAxOWYsMHgwMWRiLDB4MDFkYn0sIHsweDAxZDUsMHgwMDFkLDB4MDFjMSwweDAxZGR9Cit9OworCitjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzlbODRdWzRdID0KK3sKKyAgezB4MDAwMywweDAwMDMsMHgwMDA0LDB4MDAwOH0sIHsweDAwMDcsMHgwMDA3LDB4MDA0MywweDAwNDN9LCB7MHgwMDQ1LDB4MDAwYywweDAwMTAsMHgwMDJjfSwgezB4MDA0OSwweDAwODUsMHgwMDA5LDB4MDA4MX0sCisgIHsweDAwMTQsMHgwMDE4LDB4MDAxYywweDAwMjB9LCB7MHgwMDRmLDB4MDA0ZiwweDAwOGIsMHgwMDhifSwgezB4MDBjNywweDAwYzcsMHgwMDBkLDB4MDBjMX0sIHsweDAwYzksMHgwMDhkLDB4MDEwNSwweDAwNTF9LAorICB7MHgwMTA5LDB4MDE0NSwweDAwMjQsMHgwMDI4fSwgezB4MDA5MywweDAwOTMsMHgwMGNmLDB4MDBjZn0sIHsweDAxMDMsMHgwMTAzLDB4MDAxMywweDAwMTN9LCB7MHgwMDMwLDB4MDA0NCwweDAwNTgsMHgwMGE0fSwKKyAgezB4MDAzNCwweDAwMzgsMHgwMDNjLDB4MDA0MH0sIHsweDAwNTcsMHgwMDU3LDB4MDE0YiwweDAxNGJ9LCB7MHgwMTg3LDB4MDE4NywweDAxMGYsMHgwMTBmfSwgezB4MDA5NywweDAwOTcsMHgwMDViLDB4MDA1Yn0sCisgIHsweDAwZDMsMHgwMGQzLDB4MDE0MSwweDAxODl9LCB7MHgwMDQ4LDB4MDA0YywweDAwNTAsMHgwMDU0fSwgezB4MDAxNSwweDAxYzUsMHgwMTRkLDB4MDIwNX0sIHsweDAwNjEsMHgwMTExLDB4MDBkNSwweDAwOTl9LAorICB7MHgwMDVkLDB4MDE4MSwweDAwYTEsMHgwMjA5fSwgezB4MDE4ZCwweDAxYzksMHgwMTUxLDB4MDA2NX0sIHsweDAwNWMsMHgwMDY4LDB4MDA3YywweDAwOTB9LCB7MHgwMjQ1LDB4MDA5ZCwweDAwNjAsMHgwMDY0fSwKKyAgezB4MDAxYiwweDAwMWIsMHgwMTE3LDB4MDExN30sIHsweDAwZGIsMHgwMGRiLDB4MDBlMywweDAwZTN9LCB7MHgwMDZjLDB4MDA3MCwweDAwNzQsMHgwMDc4fSwgezB4MDFjMywweDAxYzMsMHgwMGE3LDB4MDBhN30sCisgIHsweDAyMGYsMHgwMjBmLDB4MDE5MywweDAxOTN9LCB7MHgwMWNmLDB4MDFjZiwweDAyMDMsMHgwMjAzfSwgezB4MDA2YiwweDAwNmIsMHgwMTFiLDB4MDExYn0sIHsweDAwODAsMHgwMDg0LDB4MDA4OCwweDAwOGN9LAorICB7MHgwMjRiLDB4MDI0YiwweDAxNTcsMHgwMTU3fSwgezB4MDAyMywweDAwMjMsMHgwMDFmLDB4MDAxZn0sIHsweDAwZGYsMHgwMGRmLDB4MDBhYiwweDAwYWJ9LCB7MHgwMGU3LDB4MDBlNywweDAxMjMsMHgwMTIzfSwKKyAgezB4MDA5NCwweDAwOTgsMHgwMDljLDB4MDBhMH0sIHsweDAyODcsMHgwMjg3LDB4MDExZiwweDAxMWZ9LCB7MHgwMTViLDB4MDE1YiwweDAxOTcsMHgwMTk3fSwgezB4MDIxMywweDAyMTMsMHgwMWQzLDB4MDFkM30sCisgIHsweDAyNGYsMHgwMjRmLDB4MDA2ZiwweDAwNmZ9LCB7MHgwMGE4LDB4MDBiYywweDAwZDAsMHgwMGY0fSwgezB4MDBhYywweDAwYjAsMHgwMGI0LDB4MDBiOH0sIHsweDAyMTcsMHgwMjE3LDB4MDAyNywweDAwMjd9LAorICB7MHgwMTYzLDB4MDE2MywweDAwZTksMHgwMjg5fSwgezB4MDI0MSwweDAwYWQsMHgwMTI1LDB4MDE5OX0sIHsweDAwNzEsMHgwMjUxLDB4MDFhMSwweDAyYzV9LCB7MHgwMGMwLDB4MDBjNCwweDAwYzgsMHgwMGNjfSwKKyAgezB4MDE2NSwweDAxMjksMHgwMWQ1LDB4MDE1ZH0sIHsweDAyYzksMHgwMzA1LDB4MDBiMSwweDAwZWR9LCB7MHgwMjhkLDB4MDI1NSwweDAxZDksMHgwMWUxfSwgezB4MDEyZCwweDAyODEsMHgwMTlkLDB4MDBmMX0sCisgIHsweDAwZDQsMHgwMGQ4LDB4MDBkYywweDAwZTB9LCB7MHgwMDI5LDB4MDE2OSwweDAyOTEsMHgwMjE5fSwgezB4MDMwOSwweDAxYTUsMHgwMWU1LDB4MDJkMX0sIHsweDAwMmQsMHgwMjU5LDB4MDJjZCwweDAyOTV9LAorICB7MHgwMGU0LDB4MDBlOCwweDAwZWMsMHgwMGYwfSwgezB4MDIyMywweDAyMjMsMHgwMjFmLDB4MDIxZn0sIHsweDAxNzMsMHgwMTczLDB4MDMwZiwweDAzMGZ9LCB7MHgwMTZmLDB4MDE2ZiwweDAxZGYsMHgwMWRmfSwKKyAgezB4MDEzMywweDAxMzMsMHgwMWFmLDB4MDFhZn0sIHsweDAwZjgsMHgwMTBjLDB4MDEyMCwweDAxMzR9LCB7MHgwMGZjLDB4MDEwMCwweDAxMDQsMHgwMTA4fSwgezB4MDFhYiwweDAxYWIsMHgwMzEzLDB4MDMxM30sCisgIHsweDAyNWYsMHgwMjVmLDB4MDJkNywweDAyZDd9LCB7MHgwMmMzLDB4MDJjMywweDAxYjMsMHgwMWIzfSwgezB4MDI5YiwweDAyOWIsMHgwMDMzLDB4MDAzM30sIHsweDAxMTAsMHgwMTE0LDB4MDExOCwweDAxMWN9LAorICB7MHgwMWViLDB4MDFlYiwweDAzMTcsMHgwMzE3fSwgezB4MDI5ZiwweDAyOWYsMHgwMjI3LDB4MDIyN30sIHsweDAzMDMsMHgwMzAzLDB4MDFlZiwweDAxZWZ9LCB7MHgwMjYzLDB4MDI2MywweDAyNjcsMHgwMjY3fSwKKyAgezB4MDEyNCwweDAxMjgsMHgwMTJjLDB4MDEzMH0sIHsweDAyMmIsMHgwMjJiLDB4MDJkZiwweDAyZGZ9LCB7MHgwMWYzLDB4MDFmMywweDAyZGIsMHgwMmRifSwgezB4MDJlMywweDAyZTMsMHgwMjJmLDB4MDIyZn0sCisgIHsweDAzMWYsMHgwMzFmLDB4MDMxYiwweDAzMWJ9LCB7MHgwMTM4LDB4MDEzYywweDAxNDAsMHgwMTQ0fSwgezB4MDJhMSwweDAyNjksMHgwMzIxLDB4MDJhNX0sIHsweDAyZTUsMHgwMzI1LDB4MDJlOSwweDAyNzF9LAorICB7MHgwMmE5LDB4MDI2ZCwweDAyMzEsMHgwMmFkfSwgezB4MDJiMSwweDAyZjEsMHgwMTQ4LDB4MDE0Y30sIHsweDAzMmIsMHgwMzJiLDB4MDJlZiwweDAyZWZ9LCB7MHgwMzJmLDB4MDMyZiwweDAzMzMsMHgwMzMzfQorfTsKKworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xMFs4Ml1bNF0gPQoreworICB7MHgwMDA0LDB4MDAwYywweDAwMjAsMHgwMDRjfSwgezB4MDA0NSwweDAwODUsMHgwMDQ5LDB4MDAwOH0sIHsweDAwOGIsMHgwMDhiLDB4MDAwNywweDAwMDd9LCB7MHgwMDEwLDB4MDAxNCwweDAwMTgsMHgwMDFjfSwKKyAgezB4MDA0MywweDAwNDMsMHgwMGM3LDB4MDBjN30sIHsweDAwOGYsMHgwMDhmLDB4MDA0ZiwweDAwNGZ9LCB7MHgwMGNiLDB4MDBjYiwweDAwY2YsMHgwMGNmfSwgezB4MDAwOSwweDAwODEsMHgwMTA5LDB4MDA5MX0sCisgIHsweDAwMjQsMHgwMDI4LDB4MDAyYywweDAwMzh9LCB7MHgwMTA1LDB4MDA1MSwweDAwMDEsMHgwMGQxfSwgezB4MDEwZCwweDAwMGQsMHgwMGMxLDB4MDExMX0sIHsweDAxNDksMHgwMDk1LDB4MDAzMCwweDAwMzR9LAorICB7MHgwMTQ3LDB4MDE0NywweDAwNTcsMHgwMDU3fSwgezB4MDBkNywweDAwZDcsMHgwMTRmLDB4MDE0Zn0sIHsweDAwM2MsMHgwMDQwLDB4MDA0NCwweDAwNDh9LCB7MHgwMTE3LDB4MDExNywweDAxNTMsMHgwMTUzfSwKKyAgezB4MDA5YiwweDAwOWIsMHgwMThiLDB4MDE4Yn0sIHsweDAwZGIsMHgwMGRiLDB4MDAxMywweDAwMTN9LCB7MHgwMDViLDB4MDA1YiwweDAxMDMsMHgwMTAzfSwgezB4MDA1MCwweDAwNjQsMHgwMDc4LDB4MDBjMH0sCisgIHsweDAwNTQsMHgwMDU4LDB4MDA1YywweDAwNjB9LCB7MHgwMTg3LDB4MDE4NywweDAxOGYsMHgwMThmfSwgezB4MDE1NywweDAxNTcsMHgwMTFiLDB4MDExYn0sIHsweDAxOTMsMHgwMTkzLDB4MDE1OSwweDAwOWR9LAorICB7MHgwMWNkLDB4MDFjOSwweDAxOTUsMHgwMGExfSwgezB4MDA2OCwweDAwNmMsMHgwMDcwLDB4MDA3NH0sIHsweDAwZGQsMHgwMDE1LDB4MDA1ZCwweDAxNDF9LCB7MHgwMDYxLDB4MDFjNSwweDAwZTEsMHgwMTFkfSwKKyAgezB4MDFkMSwweDAyMDksMHgwMTk5LDB4MDE1ZH0sIHsweDAyMDUsMHgwMjBkLDB4MDEyMSwweDAyMTF9LCB7MHgwMDdjLDB4MDA4NCwweDAwOTgsMHgwMGFjfSwgezB4MDFkNSwweDAxNjEsMHgwMjE1LDB4MDA4MH0sCisgIHsweDAxOWYsMHgwMTlmLDB4MDFkYiwweDAxZGJ9LCB7MHgwMDg4LDB4MDA4YywweDAwOTAsMHgwMDk0fSwgezB4MDBhNywweDAwYTcsMHgwMDFiLDB4MDAxYn0sIHsweDAyMWIsMHgwMjFiLDB4MDBlNywweDAwZTd9LAorICB7MHgwMjRmLDB4MDI0ZiwweDAwNjcsMHgwMDY3fSwgezB4MDI0YiwweDAyNGIsMHgwMTgzLDB4MDE4M30sIHsweDAwOWMsMHgwMGEwLDB4MDBhNCwweDAwYTh9LCB7MHgwMWEzLDB4MDFhMywweDAxMjcsMHgwMTI3fSwKKyAgezB4MDI1MywweDAyNTMsMHgwMGFiLDB4MDBhYn0sIHsweDAyNDcsMHgwMjQ3LDB4MDFkZiwweDAxZGZ9LCB7MHgwMWUzLDB4MDFlMywweDAxNjcsMHgwMTY3fSwgezB4MDBiMCwweDAwYjQsMHgwMGI4LDB4MDBiY30sCisgIHsweDAyMWYsMHgwMjFmLDB4MDBlYiwweDAwZWJ9LCB7MHgwMjU3LDB4MDI1NywweDAxMmIsMHgwMTJifSwgezB4MDI4YiwweDAyOGIsMHgwMDZiLDB4MDA2Yn0sIHsweDAyOGYsMHgwMjhmLDB4MDFhNywweDAxYTd9LAorICB7MHgwMGM0LDB4MDBkOCwweDAwZWMsMHgwMTAwfSwgezB4MDBjOCwweDAwY2MsMHgwMGQwLDB4MDBkNH0sIHsweDAyNWIsMHgwMjViLDB4MDAyMywweDAwMjN9LCB7MHgwMjkzLDB4MDI5MywweDAwMWYsMHgwMDFmfSwKKyAgezB4MDBhZiwweDAwYWYsMHgwMjVkLDB4MDBlZH0sIHsweDAxYTksMHgwMjg1LDB4MDA2ZCwweDAxZTV9LCB7MHgwMGRjLDB4MDBlMCwweDAwZTQsMHgwMGU4fSwgezB4MDFjMSwweDAyMjEsMHgwMTY5LDB4MDJjZH0sCisgIHsweDAyOTUsMHgwMjYxLDB4MDE2ZCwweDAyMDF9LCB7MHgwMTJkLDB4MDJjOSwweDAyOWQsMHgwMjk5fSwgezB4MDFlOSwweDAyZDEsMHgwMmM1LDB4MDBiMX0sIHsweDAwZjAsMHgwMGY0LDB4MDBmOCwweDAwZmN9LAorICB7MHgwMjI1LDB4MDBmMSwweDAxYWQsMHgwMmQ1fSwgezB4MDEzMSwweDAxZWQsMHgwMTcxLDB4MDMwZH0sIHsweDAyZDksMHgwMDI1LDB4MDIyOSwweDAwMjl9LCB7MHgwMDcxLDB4MDI0MSwweDAzMTEsMHgwMjY1fSwKKyAgezB4MDEwNCwweDAxMGMsMHgwMTIwLDB4MDEzNH0sIHsweDAxYjEsMHgwMzA5LDB4MDJhMSwweDAxMDh9LCB7MHgwMmE3LDB4MDJhNywweDAzMDcsMHgwMzA3fSwgezB4MDExMCwweDAxMTQsMHgwMTE4LDB4MDExY30sCisgIHsweDAyMmYsMHgwMjJmLDB4MDFmMywweDAxZjN9LCB7MHgwMmRmLDB4MDJkZiwweDAzMTcsMHgwMzE3fSwgezB4MDMxYiwweDAzMWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyZTMsMHgwMmUzLDB4MDIzMywweDAyMzN9LAorICB7MHgwMTI0LDB4MDEyOCwweDAxMmMsMHgwMTMwfSwgezB4MDI4MywweDAyODMsMHgwMzFmLDB4MDMxZn0sIHsweDAwMmYsMHgwMDJmLDB4MDJhYiwweDAyYWJ9LCB7MHgwMjZmLDB4MDI2ZiwweDAyYWYsMHgwMmFmfSwKKyAgezB4MDJjMywweDAyYzMsMHgwMmVmLDB4MDJlZn0sIHsweDAxMzgsMHgwMTNjLDB4MDE0MCwweDAxNDR9LCB7MHgwMmU3LDB4MDJlNywweDAyZWIsMHgwMmVifSwgezB4MDAzMywweDAwMzMsMHgwMzIzLDB4MDMyM30sCisgIHsweDAyNzEsMHgwMzI5LDB4MDMyNSwweDAzMmR9LCB7MHgwMmYxLDB4MDMwMSwweDAyYjEsMHgwMzMxfQorfTsKKworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xMVsxNTJdWzRdID0KK3sKKyAgezB4MDAwNCwweDAwMTAsMHgwMDM4LDB4MDA4Y30sIHsweDAwMDEsMHgwMDg1LDB4MDAwOCwweDAwMGN9LCB7MHgwODQzLDB4MDg0MywweDAwMDcsMHgwMDA3fSwgezB4MDA4MywweDAwODMsMHgwMDhiLDB4MDA4Yn0sCisgIHsweDAwMTQsMHgwMDE4LDB4MDAxYywweDAwMjR9LCB7MHgwMTA3LDB4MDEwNywweDAxMGIsMHgwMTBifSwgezB4MDE4NSwweDAwOGQsMHgwMTBkLDB4MDAwOX0sIHsweDAxODksMHgwMTAxLDB4MDE4ZCwweDAwMjB9LAorICB7MHgwMDkzLDB4MDA5MywweDAyMDcsMHgwMjA3fSwgezB4MDAyOCwweDAwMmMsMHgwMDMwLDB4MDAzNH0sIHsweDAxMTMsMHgwMTEzLDB4MDIwYiwweDAyMGJ9LCB7MHgwMTkzLDB4MDE5MywweDAyMGYsMHgwMjBmfSwKKyAgezB4MDAwZiwweDAwMGYsMHgwMTgzLDB4MDE4M30sIHsweDAwOTcsMHgwMDk3LDB4MDExNywweDAxMTd9LCB7MHgwMDNjLDB4MDA1MCwweDAwNjQsMHgwMDc4fSwgezB4MDA0MCwweDAwNDQsMHgwMDQ4LDB4MDA0Y30sCisgIHsweDAyOGIsMHgwMjhiLDB4MDIxMywweDAyMTN9LCB7MHgwMjg3LDB4MDI4NywweDAxOTcsMHgwMTk3fSwgezB4MDI4ZiwweDAyOGYsMHgwMjE3LDB4MDIxN30sIHsweDAyOTEsMHgwMTE5LDB4MDMwOSwweDAwOTl9LAorICB7MHgwMDU0LDB4MDA1OCwweDAwNWMsMHgwMDYwfSwgezB4MDE5OSwweDAzMGQsMHgwMzA1LDB4MDgxMX0sIHsweDA4MGQsMHgwMmMxLDB4MDFjMSwweDAyNDF9LCB7MHgwMjE5LDB4MDM0MSwweDAwMTEsMHgwMzExfSwKKyAgezB4MDIwMSwweDA4MDksMHgwMjk1LDB4MDgxNX0sIHsweDAwNjgsMHgwMDZjLDB4MDA3MCwweDAwNzR9LCB7MHgwM2MxLDB4MDE0MSwweDA0NDEsMHgwMzg5fSwgezB4MDExZCwweDAzOGQsMHgwMjk5LDB4MDMxNX0sCisgIHsweDA4MTksMHgwNTQxLDB4MDE5ZCwweDAwOWR9LCB7MHgwNGMxLDB4MDgxZCwweDA4MDUsMHgwMzg1fSwgezB4MDA3YywweDAwODAsMHgwMDg0LDB4MDA4OH0sIHsweDAzOTEsMHgwNWMxLDB4MDIxZCwweDA2NDF9LAorICB7MHgwODIxLDB4MDBjMSwweDAzMTksMHgwODI1fSwgezB4MDQwOSwweDAzOTUsMHgwODI5LDB4MDZjMX0sIHsweDAxYTEsMHgwMTIxLDB4MDQwZCwweDAwMTV9LCB7MHgwMDkwLDB4MDBjOCwweDAxMWMsMHgwMTcwfSwKKyAgezB4MDA5NCwweDAwOTgsMHgwMGEwLDB4MDBiNH0sIHsweDA3NDEsMHgwODJkLDB4MDI5ZCwweDA0MTF9LCB7MHgwMzk5LDB4MDMxZCwweDAyODEsMHgwMDljfSwgezB4MDIyMywweDAyMjMsMHgwN2MzLDB4MDdjM30sCisgIHsweDAwYTQsMHgwMGE4LDB4MDBhYywweDAwYjB9LCB7MHgwODMzLDB4MDgzMywweDA0MDcsMHgwNDA3fSwgezB4MDBhMywweDAwYTMsMHgwODNiLDB4MDgzYn0sIHsweDA0MTcsMHgwNDE3LDB4MDgzNywweDA4Mzd9LAorICB7MHgwNDhmLDB4MDQ4ZiwweDAyYTMsMHgwMmEzfSwgezB4MDBiOCwweDAwYmMsMHgwMGMwLDB4MDBjNH0sIHsweDAzOWYsMHgwMzlmLDB4MDQ4YiwweDA0OGJ9LCB7MHgwMzIzLDB4MDMyMywweDAxMjcsMHgwMTI3fSwKKyAgezB4MDFhNywweDAxYTcsMHgwODNmLDB4MDgzZn0sIHsweDA0OTMsMHgwNDkzLDB4MDQxYiwweDA0MWJ9LCB7MHgwMGNjLDB4MDBlMCwweDAwZjQsMHgwMTA4fSwgezB4MDBkMCwweDAwZDQsMHgwMGQ4LDB4MDBkY30sCisgIHsweDAwMWIsMHgwMDFiLDB4MDIyNywweDAyMjd9LCB7MHgwNDk3LDB4MDQ5NywweDAzYTMsMHgwM2EzfSwgezB4MDQxZiwweDA0MWYsMHgwNDg3LDB4MDQ4N30sIHsweDAxYWIsMHgwMWFiLDB4MDMwMywweDAzMDN9LAorICB7MHgwMGU0LDB4MDBlOCwweDAwZWMsMHgwMGYwfSwgezB4MDEyYiwweDAxMmIsMHgwMGE3LDB4MDBhN30sIHsweDAyYTcsMHgwMmE3LDB4MDUxMywweDA1MTN9LCB7MHgwNTBiLDB4MDUwYiwweDAzMjcsMHgwMzI3fSwKKyAgezB4MDUwZiwweDA1MGYsMHgwNDliLDB4MDQ5Yn0sIHsweDAwZjgsMHgwMGZjLDB4MDEwMCwweDAxMDR9LCB7MHgwMjJiLDB4MDIyYiwweDA0MjMsMHgwNDIzfSwgezB4MDJhYiwweDAyYWIsMHgwM2E3LDB4MDNhN30sCisgIHsweDAxYWYsMHgwMWFmLDB4MDUwNywweDA1MDd9LCB7MHgwMDFmLDB4MDAxZiwweDAzMmIsMHgwMzJifSwgezB4MDEwYywweDAxMTAsMHgwMTE0LDB4MDExOH0sIHsweDA0OWYsMHgwNDlmLDB4MDU4ZiwweDA1OGZ9LAorICB7MHgwNTE3LDB4MDUxNywweDAwYWIsMHgwMGFifSwgezB4MDU5MywweDA1OTMsMHgwMTJmLDB4MDEyZn0sIHsweDAxMzcsMHgwMTM3LDB4MDUxYiwweDA1MWJ9LCB7MHgwMTIwLDB4MDEzNCwweDAxNDgsMHgwMTVjfSwKKyAgezB4MDEyNCwweDAxMjgsMHgwMTJjLDB4MDEzMH0sIHsweDAxYjcsMHgwMWI3LDB4MDU4YiwweDA1OGJ9LCB7MHgwMDQzLDB4MDA0MywweDA1OTcsMHgwNTk3fSwgezB4MDJhZiwweDAyYWYsMHgwMjJkLDB4MDQyNX0sCisgIHsweDA1MWQsMHgwNGExLDB4MDgwMSwweDA2OTF9LCB7MHgwMTM4LDB4MDEzYywweDAxNDAsMHgwMTQ0fSwgezB4MDM4MSwweDA2OGQsMHgwMzJkLDB4MDBiNX0sIHsweDAyMzUsMHgwMWIxLDB4MDY4OSwweDAyYjV9LAorICB7MHgwNTIxLDB4MDU5OSwweDA0MjksMHgwM2E5fSwgezB4MDEzOSwweDAyMzEsMHgwNTg1LDB4MDYxMX0sIHsweDAxNGMsMHgwMTUwLDB4MDE1NCwweDAxNTh9LCB7MHgwMGFkLDB4MDYwZCwweDA2ODUsMHgwMTMxfSwKKyAgezB4MDU5ZCwweDA3MGQsMHgwNjE1LDB4MDY5NX0sIHsweDAyMzksMHgwNzExLDB4MDNhZCwweDAxYjl9LCB7MHgwMmIxLDB4MDMzNSwweDAzMzEsMHgwMDIxfSwgezB4MDE2MCwweDAxNjQsMHgwMTY4LDB4MDE2Y30sCisgIHsweDA0MmQsMHgwNjA5LDB4MDRhNSwweDAyYjl9LCB7MHgwNjk5LDB4MDUyOSwweDAxM2QsMHgwNWExfSwgezB4MDUyNSwweDAzMzksMHgwNGE5LDB4MDcxNX0sIHsweDA0YWQsMHgwMGI5LDB4MDcwOSwweDA2MTl9LAorICB7MHgwMTc0LDB4MDE4OCwweDAxOWMsMHgwMWNjfSwgezB4MDE3OCwweDAxN2MsMHgwMTgwLDB4MDE4NH0sIHsweDA2MDUsMHgwNDM1LDB4MDQwMSwweDAzYjV9LCB7MHgwNjFkLDB4MDNiMSwweDA2OWQsMHgwMWJkfSwKKyAgezB4MDBiMSwweDA3MTksMHgwNzg5LDB4MDJiZH0sIHsweDAyM2QsMHgwNzA1LDB4MDVhNSwweDA3OTF9LCB7MHgwMThjLDB4MDE5MCwweDAxOTQsMHgwMTk4fSwgezB4MDNiOSwweDA2YTEsMHgwNGI1LDB4MDYyMX0sCisgIHsweDA3OTUsMHgwNzhkLDB4MDVhOSwweDA1MmR9LCB7MHgwNDMxLDB4MDMzZCwweDAzYmQsMHgwNzIxfSwgezB4MDBiZCwweDA3MWQsMHgwMDI1LDB4MDQ4MX0sIHsweDAxYTAsMHgwMWE0LDB4MDFhOCwweDAxYjh9LAorICB7MHgwNmE1LDB4MDYyNSwweDA0YjEsMHgwNDM5fSwgezB4MDZhOSwweDA0YjksMHgwNTMxLDB4MDc5OX0sIHsweDA3OWQsMHgwMWFjLDB4MDFiMCwweDAxYjR9LCB7MHgwNzI3LDB4MDcyNywweDA0M2YsMHgwNDNmfSwKKyAgezB4MDVhZiwweDA1YWYsMHgwNzJmLDB4MDcyZn0sIHsweDA3ODcsMHgwNzg3LDB4MDYyYiwweDA2MmJ9LCB7MHgwMWJjLDB4MDFjMCwweDAxYzQsMHgwMWM4fSwgezB4MDcyYiwweDA3MmIsMHgwNWI3LDB4MDViN30sCisgIHsweDA1MzcsMHgwNTM3LDB4MDZhZiwweDA2YWZ9LCB7MHgwNjJmLDB4MDYyZiwweDA3YTMsMHgwN2EzfSwgezB4MDViYiwweDA1YmIsMHgwNjM3LDB4MDYzN30sIHsweDAxZDAsMHgwMWU0LDB4MDFmOCwweDAyMGN9LAorICB7MHgwMWQ0LDB4MDFkOCwweDAxZGMsMHgwMWUwfSwgezB4MDZiMywweDA2YjMsMHgwNGJmLDB4MDRiZn0sIHsweDA1M2IsMHgwNTNiLDB4MDAyYiwweDAwMmJ9LCB7MHgwNWIzLDB4MDViMywweDA3YTcsMHgwN2E3fSwKKyAgezB4MDUwMywweDA1MDMsMHgwNjMzLDB4MDYzM30sIHsweDAxZTgsMHgwMWVjLDB4MDFmMCwweDAxZjR9LCB7MHgwMDJmLDB4MDAyZiwweDA3MzMsMHgwNzMzfSwgezB4MDdhYiwweDA3YWIsMHgwNmI3LDB4MDZiN30sCisgIHsweDA2ODMsMHgwNjgzLDB4MDYzYiwweDA2M2J9LCB7MHgwNTNmLDB4MDUzZiwweDA1YmYsMHgwNWJmfSwgezB4MDFmYywweDAyMDAsMHgwMjA0LDB4MDIwOH0sIHsweDA3YWYsMHgwN2FmLDB4MDZiYiwweDA2YmJ9LAorICB7MHgwMDM3LDB4MDAzNywweDA1ODMsMHgwNTgzfSwgezB4MDczNywweDA3MzcsMHgwNjNmLDB4MDYzZn0sIHsweDA2YmYsMHgwNmJmLDB4MDdiMywweDA3YjN9LCB7MHgwMjEwLDB4MDIxNCwweDAyMTgsMHgwMjFjfSwKKyAgezB4MDAzYiwweDAwM2IsMHgwNzNiLDB4MDczYn0sIHsweDA3YjcsMHgwN2I3LDB4MDAzMywweDAwMzN9LCB7MHgwN2JiLDB4MDdiYiwweDA3MDEsMHgwNjAxfSwgezB4MDczZCwweDAwM2QsMHgwNzgxLDB4MDdiZH0sCisgIHsweDAxMTgsMHgwMTE3LDB4MDEwMCwweDAxMDl9LCB7MHgwNWE1LDB4MDVhMSwweDA1YjcsMHgwNTEzfSwgezB4MDhmOSwweDA4ZmYsMHgwODIxLDB4MDhmZn0sIHsweDA4NGYsMHgwOGZmLDB4MDhiYywweDA4ZmZ9LAorICB7MHgwODE1LDB4MDhmZiwweDA4MzcsMHgwOGZmfSwgezB4MDgwZCwweDA4ZmYsMHgwODVmLDB4MDhmZn0sIHsweDA4NGEsMHgwOGZmLDB4MDg3ZCwweDA4ZmZ9LCB7MHgwOGZmLDB4MDhmZiwweDA4YTgsMHgwOGZmfSwKKyAgezB4MDgxNSwweDA4ZmYsMHgwODNmLDB4MDhmZn0sIHsweDA4MzAsMHgwOGZmLDB4MDg5NCwweDA4ZmZ9LCB7MHgwOGQ0LDB4MDhmZiwweDA4MjUsMHgwOGZmfSwgezB4MDhlZiwweDA4ZmYsMHgwODNmLDB4MDhmZn0sCisgIHsweDA4MDksMHgwOGZmLDB4MDhmYywweDA4ZmZ9LCB7MHgwODQyLDB4MDhmZiwweDA4YjMsMHgwOGZmfSwgezB4MDcwZCwweDA3YTksMHgwNjBlLDB4MDZlMn0sIHsweDA2YzcsMHgwNmQwLDB4MDRiMiwweDA0MDd9Cit9OworCisKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfU0NMWzY1XVs0XSA9Cit7CisgIHsweDAwZjMsMHgwMGYzLDB4MDAwNCwweDAwMDh9LCB7MHgwMGVmLDB4MDBlZiwweDAwZjUsMHgwMGU5fSwgezB4MDBmOSwweDAwMGMsMHgwMDEwLDB4MDAxNH0sIHsweDAwZTcsMHgwMGU3LDB4MDBmZiwweDAwZmZ9LAorICB7MHgwMGUxLDB4MDEwMSwweDAwZGQsMHgwMTA1fSwgezB4MDAxOCwweDAwMWMsMHgwMDIwLDB4MDAyOH0sIHsweDAxMGIsMHgwMTBiLDB4MDBkYiwweDAwZGJ9LCB7MHgwMTBmLDB4MDEwZiwweDAwZDUsMHgwMTExfSwKKyAgezB4MDBkMSwweDAxMTUsMHgwMGNkLDB4MDAyNH0sIHsweDAxMWIsMHgwMTFiLDB4MDBjYiwweDAwY2J9LCB7MHgwMDJjLDB4MDAzMCwweDAwMzQsMHgwMDQwfSwgezB4MDBjNywweDAwYzcsMHgwMTFmLDB4MDExZn0sCisgIHsweDAxMjEsMHgwMGMxLDB4MDEyNSwweDAwYmR9LCB7MHgwMTI5LDB4MDBiOSwweDAwMzgsMHgwMDNjfSwgezB4MDEzMywweDAxMzMsMHgwMTJmLDB4MDEyZn0sIHsweDAxMzcsMHgwMTM3LDB4MDEzYiwweDAxM2J9LAorICB7MHgwMDQ0LDB4MDA0OCwweDAwNGMsMHgwMDU4fSwgezB4MDBiNywweDAwYjcsMHgwMGFmLDB4MDBhZn0sIHsweDAwYjEsMHgwMTNkLDB4MDBhOSwweDAwYTV9LCB7MHgwMTQxLDB4MDBhMSwweDAwNTAsMHgwMDU0fSwKKyAgezB4MDE0NywweDAxNDcsMHgwMDlmLDB4MDA5Zn0sIHsweDAxNGIsMHgwMTRiLDB4MDA5YiwweDAwOWJ9LCB7MHgwMDVjLDB4MDA2MCwweDAwNjQsMHgwMDcwfSwgezB4MDE0ZiwweDAxNGYsMHgwMDk1LDB4MDA4ZH0sCisgIHsweDAxNTUsMHgwMDg1LDB4MDA5MSwweDAwODl9LCB7MHgwMTUxLDB4MDA4MSwweDAwNjgsMHgwMDZjfSwgezB4MDE1ZiwweDAxNWYsMHgwMTY3LDB4MDE2N30sIHsweDAwN2IsMHgwMDdiLDB4MDA3ZiwweDAwN2Z9LAorICB7MHgwMDc0LDB4MDA3OCwweDAwODAsMHgwMGIwfSwgezB4MDE1OSwweDAwNzUsMHgwMDY5LDB4MDA2ZH0sIHsweDAwNzEsMHgwMDYxLDB4MDE2MSwweDAwN2N9LCB7MHgwMDY3LDB4MDA2NywweDAwNWIsMHgwMDVifSwKKyAgezB4MDA4NCwweDAwODgsMHgwMDhjLDB4MDA5Y30sIHsweDAwNWYsMHgwMDVmLDB4MDE2OSwweDAwNTV9LCB7MHgwMDRkLDB4MDAwZCwweDAwMDUsMHgwMDA5fSwgezB4MDAwMSwweDAwOTAsMHgwMDk0LDB4MDA5OH0sCisgIHsweDAxOGIsMHgwMThiLDB4MDE4ZiwweDAxOGZ9LCB7MHgwMTkzLDB4MDE5MywweDAxOTcsMHgwMTk3fSwgezB4MDE5YiwweDAxOWIsMHgwMWQ3LDB4MDFkN30sIHsweDAwYTAsMHgwMGE0LDB4MDBhOCwweDAwYWN9LAorICB7MHgwMTg3LDB4MDE4NywweDAxNmYsMHgwMTZmfSwgezB4MDE3MywweDAxNzMsMHgwMTc3LDB4MDE3N30sIHsweDAxN2IsMHgwMTdiLDB4MDE3ZiwweDAxN2Z9LCB7MHgwMTgzLDB4MDE4MywweDAxYTMsMHgwMWEzfSwKKyAgezB4MDBiNCwweDAwYzgsMHgwMGRjLDB4MDBmMH0sIHsweDAwYjgsMHgwMGJjLDB4MDBjMCwweDAwYzR9LCB7MHgwMWJmLDB4MDFiZiwweDAxYzMsMHgwMWMzfSwgezB4MDFjNywweDAxYzcsMHgwMWNiLDB4MDFjYn0sCisgIHsweDAxY2YsMHgwMWNmLDB4MDFkMywweDAxZDN9LCB7MHgwMWJiLDB4MDFiYiwweDAxYTcsMHgwMWE3fSwgezB4MDBjYywweDAwZDAsMHgwMGQ0LDB4MDBkOH0sIHsweDAxYWIsMHgwMWFiLDB4MDFhZiwweDAxYWZ9LAorICB7MHgwMWIzLDB4MDFiMywweDAxYjcsMHgwMWI3fSwgezB4MDFkYiwweDAxZGIsMHgwMDFiLDB4MDAxYn0sIHsweDAwMjMsMHgwMDIzLDB4MDAyNywweDAwMjd9LCB7MHgwMGUwLDB4MDBlNCwweDAwZTgsMHgwMGVjfSwKKyAgezB4MDAyYiwweDAwMmIsMHgwMDE3LDB4MDAxN30sIHsweDAxOWYsMHgwMTlmLDB4MDFlMywweDAxZTN9LCB7MHgwMWRmLDB4MDFkZiwweDAwMTMsMHgwMDEzfSwgezB4MDAxZiwweDAwMWYsMHgwMDNmLDB4MDAzZn0sCisgIHsweDAwZjQsMHgwMGY4LDB4MDBmYywweDAxMDB9LCB7MHgwMDQzLDB4MDA0MywweDAwNGIsMHgwMDRifSwgezB4MDA1MywweDAwNTMsMHgwMDQ3LDB4MDA0N30sIHsweDAwMmYsMHgwMDJmLDB4MDAzMywweDAwMzN9LAorICB7MHgwMDNiLDB4MDAzYiwweDAwMzcsMHgwMDM3fQorfTsKKworCisKKy8qIC5Db2RlQm9vayA9IEh1ZmZtYW5Db2RlQm9va194LCAuRGltZW5zaW9uID0gNCwgLm51bUJpdHMgPSAyLCAuT2Zmc2V0ID0gIDAgICovCitjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uIEFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVsxM10gPSB7CisgIHsgTlVMTCwgMCwgMCwgIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfMSwgIDQsIDIsIDEgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfMiwgIDQsIDIsIDEgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfMywgIDQsIDIsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfNCwgIDQsIDIsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfNSwgIDIsIDQsIDQgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfNiwgIDIsIDQsIDQgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfNywgIDIsIDQsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfOCwgIDIsIDQsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfOSwgIDIsIDQsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfMTAsIDIsIDQsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfMTEsIDIsIDUsIDAgfSwKKyAgeyBIdWZmbWFuQ29kZUJvb2tfU0NMLCAxLCA4LCA2MCB9Cit9OworCitjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uIEFBQ2NvZGVCb29rRGVzY3JpcHRpb25TQ0wgPSB7IEh1ZmZtYW5Db2RlQm9va19TQ0wsIDEsIDgsIDYwIH07CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWU0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDEpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDQpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBIdWZmVHJlZSAqLworY29uc3QgVUlOVCBhSHVmZlRyZWU0MVs4MF0gPSB7MHg0YTAwMDEsMHgwMjYwMDIsMHgwMTMwMDMsMHgwMjEwMDQsMHgwMWMwMDUsMHgwMGIwMDYsMHgwMTAwMDcsMHgwMTkwMDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTAwZSwweDAwYTAzYSwweDQwMDUyOCwweDAwYzAzNywweDAwZDAzYiwweDQ1NDQwNCwweDAwZjA0YywweDQ0ODQwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE3MDExLDB4MDEyMDJlLDB4NDJjNDBjLDB4MDM0MDE0LDB4MDE1MDJjLDB4MDE2MDQ5LDB4NDEwNDcwLDB4MDE4MDRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0MjQsMHgwMzIwMWEsMHgwMjAwMWIsMHg1MjA0MTgsMHgwMmYwMWQsMHgwMmEwMWUsMHgwMWYwNGQsMHg0MWM0NzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0MDQyMCwweDAyMjAyNCwweDA0YTAyMywweDQyODUxMCwweDAyNTAyOSwweDQzMDUwOCwweDAyNzAzYywweDAyODA0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTBjNDM0LDB4NDM4NDc4LDB4MDQ4MDJiLDB4NDY0NDNjLDB4MDJkMDNlLDB4NDQwNGIwLDB4NDQ0NTFjLDB4MDMwMDNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwNGIsMHg1MjQ0NGMsMHgwMzMwMzksMHg0ZjA0NTAsMHgwMzUwNDEsMHgwMzYwNDYsMHg0ZTg0NTgsMHgwNGYwMzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1YzUzYywweDQ2MDRlMCwweDRmODQ2OCwweDQ2YzRkNCwweDA0NTAzZCwweDRhYzQ3YywweDUxODQ4MCwweDA0MzA0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg0NGRjLDB4MDQyMDQ0LDB4NDg4NGE4LDB4NGJjNDhjLDB4NTMwNDkwLDB4NGE0NDk0LDB4NDk4NGI4LDB4NDljNGM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDQ0YjQsMHg1MDA0YzAsMHg0ZDA0YzgsMHg0ZjQ0Y2MsMHg0ZDg1MzgsMHg0ZWM0ZTQsMHg1MmM0ZmMsMHg1MTQ1MzR9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWU0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDIpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDQpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTQyWzgwXSA9IHsweDAyNjAwMSwweDAxNDAwMiwweDAwOTAwMywweDAxMDAwNCwweDAxZDAwNSwweDAwNjAwZCwweDAwNzAxOCwweDQ1MDAwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGUwNDAwLDB4MDJlMDBhLDB4MDM5MDBiLDB4MDNkMDBjLDB4NDNjNDA0LDB4MDFiMDBlLDB4MDBmMDRmLDB4NGQ4NDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjMwMTEsMHgwMTIwM2IsMHgwMWEwMTMsMHg0MTQ0MGMsMHgwMTUwMjAsMHgwMTYwNDAsMHgwMjUwMTcsMHg1MDA0MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzODAxOSwweDU0MDQxOCwweDQxYzQ0NCwweDAyZDAxYywweDQyMDUyMCwweDAxZTA0MiwweDAzNzAxZiwweDQyNDRjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJhMDIxLDB4MDIyMDRjLDB4NDc4NDI4LDB4MDI0MDMxLDB4NDJjNGRjLDB4NDMwNGU4LDB4MDI3MDMzLDB4NGEwMDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MGMwMjksMHg0MzQ0YTQsMHgwMmMwMmIsMHg0NzA0MzgsMHg0NDA0YzgsMHg0Zjg0NDgsMHgwNDkwMmYsMHgwNGIwMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0YzQ4NCwweDUyNDAzMiwweDRlYzQ1NCwweDAzZTAzNCwweDAzNTA0NiwweDRjNDAzNiwweDQ4ODQ1OCwweDRkNDQ1YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDYwNDY4LDB4MDRlMDNhLDB4NTFjNDY0LDB4MDNjMDRhLDB4NDZjNTE0LDB4NDc0NTNjLDB4MDQ1MDNmLDB4NDdjNGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQwNDEsMHg1MTA0ODAsMHgwNDMwNGQsMHg0ZTQ0OGMsMHg0OTA1MTgsMHg0OTQ0OWMsMHgwNDgwNDcsMHg0YzA0OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiODRhOCwweDRiMDUwOCwweDRmYzRiNCwweDRiYzUwNCwweDUzMDRkMCwweDUzNDRmMCwweDRmNDUyYywweDUyODUzOH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBIdWZmVHJlZTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMykuICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogNCkgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlNDNbODBdID0gezB4NDAwMDAxLDB4MDAyMDA0LDB4MDAzMDBhLDB4NDZjNDA0LDB4MDBiMDA1LDB4MDA2MDBkLDB4MDM0MDA3LDB4MDM3MDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OTQwMDksMHg0ZDg0MDgsMHg0MjQ0MGMsMHgwMGMwMWIsMHg0OTA0MTAsMHgwMGUwMTYsMHgwMGYwMTEsMHgwMTAwMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxNDRmYywweDAxMjAxZCwweDAyMDAxMywweDUwODQxOCwweDRjMDAxNSwweDQxYzQ0MCwweDAyMjAxNywweDAxODAyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MDM1LDB4MDM4MDFhLDB4NDIwNDQ0LDB4MDFjMDFmLDB4NDMwNDI4LDB4MDIxMDFlLDB4NDQ4NDJjLDB4NDc4NDM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjQ0MzgsMHg0NTQ0M2MsMHgwMmMwMjMsMHgwMzkwMjQsMHgwMjUwM2YsMHg0ODg0NGMsMHgwMzAwMjcsMHgwMmUwMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMjAyOSwweDAyYTA0MSwweDRkNDAyYiwweDQ1MDRmMCwweDA0MzAyZCwweDQ1ODRhOCwweDAyZjAzYiwweDQ2MDQ1YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMxMDNkLDB4NDY0MDQ2LDB4MDMzMDQ0LDB4NDY4NTNjLDB4NDcwNDljLDB4MDQ1MDM2LDB4NDc0NGRjLDB4NGEwNDdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA0ODAsMHg0YWMwM2EsMHg0Yjg0ODQsMHgwM2MwNGUsMHg0OGM1MjQsMHgwM2UwNDAsMHg0OTg0ZTgsMHg1MGM0YTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiMDUzMCwweDA0MjA0NywweDRiYzA0YiwweDRlNDRjNCwweDUxODRjOCwweDUyYzRjYywweDUyMDRkMCwweDA0ZDA0OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhMDQ5LDB4NGUwMDRjLDB4NTFjNGVjLDB4NGY0NTEwLDB4NTI4NGY4LDB4NTA0MDRmLDB4NTE0NTM4LDB4NTQwNTM0fTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgVGFibGU6IEh1ZmZUcmVlNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA0KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiA0KSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgVUlOVCBhSHVmZlRyZWU0NFs4MF0gPSB7MHgwMDEwMDQsMHgwMjAwMDIsMHgwMzYwMDMsMHg0OTA0MDAsMHgwMDUwMDgsMHgwMTAwMDYsMHgwMWYwMDcsMHg0MDQ0MjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTAwOSwweDAxMTAwYSwweDAwYjAxOCwweDAxNjAwYywweDAzNzAwZCwweDQwODAxNSwweDAwZjAzZSwweDQwYzQyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwNDc4LDB4MDIyMDEyLDB4MDM4MDEzLDB4MDFlMDE0LDB4NDU0NDE0LDB4NDQ4NDE4LDB4MDI1MDE3LDB4NDc0NDFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwMTksMHgwMjYwMWEsMHgwMmQwMWIsMHgwMWMwMzQsMHgwMWQwMjksMHg0MjA0ZjAsMHg0ZGM0MmMsMHg0NzA0MzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTAzYywweDRhMDQzNCwweDAyMzAyYSwweDQ0MDAyNCwweDQzODRhOCwweDQzYzQ0YywweDAyNzAzYSwweDAyODAyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0NTI0LDB4NDUwNGUwLDB4MDJiMDNkLDB4NDU4NDgwLDB4NDVjNGY0LDB4MDRiMDJlLDB4MDRmMDJmLDB4NDYwNTIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDIwMzEsMHgwNDgwMzIsMHgwNDkwMzMsMHg1MTQ0NjQsMHgwMzUwNGMsMHg1NDA0NjgsMHg0N2M0NmMsMHg0ODQ0ZDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzOTA0NCwweDQ4ODRmYywweDAzYjA0NSwweDQ4YzUzYywweDQ5NDQ5YywweDRiODQ5OCwweDAzZjA0NiwweDA0MTA0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGM0NGE0LDB4NTBjNGFjLDB4MDRhMDQzLDB4NTE4NGIwLDB4NGU0NGI0LDB4NGJjNGVjLDB4MDRlMDQ3LDB4NGMwNGU4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Yzg1MTAsMHg0Y2M1MmMsMHg0ZDA1MzAsMHg1MDQ0ZDQsMHg1MzgwNGQsMHg1Mjg0ZjgsMHg1MDg1MDAsMHg1MWM1MzR9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDUpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTIxWzgwXSA9IHsweDQ1MDAwMSwweDA0NDAwMiwweDA0MjAwMywweDAzNTAwNCwweDAyNjAwNSwweDAyMjAwNiwweDAxMzAwNywweDAxMDAwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMDA5LDB4MDFjMDBhLDB4MDFmMDBiLDB4MDFlMDBjLDB4NGEwNDAwLDB4MDFiMDBlLDB4MDMyMDBmLDB4NDdlNDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMTEsMHgwMTIwNGQsMHg0MDQ0OWMsMHgwMTcwMTQsMHgwMTUwMTksMHgwMTYwM2YsMHg0MDY0NTgsMHgwMTgwNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0ODQwOCwweDA0OTAxYSwweDQwYTQ1YSwweDQ4YzQwYywweDAxZDAzMSwweDQwZTQ4ZSwweDQ5MDQxMCwweDQ5MjQxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDMwLDB4NDgwNDE0LDB4MDMzMDIzLDB4MDI0MDJlLDB4MDI1MDNlLDB4NDE2NDgyLDB4MDJhMDI3LDB4MDI4MDJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwNDAsMHg0MTg0NjgsMHgwMmIwNGEsMHg0MWE0ODYsMHgwMmQwNDgsMHg0MWM0ODQsMHgwNGUwMmYsMHg0MWU0MjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDQzNCwweDQyMjQ5ZSwweDQyNDQ5NCwweDAzZDAzNCwweDQyODQ3MCwweDAzOTAzNiwweDAzNzAzYiwweDAzODA0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDJhNDc2LDB4MDNhMDRiLDB4NDJjNDU0LDB4MDNjMDQ3LDB4NDJlNDcyLDB4NDMwNDc4LDB4NDMyNDZlLDB4NDk2NDM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODg0MzgsMHg0M2E0NjYsMHgwNDYwNDMsMHg0M2M0NjQsMHgwNDUwNGMsMHg0M2U0NjIsMHg0NjA0NDAsMHg0NDI0NWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1YzQ0NCwweDQ2YTQ0NiwweDQ0YTQ1NiwweDQ3NDQ0YywweDQ1MjQ0ZSwweDQ2YzQ3YywweDQ4YTQ3YSwweDQ5YTQ5OH07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBIdWZmVHJlZTIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgNikuICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjJbODBdID0gezB4MDNjMDAxLDB4MDJmMDAyLDB4MDIwMDAzLDB4MDFjMDA0LDB4MDBmMDA1LDB4MDBjMDA2LDB4MDE2MDA3LDB4MDRkMDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIwMDksMHgwMTUwMGEsMHg0MDA0OTAsMHg0MGU0MDIsMHgwMGQwMTMsMHgwMGUwMmEsMHg0MGM0MDQsMHgwMTkwMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTA0MSwweDAzODAxMiwweDQwYTQwNiwweDAxNDAzNywweDQwODQ5YywweDRhMDQxMCwweDA0YTAxNywweDQ1ODAxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEyNDIyLDB4MDI4MDFhLDB4MDFiMDI5LDB4NDgwNDE0LDB4MDI0MDFkLDB4MDFlMDJiLDB4NDhhMDFmLDB4NDE2NDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmQwMjEsMHgwMjYwMjIsMHgwMjMwMzksMHg0MTg0NjgsMHgwMjUwNDMsMHg0ODY0MWEsMHgwMjcwNDAsMHg0MWM0ODgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxZTQ4YywweDQyMDQ1YSwweDQ3YzQyNCwweDA0YzAyYywweDQ2ZTQyNiwweDAzNjAyZSwweDQyODQ3OCwweDAzMDAzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDNjMDMxLDB4MDRiMDMyLDB4NDJlNDJhLDB4MDM0MDNhLDB4MDM1MDQ4LDB4NDJjNDQyLDB4NDcwNDMwLDB4NDk0NDM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MzY0OWEsMHg0NWM0MzgsMHgwNDQwM2IsMHg0M2E0NTQsMHgwNDUwM2QsMHgwM2UwM2YsMHg0M2U0NjQsMHg0NDA0NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4NDQ0NCwweDA0OTA0MiwweDQ0NjQ0OCwweDQ0YTQ1NiwweDQ2NjQ0YywweDA0NzA0NiwweDQ0ZTQ1MiwweDQ1MDQ2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDc0NDVlLDB4NDZhNDk2LDB4NDk4NDZjLDB4NDcyNDc2LDB4NDdhNDgyLDB4MDRlMDRmLDB4NDdlNDkyLDB4NDhlNDllfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA3KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgVUlOVCBhSHVmZlRyZWUyM1s2M10gPSB7MHg0MDAwMDEsMHgwMDIwMDMsMHg0MTA0MDIsMHgwMDQwMDcsMHg0MTIwMDUsMHgwMWMwMDYsMHg0MjA0MDQsMHgwMDgwMGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxZDAwOSwweDAwYTAxZiwweDQwNjAyNiwweDAwYzAxMiwweDAwZDAwZiwweDAyNzAwZSwweDQwODQ0MCwweDAxMDAyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4MDExLDB4NDU0NDBhLDB4MDEzMDE3LDB4MDI5MDE0LDB4MDI0MDE1LDB4MDE2MDJmLDB4NDNjNDBjLDB4MDJiMDE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkwMzMsMHgwMzIwMWEsMHg0M2UwMWIsMHg0NzA0MGUsMHg0MjI0MTQsMHgwMWUwMjUsMHg0MzI0MTYsMHgwMjAwMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxODQ0MiwweDQxYTQ1MiwweDAzNjAyMywweDQxYzQ0NiwweDQ2NDQxZSwweDQyNDQzMCwweDQyNjQzNCwweDQzNjQyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0NDJhLDB4MDJlMDJhLDB4NDU2NDJjLDB4MDMwMDJjLDB4MDJkMDNiLDB4NDY2NDJlLDB4NDNhNDM4LDB4NDYwNDQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwMzcsMHg0NzI0NGEsMHg0NWE0NGMsMHgwMzQwMzksMHgwMzgwMzUsMHg0Nzg0NGUsMHg0NjI0NTAsMHg0NzQ0NTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ2YTQ1YywweDAzYTAzYywweDQ1ZTQ3YSwweDQ3NjQ2OCwweDAzZDAzZSwweDQ3YzQ2YywweDQ2ZTQ3ZX07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBIdWZmVHJlZTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgOCkuICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjRbNjNdID0gezB4MDAxMDA2LDB4MDFkMDAyLDB4MDA1MDAzLDB4NDI0MDA0LDB4NDAwNDIwLDB4NDE0NDAyLDB4MDA3MDBhLDB4MDA4MDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwMWYsMHg0MDQ0MzIsMHgwMGIwMTEsMHgwMGMwMGUsMHgwMGQwMzIsMHg0MDY0NDYsMHgwMjMwMGYsMHgwMzMwMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1ODQwOCwweDAyNTAxMiwweDAxMzAxNiwweDAxNDAyZiwweDAxNTAzOCwweDQ2ODQwYSwweDAyODAxNywweDAxODAxYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5MDE5LDB4NDBjNDdhLDB4MDNlMDFiLDB4MDNiMDFjLDB4NDBlNDdlLDB4NDEyMDFlLDB4NDIyNDEwLDB4NDE2NDM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmEwMjEsMHgwMjIwMmIsMHg0MTg0NDQsMHgwMmMwMjQsMHg0MWE0NTYsMHgwMmQwMjYsMHgwMjcwMzQsMHg0NjI0MWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTAzNiwweDQxZTQ1YywweDQyNjAzMSwweDQyODQzMCwweDQ1MjQyYSwweDAzNzAyZSwweDQyYzQ2NCwweDAzMDAzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDc0NDJlLDB4NDM2NDQyLDB4NDM4NDU0LDB4NDNhNDQ4LDB4MDM1MDNhLDB4NDNjNDY2LDB4NDNlMDNkLDB4NDRhNDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NGM0NzIsMHg0NjA0NGUsMHg0NWE0NTAsMHg0NWU0NzAsMHg0NmE0NzYsMHg0NmM0NzgsMHg0N2M0NmV9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDkpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTI1WzE2OF0gPSB7MHg0MDAwMDEsMHgwMDIwMDMsMHg0MWE0MDIsMHgwMDQwMDcsMHg0MWMwMDUsMHgwMzUwMDYsMHg0MzQ0MDQsMHgwMDgwMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwMGMsMHgwNGEwMGEsMHg0MjAwMGIsMHg0NGU0MDYsMHgwMzYwMGQsMHgwMzgwMGUsMHgwNWEwMGYsMHg0MDg0NjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTEwMWEsMHgwMTIwMTYsMHgwMzkwMTMsMHgwNzAwMTQsMHg0NmUwMTUsMHg0MGE0NDAsMHgwM2IwMTcsMHgwMTgwNGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkwNGYsMHg0Yjg0MGMsMHgwMWIwMjIsMHgwMWMwNDEsMHgwM2YwMWQsMHgwMWUwMjAsMHgwMWYwNWIsMHg0MGU0ZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEwN2MsMHg0NWM0MTAsMHgwMjMwMmMsMHgwMjQwMjgsMHgwNTMwMjUsMHgwMjYwNDUsMHgwMjcwN2QsMHg0MTI1MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDcwMjksMHgwNWUwMmEsMHgwMmIwOGEsMHg1MjY0MTQsMHgwNTYwMmQsMHgwMmUwODEsMHgwMmYwMzIsMHgwNmUwMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwODAsMHg0MTY1NDQsMHgwNzkwMzMsMHgwMzQwOTEsMHg0MTg1MmMsMHg0MzY0MWUsMHgwNGIwMzcsMHg0MjI0NmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2M0MjQsMHgwNGMwM2EsMHg0MjY0NTYsMHgwM2MwNjYsMHgwM2QwM2UsMHg0ODI0MjgsMHg0NTg0MmEsMHgwNDAwNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MmM0YmEsMHgwNTAwNDIsMHgwNDMwNWMsMHgwNDQwNzQsMHg0MmU0YmUsMHgwNmEwNDYsMHg0ZGM0MzAsMHgwNzUwNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDkwYTMsMHg0NGE0MzIsMHg0NTA0MzgsMHg0M2E0NTIsMHg0ODQ0M2UsMHgwNGUwNjgsMHg0NWE0NDIsMHg0ZDQ0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTEwODgsMHgwNTIwODcsMHg0NDY0OGMsMHgwNzcwNTQsMHg0ZGEwNTUsMHg1MGE0NDgsMHgwNTcwNjAsMHgwNmIwNTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTkwNmQsMHg0NGM0ZjYsMHg0NmM0NTQsMHg0NWU0NzQsMHgwNjkwNWQsMHg0NjA1MjAsMHgwNWYwN2UsMHg0NjI0OTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjEwNjMsMHgwN2YwNjIsMHg0NjQ0OTYsMHgwNjQwOGIsMHgwOGQwNjUsMHg1NDI0NjYsMHgwNjcwNzEsMHg0ZDI0NzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzI0ZWMsMHg0Nzg0NzYsMHg1M2E0N2EsMHgwOWIwNmMsMHg0N2M0YWMsMHg0Zjg0N2UsMHgwNmYwNzgsMHg1MTA0ODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODY0OWUsMHg0ODg0YTAsMHgwNzMwN2IsMHg0OWM0OGEsMHg0YTY0OGUsMHgwOTgwNzYsMHg0OTA0YzAsMHg0OTI0ZWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Yzg0OTgsMHgwN2EwOGUsMHg1MTI0OWEsMHg0YTI0ZDYsMHg1MDY0YTQsMHg0ZjI0YTgsMHg0YWE0ZGUsMHg1MWU0YWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjA1MzgsMHgwODIwOTIsMHgwODMwODUsMHgwOGYwODQsMHg1NDY0YjIsMHgwOTYwODYsMHg0Y2U0YjQsMHg0ZDA0YjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODkwOTAsMHg0YmM1MDgsMHg0YzI1M2UsMHgwOGMwYTQsMHg1Mjg0YzQsMHg0ZTA0YzYsMHg0Y2E0ZmEsMHg1MTQ0Y2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjA0ZDgsMHg0ZTI0ZmMsMHgwOTMwOWMsMHgwOTQwOTksMHgwOTUwOTcsMHg0ZTQ1MTYsMHg0ZTY1MmUsMHg0ZTg0ZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjQ1MGMsMHgwOWEwOWYsMHg1MDA1MDIsMHg1MDQ1MGUsMHgwOWQwYTAsMHgwOWUwYTUsMHg1MTg1MzAsMHg1MWE1NGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTcwYTEsMHgwYTIwYTYsMHg1MWM1MzQsMHg1M2M1MjQsMHg1NDA1MmEsMHg1NDg1MzIsMHg1MzY1NTAsMHg1NGM1NGV9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDEwKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTI2WzE2OF0gPSB7MHgwMDYwMDEsMHgwMDIwMTMsMHgwMDMwMGYsMHgwMDQwMGQsMHgwM2IwMDUsMHg0MDA0NmUsMHgwMzcwMDcsMHgwMDgwMGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwNjcsMHg0MDI0MjAsMHgwNTYwMGIsMHgwMGMwNTcsMHg0MzQ0MDQsMHgwNjYwMGUsMHg0MDY0NzAsMHgwM2MwMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTkwMTEsMHgwNmYwMTIsMHg0OWU0MDgsMHgwMTQwMTksMHgwM2YwMTUsMHgwMTYwNDQsMHgwMTcwNDIsMHgwNzkwMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Yjg0MGEsMHgwMWEwMWYsMHgwMWIwNDcsMHgwN2MwMWMsMHgwODcwMWQsMHgwNjkwMWUsMHg0NDY0MGMsMHgwMjAwMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIwMjEsMHgwMjIwNGYsMHgwMjMwMjUsMHgwMjQwNmIsMHg0MGU0ZTAsMHgwODEwMjYsMHg1Mjg0MTAsMHgwMjgwMmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMwMjksMHgwOGYwMmEsMHgwMmIwNzgsMHg1M2E0MTIsMHgwNTIwMmQsMHgwMmUwMzMsMHgwMmYwMzEsMHgwMzAwYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0Y2UsMHgwYTYwMzIsMHg0MTY1MzQsMHgwOWEwMzQsMHgwOWYwMzUsMHgwMzYwYTcsMHg1NGU0MTgsMHgwM2EwMzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MzYwMzksMHg0Mzg0MWEsMHg0MWM0MWUsMHg0MjI0NmEsMHgwNTgwM2QsMHgwM2UwNjgsMHg0MjQ0ODQsMHgwNDAwNWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDEwN2EsMHg0MjY0NWEsMHgwNDMwOTMsMHg0ZDI0MjgsMHgwNWUwNDUsMHgwNDYwNzIsMHg0MmE0NWUsMHgwNDgwNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMwNDksMHgwNGEwOTgsMHg0MmM0YzQsMHgwNzUwNGMsMHgwOTUwNGQsMHgwNGUwOWMsMHg1MTA0MmUsMHgwNjMwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzcwNTEsMHg0MzA1M2MsMHgwNTMwODQsMHgwNjUwNTQsMHg0ZTQwNTUsMHg0ZmU0MzIsMHg0M2E0NTQsMHg0M2M0NmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2U0ODYsMHgwNzAwNWEsMHg0YTA0NDAsMHgwNzEwNWMsMHgwNWQwN2IsMHg0NWM0NDIsMHgwNWYwOGEsMHg0NzY0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2YwNjEsMHgwNjIwNmEsMHg0NDg1MDYsMHgwNjQwOGUsMHg1MjY0NGEsMHg1NDQ0NGMsMHg0NTY0NGUsMHg0NTI0NTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODg0NTgsMHg0NjA0ZWMsMHg0NjI0ZjYsMHg1MGU0NjQsMHgwODIwNmQsMHgwYTQwNmUsMHg1NDI0NjYsMHg0YTI0NjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OGE0NzIsMHg0NzQwODksMHg0ZDg0NzgsMHgwOTcwNzQsMHg0N2E1MDgsMHgwOGQwNzYsMHg0N2M0YjYsMHg1MTI0N2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODA0ZmMsMHg0YmM0ODIsMHg0OGM0YTQsMHg0OGU0ZDQsMHgwN2QwN2UsMHg0OTA0ZGEsMHg0OTIwOGIsMHgwOTQwODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OTQ1MGMsMHg0OTY0ZTIsMHgwOWQwODMsMHg1MmE0OTgsMHgwODUwOTEsMHgwYTUwODYsMHg0Y2M0OWEsMHgwODgwOGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZWU0OWMsMHg0YTY0YmEsMHg0YTg0YzAsMHg0YzI0YWEsMHg0YWM0ZjAsMHg0YWU0ZDAsMHg0Y2E0YjAsMHgwOTAwYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjI0ZWEsMHgwOTIwOTksMHg0YjQ1MTYsMHg0ZDY0YmUsMHg0YzY1MGEsMHg1MjIwOTYsMHg0Yzg1MjQsMHg0ZGM0ZjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZGU0ZjQsMHg0ZTY1NDgsMHgwOWUwOWIsMHg1Mzg0ZTgsMHg1MjA0ZjgsMHg0ZmE1M2UsMHg1MDA1MWEsMHgwYTMwYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDI1MzYsMHg1MTQ1MDQsMHg1MWU1MTgsMHg1NGE1MWMsMHg1NDA1MmMsMHg1MmU1NDYsMHg1MzA1MzIsMHg1NGM1NTB9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDExKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTI3WzI4OF0gPSB7MHgwMDEwMGQsMHgwMDIwMDYsMHgwMDMwMDQsMHg0MDA0MjQsMHgwNDcwMDUsMHg0MDI0NDYsMHgwNDgwMDcsMHgwMDgwMGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwNGMsMHg0NGE0MDQsMHgwNzQwMGIsMHgwMGMwYmIsMHg0NjY0MDYsMHgwMGUwMTQsMHgwMGYwNTQsMHgwNGUwMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTEwMTEsMHgwYTkwMTIsMHgwMTMwYmMsMHg0MDg0NjQsMHgwMTUwMWYsMHgwMTYwMWEsMHgwMTcwNTksMHgwYWYwMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2EwMTksMHg0MGEwZTQsMHgwMWIwNWUsMHgwMWMwODQsMHgwYmYwMWQsMHgwNWQwMWUsMHg1NWE0MGMsMHgwMjAwMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEwNjYsMHgwNDMwMjIsMHgwMjMwNjIsMHgwMjQwOGQsMHgwMjUxMDgsMHg0MGU0ODAsMHgwMjcwMzAsMHgwMjgwMmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwNmIsMHgwMmEwZGEsMHgwNjUwMmIsMHg0MTA1YzgsMHgwYTQwMmQsMHgwZWMwMmUsMHgwZGQwMmYsMHg1MzI0MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUwMzEsMHgwMzIwMzYsMHgwMzMwM2UsMHgwZmQwMzQsMHgwZmMwMzUsMHg0MTQ1YjAsMHgwMzcwM2EsMHgwMzgxMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMGQwMzksMHg1YmE0MTYsMHgxMGYwM2IsMHgwM2MwNDEsMHg1ZmEwM2QsMHg0MWM0MTgsMHgxMDQwM2YsMHgwNDAxMWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MWE1ZjQsMHgxMWMwNDIsMHg0MWU2MWMsMHgwODcwNDQsMHgwZjUwNDUsMHgwZDkwNDYsMHg0MjA0YTIsMHg2NDA0MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDkwNGEsMHg0MjY0NDgsMHgwNGIwNzMsMHg0Mjg0NjgsMHg0NmMwNGQsMHg0OGE0MmEsMHgwNGYwNzcsMHgwNzYwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MmM0YjAsMHgwNTIwYTcsMHgwOTYwNTMsMHg0MmU0YTgsMHgwNTUwN2QsMHgwN2EwNTYsMHgwZDQwNTcsMHgwZGYwNTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDI0MzAsMHgwNWEwODEsMHgwNWIwOWIsMHgwNWMwZTIsMHg1Yjg0MzIsMHg0ZmU0MzQsMHgwNWYwOWUsMHgwZTYwNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjEwZDYsMHg1N2M0MzYsMHgwY2MwNjMsMHgxMTIwNjQsMHg0Mzg0YTAsMHg0M2E1Y2EsMHgwNjcwODksMHgwNjgwYjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjkwYTIsMHgwYTEwNmEsMHg0M2M1OWMsMHgwOTIwNmMsMHgwNmQwYmEsMHg2MDY0M2UsMHgwZDEwNmYsMHgwNzAwZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGUwNzEsMHgxMGIwNzIsMHg0NDA1NmMsMHg0NmE0NDQsMHgwNzUwOTQsMHg0OGM0NGMsMHg0NGU0OTAsMHgwOTUwNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWIwNzksMHg0NTA0Y2UsMHgwN2IwOTcsMHgxMWUwN2MsMHg2MzA0NTIsMHgwYWMwN2UsMHgwN2YwOTksMHgwODAxMDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTQ0YjgsMHgwODIwYjEsMHgwODMwZTUsMHg0ZmM0NTYsMHgwYjMwODUsMHgwODYwOWQsMHg0NTg1M2UsMHgwODgwYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YzA0NWEsMHgwOGEwOGYsMHgwOGIwY2UsMHgwOGMwZjcsMHg1ODY0NWMsMHgxMTEwOGUsMHg0NWU1YzQsMHgwYzQwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMGEwOTEsMHg0NjA0ZTQsMHgwZDAwOTMsMHg0NjI2MDgsMHg0OGU0NmUsMHg0NzA0YjIsMHg0ZDI0NzIsMHgwOTgwYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjI0NzQsMHgwZTMwOWEsMHg0NzY0YWEsMHgwYmUwOWMsMHg0Nzg1MWEsMHg0N2E0ZGUsMHgwOWYwYjUsMHgwYTAwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA0N2MsMHg1Nzg0N2UsMHgwYTMwYzMsMHg1MDQ0ODIsMHgwZTkwYTUsMHgwYTYxMDAsMHg0Yzg0ODQsMHgwYTgxMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODY2MmEsMHgwYzcwYWEsMHg0ODg0OTQsMHg0OTI0ZDAsMHgwYWQwYzgsMHgwYWUwZDgsMHg0OTY2MzYsMHgxMGUwYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Zjg0OTgsMHgwZjMwYjIsMHg0OWE0ZGMsMHgwZjIwYjQsMHg1M2M0OWMsMHgwYjYwY2IsMHg0OWU1N2EsMHgwYjgwZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjkxMDksMHg1ZTQ0YTQsMHg1NDg0YTYsMHg0YWM0YWUsMHg0YjQ0Y2EsMHg0ZDY0YjYsMHg0YmE1ZGEsMHgwYzYwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YmM1MWUsMHg0YmU1NTYsMHg2MjA0YzAsMHg0YzI0YzQsMHgwZjgwYzUsMHg1NjY0YzYsMHg0Y2M1M2EsMHg0ZDQ2MmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjEwYzksMHg0ZDg1NTIsMHg0ZGE0ZmEsMHg1YmU0ZTAsMHgwY2QwZmYsMHg1MjQ0ZTIsMHgwY2YwZTgsMHg0ZTY1NjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1OWE0ZTgsMHgwZjkwZDIsMHgxMDEwZDMsMHg1YWM0ZWEsMHgwZDUwZDcsMHg0ZWM2MzQsMHg0ZWU1NjAsMHg0ZjQ0ZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjY2MzgsMHg1MDI1MjIsMHgwZGIwZGMsMHg1MDY1YTYsMHg1MDg2MDQsMHg2MDA1MGEsMHg1MGMwZmIsMHg2MzI1MGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTMwZTEsMHg1YTQ1MTAsMHg1MTI1ZmMsMHg1MTY1MTQsMHg1MTg2M2UsMHg1MWM1MzYsMHgwZTcwZjQsMHg1NWM1MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDI1MjYsMHgwZWIwZWEsMHg1Y2M1MjgsMHg1ZWE1MmEsMHgxMTQwZWQsMHg2MGM1MmMsMHgxMDIwZWYsMHgwZjAxMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1OGU1MmUsMHg1MzA2MjIsMHg1NTg1MzQsMHg1Mzg2MWUsMHg1NWU1NDAsMHg1ODAwZjYsMHg1N2U1NDIsMHg1NDQ1ZTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NDY1ZTgsMHgwZmExMTUsMHg1NGM1NGEsMHg1NGU2MGUsMHg1YWU1NTAsMHgxMTYwZmUsMHg1ZjA1NTQsMHg1NjQ1NjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NmE1OGEsMHg1NmU1ZWUsMHgxMDMxMGMsMHg1NzA1ZDAsMHgxMDcxMDUsMHg1NzI1ZDQsMHg1NzQ2M2EsMHg1NzY1YjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ODI1YmMsMHg1ODQ1ZTIsMHg1ODg1ZGUsMHg1OGM1OTIsMHg1Y2U1OTAsMHg1OTQ1ZjYsMHg2M2M1OTYsMHgxMWIxMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZDg1OTgsMHg1YzI1OWUsMHg1ZTA1YTAsMHg1YTI1YzYsMHg1YTg2MGEsMHg1YWE1ZWMsMHg1YjI2MTAsMHgxMWExMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MTg1YjYsMHg1ZjI1ZDIsMHg1ZDY2MTYsMHg1ZGM1ZjgsMHg2MWE1ZmUsMHg2MTI2MTQsMHg2MmU2MjQsMHg2MjY2Mjh9OworCisvKiBnZXQgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIGh1ZmZtYW4gdGFibGVzIGludG8gYW4gYXJyYXkgW2NvbnZlcnQgY29kZWJvb2sgaW50byBzdGFydGluZyBhZGRyZXNzXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNiICAgIHRyZWUgKi8KK2NvbnN0IFVJTlQgICAqYUh1ZmZUYWJsZVtNQVhfQ0JdID0ge2FIdWZmVHJlZTQxLCAgLyogMCAgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MSwgIC8qIDEgICAgICAxICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQyLCAgLyogMiAgICAgIDIgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDMsICAvKiAzICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0NCwgIC8qIDQgICAgICA0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTIxLCAgLyogNSAgICAgIDUgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjIsICAvKiA2ICAgICAgNiAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyMywgIC8qIDcgICAgICA3ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI0LCAgLyogOCAgICAgIDggICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjUsICAvKiA5ICAgICAgOSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNiwgIC8qIDEwICAgICAxMCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMTEgICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxMiAgICAgLSAgICovICAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQxLCAgLyogMTMgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MSwgIC8qIDE0ICAgICAtICAgKi8gIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxNSAgICAgLSAgICovICAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMTYgICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAxNyAgICAgMTEgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDE4ICAgICAxMSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMTkgICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyMCAgICAgMTEgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDIxICAgICAxMSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjIgICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyMyAgICAgMTEgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI0ICAgICAxMSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjUgICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyNiAgICAgMTEgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI3ICAgICAxMSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjggICAgIDExICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyOSAgICAgMTEgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDMwICAgICAxMSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3fTsgLyogMzEgICAgIDExICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZGF0YS1kZXNjcmlwdGlvbjoKKyAgVGhlIGZvbGxvd2luZyB0YWJsZXMgY29udGFpbiB0aGUgcXVhbnRpemVkIHZhbHVlcy4gVHdvIG9yIGZvdXIgb2YgdGhlIHF1YW50aXplZCB2YWx1ZXMgYXJlCisgIGluZGV4ZWQgYnkgdGhlIHJlc3VsdCBvZiB0aGUgZGVjb2RpbmcgaW4gdGhlIGRlY29kaW5nIHRyZWUgKHNlZSB0YWJsZXMgYWJvdmUpLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBWYWxUYWI0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMS0yLiAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBTQ0hBUiAgYVZhbFRhYjQxWzMyNF09ey0xLC0xLC0xLC0xLC0xLC0xLC0xLDAsLTEsLTEsLTEsMSwtMSwtMSwwLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwwLDAsLTEsLTEsMCwxLC0xLC0xLDEsLTEsLTEsLTEsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwxLDEsLTEsMCwtMSwtMSwtMSwwLC0xLDAsLTEsMCwtMSwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwwLDAsLTEsLTEsMCwwLDAsLTEsMCwwLDEsLTEsMCwxLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwwLDEsMCwtMSwwLDEsMSwtMSwxLC0xLC0xLC0xLDEsLTEsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsMSwtMSwxLC0xLDEsMCwtMSwtMSwxLDAsMCwtMSwxLDAsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsMSwxLC0xLC0xLDEsMSwwLC0xLDEsMSwxLDAsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsLTEsLTEsMCwwLC0xLC0xLDEsMCwtMSwwLC0xLDAsLTEsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLC0xLDAsMSwwLC0xLDEsLTEsMCwtMSwxLDAsMCwtMSwxLDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwtMSwtMSwwLDAsLTEsMCwwLDAsLTEsMSwwLDAsMCwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwxLC0xLDAsMCwxLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwxLDEsMCwxLC0xLC0xLDAsMSwtMSwwLDAsMSwtMSwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDEsMCwtMSwwLDEsMCwwLDAsMSwwLDEsMCwxLDEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwxLDAsMCwxLDEsMSwxLC0xLC0xLC0xLDEsLTEsLTEsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwtMSwtMSwxLDEsLTEsMCwtMSwxLC0xLDAsMCwxLC0xLDAsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwtMSwxLC0xLDEsLTEsMSwwLDEsLTEsMSwxLDEsMCwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwwLC0xLDAsMSwwLC0xLDEsMSwwLDAsLTEsMSwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwwLDAsMSwxLDAsMSwtMSwxLDAsMSwwLDEsMCwxLDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwtMSwtMSwxLDEsLTEsMCwxLDEsLTEsMSwxLDEsMCwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxLDAsMCwxLDEsMCwxLDEsMSwxLC0xLDEsMSwxLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwxLDF9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICBUYWJsZTogVmFsVGFiNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzIDMtNC4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgU0NIQVIgIGFWYWxUYWI0MlszMjRdPXswLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMSwxLDAsMCwxLDIsMCwwLDIsMCwwLDAsMiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMiwyLDAsMSwwLDAsMCwxLDAsMSwwLDEsMCwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDEsMSwwLDAsMSwxLDEsMCwxLDEsMiwwLDEsMiwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDEsMiwxLDAsMSwyLDIsMCwyLDAsMCwwLDIsMCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDIsMCwyLDAsMiwxLDAsMCwyLDEsMSwwLDIsMSwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDIsMiwwLDAsMiwyLDEsMCwyLDIsMiwxLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsMCwxLDEsMCwwLDIsMSwwLDEsMCwxLDAsMSwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsMSwyLDEsMCwyLDAsMSwwLDIsMSwxLDAsMiwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMCwwLDEsMSwwLDEsMSwxLDAsMiwxLDEsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMSwxLDEsMSwxLDIsMSwxLDIsMCwxLDEsMiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMiwyLDEsMiwwLDAsMSwyLDAsMSwxLDIsMCwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDIsMSwwLDEsMiwxLDEsMSwyLDEsMiwxLDIsMiwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDIsMiwxLDEsMiwyLDIsMiwwLDAsMCwyLDAsMCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDAsMCwyLDIsMCwxLDAsMiwwLDEsMSwyLDAsMSwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDAsMiwwLDIsMCwyLDEsMiwwLDIsMiwyLDEsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDEsMCwxLDIsMSwwLDIsMiwxLDEsMCwyLDEsMSwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDEsMSwyLDIsMSwyLDAsMiwxLDIsMSwyLDEsMiwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDIsMCwwLDIsMiwwLDEsMiwyLDAsMiwyLDIsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDIsMSwxLDIsMiwxLDIsMiwyLDIsMCwyLDIsMiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDIsMiwyfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgVGFibGU6IFZhbFRhYjIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyA1LTYuICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFNDSEFSICBhVmFsVGFiMjFbMTYyXT17LTQsLTQsLTQsLTMsLTQsLTIsLTQsLTEsLTQsMCwtNCwxLC00LDIsLTQsMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQsNCwtMywtNCwtMywtMywtMywtMiwtMywtMSwtMywwLC0zLDEsLTMsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMsMywtMyw0LC0yLC00LC0yLC0zLC0yLC0yLC0yLC0xLC0yLDAsLTIsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIsMiwtMiwzLC0yLDQsLTEsLTQsLTEsLTMsLTEsLTIsLTEsLTEsLTEsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsMSwtMSwyLC0xLDMsLTEsNCwwLC00LDAsLTMsMCwtMiwwLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwxLDAsMiwwLDMsMCw0LDEsLTQsMSwtMywxLC0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLC0xLDEsMCwxLDEsMSwyLDEsMywxLDQsMiwtNCwyLC0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLC0yLDIsLTEsMiwwLDIsMSwyLDIsMiwzLDIsNCwzLC00LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLC0zLDMsLTIsMywtMSwzLDAsMywxLDMsMiwzLDMsMyw0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LC00LDQsLTMsNCwtMiw0LC0xLDQsMCw0LDEsNCwyLDQsMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCw0fTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgVGFibGU6IFZhbFRhYjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyA3LTguICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFNDSEFSICBhVmFsVGFiMjJbMTI4XT17MCwwLDAsMSwwLDIsMCwzLDAsNCwwLDUsMCw2LDAsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwwLDEsMSwxLDIsMSwzLDEsNCwxLDUsMSw2LDEsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwwLDIsMSwyLDIsMiwzLDIsNCwyLDUsMiw2LDIsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywwLDMsMSwzLDIsMywzLDMsNCwzLDUsMyw2LDMsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwwLDQsMSw0LDIsNCwzLDQsNCw0LDUsNCw2LDQsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwwLDUsMSw1LDIsNSwzLDUsNCw1LDUsNSw2LDUsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwwLDYsMSw2LDIsNiwzLDYsNCw2LDUsNiw2LDYsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywwLDcsMSw3LDIsNywzLDcsNCw3LDUsNyw2LDcsN307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBWYWxUYWIyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgOS0xMC4gICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBTQ0hBUiAgYVZhbFRhYjIzWzMzOF09ezAsMCwwLDEsMCwyLDAsMywwLDQsMCw1LDAsNiwwLDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsOCwwLDksMCwxMCwwLDExLDAsMTIsMSwwLDEsMSwxLDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMywxLDQsMSw1LDEsNiwxLDcsMSw4LDEsOSwxLDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDExLDEsMTIsMiwwLDIsMSwyLDIsMiwzLDIsNCwyLDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsNiwyLDcsMiw4LDIsOSwyLDEwLDIsMTEsMiwxMiwzLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMSwzLDIsMywzLDMsNCwzLDUsMyw2LDMsNywzLDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsOSwzLDEwLDMsMTEsMywxMiw0LDAsNCwxLDQsMiw0LDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsNCw0LDUsNCw2LDQsNyw0LDgsNCw5LDQsMTAsNCwxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwxMiw1LDAsNSwxLDUsMiw1LDMsNSw0LDUsNSw1LDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsNyw1LDgsNSw5LDUsMTAsNSwxMSw1LDEyLDYsMCw2LDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMiw2LDMsNiw0LDYsNSw2LDYsNiw3LDYsOCw2LDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMTAsNiwxMSw2LDEyLDcsMCw3LDEsNywyLDcsMyw3LDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsNSw3LDYsNyw3LDcsOCw3LDksNywxMCw3LDExLDcsMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsMCw4LDEsOCwyLDgsMyw4LDQsOCw1LDgsNiw4LDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsOCw4LDksOCwxMCw4LDExLDgsMTIsOSwwLDksMSw5LDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksMyw5LDQsOSw1LDksNiw5LDcsOSw4LDksOSw5LDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDExLDksMTIsMTAsMCwxMCwxLDEwLDIsMTAsMywxMCw0LDEwLDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLDYsMTAsNywxMCw4LDEwLDksMTAsMTAsMTAsMTEsMTAsMTIsMTEsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsMSwxMSwyLDExLDMsMTEsNCwxMSw1LDExLDYsMTEsNywxMSw4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSw5LDExLDEwLDExLDExLDExLDEyLDEyLDAsMTIsMSwxMiwyLDEyLDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLDQsMTIsNSwxMiw2LDEyLDcsMTIsOCwxMiw5LDEyLDEwLDEyLDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwxMn07CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogIFRhYmxlOiBWYWxUYWIyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMTEuICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBTQ0hBUiAgYVZhbFRhYjI0WzU3OF09ezAsMCwwLDEsMCwyLDAsMywwLDQsMCw1LDAsNiwwLDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsOCwwLDksMCwxMCwwLDExLDAsMTIsMCwxMywwLDE0LDAsMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMTYsMSwwLDEsMSwxLDIsMSwzLDEsNCwxLDUsMSw2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDcsMSw4LDEsOSwxLDEwLDEsMTEsMSwxMiwxLDEzLDEsMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMTUsMSwxNiwyLDAsMiwxLDIsMiwyLDMsMiw0LDIsNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiw2LDIsNywyLDgsMiw5LDIsMTAsMiwxMSwyLDEyLDIsMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMTQsMiwxNSwyLDE2LDMsMCwzLDEsMywyLDMsMywzLDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsNSwzLDYsMyw3LDMsOCwzLDksMywxMCwzLDExLDMsMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMTMsMywxNCwzLDE1LDMsMTYsNCwwLDQsMSw0LDIsNCwzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LDQsNCw1LDQsNiw0LDcsNCw4LDQsOSw0LDEwLDQsMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsMTIsNCwxMyw0LDE0LDQsMTUsNCwxNiw1LDAsNSwxLDUsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwzLDUsNCw1LDUsNSw2LDUsNyw1LDgsNSw5LDUsMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsMTEsNSwxMiw1LDEzLDUsMTQsNSwxNSw1LDE2LDYsMCw2LDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMiw2LDMsNiw0LDYsNSw2LDYsNiw3LDYsOCw2LDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMTAsNiwxMSw2LDEyLDYsMTMsNiwxNCw2LDE1LDYsMTYsNywwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LDEsNywyLDcsMyw3LDQsNyw1LDcsNiw3LDcsNyw4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LDksNywxMCw3LDExLDcsMTIsNywxMyw3LDE0LDcsMTUsNywxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwwLDgsMSw4LDIsOCwzLDgsNCw4LDUsOCw2LDgsNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCw4LDgsOSw4LDEwLDgsMTEsOCwxMiw4LDEzLDgsMTQsOCwxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwxNiw5LDAsOSwxLDksMiw5LDMsOSw0LDksNSw5LDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksNyw5LDgsOSw5LDksMTAsOSwxMSw5LDEyLDksMTMsOSwxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwxNSw5LDE2LDEwLDAsMTAsMSwxMCwyLDEwLDMsMTAsNCwxMCw1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCw2LDEwLDcsMTAsOCwxMCw5LDEwLDEwLDEwLDExLDEwLDEyLDEwLDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwxNCwxMCwxNSwxMCwxNiwxMSwwLDExLDEsMTEsMiwxMSwzLDExLDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLDUsMTEsNiwxMSw3LDExLDgsMTEsOSwxMSwxMCwxMSwxMSwxMSwxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsMTMsMTEsMTQsMTEsMTUsMTEsMTYsMTIsMCwxMiwxLDEyLDIsMTIsMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsNCwxMiw1LDEyLDYsMTIsNywxMiw4LDEyLDksMTIsMTAsMTIsMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLDEyLDEyLDEzLDEyLDE0LDEyLDE1LDEyLDE2LDEzLDAsMTMsMSwxMywyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywzLDEzLDQsMTMsNSwxMyw2LDEzLDcsMTMsOCwxMyw5LDEzLDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywxMSwxMywxMiwxMywxMywxMywxNCwxMywxNSwxMywxNiwxNCwwLDE0LDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LDIsMTQsMywxNCw0LDE0LDUsMTQsNiwxNCw3LDE0LDgsMTQsOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsMTAsMTQsMTEsMTQsMTIsMTQsMTMsMTQsMTQsMTQsMTUsMTQsMTYsMTUsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsMSwxNSwyLDE1LDMsMTUsNCwxNSw1LDE1LDYsMTUsNywxNSw4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSw5LDE1LDEwLDE1LDExLDE1LDEyLDE1LDEzLDE1LDE0LDE1LDE1LDE1LDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwwLDE2LDEsMTYsMiwxNiwzLDE2LDQsMTYsNSwxNiw2LDE2LDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LDgsMTYsOSwxNiwxMCwxNiwxMSwxNiwxMiwxNiwxMywxNiwxNCwxNiwxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsMTZ9OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYiAgICBxdWFudC4gdmFsIHRhYmxlICovCitjb25zdCBTQ0hBUiAgKmFRdWFudFRhYmxlW10gPSB7YVZhbFRhYjQxLCAgICAvKiAwICAgICAgICAgICAgIC0gICAgICAgICovICAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAxICAgICAgICAgICAgIDEgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAyICAgICAgICAgICAgIDEgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQyLCAgICAvKiAzICAgICAgICAgICAgIDIgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQyLCAgICAvKiA0ICAgICAgICAgICAgIDIgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIxLCAgICAvKiA1ICAgICAgICAgICAgIDMgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIxLCAgICAvKiA2ICAgICAgICAgICAgIDMgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIyLCAgICAvKiA3ICAgICAgICAgICAgIDQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIyLCAgICAvKiA4ICAgICAgICAgICAgIDQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIzLCAgICAvKiA5ICAgICAgICAgICAgIDUgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjIzLCAgICAvKiAxMCAgICAgICAgICAgIDUgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAxMSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAxMiAgICAgICAgICAgIC0gICAgICAgICovICAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAxMyAgICAgICAgICAgIC0gICAgICAgICovICAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAxNCAgICAgICAgICAgIC0gICAgICAgICovICAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjQxLCAgICAvKiAxNSAgICAgICAgICAgIC0gICAgICAgICovICAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAxNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAxNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAxOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAxOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyMSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyMiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyMyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyNCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyNSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAyOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0LCAgICAvKiAzMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbFRhYjI0fTsgICAvKiAzMSAgICAgICAgICAgIDYgICAgICAgICovCisKKy8qIGFycmF5cyBmb3IgSENSX1RBQkxFX0lORk8gc3RydWN0dXJlcyAqLworLyogbWF4aW11bSBsZW5ndGggb2YgY29kZXdvcmQgaW4gZWFjaCBjb2RlYm9vayAqLworLyogY29kZWJvb2s6ICAgICAgICAgICAgICAgICAgICAgMCwxLCAyLDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxICovCitjb25zdCBVQ0hBUiAgIGFNYXhDd0xlbltNQVhfQ0JdPXswLDExLDksMjAsMTYsMTMsMTEsMTQsMTIsMTcsMTQsNDksMCwgMCwgMCwgMCwgMTQsMTcsMjEsMjEsMjUsMjUsMjksMjksMjksMjksMzMsMzMsMzMsMzcsMzcsNDF9OworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMSAgMjMgIDI1ICAyNyAgMzkgIDMxICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgIDEyICAxNCAgMTYgIDE4ICAyMCAgMjIgIDI0ICAyNiAgMjggIDMwICAgICAgICovCitjb25zdCBVQ0hBUiAgIGFEaW1DYltNQVhfQ0JdICA9ICAgezIsNCw0LDQsNCwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMn07ICAgLyogY29kZWJvb2sgZGltZW5zaW9uIC0gemVybyBjYiBnb3QgYSBkaW1lbnNpb24gb2YgMiAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMSAgMjMgIDI1ICAyNyAgMzkgIDMxICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgIDEyICAxNCAgMTYgIDE4ICAyMCAgMjIgIDI0ICAyNiAgMjggIDMwICAgICAgICovCitjb25zdCBVQ0hBUiAgIGFEaW1DYlNoaWZ0W01BWF9DQl09ezEsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMX07ICAgLyogY29kZWJvb2sgZGltZW5zaW9uICovCisKKy8qICAgICAgICAgICAgICAgMSAtPiBkZWNvZGUgc2lnbiBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAwIC0+IGRlY29kZSBubyBzaWduIGJpdHMgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMSAgMjMgIDI1ICAyNyAgMzkgIDMxICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIENCOiAgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAgMTIgIDE0ICAxNiAgMTggIDIwICAyMiAgMjQgIDI2ICAyOCAgMzAgICAgICAgKi8KK2NvbnN0IFVDSEFSICAgYVNpZ25DYltNQVhfQ0JdPXswLDAsMCwxLDEsMCwwLDEsMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OworCisvKiBhcnJheXMgZm9yIEhDUl9DQl9QQUlSUyBzdHJ1Y3R1cmVzICovCitjb25zdCBVQ0hBUiAgIGFNaW5PZkNiUGFpcltNQVhfQ0JfUEFJUlNdPXswLDEsMyw1LDcsIDksMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMTF9OworY29uc3QgVUNIQVIgICBhTWF4T2ZDYlBhaXJbTUFYX0NCX1BBSVJTXT17MCwyLDQsNiw4LDEwLDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDExfTsKKworLyogcHJpb3JpdGllcyBvZiBjb2RlYm9va3MgKi8KK2NvbnN0IFVDSEFSICAgYUNiUHJpb3JpdHlbTUFYX0NCXT17MCwxLDEsMiwyLDMsMyw0LDQsNSw1LDIyLDAsMCwwLDAsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMX07CisKK2NvbnN0IFNDSEFSICAgYUNvZGVib29rMlN0YXJ0SW50W10gPSB7U1RPUF9USElTX1NUQVRFICAgICwgICAgLyogY2IgIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZICAgICAgICAgICwgICAgLyogY2IgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZICAgICAgICAgICwgICAgLyogY2IgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZICAgICAgICAgICwgICAgLyogY2IgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZICAgICAgICAgICwgICAgLyogY2IgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZICAgICwgICAgLyogY2IgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFICAgICwgICAgLyogY2IgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFICAgICwgICAgLyogY2IgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFICAgICwgICAgLyogY2IgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFICAgICwgICAgLyogY2IgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMTcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMTggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMTkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMjkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgICAgLyogY2IgMzAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWX07ICAgLyogY2IgMzEgKi8KKworY29uc3QgU1RBVEVGVU5DIGFTdGF0ZUNvbnN0YW50MlN0YXRlW10gPSB7TlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAgIC8qICAwID0gU1RPUF9USElTX1NUQVRFICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfT05MWSAgICAgICAgICAgICAgICAsICAgIC8qICAxID0gQk9EWV9PTkxZICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWSAgICAgICAgICAsICAgIC8qICAyID0gQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAsICAgIC8qICAzID0gQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAsICAgIC8qICA0ID0gQk9EWV9TSUdOX0VTQ19fQk9EWSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04gICAgICAsICAgIC8qICA1ID0gQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgsICAgIC8qICA2ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICB9OyAgIC8qICA3ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgICAqLworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4ICA5IDEwICAgICAgMTIgICAgMTQgICAgMTYgICAgMTggICAgMjAgICAgICAyMiAgICAgIDI0ICAgICAgMjYgICAgICAyOCAgICAgICAzMCAgICAgICAgICovCitjb25zdCBVU0hPUlQgYUxhcmdlc3RBYnNvbHV0ZVZhbHVlW01BWF9DQl09ezAsMSwxLDIsMiw0LDQsNyw3LDEyLDEyLDgxOTEsIDAsIDAsIDAsIDAsMTUsMzEsNDcsNjMsOTUsMTI3LDE1OSwxOTEsMjIzLDI1NSwzMTksMzgzLDUxMSw3NjcsMTAyMywyMDQ3fTsgLyogbGF2ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgMTMgICAgMTUgICAgMTcgICAgMTkgICAgIDIxICAgICAgMjMgICAgICAyNSAgICAgIDI3ICAgICAgMzkgICAgICAgMzEgICAgICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkZXNjcmlwdGlvbjogICAgVGhlIHRhYmxlICdIdWZmVHJlZVJ2bGNFc2NhcGUnIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3IgdGhlIHJ2bGMKKyAgICAgICAgICAgICAgICAgICBlc2NhcGUgc2VxdWVuY2VzLgorICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQKKyAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgIC0tPiAgaWYgc2V0IGNvZGV3b3JkIGlzIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlKQorICAgICAgICAgICAgICAgICAgIFRoZSBlc2NhcGUgc2VxdWVuY2UgaXMgdGhlIGluZGV4IHZhbHVlLgorCisgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQKKyAgIG91dHB1dDogICAgICAgICBpbmRleAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZVJ2bGNFc2NhcGVbNTNdID0geyAweDAwMjAwMSwweDQwMDAwMywweDQwMTAwNCwweDQwMjAwNSwweDQwMzAwNywweDQwNDAwNiwweDAwYTQwNSwweDAwOTAwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNDA2LDB4MDBjNDA3LDB4MDBkNDA4LDB4MDBlNDA5LDB4NDBiNDBhLDB4NDBjMDBmLDB4NDBkMDEwLDB4NDBlMDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MGYwMTIsMHg0MTAwMTMsMHg0MTEwMTQsMHg0MTIwMTUsMHgwMTY0MTMsMHg0MTQ0MTUsMHgwMTc0MTYsMHg0MTcwMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxOTAxOSwweDAxYTQxOCwweDAxYjQxYSwweDAxYzAyMywweDAzMjAxZCwweDAxZTAyMCwweDQzNTAxZiwweDQxYjQxYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDIyLDB4NDFkNDFlLDB4NDFmNDIwLDB4MDI0MDJiLDB4MDI1MDI4LDB4MDI2MDI3LDB4NDIxNDIyLDB4NDIzNDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwMmEsMHg0MjU0MjYsMHg0Mjc0MjgsMHgwMmMwMmYsMHgwMmQwMmUsMHg0Mjk0MmEsMHg0MmI0MmMsMHgwMzAwMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyZDQyZSwweDQyZjQzMCwweDAzMzAzNCwweDQzMTQzMiwweDQzMzQzNCB9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGRlc2NyaXB0aW9uOiAgICBUaGUgdGFibGUgJ0h1ZmZUcmVlUnZsYycgY29udGFpbnMgdGhlIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZSBmb3IgdGhlIFJWTEMKKyAgICAgICAgICAgICAgICAgICBzY2FsZSBmYWN0b3JzLiBUaGUgdGFibGUgY29udGFpbnMgMTUgYWxsb3dlZCwgc3ltbWV0cmljIGNvZGV3b3JkcyBhbmQgOAorICAgICAgICAgICAgICAgICAgIGZvcmJpZGRlbiBjb2Rld29yZHMsIHdoaWNoIGFyZSB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24uCisKKyAgIHVzYWdlIG9mIGJpdHM6ICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkCisgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAtLT4gIGlmIHNldCBjb2Rld29yZCBpcyBkZWNvZGVkCisgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUgd2l0aGluIHRoZSB0YWJsZSkgb3IgKGluZGV4KzcpLgorICAgICAgICAgICAgICAgICAgIFRoZSBkZWNvZGVkIChpbmRleCs3KSBpcyBpbiB0aGUgcmFuZ2UgZnJvbSAwLDEsLi4sMjIuIElmIHRoZSAoaW5kZXgrNykKKyAgICAgICAgICAgICAgICAgICBpcyBpbiB0aGUgcmFuZ2UgMTUsMTYsLi4sMjIsIHRoZW4gYSBmb3JiaWRkZW4gY29kZXdvcmQgaXMgZGVjb2RlZC4KKworICAgaW5wdXQ6ICAgICAgICAgIEEgc2luZ2xlIGJpdCBmcm9tIGEgUlZMQyBzY2FsZWZhY3RvciBjb2Rld29yZAorICAgb3V0cHV0OiAgICAgICAgIFtpZiBjb2Rld29yZCBpcyBub3QgY29tcGxldGVseSBkZWNvZGVkOl0gb2Zmc2V0IHRvIG5leHQgbm9kZSB3aXRoaW4gdGFibGUgb3IKKyAgICAgICAgICAgICAgICAgICBbaWYgY29kZXdvcmQgaXMgZGVjb2RlZDpdIEEgZHBjbSB2YWx1ZSBpLmUuIChpbmRleCs3KSBpbiByYW5nZSBmcm9tIDAsMSwuLiwyMi4KKyAgICAgICAgICAgICAgICAgICBUaGUgZGlmZmVyZW50aWFsIHNjYWxlZmFjdG9yIChEUENNIHZhbHVlKSBuYW1lZCAnaW5kZXgnIGlzIGNhbGN1bGF0ZWQgYnkKKyAgICAgICAgICAgICAgICAgICBzdWJ0cmFjdGluZyA3IGZyb20gdGhlIGRlY29kZWQgdmFsdWUgKGluZGV4KzcpLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBVSU5UIGFIdWZmVHJlZVJ2bENvZGV3ZHNbMjJdID0geyAweDQwNzAwMSwweDAwMjAwOSwweDAwMzQwNiwweDAwNDQwNSwweDAwNTQwNCwweDAwNjQwMywweDAwNzQwMCwweDAwODQwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDExNDAxLDB4MDBhNDA4LDB4MDBjMDBiLDB4MDBlNDA5LDB4MDEwMDBkLDB4NDBmNDBhLDB4NDE0MDBmLDB4MDEzNDBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTEwMTUsMHg0MTAwMTIsMHg0MTI0MGMsMHg0MTYwMTQsMHg0MTU0MGQsMHg0MTM0MGUgfTsKKworCisKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNTEyWzE1MzZdID0geworLyogcGFydCAwICovCitXVEMoMHhkYWM5ODRjMCksIFdUQygweGRiMTAwMDgwKSwgV1RDKDB4ZGI1NmNkMDApLCBXVEMoMHhkYjlkZWM0MCksIFdUQygweGRiZTU1ZmMwKSwgV1RDKDB4ZGMyZDI4ODApLCBXVEMoMHhkYzc1NDc4MCksIFdUQygweGRjYmRiZDgwKSwKK1dUQygweGRkMDY4YTgwKSwgV1RDKDB4ZGQ0ZmFlODApLCBXVEMoMHhkZDk5Mjk0MCksIFdUQygweGRkZTJmOWMwKSwgV1RDKDB4ZGUyZDFmYzApLCBXVEMoMHhkZTc3OWE4MCksIFdUQygweGRlYzI2YTAwKSwgV1RDKDB4ZGYwZDhlMDApLAorV1RDKDB4ZGY1OTA2ODApLCBXVEMoMHhkZmE0ZDU0MCksIFdUQygweGRmZjBmYzgwKSwgV1RDKDB4ZTAzZDdlMjApLCBXVEMoMHhlMDhhNTkwMCksIFdUQygweGUwZDc4YTIwKSwgV1RDKDB4ZTEyNTBjYzApLCBXVEMoMHhlMTcyZGNjMCksCitXVEMoMHhlMWMwZjdhMCksIFdUQygweGUyMGY1OWEwKSwgV1RDKDB4ZTI1ZGZlYTApLCBXVEMoMHhlMmFjZTQwMCksIFdUQygweGUyZmMwYmUwKSwgV1RDKDB4ZTM0YjdiYzApLCBXVEMoMHhlMzliM2M4MCksIFdUQygweGUzZWI1MjYwKSwKK1dUQygweGU0M2JiYWMwKSwgV1RDKDB4ZTQ4YzcxNjApLCBXVEMoMHhlNGRkNzE0MCksIFdUQygweGU1MmViNjAwKSwgV1RDKDB4ZTU4MDNjMDApLCBXVEMoMHhlNWQxZmRhMCksIFdUQygweGU2MjNmMzYwKSwgV1RDKDB4ZTY3NjE3MDApLAorV1RDKDB4ZTZjODY0MDApLCBXVEMoMHhlNzFhZDUwMCksIFdUQygweGU3NmQ2M2UwKSwgV1RDKDB4ZTdjMDBiYTApLCBXVEMoMHhlODEyYzhlMCksIFdUQygweGU4NjU5OGUwKSwgV1RDKDB4ZThiODc4ZTApLCBXVEMoMHhlOTBiNjhhMCksCitXVEMoMHhlOTVlNmM0MCksIFdUQygweGU5YjE4YWUwKSwgV1RDKDB4ZWEwNGNlODApLCBXVEMoMHhlYTU4M2JhMCksIFdUQygweGVhYWJjZGEwKSwgV1RDKDB4ZWFmZjdlZTApLCBXVEMoMHhlYjUzNDhlMCksIFdUQygweGViYTcyMmMwKSwKK1dUQygweGViZmIwMDYwKSwgV1RDKDB4ZWM0ZWQyNDApLCBXVEMoMHhlY2EyODU0MCksIFdUQygweGVjZjYwYzIwKSwgV1RDKDB4ZWQ0OTYxMjApLCBXVEMoMHhlZDljN2U4MCksIFdUQygweGVkZWY1ZTQwKSwgV1RDKDB4ZWU0MWZjMDApLAorV1RDKDB4ZWU5NDU2MDApLCBXVEMoMHhlZWU2NmFjMCksIFdUQygweGVmMzgzOWEwKSwgV1RDKDB4ZWY4OWMwZTApLCBXVEMoMHhlZmRhZmRhMCksIFdUQygweGYwMmJlZDYwKSwgV1RDKDB4ZjA3YzhlODApLCBXVEMoMHhmMGNjZTAwMCksCitXVEMoMHhmMTFjZTIyMCksIFdUQygweGYxNmM5NjIwKSwgV1RDKDB4ZjFiYmZlMzApLCBXVEMoMHhmMjBiMTllMCksIFdUQygweGYyNTllNWEwKSwgV1RDKDB4ZjJhODVkYzApLCBXVEMoMHhmMmY2N2VkMCksIFdUQygweGYzNDQ0NWIwKSwKK1dUQygweGYzOTFhZWQwKSwgV1RDKDB4ZjNkZWI1OTApLCBXVEMoMHhmNDJiNTNlMCksIFdUQygweGY0Nzc4MTQwKSwgV1RDKDB4ZjRjMzMxOTApLCBXVEMoMHhmNTBlNTY2MCksIFdUQygweGY1NThkZjMwKSwgV1RDKDB4ZjVhMmJlNTApLAorV1RDKDB4ZjVlYmVhMTApLCBXVEMoMHhmNjM0NTc4MCksIFdUQygweGY2N2JmYWIwKSwgV1RDKDB4ZjZjMmNlZTApLCBXVEMoMHhmNzA4ZDdiMCksIFdUQygweGY3NGUxOWMwKSwgV1RDKDB4Zjc5MjlhNzApLCBXVEMoMHhmN2Q2NjYzMCksCitXVEMoMHhmODE5OTI2OCksIFdUQygweGY4NWMzODYwKSwgV1RDKDB4Zjg5ZTc0ODApLCBXVEMoMHhmOGUwNThjMCksIFdUQygweGY5MjFlYzA4KSwgV1RDKDB4Zjk2MzM4MDApLCBXVEMoMHhmOWE0NDk4MCksIFdUQygweGY5ZTUzMTU4KSwKK1dUQygweGZhMjYwMTU4KSwgV1RDKDB4ZmE2NmNhMTgpLCBXVEMoMHhmYWE3OWFjMCksIFdUQygweGZhZTg3OTIwKSwgV1RDKDB4ZmIyOTVmYTApLCBXVEMoMHhmYjZhNDJiOCksIFdUQygweGZiYWIxMjQwKSwgV1RDKDB4ZmJlYmQxYzApLAorV1RDKDB4ZmMyYzljMjQpLCBXVEMoMHhmYzZkOGQ5MCksIFdUQygweGZjYWVjMjQwKSwgV1RDKDB4ZmNmMDU2ODQpLCBXVEMoMHhmZDMyNmE5OCksIFdUQygweGZkNzUyNTRjKSwgV1RDKDB4ZmRiOGFmZDQpLCBXVEMoMHhmZGZjY2RmYyksCitXVEMoMHhmZTQwZDY5NCksIFdUQygweGZlODQxNjFjKSwgV1RDKDB4ZmVjNWNmNWEpLCBXVEMoMHhmZjA0ZTdmYyksIFdUQygweGZmM2ZkZmUzKSwgV1RDKDB4ZmY3NTFkZGYpLCBXVEMoMHhmZmEyZmIwZiksIFdUQygweGZmYzg3YzQyKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4YmZmYjYwODEpLCBXVEMoMHhiZmYyMmY4MSksIFdUQygweGJmZThmYzAxKSwgV1RDKDB4YmZkZmM3ODEpLCBXVEMoMHhiZmQ2OTEwMSksIFdUQygweGJmY2Q1YTAxKSwgV1RDKDB4YmZjNDIyMDEpLCBXVEMoMHhiZmJhZTk4MSksCitXVEMoMHhiZmIxYjEwMSksIFdUQygweGJmYTg3OTAxKSwgV1RDKDB4YmY5ZjQxODEpLCBXVEMoMHhiZjk2MGIwMSksIFdUQygweGJmOGNkNDgxKSwgV1RDKDB4YmY4MzlkODEpLCBXVEMoMHhiZjdhNjY4MSksIFdUQygweGJmNzEyZjAxKSwKK1dUQygweGJmNjdmODAxKSwgV1RDKDB4YmY1ZWMxMDEpLCBXVEMoMHhiZjU1OGIwMSksIFdUQygweGJmNGM1NjgxKSwgV1RDKDB4YmY0MzIyODEpLCBXVEMoMHhiZjM5ZWU4MSksIFdUQygweGJmMzBiYjAxKSwgV1RDKDB4YmYyNzg4MDEpLAorV1RDKDB4YmYxZTU1MDEpLCBXVEMoMHhiZjE1MjM4MSksIFdUQygweGJmMGJmMzgxKSwgV1RDKDB4YmYwMmM1ODEpLCBXVEMoMHhiZWY5OTkwMSksIFdUQygweGJlZjA2ZDAxKSwgV1RDKDB4YmVlNzQyODEpLCBXVEMoMHhiZWRlMTkwMSksCitXVEMoMHhiZWQ0ZjA4MSksIFdUQygweGJlY2JjYTgxKSwgV1RDKDB4YmVjMmE3ODEpLCBXVEMoMHhiZWI5ODY4MSksIFdUQygweGJlYjA2ODgxKSwgV1RDKDB4YmVhNzRjODEpLCBXVEMoMHhiZTllMzI4MSksIFdUQygweGJlOTUxYTgxKSwKK1dUQygweGJlOGMwNTAxKSwgV1RDKDB4YmU4MmYzMDEpLCBXVEMoMHhiZTc5ZTQ4MSksIFdUQygweGJlNzBkYTAxKSwgV1RDKDB4YmU2N2QzODEpLCBXVEMoMHhiZTVlZDA4MSksIFdUQygweGJlNTVkMDAxKSwgV1RDKDB4YmU0Y2QzODEpLAorV1RDKDB4YmU0M2RhODEpLCBXVEMoMHhiZTNhZTYwMSksIFdUQygweGJlMzFmNzAxKSwgV1RDKDB4YmUyOTBkMDEpLCBXVEMoMHhiZTIwMjgwMSksIFdUQygweGJlMTc0NzgxKSwgV1RDKDB4YmUwZTZjMDEpLCBXVEMoMHhiZTA1OTQ4MSksCitXVEMoMHhiZGZjYzMwMSksIFdUQygweGJkZjNmNzAxKSwgV1RDKDB4YmRlYjMxMDEpLCBXVEMoMHhiZGUyNzIwMSksIFdUQygweGJkZDliOTgxKSwgV1RDKDB4YmRkMTA2ODEpLCBXVEMoMHhiZGM4NTk4MSksIFdUQygweGJkYmZiMjgxKSwKK1dUQygweGJkYjcxMjAxKSwgV1RDKDB4YmRhZTc4ODEpLCBXVEMoMHhiZGE1ZTYwMSksIFdUQygweGJkOWQ1YjgxKSwgV1RDKDB4YmQ5NGQ4MDEpLCBXVEMoMHhiZDhjNWMwMSksIFdUQygweGJkODNlNjgxKSwgV1RDKDB4YmQ3Yjc3ODEpLAorV1RDKDB4YmQ3MzEwODEpLCBXVEMoMHhiZDZhYjEwMSksIFdUQygweGJkNjI1OTgxKSwgV1RDKDB4YmQ1YTBiMDEpLCBXVEMoMHhiZDUxYzQ4MSksIFdUQygweGJkNDk4NjAxKSwgV1RDKDB4YmQ0MTRmMDEpLCBXVEMoMHhiZDM5MWY4MSksCitXVEMoMHhiZDMwZjg4MSksIFdUQygweGJkMjhkOTgxKSwgV1RDKDB4YmQyMGM0MDEpLCBXVEMoMHhiZDE4Yjc4MSksIFdUQygweGJkMTBiMzgxKSwgV1RDKDB4YmQwOGI3ODEpLCBXVEMoMHhiZDAwYzM4MSksIFdUQygweGJjZjhkNzgxKSwKK1dUQygweGJjZjBmMzgxKSwgV1RDKDB4YmNlOTE4MDEpLCBXVEMoMHhiY2UxNDYwMSksIFdUQygweGJjZDk3YzgxKSwgV1RDKDB4YmNkMWJiODEpLCBXVEMoMHhiY2NhMDMwMSksIFdUQygweGJjYzI1MTgxKSwgV1RDKDB4YmNiYWE4MDEpLAorV1RDKDB4YmNiMzA2MDEpLCBXVEMoMHhiY2FiNmMwMSksIFdUQygweGJjYTNkYjAxKSwgV1RDKDB4YmM5YzUyODEpLCBXVEMoMHhiYzk0ZDIwMSksIFdUQygweGJjOGQ1OTAxKSwgV1RDKDB4YmM4NWU4MDEpLCBXVEMoMHhiYzdlN2UwMSksCitXVEMoMHhiYzc3MWMwMSksIFdUQygweGJjNmZjMTAxKSwgV1RDKDB4YmM2ODZlMDEpLCBXVEMoMHhiYzYxMjMwMSksIFdUQygweGJjNTlkZjgxKSwgV1RDKDB4YmM1MmEzODEpLCBXVEMoMHhiYzRiNmU4MSksIFdUQygweGJjNDQ0MDgxKSwKK1dUQygweGJjM2QxODAxKSwgV1RDKDB4YmMzNWY1MDEpLCBXVEMoMHhiYzJlZDY4MSksIFdUQygweGJjMjdiZDgxKSwgV1RDKDB4YmMyMGFlMDEpLCBXVEMoMHhiYzE5YWIwMSksIFdUQygweGJjMTJiODAxKSwgV1RDKDB4YmMwYmNmODEpLAorV1RDKDB4YmMwNGUzODEpLCBXVEMoMHhiYmZkZTQ4MSksIFdUQygweGJiZjZjNjAxKSwgV1RDKDB4YmJlZjliODEpLCBXVEMoMHhiYmU4OTkwMSksIFdUQygweGJiZTFmNDAxKSwgV1RDKDB4YmJkYmUyMDEpLCBXVEMoMHhiYmQ2OGM4MSksCitXVEMoMHhiYmQyMTI4MSksIFdUQygweGJiY2U5MTgxKSwgV1RDKDB4YmJjYzI2ODEpLCBXVEMoMHhiYmNhY2EwMSksIFdUQygweGJiY2E1MDgxKSwgV1RDKDB4YmJjYThkMDEpLCBXVEMoMHhiYmNiNTMwMSksIFdUQygweGJiY2M4MjAxKSwKK1dUQygweGJiY2UwNjAxKSwgV1RDKDB4YmJjZmNhODEpLCBXVEMoMHhiYmQxYmQ4MSksIFdUQygweGJiZDNlMTAxKSwgV1RDKDB4YmJkNjRkMDEpLCBXVEMoMHhiYmQ5MWI4MSksIFdUQygweGJiZGM2NDgxKSwgV1RDKDB4YmJlMDM4MDEpLAorV1RDKDB4YmJlNDlkMDEpLCBXVEMoMHhiYmU5OTk4MSksIFdUQygweGJiZWYzMzAxKSwgV1RDKDB4YmJmNTYxODEpLCBXVEMoMHhiYmZjMGY4MSksIFdUQygweGJjMDMyNjAxKSwgV1RDKDB4YmMwYThmMDEpLCBXVEMoMHhiYzEyM2I4MSksCitXVEMoMHhiYzFhMjQwMSksIFdUQygweGJjMjI0MTgxKSwgV1RDKDB4YmMyYThjODEpLCBXVEMoMHhiYzMzMDc4MSksIFdUQygweGJjM2JiYzAxKSwgV1RDKDB4YmM0NGI0ODEpLCBXVEMoMHhiYzRkZmI4MSksIFdUQygweGJjNTdhMzAxKSwKK1dUQygweGJjNjFjNDAxKSwgV1RDKDB4YmM2Yzc3ODEpLCBXVEMoMHhiYzc3ZDYwMSksIFdUQygweGJjODNmMjAxKSwgV1RDKDB4YmM5MGQ0ODEpLCBXVEMoMHhiYzllODgwMSksIFdUQygweGJjYWQxNTAxKSwgV1RDKDB4YmNiYzdlMDEpLAorV1RDKDB4YmNjY2JkMDEpLCBXVEMoMHhiY2RkY2M4MSksIFdUQygweGJjZWZhNjAxKSwgV1RDKDB4YmQwMjNmMDEpLCBXVEMoMHhiZDE1ODgwMSksIFdUQygweGJkMjk3MTgxKSwgV1RDKDB4YmQzZGViODEpLCBXVEMoMHhiZDUyZWIwMSksCitXVEMoMHhiZDY4NjY4MSksIFdUQygweGJkN2U1NTgxKSwgV1RDKDB4YmQ5NGIwMDEpLCBXVEMoMHhiZGFiNzE4MSksIFdUQygweGJkYzI5YTgxKSwgV1RDKDB4YmRkYTJhMDEpLCBXVEMoMHhiZGYyMjE4MSksIFdUQygweGJlMGE4NTgxKSwKK1dUQygweGJlMjM2MDAxKSwgV1RDKDB4YmUzY2JjMDEpLCBXVEMoMHhiZTU2YTM4MSksIFdUQygweGJlNzEyMDAxKSwgV1RDKDB4YmU4YzM3ODEpLCBXVEMoMHhiZWE3ZjMwMSksIFdUQygweGJlYzQ1ODgxKSwgV1RDKDB4YmVlMTcyMDEpLAorV1RDKDB4YmVmZjQ4MDEpLCBXVEMoMHhiZjFkZTYwMSksIFdUQygweGJmM2Q1NTAxKSwgV1RDKDB4YmY1ZDlhODEpLCBXVEMoMHhiZjdlYjU4MSksIFdUQygweGJmYTBhNTgxKSwgV1RDKDB4YmZjMzZhMDEpLCBXVEMoMHhiZmU2ZWQwMSksCitXVEMoMHhjMDBiMDRjMCksIFdUQygweGMwMmY4NmMwKSwgV1RDKDB4YzA1NDQ5NDApLCBXVEMoMHhjMDc5MmVjMCksIFdUQygweGMwOWUyNjQwKSwgV1RDKDB4YzBjMzFmMDApLCBXVEMoMHhjMGU4MGEwMCksIFdUQygweGMxMGNmNDgwKSwKK1dUQygweGMxMzIwOTQwKSwgV1RDKDB4YzE1NzczYzApLCBXVEMoMHhjMTdkNWYwMCksIFdUQygweGMxYTNlMzQwKSwgV1RDKDB4YzFjYjA1YzApLCBXVEMoMHhjMWYyY2JjMCksIFdUQygweGMyMWIzOTQwKSwgV1RDKDB4YzI0NDRiMDApLAorV1RDKDB4YzI2ZGY1YzApLCBXVEMoMHhjMjk4MmQ4MCksIFdUQygweGMyYzJlNjQwKSwgV1RDKDB4YzJlZTBhMDApLCBXVEMoMHhjMzE5Nzk0MCksIFdUQygweGMzNDUxM2MwKSwgV1RDKDB4YzM3MGI5YzApLCBXVEMoMHhjMzljNGYwMCksCitXVEMoMHhjM2M3YmMwMCksIFdUQygweGMzZjJlOTQwKSwgV1RDKDB4YzQxZGMxNDApLCBXVEMoMHhjNDQ4NTZjMCksIFdUQygweGM0NzJlNjQwKSwgV1RDKDB4YzQ5ZGFkODApLCBXVEMoMHhjNGM4ZTg4MCksIFdUQygweGM0ZjRhY2MwKSwKK1dUQygweGM1MjBlODQwKSwgV1RDKDB4YzU0ZDg3ODApLCBXVEMoMHhjNTdhNzZjMCksIFdUQygweGM1YTc5NjQwKSwgV1RDKDB4YzVkNGJhYzApLCBXVEMoMHhjNjAxYjg4MCksIFdUQygweGM2MmU2NTgwKSwgV1RDKDB4YzY1YWI2MDApLAorV1RDKDB4YzY4NmJkNDApLCBXVEMoMHhjNmIyOGZjMCksIFdUQygweGM2ZGU0MWMwKSwgV1RDKDB4YzcwOWRlNDApLCBXVEMoMHhjNzM1NjY0MCksIFdUQygweGM3NjBkYTgwKSwgV1RDKDB4Yzc4YzNjNDApLCBXVEMoMHhjN2I3ODY0MCksCitXVEMoMHhjN2UyYWZjMCksIFdUQygweGM4MGRhZTgwKSwgV1RDKDB4YzgzODc4YzApLCBXVEMoMHhjODYzMDRjMCksIFdUQygweGM4OGQ0OTAwKSwgV1RDKDB4YzhiNzNiODApLCBXVEMoMHhjOGUwZDI4MCksIFdUQygweGM5MGEwNDQwKSwKKy8qIHBhcnQgMSAqLworV1RDKDB4YjUyMTJlODEpLCBXVEMoMHhiNDk1OTUwMSksIFdUQygweGI0MGFiNTAxKSwgV1RDKDB4YjM4MDhkODEpLCBXVEMoMHhiMmY3MWYwMSksIFdUQygweGIyNmU2ODgxKSwgV1RDKDB4YjFlNjZhMDEpLCBXVEMoMHhiMTVmMjM4MSksCitXVEMoMHhiMGQ4OTQwMSksIFdUQygweGIwNTJiYzAxKSwgV1RDKDB4YWZjZDlhODEpLCBXVEMoMHhhZjQ5MmYwMSksIFdUQygweGFlYzU3ODAxKSwgV1RDKDB4YWU0Mjc0ODEpLCBXVEMoMHhhZGMwMjI4MSksIFdUQygweGFkM2U4MTAxKSwKK1dUQygweGFjYmQ5MDgxKSwgV1RDKDB4YWMzZDUwMDEpLCBXVEMoMHhhYmJkYzAwMSksIFdUQygweGFiM2VkZjAxKSwgV1RDKDB4YWFjMGFkMDEpLCBXVEMoMHhhYTQzMjk4MSksIFdUQygweGE5YzY1NDAxKSwgV1RDKDB4YTk0YTJjMDEpLAorV1RDKDB4YThjZWIyMDEpLCBXVEMoMHhhODUzZTUwMSksIFdUQygweGE3ZDljNjgxKSwgV1RDKDB4YTc2MDU2MDEpLCBXVEMoMHhhNmU3OTQwMSksIFdUQygweGE2NmY4MjAxKSwgV1RDKDB4YTVmODFmODEpLCBXVEMoMHhhNTgxNmU4MSksCitXVEMoMHhhNTBiNmU4MSksIFdUQygweGE0OTYyMTgxKSwgV1RDKDB4YTQyMTg4MDEpLCBXVEMoMHhhM2FkYTI4MSksIFdUQygweGEzM2E3MjAxKSwgV1RDKDB4YTJjN2Y4MDEpLCBXVEMoMHhhMjU2MzUwMSksIFdUQygweGExZTUyYTgxKSwKK1dUQygweGExNzRkYTgxKSwgV1RDKDB4YTEwNTQ3MDEpLCBXVEMoMHhhMDk2NzIwMSksIFdUQygweGEwMjg1ZDgxKSwgV1RDKDB4OWZiYjA5ODEpLCBXVEMoMHg5ZjRlNzgwMSksIFdUQygweDllZTJhOTAxKSwgV1RDKDB4OWU3NzlmODEpLAorV1RDKDB4OWUwZDVlMDEpLCBXVEMoMHg5ZGEzZTYwMSksIFdUQygweDlkM2IzYjgxKSwgV1RDKDB4OWNkMzVmODEpLCBXVEMoMHg5YzZjNTQ4MSksIFdUQygweDljMDYxYjgxKSwgV1RDKDB4OWJhMGI3MDEpLCBXVEMoMHg5YjNjMjgwMSksCitXVEMoMHg5YWQ4NzA4MSksIFdUQygweDlhNzU5MzAxKSwgV1RDKDB4OWExMzkxMDEpLCBXVEMoMHg5OWIyNmM4MSksIFdUQygweDk5NTIyODAxKSwgV1RDKDB4OThmMmM2MDEpLCBXVEMoMHg5ODk0NDkwMSksIFdUQygweDk4MzZiMjAxKSwKK1dUQygweDk3ZGEwNDgxKSwgV1RDKDB4OTc3ZTQxODEpLCBXVEMoMHg5NzIzNmIwMSksIFdUQygweDk2Yzk4MzgxKSwgV1RDKDB4OTY3MDhiODEpLCBXVEMoMHg5NjE4ODUwMSksIFdUQygweDk1YzE3MDgxKSwgV1RDKDB4OTU2YjRmODEpLAorV1RDKDB4OTUxNjIzODEpLCBXVEMoMHg5NGMxZWUwMSksIFdUQygweDk0NmVhZjgxKSwgV1RDKDB4OTQxYzY5MDEpLCBXVEMoMHg5M2NiMWM4MSksIFdUQygweDkzN2FjYjAxKSwgV1RDKDB4OTMyYjc1MDEpLCBXVEMoMHg5MmRkMWIwMSksCitXVEMoMHg5MjhmYmUwMSksIFdUQygweDkyNDM1ZDAxKSwgV1RDKDB4OTFmN2Y5ODEpLCBXVEMoMHg5MWFkOTI4MSksIFdUQygweDkxNjQyNzgxKSwgV1RDKDB4OTExYmI5ODEpLCBXVEMoMHg5MGQ0NDc4MSksIFdUQygweDkwOGRkMTAxKSwKK1dUQygweDkwNDg1NDAxKSwgV1RDKDB4OTAwM2NlODEpLCBXVEMoMHg4ZmMwM2YwMSksIFdUQygweDhmN2RhNDAxKSwgV1RDKDB4OGYzYmZiMDEpLCBXVEMoMHg4ZWZiNDE4MSksIFdUQygweDhlYmI3NTgxKSwgV1RDKDB4OGU3YzkzMDEpLAorV1RDKDB4OGUzZTk0ODEpLCBXVEMoMHg4ZTAxNzU4MSksIFdUQygweDhkYzUzMDAxKSwgV1RDKDB4OGQ4OWJlODEpLCBXVEMoMHg4ZDRmMWIwMSksIFdUQygweDhkMTU0MDgxKSwgV1RDKDB4OGNkYzI5MDEpLCBXVEMoMHg4Y2EzY2IwMSksCitXVEMoMHg4YzZjMWIwMSksIFdUQygweDhjMzUwZDAxKSwgV1RDKDB4OGJmZTk0MDEpLCBXVEMoMHg4YmM4YTQwMSksIFdUQygweDhiOTMzMDAxKSwgV1RDKDB4OGI1ZTJjODEpLCBXVEMoMHg4YjI5OGI4MSksIFdUQygweDhhZjUzZTgxKSwKK1dUQygweDhhYzEzMzgxKSwgV1RDKDB4OGE4ZDU4MDEpLCBXVEMoMHg4YTU5OWE4MSksIFdUQygweDhhMjVmMzAxKSwgV1RDKDB4ODlmMjYxMDEpLCBXVEMoMHg4OWJlZTU4MSksIFdUQygweDg5OGI4MzAxKSwgV1RDKDB4ODk1ODY5MDEpLAorV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGY0NzkwMSksIFdUQygweDg4YzQ1ZTgxKSwgV1RDKDB4ODg5NjI5ODEpLCBXVEMoMHg4ODZhOGE4MSksIFdUQygweDg4NDIzMzAxKSwgV1RDKDB4ODgxZGQzMDEpLCBXVEMoMHg4N2ZkZDc4MSksCitXVEMoMHg4N2QwY2E4MSksIFdUQygweDg3Yzc2MjAxKSwgV1RDKDB4ODdiY2FiODEpLCBXVEMoMHg4N2IwZWYwMSksIFdUQygweDg3YTQ4YjAxKSwgV1RDKDB4ODc5N2RkODEpLCBXVEMoMHg4NzhiNDMwMSksIFdUQygweDg3N2VkZTAxKSwKK1dUQygweDg3NzI5NzAxKSwgV1RDKDB4ODc2NjU0ODEpLCBXVEMoMHg4NzU5ZmQwMSksIFdUQygweDg3NGQ4NjgxKSwgV1RDKDB4ODc0MGY2ODEpLCBXVEMoMHg4NzM0NTM4MSksIFdUQygweDg3MjdhMzgxKSwgV1RDKDB4ODcxYWU5ODEpLAorV1RDKDB4ODcwZTIzMDEpLCBXVEMoMHg4NzAxNGY4MSksIFdUQygweDg2ZjQ2ZDgxKSwgV1RDKDB4ODZlNzdiODEpLCBXVEMoMHg4NmRhNzkwMSksIFdUQygweDg2Y2Q2NjgxKSwgV1RDKDB4ODZjMDQzODEpLCBXVEMoMHg4NmIzMGYwMSksCitXVEMoMHg4NmE1Y2E4MSksIFdUQygweDg2OTg3NTgxKSwgV1RDKDB4ODY4YjEwMDEpLCBXVEMoMHg4NjdkOWE4MSksIFdUQygweDg2NzAxMzgxKSwgV1RDKDB4ODY2MjdiMDEpLCBXVEMoMHg4NjU0ZDAwMSksIFdUQygweDg2NDcxMjgxKSwKK1dUQygweDg2Mzk0MzAxKSwgV1RDKDB4ODYyYjYyMDEpLCBXVEMoMHg4NjFkNzA4MSksIFdUQygweDg2MGY2ZTAxKSwgV1RDKDB4ODYwMTU5ODEpLCBXVEMoMHg4NWYzMzI4MSksIFdUQygweDg1ZTRmODAxKSwgV1RDKDB4ODVkNmE5ODEpLAorV1RDKDB4ODVjODQ4MDEpLCBXVEMoMHg4NWI5ZDQ4MSksIFdUQygweDg1YWI0ZjAxKSwgV1RDKDB4ODU5Y2I3ODEpLCBXVEMoMHg4NThlMGUwMSksIFdUQygweDg1N2Y1MTAxKSwgV1RDKDB4ODU3MDdmODEpLCBXVEMoMHg4NTYxOWEwMSksCitXVEMoMHg4NTUyYTE4MSksIFdUQygweDg1NDM5NjAxKSwgV1RDKDB4ODUzNDc5MDEpLCBXVEMoMHg4NTI1NGE4MSksIFdUQygweDg1MTYwOTgxKSwgV1RDKDB4ODUwNmI1ODEpLCBXVEMoMHg4NGY3NGUwMSksIFdUQygweDg0ZTdkMzgxKSwKK1dUQygweDg0ZDg0NjAxKSwgV1RDKDB4ODRjOGE3MDEpLCBXVEMoMHg4NGI4ZjgwMSksIFdUQygweDg0YTkzODAxKSwgV1RDKDB4ODQ5OTY3MDEpLCBXVEMoMHg4NDg5ODQ4MSksIFdUQygweDg0Nzk4ZjgxKSwgV1RDKDB4ODQ2OTg4ODEpLAorV1RDKDB4ODQ1OTcwODEpLCBXVEMoMHg4NDQ5NDg4MSksIFdUQygweDg0MzkxMDgxKSwgV1RDKDB4ODQyOGNhMDEpLCBXVEMoMHg4NDE4NzQwMSksIFdUQygweDg0MDgwZDgxKSwgV1RDKDB4ODNmNzk2ODEpLCBXVEMoMHg4M2U3MGYwMSksCitXVEMoMHg4M2Q2Nzg4MSksIFdUQygweDgzYzVkMzgxKSwgV1RDKDB4ODNiNTIxMDEpLCBXVEMoMHg4M2E0NjE4MSksIFdUQygweDgzOTM5NTAxKSwgV1RDKDB4ODM4MmJhMDEpLCBXVEMoMHg4MzcxZDA4MSksIFdUQygweDgzNjBkOTAxKSwKK1dUQygweDgzNGZkNDgxKSwgV1RDKDB4ODMzZWMzODEpLCBXVEMoMHg4MzJkYTc4MSksIFdUQygweDgzMWM4MTAxKSwgV1RDKDB4ODMwYjRmODEpLCBXVEMoMHg4MmZhMTE4MSksIFdUQygweDgyZThjODAxKSwgV1RDKDB4ODJkNzcyMDEpLAorV1RDKDB4ODJjNjExMDEpLCBXVEMoMHg4MmI0YTYwMSksIFdUQygweDgyYTMzMjgxKSwgV1RDKDB4ODI5MWI2MDEpLCBXVEMoMHg4MjgwMzEwMSksIFdUQygweDgyNmVhMjAxKSwgV1RDKDB4ODI1ZDA5MDEpLCBXVEMoMHg4MjRiNjYwMSksCitXVEMoMHg4MjM5Yjk4MSksIFdUQygweDgyMjgwNTgxKSwgV1RDKDB4ODIxNjRhODEpLCBXVEMoMHg4MjA0ODg4MSksIFdUQygweDgxZjJiZjgxKSwgV1RDKDB4ODFlMGVlODEpLCBXVEMoMHg4MWNmMTU4MSksIFdUQygweDgxYmQzNDAxKSwKK1dUQygweDgxYWI0YjAxKSwgV1RDKDB4ODE5OTVjMDEpLCBXVEMoMHg4MTg3Njc4MSksIFdUQygweDgxNzU2ZDgxKSwgV1RDKDB4ODE2MzZkODEpLCBXVEMoMHg4MTUxNjcwMSksIFdUQygweDgxM2Y1OTgxKSwgV1RDKDB4ODEyZDQ0ODEpLAorV1RDKDB4ODExYjI5ODEpLCBXVEMoMHg4MTA5MDk4MSksIFdUQygweDgwZjZlNDgxKSwgV1RDKDB4ODBlNGJiODEpLCBXVEMoMHg4MGQyOGQ4MSksIFdUQygweDgwYzA1YTAxKSwgV1RDKDB4ODBhZTFmODEpLCBXVEMoMHg4MDliZGYwMSksCitXVEMoMHg4MDg5OTg4MSksIFdUQygweDgwNzc0YzgxKSwgV1RDKDB4ODA2NGZjODEpLCBXVEMoMHg4MDUyYTg4MSksIFdUQygweDgwNDA1MTAxKSwgV1RDKDB4ODAyZGY3MDEpLCBXVEMoMHg4MDFiOWIwMSksIFdUQygweDgwMDkzZTAxKSwKK1dUQygweDBhNzRiMTIwKSwgV1RDKDB4MGFhMDhhOTApLCBXVEMoMHgwYWNkMmI4MCksIFdUQygweDBhZmE4ODYwKSwgV1RDKDB4MGIyODk1OTApLCBXVEMoMHgwYjU3NDc5MCksIFdUQygweDBiODY5MmQwKSwgV1RDKDB4MGJiNjZiYjApLAorV1RDKDB4MGJlNmM2YjApLCBXVEMoMHgwYzE3OTgzMCksIFdUQygweDBjNDhkNTAwKSwgV1RDKDB4MGM3YTdhZDApLCBXVEMoMHgwY2FjOTAwMCksIFdUQygweDBjZGYxYjYwKSwgV1RDKDB4MGQxMjIzOTApLCBXVEMoMHgwZDQ1YThmMCksCitXVEMoMHgwZDc5YTVlMCksIFdUQygweDBkYWUxNDgwKSwgV1RDKDB4MGRlMmVmMzApLCBXVEMoMHgwZTE4MzgwMCksIFdUQygweDBlNGRmOGMwKSwgV1RDKDB4MGU4NDNiOTApLCBXVEMoMHgwZWJiMGEyMCksIFdUQygweDBlZjI2NDMwKSwKK1dUQygweDBmMmEzZmMwKSwgV1RDKDB4MGY2MjkyODApLCBXVEMoMHgwZjliNTIxMCksIFdUQygweDBmZDQ3NjkwKSwgV1RDKDB4MTAwZGZhODApLCBXVEMoMHgxMDQ3ZDhhMCksIFdUQygweDEwODIwYjQwKSwgV1RDKDB4MTBiYzhiODApLAorV1RDKDB4MTBmNzUwODApLCBXVEMoMHgxMTMyNTEwMCksIFdUQygweDExNmQ4NGUwKSwgV1RDKDB4MTFhOGVjZTApLCBXVEMoMHgxMWU0OTQyMCksIFdUQygweDEyMjA4NWEwKSwgV1RDKDB4MTI1Y2NiYzApLCBXVEMoMHgxMjk5NWE0MCksCitXVEMoMHgxMmQ2MGU4MCksIFdUQygweDEzMTJjNGMwKSwgV1RDKDB4MTM0ZjU5ZTApLCBXVEMoMHgxMzhiYWU2MCksIFdUQygweDEzYzdhNzQwKSwgV1RDKDB4MTQwMzI5ZTApLCBXVEMoMHgxNDNlMWI2MCksIFdUQygweDE0Nzg2MmEwKSwKK1dUQygweDE0YjFlODQwKSwgV1RDKDB4MTRlYTk0YzApLCBXVEMoMHgxNTIyNTBhMCksIFdUQygweDE1NTkwMzgwKSwgV1RDKDB4MTU4ZTkzZTApLCBXVEMoMHgxNWMyZTgyMCksIFdUQygweDE1ZjVlNmUwKSwgV1RDKDB4MTYyNzc5YTApLAorV1RDKDB4MTY1NzhjYTApLCBXVEMoMHgxNjg2MGNhMCksIFdUQygweDE2YjJlNjQwKSwgV1RDKDB4MTZkZTBiMDApLCBXVEMoMHgxNzA3NzE0MCksIFdUQygweDE3MmYwZmEwKSwgV1RDKDB4MTc1NGUyMDApLCBXVEMoMHgxNzc5NjA4MCksCitXVEMoMHgxNzlkN2YyMCksIFdUQygweDE3YzIzNzYwKSwgV1RDKDB4MTdlODdkYTApLCBXVEMoMHgxODEwY2M4MCksIFdUQygweDE4M2IyNWEwKSwgV1RDKDB4MTg2Nzg1MjApLCBXVEMoMHgxODk1ZTcwMCksIFdUQygweDE4YzY0NTQwKSwKK1dUQygweDE4Zjg5NzgwKSwgV1RDKDB4MTkyY2Q1NjApLCBXVEMoMHgxOTYyZjY4MCksIFdUQygweDE5OWFmMmEwKSwgV1RDKDB4MTlkNGMxZTApLCBXVEMoMHgxYTEwNWNhMCksIFdUQygweDFhNGRiYWUwKSwgV1RDKDB4MWE4Y2Q2NjApLAorV1RDKDB4MWFjZGFhNjApLCBXVEMoMHgxYjEwMzI2MCksIFdUQygweDFiNTQ2OTQwKSwgV1RDKDB4MWI5YTQ2MDApLCBXVEMoMHgxYmUxYmI4MCksIFdUQygweDFjMmFiYzYwKSwgV1RDKDB4MWM3NTNiODApLCBXVEMoMHgxY2MxMzg2MCksCitXVEMoMHgxZDBlYmUyMCksIFdUQygweDFkNWRkOGMwKSwgV1RDKDB4MWRhZTk0ODApLCBXVEMoMHgxZTAxMDA2MCksIFdUQygweDFlNTUyZjQwKSwgV1RDKDB4MWVhYjMzZTApLCBXVEMoMHgxZjAzMjA2MCksIFdUQygweDFmNWNmY2UwKSwKK1dUQygweDFmYjhjNjYwKSwgV1RDKDB4MjAxNjc5YzApLCBXVEMoMHgyMDc2MTFjMCksIFdUQygweDIwZDc1ZjAwKSwgV1RDKDB4MjEzYTA2NDApLCBXVEMoMHgyMTlkYWI4MCksIFdUQygweDIyMDFmNDgwKSwgV1RDKDB4MjI2NmJhODApLAorV1RDKDB4MjJjYzBhYzApLCBXVEMoMHgyMzMxZjRjMCksIFdUQygweDIzOTg4OTQwKSwgV1RDKDB4MjNmZmZmNDApLCBXVEMoMHgyNDY4YjM0MCksIFdUQygweDI0ZDMwMzAwKSwgV1RDKDB4MjUzZjQ5MDApLCBXVEMoMHgyNWFkODk4MCksCitXVEMoMHgyNjFkNzJjMCksIFdUQygweDI2OGVhZWMwKSwgV1RDKDB4MjcwMGU4ODApLCBXVEMoMHgyNzczZGI0MCksIFdUQygweDI3ZTc1MWMwKSwgV1RDKDB4Mjg1YjE3ODApLCBXVEMoMHgyOGNlZmJjMCksIFdUQygweDI5NDMxZjgwKSwKK1dUQygweDI5YjdmNjgwKSwgV1RDKDB4MmEyZGY3ODApLCBXVEMoMHgyYWE1OTg4MCksIFdUQygweDJiMWYzMjgwKSwgV1RDKDB4MmI5YjAxNDApLCBXVEMoMHgyYzE5NDAwMCksIFdUQygweDJjOWEyNTQwKSwgV1RDKDB4MmQxZDhkYzApLAorV1RDKDB4MmRhMmZjNDApLCBXVEMoMHgyZTI5ZWU4MCksIFdUQygweDJlYjFlMzQwKSwgV1RDKDB4MmYzYTRlNDApLCBXVEMoMHgyZmMyOTk4MCksIFdUQygweDMwNGEyZWMwKSwgV1RDKDB4MzBkMDdjYzApLCBXVEMoMHgzMTU1NjZjMCksCitXVEMoMHgzMWQ5NDQ4MCksIFdUQygweDMyNWM3MmMwKSwgV1RDKDB4MzJkZjUxYzApLCBXVEMoMHgzMzYyOGM4MCksIFdUQygweDMzZTcxYTAwKSwgV1RDKDB4MzQ2ZGY0MDApLCBXVEMoMHgzNGY4MGRjMCksIFdUQygweDM1ODVjNjQwKSwKK1dUQygweDM2MTZlNzAwKSwgV1RDKDB4MzZhYjMzODApLCBXVEMoMHgzNzQyNmFjMCksIFdUQygweDM3ZGJlODQwKSwgV1RDKDB4Mzg3NmEzNDApLCBXVEMoMHgzOTExOGY0MCksIFdUQygweDM5YWJhMmMwKSwgV1RDKDB4M2E0NDIyYzApLAorV1RDKDB4M2FkYWEyMDApLCBXVEMoMHgzYjZlYjZjMCksIFdUQygweDNiZmZmZDgwKSwgV1RDKDB4M2M4ZTkzODApLCBXVEMoMHgzZDFiMTc4MCksIFdUQygweDNkYTYyZTAwKSwgV1RDKDB4M2UzMDdiMDApLCBXVEMoMHgzZWJhOTdjMCksCitXVEMoMHgzZjQ1MTI4MCksIFdUQygweDNmZDA3OTQwKSwgV1RDKDB4NDA1ZDU3N2YpLCBXVEMoMHg0MGViZjU3ZiksIFdUQygweDQxN2M1OWZmKSwgV1RDKDB4NDIwZTg5N2YpLCBXVEMoMHg0MmEyODU3ZiksIFdUQygweDQzMzgzMDdmKSwKK1dUQygweDQzY2Y0ZDdmKSwgV1RDKDB4NDQ2NzljZmYpLCBXVEMoMHg0NTAwZGZmZiksIFdUQygweDQ1OWFjMmZmKSwgV1RDKDB4NDYzNGUyZmYpLCBXVEMoMHg0NmNlZDlmZiksIFdUQygweDQ3Njg0MzdmKSwgV1RDKDB4NDgwMGQyN2YpLAorV1RDKDB4NDg5ODUwZmYpLCBXVEMoMHg0OTJlODhmZiksIFdUQygweDQ5YzM0NmZmKSwgV1RDKDB4NGE1Njc4ZmYpLCBXVEMoMHg0YWU4MmY3ZiksIFdUQygweDRiNzg3YzdmKSwgV1RDKDB4NGMwNzcxN2YpLCBXVEMoMHg0Yzk1MzM3ZiksCitXVEMoMHg0ZDIxZjc3ZiksIFdUQygweDRkYWRmM2ZmKSwgV1RDKDB4NGUzOTVlZmYpLCBXVEMoMHg0ZWM0NjU3ZiksIFdUQygweDRmNGYyOTdmKSwgV1RDKDB4NGZkOWNkN2YpLCBXVEMoMHg1MDY0NzM3ZiksIFdUQygweDUwZWYzY2ZmKSwKK1dUQygweDUxN2E0NmZmKSwgV1RDKDB4NTIwNWIwZmYpLCBXVEMoMHg1MjkxOTdmZiksIFdUQygweDUzMWUwNGZmKSwgV1RDKDB4NTNhYWViN2YpLCBXVEMoMHg1NDM4M2VmZiksIFdUQygweDU0YzVlZjdmKSwgV1RDKDB4NTU1M2E4ZmYpLAorV1RDKDB4NTVlMGQ1N2YpLCBXVEMoMHg1NjZjZGE3ZiksIFdUQygweDU2ZjcyMGZmKSwgV1RDKDB4NTc3ZjRhZmYpLCBXVEMoMHg1ODA1MzRmZiksIFdUQygweDU4ODhiZDdmKSwgV1RDKDB4NTkwOWM2ZmYpLCBXVEMoMHg1OTg4OTBmZiksCitXVEMoMHg1YTA1YjdmZiksIFdUQygweDVhODFkYjdmKSwgV1RDKDB4NWFmZDk5ZmYpLCBXVEMoMHg1Yjc5NGE3ZiksIFdUQygweDViZjUwMDdmKSwgV1RDKDB4NWM3MGNiZmYpLCBXVEMoMHg1Y2VjYmI3ZiksIFdUQygweDVkNjhjNDdmKSwKK1dUQygweDVkZTRjM2ZmKSwgV1RDKDB4NWU2MDk0ZmYpLCBXVEMoMHg1ZWRjMTI3ZiksIFdUQygweDVmNTZmZGZmKSwgV1RDKDB4NWZkMTAxN2YpLCBXVEMoMHg2MDQ5YzY3ZiksIFdUQygweDYwYzBmNjdmKSwgV1RDKDB4NjEzNjUwZmYpLAorV1RDKDB4NjFhOWE5ZmYpLCBXVEMoMHg2MjFhZDc3ZiksIFdUQygweDYyODliMzdmKSwgV1RDKDB4NjJmNjdmZmYpLCBXVEMoMHg2MzYxZTg3ZiksIFdUQygweDYzY2M5YmZmKSwgV1RDKDB4NjQzNzQ1N2YpLCBXVEMoMHg2NGEyMjQ3ZiksCitXVEMoMHg2NTBkMGM3ZiksIFdUQygweDY1NzdjYzdmKSwgV1RDKDB4NjVlMjMyN2YpLCBXVEMoMHg2NjRiZjU3ZiksIFdUQygweDY2YjRiNWZmKSwgV1RDKDB4NjcxYzEzN2YpLCBXVEMoMHg2NzgxYWZmZiksIFdUQygweDY3ZTU3OWZmKSwKK1dUQygweDY4NDdhYmZmKSwgV1RDKDB4NjhhODgyZmYpLCBXVEMoMHg2OTA4M2JmZiksIFdUQygweDY5NjZmYmZmKSwgV1RDKDB4NjljNGNmZmYpLCBXVEMoMHg2YTIxYzU3ZiksIFdUQygweDZhN2RlODdmKSwgV1RDKDB4NmFkOTM3N2YpLAorV1RDKDB4NmIzM2E1ZmYpLCBXVEMoMHg2YjhkMjU3ZiksIFdUQygweDZiZTVhOGZmKSwgV1RDKDB4NmMzZDIwZmYpLCBXVEMoMHg2YzkzODBmZiksIFdUQygweDZjZThiYTdmKSwgV1RDKDB4NmQzY2JmZmYpLCBXVEMoMHg2ZDhmODI3ZiksCisvKiBwYXJ0IDIgKi8KK1dUQygweGFkOThiNDgxKSwgV1RDKDB4YWVhZDlkMDEpLCBXVEMoMHhhZmJmYzM4MSksIFdUQygweGIwY2Y0ZDAxKSwgV1RDKDB4YjFkYzVmODEpLCBXVEMoMHhiMmU3MjA4MSksIFdUQygweGIzZWZiNTAxKSwgV1RDKDB4YjRmNjQzODEpLAorV1RDKDB4YjVmYWYxMDEpLCBXVEMoMHhiNmZkZTQwMSksIFdUQygweGI3ZmY0MDAxKSwgV1RDKDB4YjhmZjE2MDEpLCBXVEMoMHhiOWZkNjE4MSksIFdUQygweGJhZmExZDAxKSwgV1RDKDB4YmJmNTQ0MDEpLCBXVEMoMHhiY2VlZDEwMSksCitXVEMoMHhiZGU2YzA4MSksIFdUQygweGJlZGQwZTgxKSwgV1RDKDB4YmZkMWI3MDEpLCBXVEMoMHhjMGM0YjQ0MCksIFdUQygweGMxYjVmZmMwKSwgV1RDKDB4YzJhNTkzNDApLCBXVEMoMHhjMzkzNjc4MCksIFdUQygweGM0N2Y3OGMwKSwKK1dUQygweGM1NjljNjAwKSwgV1RDKDB4YzY1MjRkNDApLCBXVEMoMHhjNzM5MGRjMCksIFdUQygweGM4MWUwNGMwKSwgV1RDKDB4YzkwMTJlMDApLCBXVEMoMHhjOWUyODU0MCksIFdUQygweGNhYzIwNzAwKSwgV1RDKDB4Y2I5ZmIxYzApLAorV1RDKDB4Y2M3Yjg2NDApLCBXVEMoMHhjZDU1ODYwMCksIFdUQygweGNlMmRiMjAwKSwgV1RDKDB4Y2YwNDA5YzApLCBXVEMoMHhjZmQ4OGE0MCksIFdUQygweGQwYWIzMDgwKSwgV1RDKDB4ZDE3YmZhMDApLCBXVEMoMHhkMjRhZTY0MCksCitXVEMoMHhkMzE3ZjdjMCksIFdUQygweGQzZTMzMDgwKSwgV1RDKDB4ZDRhYzkzNDApLCBXVEMoMHhkNTc0MWY0MCksIFdUQygweGQ2MzlkMmMwKSwgV1RDKDB4ZDZmZGFiMDApLCBXVEMoMHhkN2JmYTVjMCksIFdUQygweGQ4N2ZjMzAwKSwKK1dUQygweGQ5M2UwNjAwKSwgV1RDKDB4ZDlmYTcxODApLCBXVEMoMHhkYWI1MDkwMCksIFdUQygweGRiNmRjY2MwKSwgV1RDKDB4ZGMyNGJhODApLCBXVEMoMHhkY2Q5ZDAwMCksIFdUQygweGRkOGQwYjgwKSwgV1RDKDB4ZGUzZTZkYzApLAorV1RDKDB4ZGVlZGY5YzApLCBXVEMoMHhkZjliYjM0MCksIFdUQygweGUwNDc5ZTIwKSwgV1RDKDB4ZTBmMWJhYzApLCBXVEMoMHhlMTlhMDdlMCksIFdUQygweGUyNDA4MzgwKSwgV1RDKDB4ZTJlNTJjMDApLCBXVEMoMHhlMzg4MDJlMCksCitXVEMoMHhlNDI5MGMwMCksIFdUQygweGU0Yzg0YzIwKSwgV1RDKDB4ZTU2NWM3NjApLCBXVEMoMHhlNjAxN2YyMCksIFdUQygweGU2OWI3MjQwKSwgV1RDKDB4ZTczMzlmNjApLCBXVEMoMHhlN2NhMDUwMCksIFdUQygweGU4NWVhNDgwKSwKK1dUQygweGU4ZjE4MTgwKSwgV1RDKDB4ZTk4MjlmYzApLCBXVEMoMHhlYTEyMDJlMCksIFdUQygweGVhOWZhYjgwKSwgV1RDKDB4ZWIyYjk3MDApLCBXVEMoMHhlYmI1YzJhMCksIFdUQygweGVjM2UyYmMwKSwgV1RDKDB4ZWNjNGQzMDApLAorV1RDKDB4ZWQ0OWJjODApLCBXVEMoMHhlZGNjZWM2MCksIFdUQygweGVlNGU2NmEwKSwgV1RDKDB4ZWVjZTJkODApLCBXVEMoMHhlZjRjNDFlMCksIFdUQygweGVmYzhhNDgwKSwgV1RDKDB4ZjA0MzU2MTApLCBXVEMoMHhmMGJjNWM2MCksCitXVEMoMHhmMTMzYzIzMCksIFdUQygweGYxYTk5MjcwKSwgV1RDKDB4ZjIxZGQ3YjApLCBXVEMoMHhmMjkwOTdlMCksIFdUQygweGYzMDFkM2QwKSwgV1RDKDB4ZjM3MThjMjApLCBXVEMoMHhmM2RmYzE4MCksIFdUQygweGY0NGM3MTAwKSwKK1dUQygweGY0Yjc5NDgwKSwgV1RDKDB4ZjUyMTI1YjApLCBXVEMoMHhmNTg5MWRmMCksIFdUQygweGY1ZWY2ZmUwKSwgV1RDKDB4ZjY1NDA3MzApLCBXVEMoMHhmNmI2Y2Y1MCksIFdUQygweGY3MTdiNDkwKSwgV1RDKDB4Zjc3NmI5YTApLAorV1RDKDB4ZjdkM2Y3MjApLCBXVEMoMHhmODJmODZlOCksIFdUQygweGY4ODk4MjYwKSwgV1RDKDB4ZjhlMWZjNTApLCBXVEMoMHhmOTM5MDBmMCksIFdUQygweGY5OGU5YzI4KSwgV1RDKDB4ZjllMmQ5NDApLCBXVEMoMHhmYTM1YjRhMCksCitXVEMoMHhmYTg3MWJkOCksIFdUQygweGZhZDZmYmQwKSwgV1RDKDB4ZmIyNTQyNTApLCBXVEMoMHhmYjcxZjBjMCksIFdUQygweGZiYmQxYzI4KSwgV1RDKDB4ZmMwNmRhNjApLCBXVEMoMHhmYzRmNDBhNCksIFdUQygweGZjOTY1NTAwKSwKK1dUQygweGZjZGMwZTVjKSwgV1RDKDB4ZmQyMDYyZjQpLCBXVEMoMHhmZDYzNDhkMCksIFdUQygweGZkYTRiMWI4KSwgV1RDKDB4ZmRlNDhiMmMpLCBXVEMoMHhmZTIyYzI4MCksIFdUQygweGZlNWY0NjJhKSwgV1RDKDB4ZmU5YTFmMmUpLAorV1RDKDB4ZmVkMzcxMWMpLCBXVEMoMHhmZjBiNjBhYyksIFdUQygweGZmNDIxMmRkKSwgV1RDKDB4ZmY3N2IzNDQpLCBXVEMoMHhmZmFjNzQwNyksIFdUQygweGZmZTA4Nzk2KSwgV1RDKDB4MDAxNDFlMzcpLCBXVEMoMHgwMDQ3MzY2NSksCitXVEMoMHgwMDc5OWNkMCksIFdUQygweDAwYWIxYmZmKSwgV1RDKDB4MDBkYjdkOGIpLCBXVEMoMHgwMTBhNzVlYSksIFdUQygweDAxMzdhNDZlKSwgV1RDKDB4MDE2MmE3N2EpLCBXVEMoMHgwMThiMjBhYyksIFdUQygweDAxYjBmYjdhKSwKK1dUQygweDAxZDQ2ZDNjKSwgV1RDKDB4MDFmNWFlN2MpLCBXVEMoMHgwMjE0ZjkxYyksIFdUQygweDAyMzJhNWNjKSwgV1RDKDB4MDI0ZjJjMDQpLCBXVEMoMHgwMjZiMDQ4YyksIFdUQygweDAyODZhNjI4KSwgV1RDKDB4MDJhMjU4MDgpLAorV1RDKDB4MDJiZTMxYzApLCBXVEMoMHgwMmRhNDhlMCksIFdUQygweDAyZjZiMDljKSwgV1RDKDB4MDMxMzQ1ZGMpLCBXVEMoMHgwMzJmYWY1MCksIFdUQygweDAzNGI5MTQ4KSwgV1RDKDB4MDM2NjkwZTgpLCBXVEMoMHgwMzgwNjU4YyksCitXVEMoMHgwMzk4ZDhlNCksIFdUQygweDAzYWZiNTY4KSwgV1RDKDB4MDNjNGM2ZTApLCBXVEMoMHgwM2Q3Zjc3MCksIFdUQygweDAzZTk0ZjljKSwgV1RDKDB4MDNmOGQ5MzgpLCBXVEMoMHgwNDA2OWVlOCksIFdUQygweDA0MTJiZWY4KSwKK1dUQygweDA0MWQ2YjMwKSwgV1RDKDB4MDQyNmQ2MzgpLCBXVEMoMHgwNDJmMzI4OCksIFdUQygweDA0MzZhZDk4KSwgV1RDKDB4MDQzZDZmZDApLCBXVEMoMHgwNDQzYTE3MCksIFdUQygweDA0NDk2YTQwKSwgV1RDKDB4MDQ0ZWU3MjgpLAorV1RDKDB4MDQ1NDJhNDApLCBXVEMoMHgwNDU5NDUyMCksIFdUQygweDA0NWU0ODkwKSwgV1RDKDB4MDQ2MzMyMTApLCBXVEMoMHgwNDY3ZWJlOCksIFdUQygweDA0NmM1ZjgwKSwgV1RDKDB4MDQ3MDc2MzApLCBXVEMoMHgwNDc0MTdmMCksCitXVEMoMHgwNDc3MmI1OCksIFdUQygweDA0Nzk5NmU4KSwgV1RDKDB4MDQ3YjQxNDApLCBXVEMoMHgwNDdjMTJhMCksIFdUQygweDA0N2JmNTIwKSwgV1RDKDB4MDQ3YWQyZTApLCBXVEMoMHgwNDc4OTY5MCksIFdUQygweDA0NzUzOWM4KSwKK1dUQygweDA0NzBjNGI4KSwgV1RDKDB4MDQ2YjQwNTgpLCBXVEMoMHgwNDY0YjYwMCksIFdUQygweDA0NWQzYTA4KSwgV1RDKDB4MDQ1NGViYzgpLCBXVEMoMHgwNDRiZWIwMCksIFdUQygweDA0NDI1Nzk4KSwgV1RDKDB4MDQzODUzYjApLAorV1RDKDB4MDQyZTAzOTgpLCBXVEMoMHgwNDIzOGJkOCksIFdUQygweDA0MTkwZjk4KSwgV1RDKDB4MDQwZTk2NzApLCBXVEMoMHgwNDA0MGMxOCksIFdUQygweDAzZjk1YjMwKSwgV1RDKDB4MDNlZTZlMjApLCBXVEMoMHgwM2UzMmI2NCksCitXVEMoMHgwM2Q3NzU5OCksIFdUQygweDAzY2IyZjI0KSwgV1RDKDB4MDNiZTNiMTgpLCBXVEMoMHgwM2IwOGIxOCksIFdUQygweDAzYTIxZjY0KSwgV1RDKDB4MDM5MmY4ZDQpLCBXVEMoMHgwMzgzMThlMCksIFdUQygweDAzNzI4ZTk0KSwKK1dUQygweDAzNjE3Njk0KSwgV1RDKDB4MDM0ZmVlMTgpLCBXVEMoMHgwMzNlMTFmNCksIFdUQygweDAzMmJmNTMwKSwgV1RDKDB4MDMxOWExMTQpLCBXVEMoMHgwMzA3MWU4MCksIFdUQygweDAyZjQ3NWY0KSwgV1RDKDB4MDJlMWE3YzApLAorV1RDKDB4MDJjZWFjMDQpLCBXVEMoMHgwMmJiN2E4NCksIFdUQygweDAyYTgwYWYwKSwgV1RDKDB4MDI5NDUyYjApLCBXVEMoMHgwMjgwNDRlMCksIFdUQygweDAyNmJkNDg4KSwgV1RDKDB4MDI1NmY1NTgpLCBXVEMoMHgwMjQxYTk0MCksCitXVEMoMHgwMjJjMDA4NCksIFdUQygweDAyMTYwYzA4KSwgV1RDKDB4MDFmZmRjNWEpLCBXVEMoMHgwMWU5N2FkMiksIFdUQygweDAxZDJlOTgyKSwgV1RDKDB4MDFiYzJhMmEpLCBXVEMoMHgwMWE1M2U4YyksIFdUQygweDAxOGUyODYwKSwKK1dUQygweDAxNzZlOTRjKSwgV1RDKDB4MDE1ZjgyZmEpLCBXVEMoMHgwMTQ3ZjcwZSksIFdUQygweDAxMzA0NmMyKSwgV1RDKDB4MDExODcyZTgpLCBXVEMoMHgwMTAwN2M0YSksIFdUQygweDAwZTg2M2NmKSwgV1RDKDB4MDBkMDJjODEpLAorV1RDKDB4MDBiN2RiOTQpLCBXVEMoMHgwMDlmNzY1MSksIFdUQygweDAwODcwMjA0KSwgV1RDKDB4MDA2ZTgzZjgpLCBXVEMoMHgwMDU2MDE3NiksIFdUQygweDAwM2Q3ZmNiKSwgV1RDKDB4MDAyNTA0M2YpLCBXVEMoMHgwMDBjOTQxZiksCitXVEMoMHhkNjU1NzRjMCksIFdUQygweGQ1ZWJjMTAwKSwgV1RDKDB4ZDU4MmQwODApLCBXVEMoMHhkNTFhOWNjMCksIFdUQygweGQ0YjMxZjgwKSwgV1RDKDB4ZDQ0YzUyODApLCBXVEMoMHhkM2U2MmY4MCksIFdUQygweGQzODBiMDQwKSwKK1dUQygweGQzMWJjZTQwKSwgV1RDKDB4ZDJiNzgzODApLCBXVEMoMHhkMjUzY2E0MCksIFdUQygweGQxZjBhY2MwKSwgV1RDKDB4ZDE4ZTQ1ODApLCBXVEMoMHhkMTJjYWY0MCksIFdUQygweGQwY2MwNDAwKSwgV1RDKDB4ZDA2YzQwYzApLAorV1RDKDB4ZDAwZDQ3NDApLCBXVEMoMHhjZmFlZjZjMCksIFdUQygweGNmNTEzMTQwKSwgV1RDKDB4Y2VmM2ZhODApLCBXVEMoMHhjZTk3N2E0MCksIFdUQygweGNlM2JkOTgwKSwgV1RDKDB4Y2RlMTNmNDApLCBXVEMoMHhjZDg3YTg4MCksCitXVEMoMHhjZDJlZTgwMCksIFdUQygweGNjZDZjZjAwKSwgV1RDKDB4Y2M3ZjJmNDApLCBXVEMoMHhjYzI3ZTg4MCksIFdUQygweGNiZDBlYTAwKSwgV1RDKDB4Y2I3YTIzODApLCBXVEMoMHhjYjIzODM4MCksIFdUQygweGNhY2NlZTgwKSwKK1dUQygweGNhNzYzZWMwKSwgV1RDKDB4Y2ExZjRkMDApLCBXVEMoMHhjOWM3ZjQ4MCksIFdUQygweGM5NzAzYjQwKSwgV1RDKDB4YzkxODUyMDApLCBXVEMoMHhjOGMwNmIwMCksIFdUQygweGM4NjhiNGMwKSwgV1RDKDB4YzgxMTAwYzApLAorV1RDKDB4YzdiOGMyODApLCBXVEMoMHhjNzVmNmE0MCksIFdUQygweGM3MDQ2OTAwKSwgV1RDKDB4YzZhNzQzNDApLCBXVEMoMHhjNjQ3OTMwMCksIFdUQygweGM1ZTRmMjAwKSwgV1RDKDB4YzU3ZWZhYzApLCBXVEMoMHhjNTE1NDg4MCksCitXVEMoMHhjNGE3Nzc4MCksIFdUQygweGM0MzUyNDQwKSwgV1RDKDB4YzNiZGVhYzApLCBXVEMoMHhjMzQxNjc0MCksIFdUQygweGMyYmYzM2MwKSwgV1RDKDB4YzIzNmViNDApLCBXVEMoMHhjMWE4MjkwMCksIFdUQygweGMxMTI5MGMwKSwKK1dUQygweGMwNzVjZjAwKSwgV1RDKDB4YmZkMTkwODEpLCBXVEMoMHhiZjI1ODQwMSksIFdUQygweGJlNzE2ZDgxKSwgV1RDKDB4YmRiNTJiODEpLCBXVEMoMHhiY2YwOWE4MSksIFdUQygweGJjMjNhZjgxKSwgV1RDKDB4YmI1MDVjMDEpLAorV1RDKDB4YmE3YTkwODEpLCBXVEMoMHhiOWE2NTI4MSksIFdUQygweGI4ZDc5MzAxKSwgV1RDKDB4YjgxMDRjMDEpLCBXVEMoMHhiNzUwODE4MSksIFdUQygweGI2OTgyMjAxKSwgV1RDKDB4YjVlNzFiMDEpLCBXVEMoMHhiNTNkNWIwMSksCitXVEMoMHhiNDlhZDA4MSksIFdUQygweGIzZmY2OTAxKSwgV1RDKDB4YjM2YjEzMDEpLCBXVEMoMHhiMmRkYmQwMSksIFdUQygweGIyNTc1NDgxKSwgV1RDKDB4YjFkN2M4MDEpLCBXVEMoMHhiMTVmMDYwMSksIFdUQygweGIwZWNmYzAxKSwKK1dUQygweGIwODE5ODgxKSwgV1RDKDB4YjAxY2NhMDEpLCBXVEMoMHhhZmJlN2UwMSksIFdUQygweGFmNjZhMzAxKSwgV1RDKDB4YWYxNTI3MDEpLCBXVEMoMHhhZWM5Zjg4MSksIFdUQygweGFlODUwNjAxKSwgV1RDKDB4YWU0NjNjODEpLAorV1RDKDB4YWUwZDhiMDEpLCBXVEMoMHhhZGRhZTAwMSksIFdUQygweGFkYWUyODgxKSwgV1RDKDB4YWQ4NzUzODEpLCBXVEMoMHhhZDY2NGY4MSksIFdUQygweGFkNGIwOTgxKSwgV1RDKDB4YWQzNTcwODEpLCBXVEMoMHhhZDI1NzMwMSksCitXVEMoMHhhZDFhZmUwMSksIFdUQygweGFkMTYwMDgxKSwgV1RDKDB4YWQxNjY5MDEpLCBXVEMoMHhhZDFjMjQ4MSksIFdUQygweGFkMjcyMjAxKSwgV1RDKDB4YWQzNzRmODEpLCBXVEMoMHhhZDRjOWIwMSksIFdUQygweGFkNjZmMzgxKSwKK1dUQygweGFkODY0NjAxKSwgV1RDKDB4YWRhYTgxMDEpLCBXVEMoMHhhZGQzOTMwMSksIFdUQygweGFlMDE2YTAxKSwgV1RDKDB4YWUzM2Y0ODEpLCBXVEMoMHhhZTZiMjAwMSksIFdUQygweGFlYTZkYjAxKSwgV1RDKDB4YWVlNzEzODEpLAorV1RDKDB4YWYyYmI4MDEpLCBXVEMoMHhhZjc0YjY4MSksIFdUQygweGFmYzFmZDAxKSwgV1RDKDB4YjAxMzdhMDEpLCBXVEMoMHhiMDY5MWI4MSksIFdUQygweGIwYzJjZjgxKSwgV1RDKDB4YjEyMDg0ODEpLCBXVEMoMHhiMTgyMjg4MSksCitXVEMoMHhiMWU3YTk4MSksIFdUQygweGIyNTBmNjAxKSwgV1RDKDB4YjJiZGZjMDEpLCBXVEMoMHhiMzJlYWEwMSksIFdUQygweGIzYTJlZDAxKSwgV1RDKDB4YjQxYWI0ODEpLCBXVEMoMHhiNDk1ZWUwMSksIFdUQygweGI1MTQ4ODAxKSwKK1dUQygweGI1OTY3MDgxKSwgV1RDKDB4YjYxYjk1ODEpLCBXVEMoMHhiNmEzZTU4MSksIFdUQygweGI3MmY0ZTAxKSwgV1RDKDB4YjdiZGJlMDEpLCBXVEMoMHhiODRmMjM4MSksIFdUQygweGI4ZTM2YzgxKSwgV1RDKDB4Yjk3YTg3MDEpLAorV1RDKDB4YmExNDYxMDEpLCBXVEMoMHhiYWIwZTk4MSksIFdUQygweGJiNTAwZDgxKSwgV1RDKDB4YmJmMWJjODEpLCBXVEMoMHhiYzk1ZTM4MSksIFdUQygweGJkM2M3MTgxKSwgV1RDKDB4YmRlNTU0ODEpLCBXVEMoMHhiZTkwN2EwMSksCitXVEMoMHhiZjNkZDEwMSksIFdUQygweGJmZWQ0NzAxKSwgV1RDKDB4YzA5ZWNhYzApLCBXVEMoMHhjMTUyNGEwMCksIFdUQygweGMyMDdiMzAwKSwgV1RDKDB4YzJiZWY0NDApLCBXVEMoMHhjMzc3ZmI4MCksIFdUQygweGM0MzJiNzAwKSwKK1dUQygweGM0ZWYxNTAwKSwgV1RDKDB4YzVhZDAzYzApLCBXVEMoMHhjNjZjNzE0MCksIFdUQygweGM3MmQ0YmMwKSwgV1RDKDB4YzdlZjgxODApLCBXVEMoMHhjOGIzMDA4MCksIFdUQygweGM5NzdiNzAwKSwgV1RDKDB4Y2EzZDkzNDApLAorV1RDKDB4Y2IwNDgzNDApLCBXVEMoMHhjYmNjNzU0MCksIFdUQygweGNjOTU1NzQwKSwgV1RDKDB4Y2Q1ZjE3YzApLCBXVEMoMHhjZTI5YTQ4MCksIFdUQygweGNlZjRlYzAwKSwgV1RDKDB4Y2ZjMGRjODApLCBXVEMoMHhkMDhkNjNjMCksCitXVEMoMHhkMTVhNzA0MCksIFdUQygweGQyMjdmMDAwKSwgV1RDKDB4ZDJmNWQxNDApLCBXVEMoMHhkM2M0MDI0MCksIFdUQygweGQ0OTI3MTAwKSwgV1RDKDB4ZDU2MTBiODApLCBXVEMoMHhkNjJmYzA4MCksIFdUQygweGQ2ZmU3ZGMwKSwKK1dUQygweGQ3Y2QzMTQwKSwgV1RDKDB4ZDg5YmM5ODApLCBXVEMoMHhkOTZhMzRjMCksIFdUQygweGRhMzg2MGMwKSwgV1RDKDB4ZGIwNjNjMDApLCBXVEMoMHhkYmQzYjQ4MCksIFdUQygweGRjYTBiODgwKSwgV1RDKDB4ZGQ2ZDM2NDApLAorV1RDKDB4ZGUzOTFiYzApLCBXVEMoMHhkZjA0NTc0MCksIFdUQygweGRmY2VkNmMwKSwgV1RDKDB4ZTA5ODg4YzApLCBXVEMoMHhlMTYxNWIyMCksIFdUQygweGUyMjkzYzIwKSwgV1RDKDB4ZTJmMDFhMDApLCBXVEMoMHhlM2I1ZTJjMCksCitXVEMoMHhlNDdhODRjMCksIFdUQygweGU1M2RlZTAwKSwgV1RDKDB4ZTYwMDBjYzApLCBXVEMoMHhlNmMwY2YyMCksIFdUQygweGU3ODAyMzYwKSwgV1RDKDB4ZTgzZGY3YTApLCBXVEMoMHhlOGZhMzllMCksIFdUQygweGU5YjRkODgwKSwKK1dUQygweGVhNmRjMWEwKSwgV1RDKDB4ZWIyNGUzNjApLCBXVEMoMHhlYmRhMmJlMCksIFdUQygweGVjOGQ4OTYwKSwgV1RDKDB4ZWQzZWVhMjApLCBXVEMoMHhlZGVlM2MwMCksIFdUQygweGVlOWI2ZDgwKSwgV1RDKDB4ZWY0NjZjYTApLAorV1RDKDB4ZWZlZjI3ODApLCBXVEMoMHhmMDk1OGM1MCksIFdUQygweGYxMzk4OTUwKSwgV1RDKDB4ZjFkYjBjYTApLCBXVEMoMHhmMjdhMDQ3MCksIFdUQygweGYzMTY1ZWQwKSwgV1RDKDB4ZjNiMDBhMTApLCBXVEMoMHhmNDQ2ZjQ0MCksCitXVEMoMHhmNGRiMGI5MCksIFdUQygweGY1NmMzZTMwKSwgV1RDKDB4ZjVmYTdhNTApLCBXVEMoMHhmNjg1YWUxMCksIFdUQygweGY3MGRjN2EwKSwgV1RDKDB4Zjc5MmI1MjApLCBXVEMoMHhmODE0NjRjOCksIFdUQygweGY4OTJjNGMwKSwKK1dUQygweGY5MGRjMzMwKSwgV1RDKDB4Zjk4NTRlNDApLCBXVEMoMHhmOWY5NTQxOCksIFdUQygweGZhNjljMmYwKSwgV1RDKDB4ZmFkNjg4ZTgpLCBXVEMoMHhmYjNmOTQyOCksIFdUQygweGZiYTRkMmU4KSwgV1RDKDB4ZmMwNjMzNDQpLAorV1RDKDB4ZmM2M2EzNzApLCBXVEMoMHhmY2JkMTE5NCksIFdUQygweGZkMTI2YmRjKSwgV1RDKDB4ZmQ2M2EwNmMpLCBXVEMoMHhmZGIwOWQ3OCksIFdUQygweGZkZjk1MTI0KSwgV1RDKDB4ZmUzZGE5OWUpLCBXVEMoMHhmZTdkOTUwZSksCitXVEMoMHhmZWI5MDFhMiksIFdUQygweGZlZWZkZDgwKSwgV1RDKDB4ZmYyMjE2ZDcpLCBXVEMoMHhmZjRmOWJjZiksIFdUQygweGZmNzg1YTkzKSwgV1RDKDB4ZmY5YzQxNGUpLCBXVEMoMHhmZmJiM2UyYiksIFdUQygweGZmZDUzZjU0KSwKK1dUQygweGZmZWEzMmY0KSwgV1RDKDB4ZmZmYTA3MzUpLCBXVEMoMHgwMDA0YWE0MyksIFdUQygweDAwMGEwYTQ3KSwgV1RDKDB4MDAwYTE1NmMpLCBXVEMoMHgwMDA0YjlkZSksIFdUQygweGZmZjllNWM1KSwgV1RDKDB4ZmZlOTg3NGUpCit9OworCisKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNDgwWzE0NDBdID0geworCitXVEMoMHhkYWQyZTZjMCksIFdUQygweGRiMWRhOTAwKSwgV1RDKDB4ZGI2OGNlNDApLCBXVEMoMHhkYmI0NTg0MCksIFdUQygweGRjMDA0OTQwKSwgV1RDKDB4ZGM0Y2EyODApLCBXVEMoMHhkYzk5NjUwMCksIFdUQygweGRjZTY5MTQwKSwKK1dUQygweGRkMzQyNzgwKSwgV1RDKDB4ZGQ4MjI3MDApLCBXVEMoMHhkZGQwOGE4MCksIFdUQygweGRlMWY0ZDAwKSwgV1RDKDB4ZGU2ZTZlYzApLCBXVEMoMHhkZWJkZWM0MCksIFdUQygweGRmMGRiYTgwKSwgV1RDKDB4ZGY1ZGQ1NDApLAorV1RDKDB4ZGZhZTNjYzApLCBXVEMoMHhkZmZmMDUwMCksIFdUQygweGUwNTA1MTQwKSwgV1RDKDB4ZTBhMjI5ODApLCBXVEMoMHhlMGY0ODhlMCksIFdUQygweGUxNDc2MTgwKSwgV1RDKDB4ZTE5YWE0ODApLCBXVEMoMHhlMWVlNGQ4MCksCitXVEMoMHhlMjQyNTQwMCksIFdUQygweGUyOTY4OWEwKSwgV1RDKDB4ZTJlYWNkNjApLCBXVEMoMHhlMzNmMjQyMCksIFdUQygweGUzOTNhMzAwKSwgV1RDKDB4ZTNlODdmMjApLCBXVEMoMHhlNDNkY2VlMCksIFdUQygweGU0OTM4YTgwKSwKK1dUQygweGU0ZTliMGEwKSwgV1RDKDB4ZTU0MDQzMDApLCBXVEMoMHhlNTk3M2U2MCksIFdUQygweGU1ZWU5YjgwKSwgV1RDKDB4ZTY0NjQ5ZTApLCBXVEMoMHhlNjllMzdlMCksIFdUQygweGU2ZjY1ZWMwKSwgV1RDKDB4ZTc0ZWI2YzApLAorV1RDKDB4ZTdhNzMwMDApLCBXVEMoMHhlN2ZmYmU0MCksIFdUQygweGU4NTg1ZWUwKSwgV1RDKDB4ZThiMTA3NDApLCBXVEMoMHhlOTA5OWM0MCksIFdUQygweGU5NjIxNGUwKSwgV1RDKDB4ZTliYTc5YTApLCBXVEMoMHhlYTEyZTdjMCksCitXVEMoMHhlYTZiODljMCksIFdUQygweGVhYzQ2NTgwKSwgV1RDKDB4ZWIxZDcyNjApLCBXVEMoMHhlYjc2YjYyMCksIFdUQygweGViZDAzNmMwKSwgV1RDKDB4ZWMyOWU1MjApLCBXVEMoMHhlYzgzYWE2MCksIFdUQygweGVjZGQ1YTAwKSwKK1dUQygweGVkMzZkNTAwKSwgV1RDKDB4ZWQ5MDE1NDApLCBXVEMoMHhlZGU5MTE2MCksIFdUQygweGVlNDFiYzIwKSwgV1RDKDB4ZWU5YTBlZTApLCBXVEMoMHhlZWYyMDg2MCksIFdUQygweGVmNDlhN2UwKSwgV1RDKDB4ZWZhMGVjMDApLAorV1RDKDB4ZWZmN2QxYzApLCBXVEMoMHhmMDRlNTZiMCksIFdUQygweGYwYTQ3NmUwKSwgV1RDKDB4ZjBmYTJmNjApLCBXVEMoMHhmMTRmODBlMCksIFdUQygweGYxYTQ2ZTEwKSwgV1RDKDB4ZjFmOGZlODApLCBXVEMoMHhmMjRkMzRhMCksCitXVEMoMHhmMmExMGJiMCksIFdUQygweGYyZjQ4MjEwKSwgV1RDKDB4ZjM0NzljYzApLCBXVEMoMHhmMzlhNWJlMCksIFdUQygweGYzZWNiOGYwKSwgV1RDKDB4ZjQzZWFmYTApLCBXVEMoMHhmNDkwM2I1MCksIFdUQygweGY0ZTE0ZTgwKSwKK1dUQygweGY1MzFkNmEwKSwgV1RDKDB4ZjU4MWJjMTApLCBXVEMoMHhmNWQwZTljMCksIFdUQygweGY2MWY1MjUwKSwgV1RDKDB4ZjY2Y2U2ZTApLCBXVEMoMHhmNmI5OTMzMCksIFdUQygweGY3MDU0ZWIwKSwgV1RDKDB4Zjc1MDFmMjApLAorV1RDKDB4Zjc5YTA3NTApLCBXVEMoMHhmN2UzMDcwMCksIFdUQygweGY4MmIyZmMwKSwgV1RDKDB4Zjg3MmExMzgpLCBXVEMoMHhmOGI5N2YxOCksIFdUQygweGY4ZmZlNjY4KSwgV1RDKDB4Zjk0NWU1MzgpLCBXVEMoMHhmOThiODg2MCksCitXVEMoMHhmOWQwZjM4MCksIFdUQygweGZhMTY1MTQ4KSwgV1RDKDB4ZmE1YmI4YTgpLCBXVEMoMHhmYWExM2RmOCksIFdUQygweGZhZTZmYjAwKSwgV1RDKDB4ZmIyY2Y4YzgpLCBXVEMoMHhmYjczMmE4MCksIFdUQygweGZiYjk3OTEwKSwKK1dUQygweGZiZmZjZDEwKSwgV1RDKDB4ZmM0NjM0NzgpLCBXVEMoMHhmYzhjZDNmYyksIFdUQygweGZjZDNiZTVjKSwgV1RDKDB4ZmQxYWZhOTApLCBXVEMoMHhmZDYyYWE4NCksIFdUQygweGZkYWIwMjg4KSwgV1RDKDB4ZmRmNDA0YjQpLAorV1RDKDB4ZmUzZDMwMDYpLCBXVEMoMHhmZTg1YjIwZSksIFdUQygweGZlY2NhNGNjKSwgV1RDKDB4ZmYxMGQ1NTkpLCBXVEMoMHhmZjUwNTc5YiksIFdUQygweGZmOGE0MGQyKSwgV1RDKDB4ZmZiN2Q4NmUpLCBXVEMoMHhmZmVmNmJiYiksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKK1dUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCitXVEMoMHhiZmY2N2EwMSksIFdUQygweGJmZWNhYTgxKSwgV1RDKDB4YmZlMmQ5MDEpLCBXVEMoMHhiZmQ5MDYwMSksIFdUQygweGJmY2YzMTgxKSwgV1RDKDB4YmZjNTVjODEpLCBXVEMoMHhiZmJiODcwMSksIFdUQygweGJmYjFiMTAxKSwKK1dUQygweGJmYTdkYzAxKSwgV1RDKDB4YmY5ZTA3MDEpLCBXVEMoMHhiZjk0MzMwMSksIFdUQygweGJmOGE1ZjgxKSwgV1RDKDB4YmY4MDhiODEpLCBXVEMoMHhiZjc2YjcwMSksIFdUQygweGJmNmNlMjAxKSwgV1RDKDB4YmY2MzBkODEpLAorV1RDKDB4YmY1OTNhMDEpLCBXVEMoMHhiZjRmNjgwMSksIFdUQygweGJmNDU5NjgxKSwgV1RDKDB4YmYzYmM2MDEpLCBXVEMoMHhiZjMxZjUwMSksIFdUQygweGJmMjgyNTAxKSwgV1RDKDB4YmYxZTU1MDEpLCBXVEMoMHhiZjE0ODY4MSksCitXVEMoMHhiZjBhYmEwMSksIFdUQygweGJmMDBlZjgxKSwgV1RDKDB4YmVmNzI2ODEpLCBXVEMoMHhiZWVkNWYwMSksIFdUQygweGJlZTM5ODAxKSwgV1RDKDB4YmVkOWQyODEpLCBXVEMoMHhiZWQwMGY4MSksIFdUQygweGJlYzY0ZTgxKSwKK1dUQygweGJlYmM5MTgxKSwgV1RDKDB4YmViMmQ2ODEpLCBXVEMoMHhiZWE5MWYwMSksIFdUQygweGJlOWY2OTAxKSwgV1RDKDB4YmU5NWI1ODEpLCBXVEMoMHhiZThjMDUwMSksIFdUQygweGJlODI1ODAxKSwgV1RDKDB4YmU3OGIwMDEpLAorV1RDKDB4YmU2ZjBjMDEpLCBXVEMoMHhiZTY1NmMwMSksIFdUQygweGJlNWJkMDAxKSwgV1RDKDB4YmU1MjM3ODEpLCBXVEMoMHhiZTQ4YTMwMSksIFdUQygweGJlM2YxMzgxKSwgV1RDKDB4YmUzNTg5MDEpLCBXVEMoMHhiZTJjMDUwMSksCitXVEMoMHhiZTIyODY4MSksIFdUQygweGJlMTkwZDgxKSwgV1RDKDB4YmUwZjlhMDEpLCBXVEMoMHhiZTA2MmI4MSksIFdUQygweGJkZmNjMzAxKSwgV1RDKDB4YmRmMzYxMDEpLCBXVEMoMHhiZGVhMDY4MSksIFdUQygweGJkZTBiMzAxKSwKK1dUQygweGJkZDc2NzAxKSwgV1RDKDB4YmRjZTIxODEpLCBXVEMoMHhiZGM0ZTMwMSksIFdUQygweGJkYmJhYjAxKSwgV1RDKDB4YmRiMjdiMDEpLCBXVEMoMHhiZGE5NTMwMSksIFdUQygweGJkYTAzMzgxKSwgV1RDKDB4YmQ5NzFjODEpLAorV1RDKDB4YmQ4ZTBlMDEpLCBXVEMoMHhiZDg1MDcwMSksIFdUQygweGJkN2MwNzgxKSwgV1RDKDB4YmQ3MzEwODEpLCBXVEMoMHhiZDZhMjIwMSksIFdUQygweGJkNjEzZDgxKSwgV1RDKDB4YmQ1ODYyODEpLCBXVEMoMHhiZDRmOTEwMSksCitXVEMoMHhiZDQ2YzgwMSksIFdUQygweGJkM2UwODAxKSwgV1RDKDB4YmQzNTUwODEpLCBXVEMoMHhiZDJjYTI4MSksIFdUQygweGJkMjNmZjAxKSwgV1RDKDB4YmQxYjY1MDEpLCBXVEMoMHhiZDEyZDU4MSksIFdUQygweGJkMGE0ZjgxKSwKK1dUQygweGJkMDFkMjgxKSwgV1RDKDB4YmNmOTVlODEpLCBXVEMoMHhiY2YwZjM4MSksIFdUQygweGJjZTg5MjgxKSwgV1RDKDB4YmNlMDNiODEpLCBXVEMoMHhiY2Q3ZWYwMSksIFdUQygweGJjY2ZhYzAxKSwgV1RDKDB4YmNjNzcxODEpLAorV1RDKDB4YmNiZjQwMDEpLCBXVEMoMHhiY2I3MTcwMSksIFdUQygweGJjYWVmNzAxKSwgV1RDKDB4YmNhNmUxMDEpLCBXVEMoMHhiYzllZDQ4MSksIFdUQygweGJjOTZkMTAxKSwgV1RDKDB4YmM4ZWQ3MDEpLCBXVEMoMHhiYzg2ZTU4MSksCitXVEMoMHhiYzdlZmM4MSksIFdUQygweGJjNzcxYzAxKSwgV1RDKDB4YmM2ZjQ0MDEpLCBXVEMoMHhiYzY3NzUwMSksIFdUQygweGJjNWZhZTgxKSwgV1RDKDB4YmM1N2YxMDEpLCBXVEMoMHhiYzUwM2I4MSksIFdUQygweGJjNDg4ZTgxKSwKK1dUQygweGJjNDBlODgxKSwgV1RDKDB4YmMzOTQ5MDEpLCBXVEMoMHhiYzMxYWYwMSksIFdUQygweGJjMmExYTgxKSwgV1RDKDB4YmMyMjhmMDEpLCBXVEMoMHhiYzFiMTA4MSksIFdUQygweGJjMTNhNDgxKSwgV1RDKDB4YmMwYzQ1ODEpLAorV1RDKDB4YmMwNGUzODEpLCBXVEMoMHhiYmZkNmMwMSksIFdUQygweGJiZjVkMTgxKSwgV1RDKDB4YmJlZTJmODEpLCBXVEMoMHhiYmU2YzgwMSksIFdUQygweGJiZGZkYjgxKSwgV1RDKDB4YmJkOWE3ODEpLCBXVEMoMHhiYmQ0NTg4MSksCitXVEMoMHhiYmQwMTMwMSksIFdUQygweGJiY2NmYzgxKSwgV1RDKDB4YmJjYjIyODEpLCBXVEMoMHhiYmNhNWQwMSksIFdUQygweGJiY2E3NDgxKSwgV1RDKDB4YmJjYjMyMDEpLCBXVEMoMHhiYmNjNmIwMSksIFdUQygweGJiY2UwNjAxKSwKK1dUQygweGJiY2ZlYTgxKSwgV1RDKDB4YmJkMjAzMDEpLCBXVEMoMHhiYmQ0NTYwMSksIFdUQygweGJiZDcwMjAxKSwgV1RDKDB4YmJkYTI1MDEpLCBXVEMoMHhiYmRkZGIwMSksIFdUQygweGJiZTIzMjgxKSwgV1RDKDB4YmJlNzMyMDEpLAorV1RDKDB4YmJlY2UyODEpLCBXVEMoMHhiYmYzNDI4MSksIFdUQygweGJiZmEzYzAxKSwgV1RDKDB4YmMwMWIzODEpLCBXVEMoMHhiYzA5OGQ4MSksIFdUQygweGJjMTFiNjgxKSwgV1RDKDB4YmMxYTI0MDEpLCBXVEMoMHhiYzIyY2Q4MSksCitXVEMoMHhiYzJiYWIwMSksIFdUQygweGJjMzRjMDgxKSwgV1RDKDB4YmMzZTE5ODEpLCBXVEMoMHhiYzQ3YzI4MSksIFdUQygweGJjNTFjYjAxKSwgV1RDKDB4YmM1YzRjODEpLCBXVEMoMHhiYzY3NjUwMSksIFdUQygweGJjNzMzNDAxKSwKK1dUQygweGJjN2ZkMzAxKSwgV1RDKDB4YmM4ZDUxMDEpLCBXVEMoMHhiYzliYjkwMSksIFdUQygweGJjYWIxNzgxKSwgV1RDKDB4YmNiYjcwMDEpLCBXVEMoMHhiY2NjYmQwMSksIFdUQygweGJjZGVmNzAxKSwgV1RDKDB4YmNmMjE2MDEpLAorV1RDKDB4YmQwNjBjODEpLCBXVEMoMHhiZDFhYzgwMSksIFdUQygweGJkMzAzNTgxKSwgV1RDKDB4YmQ0NjQyODEpLCBXVEMoMHhiZDVjZTI4MSksIFdUQygweGJkNzQwYjgxKSwgV1RDKDB4YmQ4YmIyODEpLCBXVEMoMHhiZGEzZDA4MSksCitXVEMoMHhiZGJjNjM4MSksIFdUQygweGJkZDU2YjgxKSwgV1RDKDB4YmRlZWU5ODEpLCBXVEMoMHhiZTA4ZTE4MSksIFdUQygweGJlMjM2MDAxKSwgV1RDKDB4YmUzZTcyMDEpLCBXVEMoMHhiZTVhMjMwMSksIFdUQygweGJlNzY3ZTgxKSwKK1dUQygweGJlOTM4YzgxKSwgV1RDKDB4YmViMTU3MDEpLCBXVEMoMHhiZWNmZTYwMSksIFdUQygweGJlZWY0NjAxKSwgV1RDKDB4YmYwZjgzMDEpLCBXVEMoMHhiZjMwYTkwMSksIFdUQygweGJmNTJjMTAxKSwgV1RDKDB4YmY3NWNjODEpLAorV1RDKDB4YmY5OWNiMDEpLCBXVEMoMHhiZmJlYmI4MSksIFdUQygweGJmZTQ4OTgxKSwgV1RDKDB4YzAwYjA0YzApLCBXVEMoMHhjMDMxZjg4MCksIFdUQygweGMwNTkzMzQwKSwgV1RDKDB4YzA4MDkyODApLCBXVEMoMHhjMGE4MDJjMCksCitXVEMoMHhjMGNmNmVjMCksIFdUQygweGMwZjZjYzAwKSwgV1RDKDB4YzExZTNhODApLCBXVEMoMHhjMTQ1ZjA0MCksIFdUQygweGMxNmUyMmMwKSwgV1RDKDB4YzE5NmZiMDApLCBXVEMoMHhjMWMwODY4MCksIFdUQygweGMxZWFjYTAwKSwKK1dUQygweGMyMTVjYmMwKSwgV1RDKDB4YzI0MTg5NDApLCBXVEMoMHhjMjZkZjVjMCksIFdUQygweGMyOWIwMmMwKSwgV1RDKDB4YzJjOGExNDApLCBXVEMoMHhjMmY2YjUwMCksIFdUQygweGMzMjUxNzQwKSwgV1RDKDB4YzM1M2EwYzApLAorV1RDKDB4YzM4MjJjMDApLCBXVEMoMHhjM2IwOTk0MCksIFdUQygweGMzZGVjY2MwKSwgV1RDKDB4YzQwY2E4MDApLCBXVEMoMHhjNDNhMjhjMCksIFdUQygweGM0Njc4YTAwKSwgV1RDKDB4YzQ5NTE3ODApLCBXVEMoMHhjNGMzMWQwMCksCitXVEMoMHhjNGYxYmRjMCksIFdUQygweGM1MjBlODQwKSwgV1RDKDB4YzU1MDg0NDApLCBXVEMoMHhjNTgwNzkwMCksIFdUQygweGM1YjA5ZTgwKSwgV1RDKDB4YzVlMGJmYzApLCBXVEMoMHhjNjEwYTc0MCksIFdUQygweGM2NDAyOWMwKSwKK1dUQygweGM2NmY0OWMwKSwgV1RDKDB4YzY5ZTIxODApLCBXVEMoMHhjNmNjY2E0MCksIFdUQygweGM2ZmI1NzAwKSwgV1RDKDB4YzcyOWNjODApLCBXVEMoMHhjNzU4MmI0MCksIFdUQygweGM3ODY3NDgwKSwgV1RDKDB4YzdiNGE0ODApLAorV1RDKDB4YzdlMmFmYzApLCBXVEMoMHhjODEwOGE4MCksIFdUQygweGM4M2UyOGMwKSwgV1RDKDB4Yzg2YjdmMDApLCBXVEMoMHhjODk4ODEwMCksIFdUQygweGM4YzUyMzQwKSwgV1RDKDB4YzhmMTU5ODApLCBXVEMoMHhjOTFkMTg0MCksCitXVEMoMHhiNGQ2YTM4MSksIFdUQygweGI0NDIyYjgxKSwgV1RDKDB4YjNhZTg2MDEpLCBXVEMoMHhiMzFiYjMwMSksIFdUQygweGIyODliMTgxKSwgV1RDKDB4YjFmODgxODEpLCBXVEMoMHhiMTY4MjI4MSksIFdUQygweGIwZDg5NDAxKSwKK1dUQygweGIwNDlkNjAxKSwgV1RDKDB4YWZiYmU4MDEpLCBXVEMoMHhhZjJlYzkwMSksIFdUQygweGFlYTI3NjgxKSwgV1RDKDB4YWUxNmYwMDEpLCBXVEMoMHhhZDhjMzMwMSksIFdUQygweGFkMDIzZjAxKSwgV1RDKDB4YWM3OTE0MDEpLAorV1RDKDB4YWJmMGIxODEpLCBXVEMoMHhhYjY5MTY4MSksIFdUQygweGFhZTI0MzAxKSwgV1RDKDB4YWE1YzM2MDEpLCBXVEMoMHhhOWQ2ZWYwMSksIFdUQygweGE5NTI2ZDgxKSwgV1RDKDB4YThjZWIyMDEpLCBXVEMoMHhhODRiYmI4MSksCitXVEMoMHhhN2M5OGIwMSksIFdUQygweGE3NDgyMTAxKSwgV1RDKDB4YTZjNzdlMDEpLCBXVEMoMHhhNjQ3YTMwMSksIFdUQygweGE1Yzg5MDAxKSwgV1RDKDB4YTU0YTQ3MDEpLCBXVEMoMHhhNGNjYzkwMSksIFdUQygweGE0NTAxNjAxKSwKK1dUQygweGEzZDQzMDAxKSwgV1RDKDB4YTM1OTE4MDEpLCBXVEMoMHhhMmRlY2U4MSksIFdUQygweGEyNjU1NTgxKSwgV1RDKDB4YTFlY2FlMDEpLCBXVEMoMHhhMTc0ZGE4MSksIFdUQygweGEwZmRkZDgxKSwgV1RDKDB4YTA4N2I5ODEpLAorV1RDKDB4YTAxMjcwODEpLCBXVEMoMHg5ZjllMDMwMSksIFdUQygweDlmMmE3MjgxKSwgV1RDKDB4OWViN2MxMDEpLCBXVEMoMHg5ZTQ1ZjA4MSksIFdUQygweDlkZDUwNDgxKSwgV1RDKDB4OWQ2NTAwODEpLCBXVEMoMHg5Y2Y1ZTcwMSksCitXVEMoMHg5Yzg3YmE4MSksIFdUQygweDljMWE3YzgxKSwgV1RDKDB4OWJhZTJmODEpLCBXVEMoMHg5YjQyZDU4MSksIFdUQygweDlhZDg3MDgxKSwgV1RDKDB4OWE2ZjAzODEpLCBXVEMoMHg5YTA2OTAwMSksIFdUQygweDk5OWYxOTgxKSwKK1dUQygweDk5MzhhMjgxKSwgV1RDKDB4OThkMzJkODEpLCBXVEMoMHg5ODZlYmQ4MSksIFdUQygweDk4MGI1NTAxKSwgV1RDKDB4OTdhOGY2ODEpLCBXVEMoMHg5NzQ3YTQ4MSksIFdUQygweDk2ZTc2MTAxKSwgV1RDKDB4OTY4ODJlMDEpLAorV1RDKDB4OTYyYTBjODEpLCBXVEMoMHg5NWNjZmYwMSksIFdUQygweDk1NzEwNjAxKSwgV1RDKDB4OTUxNjIzODEpLCBXVEMoMHg5NGJjNTk4MSksIFdUQygweDk0NjNhODgxKSwgV1RDKDB4OTQwYzEyODEpLCBXVEMoMHg5M2I1OTkwMSksCitXVEMoMHg5MzYwM2QwMSksIFdUQygweDkzMGJmZjgxKSwgV1RDKDB4OTJiOGUxMDEpLCBXVEMoMHg5MjY2ZTI4MSksIFdUQygweDkyMTYwMzAxKSwgV1RDKDB4OTFjNjQzMDEpLCBXVEMoMHg5MTc3YTMwMSksIFdUQygweDkxMmEyMjAxKSwKK1dUQygweDkwZGRjMDAxKSwgV1RDKDB4OTA5MjdiODEpLCBXVEMoMHg5MDQ4NTQwMSksIFdUQygweDhmZmY0NjAxKSwgV1RDKDB4OGZiNzRmODEpLCBXVEMoMHg4ZjcwNmYwMSksIFdUQygweDhmMmFhMTAxKSwgV1RDKDB4OGVlNWUzMDEpLAorV1RDKDB4OGVhMjMyMDEpLCBXVEMoMHg4ZTVmODg4MSksIFdUQygweDhlMWRlMDAxKSwgV1RDKDB4OGRkZDMyMDEpLCBXVEMoMHg4ZDlkNzc4MSksIFdUQygweDhkNWVhYTAxKSwgV1RDKDB4OGQyMGMzMDEpLCBXVEMoMHg4Y2UzYmE4MSksCitXVEMoMHg4Y2E3ODc4MSksIFdUQygweDhjNmMxYjAxKSwgV1RDKDB4OGMzMTY2ODEpLCBXVEMoMHg4YmY3NWIwMSksIFdUQygweDhiYmRlOTgxKSwgV1RDKDB4OGI4NTAyODEpLCBXVEMoMHg4YjRjOTcwMSksIFdUQygweDhiMTQ5NzAxKSwKK1dUQygweDhhZGNlZTAxKSwgV1RDKDB4OGFhNTg2ODEpLCBXVEMoMHg4YTZlNGEwMSksIFdUQygweDhhMzcyODgxKSwgV1RDKDB4OGEwMDFmMDEpLCBXVEMoMHg4OWM5MmY4MSksIFdUQygweDg5OTI1YTgxKSwgV1RDKDB4ODk1YmNkMDEpLAorV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGYxMzgwMSksIFdUQygweDg4YmUxNjgxKSwgV1RDKDB4ODg4ZDMxODEpLCBXVEMoMHg4ODVmODQ4MSksIFdUQygweDg4MzUzNTAxKSwgV1RDKDB4ODgxMjQyODEpLCBXVEMoMHg4N2U3M2Q4MSksCitXVEMoMHg4N2Q0YWM4MSksIFdUQygweDg3Y2I1MTAxKSwgV1RDKDB4ODdjMDVlODEpLCBXVEMoMHg4N2I0MjQ4MSksIFdUQygweDg3YTcwZTgxKSwgV1RDKDB4ODc5OThmMDEpLCBXVEMoMHg4NzhjMTg4MSksIFdUQygweDg3N2VkZTAxKSwKK1dUQygweDg3NzFjNjAxKSwgV1RDKDB4ODc2NGIxMDEpLCBXVEMoMHg4NzU3ODE4MSksIFdUQygweDg3NGEyZjAxKSwgV1RDKDB4ODczY2MyMDEpLCBXVEMoMHg4NzJmNDIwMSksIFdUQygweDg3MjFiNDgxKSwgV1RDKDB4ODcxNDFiMDEpLAorV1RDKDB4ODcwNjcyODEpLCBXVEMoMHg4NmY4YmE4MSksIFdUQygweDg2ZWFmMDgxKSwgV1RDKDB4ODZkZDE0ODEpLCBXVEMoMHg4NmNmMjYwMSksIFdUQygweDg2YzEyNDAxKSwgV1RDKDB4ODZiMzBmMDEpLCBXVEMoMHg4NmE0ZTc4MSksCitXVEMoMHg4Njk2YWQwMSksIFdUQygweDg2ODg2MDAxKSwgV1RDKDB4ODY3YTAwODEpLCBXVEMoMHg4NjZiOGQ4MSksIFdUQygweDg2NWQwNTgxKSwgV1RDKDB4ODY0ZTY5MDEpLCBXVEMoMHg4NjNmYjcwMSksIFdUQygweDg2MzBmMTgxKSwKK1dUQygweDg2MjIxODAxKSwgV1RDKDB4ODYxMzJjMDEpLCBXVEMoMHg4NjA0MmMwMSksIFdUQygweDg1ZjUxNjgxKSwgV1RDKDB4ODVlNWViODEpLCBXVEMoMHg4NWQ2YTk4MSksIFdUQygweDg1Yzc1MjAxKSwgV1RDKDB4ODViN2U2MDEpLAorV1RDKDB4ODVhODY1ODEpLCBXVEMoMHg4NTk4ZDA4MSksIFdUQygweDg1ODkyNjgxKSwgV1RDKDB4ODU3OTY2MDEpLCBXVEMoMHg4NTY5OGU4MSksIFdUQygweDg1NTlhMDgxKSwgV1RDKDB4ODU0OTlkMDEpLCBXVEMoMHg4NTM5ODQ4MSksCitXVEMoMHg4NTI5NTg4MSksIFdUQygweDg1MTkxODAxKSwgV1RDKDB4ODUwOGMxODEpLCBXVEMoMHg4NGY4NTU4MSksIFdUQygweDg0ZTdkMzgxKSwgV1RDKDB4ODRkNzNjMDEpLCBXVEMoMHg4NGM2OTEwMSksIFdUQygweDg0YjVkMzAxKSwKK1dUQygweDg0YTUwMjAxKSwgV1RDKDB4ODQ5NDFkODEpLCBXVEMoMHg4NDgzMjQ4MSksIFdUQygweDg0NzIxNzAxKSwgV1RDKDB4ODQ2MGY1ODEpLCBXVEMoMHg4NDRmYzA4MSksIFdUQygweDg0M2U3YTgxKSwgV1RDKDB4ODQyZDIyODEpLAorV1RDKDB4ODQxYmI5ODEpLCBXVEMoMHg4NDBhM2U4MSksIFdUQygweDgzZjhiMDAxKSwgV1RDKDB4ODNlNzBmMDEpLCBXVEMoMHg4M2Q1NWQwMSksIFdUQygweDgzYzM5YTgxKSwgV1RDKDB4ODNiMWM4ODEpLCBXVEMoMHg4MzlmZTgwMSksCitXVEMoMHg4MzhkZjgwMSksIFdUQygweDgzN2JmODAxKSwgV1RDKDB4ODM2OWU3ODEpLCBXVEMoMHg4MzU3YzcwMSksIFdUQygweDgzNDU5ODgxKSwgV1RDKDB4ODMzMzVjODEpLCBXVEMoMHg4MzIxMTUwMSksIFdUQygweDgzMGVjMDgxKSwKK1dUQygweDgyZmM1ZjAxKSwgV1RDKDB4ODJlOWVmMDEpLCBXVEMoMHg4MmQ3NzIwMSksIFdUQygweDgyYzRlODAxKSwgV1RDKDB4ODJiMjUzMDEpLCBXVEMoMHg4MjlmYjQwMSksIFdUQygweDgyOGQwYjAxKSwgV1RDKDB4ODI3YTU4MDEpLAorV1RDKDB4ODI2Nzk5MDEpLCBXVEMoMHg4MjU0Y2YwMSksIFdUQygweDgyNDFmYTAxKSwgV1RDKDB4ODIyZjFiMDEpLCBXVEMoMHg4MjFjMzQwMSksIFdUQygweDgyMDk0NTgxKSwgV1RDKDB4ODFmNjRmMDEpLCBXVEMoMHg4MWUzNGY4MSksCitXVEMoMHg4MWQwNDY4MSksIFdUQygweDgxYmQzNDAxKSwgV1RDKDB4ODFhYTE5ODEpLCBXVEMoMHg4MTk2Zjc4MSksIFdUQygweDgxODNjZjgxKSwgV1RDKDB4ODE3MGExODEpLCBXVEMoMHg4MTVkNmMwMSksIFdUQygweDgxNGEyZjgxKSwKK1dUQygweDgxMzZlYTAxKSwgV1RDKDB4ODEyMzlkODEpLCBXVEMoMHg4MTEwNGEwMSksIFdUQygweDgwZmNmMTgxKSwgV1RDKDB4ODBlOTk0MDEpLCBXVEMoMHg4MGQ2MzEwMSksIFdUQygweDgwYzJjNzgxKSwgV1RDKDB4ODBhZjU3MDEpLAorV1RDKDB4ODA5YmRmMDEpLCBXVEMoMHg4MDg4NjA4MSksIFdUQygweDgwNzRkYzAxKSwgV1RDKDB4ODA2MTUyODEpLCBXVEMoMHg4MDRkYzQ4MSksIFdUQygweDgwM2EzMzgxKSwgV1RDKDB4ODAyNjlmODEpLCBXVEMoMHg4MDEzMDk4MSksCitXVEMoMHgwYTYwODIyMCksIFdUQygweDBhOGVlN2QwKSwgV1RDKDB4MGFiZTM1YzApLCBXVEMoMHgwYWVlNWRlMCksIFdUQygweDBiMWY1MjMwKSwgV1RDKDB4MGI1MTA0YTApLCBXVEMoMHgwYjgzNjcyMCksIFdUQygweDBiYjY2YmIwKSwKK1dUQygweDBiZWEwNDQwKSwgV1RDKDB4MGMxZTIyYzApLCBXVEMoMHgwYzUyYmE3MCksIFdUQygweDBjODdjYTkwKSwgV1RDKDB4MGNiZDViYTApLCBXVEMoMHgwY2YzNzVlMCksIFdUQygweDBkMmExZjUwKSwgV1RDKDB4MGQ2MTU0ODApLAorV1RDKDB4MGQ5OTBlNDApLCBXVEMoMHgwZGQxNDUwMCksIFdUQygweDBlMDlmNzMwKSwgV1RDKDB4MGU0MzJlOTApLCBXVEMoMHgwZTdjZjc5MCksIFdUQygweDBlYjc1ZTUwKSwgV1RDKDB4MGVmMjY0MzApLCBXVEMoMHgwZjJkZmQ3MCksCitXVEMoMHgwZjZhMWQ3MCksIFdUQygweDBmYTZiN2UwKSwgV1RDKDB4MGZlM2MzZDApLCBXVEMoMHgxMDIxM2FjMCksIFdUQygweDEwNWYxNjQwKSwgV1RDKDB4MTA5ZDRmMjApLCBXVEMoMHgxMGRiZGI4MCksIFdUQygweDExMWFiMGMwKSwKK1dUQygweDExNTljMzYwKSwgV1RDKDB4MTE5OTBmYzApLCBXVEMoMHgxMWQ4YTA2MCksIFdUQygweDEyMTg4MmMwKSwgV1RDKDB4MTI1OGM0ODApLCBXVEMoMHgxMjk5NWE0MCksIFdUQygweDEyZGExYjAwKSwgV1RDKDB4MTMxYWRiNjApLAorV1RDKDB4MTM1YjcwYzApLCBXVEMoMHgxMzliYjY4MCksIFdUQygweDEzZGI4YzAwKSwgV1RDKDB4MTQxYWQwODApLCBXVEMoMHgxNDU5NjQ2MCksIFdUQygweDE0OTcyOWUwKSwgV1RDKDB4MTRkNDA0ZTApLCBXVEMoMHgxNTBmZDhlMCksCitXVEMoMHgxNTRhODhjMCksIFdUQygweDE1ODNmNWUwKSwgV1RDKDB4MTViYzAxMjApLCBXVEMoMHgxNWYyOGJhMCksIFdUQygweDE2Mjc3OWEwKSwgV1RDKDB4MTY1YWIzMDApLCBXVEMoMHgxNjhjMjA0MCksIFdUQygweDE2YmJhYTgwKSwKK1dUQygweDE2ZTk0MTIwKSwgV1RDKDB4MTcxNGQ5ZTApLCBXVEMoMHgxNzNlNjQ0MCksIFdUQygweDE3NjYwNjgwKSwgV1RDKDB4MTc4Y2EwMjApLCBXVEMoMHgxN2IzNjQwMCksIFdUQygweDE3ZGI4NGUwKSwgV1RDKDB4MTgwNWQ5MjApLAorV1RDKDB4MTgzMjg0MDApLCBXVEMoMHgxODYxN2NjMCksIFdUQygweDE4OTJiZmEwKSwgV1RDKDB4MThjNjQ1NDApLCBXVEMoMHgxOGZjMDQwMCksIFdUQygweDE5MzNmMTQwKSwgV1RDKDB4MTk2ZTAzMjApLCBXVEMoMHgxOWFhMmZjMCksCitXVEMoMHgxOWU4NmQ4MCksIFdUQygweDFhMjhiMmUwKSwgV1RDKDB4MWE2YWY3MDApLCBXVEMoMHgxYWFmMzMyMCksIFdUQygweDFhZjU2MTgwKSwgV1RDKDB4MWIzZDdjZTApLCBXVEMoMHgxYjg3N2M0MCksIFdUQygweDFiZDM1MGMwKSwKK1dUQygweDFjMjBlYTQwKSwgV1RDKDB4MWM3MDM4NDApLCBXVEMoMHgxY2MxMzg2MCksIFdUQygweDFkMTNmNzYwKSwgV1RDKDB4MWQ2ODg0MjApLCBXVEMoMHgxZGJlZWQ0MCksIFdUQygweDFlMTc0NjYwKSwgV1RDKDB4MWU3MWE2NDApLAorV1RDKDB4MWVjZTI0MDApLCBXVEMoMHgxZjJjZDIyMCksIFdUQygweDFmOGRiM2MwKSwgV1RDKDB4MWZmMGMzZTApLCBXVEMoMHgyMDU2MDA4MCksIFdUQygweDIwYmQ0NmMwKSwgV1RDKDB4MjEyNjM0MDApLCBXVEMoMHgyMTkwNTc0MCksCitXVEMoMHgyMWZiNDEwMCksIFdUQygweDIyNjZiYTgwKSwgV1RDKDB4MjJkMmQxNDApLCBXVEMoMHgyMzNmOTc4MCksIFdUQygweDIzYWQyNWMwKSwgV1RDKDB4MjQxYmM4MDApLCBXVEMoMHgyNDhiZjA0MCksIFdUQygweDI0ZmUxMzgwKSwKK1dUQygweDI1NzI4MTgwKSwgV1RDKDB4MjVlOTBhMDApLCBXVEMoMHgyNjYxNDA4MCksIFdUQygweDI2ZGFiZGMwKSwgV1RDKDB4Mjc1NTI1NDApLCBXVEMoMHgyN2QwMzIwMCksIFdUQygweDI4NGJhNTgwKSwgV1RDKDB4MjhjNzQwYzApLAorV1RDKDB4Mjk0MzFmODApLCBXVEMoMHgyOWJmYzljMCksIFdUQygweDJhM2RkMDgwKSwgV1RDKDB4MmFiZGMwMDApLCBXVEMoMHgyYjNmZmQwMCksIFdUQygweDJiYzRjZDgwKSwgV1RDKDB4MmM0YzdkNDApLCBXVEMoMHgyY2Q3MmVjMCksCitXVEMoMHgyZDY0N2Y4MCksIFdUQygweDJkZjNjZDgwKSwgV1RDKDB4MmU4NDdkODApLCBXVEMoMHgyZjE1ZWE0MCksIFdUQygweDJmYTc2MGMwKSwgV1RDKDB4MzAzODJiODApLCBXVEMoMHgzMGM3OTQ0MCksIFdUQygweDMxNTU2NmMwKSwKK1dUQygweDMxZTIwODAwKSwgV1RDKDB4MzI2ZGU3YzApLCBXVEMoMHgzMmY5ODIwMCksIFdUQygweDMzODViYTAwKSwgV1RDKDB4MzQxM2JlYzApLCBXVEMoMHgzNGE0YzQ4MCksIFdUQygweDM1MzliZjAwKSwgV1RDKDB4MzVkMmM0YzApLAorV1RDKDB4MzY2ZjgzNDApLCBXVEMoMHgzNzBmYjgwMCksIFdUQygweDM3YjJjZjgwKSwgV1RDKDB4Mzg1N2E0ODApLCBXVEMoMHgzOGZjZWU4MCksIFdUQygweDM5YTE2ODQwKSwgV1RDKDB4M2E0NDIyYzApLCBXVEMoMHgzYWU0OTVjMCksCitXVEMoMHgzYjgyNDAwMCksIFdUQygweDNjMWNiNTAwKSwgV1RDKDB4M2NiNDM4YzApLCBXVEMoMHgzZDQ5OTRjMCksIFdUQygweDNkZGQ4ZjQwKSwgV1RDKDB4M2U3MGVjMDApLCBXVEMoMHgzZjA0NWU0MCksIFdUQygweDNmOTg5MDgwKSwKK1dUQygweDQwMmUzMmZmKSwgV1RDKDB4NDBjNWMwN2YpLCBXVEMoMHg0MTVmNTQ3ZiksIFdUQygweDQxZmFmMDdmKSwgV1RDKDB4NDI5ODk5N2YpLCBXVEMoMHg0MzM4MzA3ZiksIFdUQygweDQzZDk2YmZmKSwgV1RDKDB4NDQ3YmZmZmYpLAorV1RDKDB4NDUxZjljZmYpLCBXVEMoMHg0NWMzZGFmZiksIFdUQygweDQ2NjgzZWZmKSwgV1RDKDB4NDcwYzRjZmYpLCBXVEMoMHg0N2FmOTNmZiksIFdUQygweDQ4NTFjM2ZmKSwgV1RDKDB4NDhmMjlkN2YpLCBXVEMoMHg0OTkxZGU3ZiksCitXVEMoMHg0YTJmNWU3ZiksIFdUQygweDRhY2IyODdmKSwgV1RDKDB4NGI2NTUzN2YpLCBXVEMoMHg0YmZkZjM3ZiksIFdUQygweDRjOTUzMzdmKSwgV1RDKDB4NGQyYjUxZmYpLCBXVEMoMHg0ZGMwOTFmZiksIFdUQygweDRlNTUzM2ZmKSwKK1dUQygweDRlZTk2YjdmKSwgV1RDKDB4NGY3ZDYxZmYpLCBXVEMoMHg1MDExNDBmZiksIFdUQygweDUwYTUzMTdmKSwgV1RDKDB4NTEzOTVhN2YpLCBXVEMoMHg1MWNkZGY3ZiksIFdUQygweDUyNjJlNmZmKSwgV1RDKDB4NTJmODg1ZmYpLAorV1RDKDB4NTM4ZWI0N2YpLCBXVEMoMHg1NDI1NjBmZiksIFdUQygweDU0YmM3YjdmKSwgV1RDKDB4NTU1M2E4ZmYpLCBXVEMoMHg1NWVhMzVmZiksIFdUQygweDU2N2Y2NmZmKSwgV1RDKDB4NTcxMjg5N2YpLCBXVEMoMHg1N2EzM2E3ZiksCitXVEMoMHg1ODMxNTJmZiksIFdUQygweDU4YmNhNWZmKSwgV1RDKDB4NTk0NTMwZmYpLCBXVEMoMHg1OWNiNzlmZiksIFdUQygweDVhNTA0N2ZmKSwgV1RDKDB4NWFkNDVlZmYpLCBXVEMoMHg1YjU4NGU3ZiksIFdUQygweDViZGM0MTdmKSwKK1dUQygweDVjNjA0ODdmKSwgV1RDKDB4NWNlNDc2ZmYpLCBXVEMoMHg1ZDY4YzQ3ZiksIFdUQygweDVkZWQwNmZmKSwgV1RDKDB4NWU3MTExZmYpLCBXVEMoMHg1ZWY0YjVmZiksIFdUQygweDVmNzdhMTdmKSwgV1RDKDB4NWZmOTZhZmYpLAorV1RDKDB4NjA3OWE3ZmYpLCBXVEMoMHg2MGY3ZjdmZiksIFdUQygweDYxNzQxN2ZmKSwgV1RDKDB4NjFlZGQ4N2YpLCBXVEMoMHg2MjY0ZmZmZiksIFdUQygweDYyZDlhNmZmKSwgV1RDKDB4NjM0YzgxN2YpLCBXVEMoMHg2M2JlNjU3ZiksCitXVEMoMHg2NDMwMjc3ZiksIFdUQygweDY0YTIyNDdmKSwgV1RDKDB4NjUxNDJiZmYpLCBXVEMoMHg2NTg2MDI3ZiksIFdUQygweDY1Zjc2OTdmKSwgV1RDKDB4NjY2ODAxZmYpLCBXVEMoMHg2NmQ3NTZmZiksIFdUQygweDY3NDRmMGZmKSwKK1dUQygweDY3YjA3ODdmKSwgV1RDKDB4NjgxYTA3N2YpLCBXVEMoMHg2ODgxZWJmZiksIFdUQygweDY4ZTg3MDdmKSwgV1RDKDB4Njk0ZGNlZmYpLCBXVEMoMHg2OWIyMWU3ZiksIFdUQygweDZhMTU2Y2ZmKSwgV1RDKDB4NmE3N2NhN2YpLAorV1RDKDB4NmFkOTM3N2YpLCBXVEMoMHg2YjM5YTRmZiksIFdUQygweDZiOTkwMWZmKSwgV1RDKDB4NmJmNzNjZmYpLCBXVEMoMHg2YzU0NDU3ZiksIFdUQygweDZjYjAwYWZmKSwgV1RDKDB4NmQwYTdiZmYpLCBXVEMoMHg2ZDYzODdmZiksCitXVEMoMHhhZTJjYmUwMSksIFdUQygweGFmNTI2ZDAxKSwgV1RDKDB4YjA3NTEyMDEpLCBXVEMoMHhiMTk0ZGE4MSksIFdUQygweGIyYjFmNDAxKSwgV1RDKDB4YjNjYzhkMDEpLCBXVEMoMHhiNGU0ZDIwMSksIFdUQygweGI1ZmFmMTAxKSwKK1dUQygweGI3MGYxODgxKSwgV1RDKDB4YjgyMTczMDEpLCBXVEMoMHhiOTMyMTE4MSksIFdUQygweGJhNDBlZTAxKSwgV1RDKDB4YmI0ZTAyMDEpLCBXVEMoMHhiYzU5NDc4MSksIFdUQygweGJkNjJiODgxKSwgV1RDKDB4YmU2YTUxODEpLAorV1RDKDB4YmY3MDBkMDEpLCBXVEMoMHhjMDczZTRjMCksIFdUQygweGMxNzVkMjQwKSwgV1RDKDB4YzI3NWNjODApLCBXVEMoMHhjMzczY2I4MCksIFdUQygweGM0NmZjYTAwKSwgV1RDKDB4YzU2OWM2MDApLCBXVEMoMHhjNjYxYmRjMCksCitXVEMoMHhjNzU3YWY4MCksIFdUQygweGM4NGI5ODQwKSwgV1RDKDB4YzkzZDczMDApLCBXVEMoMHhjYTJkM2E0MCksIFdUQygweGNiMWFlYTQwKSwgV1RDKDB4Y2MwNjgyODApLCBXVEMoMHhjY2YwMDQ4MCksIFdUQygweGNkZDc3MjAwKSwKK1dUQygweGNlYmNjYjQwKSwgV1RDKDB4Y2ZhMDBkODApLCBXVEMoMHhkMDgxMzU0MCksIFdUQygweGQxNjAzZjAwKSwgV1RDKDB4ZDIzZDI5ODApLCBXVEMoMHhkMzE3ZjdjMCksIFdUQygweGQzZjBhYzQwKSwgV1RDKDB4ZDRjNzQ5ODApLAorV1RDKDB4ZDU5YmNmODApLCBXVEMoMHhkNjZlM2IwMCksIFdUQygweGQ3M2U4OTAwKSwgV1RDKDB4ZDgwY2I3NDApLCBXVEMoMHhkOGQ4YzdjMCksIFdUQygweGQ5YTJiZTAwKSwgV1RDKDB4ZGE2YTllNDApLCBXVEMoMHhkYjMwNmE0MCksCitXVEMoMHhkYmY0MjA4MCksIFdUQygweGRjYjViZTgwKSwgV1RDKDB4ZGQ3NTQxNDApLCBXVEMoMHhkZTMyYTkwMCksIFdUQygweGRlZWRmOWMwKSwgV1RDKDB4ZGZhNzM3YzApLCBXVEMoMHhlMDVlNjc0MCksIFdUQygweGUxMTM4OTAwKSwKK1dUQygweGUxYzY5YWMwKSwgV1RDKDB4ZTI3NzlhNDApLCBXVEMoMHhlMzI2ODY4MCksIFdUQygweGUzZDM2MjYwKSwgV1RDKDB4ZTQ3ZTMzYTApLCBXVEMoMHhlNTI2ZmY4MCksIFdUQygweGU1Y2RjOTYwKSwgV1RDKDB4ZTY3MjkxMDApLAorV1RDKDB4ZTcxNTU0NjApLCBXVEMoMHhlN2I2MTFjMCksIFdUQygweGU4NTRjYTIwKSwgV1RDKDB4ZThmMTgxODApLCBXVEMoMHhlOThjM2NhMCksIFdUQygweGVhMjRmZmUwKSwgV1RDKDB4ZWFiYmNiMjApLCBXVEMoMHhlYjUwOWI2MCksCitXVEMoMHhlYmUzNmQwMCksIFdUQygweGVjNzQzZTAwKSwgV1RDKDB4ZWQwMzEwZTApLCBXVEMoMHhlZDhmZWFhMCksIFdUQygweGVlMWFkMDYwKSwgV1RDKDB4ZWVhM2M2NDApLCBXVEMoMHhlZjJhY2Q2MCksIFdUQygweGVmYWZlNmEwKSwKK1dUQygweGYwMzMxMmYwKSwgV1RDKDB4ZjBiNDU4MDApLCBXVEMoMHhmMTMzYzIzMCksIFdUQygweGYxYjE1ZWYwKSwgV1RDKDB4ZjIyZDNhZjApLCBXVEMoMHhmMmE3NWM4MCksIFdUQygweGYzMWZjNDYwKSwgV1RDKDB4ZjM5NjczYjApLAorV1RDKDB4ZjQwYjZhMDApLCBXVEMoMHhmNDdlYTIzMCksIFdUQygweGY0ZjAxNDUwKSwgV1RDKDB4ZjU1ZmI5MzApLCBXVEMoMHhmNWNkODRjMCksIFdUQygweGY2Mzk2MDkwKSwgV1RDKDB4ZjZhMzMzZTApLCBXVEMoMHhmNzBhZTU0MCksCitXVEMoMHhmNzcwNzI2MCksIFdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgzNTkyZjApLCBXVEMoMHhmODk1NjQ1MCksIFdUQygweGY4ZjM4MTIwKSwgV1RDKDB4Zjk0ZmY3YzgpLCBXVEMoMHhmOWFhZDc0MCksIFdUQygweGZhMDQyOTIwKSwKK1dUQygweGZhNWJlMTEwKSwgV1RDKDB4ZmFiMWU3NzgpLCBXVEMoMHhmYjA2MjQ3OCksIFdUQygweGZiNTg4ZDc4KSwgV1RDKDB4ZmJhOTM1MzApLCBXVEMoMHhmYmY4MzZjOCksIFdUQygweGZjNDVhY2UwKSwgV1RDKDB4ZmM5MWEyOTQpLAorV1RDKDB4ZmNkYzBlNWMpLCBXVEMoMHhmZDI0ZTQzOCksIFdUQygweGZkNmMxN2RjKSwgV1RDKDB4ZmRiMTk3NTgpLCBXVEMoMHhmZGY1NGMzYyksIFdUQygweGZlMzcxZWY4KSwgV1RDKDB4ZmU3NzAxYWEpLCBXVEMoMHhmZWI1MGQ2MiksCitXVEMoMHhmZWYxNzAwYSksIFdUQygweGZmMmM1NTc0KSwgV1RDKDB4ZmY2NWVlN2IpLCBXVEMoMHhmZjllNzVkZSksIFdUQygweGZmZDYyODYzKSwgV1RDKDB4MDAwZDQ0MDEpLCBXVEMoMHgwMDQzZDM0NSksIFdUQygweDAwNzk5Y2QwKSwKK1dUQygweDAwYWU1ZjQ5KSwgV1RDKDB4MDBlMWQ3YTQpLCBXVEMoMHgwMTEzYTZmMiksIFdUQygweDAxNDM1NzVjKSwgV1RDKDB4MDE3MDcwMjQpLCBXVEMoMHgwMTlhOTM0NiksIFdUQygweDAxYzFjZjA4KSwgV1RDKDB4MDFlNjZjMTIpLAorV1RDKDB4MDIwOGFjNDgpLCBXVEMoMHgwMjI4ZTg2OCksIFdUQygweDAyNDdhNmM4KSwgV1RDKDB4MDI2NTdhYTApLCBXVEMoMHgwMjgyZjcxMCksIFdUQygweDAyYTA3ZTUwKSwgV1RDKDB4MDJiZTMxYzApLCBXVEMoMHgwMmRjMmIzMCksCitXVEMoMHgwMmZhN2YzNCksIFdUQygweDAzMThmYjEwKSwgV1RDKDB4MDMzNzJmZGMpLCBXVEMoMHgwMzU0YWU1NCksIFdUQygweDAzNzEwZDE4KSwgV1RDKDB4MDM4YmZkYjQpLCBXVEMoMHgwM2E1NDA4NCksIFdUQygweDAzYmM5MmI4KSwKK1dUQygweDAzZDFjNzEwKSwgV1RDKDB4MDNlNGRkMjApLCBXVEMoMHgwM2Y1ZTI1YyksIFdUQygweDA0MDRlMjE4KSwgV1RDKDB4MDQxMWZjMzApLCBXVEMoMHgwNDFkNmIzMCksIFdUQygweDA0Mjc2Y2QwKSwgV1RDKDB4MDQzMDNlMDApLAorV1RDKDB4MDQzODE1MjgpLCBXVEMoMHgwNDNmMjMxMCksIFdUQygweDA0NDU5OTA4KSwgV1RDKDB4MDQ0YmE0MzApLCBXVEMoMHgwNDUxNjFmOCksIFdUQygweDA0NTZlNmY4KSwgV1RDKDB4MDQ1YzQ5YTgpLCBXVEMoMHgwNDYxOTJmOCksCitXVEMoMHgwNDY2YWY0MCksIFdUQygweDA0NmI4MjQwKSwgV1RDKDB4MDQ2ZmYwZDgpLCBXVEMoMHgwNDczZGUxOCksIFdUQygweDA0NzcyYjU4KSwgV1RDKDB4MDQ3OWI5YTApLCBXVEMoMHgwNDdiNmEzMCksIFdUQygweDA0N2MyMDg4KSwKK1dUQygweDA0N2JjMjMwKSwgV1RDKDB4MDQ3YTM0MTgpLCBXVEMoMHgwNDc3NjA5OCksIFdUQygweDA0NzM0NzkwKSwgV1RDKDB4MDQ2ZGY0YzApLCBXVEMoMHgwNDY3NzIyMCksIFdUQygweDA0NWZkMWIwKSwgV1RDKDB4MDQ1NzM1ODgpLAorV1RDKDB4MDQ0ZGM0YjgpLCBXVEMoMHgwNDQzYTViOCksIFdUQygweDA0MzkwMTYwKSwgV1RDKDB4MDQyZTAzOTgpLCBXVEMoMHgwNDIyZDhjMCksIFdUQygweDA0MTdhYTMwKSwgV1RDKDB4MDQwYzdjZTApLCBXVEMoMHgwNDAxMzZlMCksCitXVEMoMHgwM2Y1YmViMCksIFdUQygweDAzZTlmOGVjKSwgV1RDKDB4MDNkZGM0ODQpLCBXVEMoMHgwM2QwZmQ5YyksIFdUQygweDAzYzM3ZmEwKSwgV1RDKDB4MDNiNTMwMTQpLCBXVEMoMHgwM2E2MGExOCksIFdUQygweDAzOTYwZjg4KSwKK1dUQygweDAzODU0MTEwKSwgV1RDKDB4MDM3M2FkOWMpLCBXVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGViZjljKSwgV1RDKDB4MDMzYmFiMzApLCBXVEMoMHgwMzI4NGVmMCksIFdUQygweDAzMTRiNTk4KSwgV1RDKDB4MDMwMGVhNTQpLAorV1RDKDB4MDJlY2Y1MjQpLCBXVEMoMHgwMmQ4ZDIxMCksIFdUQygweDAyYzQ3NmFjKSwgV1RDKDB4MDJhZmQ5NDApLCBXVEMoMHgwMjlhZWU0YyksIFdUQygweDAyODVhNmY0KSwgV1RDKDB4MDI2ZmYzOTgpLCBXVEMoMHgwMjU5YzQ0OCksCitXVEMoMHgwMjQzMTdjYyksIFdUQygweDAyMmMwMDg0KSwgV1RDKDB4MDIxNDkzMTApLCBXVEMoMHgwMWZjZTMzNCksIFdUQygweDAxZTRmYjI0KSwgV1RDKDB4MDFjY2RkMGEpLCBXVEMoMHgwMWI0OGIyMCksIFdUQygweDAxOWMwNzdlKSwKK1dUQygweDAxODM1NDMyKSwgV1RDKDB4MDE2YTczM2MpLCBXVEMoMHgwMTUxNjZhNiksIFdUQygweDAxMzgzMDJlKSwgV1RDKDB4MDExZWQwZjYpLCBXVEMoMHgwMTA1NDlmOCksIFdUQygweDAwZWI5YzI1KSwgV1RDKDB4MDBkMWNhYTYpLAorV1RDKDB4MDBiN2RiOTQpLCBXVEMoMHgwMDlkZDU2MCksIFdUQygweDAwODNiZTc1KSwgV1RDKDB4MDA2OTlkNDEpLCBXVEMoMHgwMDRmNzgyZiksIFdUQygweDAwMzU1NWFiKSwgV1RDKDB4MDAxYjNjMjEpLCBXVEMoMHgwMDAxMzFmZSksCitXVEMoMHhkNjFjZmM0MCksIFdUQygweGQ1YWNiMzQwKSwgV1RDKDB4ZDUzZDQ0MDApLCBXVEMoMHhkNGNlYTZjMCksIFdUQygweGQ0NjBkNDQwKSwgV1RDKDB4ZDNmM2M0NDApLCBXVEMoMHhkMzg3NmY4MCksIFdUQygweGQzMWJjZTQwKSwKK1dUQygweGQyYjBkOTAwKSwgV1RDKDB4ZDI0Njg5ODApLCBXVEMoMHhkMWRjZWYwMCksIFdUQygweGQxNzQyOWMwKSwgV1RDKDB4ZDEwYzViODApLCBXVEMoMHhkMGE1OWI4MCksIFdUQygweGQwM2ZkNzgwKSwgV1RDKDB4Y2ZkYWU3ODApLAorV1RDKDB4Y2Y3NmEzODApLCBXVEMoMHhjZjEyZmFjMCksIFdUQygweGNlYjAxMTAwKSwgV1RDKDB4Y2U0ZTE4YzApLCBXVEMoMHhjZGVkNDQ0MCksIFdUQygweGNkOGQ5YTQwKSwgV1RDKDB4Y2QyZWU4MDApLCBXVEMoMHhjY2QwZjQ0MCksCitXVEMoMHhjYzczODc4MCksIFdUQygweGNjMTY3ZDQwKSwgV1RDKDB4Y2JiOWMxODApLCBXVEMoMHhjYjVkNDA0MCksIFdUQygweGNiMDBlMjQwKSwgV1RDKDB4Y2FhNDgwMDApLCBXVEMoMHhjYTQ3ZWFjMCksIFdUQygweGM5ZWFmMWMwKSwKK1dUQygweGM5OGQ4MTAwKSwgV1RDKDB4YzkyZmM1ODApLCBXVEMoMHhjOGQxZmM4MCksIFdUQygweGM4NzQ2NDgwKSwgV1RDKDB4YzgxNmRjNDApLCBXVEMoMHhjN2I4YzI4MCksIFdUQygweGM3NTk2ODAwKSwgV1RDKDB4YzZmODFmODApLAorV1RDKDB4YzY5NDU3NDApLCBXVEMoMHhjNjJkOTNjMCksIFdUQygweGM1YzM1OGMwKSwgV1RDKDB4YzU1NTJiODApLCBXVEMoMHhjNGUyOTI0MCksIFdUQygweGM0NmIxNDQwKSwgV1RDKDB4YzNlZTM4NDApLCBXVEMoMHhjMzZiODUwMCksCitXVEMoMHhjMmUyODA0MCksIFdUQygweGMyNTJhZTgwKSwgV1RDKDB4YzFiYjk1NDApLCBXVEMoMHhjMTFjYzIwMCksIFdUQygweGMwNzVjZjAwKSwgV1RDKDB4YmZjNjU3ODEpLCBXVEMoMHhiZjBkZjg4MSksIFdUQygweGJlNGM2ZjAxKSwKK1dUQygweGJkODE5NDAxKSwgV1RDKDB4YmNhZDJkMDEpLCBXVEMoMHhiYmNmYjk4MSksIFdUQygweGJhZWNhNjgxKSwgV1RDKDB4YmEwOGU3ODEpLCBXVEMoMHhiOTI5NzA4MSksIFdUQygweGI4NTFlMDgxKSwgV1RDKDB4Yjc4MmVkMDEpLAorV1RDKDB4YjZiYzZhODEpLCBXVEMoMHhiNWZlNDk4MSksIFdUQygweGI1NDg3MjgxKSwgV1RDKDB4YjQ5YWQwODEpLCBXVEMoMHhiM2Y1NGQ4MSksIFdUQygweGIzNTdkNDAxKSwgV1RDKDB4YjJjMjRlMDEpLCBXVEMoMHhiMjM0YTY4MSksCitXVEMoMHhiMWFlYzcwMSksIFdUQygweGIxMzA5YjAxKSwgV1RDKDB4YjBiYTBjMDEpLCBXVEMoMHhiMDRiMDQ4MSksIFdUQygweGFmZTM2ZjAxKSwgV1RDKDB4YWY4MzM2MDEpLCBXVEMoMHhhZjJhNDM4MSksIFdUQygweGFlZDg4MjAxKSwKK1dUQygweGFlOGRkYjgxKSwgV1RDKDB4YWU0YTNiODEpLCBXVEMoMHhhZTBkOGIwMSksIFdUQygweGFkZDdiNTgxKSwgV1RDKDB4YWRhOGE0ODEpLCBXVEMoMHhhZDgwNDI4MSksIFdUQygweGFkNWU3YTgxKSwgV1RDKDB4YWQ0MzM2MDEpLAorV1RDKDB4YWQyZTYwMDEpLCBXVEMoMHhhZDFmZTI4MSksIFdUQygweGFkMTdhODAxKSwgV1RDKDB4YWQxNTlhODEpLCBXVEMoMHhhZDE5YTUwMSksIFdUQygweGFkMjNiMTAxKSwgV1RDKDB4YWQzM2FhMDEpLCBXVEMoMHhhZDQ5Nzk4MSksCitXVEMoMHhhZDY1MGEwMSksIFdUQygweGFkODY0NjAxKSwgV1RDKDB4YWRhZDE3ODEpLCBXVEMoMHhhZGQ5Njk4MSksIFdUQygweGFlMGIyNjAxKSwgV1RDKDB4YWU0MjM3ODEpLCBXVEMoMHhhZTdlODgwMSksIFdUQygweGFlYzAwMjAxKSwKK1dUQygweGFmMDY5MDgxKSwgV1RDKDB4YWY1MjFjODEpLCBXVEMoMHhhZmEyOTIwMSksIFdUQygweGFmZjdkYTAxKSwgV1RDKDB4YjA1MWRmMDEpLCBXVEMoMHhiMGIwOGM4MSksIFdUQygweGIxMTNjYjgxKSwgV1RDKDB4YjE3Yjg3MDEpLAorV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjU4MWQ4MSksIFdUQygweGIyY2NjYzgxKSwgV1RDKDB4YjM0NWExODEpLCBXVEMoMHhiM2MyODcwMSksIFdUQygweGI0NDM2NjgxKSwgV1RDKDB4YjRjODJiODEpLCBXVEMoMHhiNTUwYmY4MSksCitXVEMoMHhiNWRkMGQwMSksIFdUQygweGI2NmNmZjAxKSwgV1RDKDB4YjcwMDdmMDEpLCBXVEMoMHhiNzk3Nzc4MSksIFdUQygweGI4MzFkMzgxKSwgV1RDKDB4YjhjZjdkMDEpLCBXVEMoMHhiOTcwNWUwMSksIFdUQygweGJhMTQ2MTAxKSwKK1dUQygweGJhYmI3MDgxKSwgV1RDKDB4YmI2NTc3ODEpLCBXVEMoMHhiYzEyNWYwMSksIFdUQygweGJjYzIxMjgxKSwgV1RDKDB4YmQ3NDdiODEpLCBXVEMoMHhiZTI5ODU4MSksIFdUQygweGJlZTExOTgxKSwgV1RDKDB4YmY5YjIzMDEpLAorV1RDKDB4YzA1NzhiODApLCBXVEMoMHhjMTE2M2RjMCksIFdUQygweGMxZDcyNDAwKSwgV1RDKDB4YzI5YTI4YzApLCBXVEMoMHhjMzVmMzY0MCksIFdUQygweGM0MjYzNmMwKSwgV1RDKDB4YzRlZjE1MDApLCBXVEMoMHhjNWI5YmIwMCksCitXVEMoMHhjNjg2MTM0MCksIFdUQygweGM3NTQwODQwKSwgV1RDKDB4YzgyMzg0MDApLCBXVEMoMHhjOGY0NzEwMCksIFdUQygweGM5YzZiOWMwKSwgV1RDKDB4Y2E5YTQ4NDApLCBXVEMoMHhjYjZmMDc4MCksIFdUQygweGNjNDRlMTQwKSwKK1dUQygweGNkMWJjMDAwKSwgV1RDKDB4Y2RmMzhlMDApLCBXVEMoMHhjZWNjMzYwMCksIFdUQygweGNmYTVhMjQwKSwgV1RDKDB4ZDA3ZmJjYzApLCBXVEMoMHhkMTVhNzA0MCksIFdUQygweGQyMzVhNmMwKSwgV1RDKDB4ZDMxMTRiMDApLAorV1RDKDB4ZDNlZDQ3NDApLCBXVEMoMHhkNGM5ODU4MCksIFdUQygweGQ1YTVmMDgwKSwgV1RDKDB4ZDY4MjcyODApLCBXVEMoMHhkNzVlZjYwMCksIFdUQygweGQ4M2I2NTAwKSwgV1RDKDB4ZDkxN2FhMDApLCBXVEMoMHhkOWYzYWY4MCksCitXVEMoMHhkYWNmNWZjMCksIFdUQygweGRiYWFhNTQwKSwgV1RDKDB4ZGM4NTZhMDApLCBXVEMoMHhkZDVmOThjMCksIFdUQygweGRlMzkxYmMwKSwgV1RDKDB4ZGYxMWRkNDApLCBXVEMoMHhkZmU5Yzc4MCksIFdUQygweGUwYzBjNTQwKSwKK1dUQygweGUxOTZjMDgwKSwgV1RDKDB4ZTI2YmEzYzApLCBXVEMoMHhlMzNmNTk2MCksIFdUQygweGU0MTFjYmEwKSwgV1RDKDB4ZTRlMmU1MDApLCBXVEMoMHhlNWIyOGZjMCksIFdUQygweGU2ODBiNjQwKSwgV1RDKDB4ZTc0ZDQyZTApLAorV1RDKDB4ZTgxODFmZTApLCBXVEMoMHhlOGUxMzdlMCksIFdUQygweGU5YTg3NTAwKSwgV1RDKDB4ZWE2ZGMxYTApLCBXVEMoMHhlYjMxMDgyMCksIFdUQygweGViZjIzMzAwKSwgV1RDKDB4ZWNiMTJjNjApLCBXVEMoMHhlZDZkZGVlMCksCitXVEMoMHhlZTI4MzRhMCksIFdUQygweGVlZTAxODAwKSwgV1RDKDB4ZWY5NTczODApLCBXVEMoMHhmMDQ4MzE2MCksIFdUQygweGYwZjgzYzAwKSwgV1RDKDB4ZjFhNTdkYjApLCBXVEMoMHhmMjRmZTBmMCksIFdUQygweGYyZjc0ZmYwKSwKK1dUQygweGYzOWJiNTMwKSwgV1RDKDB4ZjQzY2ZhZjApLCBXVEMoMHhmNGRiMGI5MCksIFdUQygweGY1NzVkMTgwKSwgV1RDKDB4ZjYwZDM3MDApLCBXVEMoMHhmNmExMjY4MCksIFdUQygweGY3MzE4YTUwKSwgV1RDKDB4ZjdiZTRjYzApLAorV1RDKDB4Zjg0NzU4NTApLCBXVEMoMHhmOGNjOTczOCksIFdUQygweGY5NGRmM2UwKSwgV1RDKDB4ZjljYjU4YTgpLCBXVEMoMHhmYTQ0YWZlMCksIFdUQygweGZhYjllM2U4KSwgV1RDKDB4ZmIyYWRmMjApLCBXVEMoMHhmYjk3OGJlOCksCitXVEMoMHhmYmZmZDQ4OCksIFdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNjMmUyZjApLCBXVEMoMHhmZDFkN2Q2NCksIFdUQygweGZkNzM1ZDJjKSwgV1RDKDB4ZmRjNDZjOWMpLCBXVEMoMHhmZTEwOTYxOCksIFdUQygweGZlNTdjM2Y0KSwKK1dUQygweGZlOTllMDkwKSwgV1RDKDB4ZmVkNmQ2NDQpLCBXVEMoMHhmZjBlOGY2ZSksIFdUQygweGZmNDBmNjY3KSwgV1RDKDB4ZmY2ZGY1OGMpLCBXVEMoMHhmZjk1NzczOCksIFdUQygweGZmYjc2NWM1KSwgV1RDKDB4ZmZkM2FiOTApLAorV1RDKDB4ZmZlYTMyZjQpLCBXVEMoMHhmZmZhZTY0YyksIFdUQygweDAwMDVhZmYzKSwgV1RDKDB4MDAwYTdhNDQpLCBXVEMoMHgwMDA5MmY5YyksIFdUQygweDAwMDFiYTU0KSwgV1RDKDB4ZmZmNDA0Y2EpLCBXVEMoMHhmZmRmZjk1NykKK307CisKKworCisKKy8qCisgKiBUTlNfTUFYX0JBTkRTCisgKiBlbnRyeSBmb3IgZWFjaCBzYW1wbGluZyByYXRlCisgKiAgMSAgbG9uZyB3aW5kb3cKKyAqICAyICBTSE9SVCB3aW5kb3cKKyovCitjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl0gPQoreworICB7IDMxLCAgOSB9LCAvKiA5NjAwMCAqLworICB7IDMxLCAgOSB9LCAvKiA4ODIwMCAqLworICB7IDM0LCAxMCB9LCAvKiA2NDAwMCAqLworICB7IDQwLCAxNCB9LCAvKiA0ODAwMCAqLworICB7IDQyLCAxNCB9LCAvKiA0NDEwMCAqLworICB7IDUxLCAxNCB9LCAvKiAzMjAwMCAqLworICB7IDQ2LCAxNCB9LCAvKiAyNDAwMCAqLworICB7IDQ2LCAxNCB9LCAvKiAyMjA1MCAqLworICB7IDQyLCAxNCB9LCAvKiAxNjAwMCAqLworICB7IDQyLCAxNCB9LCAvKiAxMjAwMCAqLworICB7IDQyLCAxNCB9LCAvKiAxMTAyNSAqLworICB7IDM5LCAxNCB9LCAvKiAgODAwMCAqLworICB7IDM5LCAxNCB9LCAvKiAgNzM1MCAqLworfTsKKworLyogVE5TX01BWF9CQU5EUyBmb3IgbG93IGRlbGF5LiBUaGUgYXJyYXkgaW5kZXggaXMgdGhlIHNhbXBsZVJhdGVJbmRleCAqLworY29uc3QgVUNIQVIgdG5zX21heF9iYW5kc190YmxfNDgwWzEzXSA9IHsKKyAgMzEsIC8qIDk2MDAwICovCisgIDMxLCAvKiA4ODIwMCAqLworICAzMSwgLyogNjQwMDAgKi8KKyAgMzEsIC8qIDQ4MDAwICovCisgIDMyLCAvKiA0NDEwMCAqLworICAzNywgLyogMzIwMDAgKi8KKyAgMzAsIC8qIDI0MDAwICovCisgIDMwLCAvKiAyMjA1MCAqLworICAzMCwgLyogMTYwMDAgKi8KKyAgMzAsIC8qIDEyMDAwICovCisgIDMwLCAvKiAxMTAyNSAqLworICAzMCwgLyogIDgwMDAgKi8KKyAgMzAgIC8qICA3MzUwICovCit9OworY29uc3QgVUNIQVIgdG5zX21heF9iYW5kc190YmxfNTEyWzEzXSA9IHsKKyAgMzEsIC8qIDk2MDAwICovCisgIDMxLCAvKiA4ODIwMCAqLworICAzMSwgLyogNjQwMDAgKi8KKyAgMzEsIC8qIDQ4MDAwICovCisgIDMyLCAvKiA0NDEwMCAqLworICAzNywgLyogMzIwMDAgKi8KKyAgMzEsIC8qIDI0MDAwICovCisgIDMxLCAvKiAyMjA1MCAqLworICAzMSwgLyogMTYwMDAgKi8KKyAgMzEsIC8qIDEyMDAwICovCisgIDMxLCAvKiAxMTAyNSAqLworICAzMSwgLyogIDgwMDAgKi8KKyAgMzEgIC8qICA3MzUwICovCit9OworCisjZGVmaW5lIFRDQyh4KSAoRklYUF9EQkwoeCkpCisKK2NvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjMgWzhdID0KK3sKKyAgVENDKDB4ODFmMWQxZDQpLCBUQ0MoMHg5MTI2MTQ2YyksIFRDQygweGFkYjkyMmM0KSwgVENDKDB4ZDQzOGFmMWYpLAorICBUQ0MoMHgwMDAwMDAwMCksIFRDQygweDM3ODk4MDliKSwgVENDKDB4NjQxMzBkZDQpLCBUQ0MoMHg3Y2NhNzAxNikKK307Citjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmY0IFsxNl0gPQoreworICBUQ0MoMHg4MDhiYzg0MiksIFRDQygweDg0ZTJlNThjKSwgVENDKDB4OGQ2YjQ5ZDEpLCBUQ0MoMHg5OWRhOTIwYSksCisgIFRDQygweGE5YzQ1NzEzKSwgVENDKDB4YmM5ZGRlYjkpLCBUQ0MoMHhkMWMyZDUxYiksIFRDQygweGU4N2FlNTNkKSwKKyAgVENDKDB4MDAwMDAwMDApLCBUQ0MoMHgxYTljZDliNiksIFRDQygweDM0MGZmMjU0KSwgVENDKDB4NGIzYzhjMjkpLAorICBUQ0MoMHg1ZjFmNWViYiksIFRDQygweDZlZDllYmJhKSwgVENDKDB4NzliYzM4NWYpLCBUQ0MoMHg3ZjRjN2U1YikKK307CisKKy8qIE1QRUcgbGlrZSBtYXBwaW5nIChubyBjaGFuZ2UpLiAqLworY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVBhc3N0aHJvdWdoWzE1XVs4XSA9Cit7CisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIGZhbGxiYWNrICAqLworICAgICB7IDAsICAxLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICBtb25vIC8gUFMgKi8KKyAgICAgeyAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgc3RlcmVvICAgICovCisgICAgIHsgMCwgIDEsICAyLDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIDNjaCAgICAgICAqLworICAgICB7IDAsICAxLCAgMiwgIDMsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICA0Y2ggICAgICAgKi8KKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwyNTUsMjU1LDI1NX0sICAvKiAgNWNoICAgICAgICovCisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LDI1NSwyNTV9LCAgLyogIDUuMWNoICAgICAqLworICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICA3LjEgZnJvbnQgKi8KKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLworICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LDI1NX0sICAvKiAgNi4xY2ggICAgICovCisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIDcuMSByZWFyICAqLworICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30gICAvKiAgNy4xIHRvcCAgICovCit9OworCisvKiBXQVYgZmlsZSBsaWtlIG1hcHBpbmcgKGZyb20gTVBFRyBtYXBwaW5nKS4gKi8KK2NvbnN0IFVDSEFSIGNoYW5uZWxNYXBwaW5nVGFibGVXQVZbMTVdWzhdID0KK3sKKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgZmFsbGJhY2sgICovCisgICAgIHsgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIG1vbm8gLyBQUyAqLworICAgICB7IDAsICAxLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICBzdGVyZW8gICAgKi8KKyAgICAgeyAyLCAgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgM2NoICAgICAgICovCisgICAgIHsgMiwgIDAsICAxLCAgMywyNTUsMjU1LDI1NSwyNTV9LCAgLyogIDRjaCAgICAgICAqLworICAgICB7IDIsICAwLCAgMSwgIDMsICA0LDI1NSwyNTUsMjU1fSwgIC8qICA1Y2ggICAgICAgKi8KKyAgICAgeyAyLCAgMCwgIDEsICA0LCAgNSwgIDMsMjU1LDI1NX0sICAvKiAgNS4xY2ggICAgICovCisgICAgIHsgMiwgIDYsICA3LCAgMCwgIDEsICA0LCAgNSwgIDN9LCAgLyogIDcuMSBmcm9udCAqLworICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KKyAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLworICAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgNiwgIDMsMjU1fSwgIC8qICA2LjFjaCAgICAgKi8KKyAgICAgeyAyLCAgMCwgIDEsICA2LCAgNywgIDQsICA1LCAgM30sICAvKiAgNy4xIHJlYXIgICovCisgICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLworICAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgMywgIDYsICA3fSAgIC8qICA3LjEgdG9wICAgKi8KK307CisKKy8qIExvb2t1cCB0YWJsZXMgZm9yIGVsZW1lbnRzIGluIEVSIGJpdHN0cmVhbSAqLworY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudHNUYWJbMTVdWzddID0KK3sKKyAvKiAgMSAqLyAgeyBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDEgY2hhbm5lbCAgKi8KKyAvKiAgMiAqLyAgeyBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gIC8qIDIgY2hhbm5lbHMgKi8KKyAvKiAgMyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDMgY2hhbm5lbHMgKi8KKyAvKiAgNCAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDQgY2hhbm5lbHMgKi8KKyAvKiAgNSAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDUgY2hhbm5lbHMgKi8KKyAvKiAgNiAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FIH0gIC8qIDYgY2hhbm5lbHMgKi8KKyAvKiAgNyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQgIH0sICAvKiA4IGNoYW5uZWxzICovCisgLyogIDggKi8gIHsgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9LCAgLyogcmVzZXJ2ZWQgICAqLworIC8qICA5ICovICB7IElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSwgIC8qIHJlc2VydmVkICAgKi8KKyAvKiAxMCAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCisgLyogMTEgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfU0NFLCAgSURfTEZFLCAgSURfRVhULCAgSURfRU5EICB9LCAgLyogNyBjaGFubmVscyAqLworIC8qIDEyICovICB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX0VYVCwgIElEX0VORCAgfSwgIC8qIDggY2hhbm5lbHMgKi8KKyAvKiAxMyAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCisgLyogMTQgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCAgSURfQ1BFLCAgSURfRVhULCAgSURfRU5EICB9ICAgLyogOCBjaGFubmVscyAqLworfTsKKworLyohIFJhbmRvbSBzaWduIGJpdCB1c2VkIGZvciBjb25jZWFsbWVudAorKi8KK2NvbnN0IFVTSE9SVCByYW5kb21TaWduW0FBQ19ORl9OT19SQU5ET01fVkFMLzE2XSA9IHsKKy8qCisgICBzaWduIGJpdHMgb2YgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW10gZW50cmllczoKKyAgIExTQiAuLi4uLi4uLi4uLiBNU0IgIC0+ICAgIE1TQiAuLi4gTFNCCisqLworLyogMTAwMSAwMTExIDAwMTEgMTEwMCAgLT4gKi8gMHgzY2U5LAorLyogMDEwMCAwMTExIDAxMTEgMTAxMSAgLT4gKi8gMHhkZWUyLAorLyogMDAwMSAxMTAwIDExMTAgMTAxMSAgLT4gKi8gMHhkNzM4LAorLyogMDAwMSAwMDExIDAxMTAgMTAwMSAgLT4gKi8gMHg5NmM4LAorLyogMDEwMSAwMDExIDExMDEgMDAwMCAgLT4gKi8gMHgwYmNhLAorLyogMDAwMSAwMDAxIDExMTEgMDEwMCAgLT4gKi8gMHgyZjg4LAorLyogMTExMCAxMTAwIDExMTAgMTEwMSAgLT4gKi8gMHhiNzM3LAorLyogMDAxMCAxMDEwIDEwMTEgMTAwMSAgLT4gKi8gMHg5ZDU0LAorLyogMDExMSAxMTAwIDAxMTAgMTAxMCAgLT4gKi8gMHg1NjNlLAorLyogMTEwMSAwMTExIDAwMTAgMDEwMSAgLT4gKi8gMHhhNGViLAorLyogMDAwMSAwMTAxIDEwMTEgMTEwMCAgLT4gKi8gMHgzZGE4LAorLyogMDEwMSAwMTExIDEwMDEgMTAxMSAgLT4gKi8gMHhkOWVhLAorLyogMTEwMSAwMTAwIDAxMDEgMDEwMSAgLT4gKi8gMHhhYTJiLAorLyogMTAwMCAxMDAxIDAxMDAgMDAxMSAgLT4gKi8gMHhjMjkxLAorLyogMTEwMCAxMTExIDEwMTAgMTEwMCAgLT4gKi8gMHgzNWYzLAorLyogMTEwMCAxMDEwIDExMTAgMDAxMCAgLT4gKi8gMHg0NzUzLAorLyogMDExMCAwMDAxIDEwMTAgMTAwMCAgLT4gKi8gMHgxNTg2LAorLyogMDAxMSAwMTAxIDExMTEgMTEwMCAgLT4gKi8gMHgzZmFjLAorLyogMDAwMSAwMTEwIDEwMTAgMDAwMSAgLT4gKi8gMHg4NTY4LAorLyogMDAxMCAxMTAxIDAxMTEgMDAxMCAgLT4gKi8gMHg0ZWI0LAorLyogMTEwMSAxMDEwIDAxMDAgMTAwMSAgLT4gKi8gMHg5MjViLAorLyogMTEwMCAxMDAxIDAwMDAgMTExMCAgLT4gKi8gMHg3MDkzLAorLyogMTAwMCAxMTAwIDAxMTAgMTAxMCAgLT4gKi8gMHg1NjMxLAorLyogMDAwMCAxMDAwIDAxMTAgMTEwMSAgLT4gKi8gMHhiNjEwLAorLyogMTAwMCAwMDAxIDExMTEgMTAxMSAgLT4gKi8gMHhkZjgxLAorLyogMTExMSAwMDExIDAxMDAgMDExMSAgLT4gKi8gMHhlMmNmLAorLyogMTAwMCAwMDAxIDAwMTAgMTAxMCAgLT4gKi8gMHg1NDgxLAorLyogMTEwMSAwMTAxIDExMDAgMTExMSAgLT4gKi8gMHhmM2FiLAorLyogMDExMCAwMDAxIDAxMTAgMTAwMCAgLT4gKi8gMHgxNjg2LAorLyogMDAxMSAwMDExIDExMDAgMDExMCAgLT4gKi8gMHg2M2NjLAorLyogMDAxMSAwMTExIDAxMDEgMDExMCAgLT4gKi8gMHg2YWVjLAorLyogMTAxMSAwMDAxIDEwMTAgMDAxMCAgLT4gKi8gMHg0NThkCit9OworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmggYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNGEyZAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY19yb20uaApAQCAtMCwwICsxLDE4OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFBQ19ST01fSAorI2RlZmluZSBBQUNfUk9NX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJhYWNkZWNfaGNyX3R5cGVzLmgiCisjaW5jbHVkZSAiYWFjZGVjX2hjcnMuaCIKKworI2RlZmluZSBBQUNfTkZfTk9fUkFORE9NX1ZBTCAgNTEyICAgLyohPCBTaXplIG9mIHJhbmRvbSBudW1iZXIgYXJyYXkgZm9yIG5vaXNlIGZsb29yICovCisKKyNkZWZpbmUgSU5WX1FVQU5UX1RBQkxFU0laRSAyNTYKKworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEludmVyc2VRdWFudFRhYmxlIFtJTlZfUVVBTlRfVEFCTEVTSVpFICsgMV0gOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIE1hbnRpc3NhVGFibGUgWzRdWzE0XSA7CitleHRlcm4gY29uc3QgU0NIQVIgRXhwb25lbnRUYWJsZSBbNF1bMTRdIDsKKworI2RlZmluZSBOVU1fTERfQ09FRl81MTIgMTUzNgorI2RlZmluZSBOVU1fTERfQ09FRl80ODAgMTQ0MAorLyogV2luZG93IHRhYmxlIHBhcnRpdGlvbiBleHBvbmVudHMuICovCisjZGVmaW5lIFdUUzAgKDEpCisjZGVmaW5lIFdUUzEgKDApCisjZGVmaW5lIFdUUzIgKC0yKQorZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNTEyWzE1MzZdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNDgwWzE0NDBdOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IFNIT1JUICpzZmJPZmZzZXRMb25nOworICBjb25zdCBTSE9SVCAqc2ZiT2Zmc2V0U2hvcnQ7CisgIFVDSEFSIG51bWJlck9mU2ZiTG9uZzsKKyAgVUNIQVIgbnVtYmVyT2ZTZmJTaG9ydDsKK30gU0ZCX0lORk87CisKK2V4dGVybiBjb25zdCBTRkJfSU5GTyBzZmJPZmZzZXRUYWJsZXNbNV1bMTZdOworCisvKiBIdWZmbWFuIHRhYmxlcyAqLworZW51bSB7CisgIEh1ZmZtYW5CaXRzID0gMiwKKyAgSHVmZm1hbkVudHJpZXMgPSAoMSA8PCBIdWZmbWFuQml0cykKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IFVTSE9SVCAoKkNvZGVCb29rKVtIdWZmbWFuRW50cmllc107CisgIFVDSEFSIERpbWVuc2lvbjsKKyAgVUNIQVIgbnVtQml0czsKKyAgVUNIQVIgT2Zmc2V0OworfSBDb2RlQm9va0Rlc2NyaXB0aW9uOworCitleHRlcm4gY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiBBQUNjb2RlQm9va0Rlc2NyaXB0aW9uVGFibGVbMTNdOworZXh0ZXJuIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblNDTDsKKworCitleHRlcm4gY29uc3QgU1RBVEVGVU5DICBhU3RhdGVDb25zdGFudDJTdGF0ZVtdOworCitleHRlcm4gY29uc3QgU0NIQVIgICAgICBhQ29kZWJvb2syU3RhcnRJbnRbXTsKKworZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1pbk9mQ2JQYWlyW107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICBhTWF4T2ZDYlBhaXJbXTsKKworZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1heEN3TGVuW107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICBhRGltQ2JbXTsKK2V4dGVybiBjb25zdCBVQ0hBUiAgICAgIGFEaW1DYlNoaWZ0W107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICBhU2lnbkNiW107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICBhQ2JQcmlvcml0eVtdOworCitleHRlcm4gY29uc3QgVUlOVCAgICAgICphSHVmZlRhYmxlW107CitleHRlcm4gY29uc3QgU0NIQVIgICAgICphUXVhbnRUYWJsZVtdOworCitleHRlcm4gY29uc3QgVVNIT1JUICAgICBhTGFyZ2VzdEFic29sdXRlVmFsdWVbXTsKKworZXh0ZXJuIGNvbnN0IFVJTlQgICBhSHVmZlRyZWVSdmxjRXNjYXBlW107CitleHRlcm4gY29uc3QgVUlOVCAgIGFIdWZmVHJlZVJ2bENvZGV3ZHNbXTsKKworCitleHRlcm4gY29uc3QgVUNIQVIgdG5zX21heF9iYW5kc190YmxbMTNdWzJdOworCitleHRlcm4gY29uc3QgVUNIQVIgdG5zX21heF9iYW5kc190YmxfNDgwWzEzXTsKK2V4dGVybiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibF81MTJbMTNdOworCisjZGVmaW5lIEZJWFBfVENDIEZJWFBfREJMCisKK2V4dGVybiBjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmYzWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjRbMTZdOworCitleHRlcm4gY29uc3QgVVNIT1JUIHJhbmRvbVNpZ25bQUFDX05GX05PX1JBTkRPTV9WQUwvMTZdOworCitleHRlcm4gY29uc3QgRklYUF9EQkwgcG93Ml9kaXYyNG1pbnVzMVs0N107CitleHRlcm4gY29uc3QgaW50IG9mZnNldFRhYlsyXVsxNl07CisKKy8qIENoYW5uZWwgbWFwcGluZyBpbmRpY2VzIGZvciB0aW1lIGRvbWFpbiBJL08uCisgICBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXguICovCitleHRlcm4gY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVBhc3N0aHJvdWdoWzE1XVs4XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBjaGFubmVsTWFwcGluZ1RhYmxlV0FWWzE1XVs4XTsKKworLyogTG9va3VwIHRhYmxlcyBmb3IgZWxlbWVudHMgaW4gRVIgYml0c3RyZWFtICovCitleHRlcm4gY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudHNUYWJbMTVdWzddOworCisjZW5kaWYgLyogI2lmbmRlZiBBQUNfUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmMuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmMuY3BwCkBAIC0wLDAgKzEsMTE4OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKyAgIERlc2NyaXB0aW9uOiBEeW5hbWljIHJhbmdlIGNvbnRyb2wgKERSQykgZGVjb2RlciB0b29sIGZvciBBQUMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgorCisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisKKy8qCisgKiBEeW5hbWljIFJhbmdlIENvbnRyb2wKKyAqLworCisvKiBGb3IgcGFyYW1ldGVyIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgRFJDX1BBUkFNRVRFUl9CSVRTICAgICAgICAoIDcgKQorI2RlZmluZSBEUkNfTUFYX1FVQU5UX1NURVBTICAgICAgICggMTw8RFJDX1BBUkFNRVRFUl9CSVRTICkKKyNkZWZpbmUgRFJDX01BWF9RVUFOVF9GQUNUT1IgICAgICAoIERSQ19NQVhfUVVBTlRfU1RFUFMtMSApCisjZGVmaW5lIERSQ19QQVJBTV9RVUFOVF9TVEVQICAgICAgKCBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdClEUkNfTUFYX1FVQU5UX0ZBQ1RPUikgKQorI2RlZmluZSBEUkNfUEFSQU1fU0NBTEUgICAgICAgICAgICggMSApCisKKyNkZWZpbmUgTUFYX1JFRkVSRU5DRV9MRVZFTCAgICAgICAoIDEyNyApCisKKyAjZGVmaW5lIERWQl9BTkNfREFUQV9TWU5DX0JZVEUgICAoIDB4QkMgKSAgICAvKiBEVkIgYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLworCisvKiEKKyAgXGJyaWVmIEluaXRpYWxpemUgRFJDIGluZm9ybWF0aW9uCisKKyAgXHNlbGYgSGFuZGxlIG9mIERSQyBpbmZvCisKKyAgXHJldHVybiBub25lCisqLwordm9pZCBhYWNEZWNvZGVyX2RyY0luaXQgKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYgKQoreworICBDRHJjUGFyYW1zICpwUGFyYW1zOworCisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBpbml0IGNvbnRyb2wgZmllbGRzICovCisgIHNlbGYtPmVuYWJsZSA9IDA7CisgIHNlbGYtPm51bVRocmVhZHMgPSAwOworCisgIC8qIGluaXQgcGFyYW1zICovCisgIHBQYXJhbXMgPSAmc2VsZi0+cGFyYW1zOworICBwUGFyYW1zLT5ic0RlbGF5RW5hYmxlID0gMDsKKyAgcFBhcmFtcy0+Y3V0ICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+dXNyQ3V0ICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+Ym9vc3QgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+dXNyQm9vc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+dGFyZ2V0UmVmTGV2ZWwgPSAtMTsKKyAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPSBBQUNERUNfRFJDX0RGTFRfRVhQSVJZX0ZSQU1FUzsKKyAgcFBhcmFtcy0+YXBwbHlEaWdpdGFsTm9ybSA9IDA7CisgIHBQYXJhbXMtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IDA7CisKKyAgLyogaW5pdGlhbCBwcm9ncmFtIHJlZiBsZXZlbCA9IHRhcmdldCByZWYgbGV2ZWwgKi8KKyAgc2VsZi0+cHJvZ1JlZkxldmVsID0gcFBhcmFtcy0+dGFyZ2V0UmVmTGV2ZWw7CisgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAwOworICBzZWxmLT5wcmVzTW9kZSA9IC0xOworfQorCisKKy8qIQorICBcYnJpZWYgSW5pdGlhbGl6ZSBEUkMgY29udHJvbCBkYXRhIGZvciBvbmUgY2hhbm5lbAorCisgIFxzZWxmIEhhbmRsZSBvZiBEUkMgaW5mbworCisgIFxyZXR1cm4gbm9uZQorKi8KK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEgKAorICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSApCit7CisgIGlmIChwRHJjQ2hEYXRhICE9IE5VTEwpIHsKKyAgICBwRHJjQ2hEYXRhLT5leHBpcnlDb3VudCA9IDA7CisgICAgcERyY0NoRGF0YS0+bnVtQmFuZHMgICAgPSAxOworICAgIHBEcmNDaERhdGEtPmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOworICAgIHBEcmNDaERhdGEtPmRyY1ZhbHVlWzBdID0gMDsKKyAgICBwRHJjQ2hEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lID0gMDsKKyAgICBwRHJjQ2hEYXRhLT5kcmNEYXRhVHlwZSA9IFVOS05PV05fUEFZTE9BRDsKKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgIFNldCBvbmUgc2luZ2xlIERSQyBwYXJhbWV0ZXIKKworICBcc2VsZiAgIEhhbmRsZSBvZiBEUkMgaW5mby4KKyAgXHBhcmFtICBQYXJhbWV0ZXIgdG8gYmUgc2V0LgorICBcdmFsdWUgIFZhbHVlIHRvIGJlIHNldC4KKworICBccmV0dXJuIGFuIGVycm9yIGNvZGUuCisqLworQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCisgICAgSEFORExFX0FBQ19EUkMgICAgc2VsZiwKKyAgICBBQUNERUNfRFJDX1BBUkFNICBwYXJhbSwKKyAgICBJTlQgICAgICAgICAgICAgICB2YWx1ZSApCit7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBzd2l0Y2ggKHBhcmFtKQorICB7CisgIGNhc2UgRFJDX0NVVF9TQ0FMRToKKyAgICAvKiBzZXQgYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yICovCisgICAgaWYgKCAodmFsdWUgPCAwKQorICAgICAgfHwgKHZhbHVlID4gRFJDX01BWF9RVUFOVF9GQUNUT1IpICkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIH0KKyAgICBzZWxmLT5wYXJhbXMudXNyQ3V0ID0gKEZJWFBfREJMKSgoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUD4+RFJDX1BBUkFNX1NDQUxFKSAqIChJTlQpdmFsdWUpOworICAgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uID09IDApCisgICAgICBzZWxmLT5wYXJhbXMuY3V0ID0gc2VsZi0+cGFyYW1zLnVzckN1dDsKKyAgICBicmVhazsKKyAgY2FzZSBEUkNfQk9PU1RfU0NBTEU6CisgICAgLyogc2V0IGJvb3N0IGZhY3RvciAqLworICAgIGlmICggKHZhbHVlIDwgMCkKKyAgICAgIHx8ICh2YWx1ZSA+IERSQ19NQVhfUVVBTlRfRkFDVE9SKSApIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgc2VsZi0+cGFyYW1zLnVzckJvb3N0ID0gKEZJWFBfREJMKSgoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUD4+RFJDX1BBUkFNX1NDQUxFKSAqIChJTlQpdmFsdWUpOworICAgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uID09IDApCisgICAgICBzZWxmLT5wYXJhbXMuYm9vc3QgPSBzZWxmLT5wYXJhbXMudXNyQm9vc3Q7CisgICAgYnJlYWs7CisgIGNhc2UgVEFSR0VUX1JFRl9MRVZFTDoKKyAgICBpZiAoIHZhbHVlID4gIE1BWF9SRUZFUkVOQ0VfTEVWRUwKKyAgICAgIHx8IHZhbHVlIDwgLU1BWF9SRUZFUkVOQ0VfTEVWRUwgKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gMDsKKyAgICAgIHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHJlZl9sZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgTUFYX1JFRkVSRU5DRV9MRVZFTCwgaW5jbHVzaXZlICovCisgICAgICBzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9IDE7CisgICAgICBpZiAoc2VsZi0+cGFyYW1zLnRhcmdldFJlZkxldmVsICE9IChTQ0hBUil2YWx1ZSkgeworICAgICAgICBzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgPSAoU0NIQVIpdmFsdWU7CisgICAgICAgIHNlbGYtPnByb2dSZWZMZXZlbCA9IChTQ0hBUil2YWx1ZTsgIC8qIEFsd2F5cyBzZXQgdGhlIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsIGVxdWFsIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgbGV2ZWwgYWNjb3JkaW5nIHRvIDQuNS4yLjcuMyBvZiBJU08vSUVDIDE0NDk2LTMuICovCisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFQUExZX05PUk1BTElaQVRJT046CisgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgLyogU3RvcmUgbmV3IHBhcmFtZXRlciB2YWx1ZSAqLworICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gKFVDSEFSKXZhbHVlOworICAgIGJyZWFrOworICBjYXNlIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OOgorICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorICAgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IChVQ0hBUil2YWx1ZSkgeworICAgICAgaWYgKHZhbHVlID09IDEpIHsKKyAgICAgICAgLyogRGlzYWJsZSBzY2FsaW5nIG9mIERSQyB2YWx1ZXMgYnkgc2V0dGluZyB0aGUgbWF4IHZhbHVlcyAqLworICAgICAgICBzZWxmLT5wYXJhbXMuYm9vc3QgPSBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdCkoMTw8RFJDX1BBUkFNX1NDQUxFKSk7CisgICAgICAgIHNlbGYtPnBhcmFtcy5jdXQgICA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKGZsb2F0KSgxPDxEUkNfUEFSQU1fU0NBTEUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFJlc3RvcmUgdGhlIHVzZXIgcGFyYW1zICovCisgICAgICAgIHNlbGYtPnBhcmFtcy5ib29zdCA9IHNlbGYtPnBhcmFtcy51c3JCb29zdDsKKyAgICAgICAgc2VsZi0+cGFyYW1zLmN1dCAgID0gc2VsZi0+cGFyYW1zLnVzckN1dDsKKyAgICAgIH0KKyAgICAgIC8qIFN0b3JlIG5ldyBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgIHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSAoVUNIQVIpdmFsdWU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIERSQ19CU19ERUxBWToKKyAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMSkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIH0KKyAgICBzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSA9IHZhbHVlOworICAgIGJyZWFrOworICBjYXNlIERSQ19EQVRBX0VYUElSWV9GUkFNRToKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgc2VsZi0+cGFyYW1zLmV4cGlyeUZyYW1lID0gKFVJTlQpdmFsdWU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KKworICAvKiBzd2l0Y2ggb24vb2ZmIHByb2Nlc3NpbmcgKi8KKyAgc2VsZi0+ZW5hYmxlID0gKCAoc2VsZi0+cGFyYW1zLmJvb3N0ID4gKEZJWFBfREJMKTApCisgICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy5jdXQgICA+IChGSVhQX0RCTCkwKQorICAgICAgICAgICAgICAgIHx8IChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IDApCisgICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA+PSAwKSApOworCisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgcGFyc2VFeGNsdWRlZENoYW5uZWxzKCBVSU5UICpleGNsdWRlZENobnNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzICkKK3sKKyAgVUlOVCBleGNsdWRlTWFzayA9IDA7CisgIFVJTlQgaSwgajsKKyAgaW50ICBiaXRDbnQgPSA5OworCisgIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgNzsgaSsrLCBqPDw9MSkgeworICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeworICAgICAgZXhjbHVkZU1hc2sgfD0gajsKKyAgICB9CisgIH0KKworICAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KKyAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLDEpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKywgajw8PTEpIHsKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeworICAgICAgICBleGNsdWRlTWFzayB8PSBqOworICAgICAgfQorICAgIH0KKyAgICBiaXRDbnQgKz0gOTsKKyAgICBGREtfQVNTRVJUKGogPCAoVUlOVCktMSk7CisgIH0KKworICAqZXhjbHVkZWRDaG5zTWFzayA9IGV4Y2x1ZGVNYXNrOworCisgIHJldHVybiAoYml0Q250KTsKK30KKworCisvKiEKKyAgXGJyaWVmIFNhdmUgRFJDIHBheWxvYWQgYml0c3RyZWFtIHBvc2l0aW9uCisKKyAgXHNlbGYgSGFuZGxlIG9mIERSQyBpbmZvCisgIFxicyBIYW5kbGUgb2YgRkRLIGJpdHN0cmVhbQorCisgIFxyZXR1cm4gVGhlIG51bWJlciBvZiBEUkMgcGF5bG9hZCBiaXRzCisqLworaW50IGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQgKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUgdHlwZSApCit7CisgIFVJTlQgYnNTdGFydFBvczsKKyAgaW50ICBpLCBudW1CYW5kcyA9IDEsIGJpdENudCA9IDA7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYnNTdGFydFBvcyA9IEZES2dldFZhbGlkQml0cyhicyk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNUEVHX0RSQ19FWFRfREFUQToKKyAgICB7CisgICAgICBiaXRDbnQgPSA0OworCisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpIHsgICAgICAgICAgLyogcGNlX3RhZ19wcmVzZW50ICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgICAgLyogcGNlX2luc3RhbmNlX3RhZyArIGRyY190YWdfcmVzZXJ2ZWRfYml0cyAqLworICAgICAgICBiaXRDbnQrPTg7CisgICAgICB9CisKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsNyk7ICAgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgWzAuLjddICovCisgICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLDEpKSB7ICAgICAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KKyAgICAgICAgICBGREtyZWFkQml0cyhicyw3KTsgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgW3guLnldICovCisgICAgICAgICAgYml0Q250Kz04OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLworICAgICAgICBudW1CYW5kcyArPSBGREtyZWFkQml0cyhicywgNCk7IC8qIGRyY19iYW5kX2luY3IgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsNCk7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICAgICAgICBiaXRDbnQrPTg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgLyogZHJjX2JhbmRfdG9wW2ldICovCisgICAgICAgICAgYml0Q250Kz04OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWwgKyBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCisgICAgICAgIGJpdENudCs9ODsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAvKiBkeW5fcm5nX3NnbltpXSArIGR5bl9ybmdfY3RsW2ldICovCisgICAgICAgIGJpdENudCs9ODsKKyAgICAgIH0KKworICAgICAgaWYgKCAoc2VsZi0+bnVtUGF5bG9hZHMgPCBNQVhfRFJDX1RIUkVBRFMpCisgICAgICAgICYmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPj0gMCkgKQorICAgICAgeworICAgICAgICBzZWxmLT5kcmNQYXlsb2FkUG9zaXRpb25bc2VsZi0+bnVtUGF5bG9hZHMrK10gPSBic1N0YXJ0UG9zOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgRFZCX0RSQ19BTkNfREFUQToKKyAgICAgIGJpdENudCArPSA4OworICAgICAgLyogY2hlY2sgc3luYyB3b3JkICovCisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpID09IERWQl9BTkNfREFUQV9TWU5DX0JZVEUpCisgICAgICB7CisgICAgICAgIGludCBkbXhMZXZlbHNQcmVzZW50LCBjb21wcmVzc2lvblByZXNlbnQ7CisgICAgICAgIGludCBjb2Fyc2VHcmFpblRjUHJlc2VudCwgZmluZUdyYWluVGNQcmVzZW50OworCisgICAgICAgIC8qIGJzX2luZm8gZmllbGQgKi8gCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wZWdfYXVkaW9fdHlwZSwgZG9sYnlfc3Vycm91bmRfbW9kZSwgcHJlc2VudGF0aW9uX21vZGUgKi8KKyAgICAgICAgYml0Q250Kz04OworCisgICAgICAgIC8qIEV2YWx1YXRlIGFuY2lsbGFyeV9kYXRhX3N0YXR1cyAqLworICAgICAgICBGREtyZWFkQml0cyhicywgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KKyAgICAgICAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICAgICAgICBjb21wcmVzc2lvblByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCisgICAgICAgIGNvYXJzZUdyYWluVGNQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KKyAgICAgICAgZmluZUdyYWluVGNQcmVzZW50ICAgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogZmluZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KKyAgICAgICAgYml0Q250Kz04OworCisgICAgICAgIC8qIE1QRUc0IGRvd25taXhpbmcgbGV2ZWxzICovCisgICAgICAgIGlmIChkbXhMZXZlbHNQcmVzZW50KSB7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCisgICAgICAgICAgYml0Q250Kz04OworICAgICAgICB9CisgICAgICAgIC8qIGF1ZGlvIGNvZGluZyBtb2RlIGFuZCBjb21wcmVzc2lvbiBzdGF0dXMgKi8KKyAgICAgICAgaWYgKGNvbXByZXNzaW9uUHJlc2VudCkgeworICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYXVkaW9fY29kaW5nX21vZGUsIENvbXByZXNzaW9uX3ZhbHVlICovCisgICAgICAgICAgYml0Q250Kz0xNjsKKyAgICAgICAgfQorICAgICAgICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgKi8KKyAgICAgICAgaWYgKGNvYXJzZUdyYWluVGNQcmVzZW50KSB7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZSAqLworICAgICAgICAgIGJpdENudCs9MTY7CisgICAgICAgIH0KKyAgICAgICAgLyogZmluZSBncmFpbiB0aW1lY29kZSAqLworICAgICAgICBpZiAoZmluZUdyYWluVGNQcmVzZW50KSB7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmVfZ3JhaW5fdGltZWNvZGUgKi8KKyAgICAgICAgICBiaXRDbnQrPTE2OworICAgICAgICB9CisgICAgICAgIGlmICggIXNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUKKyAgICAgICAgICAmJiAoKElOVClGREtnZXRWYWxpZEJpdHMoYnMpID49IDApICkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiAgPSBic1N0YXJ0UG9zOworICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAoYml0Q250KTsKK30KKworCisvKiEKKyAgXGJyaWVmIFBhcnNlIERSQyBwYXJhbWV0ZXJzIGZyb20gYml0c3RyZWFtCisKKyAgXGJzIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIChpbikKKyAgXHBEcmNCcyBQb2ludGVyIHRvIERSQyBwYXlsb2FkIGRhdGEgY29udGFpbmVyIChvdXQpCisgIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIE1QRUcgRFJDIGRhdGEganVuayAoaW4pCisKKyAgXHJldHVybiBOdW1iZXIgb2YgYml0cyByZWFkICgwIGluIGNhc2Ugb2YgYSBwYXJzZSBlcnJvcikKKyovCitzdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjUGFyc2UgKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICBDRHJjUGF5bG9hZCAgICAgICAgICAqcERyY0JzLAorICAgIFVJTlQgICAgICAgICAgICAgICAgICBwYXlsb2FkUG9zaXRpb24gKQoreworICBpbnQgaSwgbnVtQmFuZHMsIGJpdENudCA9IDQ7CisKKyAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEUkMgcGF5bG9hZCBmaWVsZCAqLworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1wYXlsb2FkUG9zaXRpb24pOworCisgIC8qIHBjZV90YWdfcHJlc2VudCAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpCisgIHsKKyAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogcGNlX2luc3RhbmNlX3RhZyAqLworICAgIC8qIG9ubHkgb25lIHByb2dyYW0gc3VwcG9ydGVkICovCisgICAgRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCisgICAgYml0Q250ICs9IDg7CisgIH0gZWxzZSB7CisgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyA9IC0xOyAgLyogbm90IHByZXNlbnQgKi8KKyAgfQorCisgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgLyogZXhjbHVkZWRfY2huc19wcmVzZW50ICovCisgICAgLyogZ2V0IGV4Y2x1ZGVkX2Nobl9tYXNrICovCisgICAgYml0Q250ICs9IHBhcnNlRXhjbHVkZWRDaGFubmVscygmcERyY0JzLT5leGNsdWRlZENobnNNYXNrLCBicyk7CisgIH0gZWxzZSB7CisgICAgcERyY0JzLT5leGNsdWRlZENobnNNYXNrID0gMDsKKyAgfQorCisgIG51bUJhbmRzID0gMTsKKyAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSAgLyogZHJjX2JhbmRzX3ByZXNlbnQgKi8KKyAgeworICAgIC8qIGdldCBiYW5kX2luY3IgKi8KKyAgICBudW1CYW5kcyArPSBGREtyZWFkQml0cyhicywgNCk7ICAvKiBkcmNfYmFuZF9pbmNyICovCisgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lID0gRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogZHJjX2ludGVycG9sYXRpb25fc2NoZW1lICovCisgICAgYml0Q250ICs9IDg7CisgICAgLyogYmFuZF90b3AgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykKKyAgICB7CisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbaV0gPSBGREtyZWFkQml0cyhicywgOCk7ICAvKiBkcmNfYmFuZF90b3BbaV0gKi8KKyAgICAgIGJpdENudCArPSA4OworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPSAoMTAyNCA+PiAyKSAtIDE7ICAvKiAuLi4gY29tcHJpc2luZyB0aGUgd2hvbGUgc3BlY3RydW0uICovOworICB9CisKKyAgcERyY0JzLT5jaGFubmVsRGF0YS5udW1CYW5kcyA9IG51bUJhbmRzOworCisgIGlmIChGREtyZWFkQml0cyhicywxKSkgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCisgIHsKKyAgICBwRHJjQnMtPnByb2dSZWZMZXZlbCA9IEZES3JlYWRCaXRzKGJzLCA3KTsgIC8qIHByb2dfcmVmX2xldmVsICovCisgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCisgICAgYml0Q250ICs9IDg7CisgIH0gZWxzZSB7CisgICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgPSAtMTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKQorICB7CisgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNWYWx1ZVtpXSAgPSBGREtyZWFkQml0cyhicywgMSkgPDwgNzsgICAvKiBkeW5fcm5nX3NnbltpXSAqLworICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbaV0gfD0gRkRLcmVhZEJpdHMoYnMsIDcpICYgMHg3RjsgLyogZHluX3JuZ19jdGxbaV0gKi8KKyAgICBiaXRDbnQgKz0gODsKKyAgfQorCisgIC8qIFNldCBEUkMgcGF5bG9hZCB0eXBlICovCisgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGUgPSBNUEVHX0RSQ19FWFRfREFUQTsKKworICByZXR1cm4gKGJpdENudCk7Cit9CisKKworLyohCisgIFxicmllZiBQYXJzZSBoZWF2eSBjb21wcmVzc2lvbiB2YWx1ZSB0cmFuc3BvcnRlZCBpbiBEU0VzIG9mIERWQiBzdHJlYW1zIHdpdGggTVBFRy00IGNvbnRlbnQuCisKKyAgXGJzIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIChpbikKKyAgXHBEcmNCcyBQb2ludGVyIHRvIERSQyBwYXlsb2FkIGRhdGEgY29udGFpbmVyIChvdXQpCisgIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIERWQiBhbmNpbGxhcnkgZGF0YSBqdW5rCisKKyAgXHJldHVybiBOdW1iZXIgb2YgYml0cyByZWFkICgwIGluIGNhc2Ugb2YgYSBwYXJzZSBlcnJvcikKKyovCisjZGVmaW5lIERWQl9DT01QUkVTU0lPTl9TQ0FMRSAgICggOCApICAgICAgIC8qIDQ4LDE2NCBkQiAqLworCitzdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uICgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCisgICAgQ0RyY1BheWxvYWQgICAgICAgICAgKnBEcmNCcywKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgcGF5bG9hZFBvc2l0aW9uICkKK3sKKyAgaW50ICBiaXRDbnQgPSAwOworICBpbnQgIGRteExldmVsc1ByZXNlbnQsIGV4dGVuc2lvblByZXNlbnQsIGNvbXByZXNzaW9uUHJlc2VudDsKKyAgaW50ICBjb2Fyc2VHcmFpblRjUHJlc2VudCwgZmluZUdyYWluVGNQcmVzZW50OworCisgIC8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgRFJDIHBheWxvYWQgZmllbGQgKi8KKyAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIEZES2dldFZhbGlkQml0cyhicyktcGF5bG9hZFBvc2l0aW9uKTsKKworICAvKiBTYW5pdHkgY2hlY2tzICovCisgIGlmICggRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDI0ICkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogQ2hlY2sgc3luYyB3b3JkICovCisgIGlmIChGREtyZWFkQml0cyhicywgOCkgIT0gRFZCX0FOQ19EQVRBX1NZTkNfQllURSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogRXZhbHVhdGUgYnNfaW5mbyBmaWVsZCAqLyAKKyAgaWYgKEZES3JlYWRCaXRzKGJzLCAyKSAhPSAzKSB7ICAgICAgICAgICAgICAgLyogbXBlZ19hdWRpb190eXBlICovCisgICAgLyogTm8gTVBFRy00IGF1ZGlvIGRhdGEgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorICBGREtyZWFkQml0cyhicywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2xieV9zdXJyb3VuZF9tb2RlICovCisgIHBEcmNCcy0+cHJlc01vZGUgPSBGREtyZWFkQml0cyhicywgMik7ICAgICAgIC8qIHByZXNlbnRhdGlvbl9tb2RlICovCisgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0ZXJlb19kb3dubWl4X21vZGUgKi8KKyAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSAhPSAwKSB7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBFdmFsdWF0ZSBhbmNpbGxhcnlfZGF0YV9zdGF0dXMgKi8KKyAgaWYgKEZES3JlYWRCaXRzKGJzLCAzKSAhPSAwKSB7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCisgICAgcmV0dXJuIDA7CisgIH0KKyAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCisgIGV4dGVuc2lvblByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgICAgIC8qIGFuY2lsbGFyeV9kYXRhX2V4dGVuc2lvbl9zdGF0dXM7ICovCisgIGNvbXByZXNzaW9uUHJlc2VudCAgID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbiBzdGF0dXMgKi8KKyAgY29hcnNlR3JhaW5UY1ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICBmaW5lR3JhaW5UY1ByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICBiaXRDbnQgKz0gMjQ7CisKKyAgaWYgKGRteExldmVsc1ByZXNlbnQpIHsKKyAgICBGREtyZWFkQml0cyhicywgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzQgKi8KKyAgICBiaXRDbnQgKz0gODsKKyAgfQorCisgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbl9zdGF0dXMgKi8KKyAgaWYgKGNvbXByZXNzaW9uUHJlc2VudCkKKyAgeworICAgIFVDSEFSIGNvbXByZXNzaW9uT24sIGNvbXByZXNzaW9uVmFsdWU7CisKKyAgICAvKiBhdWRpb19jb2RpbmdfbW9kZSAqLworICAgIGlmICggRkRLcmVhZEJpdHMoYnMsIDcpICE9IDAgKSB7ICAvKiBUaGUgcmVzZXJ2ZWQgYml0cyBzaGFsbCBiZSBzZXQgdG8gIjAiLiAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbXByZXNzaW9uT24gICAgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOyAgLyogY29tcHJlc3Npb25fb24gKi8KKyAgICBjb21wcmVzc2lvblZhbHVlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsgIC8qIENvbXByZXNzaW9uX3ZhbHVlICovCisgICAgYml0Q250ICs9IDE2OworCisgICAgaWYgKCBjb21wcmVzc2lvbk9uICkgeworICAgICAgLyogQSBjb21wcmVzc2lvbiB2YWx1ZSBpcyBhdmFpbGFibGUgc28gc3RvcmUgdGhlIGRhdGEganVzdCBsaWtlIE1QRUcgRFJDIGRhdGEgKi8KKyAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEubnVtQmFuZHMgICAgPSAgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT25lIGJhbmQgLi4uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlWzBdID0gIGNvbXByZXNzaW9uVmFsdWU7ICAgICAgICAgICAgIC8qIC4uLiB3aXRoIG9uZSB2YWx1ZSAuLi4gKi8KKyAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuYmFuZFRvcFswXSAgPSAoMTAyNCA+PiAyKSAtIDE7ICAvKiAuLi4gY29tcHJpc2luZyB0aGUgd2hvbGUgc3BlY3RydW0uICovCisgICAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnICAgICAgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBwcmVzZW50ICovCisgICAgICBwRHJjQnMtPnByb2dSZWZMZXZlbCAgICAgICAgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBwcmVzZW50ICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0RhdGFUeXBlID0gIERWQl9EUkNfQU5DX0RBVEE7ICAgICAgICAgICAgIC8qIFNldCBEUkMgcGF5bG9hZCB0eXBlIHRvIERWQi4gKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogTm8gY29tcHJlc3Npb24gdmFsdWUgYXZhaWxhYmxlICovCisgICAgICAvKiBDQVVUSU9OOiBJdCBpcyBub3QgY2xlYXJseSBkZWZpbmVkIGJ5IHN0YW5kYXJkIGhvdyB0byByZWFjdCBpbiB0aGlzIHNpdHVhdGlvbi4gKi8KKyAgICAgIC8qIFR1cm4gZG93biB0aGUgY29tcHJlc3Npb24gdmFsdWUgdG8gYXByb3guIDBkQiAqLworICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5udW1CYW5kcyAgICA9ICAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmUgYmFuZCAuLi4gKi8KKyAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbMF0gPSAgMHg4MDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uIHdpdGggYXByb3guIDBkQiAuLi4gKi8KKyAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuYmFuZFRvcFswXSAgPSAoMTAyNCA+PiAyKSAtIDE7ICAvKiAuLi4gY29tcHJpc2luZyB0aGUgd2hvbGUgc3BlY3RydW0uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0RhdGFUeXBlID0gIERWQl9EUkNfQU5DX0RBVEE7ICAgICAgICAgICAgIC8qIFNldCBEUkMgcGF5bG9hZCB0eXBlIHRvIERWQi4gKi8KKworICAgICAgLyogSWYgY29tcHJlc3Npb25fb24gZmllbGQgaXMgc2V0IHRvICIwIiB0aGUgY29tcHJlc3Npb25fdmFsdWUgZmllbGQgc2hhbGwgYmUgIjAwMDAgMDAwMCIuICovCisgICAgICBpZiAoY29tcHJlc3Npb25WYWx1ZSAhPSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlYWQgdGltZWNvZGVzIGlmIGF2YWlsYWJsZSBqdXN0IHRvIGdldCB0aGUgcmlnaHQgYW1vdW50IG9mIGJpdHMuICovCisgIGlmIChjb2Fyc2VHcmFpblRjUHJlc2VudCkgeworICAgIEZES3JlYWRCaXRzKGJzLCAxNik7ICAgICAgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlICovCisgICAgYml0Q250ICs9IDE2OworICB9CisgIGlmIChmaW5lR3JhaW5UY1ByZXNlbnQpIHsKKyAgICBGREtyZWFkQml0cyhicywgMTYpOyAgICAgIC8qIGZpbmVfZ3JhaW5fdGltZWNvZGUgKi8KKyAgICBiaXRDbnQgKz0gMTY7CisgIH0KKworICAvKiBSZWFkIGV4dGVuc2lvbiBqdXN0IHRvIGdldCB0aGUgcmlnaHQgYW1vdW50IG9mIGJpdHMuICovCisgIGlmIChleHRlbnNpb25QcmVzZW50KSB7CisgICAgaW50ICBleHRCaXRzID0gODsKKworICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KKyAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSBleHRCaXRzICs9IDg7ICAgLyogZXh0X2Rvd25taXhpbmdfbGV2ZWxzX3N0YXR1cyAqLworICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIGV4dEJpdHMgKz0gMTY7ICAvKiBleHRfZG93bm1peGluZ19nbG9iYWxfZ2FpbnNfc3RhdHVzICovCisgICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgZXh0Qml0cyArPSA4OyAgIC8qIGV4dF9kb3dubWl4aW5nX2xmZV9sZXZlbF9zdGF0dXMgKi8KKworICAgIEZES3B1c2hGb3IoYnMsIGV4dEJpdHMgLSA0KTsgICAgICAgICAgICAvKiBza2lwIHRoZSBleHRlbnNpb24gcGF5bG9hZCByZW1haW5kZXIuICovCisgICAgYml0Q250ICs9IGV4dEJpdHM7CisgIH0KKworICByZXR1cm4gKGJpdENudCk7Cit9CisKKworLyogCisgKiBQcmVwYXJlIERSQyBwcm9jZXNzaW5nCisgKi8KK3N0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNFeHRyYWN0QW5kTWFwICgKKyAgICAgICAgSEFORExFX0FBQ19EUkMgIHNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAorICAgICAgICBVQ0hBUiAgcGNlSW5zdGFuY2VUYWcsCisgICAgICAgIFVDSEFSICBjaGFubmVsTWFwcGluZ1tdLCAvKiBDaGFubmVsIG1hcHBpbmcgdHJhbnNsYXRpbmcgZHJjQ2hhbm5lbCBpbmRleCB0byBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLworICAgICAgICBpbnQgICAgdmFsaWRDaGFubmVscyApCit7CisgIENEcmNQYXlsb2FkICB0aHJlYWRCc1tNQVhfRFJDX1RIUkVBRFNdOworICBDRHJjUGF5bG9hZCAqdmFsaWRUaHJlYWRCc1tNQVhfRFJDX1RIUkVBRFNdOworICBDRHJjUGFyYW1zICAqcFBhcmFtczsKKyAgVUlOVCBiYWNrdXBCc1Bvc2l0aW9uOworICBpbnQgIGksIHRocmVhZCwgdmFsaWRUaHJlYWRzID0gMDsKKyAgaW50ICBudW1FeGNsdWRlZENobnNbTUFYX0RSQ19USFJFQURTXTsKKworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoaEJzICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gIT0gTlVMTCk7CisKKyAgcFBhcmFtcyA9ICZzZWxmLT5wYXJhbXM7CisKKyAgc2VsZi0+bnVtVGhyZWFkcyA9IDA7CisgIGJhY2t1cEJzUG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGF5bG9hZHMgJiYgc2VsZi0+bnVtVGhyZWFkcyA8IE1BWF9EUkNfVEhSRUFEUzsgaSsrKSB7CisgICAgaW50IGJpdHNQYXJzZWQ7CisKKyAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXMKKyAgICAgICB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5IG9yIGNyYXNoLiAqLworICAgIEZES21lbWNsZWFyKCZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwgc2l6ZW9mKENEcmNQYXlsb2FkKSk7CisgICAgdGhyZWFkQnNbc2VsZi0+bnVtVGhyZWFkc10uY2hhbm5lbERhdGEuYmFuZFRvcFswXSAgPSAoMTAyNCA+PiAyKSAtIDE7CisKKyAgICAvKiBFeHRyYWN0IHBheWxvYWQgKi8KKyAgICBiaXRzUGFyc2VkID0gYWFjRGVjb2Rlcl9kcmNQYXJzZSggaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZHJjUGF5bG9hZFBvc2l0aW9uW2ldICk7CisgICAgaWYgKGJpdHNQYXJzZWQgPiAwKSB7CisgICAgICBzZWxmLT5udW1UaHJlYWRzKys7CisgICAgfQorICB9CisgIHNlbGYtPm51bVBheWxvYWRzID0gMDsKKworICBpZiAoc2VsZi0+ZHZiQW5jRGF0YUF2YWlsYWJsZSkKKyAgeyAvKiBBcHBlbmQgYSBEVkIgaGVhdnkgY29tcHJlc3Npb24gcGF5bG9hZCB0aHJlYWQgaWYgYXZhaWxhYmxlLiAqLworICAgIGludCBiaXRzUGFyc2VkOworCisgICAgLyogSW5pdCBwYXlsb2FkIGRhdGEgY2h1bmsuIFRoZSBtZW1jbGVhciBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIGl0IGluaXRpYWxpemVzCisgICAgICAgdGhlIG1vc3QgdmFsdWVzLiBXaXRob3V0IGl0IHRoZSBtb2R1bGUgd291bGRuJ3Qgd29yayBwcm9wZXJseSBvciBjcmFzaC4gKi8KKyAgICBGREttZW1jbGVhcigmdGhyZWFkQnNbc2VsZi0+bnVtVGhyZWFkc10sIHNpemVvZihDRHJjUGF5bG9hZCkpOworICAgIHRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOworCisgICAgLyogRXh0cmFjdCBwYXlsb2FkICovCisgICAgYml0c1BhcnNlZCA9IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uKCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiApOworICAgIGlmIChiaXRzUGFyc2VkID4gMCkgeworICAgICAgc2VsZi0+bnVtVGhyZWFkcysrOworICAgIH0KKyAgfQorICBzZWxmLT5kdmJBbmNEYXRhQXZhaWxhYmxlID0gMDsKKworICAvKiBSZXNldCB0aGUgYml0YnVmZmZlciAqLworICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIEZES2dldFZhbGlkQml0cyhoQnMpIC0gYmFja3VwQnNQb3NpdGlvbik7CisKKyAgLyogY2FsY3VsYXRlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGV4Y2xfY2huX21hc2sgKi8KKworICAvKiBjb3VwbGluZyBjaGFubmVscyBub3Qgc3VwcG9ydGVkICovCisKKyAgLyogY2hlY2sgZm9yIHZhbGlkIHRocmVhZHMgKi8KKyAgZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCBzZWxmLT5udW1UaHJlYWRzOyB0aHJlYWQrKykgeworICAgIENEcmNQYXlsb2FkICpwVGhyZWFkQnMgPSAmdGhyZWFkQnNbdGhyZWFkXTsKKyAgICBpbnQgbnVtRXhjbENobnMgPSAwOworCisgICAgc3dpdGNoICgoQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUpcFRocmVhZEJzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIE1QRUdfRFJDX0VYVF9EQVRBOgorICAgICAgY2FzZSBEVkJfRFJDX0FOQ19EQVRBOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFRocmVhZEJzLT5wY2VJbnN0YW5jZVRhZyA+PSAwKSB7ICAvKiBpZiBQQ0UgdGFnIHByZXNlbnQgKi8KKyAgICAgIGlmIChwVGhyZWFkQnMtPnBjZUluc3RhbmNlVGFnICE9IHBjZUluc3RhbmNlVGFnKSB7CisgICAgICAgIGNvbnRpbnVlOyAgLyogZG9uJ3QgYWNjZXB0ICovCisgICAgICB9CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBleGNsdWRlZCBjaGFubmVscyAqLworICAgIGlmIChwVGhyZWFkQnMtPmV4Y2x1ZGVkQ2huc01hc2sgPiAwKSB7CisgICAgICBJTlQgZXhjbE1hc2sgPSBwVGhyZWFkQnMtPmV4Y2x1ZGVkQ2huc01hc2s7CisgICAgICBpbnQgY2g7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCB2YWxpZENoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIG51bUV4Y2xDaG5zICs9IGV4Y2xNYXNrICYgMHgxOworICAgICAgICBleGNsTWFzayA+Pj0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG51bUV4Y2xDaG5zIDwgdmFsaWRDaGFubmVscykgeworICAgICAgdmFsaWRUaHJlYWRCc1t2YWxpZFRocmVhZHNdICAgPSBwVGhyZWFkQnM7CisgICAgICBudW1FeGNsdWRlZENobnNbdmFsaWRUaHJlYWRzXSA9IG51bUV4Y2xDaG5zOworICAgICAgdmFsaWRUaHJlYWRzKys7CisgICAgfQorICB9CisKKyAgaWYgKHZhbGlkVGhyZWFkcyA+IDEpIHsKKyAgICBpbnQgY2g7CisKKyAgICAvKiBjaGVjayBjb25zaXN0ZW5jeSBvZiBleGNsX2Nobl9tYXNrIGFtb25nc3QgdmFsaWQgRFJDIHRocmVhZHMgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCB2YWxpZENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBpbnQgcHJlc2VudCA9IDA7CisKKyAgICAgIGZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdmFsaWRUaHJlYWRzOyB0aHJlYWQrKykgeworICAgICAgICBDRHJjUGF5bG9hZCAqcFRocmVhZEJzID0gdmFsaWRUaHJlYWRCc1t0aHJlYWRdOworCisKKyAgICAgICAgLyogdGhyZWFkIGFwcGxpZXMgdG8gdGhpcyBjaGFubmVsICovCisgICAgICAgIGlmICggKHBUaHJlYWRCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGUgPT0gTVBFR19EUkNfRVhUX0RBVEEpCisgICAgICAgICAgJiYgKCAobnVtRXhjbHVkZWRDaG5zW3RocmVhZF0gPT0gMCkKKyAgICAgICAgICAgIHx8ICghKHBUaHJlYWRCcy0+ZXhjbHVkZWRDaG5zTWFzayAmICgxPDxjaCkpKSApICkgeworICAgICAgICAgIHByZXNlbnQrKzsKKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIGlmIChwcmVzZW50ID4gMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogbWFwIERSQyBiaXRzdHJlYW0gaW5mb3JtYXRpb24gb250byBEUkMgY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworICBmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHZhbGlkVGhyZWFkczsgdGhyZWFkKyspCisgIHsKKyAgICBDRHJjUGF5bG9hZCAqcFRocmVhZEJzID0gdmFsaWRUaHJlYWRCc1t0aHJlYWRdOworICAgIElOVCBleGNsTWFzayA9IHBUaHJlYWRCcy0+ZXhjbHVkZWRDaG5zTWFzazsKKyAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSBkcmNQYXlsb2FkVHlwZSA9IChBQUNERUNfRFJDX1BBWUxPQURfVFlQRSlwVGhyZWFkQnMtPmNoYW5uZWxEYXRhLmRyY0RhdGFUeXBlOworICAgIGludCBjaDsKKworICAgIC8qIGxhc3QgcHJvZ1JlZkxldmVsIHRyYW5zbWl0dGVkIGlzIHRoZSBvbmUgdGhhdCBpcyB1c2VkCisgICAgICogKGJ1dCBpdCBzaG91bGQgcmVhbGx5IG9ubHkgYmUgdHJhbnNtaXR0ZWQgb25jZSBwZXIgYmxvY2shKQorICAgICAqLworICAgIGlmIChwVGhyZWFkQnMtPnByb2dSZWZMZXZlbCA+PSAwKSB7CisgICAgICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwVGhyZWFkQnMtPnByb2dSZWZMZXZlbDsKKyAgICAgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAxOworICAgICAgc2VsZi0+cHJsRXhwaXJ5Q291bnQgPSAwOyAgLyogR290IGEgbmV3IHZhbHVlIC0+IFJlc2V0IGNvdW50ZXIgKi8KKyAgICB9CisKKyAgICBpZiAoZHJjUGF5bG9hZFR5cGUgPT0gRFZCX0RSQ19BTkNfREFUQSkgeworICAgICAgLyogQW5ub3VuY2UgdGhlIHByZXNlbnRhdGlvbiBtb2RlIG9mIHRoaXMgdmFsaWQgdGhyZWFkLiAqLworICAgICAgc2VsZi0+cHJlc01vZGUgPSBwVGhyZWFkQnMtPnByZXNNb2RlOworICAgIH0KKworICAgIC8qIFNDRSwgQ1BFIGFuZCBMRkUgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCB2YWxpZENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBpbnQgbWFwZWRDaGFubmVsID0gY2hhbm5lbE1hcHBpbmdbY2hdOworCisgICAgICBpZiAoICgoZXhjbE1hc2sgJiAoMTw8bWFwZWRDaGFubmVsKSkgPT0gMCkKKyAgICAgICAgJiYgKCAoZHJjUGF5bG9hZFR5cGUgPT0gTVBFR19EUkNfRVhUX0RBVEEpCisgICAgICAgICAgfHwgKChkcmNQYXlsb2FkVHlwZSA9PSBEVkJfRFJDX0FOQ19EQVRBKSAmJiBzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uKQorICAgICAgICAgKSApIHsKKyAgICAgICAgLyogY29weSB0aHJlYWQgdG8gY2hhbm5lbCAqLworICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+ZHJjRGF0YSA9IHBUaHJlYWRCcy0+Y2hhbm5lbERhdGE7CisgICAgICB9CisgICAgfQorICAgIC8qIENDRXMgbm90IHN1cHBvcnRlZCBieSBub3cgKi8KKyAgfQorCisgIC8qIEluY3JlbWVudCBhbmQgY2hlY2sgZXhwaXJ5IGNvdW50ZXIgZm9yIHRoZSBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbDogKi8KKyAgaWYgKCAocFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPiAwKQorICAgICYmIChzZWxmLT5wcmxFeHBpcnlDb3VudCsrID4gcFBhcmFtcy0+ZXhwaXJ5RnJhbWUpICkKKyAgeyAvKiBUaGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgaXMgdG9vIG9sZCwgc28gc2V0IGl0IGJhY2sgdG8gdGhlIHRhcmdldCBsZXZlbC4gKi8KKyAgICBzZWxmLT5wcm9nUmVmTGV2ZWxQcmVzZW50ID0gMDsKKyAgICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwUGFyYW1zLT50YXJnZXRSZWZMZXZlbDsKKyAgICBzZWxmLT5wcmxFeHBpcnlDb3VudCA9IDA7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCit2b2lkIGFhY0RlY29kZXJfZHJjQXBwbHkgKAorICAgICAgICBIQU5ETEVfQUFDX0RSQyAgICAgICAgICBzZWxmLAorICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICpwU2JyRGVjLAorICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICBDRHJjQ2hhbm5lbERhdGEgICAgICAgICpwRHJjQ2hEYXRhLAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICpleHRHYWluLAorICAgICAgICBpbnQgIGNoLCAgIC8qIG5lZWRlZCBvbmx5IGZvciBTQlIgKi8KKyAgICAgICAgaW50ICBhYWNGcmFtZVNpemUsCisgICAgICAgIGludCAgYlNiclByZXNlbnQgKQoreworICBpbnQgYmFuZCwgdG9wLCBiaW4sIG51bUJhbmRzOworICBpbnQgYm90dG9tID0gMDsKKyAgaW50IG1vZGlmeUJpbnMgPSAwOworCisgIEZJWFBfREJMIG1heF9tYW50aXNzYTsKKyAgSU5UIG1heF9leHBvbmVudDsKKworICBGSVhQX0RCTCBub3JtX21hbnRpc3NhID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgIElOVCAgbm9ybV9leHBvbmVudCA9IDE7CisKKyAgRklYUF9EQkwgZmFjdF9tYW50aXNzYVtNQVhfRFJDX0JBTkRTXTsKKyAgSU5UICBmYWN0X2V4cG9uZW50W01BWF9EUkNfQkFORFNdOworCisgIENEcmNQYXJhbXMgICpwUGFyYW1zID0gJnNlbGYtPnBhcmFtczsKKworICBGSVhQX0RCTCAgICAqcFNwZWN0cmFsQ29lZmZpY2llbnQgID0gIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgIENJY3NJbmZvICAgICpwSWNzSW5mbyAgICAgICAgICAgICAgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKKyAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGUgICAgICAgICAgICA9ICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CisKKyAgaW50IHdpblNlcSA9IHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsKKworICAvKiBJbmNyZW1lbnQgYW5kIGNoZWNrIGV4cGlyeSBjb3VudGVyICovCisgIGlmICggKHBQYXJhbXMtPmV4cGlyeUZyYW1lID4gMCkKKyAgICAmJiAoKytwRHJjQ2hEYXRhLT5leHBpcnlDb3VudCA+IHBQYXJhbXMtPmV4cGlyeUZyYW1lKSApCisgIHsgLyogVGhlIERSQyBkYXRhIGlzIHRvbyBvbGQsIHNvIGRlbGV0ZSBpdC4gKi8KKyAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSggcERyY0NoRGF0YSApOworICB9CisKKyAgaWYgKCFzZWxmLT5lbmFibGUpIHsKKyAgICBzYnJEZWNvZGVyX2RyY0Rpc2FibGUoIChIQU5ETEVfU0JSREVDT0RFUilwU2JyRGVjLCBjaCApOworICAgIGlmIChleHRHYWluICE9IE5VTEwpIHsKKyAgICAgIElOVCBnYWluU2NhbGUgPSAoSU5UKSpleHRHYWluOworICAgICAgLyogVGhlIGdhaW4gc2NhbGluZyBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gaW4gdGhlIGJ1ZmZlciBwb2ludGVkIG9uIGJ5IGV4dEdhaW4uICovCisgICAgICBpZiAoZ2FpblNjYWxlID49IDAgJiYgZ2FpblNjYWxlIDw9IERGUkFDVF9CSVRTKSB7CisgICAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBudW1CYW5kcyA9IHBEcmNDaERhdGEtPm51bUJhbmRzOworICB0b3AgPSBGREttYXgoMCwgbnVtQmFuZHMtMSk7CisKKyAgcERyY0NoRGF0YS0+YmFuZFRvcFswXSA9IGZpeE1pbihwRHJjQ2hEYXRhLT5iYW5kVG9wWzBdLCAoYWFjRnJhbWVTaXplID4+IDIpIC0gMSk7CisKKyAgLyogSWYgcHJvZ3JhbSByZWZlcmVuY2Ugbm9ybWFsaXphdGlvbiBpcyBkb25lIGluIHRoZSBkaWdpdGFsIGRvbWFpbiwKKyAgbW9kaWZ5IGZhY3RvciB0byBwZXJmb3JtIG5vcm1hbGl6YXRpb24uICBwcm9nX3JlZl9sZXZlbCBjYW4KKyAgYWx0ZXJuYXRpdmVseSBiZSBwYXNzZWQgdG8gdGhlIHN5c3RlbSBmb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBsZXZlbCBpbgorICB0aGUgYW5hbG9nIGRvbWFpbi4gIEFuYWxvZyBsZXZlbCBtb2RpZmljYXRpb24gYXZvaWRzIHByb2JsZW1zIHdpdGgKKyAgcmVkdWNlZCBEQUMgU05SIChpZiBzaWduYWwgaXMgYXR0ZW51YXRlZCkgb3IgY2xpcHBpbmcgKGlmIHNpZ25hbCBpcworICBib29zdGVkKSAqLworCisgIGlmIChwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA+PSAwKQorICB7CisgICAgLyogMC41XigodGFyZ2V0UmVmTGV2ZWwgLSBwcm9nUmVmTGV2ZWwpLzI0KSAqLworICAgIG5vcm1fbWFudGlzc2EgPSBmTGRQb3coCisgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwgLyogbG9nMigwLjUpICovCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGTDJGWENPTlNUX0RCTCgxLjBmLzI0LjApPj4zKSAqIChJTlQpKHBQYXJhbXMtPnRhcmdldFJlZkxldmVsLXNlbGYtPnByb2dSZWZMZXZlbCkpLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgJm5vcm1fZXhwb25lbnQgKTsKKyAgfQorICAvKiBBbHdheXMgZXhwb3J0IHRoZSBub3JtYWxpemF0aW9uIGdhaW4gKGlmIHBvc3NpYmxlKS4gKi8KKyAgaWYgKGV4dEdhaW4gIT0gTlVMTCkgeworICAgIElOVCBnYWluU2NhbGUgPSAoSU5UKSpleHRHYWluOworICAgIC8qIFRoZSBnYWluIHNjYWxpbmcgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGluIHRoZSBidWZmZXIgcG9pbnRlZCBvbiBieSBleHRHYWluLiAqLworICAgIGlmIChnYWluU2NhbGUgPj0gMCAmJiBnYWluU2NhbGUgPD0gREZSQUNUX0JJVFMpIHsKKyAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQorICB9CisgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9PSAwKSB7CisgICAgLyogUmVzZXQgbm9ybWFsaXphdGlvbiBnYWluIHNpbmNlIHRoaXMgbW9kdWxlIG11c3Qgbm90IGFwcGx5IGl0ICovCisgICAgbm9ybV9tYW50aXNzYSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOworICAgIG5vcm1fZXhwb25lbnQgPSAxOworICB9CisKKworICAvKiBjYWxjIHNjYWxlIGZhY3RvcnMgKi8KKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bUJhbmRzOyBiYW5kKyspCisgIHsKKyAgICBVQ0hBUiBkcmNWYWwgPSBwRHJjQ2hEYXRhLT5kcmNWYWx1ZVtiYW5kXTsKKyAgICB0b3AgPSBmaXhNaW4oKGludCkoIChwRHJjQ2hEYXRhLT5iYW5kVG9wW2JhbmRdKzEpPDwyICksIGFhY0ZyYW1lU2l6ZSk7CisKKyAgICBmYWN0X21hbnRpc3NhW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgICAgZmFjdF9leHBvbmVudFtiYW5kXSA9IDE7CisKKyAgICBpZiAoICBwUGFyYW1zLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24KKyAgICAgICYmICgoQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUpcERyY0NoRGF0YS0+ZHJjRGF0YVR5cGUgPT0gRFZCX0RSQ19BTkNfREFUQSkgKQorICAgIHsKKyAgICAgIElOVCBjb21wcmVzc2lvbkZhY3RvclZhbF9lOworICAgICAgaW50IHZhbFgsIHZhbFk7CisKKyAgICAgIHZhbFggPSBkcmNWYWwgPj4gNDsKKyAgICAgIHZhbFkgPSBkcmNWYWwgJiAweDBGOworCisgICAgICAvKiBjYWxjdWxhdGUgdGhlIHVuc2NhbGVkIGhlYXZ5IGNvbXByZXNzaW9uIGZhY3Rvci4KKyAgICAgICAgIGNvbXByZXNzaW9uRmFjdG9yID0gNDguMTY0IC0gNi4wMjA2KnZhbFggLSAwLjQwMTQqdmFsWSBkQgorICAgICAgICAgcmFuZ2U6IC00OC4xNjYgZEIgdG8gNDguMTY0IGRCICovCisgICAgICBpZiAoIGRyY1ZhbCAhPSAweDdGICkgeworICAgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdID0KKyAgICAgICAgICBmUG93SW50KCBGTDJGWENPTlNUX0RCTCgwLjk1NDgzODY3MTgxKSwgLyogLTAuNDAxNGRCID0gMC45NTQ4Mzg2NzE4MSAqLworICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgdmFsWSwKKyAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbkZhY3RvclZhbF9lICk7CisKKyAgICAgICAgLyogLTAuMDAwOGRCICg0OC4xNjQgLSA2LjAyMDYqOCA9IC0wLjAwMDgpICovCisgICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjk5OTkwNzkwMDg0KSwgZmFjdF9tYW50aXNzYVtiYW5kXSk7CisKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSA9IERWQl9DT01QUkVTU0lPTl9TQ0FMRSAtIHZhbFggKyBjb21wcmVzc2lvbkZhY3RvclZhbF9lOworICAgICAgfQorICAgIH0gZWxzZQorICAgIGlmICgoQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUpcERyY0NoRGF0YS0+ZHJjRGF0YVR5cGUgPT0gTVBFR19EUkNfRVhUX0RBVEEpCisgICAgeworICAgIC8qIGFwcGx5IHRoZSBzY2FsZWQgZHluYW1pYyByYW5nZSBjb250cm9sIHdvcmRzIHRvIGZhY3Rvci4KKyAgICAgKiBpZiBzY2FsaW5nIGRyY19jdXQgKG9yIGRyY19ib29zdCksIG9yIGNvbnRyb2wgd29yZCBkcmNfbWFudGlzc2EgaXMgMAorICAgICAqIHRoZW4gdGhlcmUgaXMgbm8gZHluYW1pYyByYW5nZSBjb21wcmVzc2lvbgorICAgICAqCisgICAgICogaWYgcERyY0NoRGF0YS0+ZHJjU2duW2JhbmRdIGlzIAorICAgICAqICAxIHRoZW4gZ2FpbiBpcyA8IDEgOiAgZmFjdG9yID0gMl4oLXNlbGYtPmN1dCAgICogcERyY0NoRGF0YS0+ZHJjTWFnW2JhbmRdIC8gMjQpCisgICAgICogIDAgdGhlbiBnYWluIGlzID4gMSA6ICBmYWN0b3IgPSAyXiggc2VsZi0+Ym9vc3QgKiBwRHJjQ2hEYXRhLT5kcmNNYWdbYmFuZF0gLyAyNCkKKyAgICAgKi8KKworICAgIGlmICgoZHJjVmFsJjB4N0YpID4gMCkgeworICAgICAgRklYUF9EQkwgdFBhcmFtVmFsID0gKGRyY1ZhbCAmIDB4ODApID8gLXBQYXJhbXMtPmN1dCA6IHBQYXJhbXMtPmJvb3N0OworCisgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdID0KKyAgICAgICAgZjJQb3coIChGSVhQX0RCTCkoKElOVClmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzE5Mi4wZiksIHRQYXJhbVZhbCkgKiAoZHJjVmFsJjB4N0YpKSwKKyAgICAgICAgICAgICAgICAgMytEUkNfUEFSQU1fU0NBTEUsCisgICAgICAgICAgICAgICAgJmZhY3RfZXhwb25lbnRbYmFuZF0gKTsKKyAgICB9CisgICAgfQorCisgICAgZmFjdF9tYW50aXNzYVtiYW5kXSAgPSBmTXVsdChmYWN0X21hbnRpc3NhW2JhbmRdLCBub3JtX21hbnRpc3NhKTsKKyAgICBmYWN0X2V4cG9uZW50W2JhbmRdICs9IG5vcm1fZXhwb25lbnQ7CisKKworICAgIGJvdHRvbSA9IHRvcDsKKworICB9ICAvKiBlbmQgbG9vcCBvdmVyIGJhbmRzICovCisKKworICAvKiBub3JtYWxpemF0aW9ucyAqLworICB7CisgICAgaW50IHJlczsKKworICAgIG1heF9tYW50aXNzYSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIG1heF9leHBvbmVudCA9IDA7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bUJhbmRzOyBiYW5kKyspIHsKKyAgICAgIG1heF9tYW50aXNzYSA9IGZpeE1heChtYXhfbWFudGlzc2EsIGZhY3RfbWFudGlzc2FbYmFuZF0pOworICAgICAgbWF4X2V4cG9uZW50ID0gZml4TWF4KG1heF9leHBvbmVudCwgZmFjdF9leHBvbmVudFtiYW5kXSk7CisgICAgfQorCisgICAgLyogbGVmdCBzaGlmdCBmYWN0b3JzIHRvIGdhaW4gYWNjdXJhbmN5ICovCisgICAgcmVzID0gQ250TGVhZGluZ1plcm9zKG1heF9tYW50aXNzYSkgLSAxOworCisgICAgLyogYWJvdmUgdG9wbW9zdCBEUkMgYmFuZCBnYWluIGZhY3RvciBpcyAxICovCisgICAgaWYgKCgocERyY0NoRGF0YS0+YmFuZFRvcFtudW1CYW5kcy0xXSsxKTw8MikgPCBhYWNGcmFtZVNpemUpIHJlcyA9IDA7CisKKyAgICBpZiAocmVzID4gMCkgeworICAgICAgcmVzID0gZml4TWluKHJlcywgbWF4X2V4cG9uZW50KTsKKyAgICAgIG1heF9leHBvbmVudCAtPSByZXM7CisKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1CYW5kczsgYmFuZCsrKSB7CisgICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPDw9IHJlczsKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSAgLT0gcmVzOworICAgICAgfQorICAgIH0KKworICAgIC8qIG5vcm1hbGl6ZSBtYWduaXR1ZGVzIHRvIG9uZSBzY2FsZSBmYWN0b3IgKi8KKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykgeworICAgICAgaWYgKGZhY3RfZXhwb25lbnRbYmFuZF0gPCBtYXhfZXhwb25lbnQpIHsKKyAgICAgICAgZmFjdF9tYW50aXNzYVtiYW5kXSA+Pj0gbWF4X2V4cG9uZW50IC0gZmFjdF9leHBvbmVudFtiYW5kXTsKKyAgICAgIH0KKyAgICAgIGlmIChmYWN0X21hbnRpc3NhW2JhbmRdICE9IEZMMkZYQ09OU1RfREJMKDAuNWYpKSB7CisgICAgICAgIG1vZGlmeUJpbnMgPSAxOworICAgICAgfQorICAgIH0KKyAgICBpZiAobWF4X2V4cG9uZW50ICE9IDEpIHsKKyAgICAgIG1vZGlmeUJpbnMgPSAxOworICAgIH0KKyAgfQorCisgIC8qICBhcHBseSBmYWN0b3IgdG8gc3BlY3RyYWwgbGluZXMKKyAgICogIHNob3J0IGJsb2NrcyBtdXN0IHRha2UgY2FyZSB0aGF0IGJhbmRzIGZhbGwgb24gCisgICAqICBibG9jayBib3VuZGFyaWVzIQorICAgKi8KKyAgaWYgKCFiU2JyUHJlc2VudCkKKyAgeworICAgIGJvdHRvbSA9IDA7CisKKyAgICBpZiAoIW1vZGlmeUJpbnMpIHsKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5IHRoZSBzcGVjdHJhbCBiaW5zIGJlY2F1c2UgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhbGwgZmFjdG9ycyBpcyAwLjUuCisgICAgICAgICBJbiBvcmRlciB0byBrZWVwIGFjY3VyYW5jeSB3ZSBkb24ndCBhcHBseSB0aGUgZmFjdG9yIGJ1dCBkZWNyZWFzZSB0aGUgZXhwb25lbnQgaW5zdGVhZC4gKi8KKyAgICAgIG1heF9leHBvbmVudCAtPSAxOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1CYW5kczsgYmFuZCsrKQorICAgICAgeworICAgICAgICB0b3AgPSBmaXhNaW4oKGludCkoIChwRHJjQ2hEYXRhLT5iYW5kVG9wW2JhbmRdKzEpPDwyICksIGFhY0ZyYW1lU2l6ZSk7ICAgLyogLi4uICogRFJDX0JBTkRfTVVMVDsgKi8KKworICAgICAgICBmb3IgKGJpbiA9IGJvdHRvbTsgYmluIDwgdG9wOyBiaW4rKykgeworICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0gPSBmTXVsdChwU3BlY3RyYWxDb2VmZmljaWVudFtiaW5dLCBmYWN0X21hbnRpc3NhW2JhbmRdKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvdHRvbSA9IHRvcDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhYm92ZSB0b3Btb3N0IERSQyBiYW5kIGdhaW4gZmFjdG9yIGlzIDEgKi8KKyAgICBpZiAobWF4X2V4cG9uZW50ID4gMCkgeworICAgICAgZm9yIChiaW4gPSBib3R0b207IGJpbiA8IGFhY0ZyYW1lU2l6ZTsgYmluKz0xKSB7CisgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0gPj49IG1heF9leHBvbmVudDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhZGp1c3Qgc2NhbGluZyAqLworICAgIHBTcGVjU2NhbGVbMF0gKz0gbWF4X2V4cG9uZW50OworCisgICAgaWYgKHdpblNlcSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsKKyAgICAgIGludCB3aW47CisgICAgICBmb3IgKHdpbiA9IDE7IHdpbiA8IDg7IHdpbisrKSB7CisgICAgICAgIHBTcGVjU2NhbGVbd2luXSArPSBtYXhfZXhwb25lbnQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeworICAgIEhBTkRMRV9TQlJERUNPREVSIGhTYnJEZWNvZGVyID0gKEhBTkRMRV9TQlJERUNPREVSKXBTYnJEZWM7CisgICAgVUlOVCBudW1CYW5kcyA9IHBEcmNDaERhdGEtPm51bUJhbmRzOworCisgICAgLyogZmVlZCBmYWN0b3JzIGludG8gU0JSIGRlY29kZXIgZm9yIGFwcGxpY2F0aW9uIGluIFFNRiBkb21haW4uICovCisgICAgc2JyRGVjb2Rlcl9kcmNGZWVkQ2hhbm5lbCAoCisgICAgICAgICAgICBoU2JyRGVjb2RlciwKKyAgICAgICAgICAgIGNoLAorICAgICAgICAgICAgbnVtQmFuZHMsCisgICAgICAgICAgICBmYWN0X21hbnRpc3NhLAorICAgICAgICAgICAgbWF4X2V4cG9uZW50LAorICAgICAgICAgICAgcERyY0NoRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZSwKKyAgICAgICAgICAgIHdpblNlcSwKKyAgICAgICAgICAgIHBEcmNDaERhdGEtPmJhbmRUb3AKKyAgICAgICAgICApOworICB9CisKKyAgcmV0dXJuOworfQorCisKKy8qIAorICogUHJlcGFyZSBEUkMgcHJvY2Vzc2luZworICovCitpbnQgYWFjRGVjb2Rlcl9kcmNQcm9sb2cgKAorICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgICAgIFVDSEFSICBwY2VJbnN0YW5jZVRhZywKKyAgICAgICAgVUNIQVIgIGNoYW5uZWxNYXBwaW5nW10sIC8qIENoYW5uZWwgbWFwcGluZyB0cmFuc2xhdGluZyBkcmNDaGFubmVsIGluZGV4IHRvIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4ICovCisgICAgICAgIGludCAgICB2YWxpZENoYW5uZWxzICkKK3sKKyAgaW50IGVyciA9IDA7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghc2VsZi0+cGFyYW1zLmJzRGVsYXlFbmFibGUpCisgIHsKKyAgICBlcnIgPSBhYWNEZWNvZGVyX2RyY0V4dHJhY3RBbmRNYXAgKAorICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICBwY2VJbnN0YW5jZVRhZywKKyAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAorICAgICAgICAgICAgdmFsaWRDaGFubmVscyApOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiAKKyAqIEZpbmFsaXplIERSQyBwcm9jZXNzaW5nCisgKi8KK2ludCBhYWNEZWNvZGVyX2RyY0VwaWxvZyAoCisgICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAorICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggKi8KKyAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKQoreworICBpbnQgZXJyID0gMDsKKworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHNlbGYtPnBhcmFtcy5ic0RlbGF5RW5hYmxlKQorICB7CisgICAgZXJyID0gYWFjRGVjb2Rlcl9kcmNFeHRyYWN0QW5kTWFwICgKKyAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICBoQnMsCisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgcGNlSW5zdGFuY2VUYWcsCisgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgIHZhbGlkQ2hhbm5lbHMgKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBFeHBvcnQgcmVsZXZhbnQgbWV0YWRhdGEgaW5mbyBmcm9tIGJpdHN0cmVhbSBwYXlsb2FkLgorICovCit2b2lkIGFhY0RlY29kZXJfZHJjR2V0SW5mbyAoCisgICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAorICAgICAgICBTQ0hBUiAgICAgICAgICAqcFByZXNNb2RlLAorICAgICAgICBTQ0hBUiAgICAgICAgICAqcFByb2dSZWZMZXZlbCApCit7CisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBpZiAocFByZXNNb2RlICE9IE5VTEwpIHsKKyAgICAgICpwUHJlc01vZGUgPSBzZWxmLT5wcmVzTW9kZTsKKyAgICB9CisgICAgaWYgKHBQcm9nUmVmTGV2ZWwgIT0gTlVMTCkgeworICAgICAgaWYgKHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQpIHsKKyAgICAgICAgKnBQcm9nUmVmTGV2ZWwgPSBzZWxmLT5wcm9nUmVmTGV2ZWw7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcFByb2dSZWZMZXZlbCA9IC0xOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTBhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKQEAgLTAsMCArMSwxODkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgQUFDCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQUNERUNfRFJDX0gKKyNkZWZpbmUgQUFDREVDX0RSQ19ICisKKyNpbmNsdWRlICJ0cF9kYXRhLmgiICAgICAgICAgICAgLyogZm9yIHByb2dyYW0gY29uZmlnIGVsZW1lbnQgc3VwcG9ydCAqLworCisKKyNpbmNsdWRlICJhYWNkZWNfZHJjX3R5cGVzLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2RlZmluZSBBQUNERUNfRFJDX0RGTFRfRVhQSVJZX0ZSQU1FUyAoICA1MCApICAgLyogRGVmYXVsdCBEUkMgZGF0YSBleHBpcnkgdGltZSBpbiBBQUMgZnJhbWVzICAgKi8KKworLyoqCisgKiBcYnJpZWYgRFJDIG1vZHVsZSBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERSQ19DVVRfU0NBTEUgPSAwLAorICBEUkNfQk9PU1RfU0NBTEUsCisgIFRBUkdFVF9SRUZfTEVWRUwsCisgIERSQ19CU19ERUxBWSwKKyAgRFJDX0RBVEFfRVhQSVJZX0ZSQU1FLAorICBBUFBMWV9OT1JNQUxJWkFUSU9OLAorICBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTgorCit9IEFBQ0RFQ19EUkNfUEFSQU07CisKKworLyoqCisgKiBcYnJpZWYgRFJDIG1vZHVsZSBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0ICgKKyAgICAgICAgSEFORExFX0FBQ19EUkMgIHNlbGYgKTsKKwordm9pZCBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoCisgICAgICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoYW5uZWwgKTsKKworQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCisgICAgICAgIEhBTkRMRV9BQUNfRFJDICAgIHNlbGYsCisgICAgICAgIEFBQ0RFQ19EUkNfUEFSQU0gIHBhcmFtLAorICAgICAgICBJTlQgICAgICAgICAgICAgICB2YWx1ZSApOworCitpbnQgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZCAoCisgICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAorICAgICAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSAgdHlwZSApOworCitpbnQgYWFjRGVjb2Rlcl9kcmNQcm9sb2cgKAorICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgICAgIFVDSEFSICBwY2VJbnN0YW5jZVRhZywKKyAgICAgICAgVUNIQVIgIGNoYW5uZWxNYXBwaW5nW10sCisgICAgICAgIGludCAgICBudW1DaGFubmVscyApOworCisvKioKKyAqIFxicmllZiBBcHBseSBEUkMuIElmIFNCUiBpcyBwcmVzZW50LCBEUkMgZGF0YSBpcyBoYW5kZWQgb3ZlciB0byB0aGUgU0JSIGRlY29kZXIuCisgKiBccGFyYW0gc2VsZiBBQUMgZGVjb2RlciBpbnN0YW5jZQorICogXHBhcmFtIHBTYnJEZWMgcG9pbnRlciB0byBTQlIgZGVjb2RlciBpbnN0YW5jZQorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gQUFDIGRlY29kZXIgY2hhbm5lbCBpbnN0YW5jZSB0byBiZSBwcm9jZXNzZWQKKyAqIFxwYXJhbSBwRHJjRGF0IERSQyBjaGFubmVsIGRhdGEKKyAqIFxwYXJhbSBleHRHYWluIFBvaW50ZXIgdG8gYSBGSVhQX0RCTCB3aGVyZSBhIGV4dGVybmFsbHkgYXBwbHlhYmxlIGdhaW4gd2lsbCBiZSBzdG9yZWQgaW50byAoaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIGl0IHdpbGwgYmUgYXBwbHkgaW50ZXJuYWxseSBvciBub3QpLgorICogICAgICAgICAgICAgICAgQXQgZnVuY3Rpb24gY2FsbCB0aGUgYnVmZmVyIG11c3QgaG9sZCB0aGUgc2NhbGUgKDAgPj0gc2NhbGUgPCBERlJBQ1RfQklUUykgdG8gYmUgYXBwbGllZCBvbiB0aGUgZ2FpbiB2YWx1ZS4KKyAqIFxwYXJhbSBjaCBjaGFubmVsIGluZGV4CisgKiBccGFyYW0gYWFjRnJhbWVTaXplIEFBQyBmcmFtZSBzaXplCisgKiBccGFyYW0gYlNiclByZXNlbnQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgU0JSIGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgRFJDIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBTQlIgaW5zdGFuY2UgcFNickRlYworICovCit2b2lkIGFhY0RlY29kZXJfZHJjQXBwbHkgKAorICAgICAgICBIQU5ETEVfQUFDX0RSQyAgICAgICAgICBzZWxmLAorICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICpwU2JyRGVjLAorICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICBDRHJjQ2hhbm5lbERhdGEgICAgICAgICpwRHJjRGF0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICpleHRHYWluLAorICAgICAgICBpbnQgIGNoLAorICAgICAgICBpbnQgIGFhY0ZyYW1lU2l6ZSwKKyAgICAgICAgaW50ICBiU2JyUHJlc2VudCApOworCitpbnQgYWFjRGVjb2Rlcl9kcmNFcGlsb2cgKAorICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgICAgIFVDSEFSICBwY2VJbnN0YW5jZVRhZywKKyAgICAgICAgVUNIQVIgIGNoYW5uZWxNYXBwaW5nW10sCisgICAgICAgIGludCAgICB2YWxpZENoYW5uZWxzICk7CisKKy8qKgorICogXGJyaWVmIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBiaXRzdHJlYW0uCisgKiBccGFyYW0gc2VsZiBEUkMgbW9kdWxlIGluc3RhbmNlIGhhbmRsZS4KKyAqIFxwYXJhbSBwUHJlc01vZGUgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJlc2VudGF0aW9uIG1vZGUgd2lsbCBiZSB3cml0dGVuIHRvLgorICogXHBhcmFtIHBQcm9nUmVmTGV2ZWwgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgd2lsbCBiZSB3cml0dGVuIHRvLgorICogXHJldHVybiBOb3RoaW5nLgorICovCit2b2lkIGFhY0RlY29kZXJfZHJjR2V0SW5mbyAoCisgICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAorICAgICAgICBTQ0hBUiAgKnBQcmVzTW9kZSwKKyAgICAgICAgU0NIQVIgICpwUHJvZ1JlZkxldmVsICk7CisKKworI2VuZGlmICAvKiBBQUNERUNfRFJDX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzZkMTYzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyY190eXBlcy5oCkBAIC0wLDAgKzEsMTc0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBnbG9iYWwgZGF0YSB0eXBlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUFDREVDX0RSQ19UWVBFU19ICisjZGVmaW5lIEFBQ0RFQ19EUkNfVFlQRVNfSAorCisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworICNkZWZpbmUgTUFYX0RSQ19USFJFQURTICAgICAgKCAgIDMgKSAgICAgICAgLyogSGVhdnkgY29tcHJlc3Npb24gdmFsdWUgaXMgaGFuZGxlZCBqdXN0IGxpa2UgTVBFRyBEUkMgZGF0YSAqLworI2RlZmluZSBNQVhfRFJDX0JBTkRTICAgICAgICAgKCAgMTYgKSAgICAgICAgLyogMl5MRU5fRFJDX0JBTkRfSU5DUiAoTEVOX0RSQ19CQU5EX0lOQ1IgPSA0KSAqLworCisvKioKKyAqIFxicmllZiBEUkMgbW9kdWxlIGdsb2JhbCBkYXRhIHR5cGVzCisgKi8KK3R5cGVkZWYgZW51bQoreworICBVTktOT1dOX1BBWUxPQUQgICA9ICAwLAorICBNUEVHX0RSQ19FWFRfREFUQSA9ICAxLAorICBEVkJfRFJDX0FOQ19EQVRBICA9ICAyCisKK30gQUFDREVDX0RSQ19QQVlMT0FEX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVJTlQgICAgZXhwaXJ5Q291bnQ7CisgIFVJTlQgICAgbnVtQmFuZHM7CisgIFVTSE9SVCAgYmFuZFRvcFtNQVhfRFJDX0JBTkRTXTsKKyAgU0hPUlQgICBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lOworICBVQ0hBUiAgIGRyY1ZhbHVlW01BWF9EUkNfQkFORFNdOworICBTQ0hBUiAgIGRyY0RhdGFUeXBlOworCit9IENEcmNDaGFubmVsRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVCAgIGV4Y2x1ZGVkQ2huc01hc2s7CisgIFNDSEFSICBwcm9nUmVmTGV2ZWw7CisgIFNDSEFSICBwcmVzTW9kZTsgICAgIC8qIFByZXNlbnRhdGlvbiBtb2RlOiAwIChub3QgaW5kaWNhdGVkKSwgMSwgMiwgYW5kIDMgKHJlc2VydmVkKS4gKi8KKyAgU0NIQVIgIHBjZUluc3RhbmNlVGFnOworCisgIENEcmNDaGFubmVsRGF0YSBjaGFubmVsRGF0YTsKKworfSBDRHJjUGF5bG9hZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRklYUF9EQkwgIGN1dDsgICAgICAgLyogVGhlIGF0dGVudWF0aW9uIHNjYWxlIGZhY3RvciBjdXJyZW50bHkgdXNlZC4gICAgICovCisgIEZJWFBfREJMICB1c3JDdXQ7ICAgIC8qIFRoZSBsYXRlc3QgYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yIHNldCBieSB1c2VyLiAqLworICBGSVhQX0RCTCAgYm9vc3Q7ICAgICAvKiBUaGUgYm9vc3Qgc2NhbGUgZmFjdG9yIGN1cnJlbnRseSB1c2VkLiAgICAgICAgICAgKi8KKyAgRklYUF9EQkwgIHVzckJvb3N0OyAgLyogVGhlIGxhdGVzdCBib29zdCBzY2FsZSBmYWN0b3Igc2V0IGJ5IHVzZXIuICAgICAgICovCisKKyAgVUlOVCAgIGV4cGlyeUZyYW1lOworICBTQ0hBUiAgdGFyZ2V0UmVmTGV2ZWw7CisgIFVDSEFSICBic0RlbGF5RW5hYmxlOworICBVQ0hBUiAgYXBwbHlEaWdpdGFsTm9ybTsKKyAgVUNIQVIgIGFwcGx5SGVhdnlDb21wcmVzc2lvbjsKKworfSBDRHJjUGFyYW1zOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENEcmNQYXJhbXMgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlciAodmlhIFNldFBhcmFtIEFQSSBmdW5jdGlvbikgKi8KKworICBVQ0hBUiAgZW5hYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIHRoYXQgY29udHJvbHMgZHluYW1pYyByYW5nZSBwcm9jZXNzaW5nICovCisgIFVDSEFSICBkaWdpdGFsTm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdG8gZW4tL2Rpc2FibGUgcmVmZXJlbmNlIGxldmVsIG5vcm1hbGl6YXRpb24gaW4gZGlnaXRhbCBkb21haW4gKi8KKworICBVU0hPUlQgbnVtUGF5bG9hZHM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBEUkMgZGF0YSBwYXlsb2FkIGVsZW1lbnRzIGZvdW5kIHdpdGhpbiBmcmFtZSAqLworICBVU0hPUlQgbnVtVGhyZWFkczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBEUkMgZGF0YSB0aHJlYWRzIGV4dHJhY3RlZCBmcm9tIHRoZSBmb3VuZCBwYXlsb2FkIGVsZW1lbnRzICovCisgIFNDSEFSICBwcm9nUmVmTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBmb3IgYWxsIGNoYW5uZWxzICovCisgIFVDSEFSICBwcm9nUmVmTGV2ZWxQcmVzZW50OyAgICAgICAgICAgICAgICAvKiBQcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBmb3VuZCBpbiBiaXRzdHJlYW0gKi8KKworICBVSU5UICAgcHJsRXhwaXJ5Q291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwuICovCisKKyAgU0NIQVIgIHByZXNNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVzZW50YXRpb24gbW9kZSBhcyBkZWZpbmVkIGluIEVUU0kgVFMgMTAxIDE1NCAqLworICBVQ0hBUiAgZHZiQW5jRGF0YUF2YWlsYWJsZTsgICAgICAgICAgICAgICAgICAvKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgRFZCIGFuY2lsbGFyeSBkYXRhIGlzIHByZXNlbnQgb3Igbm90ICovCisgIFVJTlQgICBkdmJBbmNEYXRhUG9zaXRpb247ICAgICAgICAgICAgICAgICAgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIERWQiBhbmNpbGxhcnkgZGF0YSBwYXlsb2FkIHBvc2l0aW9uIGluIHRoZSBiaXRzdHJlYW0gKG9ubHkgb25lIHBlciBmcmFtZSkgKi8KKyAgVUlOVCAgIGRyY1BheWxvYWRQb3NpdGlvbltNQVhfRFJDX1RIUkVBRFNdOyAgLyogVXNlZCB0byBzdG9yZSB0aGUgRFJDIHBheWxvYWQgcG9zaXRpb25zIGluIHRoZSBiaXRzdHJlYW0gKi8KKworfSBDRHJjSW5mbzsKKwordHlwZWRlZiBDRHJjSW5mbyAqSEFORExFX0FBQ19EUkM7CisKKyNlbmRpZiAvKiBBQUNERUNfRFJDX1RZUEVTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE0ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5jcHAKQEAgLTAsMCArMSwxNTkxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IEhDUiBpbml0aWFsaXphdGlvbiwgcHJlcHJvY2VzcyBIQ1Igc2lkZWluZm8sCisgICAgICAgICAgICAgICAgZGVjb2RlIHByaW9yaXR5IGNvZGV3b3JkcyAoUENXcykKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKworCisKKyNpbmNsdWRlICJhYWNkZWNfaGNyX3R5cGVzLmgiCisjaW5jbHVkZSAiYWFjZGVjX2hjcl9iaXQuaCIKKyNpbmNsdWRlICJhYWNkZWNfaGNycy5oIgorI2luY2x1ZGUgImFhY19yYW0uaCIKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgImJsb2NrLmgiCisKKyNpbmNsdWRlICJhYWNkZWNvZGVyLmgiICAgICAvKiBmb3IgSURfQ1BFLCBJRF9TQ0UgLi4uICovCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCitleHRlcm4gaW50IG1sRmlsZUNoQ3VycjsKKworc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChTQ0hBUiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgbnVtTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKTsKKworc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmVycm9yV29yZCk7CisKK3N0YXRpYyB2b2lkIEhjckNhbGNOdW1Db2Rld29yZCAgICAgICAgICAgICAgICAgICAgKEhfSENSX0lORk8gcEhjcik7CitzdGF0aWMgdm9pZCBIY3JTb3J0Q29kZWJvb2tBbmROdW1Db2Rld29yZEluU2VjdGlvbihIX0hDUl9JTkZPIHBIY3IpOworc3RhdGljIHZvaWQgSGNyUHJlcGFyZVNlZ21lbnRhdGlvbkdyaWQgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKK3N0YXRpYyB2b2lkIEhjckV4dGVuZGVkU2VjdGlvbkluZm8gICAgICAgICAgICAgICAgKEhfSENSX0lORk8gcEhjcik7CisKK3N0YXRpYyB2b2lkIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyhVSU5UICAgbnVtU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpOworCitzdGF0aWMgSU5UICBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjQ29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitzdGF0aWMgaW50IERlY29kZVBDV19TaWduKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgIGNvZGVib29rRGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAqcFF1YW50VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAqcFF1YW50U3BlY0NvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpxdWFudFNwZWNDb2VmSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworc3RhdGljIGNvbnN0IFNDSEFSICpEZWNvZGVQQ1dfQm9keShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICpwQ3VycmVudFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICpwUXVhbnRWYWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworc3RhdGljIHZvaWQgRGVjb2RlUENXcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSF9IQ1JfSU5GTyBwSGNyKTsKKworc3RhdGljIHZvaWQgSGNyUmVvcmRlclF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKAorICAgICAgICBIX0hDUl9JTkZPIHBIY3IsCisgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvCisgICAgICAgICk7CisKKworI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQorc3RhdGljIFVDSEFSIGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbihTQ0hBUiAgICAgICByZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hDUl9JTkZPICBwSGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ1dfVFlQRSAgICBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpxc2NfYmFzZV9vZl9jdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgZGltZW5zaW9uKTsKKyNlbmRpZgorCisjaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0ZJTkFMCitzdGF0aWMgdm9pZCBlcnJEZXRlY3RXaXRoaW5TZWdtZW50YXRpb25GaW5hbChIX0hDUl9JTkZPIHBIY3IpOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIENoZWNrIGlmIGNvZGVib29rIGFuZCBudW1TZWN0IGFyZSB3aXRoaW4gYWxsb3dlZCByYW5nZSAoc2hvcnQgb25seSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KFNDSEFSIGNiLCBTSE9SVCBudW1MaW5lLFVJTlQqIGVycm9yV29yZCkKK3sKKworCisKKyAgaWYgKCBjYiA8IFpFUk9fSENCIHx8IGNiID49IE1BWF9DQl9DSEVDSyB8fCBjYiA9PSBCT09LU0NMICkgeworICAgICplcnJvcldvcmQgfD0gQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOworICB9CisgIGlmICggbnVtTGluZSA8IDAgfHwgbnVtTGluZSA+IDEwMjQgKSB7CisgICAgKmVycm9yV29yZCB8PSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIENoZWNrIGJvdGggSENSIGxlbmd0aHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhTQ0hBUiAgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAqZXJyb3JXb3JkKQoreworICBpZiAoIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDwgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgKSB7CisgICAgKmVycm9yV29yZCB8PSBIQ1JfU0lfTEVOR1RIU19GQUlMVVJFOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8gY29tcG9uZW50czoKKyAgICAgICAgICAgICAgICAgICAgJ3Jlb3JkZXJlZF9zcGVjdHJhbF9kYXRhX2xlbmd0aCcgYW5kICdsb25nZXN0X2NvZGV3b3JkX2xlbmd0aCcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgQ0hjcl9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzLAorICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKK3sKKyAgSU5UICAgIGdsb2JhbEhjclR5cGUgPSBnZXRIY3JUeXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJIY3JJbmZvKTsKKyAgU0hPUlQgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKKyAgU0NIQVIgIGxlbmdPZkxvbmdlc3RDb2Rld29yZDsKKworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSAwOworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQgICAgICAgPSAwOworCisKKworICAgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMSAtLS0tLS0tICovCisgICAgbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gRkRLcmVhZEJpdHMoYnMsMTQpICsgRVJST1JfTE9SU0Q7CisgICAgaWYgKCBnbG9iYWxIY3JUeXBlID09IElEX0NQRSApIHsKKyAgICAgIGlmICgobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID49IDApICYmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPD0gQ1BFX1RPUF9MRU5HVEgpKSB7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+IENQRV9UT1BfTEVOR1RIKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gQ1BFX1RPUF9MRU5HVEg7ICAgICAgICAgICAgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChnbG9iYWxIY3JUeXBlID09IElEX1NDRSB8fCBnbG9iYWxIY3JUeXBlID09IElEX0xGRSB8fCBnbG9iYWxIY3JUeXBlID09IElEX0NDRSApIHsKKyAgICAgIGlmICgobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID49IDApICYmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPD0gU0NFX1RPUF9MRU5HVEgpKSB7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+IFNDRV9UT1BfTEVOR1RIKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gU0NFX1RPUF9MRU5HVEg7ICAgICAgICAgICAgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCisgICAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkID0gRkRLcmVhZEJpdHMoYnMsNikgKyBFUlJPUl9MT0xDOworICAgIGlmICgobGVuZ09mTG9uZ2VzdENvZGV3b3JkID49IDApICYmIChsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPD0gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCkpIHsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IGxlbmdPZkxvbmdlc3RDb2Rld29yZDsgICAgICAgICAgICAgICAgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGxlbmdPZkxvbmdlc3RDb2Rld29yZCA+IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEgpIHsKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSDsgICAgICAgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KKyAgICAgIH0KKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgU2V0cyB1cCBIQ1IgUk9NLVRhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBIY3JJbml0Um9tKEhfSENSX0lORk8gcEhjcikKK3sKKyAgcEhjci0+Y2JQYWlycy5wTWluT2ZDYlBhaXIgICAgID0gYU1pbk9mQ2JQYWlyOworICBwSGNyLT5jYlBhaXJzLnBNYXhPZkNiUGFpciAgICAgPSBhTWF4T2ZDYlBhaXI7CisKKyAgcEhjci0+dGFibGVJbmZvLnBNYXhDd0xlbmd0aCAgID0gYU1heEN3TGVuOworICBwSGNyLT50YWJsZUluZm8ucENiRGltZW5zaW9uICAgPSBhRGltQ2I7CisgIHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1TaGlmdCAgICA9IGFEaW1DYlNoaWZ0OworICBwSGNyLT50YWJsZUluZm8ucENiU2lnbiAgICAgICAgPSBhU2lnbkNiOworICBwSGNyLT50YWJsZUluZm8ucENiUHJpb3JpdHkgICAgPSBhQ2JQcmlvcml0eTsKKyAgcEhjci0+dGFibGVJbmZvLnBMYXJnZXN0QWJzVmFsID0gYUxhcmdlc3RBYnNvbHV0ZVZhbHVlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBTZXQgdXAgSENSIC0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gSGNyRGVjb2RlcigpLgorICAgICAgICAgICAgICAgICAgICBGb3Igc2hvcnQgYmxvY2sgYSBzb3J0aW5nIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIGdldCB0aGUgU0kgaW4gdGhlIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIHRoYXQgSENSIGNvdWxkIGFzc2VtYmxlIHRoZSBxc2MncyBhcyBpZiBpdCBpcyBhIGxvbmcgYmxvY2suCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgICBlcnJvciBsb2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VJTlQgSGNySW5pdChIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAorICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCit7CisgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworICBTSE9SVCAqcE51bUxpbmVzSW5TZWM7CisgIFVDSEFSICpwQ29kZUJrOworICBTSE9SVCAgbnVtU2VjdGlvbjsKKyAgU0NIQVIgIGNiOworICBpbnQgIG51bUxpbmU7CisgIGludCAgaTsKKworICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOworICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkOworICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7CisgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgPSAwOworICBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFDb2RlQm9va3M0SGNyOworICBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdCAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFOdW1MaW5lSW5TZWM0SGNyOworICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLm51bWJlclNlY3Rpb247CisgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nID0gMDsKKyAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2UgICAgICAgICAgICAgICAgICA9IFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisKKyAgRkRLc3luY0NhY2hlKGJzKTsKKyAgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtSW5kZXggICAgICAgICAgICAgICAgICAgICA9IEZES2dldEJpdENudChicyk7CisKKyAgaWYgKCFJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpICAgLyogc2hvcnQgYmxvY2sgKi8KKyAgeworICAgIFNIT1JUICBiYW5kOworICAgIFNIT1JUICBtYXhCYW5kOworICAgIFNDSEFSICBncm91cDsKKyAgICBTQ0hBUiAgd2luR3JvdXBMZW47CisgICAgU0NIQVIgIHdpbmRvdzsKKyAgICBTQ0hBUiAgbnVtVW5pdEluQmFuZDsKKyAgICBTQ0hBUiAgY250VW5pdEluQmFuZDsKKyAgICBTQ0hBUiAgZ3JvdXBXaW47CisgICAgU0NIQVIgIGNiX3ByZXY7CisKKyAgICBVQ0hBUiAqcENvZGVCb29rOworICAgIGNvbnN0IFNIT1JUICpCYW5kT2Zmc2V0czsKKyAgICBTQ0hBUiAgbnVtT2ZHcm91cHM7CisKKworICAgIHBDb2RlQm9vayAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsgICAgICAgICAgICAgLyogaW4gKi8KKyAgICBwTnVtTGluZXNJblNlYyA9IHBIY3ItPmRlY0luT3V0LnBOdW1MaW5lSW5TZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBwQ29kZUJrICAgICAgICA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBCYW5kT2Zmc2V0cyAgICA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsgLyogYXV4ICovCisgICAgbnVtT2ZHcm91cHMgICAgPSBHZXRXaW5kb3dHcm91cHMocEljc0luZm8pOworCisgICAgbnVtTGluZSA9IDA7CisgICAgbnVtU2VjdGlvbiA9IDA7CisgICAgY2IgICAgICA9IHBDb2RlQm9va1swXTsKKyAgICBjYl9wcmV2ID0gcENvZGVCb29rWzBdOworCisgICAgLyogY29udmVydCBIQ1Itc2lkZWluZm8gaW50byBhIHVuaXR3aXNlIG1hbm5lcjogV2hlbiB0aGUgY2IgY2hhbmdlcywgYSBuZXcgc2VjdGlvbiBzdGFydHMgKi8KKworICAgICpwQ29kZUJrKysgPSBjYl9wcmV2OworCisgICAgbWF4QmFuZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1heEJhbmQ7IGJhbmQrKykgeyAgLyogZnJvbSBsb3cgdG8gaGlnaCBzZmJzIGkuZS4gZnJvbSBsb3cgdG8gaGlnaCBmcmVxdWVuY2llcyAgKi8KKyAgICAgIG51bVVuaXRJbkJhbmQgPSAoKEJhbmRPZmZzZXRzW2JhbmQrMV0gLSBCYW5kT2Zmc2V0c1tiYW5kXSkgPj4gRk9VUl9MT0dfRElWX1RXT19MT0cpOyAvKiBnZXQgdGhlIG51bWJlciBvZiB1bml0cyBpbiBjdXJyZW50IHNmYiAqLworICAgICAgZm9yIChjbnRVbml0SW5CYW5kID0gbnVtVW5pdEluQmFuZDsgIGNudFVuaXRJbkJhbmQgIT0gMDsgY250VW5pdEluQmFuZC0tICkgeyAvKiBmb3IgZXZlcnkgdW5pdCBpbiB0aGUgYmFuZCAqLworICAgICAgICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCBudW1PZkdyb3VwczsgZ3JvdXArKykgeworICAgICAgICAgIHdpbkdyb3VwTGVuID0gR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOworICAgICAgICAgIGZvciAoZ3JvdXBXaW4gPSB3aW5Hcm91cExlbjsgZ3JvdXBXaW4gIT0gMDsgZ3JvdXBXaW4tLSwgd2luZG93KyspIHsKKyAgICAgICAgICAgIGNiID0gcENvZGVCb29rW2dyb3VwICogMTYgKyBiYW5kXTsKKyAgICAgICAgICAgIGlmIChjYiAhPSBjYl9wcmV2KSB7CisjaWYgQ0hFQ0tfVkFMSURfSENSX0lOUFVUIC8qIHNob3J0LWJsb2NrICAxIG9mIDIgKi8KKyAgICAgICAgICAgICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYixudW1MaW5lLCZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICAgICAgICAgICAgICBpZiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgIT0gMCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgKnBDb2RlQmsrKyA9IGNiOworICAgICAgICAgICAgICAqcE51bUxpbmVzSW5TZWMrKyA9IG51bUxpbmU7CisgICAgICAgICAgICAgIG51bVNlY3Rpb24rKzsKKworICAgICAgICAgICAgICBjYl9wcmV2ID0gY2I7CisgICAgICAgICAgICAgIG51bUxpbmUgPSBMSU5FU19QRVJfVU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBudW1MaW5lICs9IExJTkVTX1BFUl9VTklUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG51bVNlY3Rpb24rKzsKKworI2lmIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAvKiBzaG9ydC1ibG9jayAgMiBvZiAyICovCisgICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYixudW1MaW5lLCZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICAgIGlmICggbnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiAxMDI0LzIgKSB7CisgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBOVU1fU0VDVF9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0s7CisgICAgfQorICAgIGVyckRldGVjdG9ySW5IY3JMZW5ndGhzKHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICBpZiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgIT0gMCApIHsKKyAgICAgIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgICAgfQorI2VuZGlmCisKKyAgICAqcENvZGVCayA9IGNiOworICAgICpwTnVtTGluZXNJblNlYyA9IG51bUxpbmU7CisgICAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbiA9IG51bVNlY3Rpb247CisKKyAgfSBlbHNlIC8qIGVuZCBzaG9ydCBibG9jayBwcmVwYXJlIFNJICovCisgIHsgICAgICAvKiBsb25nIGJsb2NrICovCisjaWYgQ0hFQ0tfVkFMSURfSENSX0lOUFVUIC8qIGxvbmctYmxvY2sgIDEgb2YgMSAqLworICAgIGVyckRldGVjdG9ySW5IY3JMZW5ndGhzKHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICBudW1TZWN0aW9uICAgICA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247CisgICAgcE51bUxpbmVzSW5TZWMgPSBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdDsKKyAgICBwQ29kZUJrICAgICAgICA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKKyAgICBpZiAoIG51bVNlY3Rpb24gPD0gMCB8fCBudW1TZWN0aW9uID4gNjQgKSB7CisgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBOVU1fU0VDVF9PVVRfT0ZfUkFOR0VfTE9OR19CTE9DSzsKKyAgICAgIG51bVNlY3Rpb24gPSAwOworICAgIH0KKworICAgIGZvciAoIGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSApCisgICAgeworICAgICAgY2IgPSAqcENvZGVCaysrOworCisgICAgICBpZiAoIGNiIDwgWkVST19IQ0IgfHwgY2IgPj0gTUFYX0NCX0NIRUNLIHx8IGNiID09IEJPT0tTQ0wgKSB7CisgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IENCX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLOworICAgICAgfQorCisgICAgICBudW1MaW5lID0gKnBOdW1MaW5lc0luU2VjKys7CisgICAgICAvKiBGREtfQVNTRVJUKG51bUxpbmUgPiAwKTsgKi8KKworICAgICAgaWYgKCAobnVtTGluZSA8PSAwKSB8fCAobnVtTGluZSA+IDEwMjQpICkgeworICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CisgICAgICB9CisgICAgfQorICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgeworICAgICAgcmV0dXJuICggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgKTsKKyAgICB9CisjZW5kaWYgIC8qIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAqLworICB9CisKKyAgcENvZGVCayA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKKyAgZm9yICggaSA9IDA7IGkgPCBudW1TZWN0aW9uOyBpKysgKSB7CisgICAgaWYgKAorICAgICAgICAgKCpwQ29kZUJrID09IE5PSVNFX0hDQikgICAgICB8fAorICAgICAgICAgKCpwQ29kZUJrID09IElOVEVOU0lUWV9IQ0IyKSB8fAorICAgICAgICAgKCpwQ29kZUJrID09IElOVEVOU0lUWV9IQ0IpKQorICAgIHsKKyAgICAgICpwQ29kZUJrID0gMDsKKyAgICB9CisgICAgcENvZGVCaysrOworICB9CisKKyAgLyogSENSLXNpZGVpbmZvLWlucHV0IGlzIGNvbXBsZXRlIGFuZCBzZWVtcyB0byBiZSB2YWxpZCAqLworCisKKworICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworfQorCisKKworCisjaWYgVVNFX0hDUl9EVU1NWQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgSENSIC0gZHVtbXkgIC0gZnVuY3Rpb24gd3JpdGVzIG9ubHkgYSBkaXJhYy1zZXF1ZW5jZSBpbiBvdXRwdXQgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitVSU5UIEhjckRlY29kZXIoSF9IQ1JfSU5GTyAgICAgICAgICAgICAgcEhjciwKKyAgICAgICAgICAgICAgICBjb25zdCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKQoreworICBmb3IgKFNIT1JUIGk9MDsgaSA8IDEwMjQ7IGkrKyApIHsKKyAgICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMtPkxvbmdbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBpZiAoIGkgJSAzMCA9PSAwKSB7CisgICAgICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMtPkxvbmdbaV0gPSAoRklYUF9EQkwpSENSX0RJUkFDOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogVVNFX0hDUl9EVU1NWSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGNvZGV3b3JkcyBvZiB0aGUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIEhDUiBhbGdvcml0aG0gYW5kIHN0b3JlcyB0aGUgcXVhbnRpemVkIHNwZWN0cmFsCisgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyBpbiBjb3JyZWN0IG9yZGVyIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVUlOVCBIY3JEZWNvZGVyKEhfSENSX0lORk8gICAgICAgICAgICAgIHBIY3IsCisgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICAgICAgICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKK3sKKyAgaW50IHBUbXAxLCBwVG1wMiwgcFRtcDMsIHBUbXA0OworI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUworICBpbnQgICAgICAgIHBUbXA1OworI2VuZGlmCisKKyAgSU5UICAgICAgICBiaXRDbnRPZmZzdDsKKyAgVUlOVCAgICAgICBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsgICAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLworCisgIEhjckNhbGNOdW1Db2Rld29yZChwSGNyKTsKKworICBIY3JTb3J0Q29kZWJvb2tBbmROdW1Db2Rld29yZEluU2VjdGlvbihwSGNyKTsKKworICBIY3JQcmVwYXJlU2VnbWVudGF0aW9uR3JpZChwSGNyKTsKKworICBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvKHBIY3IpOworCisgIGlmICgoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICYgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLICkgIT0gMCApIHsKKyAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOyAgLyogc2lkZWluZm8gaXMgbWFzc2l2ZWx5IGNvcnJ1cHQsIHJldHVybiBmcm9tIEhDUiB3aXRob3V0IGhhdmluZyBkZWNvZGVkIGFueXRoaW5nICovCisgIH0KKworICBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMocEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CisKKyAgLyogc3RvcmUgKi8KKyAgcFRtcDEgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OworICBwVG1wMiA9IHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIHBUbXAzID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgcFRtcDQgPSBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgcFRtcDUgPSBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHg7CisjZW5kaWYKKworICAvKiAtLS0tLS0tIGRlY29kZSBtZWFuaW5nZnVsIFBDV3MgLS0tLS0tICovCisgIERlY29kZVBDV3MoYnMsIHBIY3IpOworCisgIGlmICgoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICYgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLICkgPT0gMCApIHsKKyAgICAvKiAtLS0tLS0gZGVjb2RlIHRoZSBub24tUENXcyAtLS0tLS0tLSAqLworICAgIERlY29kZU5vblBDV3MoYnMsIHBIY3IpOworICB9CisKKworI2lmIENIRUNLX1NFR01FTlRBVElPTl9GSU5BTAorICBlcnJEZXRlY3RXaXRoaW5TZWdtZW50YXRpb25GaW5hbChwSGNyKTsKKyNlbmRpZgorCisgIC8qIHJlc3RvcmUgKi8KKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IHBUbXAxOworICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICAgID0gcFRtcDI7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggICAgPSBwVG1wMzsKKyAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggICAgICAgICA9IHBUbXA0OworI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUworICBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHggICAgICAgICAgICAgID0gcFRtcDU7CisjZW5kaWYKKworICBIY3JSZW9yZGVyUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMocEhjciwgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworCisgIC8qIHJlc3RvcmUgYml0c3RyZWFtIHBvc2l0aW9uICovCisgIGJpdENudE9mZnN0ID0gc2F2ZUJpdENudCAtIEZES2dldEJpdENudChicyk7CisgIGlmKCBiaXRDbnRPZmZzdCApIHsKKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgYml0Q250T2Zmc3QpOworICB9CisKKyAgcmV0dXJuICggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgKTsKK30KKworCisjZW5kaWYgIC8qIFVTRV9IQ1JfRFVNTVkgKi8KKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiByZW9yZGVycyB0aGUgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBzZWN0aW9ud2lzZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgbG9uZy0gYW5kIHNob3J0LWJsb2NrcyBhbmQgY29tcGFyZXMgdG8gdGhlIExBViAoTGFyZ2VzdCBBYnNvbHV0ZSBWYWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2RlYm9vaykgLS0gYSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkLgorICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGZvciBzaG9ydC1ibG9ja3MgYSB1bml0LWJhc2VkLWRlaW50ZXJsZWF2aW5nIGlzIGFwcGxpZWQuCisgICAgICAgICAgICAgICAgICAgIE1vcmVvdmVyIChmb3Igc2hvcnQgYmxvY2tzKSB0aGUgc2NhbGluZyBpcyBkZXJpdmVkIChjb21wYXJlIHBsYWluIGh1ZmZtYW4KKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcikuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBIY3JSZW9yZGVyUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMoCisgICAgICAgIEhfSENSX0lORk8gcEhjciwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KKyAgICAgICAgKQoreworICBJTlQgICAgICAgcXNjOworICBVSU5UICAgICAgYWJzX3FzYzsKKyAgVUlOVCAgICAgIGksajsKKyAgVVNIT1JUICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOworICBGSVhQX0RCTCAqcFRlVmE7CisgIFVTSE9SVCAgICBsYXZFcnJvckNudCA9IDA7CisKKyAgVUlOVCAgICAgIG51bVNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOworICBTUEVDVFJBTF9QVFIgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UgPSBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlOworICBGSVhQX0RCTCAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICA9IFNQRUNfTE9ORyhwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKKyAgY29uc3QgVUNIQVIgICAgKnBDYkRpbVNoaWZ0ICAgICAgICAgICAgICAgICAgPSBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQ7CisgIGNvbnN0IFVTSE9SVCAgICpwTGFyZ2VzdEFic1ZhbCAgICAgICAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBMYXJnZXN0QWJzVmFsOworICBVQ0hBUiAgICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICAgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIFVTSE9SVCAgICpwUmVvcmRlck9mZnNldCAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFJlb3JkZXJPZmZzZXQ7CisgIEZJWFBfREJMICpwVGVtcFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7CisgIEZJWFBfREJMICpwQmFrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7CisKKyAgRkRLbWVtY2xlYXIocFRlbXBWYWx1ZXMsMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKKworICAvKiBsb25nIGFuZCBzaG9ydDogY2hlY2sgaWYgZGVjb2RlZCBodWZmbWFuLXZhbHVlcyAocXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cykgYXJlIHdpdGhpbiByYW5nZSAqLworICBmb3IgKCBpPW51bVNlY3Rpb247IGkgIT0gMDsgaS0tICkgeworICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uID0gKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbisrIDw8IHBDYkRpbVNoaWZ0WypwU29ydGVkQ29kZWJvb2tdOworICAgIHBUZVZhID0gJnBUZW1wVmFsdWVzWypwUmVvcmRlck9mZnNldCsrXTsKKyAgICBmb3IoIGogPSBudW1TcGVjdHJhbFZhbHVlc0luU2VjdGlvbjsgaiAhPSAwOyBqLS0gKSB7CisgICAgICBxc2MgPSAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKys7CisgICAgICBhYnNfcXNjID0gRkRLYWJzKHFzYyk7CisjaWYgVkFMSURfTEFWX0VSUk9SX1RSSUdHRVIKKyAgICAgIGlmICggYWJzX3FzYyA8PSBwTGFyZ2VzdEFic1ZhbFsqcFNvcnRlZENvZGVib29rXSApIHsKKyAgICAgICAgKnBUZVZhKysgPSAoRklYUF9EQkwpcXNjOyAgLyogdGhlIHFzYyB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvKiBsaW5lIGlzIHRvbyBoaWdoIC4uICovCisgICAgICAgIGlmICggYWJzX3FzYyA9PSBRX1ZBTFVFX0lOVkFMSUQgKSB7IC8qIC4uIGJlY2F1c2Ugb2YgcHJldmlvdXMgbWFya2luZyAtLT4gZG9udCBzZXQgTEFWIGZsYWcgKHdvdWxkIGJlIGNvbmZ1c2luZyksIGp1c3QgY29weSBvdXQgdGhlIGFscmVhZHkgbWFya2VkIHZhbHVlICovCisgICAgICAgICAgKnBUZVZhKysgPSAoRklYUF9EQkwpIHFzYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAuLiBiZWNhdXNlIGEgdG9vIGhpZ2ggdmFsdWUgd2FzIGRlY29kZWQgZm9yIHRoaXMgY2IgLS0+IHNldCBMQVYgZmxhZyAqLworICAgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKSBRX1ZBTFVFX0lOVkFMSUQ7CisgICAgICAgICAgbGF2RXJyb3JDbnQgKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorI2Vsc2UKKyAgICAgIGlmICggYWJzX3FzYyA8PSBwTGFyZ2VzdEFic1ZhbFsqcFNvcnRlZENvZGVib29rXSApIHsKKyAgICAgICAgKnBUZVZhKysgPSBxc2M7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgKnBUZVZhKysgPSBRX1ZBTFVFX0lOVkFMSUQ7CisgICAgICAgIGxhdkVycm9yQ250ICs9IDE7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgcFNvcnRlZENvZGVib29rKys7CisgIH0KKworICBpZiAoIUlzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkKKyAgeworICAgIEZJWFBfREJMICpwT3V0OworICAgIEZJWFBfREJMICBsb2NNYXg7CisgICAgRklYUF9EQkwgIHRtcDsKKyAgICBTQ0hBUiAgICAgZ3JvdXBvZmZzZXQ7CisgICAgU0NIQVIgICAgIGdyb3VwOworICAgIFNDSEFSICAgICBiYW5kOworICAgIFNDSEFSICAgICBncm91cHdpbjsKKyAgICBTQ0hBUiAgICAgd2luZG93OworICAgIFNDSEFSICAgICBudW1XaW5Hcm91cDsKKyAgICBTSE9SVCAgICAgaW50ZXJtOworICAgIFNDSEFSICAgICBudW1TZmJUcmFuc207CisgICAgU0NIQVIgICAgIHdpbkdyb3VwTGVuOworICAgIFNIT1JUICAgICBpbmRleDsKKyAgICBJTlQgICAgICAgbXNiOworICAgIElOVCAgICAgICBsc2I7CisKKyAgICBTSE9SVCAgICpwU2NhbGVGYWNIY3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yOworICAgIFNIT1JUICAgKnBTZmJTY2xIY3IgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7CisgICAgY29uc3QgU0hPUlQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworCisgICAgcEJhayA9IHBIY3ItPnNlZ21lbnRJbmZvLnBUZW1wVmFsdWVzOworICAgIC8qIGRlaW50ZXJsZWF2ZSB1bml0d2lzZSBmb3Igc2hvcnQgYmxvY2tzICovCisgICAgZm9yICggd2luZG93ID0gMDsgd2luZG93IDwgKDgpOyB3aW5kb3crKyApIHsKKyAgICAgIHBPdXQgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICBmb3IgKCBpPTA7IGkgPCAoTElORVNfUEVSX1VOSVRfR1JPVVApOyBpKysgKSB7CisgICAgICAgIHBUZVZhID0gcEJhayArICh3aW5kb3cgPDwgRk9VUl9MT0dfRElWX1RXT19MT0cpICsgaSAqIDMyOwkvKiBkaXN0YW5jZSBvZiBsaW5lcyBiZXR3ZWVuIHVuaXQgZ3JvdXBzIGhhcyB0byBiZSBjb25zdGFudCBmb3IgZXZlcnkgZnJhbWVsZW5ndGggKDMyKSEgICovCisgICAgICAgIGZvciAoIGo9KExJTkVTX1BFUl9VTklUKTsgaiAhPSAwOyBqLS0gKSB7CisgICAgICAgICAgKnBPdXQrKyA9ICpwVGVWYSsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogc2hvcnQgYmxvY2tzIG9ubHkgKi8KKyAgICAvKiBkZXJpdmUgZ2xvYmFsIHNjYWxpbmctdmFsdWUgZm9yIGV2ZXJ5IHNmYiBhbmQgZXZlcnkgd2luZG93IChhcyBpdCBpcyBkb25lIGluIHBsYWluLWh1ZmZtYW4tZGVjb2RlciBhdCBzaG9ydCBibG9ja3MpICovCisgICAgZ3JvdXBvZmZzZXQgPSAwOworCisgICAgbnVtV2luR3JvdXAgPSBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICAgIG51bVNmYlRyYW5zbSA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBudW1XaW5Hcm91cDsgZ3JvdXArKykgeworICAgICAgd2luR3JvdXBMZW4gPSBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtU2ZiVHJhbnNtOyBiYW5kKyspIHsKKyAgICAgICAgaW50ZXJtID0gZ3JvdXAgKiAxNiArIGJhbmQ7CisgICAgICAgIG1zYiA9IHBTY2FsZUZhY0hjcltpbnRlcm1dID4+IDI7CisgICAgICAgIGxzYiA9IHBTY2FsZUZhY0hjcltpbnRlcm1dICYgMzsKKyAgICAgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgd2luR3JvdXBMZW47IGdyb3Vwd2luKyspIHsKKyAgICAgICAgICB3aW5kb3cgPSBncm91cG9mZnNldCArIGdyb3Vwd2luOworICAgICAgICAgIHBCYWsgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICAgICAgbG9jTWF4ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgZm9yIChpbmRleCA9IEJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IEJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4ICs9IExJTkVTX1BFUl9VTklUKSB7CisgICAgICAgICAgICBwVGVWYSA9ICZwQmFrW2luZGV4XTsKKyAgICAgICAgICAgIGZvciAoIGkgPSBMSU5FU19QRVJfVU5JVDsgaSAhPSAwOyBpIC0tKSB7CisgICAgICAgICAgICAgIHRtcCA9ICgqcFRlVmEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSk/IC0qcFRlVmErKyA6ICpwVGVWYSsrOworICAgICAgICAgICAgICBsb2NNYXggPSBmaXhNYXgodG1wLGxvY01heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICggZml4cF9hYnMobG9jTWF4KSA+IChGSVhQX0RCTClNQVhfUVVBTlRJWkVEX1ZBTFVFICkgeworICAgICAgICAgICAgbG9jTWF4ID0gKEZJWFBfREJMKU1BWF9RVUFOVElaRURfVkFMVUU7CisgICAgICAgICAgfQorICAgICAgICAgIHBTZmJTY2xIY3Jbd2luZG93KjE2K2JhbmRdID0gbXNiIC0gR2V0U2NhbGVGcm9tVmFsdWUobG9jTWF4LCBsc2IpOyAgLyogc2F2ZSBnbG9iYWwgc2NhbGUgbWF4aW1hIGluIHRoaXMgc2ZiICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdyb3Vwb2Zmc2V0ICs9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKKyAgICB9CisgIH0gZWxzZQorICB7CisgICAgLyogY29weSBzdHJhaWdodCBmb3IgbG9uZy1ibG9ja3MgKi8KKyAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgPSBTUEVDX0xPTkcocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgICAgZm9yICggaSA9IDEwMjQ7IGkgIT0gMDsgaS0tICkgeworICAgICAgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cysrID0gKnBCYWsrKzsKKyAgICB9CisgIH0KKworICBpZiAoIGxhdkVycm9yQ250ICE9IDAgKSB7CisgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTEFWX1ZJT0xBVElPTjsKKyAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcworICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBzZWN0aW9uIChudW1Db2Rld29yZEluU2VjdGlvbikgYW5kIHRoZSBudW1iZXIgb2YgY29kZXdvcmRzCisgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgc2VjdGlvbnMgKG51bUNvZGV3b3JkKS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIHplcm8gYW5kIGludGVuc2l0eSBjb2RlYm9va3MgYSBlbnRyeSBpcyBhbHNvIGRvbmUgaW4gdGhlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIG51bUNvZGV3b3JkSW5TZWN0aW9uLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGNvZGVib29rIGlzIGEgdHdvIHR1cGxlcworICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay4gVGhpcyBpcyBuZWVkZWQgbGF0ZXIgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgYmFzZSBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZW9yZGVyaW5nIG9mIHRoZSBxdWFudGl6ZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgaGNyIHRvb2wuCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBudW1Db2Rld29yZCBjb250YWluIHRoZSBudW1iZXIgb2YgY29kZXdvcmRzIHdoaWNoIGFyZSByZWFsbHkKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdHN0cmVhbS4gWmVybyBvciBpbnRlbnNpdHkgY29kZWJvb2tzIGRvZXMgbm90IGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBudW1Db2Rld29yZHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkKEhfSENSX0lORk8gcEhjcikKK3sKKyAgaW50ICAgICBoY3JTZWN0aW9uOworICBVSU5UICAgIG51bUNvZGV3b3JkOworCisgIFVJTlQgICAgbnVtU2VjdGlvbiAgICAgICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOworICBVQ0hBUiAgKnBDb2RlYm9vayAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucENvZGVib29rOworICBTSE9SVCAgKnBOdW1MaW5lSW5TZWN0aW9uICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7CisgIGNvbnN0IFVDSEFSICAqcENiRGltU2hpZnQgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQ7CisgIFVTSE9SVCAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247CisKKyAgbnVtQ29kZXdvcmQgPSAwOworICBmb3IgKCBoY3JTZWN0aW9uID0gbnVtU2VjdGlvbjsgaGNyU2VjdGlvbiAhPSAwOyBoY3JTZWN0aW9uLS0gKSB7CisgICAgKnBOdW1Db2Rld29yZEluU2VjdGlvbiA9ICpwTnVtTGluZUluU2VjdGlvbisrID4+IHBDYkRpbVNoaWZ0WypwQ29kZWJvb2tdOworICAgIGlmICggKnBDb2RlYm9vayAhPSAwICkgeworICAgICAgbnVtQ29kZXdvcmQgKz0gKnBOdW1Db2Rld29yZEluU2VjdGlvbjsKKyAgICB9CisgICAgcE51bUNvZGV3b3JkSW5TZWN0aW9uKys7CisgICAgcENvZGVib29rKys7CisgIH0KKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtQ29kZXdvcmQgPSBudW1Db2Rld29yZDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBvZiBzb3J0ZWQgY29kZWJvb2tzIGFuZCBzb3J0cyB0aGUgY29kZWJvb2tzIGFuZCB0aGUgbnVtQ29kZXdvcmRJblNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0eS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIEhjclNvcnRDb2RlYm9va0FuZE51bUNvZGV3b3JkSW5TZWN0aW9uKEhfSENSX0lORk8gcEhjcikKK3sKKworICBVSU5UICAgIGksaixrOworICBVQ0hBUiAgIHRlbXA7CisgIFVJTlQgICAgY291bnRlcjsKKyAgVUlOVCAgICBzdGFydE9mZnNldDsKKyAgVUlOVCAgICBudW1aZXJvU2VjdGlvbjsKKyAgVUNIQVIgICpwRGVzdDsKKyAgVUlOVCAgICBudW1TZWN0aW9uRGVjOworCisgIFVJTlQgICAgbnVtU2VjdGlvbiAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOworICBVQ0hBUiAgKnBDb2RlYm9vayAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucENvZGVib29rOworICBVQ0hBUiAgKnBTb3J0ZWRDb2RlYm9vayAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOworICBVU0hPUlQgKnBOdW1Db2Rld29yZEluU2VjdGlvbiAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUNvZGV3b3JkSW5TZWN0aW9uOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBVQ0hBUiAgKnBDb2RlYm9va1N3aXRjaCAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucENvZGVib29rU3dpdGNoOworICBVU0hPUlQgKnBSZW9yZGVyT2Zmc2V0ICAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucFJlb3JkZXJPZmZzZXQ7CisgIGNvbnN0IFVDSEFSICAgKnBDYlByaW9yaXR5ICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiUHJpb3JpdHk7CisgIGNvbnN0IFVDSEFSICAgKnBNaW5PZkNiUGFpciAgICAgICAgID0gICBwSGNyLT5jYlBhaXJzLnBNaW5PZkNiUGFpcjsKKyAgY29uc3QgVUNIQVIgICAqcE1heE9mQ2JQYWlyICAgICAgICAgPSAgIHBIY3ItPmNiUGFpcnMucE1heE9mQ2JQYWlyOworICBjb25zdCBVQ0hBUiAgICpwQ2JEaW1TaGlmdCAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbVNoaWZ0OworCisgIFVJTlQgc2VhcmNoU3RhcnQgPSAwOworCisgIC8qIGNhbGN1bGF0ZSAqcE51bVNvcnRlZFNlY3Rpb24gYW5kIHN0b3JlIHRoZSBwcmlvcml0aWVzIGluIGFycmF5IHBTb3J0ZWRDZGVib29rICovCisgIHBEZXN0ID0gcFNvcnRlZENvZGVib29rOworICBudW1aZXJvU2VjdGlvbiA9IDA7CisgIGZvciAoIGk9bnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0gKSB7CisgICAgaWYgKCBwQ2JQcmlvcml0eVsqcENvZGVib29rXSA9PSAwICkgeworICAgICAgbnVtWmVyb1NlY3Rpb24gKz0gMTsKKyAgICB9CisgICAgKnBEZXN0KysgPSBwQ2JQcmlvcml0eVsqcENvZGVib29rKytdOworICB9CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb24gPSBudW1TZWN0aW9uIC0gbnVtWmVyb1NlY3Rpb247ICAgIC8qIG51bVNvcnRlZFNlY3Rpb24gY29udGFpbnMgbm8gemVybyBvciBpbnRlbnNpdHkgc2VjdGlvbiAqLworICBwQ29kZWJvb2sgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CisKKyAgLyogc29ydCBwcmlvcml0aWVzIG9mIHRoZSBjb2RlYm9va3MgaW4gYXJyYXkgcFNvcnRlZENkZWJvb2tbXSAqLworICBudW1TZWN0aW9uRGVjID0gbnVtU2VjdGlvbiAtIDE7CisgIGlmICggbnVtU2VjdGlvbkRlYyA+IDAgKSB7CisgICAgY291bnRlciA9IG51bVNlY3Rpb25EZWM7CisgICAgZm9yICggaj1udW1TZWN0aW9uRGVjOyBqICE9IDA7IGotLSApIHsKKyAgICAgIGZvciAoIGk9MDsgaSA8IGNvdW50ZXI7IGkrKyApIHsKKyAgICAgICAgLyogc3dhcCBwcmlvcml0aWVzICovCisgICAgICAgIGlmICggcFNvcnRlZENvZGVib29rW2krMV0gPiBwU29ydGVkQ29kZWJvb2tbaV0gKSB7CisgICAgICAgICAgdGVtcCAgICAgICAgICAgICAgICAgPSBwU29ydGVkQ29kZWJvb2tbaV07CisgICAgICAgICAgcFNvcnRlZENvZGVib29rW2ldICAgPSBwU29ydGVkQ29kZWJvb2tbaSsxXTsKKyAgICAgICAgICBwU29ydGVkQ29kZWJvb2tbaSsxXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvdW50ZXIgLT0gMTsKKyAgICB9CisgIH0KKworICAvKiBjbGVhciBjb2RlYm9va1N3aXRjaCBhcnJheSAqLworICBmb3IgKCBpID0gbnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0pIHsKKyAgICAqcENvZGVib29rU3dpdGNoKysgPSAwOworICB9CisgIHBDb2RlYm9va1N3aXRjaCA9IHBIY3ItPnNlY3Rpb25JbmZvLnBDb2RlYm9va1N3aXRjaDsKKworICAvKiBzb3J0IHNlY3Rpb25Db2RlYm9va3MgYW5kIG51bUNvZHdvcmRzSW5TZWN0aW9uIGFuZCBjYWxjdWxhdGUgcFJlb3JkZXJPZmZzdFtqXSAqLworICBmb3IgKCBqID0gMDsgaiA8IG51bVNlY3Rpb247IGorKyApIHsKKyAgICBmb3IgKCBpID0gc2VhcmNoU3RhcnQ7IGkgPCBudW1TZWN0aW9uOyBpKysgKSB7CisgICAgICBpZiAoIHBDb2RlYm9va1N3aXRjaFtpXSA9PSAwICYmICggcE1pbk9mQ2JQYWlyW3BTb3J0ZWRDb2RlYm9va1tqXV0gPT0gcENvZGVib29rW2ldICB8fCAgcE1heE9mQ2JQYWlyW3BTb3J0ZWRDb2RlYm9va1tqXV0gPT0gcENvZGVib29rW2ldICkpIHsKKyAgICAgICAgcENvZGVib29rU3dpdGNoW2ldID0gMTsKKyAgICAgICAgcFNvcnRlZENvZGVib29rW2pdID0gcENvZGVib29rW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvcnQgY29kZWJvb2sgKi8KKyAgICAgICAgcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW2pdID0gcE51bUNvZGV3b3JkSW5TZWN0aW9uW2ldOyAgICAgIC8qIHNvcnQgTnVtQ29kZXdvcmRJblNlY3Rpb24gKi8KKworICAgICAgICBzdGFydE9mZnNldCA9IDA7CisgICAgICAgIGZvciAoIGsgPSAwOyBrIDwgaTsgaysrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGVudHJ5IGluIHBSZW9yZGVyT2Zmc3QgKi8KKyAgICAgICAgICBzdGFydE9mZnNldCArPSBwTnVtQ29kZXdvcmRJblNlY3Rpb25ba10gPDwgcENiRGltU2hpZnRbcENvZGVib29rW2tdXTsKKyAgICAgICAgfQorICAgICAgICBwUmVvcmRlck9mZnNldFtqXSA9IHN0YXJ0T2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZvciByZW9yZGVyaW5nIHRoZSBjb2Rld29yZHMgKi8KKworICAgICAgICBpZihpID09IHNlYXJjaFN0YXJ0KSB7CisgICAgICAgICAgVUlOVCBrID0gaTsKKyAgICAgICAgICB3aGlsZShwQ29kZWJvb2tTd2l0Y2hbaysrXSA9PSAxKSBzZWFyY2hTdGFydCsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc2VnbWVudGF0aW9uLCB3aGljaCBpbmNsdWRlcyBudW1TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICBsZWZ0U3RhcnRPZlNlZ21lbnQsIHJpZ2h0U3RhcnRPZlNlZ21lbnQgYW5kIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQuCisgICAgICAgICAgICAgICAgICAgIFRoZSBzZWdtZW50YXRpb24gY291bGQgYmUgdmlzdWFsaXplZCBhIGFzIGtpbmQgb2YgJ292ZXJsYXktZ3JpZCcgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0tYmxvY2sgaG9sZGluZyB0aGUgSENSLWVuY29kZWQgcXVhbnRpemVkLXNwZWN0cmFsLWNvZWZmaWNpZW50cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkKEhfSENSX0lORk8gcEhjcikKK3sKKyAgVVNIT1JUICAgaSxqOworICBVU0hPUlQgICBudW1TZWdtZW50ID0gMDsKKyAgVVNIT1JUICAgc2VnbWVudFN0YXJ0ID0gMDsKKyAgVUNIQVIgICAgc2VnbWVudFdpZHRoOworICBVQ0hBUiAgICBsYXN0U2VnbWVudFdpZHRoOworICBVQ0hBUiAgICBzb3J0ZWRDb2RlYm9vazsKKyAgVUNIQVIgICAgZW5kRmxhZyA9IDA7CisgIFVTSE9SVCAgIGludGVybWVkaWF0ZVJlc3VsdDsKKworICBTQ0hBUiAgICBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIFNIT1JUICAgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKKyAgVUlOVCAgICAgbnVtU29ydGVkU2VjdGlvbiAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb247CisgIFVDSEFSICAgKnBTb3J0ZWRDb2RlYm9vayAgICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7CisgIFVTSE9SVCAgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIFVTSE9SVCAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBVU0hPUlQgICpwUmlnaHRTdGFydE9mU2VnbWVudCAgICAgICAgICA9ICAgcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIFNDSEFSICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVVNIT1JUICAgYml0c3RyZWFtSW5kZXggICAgICAgICAgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUluZGV4OworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoICAgICAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBNYXhDd0xlbmd0aDsKKworICBmb3IgKCBpPW51bVNvcnRlZFNlY3Rpb247IGkgIT0gMDsgaS0tICkgeworICAgIHNvcnRlZENvZGVib29rID0gKnBTb3J0ZWRDb2RlYm9vaysrOworICAgIHNlZ21lbnRXaWR0aCA9IEZES21pbihwTWF4Q3dMZW5ndGhbc29ydGVkQ29kZWJvb2tdLGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKTsKKworICAgIGZvciAoIGogPSAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOyBqICE9IDAgOyBqLS0gKSB7CisgICAgICAvKiB3aWR0aCBhbGxvd3MgYSBuZXcgc2VnbWVudCAqLworICAgICAgaW50ZXJtZWRpYXRlUmVzdWx0ID0gYml0c3RyZWFtSW5kZXggKyBzZWdtZW50U3RhcnQ7CisgICAgICBpZiAoIChzZWdtZW50U3RhcnQgKyBzZWdtZW50V2lkdGgpIDw9IGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhICkgeworICAgICAgICAvKiBzdG9yZSBzZWdtZW50IHN0YXJ0LCBzZWdtZW50IGxlbmd0aCBhbmQgaW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgKi8KKyAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQrKyA9IGludGVybWVkaWF0ZVJlc3VsdDsKKyAgICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50KysgPSBpbnRlcm1lZGlhdGVSZXN1bHQgKyBzZWdtZW50V2lkdGggLSAxOworICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKyA9IHNlZ21lbnRXaWR0aDsKKyAgICAgICAgc2VnbWVudFN0YXJ0ICs9IHNlZ21lbnRXaWR0aDsKKyAgICAgICAgbnVtU2VnbWVudCArPSAxOworICAgICAgfQorICAgICAgLyogd2lkdGggZG9lcyBub3QgYWxsb3cgYSBuZXcgc2VnbWVudCAqLworICAgICAgZWxzZSB7CisgICAgICAgIC8qIGNvcnJlY3QgdGhlIGxhc3Qgc2VnbWVudCBsZW5ndGggKi8KKyAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudC0tOworICAgICAgICBwUmlnaHRTdGFydE9mU2VnbWVudC0tOworICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudC0tOworICAgICAgICBzZWdtZW50U3RhcnQgPSAqcExlZnRTdGFydE9mU2VnbWVudCAtIGJpdHN0cmVhbUluZGV4OworCisgICAgICAgIGxhc3RTZWdtZW50V2lkdGggPSBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAtIHNlZ21lbnRTdGFydDsKKyAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gbGFzdFNlZ21lbnRXaWR0aDsKKyAgICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gYml0c3RyZWFtSW5kZXggKyBzZWdtZW50U3RhcnQgKyBsYXN0U2VnbWVudFdpZHRoIC0gMTsKKyAgICAgICAgZW5kRmxhZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24rKzsKKyAgICBpZiAoZW5kRmxhZyAhPSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCA9IG51bVNlZ21lbnQ7CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGFkYXB0cyB0aGUgc29ydGVkIHNlY3Rpb24gYm91bmRhcmllcyB0byB0aGUgYm91bmRhcmllcyBvZgorICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb24uIElmIHRoZSBzZWN0aW9uIGxlbmd0aHMgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzZWdtZW50LCB0aGUgc2VjdGlvbiBpcyBzcGl0dGVkIGludG8gdHdvIHNvIGNhbGxlZCAnZXh0ZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnMnLiBUaGUgZXh0ZW5kZWQtc2VjdGlvbi1pbmZvIChwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluCisgICAgICAgICAgICAgICAgICAgIGFuZCBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vaykgaXMgdXBkYXRlZCBpbiB0aGlzIGNhc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIEhjckV4dGVuZGVkU2VjdGlvbkluZm8oSF9IQ1JfSU5GTyBwSGNyKQoreworICBVSU5UICAgIHNydFNlY0NudCA9IDA7ICAgICAgICAgLyogY291bnRlciBmb3Igc29ydGVkIHNlY3Rpb25zICovCisgIFVJTlQgICAgeFNydFNjQ250ID0gMDsgICAgICAgICAvKiBjb3VudGVyIGZvciBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgKi8KKyAgVUlOVCAgICByZW1haW5OdW1Dd0luU29ydFNlYzsKKyAgVUlOVCAgICBpblNlZ21lbnRSZW1haW5OdW1DVzsKKworICBVSU5UICAgIG51bVNvcnRlZFNlY3Rpb24gICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb247CisgIFVDSEFSICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgVUNIQVIgICpwRXh0ZW5kZWRTb3J0ZWRDb0JvICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICpwTnVtRXh0U29ydEN3SW5TZWN0ICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgVUlOVCAgICBudW1TZWdtZW50ICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50OworI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUworICBVQ0hBUiAgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7CisgIFNDSEFSICAgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgICAgID0gcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIGNvbnN0IFVDSEFSICAgKnBNYXhDd0xlbmd0aCAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBNYXhDd0xlbmd0aDsKKyNlbmRpZgorCisgIHJlbWFpbk51bUN3SW5Tb3J0U2VjID0gcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW3NydFNlY0NudF07CisgIGluU2VnbWVudFJlbWFpbk51bUNXID0gbnVtU2VnbWVudDsKKworICB3aGlsZSAoc3J0U2VjQ250IDwgbnVtU29ydGVkU2VjdGlvbikgeworICAgIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA8IHJlbWFpbk51bUN3SW5Tb3J0U2VjKSB7CisKKyAgICAgIHBOdW1FeHRTb3J0Q3dJblNlY3RbeFNydFNjQ250XSA9IGluU2VnbWVudFJlbWFpbk51bUNXOworICAgICAgcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdID0gcFNvcnRlZENvZGVib29rW3NydFNlY0NudF07CisKKyAgICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjIC09IGluU2VnbWVudFJlbWFpbk51bUNXOworICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OworICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBub3QgaW50ZWdyYXRlZCBpbiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiAqLworICAgIH0KKyAgICBlbHNlIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA9PSByZW1haW5OdW1Dd0luU29ydFNlYykgeworICAgICAgcE51bUV4dFNvcnRDd0luU2VjdFt4U3J0U2NDbnRdID0gaW5TZWdtZW50UmVtYWluTnVtQ1c7CisgICAgICBwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF0gPSBwU29ydGVkQ29kZWJvb2tbc3J0U2VjQ250XTsKKworICAgICAgc3J0U2VjQ250Kys7CisgICAgICByZW1haW5OdW1Dd0luU29ydFNlYyA9IHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltzcnRTZWNDbnRdOworICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OworICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uICovCisgICAgfQorICAgIGVsc2UgeyAvKiBpblNlZ21lbnRSZW1haW5OdW1DVyA+IHJlbWFpbk51bUN3SW5Tb3J0U2VjICovCisgICAgICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSByZW1haW5OdW1Dd0luU29ydFNlYzsKKyAgICAgIHBFeHRlbmRlZFNvcnRlZENvQm9beFNydFNjQ250XSA9IHBTb3J0ZWRDb2RlYm9va1tzcnRTZWNDbnRdOworCisKKyAgICAgIGluU2VnbWVudFJlbWFpbk51bUNXIC09IHJlbWFpbk51bUN3SW5Tb3J0U2VjOworICAgICAgc3J0U2VjQ250Kys7CisgICAgICByZW1haW5OdW1Dd0luU29ydFNlYyA9IHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltzcnRTZWNDbnRdOworICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uICovCisgICAgfQorI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUworICAgIHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbeFNydFNjQ250XSA9IEZES21pbihwTWF4Q3dMZW5ndGhbcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdXSxsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCk7CisjZW5kaWYKKworCisKKyAgICB4U3J0U2NDbnQgKz0gMTsKKworICAgIGlmICggeFNydFNjQ250ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgKSB7CisgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBFWFRFTkRFRF9TT1JURURfQ09VTlRFUl9PVkVSRkxPVzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgfQorICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSAwOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIGJlbG9uZyB0byB0aGUgc2V0cy4gRWFjaCBzZXQgZnJvbSBzZXQgMCAob25lIGFuZCBvbmx5IHNldCBmb3IgdGhlIFBDV3MpCisgICAgICAgICAgICAgICAgICAgIHRpbGwgdG8gdGhlIGxhc3Qgc2V0IGdldHMgYSBlbnRyeSBpbiB0aGUgYXJyYXkgdG8gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgJ3BOdW1FeHRlbmRlZFNvcnRlZFNlY3RpbnNJblNldHMnIHBvaW50cyB0by4KKworICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGlvbjogVGhlIGVudHJ5cyBpbiBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIGFyZSBhZGRlZAorICAgICAgICAgICAgICAgICAgICB1bnRpbGwgdGhlIHZhbHVlIG51bVNlZ21lbnQgaXMgcmVhY2hlZC4gVGhlbiB0aGUgc3VtX3ZhcmlhYmxlIGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBjYWxjdWxhdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLiBBcyBtdWNoIGV4dGVuZGVkIHNvcnRlZAorICAgICAgICAgICAgICAgICAgICBTZWN0aW9ucyBhcmUgc3VtbWVkIHVwIHRvIHJlYWNoIHRoZSB2YWx1ZSBudW1TZWdtZW50LCBhcyBtdWNoIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGVudHJ5IGluICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyhVSU5UICAgIG51bVNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpCit7CisgIFVTSE9SVCAgY291bnRlciA9IDA7CisgIFVJTlQgICAgY3dTdW0gICA9IDA7CisgIFVTSE9SVCAqcE51bUV4U29ydEN3SW5TZWMgICA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBVU0hPUlQgKnBOdW1FeFNvcnRTZWNJblNldHMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKKworICB3aGlsZSAocE51bUV4U29ydEN3SW5TZWNbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gIT0gMCkKKyAgeworICAgIGN3U3VtICs9IHBOdW1FeFNvcnRDd0luU2VjW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOworICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgrKzsKKyAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSAoTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY3dTdW0gPiBudW1TZWdtZW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNvdW50ZXIrKzsKKyAgICBpZiAoY291bnRlciA+IDEwMjQvNCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIGN3U3VtID09IG51bVNlZ21lbnQgKSB7CisgICAgICBwTnVtRXhTb3J0U2VjSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdID0gY291bnRlcjsKKyAgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgrKzsKKyAgICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID49IE1BWF9IQ1JfU0VUUykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjb3VudGVyID0gMDsKKyAgICAgIGN3U3VtID0gMDsKKyAgICB9CisgIH0KKyAgcE51bUV4U29ydFNlY0luU2V0c1tudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4XSA9IGNvdW50ZXI7ICAgLyogc2F2ZSBsYXN0IGVudHJ5IGZvciB0aGUgbGFzdCAtIHByb2JhYmx5IHNob3J0ZXIgLSBzZXQgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIHByaW9yaXR5IGNvZGV3b3JkcyAoUENXcykgaW4gYSBzcGVjdHJ1bSAod2l0aGluCisgICAgICAgICAgICAgICAgICAgIHNldCAwKS4gVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBQQ1dzIGlzIG1hbmFnZWQgaW4gdHdvIGxvb3BzLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgbG9vcGNvdW50ZXIgb2YgdGhlIG91dGVyIGxvb3AgaXMgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzIHBvaW50cyB0by4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdpdGhpbiBzZXQgMC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGxvb3Bjb3VudGVyIG9mIHRoZSBpbm5lciBsb29wIGlzIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIHBvaW50cyB0by4gVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlCisgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgY29kZXdvcmRzIGluIHNlY3Rpb25zICh0aGUgb3JpZ2luYWwgc2VjdGlvbnMgaGF2ZQorICAgICAgICAgICAgICAgICAgICBiZWVuIHNwbGl0dGVkIHRvIGdvIGFsb25nIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIHNldHMpLgorICAgICAgICAgICAgICAgICAgICBFYWNoIHRpbWUgdGhlIG51bWJlciBvZiB0aGUgZXh0ZW5kZWQgc29ydGVkIGNvZGV3b3JkcyBpbiBzZWN0aW9ucyBhcmUgZGUtCisgICAgICAgICAgICAgICAgICAgIGNvZGVkLCB0aGUgcG9pbnRlciAncE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbicgaXMgaW5jcmVtZW50ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgb25lLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIERlY29kZVBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikKK3sKKyAgVUlOVCAgICAgICAgIGk7CisgIFVTSE9SVCAgICAgICBleHRTb3J0U2VjOworICBVU0hPUlQgICAgICAgY3VyRXh0U29ydEN3SW5TZWM7CisgIFVDSEFSICAgICAgICBjb2RlYm9vazsKKyAgVUNIQVIgICAgICAgIGRpbWVuc2lvbjsKKyAgY29uc3QgVUlOVCAgKnBDdXJyZW50VHJlZTsKKyAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CisgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWw7CisKKyAgVVNIT1JUICAgICAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIGludCAgICAgICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgVUNIQVIgICAgICAgKnBFeHRlbmRlZFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIGludCAgICAgICAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIFVTSE9SVCAgICAgICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzOworICBpbnQgICAgICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCAgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBGSVhQX0RCTCAgICAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICAgPSBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgIGludCAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCAgICA9IHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBTQ0hBUiAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgVUNIQVIgICAgICAgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucE1heExlbk9mQ2JJbkV4dFNydFNlYzsKKyAgaW50ICAgICAgICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OworICBVQ0hBUiAgICAgICAgbWF4QWxsb3dlZEN3TGVuOworICBpbnQgICAgICAgICAgbnVtRGVjb2RlZEJpdHM7CisjZW5kaWYKKyAgY29uc3QgVUNIQVIgKnBDYkRpbWVuc2lvbiA9ICBwSGNyLT50YWJsZUluZm8ucENiRGltZW5zaW9uOworICBjb25zdCBVQ0hBUiAqcENiU2lnbiAgICAgID0gIHBIY3ItPnRhYmxlSW5mby5wQ2JTaWduOworCisgIC8qIGNsZWFyIHJlc3VsdCBhcnJheSAqLworICAvL3BRU0MgPSAmcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XTsKKyAgLy9wUVNDID0gKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50czsKKworICBGREttZW1jbGVhcihwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKKworICAvKiBkZWNvZGUgYWxsIFBDV3MgaW4gdGhlIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uKHMpIGJlbG9uZ2luZyB0byBzZXQgMCAqLworICBmb3IgKCBleHRTb3J0U2VjID0gcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07IGV4dFNvcnRTZWMgIT0gMDsgZXh0U29ydFNlYy0tICkgeworCisgICAgY29kZWJvb2sgICAgICAgID0gIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdOyAgIC8qIGdldCBjb2RlYm9vayBmb3IgdGhpcyBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiBhbmQgaW5jcmVtZW50IHB0ciB0byBjYiBvZiBuZXh0IGV4dC4gc29ydCBzZWMgKi8KKyAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4Kys7CisgICAgaWYgKGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGltZW5zaW9uICAgICAgID0gIHBDYkRpbWVuc2lvbltjb2RlYm9va107ICAgICAgICAgLyogZ2V0IGRpbWVuc2lvbiBvZiBjb2RlYm9vayBvZiB0aGlzIGV4dGVuZGVkIHNvcnQuIHNlYy4gKi8KKyAgICBwQ3VycmVudFRyZWUgICAgPSAgYUh1ZmZUYWJsZSAgW2NvZGVib29rXTsgICAgICAgICAvKiBjb252ZXJ0IGNvZGVib29rIHRvIHBvaW50ZXIgdG8gUVNDcyAqLworICAgIHBRdWFudFZhbEJhc2UgICA9ICBhUXVhbnRUYWJsZSBbY29kZWJvb2tdOyAgICAgICAgIC8qIGNvbnZlcnQgY29kZWJvb2sgdG8gaW5kZXggdG8gdGFibGUgb2YgUVNDcyAqLworI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUworICAgIG1heEFsbG93ZWRDd0xlbiA9IHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4XTsKKyAgICBtYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHgrKzsKKyAgICBpZiAobWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpKSB7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBzd2l0Y2ggZm9yIGRlY29kaW5nIHdpdGggZGlmZmVyZW50IGNvZGVib29rczogKi8KKyAgICBpZiAoIHBDYlNpZ25bY29kZWJvb2tdID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAvKiBubyBzaWduIGJpdHMgZm9sbG93IGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCisgICAgICAvKiBQQ1dfQm9keU9OTFkgKi8KKyAgICAgIC8qPT09PT09PT09PT09PT0qLworCisgICAgICBmb3IgKCBjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdIDsgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkgeworICAgICAgICBudW1EZWNvZGVkQml0cyA9IDA7CisKKyAgICAgICAgLyogZGVjb2RlIFBDV19CT0RZICovCisgICAgICAgIHBRdWFudFZhbCA9IERlY29kZVBDV19Cb2R5KGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgLyogcmVzdWx0IGlzIHdyaXR0ZW4gb3V0IGhlcmUgYmVjYXVzZSBOTyBzaWduIGJpdHMgZm9sbG93IHRoZSBib2R5ICovCisgICAgICAgIGZvciggaT1kaW1lbnNpb247IGkgIT0gMCA7IGktLSApIHsKKyAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0gKEZJWFBfREJMKSAqcFF1YW50VmFsKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHF1YW50LiBzcGVjLiBjb2VmLiBpbnRvIHNwZWN0cnVtOyBzaWduIGlzIGFscmVhZHkgdmFsaWQgKi8KKyAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOworICAgICAgICAgIGlmIChxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA+PSAxMDI0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogb25lIG1vcmUgUENXIHNob3VsZCBiZSBkZWNvZGVkICovCisKKyNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgICAgICAgaWYgKCBtYXhBbGxvd2VkQ3dMZW4gPCAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9PTkxZX1RPT19MT05HKSApIHsKKyAgICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBUT09fTUFOWV9QQ1dfQk9EWV9CSVRTX0RFQ09ERUQ7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCisgICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFkscEhjcixQQ1dfQk9EWSxwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtZGltZW5zaW9uLGRpbWVuc2lvbikpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVyAqLworICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoIHBDYlNpZ25bY29kZWJvb2tdID09IDEgKSAmJiAoIGNvZGVib29rIDwgMTEgKSkgeyAgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IDEsMiwzIG9yIDQgc2lnbiBiaXRzIGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCisgICAgICAvKiBQQ1dfQm9keSBhbmQgUENXX1NpZ24gKi8KKyAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgICBmb3IgKCBjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdIDsgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkKKyAgICAgIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgbnVtRGVjb2RlZEJpdHMgID0gMDsKKworICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRUcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGVyciA9IERlY29kZVBDV19TaWduKCBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIG9uZSBtb3JlIFBDVyBzaG91bGQgYmUgZGVjb2RlZCAqLworCisjaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCisgICAgICAgIGlmICggbWF4QWxsb3dlZEN3TGVuIDwgKG51bURlY29kZWRCaXRzICsgRVJST1JfUENXX0JPRFlfU0lHTl9UT09fTE9ORykgKSB7CisgICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfU0lHTl9CSVRTX0RFQ09ERUQ7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCisgICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFlfU0lHTixwSGNyLFBDV19CT0RZX1NJR04sIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cytxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeC1kaW1lbnNpb24sZGltZW5zaW9uKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQrKzsKKyAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKCBwQ2JTaWduW2NvZGVib29rXSA9PSAxICkgJiYgKCBjb2RlYm9vayA+PSAxMSApKSB7IC8qIHBvc3NpYmx5IHRoZXJlIGZvbGxvdyBzb21lIHNpZ24gYml0cyBhbmQgbWF5YmUgb25lIG9yIHR3byBlc2NhcGUgc2VxdWVuY2VzIGFmdGVyIHRoZSBjdy1ib2R5ICovCisgICAgICAvKiBQQ1dfQm9keSwgUENXX1NpZ24gYW5kIG1heWJlIFBDV19Fc2NhcGUgKi8KKyAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgICBmb3IgKCBjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdIDsgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkKKyAgICAgIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgbnVtRGVjb2RlZEJpdHMgID0gMDsKKworICAgICAgICAvKiBkZWNvZGUgUENXX0JPRFkgKi8KKyAgICAgICAgcFF1YW50VmFsID0gRGVjb2RlUENXX0JvZHkoYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBlcnIgPSBEZWNvZGVQQ1dfU2lnbiggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29kZSBQQ1dfRVNDQVBFIGlmIHByZXNlbnQgKi8KKyAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggLT0gRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSzsKKworICAgICAgICBpZiAoIGZpeHBfYWJzKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0pID09IChGSVhQX0RCTClFU0NBUEVfVkFMVUUgKSB7CisgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9IChGSVhQX0RCTCkgRGVjb2RlRXNjYXBlU2VxdWVuY2UoIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOworICAgICAgICBpZiAocXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPj0gMTAyNCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZml4cF9hYnMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKKyAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0gKEZJWFBfREJMKSBEZWNvZGVFc2NhcGVTZXF1ZW5jZSggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4Kys7CisgICAgICAgIGlmIChxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA+PSAxMDI0KSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogb25lIG1vcmUgUENXIHNob3VsZCBiZSBkZWNvZGVkICovCisKKyNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgICAgICAgaWYgKCBtYXhBbGxvd2VkQ3dMZW4gPCAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQ19UT09fTE9ORykgKSB7CisgICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfU0lHTl9FU0NfQklUU19ERUNPREVEOworICAgICAgICB9CisjZW5kaWYKKworI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQorICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LUVSUk9SX1BDV19CT0RZX1NJR05fRVNDLHBIY3IsUENXX0JPRFlfU0lHTl9FU0MscFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzK3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LURJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0ssRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSykpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50Kys7CisgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50Kys7CisgICAgICB9CisgICAgfQorCisgICAgLyogYWxsIFBDV3MgYmVsb25naW5nIHRvIHRoaXMgZXh0ZW5kZWQgc2VjdGlvbiBzaG91bGQgYmUgZGVjb2RlZCAqLworICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgrKzsKKyAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSBNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLyogYWxsIFBDV3Mgc2hvdWxkIGJlIGRlY29kZWQgKi8KKworICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7CisgIGlmIChudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID49IE1BWF9IQ1JfU0VUUykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFdyaXRlIGJhY2sgaW5kZXhlcyBpbnRvIHN0cnVjdHVyZSAqLworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA9IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPSBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHggPSBtYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHg7Cit9CisKKyNpZiBDSEVDS19TRUdNRU5UQVRJT05fSU1NRURJQVRFTFkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IGRlY29kZWQgUENXLCB3aGV0aGVyIG91dCBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBzZWdtZW50IHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQgb3Igbm90LiBJZiBhbiBlcnJvciBvY2N1cnJzLAorICAgICAgICAgICAgICAgICAgICBwcm9iYWJseSB0aGUgc2lkZWluZm8gb3IgdGhlIEhDUi1iaXRzdHJlYW0gYmxvY2sgaG9sZGluZyB0aGUgaHVmZm1hbgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgaXMgZGlzdG9ydGVkLiBJbiB0aGlzIGNhc2UgdGhlIHR3bworICAgICAgICAgICAgICAgICAgICBvciBmb3VyIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNvZGV3b3JkCisgICAgICAgICAgICAgICAgICAgIGFyZSBtYXJrZWQgKGZvciBiZWluZyBkZXRlY3RlZCBieSBjb25jZWFsbWVudCBsYXRlcikuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIFVDSEFSIGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbihTQ0hBUiAgICAgICByZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hDUl9JTkZPICBwSGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ1dfVFlQRSAgICBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpxc2NfYmFzZV9vZl9jdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgZGltZW5zaW9uKQoreworICBTQ0hBUiBpOworICBpZiAoIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwICkgeworICAgIC8qIGxvZyB0aGUgZXJyb3IgKi8KKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIFBDV19CT0RZOgorICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQ1dfQk9EWV9TSUdOOgorICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBDV19CT0RZX1NJR05fRVNDOgorICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOX0VTQzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIG1hcmsgdGhlIGVycmVkIGxpbmVzICovCisgICAgZm9yICggaSA9IGRpbWVuc2lvbjsgaSAhPSAwOyBpLS0gKSB7CisgICAgICAqcXNjX2Jhc2Vfb2ZfY3crKyA9IChGSVhQX0RCTCkgUV9WQUxVRV9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0ZJTkFMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbGwgc2VnbWVudHMgYXJlIGVtcHR5IGFmdGVyIGRlY29kaW5nLiBUaGVyZQorICAgICAgICAgICAgICAgICAgICBhcmUgX25vIGxpbmVzIG1hcmtkZWRfIGFzIGludmFsaWQgYmVjYXVzZSBpdCBjb3VsZCBub3QgYmUgdHJhY2VkIGJhY2sKKyAgICAgICAgICAgICAgICAgICAgd2hlcmUgZnJvbSB0aGUgcmVtYWluaW5nIGJpdHMgYXJlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKEhfSENSX0lORk8gcEhjcikKK3sKKyAgVUNIQVIgICBzZWdtZW50YXRpb25FcnJvckZsYWcgICA9IDA7CisgIFVTSE9SVCAgaTsKKyAgU0NIQVIgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVSU5UICAgIG51bVNlZ21lbnQgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudDsKKworICBmb3IgKCBpPW51bVNlZ21lbnQ7IGkgIT0gMCA7IGktLSkgeworICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKyAhPSAwKSB7CisgICAgICBzZWdtZW50YXRpb25FcnJvckZsYWcgPSAxOworICAgIH0KKyAgfQorICBpZiAoc2VnbWVudGF0aW9uRXJyb3JGbGFnID09IDEpIHsKKyAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBCSVRfSU5fU0VHTUVOVEFUSU9OX0VSUk9SOworICB9Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiB3YWxrcyBvbmUgc3RlcCB3aXRoaW4gdGhlIGRlY29kaW5nIHRyZWUuIFdoaWNoIGJyYW5jaCBpcworICAgICAgICAgICAgICAgICAgICB0YWtlbiBkZXBlbmRzIG9uIHRoZSBkZWNvZGVkIGNhcnJ5Qml0IGlucHV0IHBhcmFtZXRlci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoVUNIQVIgIGNhcnJ5Qml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICB0cmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAqYnJhbmNoVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmJyYW5jaE5vZGUpCit7CisgIGlmIChjYXJyeUJpdCA9PSAwKSB7CisgICAgKmJyYW5jaE5vZGUgPSAodHJlZU5vZGUgJiBNQVNLX0xFRlQpID4+IExFRlRfT0ZGU0VUOyAvKiBNQVNLX0xFRlQ6ICAwMEZGRjAwMCAqLworICB9CisgIGVsc2UgeworICAgICpicmFuY2hOb2RlID0gdHJlZU5vZGUgJiBNQVNLX1JJR0hUOyAgICAgICAgICAgICAgICAgLyogTUFTS19SSUdIVDogMDAwMDBGRkYgKi8KKyAgfQorCisgICpicmFuY2hWYWx1ZSA9ICpicmFuY2hOb2RlICYgQ0xSX0JJVF8xMDsgICAgICAgICAgICAgICAvKiBjbGVhciBiaXQgMTAgKGlmIHNldCkgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBEZWNvZGVzIHRoZSBib2R5IG9mIGEgcHJpb3JpdHkgY29kZXdvcmQgKFBDVykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAtIHJldHVybiB2YWx1ZSBpcyBwb2ludGVyIHRvIGZpcnN0IG9mIHR3byBvciBmb3VyIHF1YW50aXplZCBzcGVjdHJhbAorICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgKnBDdXJyZW50VHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFVDSEFSIGNhcnJ5Qml0OworICBVSU5UICBicmFuY2hOb2RlOworICBVSU5UICB0cmVlTm9kZTsKKyAgVUlOVCAgYnJhbmNoVmFsdWU7CisgIGNvbnN0ICBTQ0hBUiAqcFF1YW50VmFsOworCisgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLworICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLworCisgIC8qIGRlY29kZSB3aG9sZSBQQ1ctY29kZXdvcmQtYm9keSAqLworICB3aGlsZSAoMSkgeworCisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAgLyogZHVtbXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CisgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CisgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOworCisgICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisKKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gY29kZXdvcmQtYm9keSBpcyBjb21wbGV0ZSAqLworICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgUENXLUJvZHkgaXMgZGVjb2RlZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgfQorCisgIH0KKworICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIHRvIHZhbGlkIGZpcnN0IG9mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzICovCisKKyAgcmV0dXJuIHBRdWFudFZhbDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgb25lIGVzY2FwZSBzZXF1ZW5jZS4gSW4gY2FzZSBvZiBhIGVzY2FwZSBjb2RlYm9vaworICAgICAgICAgICAgICAgICAgICBhbmQgaW4gY2FzZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZSA9PSAxNiwKKyAgICAgICAgICAgICAgICAgICAgYSBlc2NhcGVTZXF1ZW5jZSBpcyBkZWNvZGVkIGluIHR3byBzdGVwczoKKyAgICAgICAgICAgICAgICAgICAgICAxLiBlc2NhcGUgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgMi4gZXNjYXBlIHdvcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBJTlQgIERlY29kZUVzY2FwZVNlcXVlbmNlKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNDb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgVUlOVCAgaTsKKyAgSU5UICAgc2lnbjsKKyAgVUlOVCAgZXNjYXBlT25lc0NvdW50ZXIgPSAwOworICBVSU5UICBjYXJyeUJpdDsKKyAgSU5UICAgZXNjYXBlX3dvcmQgPSAwOworCisgIC8qIGRlY29kZSBlc2NhcGUgcHJlZml4ICovCisgIHdoaWxlICgxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKKyAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLT0gMTsKKyAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CisKKyAgICBpZiAoY2FycnlCaXQgIT0gMCkgeworICAgICAgZXNjYXBlT25lc0NvdW50ZXIgKz0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBlc2NhcGVPbmVzQ291bnRlciArPSA0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogZGVjb2RlIGVzY2FwZSB3b3JkICovCisgIGZvciggaT1lc2NhcGVPbmVzQ291bnRlcjsgaSAhPSAwIDsgaS0tICkgeworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgICAgICAgICAgICAgICAgLyogZHVtbXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CisgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CisgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOworCisgICAgZXNjYXBlX3dvcmQgPDw9IDE7CisgICAgZXNjYXBlX3dvcmQgPSBlc2NhcGVfd29yZCB8IGNhcnJ5Qml0OworICB9CisKKyAgc2lnbiA9IChxdWFudFNwZWNDb2VmID49IDApID8gMSA6IC0xOworCisgIHF1YW50U3BlY0NvZWYgPSBzaWduICogKCgoSU5UICkgMSA8PCBlc2NhcGVPbmVzQ291bnRlcikgKyBlc2NhcGVfd29yZCk7CisKKyAgcmV0dXJuIHF1YW50U3BlY0NvZWY7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgRGVjb2RlcyB0aGUgU2lnbmJpdHMgb2YgYSBwcmlvcml0eSBjb2Rld29yZCAoUENXKSBhbmQgd3JpdGVzIG91dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgaW50byB1bnNvcnRlZCBzZWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgb3V0cHV0OiAgIC0gdHdvIG9yIGZvdXIgbGluZXMgYXQgcG9zaXRpb24gaW4gY29ycmVzcG9uZGluZyBzZWN0aW9uICh3aGljaCBhcmUgbm90CisgICAgICAgICAgICAgICAgICAgIGxvY2F0ZWQgYXQgdGhlIGRlc2lyZWQgcG9zaXRpb24sIGkuZS4gdGhleSBtdXN0IGJlIHJlb3JkZXJlZCBpbiB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICBvZiBlaWdodCBmdW5jdGlvbiBvZiBIQ1IpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgLSB1cGRhdGVkIHBRdWFudFNwZWNDb2VmIHBvaW50ZXIgKHRvIG5leHQgZW1wdHkgc3RvcmFnZSBmb3IgYSBsaW5lKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgRGVjb2RlUENXX1NpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgY29kZWJvb2tEaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICpwUXVhbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICpwUXVhbnRTcGVjQ29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnF1YW50U3BlY0NvZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFVJTlQgICAgIGk7CisgIFVJTlQgICAgIGNhcnJ5Qml0OworICBJTlQgICAgICBxdWFudFNwZWNDb2VmOworCisgIGZvciggaT1jb2RlYm9va0RpbTsgaSAhPSAwIDsgaS0tICkgeworICAgIHF1YW50U3BlY0NvZWYgPSAqcFF1YW50VmFsKys7CisgICAgaWYgKHF1YW50U3BlY0NvZWYgIT0gMCkgeworICAgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgICAgLyogZHVtbXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKKyAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtPSAxOworICAgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOworICAgICAgaWYgKCpwUmVtYWluaW5nQml0c0luU2VnbWVudCA8IDAgfHwgKnBOdW1EZWNvZGVkQml0cyA+PSAoMTAyND4+MSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvKiBhZGFwdCBzaWduIG9mIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGRlY29kZWQgc2lnbiBiaXQgKi8KKyAgICAgIGlmIChjYXJyeUJpdCAhPSAwKSB7CisgICAgICAgIHBRdWFudFNwZWNDb2VmWypxdWFudFNwZWNDb2VmSWR4XSA9IC0oRklYUF9EQkwpcXVhbnRTcGVjQ29lZjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSAgKEZJWFBfREJMKXF1YW50U3BlY0NvZWY7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgcFF1YW50U3BlY0NvZWZbKnF1YW50U3BlY0NvZWZJZHhdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfQorICAgICpxdWFudFNwZWNDb2VmSWR4ICs9IDEgOworICAgIGlmICgqcXVhbnRTcGVjQ29lZklkeCA+PSAxMDI0KSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIE11dGVzIHNwZWN0cmFsIGxpbmVzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgZXJyb25lb3VzIChRX1ZBTFVFX0lOVkFMSUQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBIY3JNdXRlRXJyb25lb3VzTGluZXMoSF9IQ1JfSU5GTyBoSGNyKQoreworICBpbnQgYzsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBMb25nID0gU1BFQ19MT05HKGhIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOworCisgIC8qIGlmIHRoZXJlIGlzIGEgbGluZSB3aXRoIHZhbHVlIFFfVkFMVUVfSU5WQUxJRCBtdXRlIGl0ICovCisgIGZvciAoYyA9IDA7IGMgPCAxMDI0OyBjKyspIHsKKyAgICBpZiAocExvbmdbY10gPT0gKEZJWFBfREJMKVFfVkFMVUVfSU5WQUxJRCkgeworI2lmIEhDUl9MSVNURU5fVE9fTVVURURfTElORVMKKyAgICAgIHBMb25nW2NdID0gKEZJWFBfREJMKUhDUl9ESVJBQzsgICAvKiBtYXJraW5nICovCisjZWxzZQorICAgICAgcExvbmdbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgIC8qIG11dGluZyAqLworI2VuZGlmCisgICAgfQorICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246ICAgU2V0cyBnbG9iYWwgSENSIHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIHNldEhjclR5cGUoSF9IQ1JfSU5GTyBoSGNyLCBNUDRfRUxFTUVOVF9JRCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIElEX1NDRToKKyAgICAgIGhIY3ItPmdsb2JhbEhjclR5cGUgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJRF9DUEU6CisgICAgICBoSGNyLT5nbG9iYWxIY3JUeXBlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIEdldHMgSENSIHR5cGUgZnJvbSB0aGUgSENSIGRhdGEgc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgLSBnbG9iYWwgSENSIHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitJTlQgZ2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IpCit7CisgIHJldHVybiBoSGNyLT5nbG9iYWxIY3JUeXBlOworfQorCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmggYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjNTI3YgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3IuaApAQCAtMCwwICsxLDEyNiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyYXRpb247IGNvbW1vbiBkZWZpbmVzCisgICAgICAgICAgICAgICAgYW5kIHN0cnVjdHVyZXM7IGRlZmluZXMgZm9yIHN3aXRjaGluZyBlcnJvci1nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgLWRldGVjdG9yLCBhbmQgLWNvbmNlYWxtZW50CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FBQ0RFQ19IQ1JfSF8KKyNkZWZpbmUgX0FBQ0RFQ19IQ1JfSF8KKworCisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKwordm9pZCAgSGNySW5pdFJvbSAoSF9IQ1JfSU5GTyBoSGNyKTsKK1VJTlQgSGNySW5pdChIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAorICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpOworVUlOVCAgSGNyRGVjb2RlciAoSF9IQ1JfSU5GTyBoSGNyLAorICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwordm9pZCAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKAorICAgICAgICBVQ0hBUiAgY2FycnlCaXQsCisgICAgICAgIFVJTlQgICB0cmVlTm9kZSwKKyAgICAgICAgVUlOVCAgKmJyYW5jaFZhbHVlLAorICAgICAgICBVSU5UICAqYnJhbmNoTm9kZQorICAgICAgICApOworCit2b2lkICBDSGNyX1JlYWQgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwordm9pZCAgSGNyTXV0ZUVycm9uZW91c0xpbmVzKEhfSENSX0lORk8gaEhjcik7CisKK3ZvaWQgIHNldEhjclR5cGUoSF9IQ1JfSU5GTyBoSGNyLCBNUDRfRUxFTUVOVF9JRCB0eXBlKTsKK0lOVCAgIGdldEhjclR5cGUoSF9IQ1JfSU5GTyBoSGNyKTsKKworCisKKyNlbmRpZiAvKiBfQUFDREVDX0hDUl9IXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKyAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogQml0c3RyZWFtIHJlYWRpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgZGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIHRvZ2dsZXMgdGhlIHJlYWQgZGlyZWN0aW9uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaW5wdXQ6ICAgICAgICBjdXJyZW50IHJlYWQgZGlyZWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgICAgIG5ldyByZWFkIGRpcmVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK1VDSEFSIFRvZ2dsZVJlYWREaXJlY3Rpb24oVUNIQVIgcmVhZERpcmVjdGlvbikKK3sKKyAgaWYgKCByZWFkRGlyZWN0aW9uID09IEZST01fTEVGVF9UT19SSUdIVCApIHsKKyAgICByZXR1cm4gRlJPTV9SSUdIVF9UT19MRUZUOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBGUk9NX0xFRlRfVE9fUklHSFQ7CisgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBiaXQgZnJvbSB0aGUgYml0c3RyZWFtIGFjY29yZGluZyB0byByZWFkIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQgKHJ1bnRpbWUpLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaW5wdXQ6ICAgIC0gaGFuZGxlIHRvIEZESyBiaXRzdHJlYW0KKyAgICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG1hcmtpbmcgc3RhcnQgb2YgYml0ZmllbGQKKyAgICAgICAgICAgICAgICAgIC0gcExlZnRTdGFydE9mU2VnbWVudAorICAgICAgICAgICAgICAgICAgLSBwUmlnaHRTdGFydE9mU2VnbWVudAorICAgICAgICAgICAgICAgICAgLSByZWFkRGlyZWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgLSBiaXQgZnJvbSBiaXRzdHJlYW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitVSU5UIEhjckdldEFCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pCit7CisgIFVJTlQgICBiaXQ7CisgIElOVCAgICByZWFkQml0T2Zmc2V0OworCisgIGlmIChyZWFkRGlyZWN0aW9uID09IEZST01fTEVGVF9UT19SSUdIVCkgeworICAgIHJlYWRCaXRPZmZzZXQgPSAqcExlZnRTdGFydE9mU2VnbWVudC1GREtnZXRCaXRDbnQoYnMpOworICAgIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIHJlYWRCaXRPZmZzZXQpOworICAgIH0KKworICAgIGJpdCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKworICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50ICs9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgcmVhZEJpdE9mZnNldCA9ICpwUmlnaHRTdGFydE9mU2VnbWVudC1GREtnZXRCaXRDbnQoYnMpOworICAgIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIHJlYWRCaXRPZmZzZXQpOworICAgIH0KKworICAgIC8qIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBicm90aGVyIGZ1bmN0aW9uIG9mIEZES3JlYWRCaXRzKCkgKi8KKyAgICBiaXQgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgRkRLcHVzaEJhY2soYnMsIDIpOworCisgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50IC09IDE7CisgIH0KKworCisjaWYgRVJST1JfR0VORVJBVE9SX0JJVF9TVFJFQU1fSENSCisgIHN0YXRpYyBpbnQgYTsKKyAgaWYgKCgrK2EgJSBNT0RVTE9fRElWSVNPUl9IQ1IpID09IDApIHsKKyAgICBiaXQgPSAoYml0ID09IDApID8gMSA6IDA7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiAoYml0KTsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuaCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfYml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5NGZmMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfYml0LmgKQEAgLTAsMCArMSwxMDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKyAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogQml0c3RyZWFtIHJlYWRpbmcgcHJvdG90eXBlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9BQUNERUNfSENSX0JJVF9IXworI2RlZmluZSBfQUFDREVDX0hDUl9CSVRfSF8KKworCisKKyNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCisKK1VDSEFSIFRvZ2dsZVJlYWREaXJlY3Rpb24oVUNIQVIgcmVhZERpcmVjdGlvbik7CisKK1VJTlQgIEhjckdldEFCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOworCisKKyNlbmRpZiAvKiBfQUFDREVDX0hDUl9CSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfdHlwZXMuaCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNlYzRlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl90eXBlcy5oCkBAIC0wLDAgKzEsMzY2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IENvbW1vbiBkZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzOyBkZWZpbmVzIGZvcgorICAgICAgICAgICAgICAgIHN3aXRjaGluZyBlcnJvci1nZW5lcmF0b3IsIC1kZXRlY3RvciwgYW5kIC1jb25jZWFsbWVudDsKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQUFDREVDX0hDUl9UWVBFU19IXworI2RlZmluZSBfQUFDREVDX0hDUl9UWVBFU19IXworCisKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJvdmVybGFwYWRkLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgIExJTkVTX1BFUl9VTklUICAgICAgICAgICAgICAgIDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tIGJhc2ljIEhDUiBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLSAqLworCisKKyAjZGVmaW5lICBNQVhfU0ZCX0hDUiAgICAgICAgICAgICAgICAgKCgoMTAyNC84KSAvIExJTkVTX1BFUl9VTklUKSAqIDgpICAvKiAoOCAqIDE2KSBpcyBub3QgZW5vdWdoIGJlY2F1c2Ugc2ZicyBhcmUgc3BsaXQgaW4gdW5pdHMgZm9yIGJsb2NrdHlwZSBzaG9ydCAqLworICNkZWZpbmUgIE5VTUJFUl9PRl9VTklUX0dST1VQUyAgICAgICAoTElORVNfUEVSX1VOSVQgKiA4KQorICNkZWZpbmUgIExJTkVTX1BFUl9VTklUX0dST1VQICAgICAgICAoMTAyNCAvIE5VTUJFUl9PRl9VTklUX0dST1VQUykgICAgIC8qIDE1IDE2IDMwIDMyICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBGUk9NX0xFRlRfVE9fUklHSFQgICAgICAgICAgICAwCisjZGVmaW5lICBGUk9NX1JJR0hUX1RPX0xFRlQgICAgICAgICAgICAxCisKKyNkZWZpbmUgIE1BWF9DQl9QQUlSUyAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lICBNQVhfSENSX1NFVFMgICAgICAgICAgICAgICAgICAxNAorCisjZGVmaW5lICBFU0NBUEVfVkFMVUUgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSAgUE9TSVRJT05fT0ZfRkxBR19BICAgICAgICAgICAgMjEKKyNkZWZpbmUgIFBPU0lUSU9OX09GX0ZMQUdfQiAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgIE1BWF9DQiAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAvKiBsYXN0IHVzZWQgQ0IgaXMgY2IgIzMxIHdoZW4gVkNCMTEgaXMgdXNlZCAqLworCisjZGVmaW5lICBNQVhfQ0JfQ0hFQ0sgICAgICAgICAgICAgICAgICAzMiAgICAgLyogc3VwcG9ydCBmb3IgVkNCMTEgYXZhaWxhYmxlIC0tIGlzIG1vcmUgZ2VuZXJhbCwgY291bGQgdGhlcmVmb3JlIHVzZWQgaW4gYm90aCBjYXNlcyAqLworCisjZGVmaW5lICBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgICAgICAgICAzMgorCisvKiBsb2cgKi8KKyNkZWZpbmUgIFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cgICAgIDUKKyNkZWZpbmUgIEVJR0hUX0xPR19ESVZfVFdPX0xPRyAgICAgICAgIDMKKyNkZWZpbmUgIEZPVVJfTE9HX0RJVl9UV09fTE9HICAgICAgICAgIDIKKworLyogYm9yZGVycyAqLworI2RlZmluZSAgQ1BFX1RPUF9MRU5HVEggICAgICAgICAgICAgICAgMTIyODgKKyNkZWZpbmUgIFNDRV9UT1BfTEVOR1RIICAgICAgICAgICAgICAgIDYxNDQKKyNkZWZpbmUgIExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEggIDQ5CisKKy8qIHFzYydzIG9mIGhpZ2ggbGV2ZWwgKi8KKyNkZWZpbmUgIFFfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgICAgIDgxOTIgICAvKiBtYXJrIGEgaW52YWxpZCBsaW5lIHdpdGggdGhpcyB2YWx1ZSAodG8gYmUgY29uY2VhbGVkIGxhdGVyIG9uKSAqLworI2RlZmluZSAgSENSX0RJUkFDICAgICAgICAgICAgICAgICAgICAgNTAwICAgIC8qIGEgbGluZSBvZiBoaWdoIGxldmVsICovCisKKy8qIG1hc2tzICovCisjZGVmaW5lICBNQVNLX0xFRlQgICAgICAgICAgICAgICAgICAgICAweEZGRjAwMAorI2RlZmluZSAgTUFTS19SSUdIVCAgICAgICAgICAgICAgICAgICAgMHhGRkYKKyNkZWZpbmUgIENMUl9CSVRfMTAgICAgICAgICAgICAgICAgICAgIDB4M0ZGCisjZGVmaW5lICBURVNUX0JJVF8xMCAgICAgICAgICAgICAgICAgICAweDQwMAorCisjZGVmaW5lICBMRUZUX09GRlNFVCAgICAgICAgICAgICAgICAgICAxMgorCisvKiB3aGVuIHNldCBIQ1IgaXMgcmVwbGFjZWQgYnkgYSBkdW1teS1tb2R1bGUgd2hpY2gganVzdCBmaWxscyB0aGUgb3V0cHV0YnVmZmVyIHdpdGggYSBkaXJhYyBzZXF1ZW5jZSAqLworLyogdXNlIHRoaXMgaWYgSENSIGlzIHN1c3BlY3RlZCB0byB3cml0ZSBpbiBvdGhlciBtb2R1bGVzIC0tIGlmIGVycm9yIGlzIHN0ZWxsIHRoZXJlLCBIQ1IgaXMgaW5ub2NlbnQgKi8KKyNkZWZpbmUgVVNFX0hDUl9EVU1NWSAgICAgICAgICAgICAgICAgICAgIDAKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0gICAgaW5zZXJ0IEhDUiBlcnJvcnMgICAgICAgLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogbW9kaWZ5IGlucHV0IGxlbmd0aHMgLS0gaGlnaCBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUgRVJST1JfTE9SU0QgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIG9mZnNldDogZXJyb3IgaWYgZGlmZmVyZW50IGZyb20gemVybyAqLworI2RlZmluZSBFUlJPUl9MT0xDICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogb2Zmc2V0OiBlcnJvciBpZiBkaWZmZXJlbnQgZnJvbSB6ZXJvICovCisKKyAgLyogc2VnbWVudHMgYXJlIGVhcmxpZXIgZW1wdHkgYXMgZXhwZWN0ZWQgd2hlbiBkZWNvZGluZyBQQ1dzICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZICAgICAgICAgICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR04gICAgICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCisKKyAgLyogcHJldGVuZCB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChlbmxhcmdlIGxlbmd0aCBvZiBjb2Rld29yZCkgYXQgUENXcyAtLSB1c2UgYSBwb3NpdGl2ZSB2YWx1ZSAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9PTkxZX1RPT19MT05HICAgICAgMCAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR05fVE9PX0xPTkcgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9FU0NfVE9PX0xPTkcgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAqLworCisgIC8qIG1vZGlmeSBIQ1IgYml0c3RyZWFtIGJsb2NrICovCisjZGVmaW5lIEVSUk9SX0dFTkVSQVRPUl9CSVRfU1RSRUFNX0hDUiAgICAwICAvKiBtb2RpZnkgZXZlcnkgPE1PRFVMT19ESVZJU09SX0hDUj4tYml0IHdoZW4gcmVhZGluZyBmcm9tIGJpdHN0cmVhbSAqLyAvKiAhISEgQkVXQVJFISEhIGlmIFJWTEMgaXMgYWN0aXZlLCBhbHNvIFJWTEMgZGF0YSBhdCBFU0MyIHdpbGwgYmUgbW9kaWZpZWQgISEhICovCisjZGVmaW5lIE1PRFVMT19ESVZJU09SX0hDUiAgICAgICAgICAgICAgIDMwCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtICAgIGRldGVjdCBIQ1IgZXJyb3JzICAgICAgIC0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBjaGVjayBpbnB1dCBkYXRhICovCisjZGVmaW5lIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAgICAgICAgICAgICAxICAvKiBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgaW5wdXQgZGF0YSAqLworCisgIC8qIGR1cmluZyBkZWNvZGluZyAqLworI2RlZmluZSBDSEVDS19TRUdNRU5UQVRJT05fSU1NRURJQVRFTFkgICAgMSAgLyogdGhlIDIgb3IgNCBsaW5lcyBvZiBhIGRldGVjdGVkIFBDVy1kZWNvZGluZy1lcnJvciBpcyBtYXJrZWQgKi8KKworI2RlZmluZSBDSEVDS19TRUdNRU5UQVRJT05fRklOQUwgICAgICAgICAgMSAgLyogYWxsIHRoZSBzZWdtZW50cyBhcmUgY2hlY2tlZCAtLSB0aGVyZWZvcmUgLS0gaWYgdGhpcyBjaGVjayBwYXNzZXMsIGl0cyBhIGtpbmQgb2YgZXZpZGVuY2UgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgUENXcyBhbmQgbm9uLVBDV3MgYXJlIGZpbmUgKi8KKworI2RlZmluZSBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMgICAgICAgICAgMSAgLyogaWYgYSBjb2Rld29yZCBpcyBkZWNvZGVkIHRoZXJlIGV4aXN0cyBhIGJvcmRlciBmb3IgdGhlIG51bWJlciBvZiBiaXRzLCB3aGljaCBhcmUgYWxsb3dlZCB0byByZWFkIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZC4gVGhpcyBib3JkZXIgaXMgdGhlIG1pbmltdW0gb2YgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBjb2Rld29yZCAoZm9yIHRoZSBjdXJyZW50bHkgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWJvb2spIGFuZCB0aGUgc2VwYXJhdGVseSB0cmFuc21pdHRlZCAnbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQnIGluIHRoaXMgZnJhbWUgYW5kIGNoYW5uZWwuIFRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGRlY29kZWQgYml0cyBpcyBjb3VudGVkIChmb3IgUENXcyBvbmx5IC0tIHRoZXJlIGl0IG1ha2VzIHJlYWxseSBzZW5zZSBpbiBteSBvcGluaW9uKS4gSWYgdGhpcyBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VlZHMgdGhlIGJvcmRlciAoZGVyaXZlZCBhcyBtaW5pbXVtIC0tIHNlZSBhYm92ZSksIGEgZXJyb3IgaXMgZGV0ZWN0ZWQuICovCisKKyNkZWZpbmUgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSyAgICAgICAgIDEgIC8qIHRlc3QgaWYgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYml0cyBpbiBhIHNlZ21lbnQgaXMgX2JlbG93XyB6ZXJvLiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzIHRoZSBsb3dlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgdmFsdWUgZm9yIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgaXMgemVyby4gVGhpcyBjaGVjayBhbHNvIGNvdWxkIGJlIHNldCB0byB6ZXJvIChzYXZlIHJ1bnRpbWUpICovCisgIC8qIG90aGVyICovCisjZGVmaW5lIFZBTElEX0xBVl9FUlJPUl9UUklHR0VSICAgICAgICAgICAxICAvKiB3aGVuIHNldCB0byAnMScsIGF2b2lkIHNldHRpbmcgdGhlIExBVi1GbGFnIGluIGVycm9yTG9nIGR1ZSB0byBhIHByZXZpb3VzLWxpbmUtbWFya2luZyAoYXQgUENXIGRlY29kZXIpLiBBIGxpdHRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBydW50aW1lIGlzIG5lZWRlZCB0aGVuIHdoZW4gd3JpdGluZyB2YWx1ZXMgb3V0IGludG8gb3V0cHV0LWJ1ZmZlci4gKi8KKworI2RlZmluZSBIQ1JfTElTVEVOX1RPX01VVEVEX0xJTkVTICAgICAgICAgMCAgLyogbGlzdGVuIHRvIHRoZSAiZXJyb3ItY29uY2VhbG1lbnQiIGZvciB0ZXN0aW5nICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLSAgICBjb25jZWFsIEhDUiBlcnJvcnMgICAgICAtICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBIQ1JfRVJST1JfQ09OQ0VBTE1FTlQgICAgICAgICAgICAgMSAgLyogaWYgc2V0IHRvICcxJywgSENSIF9tdXRlc18gdGhlIGVycmVkIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxvZzogQSB3b3JkIG9mIDMyIGJpdHMgdXNlZCBmb3IgbG9nZ2luZyBwb3NzaWJsZSBlcnJvcnMgd2l0aGluIEhDUgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGRpc3RvcnRlZCBiaXRzdHJlYW1zLiBUYWJsZSBvZiBhbGwga25vd24gZXJyb3JzOgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCAgZmF0YWwgIGxvY2F0aW9uICAgIG1lYW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWSAgICAgICAgICAgMHg4MDAwMDAwMCAvLyAgMzEgICBubyAgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXIGRlY29kaW5nIGl0IGlzIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgUENXIGlmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGltbWVkaWF0ZSBjaGVjaykuCisjZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR04gICAgICAweDQwMDAwMDAwIC8vICAzMCAgIG5vICAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1cgZGVjb2RpbmcgaXQgaXMgY2hlY2tlZCBhZnRlciBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlIGNoZWNrKS4KKyNkZWZpbmUgU0VHTUVOVF9PVkVSUklERV9FUlJfUENXX0JPRFlfU0lHTl9FU0MgIDB4MjAwMDAwMDAgLy8gIDI5ICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyIGV2ZXJ5IFBDVyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChpbW1lZGlhdGUgY2hlY2spLgorI2RlZmluZSBFWFRFTkRFRF9TT1JURURfQ09VTlRFUl9PVkVSRkxPVyAgICAgICAgMHgxMDAwMDAwMCAvLyAgMjggICB5ZXMgICBJbml0LURlYyAgICBFcnJvciBkdXJpbmcgZXh0ZW5kaW5nIHNpZGVpbmZvIChuZWl0aGVyIGEgUENXIG5vciBhIG5vblBDVyB3YXMgZGVjb2RlZCBzbyBmYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDA4MDAwMDAwIC8vICAyNyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDA0MDAwMDAwIC8vICAyNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAyMDAwMDAwIC8vICAyNSAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAxMDAwMDAwIC8vICAyNCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwODAwMDAwIC8vICAyMyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwNDAwMDAwIC8vICAyMiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMjAwMDAwIC8vICAyMSAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMTAwMDAwIC8vICAyMCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsIGVycm9ycyAqLworI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9CSVRTX0RFQ09ERUQgICAgICAgICAgMHgwMDA4MDAwMCAvLyAgMTkgICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktZGVjb2RpbmcgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZCBmcm9tIGJpdHN0cmVhbSAtLSBhZHZpY2U6IHNraXAgbm9uLVBDVyBkZWNvZGluZworI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9TSUdOX0JJVFNfREVDT0RFRCAgICAgMHgwMDA0MDAwMCAvLyAgMTggICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktc2lnbi1kZWNvZGluZyB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXIGRlY29kaW5nCisjZGVmaW5lIFRPT19NQU5ZX1BDV19CT0RZX1NJR05fRVNDX0JJVFNfREVDT0RFRCAweDAwMDIwMDAwIC8vICAxNyAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1zaWduLWVzYy1kZWNvZGluZyB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXIGRlY29kaW5nCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAxMDAwMCAvLyAgMTYgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX09OTFkgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMCAvLyAgMTUgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAgIDB4MDAwMDQwMDAgLy8gIDE0ICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAgICAweDAwMDAyMDAwIC8vICAxMyAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19CT0RZICAgICAgICAgMHgwMDAwMTAwMCAvLyAgMTIgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAgIDB4MDAwMDA4MDAgLy8gIDExICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggICAweDAwMDAwNDAwIC8vICAxMCAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19FU0NfV09SRCAgICAgMHgwMDAwMDIwMCAvLyAgIDkgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgSENSX1NJX0xFTkdUSFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgLy8gICA4ICAgeWVzICAgSW5pdC1EZWMgICAgTGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgbXVzdCBub3QgYmUgbGVzcyB0aGFuIGxlbmdodE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhCisjZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyAgICAgICAweDAwMDAwMDgwIC8vICAgNyAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAoc2hvcnQgYmxvY2spCisjZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLICAgICAgICAweDAwMDAwMDQwIC8vICAgNiAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAobG9uZyBibG9jaykKKyNkZWZpbmUgTElORV9JTl9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyAgIDB4MDAwMDAwMjAgLy8gICA1ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIG51bWJlciBvZiBsaW5lcyBwZXIgc2VjdGlvbiBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChzaG9ydCBibG9jaykKKyNkZWZpbmUgQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLICAgICAgICAgICAgIDB4MDAwMDAwMTAgLy8gICA0ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIGNvZGVib29rIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKHNob3J0IGJsb2NrKQorI2RlZmluZSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgICAgMHgwMDAwMDAwOCAvLyAgIDMgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBzZWN0aW9uIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKGxvbmcgYmxvY2spCisjZGVmaW5lIENCX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLICAgICAgICAgICAgICAweDAwMDAwMDA0IC8vICAgMiAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBjb2RlYm9vayBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChsb25nIGJsb2NrKQorI2RlZmluZSBMQVZfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvLyAgIDEgICBubyAgICBGaW5hbCAgICAgICBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgYXQgbGVhc3Qgb25lIGRlY29kZWQgbGluZSB3YXMgdG9vIGhpZ2ggZm9yIHRoZSBhY2NvcmRpbmcgY29kZWJvb2suCisjZGVmaW5lIEJJVF9JTl9TRUdNRU5UQVRJT05fRVJST1IgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8vICAgMCAgIG5vICAgIEZpbmFsICAgICAgIEFmdGVyIFBDVyBhbmQgbm9uLVBXQy1kZWNvZGluZyBhdCBsZWFzdCBvbmUgc2VnbWVudCBpcyBub3QgemVybyAoZ2xvYmFsIGNoZWNrKS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLSovCisjZGVmaW5lIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAweDEwMEUwMUZDCisKKwordHlwZWRlZiBlbnVtIHsKKyAgUENXX0JPRFksCisgIFBDV19CT0RZX1NJR04sCisgIFBDV19CT0RZX1NJR05fRVNDCit9IFBDV19UWVBFOworCisKKy8qIGludGVyZmFjZSBEZWNvZGVyIDwtLS0+IEhDUiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UICAgICAgICAgIGVycm9yTG9nOworICBTUEVDVFJBTF9QVFIgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2U7CisgIGludCAgICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CisgIFNIT1JUICAgICAgICAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CisgIFNIT1JUICAgICAgICAgbnVtU2VjdGlvbjsKKyAgU0hPUlQgICAgICAgICpwTnVtTGluZUluU2VjdDsKKyAgVVNIT1JUICAgICAgICBiaXRzdHJlYW1JbmRleDsKKyAgU0NIQVIgICAgICAgICBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKKyAgVUNIQVIgICAgICAgICpwQ29kZWJvb2s7Cit9IEhDUl9JTlBVVF9PVVRQVVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgVUNIQVIgKnBNaW5PZkNiUGFpcjsKKyAgY29uc3QgVUNIQVIgKnBNYXhPZkNiUGFpcjsKK30gSENSX0NCX1BBSVJTOworCit0eXBlZGVmIHN0cnVjdHsKKyAgY29uc3QgVVNIT1JUICpwTGFyZ2VzdEFic1ZhbDsKKyAgY29uc3QgVUNIQVIgICpwTWF4Q3dMZW5ndGg7CisgIGNvbnN0IFVDSEFSICAqcENiRGltZW5zaW9uOworICBjb25zdCBVQ0hBUiAgKnBDYkRpbVNoaWZ0OworICBjb25zdCBVQ0hBUiAgKnBDYlNpZ247CisgIGNvbnN0IFVDSEFSICAqcENiUHJpb3JpdHk7Cit9IEhDUl9UQUJMRV9JTkZPOworCit0eXBlZGVmIHN0cnVjdHsKKyAgVUlOVCAgICAgIG51bVNlZ21lbnQ7CisgIFVJTlQgICAgICBwU2VnbWVudEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKKyAgVUlOVCAgICAgIHBDb2Rld29yZEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKKyAgVUlOVCAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIEZJWFBfREJMICBwVGVtcFZhbHVlc1sxMDI0XTsKKyAgVVNIT1JUICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnRbMTAyND4+MV07CisgIFVTSE9SVCAgICBwUmlnaHRTdGFydE9mU2VnbWVudFsxMDI0Pj4xXTsKKyAgU0NIQVIgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50WzEwMjQ+PjFdOworICBVQ0hBUiAgICAgcmVhZERpcmVjdGlvbjsKKyAgVUNIQVIgICAgIG51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVVNIT1JUICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7Cit9IEhDUl9TRUdNRU5UX0lORk87CisKK3R5cGVkZWYgc3RydWN0eworCisgIFVJTlQgICAgbnVtQ29kZXdvcmQ7CisgIFVJTlQgICAgbnVtU29ydGVkU2VjdGlvbjsKKyAgVVNIT1JUICBwTnVtQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1JdOworICBVU0hPUlQgIHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltNQVhfU0ZCX0hDUl07CisgIFVTSE9SVCAgcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTXTsKKyAgaW50ICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OworICBVU0hPUlQgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW01BWF9IQ1JfU0VUU107CisgIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgVVNIT1JUICBwUmVvcmRlck9mZnNldFtNQVhfU0ZCX0hDUl07CisgIFVDSEFSICAgcFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSXTsKKworICBVQ0hBUiAgIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSK01BWF9IQ1JfU0VUU107CisgIGludCAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKKyNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgVUNIQVIgICBwTWF4TGVuT2ZDYkluRXh0U3J0U2VjW01BWF9TRkJfSENSK01BWF9IQ1JfU0VUU107CisgIGludCAgICAgbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OworI2VuZGlmCisgIFVDSEFSICAgcENvZGVib29rU3dpdGNoW01BWF9TRkJfSENSXTsKK30gSENSX1NFQ1RJT05fSU5GTzsKKwordHlwZWRlZiBVSU5UICgqU1RBVEVGVU5DKShIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworCit0eXBlZGVmIHN0cnVjdHsKKyAgLyogd29yc3QtY2FzZSBhbmQgMTAyNC80IG5vbi1QQ1dzIGV4aXN0IGluIHdvcnN0LWNhc2UgKi8KKyAgRklYUF9EQkwgICpwUmVzdWx0QmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3MgZm9yIHNwZWN0cmFsIGRhdGEgb3V0cHV0IHRhcmdldCBidWZmZXIgKi8KKyAgVUlOVCAgICAgICBpTm9kZVsxMDI0Pj4yXTsgICAgICAgICAgIC8qIEhlbHBlciBpbmRpY2VzIGZvciBjb2RlIGJvb2tzICovCisgIFVTSE9SVCAgICAgaVJlc3VsdFBvaW50ZXJbMTAyND4+Ml07ICAvKiBIZWxwZXIgaW5kaWNlcyBmb3IgYWNjZXNzaW5nIHBSZXN1bHRCYXNlICovCisgIFVJTlQgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1sxMDI0Pj4yXTsKKyAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgU1RBVEVGVU5DICBwU3RhdGU7CisgIFVDSEFSICAgICAgcENvZGVib29rWzEwMjQ+PjJdOworICBVQ0hBUiAgICAgIHBDbnRTaWduWzEwMjQ+PjJdOworICAvKiB0aGlzIGFycmF5IGhvbGRzIHRoZSBzdGF0ZXMgY29kZWQgYXMgaW50ZWdlciB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbMCwxLC4uLDddICovCisgIFNDSEFSICAgICAgcFN0YVsxMDI0Pj4yXTsKK30gSENSX05PTl9QQ1dfU0lERUlORk87CisKK3R5cGVkZWYgc3RydWN0eworICBIQ1JfSU5QVVRfT1VUUFVUICAgICAgZGVjSW5PdXQ7CisgIEhDUl9DQl9QQUlSUyAgICAgICAgICBjYlBhaXJzOworICBIQ1JfVEFCTEVfSU5GTyAgICAgICAgdGFibGVJbmZvOworICBIQ1JfU0VHTUVOVF9JTkZPICAgICAgc2VnbWVudEluZm87CisgIEhDUl9TRUNUSU9OX0lORk8gICAgICBzZWN0aW9uSW5mbzsKKyAgSENSX05PTl9QQ1dfU0lERUlORk8gIG5vblBjd1NpZGVpbmZvOworCisgIElOVCAgICAgICAgICAgICAgICAgICBnbG9iYWxIY3JUeXBlOworfSBDRXJIY3JJbmZvOworCisKK3R5cGVkZWYgIENFckhjckluZm8gICpIX0hDUl9JTkZPOworCisKKyNlbmRpZiAvKiBfQUFDREVDX0hDUl9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjIxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5jcHAKQEAgLTAsMCArMSwxNDA5IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IFByZXBhcmUgZGVjb2Rpbmcgb2Ygbm9uLVBDV3MsIHNlZ21lbnRhdGlvbi0gYW5kCisgICAgICAgICAgICAgICAgYml0ZmllbGQtaGFuZGxpbmcsIEhDUi1TdGF0ZW1hY2hpbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY19oY3JzLmgiCisKKworI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKworI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorI2luY2x1ZGUgImFhY19yYW0uaCIKKworCitzdGF0aWMgVUlOVCBJbml0U2VnbWVudEJpdGZpZWxkKFVJTlQgICAqcE51bVNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAqcFNlZ21lbnRCaXRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICpwTnVtV29yZEZvckJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOworCitzdGF0aWMgdm9pZCBJbml0Tm9uUENXU2lkZUluZm9ybWF0aW9uRm9yQ3VycmVudFNldChIX0hDUl9JTkZPIHBIY3IpOworCitzdGF0aWMgSU5UIE1vZHVsb1ZhbHVlKElOVCBpbnB1dCwgSU5UIGJ1ZmZlcmxlbmd0aCk7CisKK3N0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKnBCaXRmaWVsZCk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBhbGwgbm9uLXByaW9yaXR5IGNvZGV3b3JkcyAobm9uLVBDV3MpIGJ5IHVzaW5nIGEKKyAgICAgICAgICAgICAgICAgIHN0YXRlLW1hY2hpbmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCAgRGVjb2RlTm9uUENXcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSF9IQ1JfSU5GTyBwSGNyKQoreworICBVSU5UICAgIG51bVZhbGlkU2VnbWVudDsKKyAgSU5UICAgICBzZWdtZW50T2Zmc2V0OworICBJTlQgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZTsKKyAgSU5UICAgICBjb2Rld29yZE9mZnNldDsKKyAgVUlOVCAgICB0cmlhbDsKKworICBVSU5UICAgKnBOdW1TZWdtZW50OworICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVDSEFSICAqcE51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVVNIT1JUICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkOworICBVSU5UICAgKnBDb2Rld29yZEJpdGZpZWxkOworICBJTlQgICAgIGJpdGZpZWxkV29yZDsKKyAgSU5UICAgICBiaXRJbldvcmQ7CisgIFVJTlQgICAgdGVtcFdvcmQ7CisgIFVJTlQgICAgaW50ZXJNZWRpYXRlV29yZDsKKyAgSU5UICAgICB0ZW1wQml0OworICBJTlQgICAgIGNhcnJ5OworCisgIFVJTlQgICAgbnVtQ29kZXdvcmQ7CisgIFVDSEFSICAgbnVtU2V0OworICBVQ0hBUiAgIGN1cnJlbnRTZXQ7CisgIFVJTlQgICAgY29kZXdvcmRJblNldDsKKyAgVUlOVCAgICByZW1haW5pbmdDb2Rld29yZHNJblNldDsKKyAgU0NIQVIgICpwU3RhOworICBVSU5UICAgIHJldDsKKworICBwTnVtU2VnbWVudCAgICAgICAgICAgICA9ICYocEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCk7CisgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gICBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgPSAgIHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBOdW1Xb3JkRm9yQml0ZmllbGQgICAgID0gJihwSGNyLT5zZWdtZW50SW5mby5udW1Xb3JkRm9yQml0ZmllbGQpOworICBwTnVtQml0VmFsaWRJbkxhc3RXb3JkICA9ICYocEhjci0+c2VnbWVudEluZm8ucE51bUJpdFZhbGlkSW5MYXN0V29yZCk7CisgIHBTdGEgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworCisgIG51bVZhbGlkU2VnbWVudCA9IEluaXRTZWdtZW50Qml0ZmllbGQocE51bVNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtV29yZEZvckJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOworCisgIGlmICggbnVtVmFsaWRTZWdtZW50ICE9IDAgKSB7CisgICAgbnVtQ29kZXdvcmQgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1Db2Rld29yZDsKKyAgICBudW1TZXQgPSAoKG51bUNvZGV3b3JkIC0gMSkgLyAqcE51bVNlZ21lbnQpICsgMTsKKworCisgICAgcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbiA9IEZST01fUklHSFRfVE9fTEVGVDsKKworICAgIC8qIFByb2Nlc3Mgc2V0cyBzdWJzZXF1ZW50bHkgKi8KKyAgICBmb3IgKCBjdXJyZW50U2V0ID0gMTsgY3VycmVudFNldCA8IG51bVNldCA7IGN1cnJlbnRTZXQrKyApIHsKKworCisKKyAgICAgIC8qIHN0ZXAgMSAqLworICAgICAgbnVtQ29kZXdvcmQgLT0gKnBOdW1TZWdtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVtYWluaW5nIG5vbiBQQ1dzIFtmb3IgYWxsIHNldHNdICovCisgICAgICBpZiAoIG51bUNvZGV3b3JkIDwgKnBOdW1TZWdtZW50ICkgeworICAgICAgICBjb2Rld29yZEluU2V0ID0gbnVtQ29kZXdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgbGFzdCBzZXQgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb2Rld29yZEluU2V0ID0gKnBOdW1TZWdtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYWxsIHNldHMgZXhjZXB0IGxhc3Qgc2V0ICovCisgICAgICB9CisKKyAgICAgIC8qIHN0ZXAgMiAqLworICAgICAgLyogcHJlcGFyZSBhcnJheSAnQ29kZXdvcmRCaXRmaWVsZCc7IGFzIG11Y2ggb25lcyBhcmUgd3JpdHRlbiBmcm9tIGxlZnQgaW4gYWxsIHdvcmRzLCBhcyBtdWNoIGRlY29kZWRDb2Rld29yZEluU2V0Q291bnRlciBub25QQ1dzIGV4aXN0IGluIHRoaXMgc2V0ICovCisgICAgICB0ZW1wV29yZCA9IDB4RkZGRkZGRkY7CisgICAgICBwQ29kZXdvcmRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOworCisgICAgICBmb3IgKCBiaXRmaWVsZFdvcmQgPSAqcE51bVdvcmRGb3JCaXRmaWVsZDsgYml0ZmllbGRXb3JkICE9MDsgYml0ZmllbGRXb3JkLS0gKSB7IC8qIGxvb3Agb3ZlciBhbGwgdXNlZCB3b3JkcyAqLworICAgICAgICBpZiAoIGNvZGV3b3JkSW5TZXQgPiBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgKSB7ICAgICAgICAvKiBtb3JlIGNvZGV3b3JkcyB0aGFuIG51bWJlciBvZiBiaXRzID0+IGZpbGwgb25lcyAqLworICAgICAgICAgIC8qIGZpbGwgYSB3aG9sZSB3b3JkIHdpdGggb25lcyAqLworICAgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZCsrID0gdGVtcFdvcmQ7CisgICAgICAgICAgY29kZXdvcmRJblNldCAtPSBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7ICAgICAgICAgICAgIC8qIHN1YnRyYWN0IG51bWJlciBvZiBiaXRzICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogcHJlcGFyZSBsYXN0IHRlbXBXb3JkICovCisgICAgICAgICAgZm9yIChyZW1haW5pbmdDb2Rld29yZHNJblNldCA9IGNvZGV3b3JkSW5TZXQ7IHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0IDwgTlVNQkVSX09GX0JJVF9JTl9XT1JEIDsgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQrKyApIHsKKyAgICAgICAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLXJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0KSk7IC8qIHNldCBhIHplcm8gYXQgYml0IG51bWJlciAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtaSkgaW4gdGVtcFdvcmQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgKnBDb2Rld29yZEJpdGZpZWxkKysgPSB0ZW1wV29yZDsKKyAgICAgICAgICB0ZW1wV29yZCA9IDB4MDAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisKKyAgICAgIC8qIHN0ZXAgMyAqLworICAgICAgLyogYnVpbGQgbm9uLVBDVyBzaWRlaW5mbyBmb3IgZWFjaCBub24tUENXIG9mIHRoZSBjdXJyZW50IHNldCAqLworICAgICAgSW5pdE5vblBDV1NpZGVJbmZvcm1hdGlvbkZvckN1cnJlbnRTZXQocEhjcik7CisKKyAgICAgIC8qIHN0ZXAgNCAqLworICAgICAgLyogZGVjb2RlIGFsbCBub24tUENXcyBiZWxvbmdpbmcgdG8gdGhpcyBzZXQgKi8KKworICAgICAgLyogbG9vcCBvdmVyIHRyaWFscyAqLworICAgICAgY29kZXdvcmRPZmZzZXRCYXNlID0gMDsKKyAgICAgIGZvciAoIHRyaWFsID0gKnBOdW1TZWdtZW50OyB0cmlhbCA+IDA7IHRyaWFsLS0gKSB7CisKKyAgICAgICAgLyogbG9vcCBvdmVyIG51bWJlciBvZiB3b3JkcyBpbiBiaXRmaWVsZHMgKi8KKyAgICAgICAgc2VnbWVudE9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgemVybyBpbiBldmVyeSBzZWdtZW50ICovCisgICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OyAgICAgICAgIC8qIHN0b3JlIGluIHN0cnVjdHVyZSBmb3Igc3RhdGVzICovCisgICAgICAgIGNvZGV3b3JkT2Zmc2V0ID0gY29kZXdvcmRPZmZzZXRCYXNlOworICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldCA9IGNvZGV3b3JkT2Zmc2V0OyAgICAvKiBzdG9yZSBpbiBzdHJ1Y3R1cmUgZm9yIHN0YXRlcyAqLworCisgICAgICAgIGZvciAoIGJpdGZpZWxkV29yZD0wOyBiaXRmaWVsZFdvcmQgPCAqcE51bVdvcmRGb3JCaXRmaWVsZDsgYml0ZmllbGRXb3JkKysgKSB7CisKKyAgICAgICAgICAvKiBkZXJpdmUgdGVtcFdvcmQgd2l0aCBiaXR3aXNlIGFuZCAqLworICAgICAgICAgIHRlbXBXb3JkID0gcFNlZ21lbnRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdICYgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkXTsKKworICAgICAgICAgIC8qIGlmIHRlbXBXb3JkIGlzIG5vdCB6ZXJvLCBkZWNvZGUgc29tZXRoaW5nICovCisgICAgICAgICAgaWYgKCB0ZW1wV29yZCAhPSAwICkgeworCisKKyAgICAgICAgICAgIC8qIGxvb3Agb3ZlciBhbGwgYml0cyBpbiB0ZW1wV29yZDsgc3RhcnQgc3RhdGUgbWFjaGluZSBpZiAmIGlzIHRydWUgKi8KKyAgICAgICAgICAgIGZvciAoIGJpdEluV29yZCA9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgYml0SW5Xb3JkID4gMDsgYml0SW5Xb3JkLS0gKSB7CisKKyAgICAgICAgICAgICAgaW50ZXJNZWRpYXRlV29yZCA9ICgoVUlOVCkxIDw8IChiaXRJbldvcmQtMSkgKTsKKyAgICAgICAgICAgICAgaWYgKCAoIHRlbXBXb3JkICYgaW50ZXJNZWRpYXRlV29yZCApID09IGludGVyTWVkaWF0ZVdvcmQgKSB7CisKKyAgICAgICAgICAgICAgICAvKiBnZXQgc3RhdGUgYW5kIHN0YXJ0IHN0YXRlIG1hY2hpbmUgKi8KKyAgICAgICAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07CisKKyAgICAgICAgICAgICAgICB3aGlsZShwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgIHJldCA9ICgoU1RBVEVGVU5DKSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpKGJzLCBwSGNyKTsKKyNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCisgICAgICAgICAgICAgICAgICBpZiAoIHJldCAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB1cGRhdGUgYm90aCBvZmZzZXRzICovCisgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIHRpbWVzIG9uZSAqLworICAgICAgICAgICAgICBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0ID0gc2VnbWVudE9mZnNldDsKKyAgICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgdGltZXMgb25lICovCisgICAgICAgICAgICAgIGNvZGV3b3JkT2Zmc2V0ID0gTW9kdWxvVmFsdWUoY29kZXdvcmRPZmZzZXQsKnBOdW1TZWdtZW50KTsgICAgICAvKiBpbmRleCBvZiB0aGUgY3VycmVudCBjb2Rld29yZCBsaWVzIHdpdGhpbiBtb2R1bG8gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPSBjb2Rld29yZE9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZWdtZW50T2Zmc2V0ICs9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIGF0IG9uY2UgKi8KKyAgICAgICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OworICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgKz0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCBhdCBvbmNlICovCisgICAgICAgICAgICBjb2Rld29yZE9mZnNldCA9IE1vZHVsb1ZhbHVlKGNvZGV3b3JkT2Zmc2V0LCpwTnVtU2VnbWVudCk7ICAgICAgICAvKiBpbmRleCBvZiB0aGUgY3VycmVudCBjb2Rld29yZCBsaWVzIHdpdGhpbiBtb2R1bG8gcmFuZ2UgKi8KKyAgICAgICAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0ID0gY29kZXdvcmRPZmZzZXQ7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGVuZCBvZiBiaXRmaWVsZCB3b3JkIGxvb3AgKi8KKworICAgICAgICAvKiBkZWNyZW1lbnQgY29kZXdvcmQgLSBwb2ludGVyICovCisgICAgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZSAtPSAxOworICAgICAgICBjb2Rld29yZE9mZnNldEJhc2UgPSBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldEJhc2UsKnBOdW1TZWdtZW50KTsgICAgLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgY29kZXdvcmQgYmFzZSBsaWVzIHdpdGhpbiBtb2R1bG8gcmFuZ2UgKi8KKworICAgICAgICAvKiByb3RhdGUgbnVtU2VnbWVudCBiaXRzIGluIGNvZGV3b3JkQml0ZmllbGQgKi8KKyAgICAgICAgLyogcm90YXRpb24gb2YgKm51bVNlZ21lbnQgYml0cyBpbiBiaXRmaWVsZCBvZiBjb2Rld29yZHMgKGNpcmNsZS1yb3RhdGlvbikgKi8KKyAgICAgICAgLyogZ2V0IGxhc3QgdmFsaWQgYml0ICovCisgICAgICAgIHRlbXBCaXQgPSBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSAmICgxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkpOworICAgICAgICB0ZW1wQml0ID0gdGVtcEJpdCA+PiAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOworCisgICAgICAgIC8qIHdyaXRlIHplcm8gaW50byBwbGFjZSB3aGVyZSB0ZW1wQml0IHdhcyBmZXRjaGVkIGZyb20gKi8KKyAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gPSBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSAmIH4oMSA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpKTsKKworICAgICAgICAvKiByb3RhdGUgbGFzdCB2YWxpZCB3b3JkICovCisgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkLTFdID0gcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gPj4gMTsKKworICAgICAgICAvKiB0cmFuc2ZhcmUgY2FycnkgYml0IDAgZnJvbSBjdXJyZW50IHdvcmQgaW50byBiaXRwb3NpdGlvbiAzMSBmcm9tIG5leHQgd29yZCBhbmQgcm90YXRlIGN1cnJlbnQgd29yZCAqLworICAgICAgICBmb3IgKCBiaXRmaWVsZFdvcmQgPSAqcE51bVdvcmRGb3JCaXRmaWVsZC0yOyBiaXRmaWVsZFdvcmQgPiAtMSA7IGJpdGZpZWxkV29yZC0tICkgeworICAgICAgICAgIC8qIGdldCBjYXJyeSAoPWJpdCBhdCBwb3NpdGlvbiAwKSBmcm9tIGN1cnJlbnQgd29yZCAqLworICAgICAgICAgIGNhcnJ5ID0gcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkXSAmIDE7CisKKyAgICAgICAgICAvKiBwdXQgdGhlIGNhcnJ5IGJpdCBhdCBwb3NpdGlvbiAzMSBpbnRvIHdvcmQgcmlnaHQgZnJvbSBjdXJyZW50IHdvcmQgKi8KKyAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmQrMV0gPSBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmQrMV0gfCAoY2FycnkgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xKSk7CisKKyAgICAgICAgICAvKiBzaGlmdCBjdXJyZW50IHdvcmQgKi8KKyAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID0gcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkXSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgLyogcHV0IHRlbXBCaXQgaW50byBmcmVlIGJpdC1wb3NpdGlvbiAzMSBmcm9tIGZpcnN0IHdvcmQgKi8KKyAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbMF0gPSBwQ29kZXdvcmRCaXRmaWVsZFswXSB8ICh0ZW1wQml0IDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMSkpOworCisgICAgICB9IC8qIGVuZCBvZiB0cmlhbCBsb29wICovCisKKyAgICAgIC8qIHRvZ2dsZSByZWFkIGRpcmVjdGlvbiAqLworICAgICAgcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbiA9IFRvZ2dsZVJlYWREaXJlY3Rpb24ocEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbik7CisKKyAgICB9CisgICAgLyogZW5kIG9mIHNldCBsb29wICovCisKKyAgICAvKiBhbGwgbm9uLVBDV3Mgb2YgdGhpcyBzcGVjdHJ1bSBhcmUgZGVjb2RlZCAqLworICB9CisKKyAgLyogYWxsIFBDV3MgYW5kIGFsbCBub24gUENXcyBhcmUgZGVjb2RlZC4gVGhleSBhcmUgdW5iYWNrc29ydGVkIGluIG91dHB1dCBidWZmZXIuIEhlcmUgaXMgdGhlIEludGVyZmFjZSB3aXRoIGNvbXBhcmluZyBRU0NzIHRvIGFzbSBkZWNvZGluZyAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGJpdGZpZWxkIHVzZWQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy4gVGhlIGxpc3QgaXMgc2V0IHVwIG9uY2UgdG8gYmUgdXNlZCBpbiBhbGwgZm9sbG93aW5nIHNldHMuIElmIGEKKyAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGUgYWNjb3JkaW5nIGJpdCBmcm9tIHRoZSBCaXRmaWVsZCBpcyByZW1vdmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcmV0dXJuOiAgICAgbnVtVmFsaWRTZWdtZW50ID0gdGhlIG51bWJlciBvZiB2YWxpZCBzZWdtZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBVSU5UIEluaXRTZWdtZW50Qml0ZmllbGQoVUlOVCAgICpwTnVtU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICpwU2VnbWVudEJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgKnBOdW1Xb3JkRm9yQml0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkKK3sKKyAgU0hPUlQgICBpOworICBVU0hPUlQgIHI7CisgIFVDSEFSICAgYml0ZmllbGRXb3JkOworICBVSU5UICAgIHRlbXBXb3JkOworICBVU0hPUlQgIG51bVZhbGlkU2VnbWVudDsKKworICAqcE51bVdvcmRGb3JCaXRmaWVsZCA9ICgoKnBOdW1TZWdtZW50LTEpID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpICsgMTsKKworICAvKiBsb29wIG92ZXIgYWxsIHdvcmRzLCB3aGljaCBhcmUgY29tcGxldGVseSB1c2VkIG9yIG9ubHkgcGFydGlhbCAqLworICAvKiBiaXQgaW4gcFNlZ21lbnRCaXRmaWVsZCBpcyB6ZXJvIGlmIHNlZ21lbnQgaXMgZW1wdHk7IGJpdCBpbiBwU2VnbWVudEJpdGZpZWxkIGlzIG9uZSBpZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLworICBudW1WYWxpZFNlZ21lbnQgPSAwOworICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCA9ICpwTnVtU2VnbWVudDsKKworICAvKiBsb29wIG92ZXIgd29yZHMgKi8KKyAgZm9yICggYml0ZmllbGRXb3JkPTA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkIC0gMTsgYml0ZmllbGRXb3JkKysgKSB7CisgICAgdGVtcFdvcmQgPSAweEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9uZXMgKi8KKyAgICByID0gYml0ZmllbGRXb3JkIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0c7CisgICAgZm9yICggaT0wOyBpIDwgTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBpKyspIHsKKyAgICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbciArIGldID09IDAgKSB7CisgICAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpKTsgICAgICAgICAgLyogc2V0IGEgemVybyBhdCBiaXQgbnVtYmVyIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSBpbiB0ZW1wV29yZCAqLworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIG51bVZhbGlkU2VnbWVudCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnQgc2VnbWVudHMgd2hpY2ggYXJlIG5vdCBlbXB0eSAqLworICAgICAgfQorICAgIH0KKyAgICBwU2VnbWVudEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPSB0ZW1wV29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSByZXN1bHQgKi8KKyAgICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCAtPSBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIHplcm9zIG9uIExTQiBzaWRlIGluIHRoZSBsYXN0IHdvcmQgKi8KKyAgfQorCisKKyAgLyogY2FsY3VsYXRlIGxhc3Qgd29yZDogcHJlcGFyZSBzcGVjaWFsIHRlbXBXb3JkICovCisgIHRlbXBXb3JkID0gMHhGRkZGRkZGRjsKKyAgZm9yICggaT0wOyBpIDwgKCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCApOyBpKysgKSB7CisgICAgdGVtcFdvcmQgPSB0ZW1wV29yZCAmIH4oMSA8PCBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYml0IGkgaW4gdGVtcFdvcmQgKi8KKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBsYXN0IHdvcmQgKi8KKyAgciA9IGJpdGZpZWxkV29yZCA8PCBUSElSVFlUV09fTE9HX0RJVl9UV09fTE9HOworICBmb3IgKCBpPTA7IGk8KnBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7IGkrKykgeworICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbciArIGldID09IDAgKSB7CisgICAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSk7ICAgICAgICAgICAgLyogc2V0IGEgemVybyBhdCBiaXQgbnVtYmVyIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSBpbiB0ZW1wV29yZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG51bVZhbGlkU2VnbWVudCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCBzZWdtZW50cyB3aGljaCBhcmUgbm90IGVtcHR5ICovCisgICAgfQorICB9CisgIHBTZWdtZW50Qml0ZmllbGRbYml0ZmllbGRXb3JkXSA9IHRlbXBXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCisKKworCisgIHJldHVybiBudW1WYWxpZFNlZ21lbnQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgc2lkZWluZm8gZm9yIHRoZSBub24tUENXIGRlY29kZXIgKGZvciB0aGUgY3VycmVudCBzZXQpLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIEluaXROb25QQ1dTaWRlSW5mb3JtYXRpb25Gb3JDdXJyZW50U2V0KEhfSENSX0lORk8gcEhjcikKK3sKKyAgVVNIT1JUICAgICBpLGs7CisgIFVDSEFSICAgICAgY29kZWJvb2tEaW07CisgIFVJTlQgICAgICAgc3RhcnROb2RlOworCisgIFVDSEFSICAgICAqcENvZGVib29rICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKKyAgVUlOVCAgICAgICppTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIFVDSEFSICAgICAqcENudFNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDbnRTaWduOworICBVU0hPUlQgICAgKmlSZXN1bHRQb2ludGVyICAgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAgICAgICpwRXNjYXBlU2VxdWVuY2VJbmZvICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgU0NIQVIgICAgICpwU3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgVVNIT1JUICAgICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIGludCAgICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9ICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgVUNIQVIgICAgICpwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vayAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIGludCAgICAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIFVTSE9SVCAgICAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzOworICBpbnQgICAgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggID0gICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBGSVhQX0RCTCAgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyAgICAgID0gICBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgIGludCAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggICAgPSAgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBjb25zdCBVQ0hBUiAgICAgKnBDYkRpbWVuc2lvbiAgICAgICAgICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiRGltZW5zaW9uOworICBpbnQgaXRlcmF0aW9uQ291bnRlciA9IDA7CisKKyAgLyogbG9vcCBvdmVyIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgaW4gdGhlIGN1cnJlbnQgc2V0IHNvIGFsbCBjb2Rld29yZHMgc2lkZWluZm8gdmFyaWFibGVzIHdpdGhpbiB0aGlzIHNldCBjYW4gYmUgcHJlcGFyZWQgZm9yIGRlY29kaW5nICovCisgIGZvciAoIGk9cE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07IGkgIT0gMDsgaS0tICkgeworCisgICAgY29kZWJvb2tEaW0gPSBwQ2JEaW1lbnNpb25bcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgIHN0YXJ0Tm9kZSAgID0gKmFIdWZmVGFibGVbcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgIAorICAgIGZvciAoIGsgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbltudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XTsgayAhPSAwOyBrLS0gKSB7CisgICAgICBpdGVyYXRpb25Db3VudGVyKys7CisgICAgICBpZiAoaXRlcmF0aW9uQ291bnRlciA+ICgxMDI0Pj4yKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAqcFN0YSsrICAgICAgICAgICAgICAgICA9IGFDb2RlYm9vazJTdGFydEludFtwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9va1tleHRlbmRlZFNvcnRlZENvZGVib29rSWR4XV07CisgICAgICAqcENvZGVib29rKysgICAgICAgICAgICA9IHBFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdOworICAgICAgKmlOb2RlKysgICAgICAgICAgICAgICAgPSBzdGFydE5vZGU7CisgICAgICAqcENudFNpZ24rKyAgICAgICAgICAgICA9IDA7CisgICAgICAqaVJlc3VsdFBvaW50ZXIrKyAgICAgICA9IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICAgICAgKnBFc2NhcGVTZXF1ZW5jZUluZm8rKyAgPSAwOworICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggKz0gY29kZWJvb2tEaW07ICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgYnkgY29kZWJvb2tEaW0gLS0+IHBvaW50IHRvIG5leHQgc3RhcnRpbmcgdmFsdWUgZm9yIHdyaXRpbmcgb3V0ICovCisgICAgICBpZiAocXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPj0gMTAyNCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jIHB0ciBmb3IgbmV4dCBleHQgc29ydCBzZWMgaW4gY3VycmVudCBzZXQgKi8KKyAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluYyBwdHIgZm9yIG5leHQgZXh0IHNvcnQgc2VjIGluIGN1cnJlbnQgc2V0ICovCisgICAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykgfHwgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA+PSAoTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jIHB0ciBmb3IgbmV4dCBzZXQgb2Ygbm9uLVBDV3MgKi8KKyAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBXcml0ZSBiYWNrIGluZGV4ZXMgKi8KKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPSBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4OworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgdmFsdWUgaWYgdGhlIHZhbHVlIGlzIGluIHRoZQorICAgICAgICAgICAgICAgICAgcmFuZ2Ugb2YgYnVmZmVybGVuZ3RoLiBJZiA8aW5wdXQ+IGlzIHNtYWxsZXIsIG9uZSBidWZmZXJsZW5ndGggaXMgYWRkZWQsCisgICAgICAgICAgICAgICAgICBpZiA8aW5wdXQ+IGlzIGJpZ2dlciBvbmUgYnVmZmVybGVuZ3RoIGlzIHN1YnRyYWN0ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgbW9kdWxvIHJlc3VsdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBJTlQgTW9kdWxvVmFsdWUoSU5UIGlucHV0LCBJTlQgYnVmZmVybGVuZ3RoKQoreworICBpZiAoIGlucHV0ID4gKGJ1ZmZlcmxlbmd0aCAtIDEpICkgeworICAgIHJldHVybiAoaW5wdXQgLSBidWZmZXJsZW5ndGgpOworICB9CisgIGlmICggaW5wdXQgPCAwICkgeworICAgIHJldHVybiAoaW5wdXQgKyBidWZmZXJsZW5ndGgpOworICB9CisgIHJldHVybiBpbnB1dDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjbGVhcnMgYSBiaXQgZnJvbSBjdXJyZW50IGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgc3dpdGNoZXMgb2ZmIHRoZSBzdGF0ZW1hY2hpbmUuCisKKyAgICAgICAgICAgICAgICAgIEEgYml0IGlzIGNsZWFyZWQgaW4gdHdvIGNhc2VzOgorICAgICAgICAgICAgICAgICAgYSkgYSBjb2Rld29yZCBpcyBkZWNvZGVkLCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gY29kZXdvcmQgYml0ZmllbGQKKyAgICAgICAgICAgICAgICAgIGIpIGEgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gc2VnbWVudCBiaXRmaWVsZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKnBCaXRmaWVsZCkKK3sKKyAgVUlOVCAgbnVtQml0ZmllbGRXb3JkOworICBVSU5UICBudW1CaXRmaWVsZEJpdDsKKworICAvKiBnZXQgYm90aCB2YWx1ZXMgbmVlZGVkIGZvciBjbGVhcmluZyB0aGUgYml0ICovCisgIG51bUJpdGZpZWxkV29yZCA9IG9mZnNldCA+PiBUSElSVFlUV09fTE9HX0RJVl9UV09fTE9HOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbnQgICA9IHdvcmROciAqLworICBudW1CaXRmaWVsZEJpdCAgPSBvZmZzZXQgLSAobnVtQml0ZmllbGRXb3JkIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpOyAgLyogZnJhY3QgPSBiaXROciAgKi8KKworICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCAqLworICBwQml0ZmllbGRbbnVtQml0ZmllbGRXb3JkXSA9IHBCaXRmaWVsZFtudW1CaXRmaWVsZFdvcmRdICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMSAtIG51bUJpdGZpZWxkQml0KSk7CisKKyAgLyogc3dpdGNoIG9mZiBzdGF0ZSBtYWNoaW5lIGJlY2F1c2UgY29kZXdvcmQgaXMgZGVjb2RlZCBhbmQvb3IgYmVjYXVzZSBzZWdtZW50IGlzIGVtcHR5ICovCisgICpwdHJTdGF0ZSA9IE5VTEw7Cit9CisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlcyBvZiB0aGUgc3RhdGVtYWNoaW5lCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGRlc2NyaXB0aW9uOiAgRGVjb2RlcyB0aGUgYm9keSBvZiBhIGNvZGV3b3JkLiBUaGlzIFN0YXRlIGlzIHVzZWQgZm9yIGNvZGVib29rcyAxLDIsNSBhbmQgNi4KKyAgICAgICAgICAgICAgICAgICBObyBzaWduIGJpdHMgYXJlIGRlY29kZWQsIGJlY2F1c2UgdGhlIHRhYmxlIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgaGFzIGdvdCBhIHZhbGlkIHNpZ24gYXQgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24gd2hlcmUgcFJlc3VsdFBvaW50cgorICAgICAgICAgICAgICAgICAgcG9pbnRzIHRvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfT05MWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoreworICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7CisgIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OworICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7CisgIFVJTlQgICAgICAgICppTm9kZTsKKyAgVVNIT1JUICAgICAgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICAgICAgICAgY29kZXdvcmRPZmZzZXQ7CisgIFVJTlQgICAgICAgICBicmFuY2hOb2RlOworICBVSU5UICAgICAgICAgYnJhbmNoVmFsdWU7CisgIFVJTlQgICAgICAgICBpUVNDOworICBVSU5UICAgICAgICAgdHJlZU5vZGU7CisgIFVDSEFSICAgICAgICBjYXJyeUJpdDsKKyAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKKyAgVUNIQVIgICAgICAgKnBDb2RlYm9vazsKKyAgVUNIQVIgICAgICAgIGRpbUNudHI7CisgIGNvbnN0IFVJTlQgICpwQ3VycmVudFRyZWU7CisgIGNvbnN0IFVDSEFSICpwQ2JEaW1lbnNpb247CisgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWw7CisgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWxCYXNlOworCisgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBDb2Rld29yZEJpdGZpZWxkICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKworICBwQ29kZWJvb2sgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKKyAgaU5vZGUgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKKyAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKKyAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKworICBwQ2JEaW1lbnNpb24gICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1lbnNpb247CisKKyAgdHJlZU5vZGUgICAgICAgICAgICAgICAgPSBpTm9kZVtjb2Rld29yZE9mZnNldF07CisgIHBDdXJyZW50VHJlZSAgICAgICAgICAgID0gYUh1ZmZUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsKKworCisgIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKKworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBhIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisKKyAgICAvKiBpZiBlbmQgb2YgYnJhbmNoIHJlYWNoZWQgd3JpdGUgb3V0IGxpbmVzIGFuZCBjb3VudCBiaXRzIG5lZWRlZCBmb3Igc2lnbiwgb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyA9PT4gYm9keSBpcyBjb21wbGV0ZSAqLworICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYmFzZSBhZGRyZXNzIG9mIHF1YW50aXplZCB2YWx1ZXMgYmVsb25naW5nIHRvIGN1cnJlbnQgY29kZWJvb2sgKi8KKyAgICAgIHBRdWFudFZhbCA9IHBRdWFudFZhbEJhc2UgKyBicmFuY2hWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgbGluZSBbb2YgMiBvciA0IHF1YW50aXplZCB2YWx1ZXNdICovCisKKyAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcG9zaXRpb24gb2YgZmlyc3QgbGluZSBmb3Igd3JpdGluZyBvdXQgcmVzdWx0ICovCisKKyAgICAgIGZvciAoIGRpbUNudHIgPSBwQ2JEaW1lbnNpb25bcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07IGRpbUNudHIgIT0gMDsgZGltQ250ci0tICkgeworICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0gKEZJWFBfREJMKSpwUXVhbnRWYWwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgb3V0IDIgb3IgNCBsaW5lcyBpbnRvIHNwZWN0cnVtOyBubyBTaWduIGJpdHMgYXZhaWxhYmxlIGluIHRoaXMgc3RhdGUgKi8KKyAgICAgIH0KKworICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMgZGVjb2RlZCAqLworICAgIH0KKyAgICBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLworICAgICAgdHJlZU5vZGUgPSAqKHBDdXJyZW50VHJlZSArIGJyYW5jaFZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgfQorICB9CisgIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgdHJlZU5vZGUgYmVjYXVzZSBtYXliZSBkZWNvZGluZyBvZiBjb2Rld29yZCBib2R5IG5vdCBmaW5pc2hlZCB5ZXQgKi8KKworICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworCisjaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSworICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwICkgeworICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9PTkxZOworICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSwgd3JpdGVzIG91dCByZXN1bHQgYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mIHF1YW50aXplZAorICAgICAgICAgICAgICAgICAgc3BlY3RyYWwgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IGZvcm0gemVyby4gRm9yIHRob3NlIHZhbHVlcyBzaWduIGJpdHMgYXJlCisgICAgICAgICAgICAgICAgICBuZWVkZWQuCisKKyAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLCBzd2l0Y2ggdG8gbmV4dCBzdGF0ZSB0bworICAgICAgICAgICAgICAgICAgZGVjb2RlIHNpZ24gQml0cyB0aGVyZS4KKyAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyB6ZXJvLCBubyBzaWduIGJpdHMgYXJlIG5lZWRlZCBhbmQgY29kZXdvcmQgaXMKKyAgICAgICAgICAgICAgICAgIGRlY29kZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBvdXRwdXQ6ICAgVHdvIG9yIGZvdXIgd3JpdHRlbiBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24gd2hlcmUKKyAgICAgICAgICAgICAgICAgIHBSZXN1bHRQb2ludHIgcG9pbnRzIHRvLiBUaGUgc2lnbnMgb2YgdGhvc2UgbGluZXMgbWF5IGJlIHdyb25nLiBJZiB0aGUgc2lnbnMKKyAgICAgICAgICAgICAgICAgIFtvbiBqdXN0IG9uZSBzaWdubGUgc2lnbl0gaXMgd3JvbmcsIHRoZSBuZXh0IHN0YXRlIHdpbGwgY29ycmVjdCBpdC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpCit7CisgIEhfSENSX0lORk8gcEhjciA9IChIX0hDUl9JTkZPKXB0cjsKKyAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgVVNIT1JUICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAgICAgICAgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVJTlQgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCAgICAgICAgIHNlZ21lbnRPZmZzZXQ7CisKKyAgVUNIQVIgICAgICAgKnBDb2RlYm9vazsKKyAgVUlOVCAgICAgICAgKmlOb2RlOworICBVQ0hBUiAgICAgICAqcENudFNpZ247CisgIEZJWFBfREJMICAgICpwUmVzdWx0QmFzZTsKKyAgVVNIT1JUICAgICAgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICAgICAgICAgY29kZXdvcmRPZmZzZXQ7CisKKyAgVUlOVCAgICAgICAgIGlRU0M7CisgIFVJTlQgICAgICAgICBjbnRTaWduOworICBVQ0hBUiAgICAgICAgZGltQ250cjsKKyAgVUNIQVIgICAgICAgIGNhcnJ5Qml0OworICBTQ0hBUiAgICAgICAqcFN0YTsKKyAgVUlOVCAgICAgICAgIHRyZWVOb2RlOworICBVSU5UICAgICAgICAgYnJhbmNoVmFsdWU7CisgIFVJTlQgICAgICAgICBicmFuY2hOb2RlOworICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uOworICBjb25zdCBVSU5UICAqcEN1cnJlbnRUcmVlOworICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsQmFzZTsKKyAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKKworICBwUmVtYWluaW5nQml0c0luU2VnbWVudCAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKKyAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOworICBwQ29kZXdvcmRCaXRmaWVsZCAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOworICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisKKyAgcENvZGVib29rICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ29kZWJvb2s7CisgIGlOb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIHBDbnRTaWduICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CisgIHBTdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKworICBwQ2JEaW1lbnNpb24gICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1lbnNpb247CisKKyAgdHJlZU5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgPSBpTm9kZVtjb2Rld29yZE9mZnNldF07CisgIHBDdXJyZW50VHJlZSAgICAgICAgICAgICAgICAgICAgID0gYUh1ZmZUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsKKworCisgIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKKworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBhIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisKKyAgICAvKiBpZiBlbmQgb2YgYnJhbmNoIHJlYWNoZWQgd3JpdGUgb3V0IGxpbmVzIGFuZCBjb3VudCBiaXRzIG5lZWRlZCBmb3Igc2lnbiwgb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgYm9keSBjb21wbGV0ZSAqLworICAgICAgLyogYm9keSBjb21wbGV0ZWx5IGRlY29kZWQ7IGJyYW5jaFZhbHVlIGlzIHZhbGlkLCBzZXQgcFF1YW50VmFsIHRvIGZpcnN0IChvZiB0d28gb3IgZm91cikgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLworICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYmFzZSBhZGRyZXNzIG9mIHF1YW50aXplZCB2YWx1ZXMgYmVsb25naW5nIHRvIGN1cnJlbnQgY29kZWJvb2sgKi8KKyAgICAgIHBRdWFudFZhbCA9IHBRdWFudFZhbEJhc2UgKyBicmFuY2hWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgbGluZSBbb2YgMiBvciA0IHF1YW50aXplZCB2YWx1ZXNdICovCisKKyAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHBvc2l0aW9uIG9mIGZpcnN0IGxpbmUgZm9yIHdyaXRpbmcgcmVzdWx0ICovCisKKyAgICAgIC8qIGNvZGV3b3JkIGRlY29kaW5nIHJlc3VsdCBpcyB3cml0dGVuIG91dCBoZXJlOiBXcml0ZSBvdXQgMiBvciA0IHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgd2l0aCBwcm9iYWJseSAqLworICAgICAgLyogd3Jvbmcgc2lnbiBhbmQgY291bnQgbnVtYmVyIG9mIHZhbHVlcyB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gemVybyBmb3Igc2lnbiBiaXQgZGVjb2RpbmcgW3doaWNoIGhhcHBlbnMgaW4gbmV4dCBzdGF0ZV0gKi8KKyAgICAgIGNudFNpZ24gPSAwOworICAgICAgZm9yICggZGltQ250ciA9IHBDYkRpbWVuc2lvbltwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgZGltQ250ciAhPSAwOyBkaW1DbnRyLS0gKSB7CisgICAgICAgIHBSZXN1bHRCYXNlW2lRU0MrK10gPSAoRklYUF9EQkwpKnBRdWFudFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bSAqLworICAgICAgICBpZiAoICpwUXVhbnRWYWwrKyAhPSAwICkgeworICAgICAgICAgIGNudFNpZ24gKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsKKyAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwQ250U2lnbltjb2Rld29yZE9mZnNldF0gPSBjbnRTaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBzaWduIGNvdW50IHJlc3VsdCBpbnRvIGNvZGV3b3Jkc2lkZWluZm8gb2YgY3VycmVudCBjb2Rld29yZCAqLworICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9fU0lHTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgIH0KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBub25QQ1ctQm9keSBpcyBkZWNvZGVkICovCisgICAgfQorICAgIGVsc2Ugey8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KKyAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgIH0KKyAgfQorICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSB0cmVlTm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUgZGVjb2Rpbmcgb2YgY29kZXdvcmQgYm9keSBub3QgZmluaXNoZWQgeWV0ICovCisKKyAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwICkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKworI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKKyAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9fQk9EWTsKKyAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9fQk9EWTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246IFRoaXMgc3RhdGUgZGVjb2RlcyB0aGUgc2lnbiBiaXRzIGJlbG9uZ2luZyB0byBhIGNvZGV3b3JkLiBUaGUgc3RhdGUgaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgICBhcyBvZnRlbiBpbiBkaWZmZXJlbnQgInRyaWFscyIgdW50aWwgcENudFNnbltjb2Rld29yZE9mZnNldF0gaXMgemVyby4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG91dHB1dDogICBUaGUgdHdvIG9yIGZvdXIgcXVhbnRpemVzIHNwZWN0cmFsIHZhbHVlcyAod3JpdHRlbiBpbiBwcmV2aW91cyBzdGF0ZSkgaGF2ZQorICAgICAgICAgICAgICAgICAgbm93IHRoZSBjb3JyZWN0IHNpZ24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoreworICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7CisgIFNDSEFSICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgICAgICAgIHJlYWREaXJlY3Rpb247CisgIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OworCisgIFVDSEFSICAgICAgICpwQ250U2lnbjsKKyAgRklYUF9EQkwgICAgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgICAgICAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgICAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgVUNIQVIgICAgICAgIGNhcnJ5Qml0OworICBVSU5UICAgICAgICAgaVFTQzsKKyAgVUNIQVIgICAgICAgIGNudFNpZ247CisKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworCisgIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CisgIGlRU0MgICAgICAgICAgICAgICAgICAgID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOworICBjbnRTaWduICAgICAgICAgICAgICAgICA9IHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XTsKKworCisKKyAgLyogbG9vcCBmb3Igc2lnbiBiaXQgZGVjb2RpbmcgKi8KKyAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgeworCisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgICBjbnRTaWduIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjcmVtZW50IHNpZ24gY291bnRlciBiZWNhdXNlIG9uZSBzaWduIGJpdCBoYXMgYmVlbiByZWFkICovCisKKyAgICAvKiBzZWFyY2ggZm9yIGEgbGluZSAod2hpY2ggd2FzIGRlY29kZWQgaW4gcHJldmlvdXMgc3RhdGUpIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCisgICAgd2hpbGUgKCBwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCApIHsKKyAgICAgIGlRU0MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdmFsdWUgZGlmZmVyZW50IGZyb20gemVybyAqLworICAgICAgaWYgKGlRU0MgPj0gMTAyNCkgeworICAgICAgICByZXR1cm4gQk9EWV9TSUdOX19TSUdOOworICAgICAgfQorICAgIH0KKworICAgIC8qIHB1dCBzaWduIHRvZ2V0aGVyIHdpdGggbGluZTsgaWYgY2FycnlCaXQgaXMgemVybywgdGhlIHNpZ24gaXMgb2sgYWxyZWFkeTsgbm8gd3JpdGUgb3BlcmF0aW9uIG5lY2Vzc2FyeSBpbiB0aGlzIGNhc2UgKi8KKyAgICBpZiAoIGNhcnJ5Qml0ICE9IDAgKSB7CisgICAgICBwUmVzdWx0QmFzZVtpUVNDXSA9IC1wUmVzdWx0QmFzZVtpUVNDXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhcnJ5Qml0ID0gMSAtLT4gbWludXMgKi8KKyAgICB9CisKKyAgICBpUVNDKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCAobWF5YmUgdmFsaWQpIHZhbHVlICovCisKKyAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKGNudFNpZ249PTApICA9PT4gIHNldCBzdGF0ZSBDT0RFV09SRF9ERUNPREVEICovCisgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hvbGUgbm9uUENXLUJvZHkgYW5kIGFjY29yZGluZyBzaWduIGJpdHMgYXJlIGRlY29kZWQgKi8KKyAgICAgfQorICB9CisgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247CisgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgcFJlc3VsdFBvaW50ZXIgKi8KKworICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworCisjaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSworICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwICkgeworICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX19TSUdOOworICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19TSUdOOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSBpbiBjYXNlIG9mIGNvZGVib29rIGlzIDExLiBXcml0ZXMgb3V0IHJlc3VsdGluZworICAgICAgICAgICAgICAgICAgdHdvIG9yIGZvdXIgbGluZXMgW3dpdGggcHJvYmFibHkgd3Jvbmcgc2lnbl0gYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICBsaW5lcywgd2hpY2ggYXJlIGRpZmZlcmVudCBmb3JtIHplcm8uIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGluIG5leHQKKyAgICAgICAgICAgICAgICAgIHN0YXRlIHdoZXJlIHNpZ24gYml0cyB3aWxsIGJlIGRlY29kZWQsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyB6ZXJvLCBubyBzaWduIGJpdHMgYXJlIG5lZWRlZCBhbmQgY29kZXdvcmQgaXMKKyAgICAgICAgICAgICAgICAgIGRlY29kZWQgY29tcGxldGVseS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG91dHB1dDogICBUd28gbGluZXMgKHF1YW50aXplcyBzcGVjdHJhbCBjb2VmZmljaWVudHMpIHdoaWNoIGFyZSBwcm9iYWJseSB3cm9uZy4gVGhlCisgICAgICAgICAgICAgICAgICBzaWduIG1heSBiZSB3cm9uZyBhbmQgaWYgb25lIG9yIHR3byB2YWx1ZXMgaXMvYXJlIDE2LCB0aGUgZm9sbG93aW5nIHN0YXRlcworICAgICAgICAgICAgICAgICAgd2lsbCBkZWNvZGUgdGhlIGVzY2FwZSBzZXF1ZW5jZSB0byBjb3JyZWN0IHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHdpcnR0ZW4gaGVyZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoreworICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7CisgIFNDSEFSICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgICAgICAgIHJlYWREaXJlY3Rpb247CisgIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OworCisgIFVJTlQgICAgICAgICppTm9kZTsKKyAgVUNIQVIgICAgICAgKnBDbnRTaWduOworICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7CisgIFVTSE9SVCAgICAgICppUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAgICAgICAgIGNvZGV3b3JkT2Zmc2V0OworCisgIFVDSEFSICAgICAgICBjYXJyeUJpdDsKKyAgVUlOVCAgICAgICAgIGlRU0M7CisgIFVJTlQgICAgICAgICBjbnRTaWduOworICBVSU5UICAgICAgICAgZGltQ250cjsKKyAgVUlOVCAgICAgICAgIHRyZWVOb2RlOworICBTQ0hBUiAgICAgICAqcFN0YTsKKyAgVUlOVCAgICAgICAgIGJyYW5jaE5vZGU7CisgIFVJTlQgICAgICAgICBicmFuY2hWYWx1ZTsKKyAgY29uc3QgVUlOVCAgKnBDdXJyZW50VHJlZTsKKyAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CisgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWw7CisKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworCisgIGlOb2RlICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CisgIHBTdGEgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKworICB0cmVlTm9kZSAgICAgICAgICAgICAgICA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKyAgcEN1cnJlbnRUcmVlICAgICAgICAgICAgPSBhSHVmZlRhYmxlW0VTQ0FQRV9DT0RFQk9PS107CisKKworICBmb3IgKCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEgKSB7CisKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKCBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOworCisgICAgLyogbWFrZSBhIHN0ZXAgaW4gdHJlZSAqLworICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaE5vZGUpOworCisgICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCisgICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09IFRFU1RfQklUXzEwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IGJvZHkgY29tcGxldGUgKi8KKworICAgICAgLyogYm9keSBjb21wbGV0ZWx5IGRlY29kZWQ7IGJyYW5jaFZhbHVlIGlzIHZhbGlkICovCisgICAgICAvKiBzZXQgcFF1YW50Vm9sIHRvIGZpcnN0IChvZiB0d28gb3IgZm91cikgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLworICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW0VTQ0FQRV9DT0RFQk9PS107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBiYXNlIGFkZHJlc3Mgb2YgcXVhbnRpemVkIHZhbHVlcyBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLworICAgICAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzXSAqLworCisgICAgICAvKiBtYWtlIGJhY2t1cCBmcm9tIG9yaWdpbmFsIHJlc3VsdFBvaW50ZXIgaW4gbm9kZSBzdG9yYWdlIGZvciBzdGF0ZSBCT0RZX1NJR05fRVNDX19TSUdOICovCisgICAgICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CisKKyAgICAgIC8qIGdldCBwb3NpdGlvbiBvZiBmaXJzdCBsaW5lIGZvciB3cml0aW5nIHJlc3VsdCAqLworICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKKworICAgICAgLyogY29kZXdvcmQgZGVjb2RpbmcgcmVzdWx0IGlzIHdyaXR0ZW4gb3V0IGhlcmU6IFdyaXRlIG91dCAyIG9yIDQgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyB3aXRoIHByb2JhYmx5ICovCisgICAgICAvKiB3cm9uZyBzaWduIGFuZCBjb3VudCBudW1iZXIgb2YgdmFsdWVzIHdoaWNoIGFyZSBkaWZmZXJlbnQgZnJvbSB6ZXJvIGZvciBzaWduIGJpdCBkZWNvZGluZyBbd2hpY2ggaGFwcGVucyBpbiBuZXh0IHN0YXRlXSAqLworICAgICAgY250U2lnbiA9IDA7CisKKyAgICAgIGZvciAoIGRpbUNudHIgPSBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LOyBkaW1DbnRyICE9IDA7IGRpbUNudHItLSApIHsKKyAgICAgICAgcFJlc3VsdEJhc2VbaVFTQysrXSA9IChGSVhQX0RCTCkqcFF1YW50VmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHF1YW50LiBzcGVjLiBjb2VmLiBpbnRvIHNwZWN0cnVtICovCisgICAgICAgIGlmICggKnBRdWFudFZhbCsrICE9IDAgKSB7CisgICAgICAgICAgY250U2lnbiArPSAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICggY250U2lnbiA9PSAwICkgeworICAgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgICAgICAgIC8qIGNvZGV3b3JkIGRlY29kZWQgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiB3cml0ZSBzaWduIGNvdW50IHJlc3VsdCBpbnRvIGNvZGV3b3Jkc2lkZWluZm8gb2YgY3VycmVudCBjb2Rld29yZCAqLworICAgICAgICBwQ250U2lnbltjb2Rld29yZE9mZnNldF0gPSBjbnRTaWduOworICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX1NJR047ICAgICAgICAgICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgIH0KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMgZGVjb2RlZCAqLworICAgIH0KKyAgICBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLworICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSBhbmQgc3RvcmUgdXBkYXRlZCB0cmVlTm9kZSBiZWNhdXNlIG1heWJlIG5vIG1vcmUgYml0cyBsZWZ0IGluIHNlZ21lbnQgKi8KKyAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7CisgICAgICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSB0cmVlTm9kZTsKKyAgICB9CisgIH0KKworICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKworI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKKyAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0JPRFk7CisgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogVGhpcyBzdGF0ZSBkZWNvZGVzIHRoZSBzaWduIGJpdHMsIGlmIGEgY29kZXdvcmQgb2YgY29kZWJvb2sgMTEgbmVlZHMgc29tZS4KKyAgICAgICAgICAgICAgICAgIEEgZmxhZyBuYW1lZCAnZmxhZ0InIGluIGNvZGV3b3JkIHNpZGVpbmZvIGlzIHNldCwgaWYgdGhlIHNlY29uZCBsaW5lIG9mCisgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIGlzIDE2LiBUaGUgJ2ZsYWdCJyBpcyB1c2VkIGluIGNhc2Ugb2YgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgIG9mIGEgZXNjYXBlIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSBhcyBmYXIgYXMgdGhlIHNlY29uZCBsaW5lIGlzIGNvbmNlcm5lZC4KKworICAgICAgICAgICAgICAgICAgSWYgb25seSB0aGUgZmlyc3QgbGluZSBuZWVkcyBhbiBlc2NhcGUgc2VxdWVuY2UsIHRoZSBmbGFnQiBpcyBjbGVhcmVkLgorICAgICAgICAgICAgICAgICAgSWYgb25seSB0aGUgc2Vjb25kIGxpbmUgbmVlZHMgYW4gZXNjYXBlIHNlcXVlbmNlLCB0aGUgZmxhZ0IgaXMgbm90IHVzZWQuCisKKyAgICAgICAgICAgICAgICAgIEZvciBzdG9yaW5nIHNpZGVpbmZvIGluIGNhc2Ugb2YgZXNjYXBlIHNlcXVlbmNlIGRlY29kaW5nIG9uZSBzaW5nbGUgd29yZAorICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgZm9yIGJvdGggZXNjYXBlIHNlcXVlbmNlcyBiZWNhdXNlIHRoZXkgYXJlIGRlY29kZWQgbm90IGF0IHRoZQorICAgICAgICAgICAgICAgICAgc2FtZSB0aW1lOgorCisKKyAgICAgICAgICAgICAgICAgIGJpdCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMCAgOSAgOCAgNyAgNiAgNSAgNCAgMyAgMiAgMSAgMAorICAgICAgICAgICAgICAgICAgICAgID09PT09ID09ID09ID09PT09PT09PT09ID09PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgXiAgICAgIF4gIF4gICAgICAgICBeICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICB8ICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgcmVzLiBmbGFnQSAgZmxhZ0IgIGVzY2FwZVByZWZpeFVwICBlc2NhcGVQcmVmaXhEb3duICBlc2NhcGVXb3JkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG91dHB1dDogICBUd28gbGluZXMgd2l0aCBjb3JyZWN0IHNpZ24uIElmIG9uZSBvciB0d28gdmFsdWVzIGlzL2FyZSAxNiwgdGhlIGxpbmVzIGFyZQorICAgICAgICAgICAgICAgICAgbm90IHZhbGlkLCBvdGhlcndpc2UgdGhleSBhcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKK3sKKyAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOworICBTQ0hBUiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVU0hPUlQgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIFVTSE9SVCAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIFVDSEFSICAgICAgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAgICAgICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICAgICAgKnBDb2Rld29yZEJpdGZpZWxkOworICBVSU5UICAgICAgIHNlZ21lbnRPZmZzZXQ7CisKKyAgVUlOVCAgICAgICppTm9kZTsKKyAgVUNIQVIgICAgICpwQ250U2lnbjsKKyAgRklYUF9EQkwgICpwUmVzdWx0QmFzZTsKKyAgVVNIT1JUICAgICppUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAgICAgICpwRXNjYXBlU2VxdWVuY2VJbmZvOworICBVSU5UICAgICAgIGNvZGV3b3JkT2Zmc2V0OworCisgIFVJTlQgICAgICAgaVFTQzsKKyAgVUNIQVIgICAgICBjbnRTaWduOworICBVSU5UICAgICAgIGZsYWdBOworICBVSU5UICAgICAgIGZsYWdCOworICBVSU5UICAgICAgIGZsYWdzOworICBVQ0hBUiAgICAgIGNhcnJ5Qml0OworICBTQ0hBUiAgICAgKnBTdGE7CisKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworCisgIGlOb2RlICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcFN0YSAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworCisgIGlRU0MgICAgICAgICAgICAgICAgICAgID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOworICBjbnRTaWduICAgICAgICAgICAgICAgICA9IHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XTsKKworCisgIC8qIGxvb3AgZm9yIHNpZ24gYml0IGRlY29kaW5nICovCisgIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKKworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisKKyAgICAvKiBkZWNyZW1lbnQgc2lnbiBjb3VudGVyIGJlY2F1c2Ugb25lIHNpZ24gYml0IGhhcyBiZWVuIHJlYWQgKi8KKyAgICBjbnRTaWduIC09IDE7CisgICAgcENudFNpZ25bY29kZXdvcmRPZmZzZXRdID0gY250U2lnbjsKKworICAgIC8qIGdldCBhIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZSAod2hpY2ggd2FzIGRlY29kZWQgaW4gcHJldmlvdXMgc3RhdGUpIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCisgICAgd2hpbGUgKCBwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCApIHsKKyAgICAgIGlRU0MrKzsKKyAgICB9CisgICAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaVFTQzsKKworICAgIC8qIHB1dCBuZWdhdGl2ZSBzaWduIHRvZ2V0aGVyIHdpdGggcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlOyBpZiBjYXJyeUJpdCBpcyB6ZXJvLCB0aGUgc2lnbiBpcyBvayBhbHJlYWR5OyBubyB3cml0ZSBvcGVyYXRpb24gbmVjZXNzYXJ5IGluIHRoaXMgY2FzZSAqLworICAgIGlmICggY2FycnlCaXQgIT0gMCApIHsKKyAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0gLSBwUmVzdWx0QmFzZVtpUVNDXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FycnlCaXQgPSAxIC0tPiBtaW51cyAqLworICAgIH0KKyAgICBpUVNDKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGluZGV4IHRvIG5leHQgKG1heWJlIHZhbGlkKSB2YWx1ZSAqLworICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7CisKKyAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsKKyAgICAgIC8qIGFsbCBzaWduIGJpdHMgYXJlIGRlY29kZWQgbm93ICovCisgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisKKyAgICAgIC8qIGNoZWNrIGRlY29kZWQgdmFsdWVzIGlmIGNvZGV3b3JkIGlzIGRlY29kZWQ6IENoZWNrIGlmIG9uZSBvciB0d28gZXNjYXBlIHNlcXVlbmNlcyAxNiBmb2xsb3cgKi8KKworICAgICAgLyogc3RlcCAwICovCisgICAgICAvKiByZXN0b3JlIHBvaW50ZXIgdG8gZmlyc3QgZGVjb2RlZCBxdWFudGl6ZWQgdmFsdWUgWyA9IG9yaWdpbmFsIHBSZXN1bHRQb2ludHJdIGZyb20gaW5kZXggaU5vZGUgcHJlcGFyZWQgaW4gU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWSAqLworICAgICAgaVFTQyA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKworICAgICAgLyogc3RlcCAxICovCisgICAgICAvKiB0ZXN0IGZpcnN0IHZhbHVlIGlmIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dzICovCisgICAgICBmbGFnQSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBmaXJzdCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UgKi8KKyAgICAgIGlmICggZml4cF9hYnMocFJlc3VsdEJhc2VbaVFTQysrXSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKKyAgICAgICAgZmxhZ0EgPSAxOworICAgICAgfQorCisgICAgICAvKiBzdGVwIDIgKi8KKyAgICAgIC8qIHRlc3Qgc2Vjb25kIHZhbHVlIGlmIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dzICovCisgICAgICBmbGFnQiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzZWNvbmQgcG9zc2libGUgZXNjYXBlIHNlcXVlbmNlICovCisgICAgICBpZiAoIGZpeHBfYWJzKHBSZXN1bHRCYXNlW2lRU0NdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFICkgeworICAgICAgICBmbGFnQiA9IDE7CisgICAgICB9CisKKworICAgICAgLyogc3RlcCAzICovCisgICAgICAvKiBldmFsdWF0ZSBmbGFnIHJlc3VsdCBhbmQgZ28gb24gaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoICFmbGFnQSAmJiAhZmxhZ0IgKSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogYXQgbGVhc3Qgb25lIG9mIHR3byBsaW5lcyBpcyAxNiAqLworICAgICAgICAvKiBzdG9yZSBib3RoIGZsYWdzIGF0IGNvcnJlY3QgcG9zaXRpb25zIGluIG5vbiBQQ1cgY29kZXdvcmQgc2lkZWluZm8gcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gKi8KKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICAgZmxhZ0EgPDwgUE9TSVRJT05fT0ZfRkxBR19BOworICAgICAgICBmbGFncyB8PSAoZmxhZ0IgPDwgUE9TSVRJT05fT0ZfRkxBR19CKTsKKyAgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gPSBmbGFnczsKKworCisgICAgICAgIC8qIHNldCBuZXh0IHN0YXRlICovCisgICAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKworICAgICAgICAvKiBzZXQgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHR3byBkZWNvZGVkIGxpbmVzICovCisgICAgICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKworICAgICAgICBpZiAoICFmbGFnQSAmJiBmbGFnQiApIHsKKyAgICAgICAgICAvKiB1cGRhdGUgcFJlc3VsdFBvaW50ciA9PT4gc3RhdGUgU3RhdF9CT0RZX1NJR05fRVNDX19FU0NfV09SRCB3cml0ZXMgdG8gY29ycmVjdCBwb3NpdGlvbi4gU2Vjb25kIHZhbHVlIGlzIHRoZSBvbmUgYW5kIG9ubHkgZXNjYXBlIHZhbHVlICovCisgICAgICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKKyAgICAgICAgICBpUVNDKys7CisgICAgICAgICAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaVFTQzsKKyAgICAgICAgfQorCisgICAgICB9ICAgICAvKiBhdCBsZWFzdCBvbmUgb2YgdHdvIGxpbmVzIGlzIDE2ICovCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vblBDVy1Cb2R5IGF0IGNiIDExIGFuZCBhY2NvcmRpbmcgc2lnbiBiaXRzIGFyZSBkZWNvZGVkICovCisKKyAgICB9IC8qIGlmICggY250U2lnbiA9PSAwICkgKi8KKyAgfSAvKiBsb29wIG92ZXIgcmVtYWluaW5nIEJpdHMgaW4gc2VnbWVudCAqLworCisgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisKKyNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCisgICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19TSUdOOworICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fU0lHTjsKKyAgICB9CisjZW5kaWYKKworICB9CisgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGUgcHJlZml4IG9mIGZpcnN0IG9yIHNlY29uZCBlc2NhcGUgc2VxdWVuY2UuIFRoZSBlc2NhcGUgcHJlZml4CisgICAgICAgICAgICAgICAgICBjb25zaXN0cyBvZiBvbmVzLiBUaGUgZm9sbG93aW5nIHplcm8gaXMgYWxzbyBkZWNvZGVkIGhlcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBvdXRwdXQ6ICAgSWYgdGhlIHNpbmdsZSBzZXBhcmF0b3ItemVybyB3aGljaCBmb2xsb3dzIHRoZSBlc2NhcGUtcHJlZml4LW9uZXMgaXMgbm90IHlldCBkZWNvZGVkOgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgJ2VzY2FwZVByZWZpeFVwJyBpbiB3b3JkIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGlzIHVwZGF0ZWQuCisKKyAgICAgICAgICAgICAgICAgIElmIHRoZSBzaW5nbGUgc2VwYXJhdG9yLXplcm8gd2hpY2ggZm9sbG93cyB0aGUgZXNjYXBlLXByZWZpeC1vbmVzIGlzIGRlY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIFR3byB1cGRhdGVkIHZhbHVlcyAnZXNjYXBlUHJlZml4VXAnIGFuZCAnZXNjYXBlUHJlZml4RG93bicgaW4gd29yZAorICAgICAgICAgICAgICAgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XS4gVGhpcyBTdGF0ZSBpcyBmaW5pc2hlZC4gU3dpdGNoIHRvIG5leHQgc3RhdGUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKK3sKKyAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOworICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBVU0hPUlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIFVTSE9SVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIFVDSEFSICAgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAgICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICAgIHNlZ21lbnRPZmZzZXQ7CisgIFVJTlQgICAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgVUlOVCAgICBjb2Rld29yZE9mZnNldDsKKyAgVUNIQVIgICBjYXJyeUJpdDsKKyAgVUlOVCAgICBlc2NhcGVQcmVmaXhVcDsKKyAgU0NIQVIgICpwU3RhOworCisgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOworICBjb2Rld29yZE9mZnNldCAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CisKKyAgZXNjYXBlUHJlZml4VXAgID0gKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX1VQKSA+PiBMU0JfRVNDQVBFX1BSRUZJWF9VUDsKKworCisgIC8qIGRlY29kZSBlc2NhcGUgcHJlZml4ICovCisgIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKKworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisKKyAgICAvKiBjb3VudCBvbmVzIGFuZCBzdG9yZSBzdW0gaW4gZXNjYXBlUHJlZml4VXAgKi8KKyAgICBpZiAoIGNhcnJ5Qml0ID09IDEgKSB7CisgICAgICBlc2NhcGVQcmVmaXhVcCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGNvbnRlciBmb3Igb25lcyAqLworCisgICAgICAvKiBzdG9yZSB1cGRhdGVkIGNvdW50ZXIgaW4gc2lkZWluZm8gb2YgY3VycmVudCBjb2Rld29yZCAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4VXAgKi8KKyAgICAgIGVzY2FwZVByZWZpeFVwIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PSBlc2NhcGVQcmVmaXhVcDsgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPj49IExTQl9FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGJhY2sgZG93biAqLworICAgIH0KKyAgICBlbHNlIHsgIC8qIHNlcGFyYXRvciBbemVyb10gcmVhY2hlZCAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisgICAgICBlc2NhcGVQcmVmaXhVcCArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgZXNjYXBlX3NlcGFyYXRvciAnMCcgYXBwZWFycywgYWRkIDQgYW5kID09PiBicmVhayAqLworCisgICAgICAvKiBzdG9yZSBlc2NhcGVQcmVmaXhVcCBpbiBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSBhdCBiaXQgcG9zaXRpb24gZXNjYXBlUHJlZml4VXAgKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9IH5NQVNLX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeFVwICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgdG8gY29ycmVjdCBwb3NpdGlvbiAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gfD0gZXNjYXBlUHJlZml4VXA7ICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4VXAgKi8KKyAgICAgIGVzY2FwZVByZWZpeFVwID4+PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCBiYWNrIGRvd24gKi8KKworICAgICAgLyogc3RvcmUgZXNjYXBlUHJlZml4VXAgaW4gcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gYXQgYml0IHBvc2l0aW9uIGVzY2FwZVByZWZpeERvd24gKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9IH5NQVNLX0VTQ0FQRV9QUkVGSVhfRE9XTjsgICAgICAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeERvd24gKi8KKyAgICAgIGVzY2FwZVByZWZpeFVwIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PSBlc2NhcGVQcmVmaXhVcDsgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhEb3duICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgYmFjayBkb3duICovCisKKyAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgbmV4dCBzdGF0ZSAqLworICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKworI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKKyAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVg7CisgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19FU0NfUFJFRklYOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogRGVjb2RlIGVzY2FwZVdvcmQgb2YgZXNjYXBlIHNlcXVlbmNlLiBJZiB0aGUgZXNjYXBlIHNlcXVlbmNlIGlzIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHksIGFzc2VtYmxlIHF1YW50aXplZC1zcGVjdHJhbC1lc2NhcGUtY29lZmZpY2llbnQgYW5kIHJlcGxhY2UgdGhlCisgICAgICAgICAgICAgICAgICBwcmV2aW91cyBkZWNvZGVkIDE2IGJ5IHRoZSBuZXcgdmFsdWUuCisgICAgICAgICAgICAgICAgICBUZXN0IGZsYWdCLiBJZiBmbGFnQiBpcyBzZXQsIHRoZSBzZWNvbmQgZXNjYXBlIHNlcXVlbmNlIG11c3QgYmUgZGVjb2RlZC4gSWYKKyAgICAgICAgICAgICAgICAgIGZsYWdCIGlzIG5vdCBzZXQsIHRoZSBjb2Rld29yZCBpcyBkZWNvZGVkIGFuZCB0aGUgc3RhdGUgbWFjaGluZSBpcyBzd2l0Y2hlZAorICAgICAgICAgICAgICAgICAgb2ZmLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgb3V0cHV0OiAgIFR3byBsaW5lcyB3aXRoIHZhbGlkIHNpZ24uIEF0IGxlYXN0IG9uZSBvZiBib3RoIGxpbmVzIGhhcyBnb3QgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAgIHZhbHVlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcmV0dXJuOiAgIDAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfV09SRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoreworICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7CisgIFNDSEFSICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIFVTSE9SVCAgICAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgVVNIT1JUICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgICAgICByZWFkRGlyZWN0aW9uOworICBVSU5UICAgICAgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVJTlQgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgICAgICAgc2VnbWVudE9mZnNldDsKKworICBGSVhQX0RCTCAgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgICAgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICAgICAgKnBFc2NhcGVTZXF1ZW5jZUluZm87CisgIFVJTlQgICAgICAgY29kZXdvcmRPZmZzZXQ7CisKKyAgVUlOVCAgICAgICBlc2NhcGVXb3JkOworICBVSU5UICAgICAgIGVzY2FwZVByZWZpeERvd247CisgIFVJTlQgICAgICAgZXNjYXBlUHJlZml4VXA7CisgIFVDSEFSICAgICAgY2FycnlCaXQ7CisgIFVJTlQgICAgICAgaVFTQzsKKyAgSU5UICAgICAgICBzaWduOworICBVSU5UICAgICAgIGZsYWdBOworICBVSU5UICAgICAgIGZsYWdCOworICBTQ0hBUiAgICAgKnBTdGE7CisKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworCisgIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcFN0YSAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworCisgIGVzY2FwZVdvcmQgICAgICAgPSAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJiBNQVNLX0VTQ0FQRV9XT1JEOworICBlc2NhcGVQcmVmaXhEb3duID0gKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX0RPV04pID4+IExTQl9FU0NBUEVfUFJFRklYX0RPV047CisKKworICAvKiBkZWNvZGUgZXNjYXBlIHdvcmQgKi8KKyAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgeworCisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKworICAgIC8qIGJ1aWxkIGVzY2FwZSB3b3JkICovCisgICAgZXNjYXBlV29yZCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBzaGlmdCBwcmV2aW91cyBkZWNvZGVkIHBhcnQgb2YgZXNjYXBlV29yZCBieSBvbiBiaXQgKi8KKyAgICBlc2NhcGVXb3JkID0gZXNjYXBlV29yZCB8IGNhcnJ5Qml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NlbWJsZSBlc2NhcGUgd29yZCBieSBiaXR3aXNlIG9yICovCisKKyAgICAvKiBkZWNyZW1lbnQgY291bnRlciBmb3IgbGVuZ3RoIG9mIGVzY2FwZSB3b3JkIGJlY2F1c2Ugb25lIG1vcmUgYml0IHdhcyBkZWNvZGVkICovCisgICAgZXNjYXBlUHJlZml4RG93biAtPSAxOworCisgICAgLyogc3RvcmUgdXBkYXRlZCBlc2NhcGVQcmVmaXhEb3duICovCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhEb3duICovCisgICAgZXNjYXBlUHJlZml4RG93biA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgdG8gY29ycmVjdCBwb3NpdGlvbiAqLworICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeERvd247ICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4RG93biAqLworICAgIGVzY2FwZVByZWZpeERvd24gPj49IExTQl9FU0NBUEVfUFJFRklYX0RPV047ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGJhY2sgKi8KKworCisgICAgLyogc3RvcmUgdXBkYXRlZCBlc2NhcGVXb3JkICovCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1dPUkQ7ICAgICAgICAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVXb3JkICovCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gfD0gZXNjYXBlV29yZDsgICAgICAgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVXb3JkICovCisKKworICAgIGlmICggZXNjYXBlUHJlZml4RG93biA9PSAwICkgeworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisKKyAgICAgIC8qIGVzY2FwZSBzZXF1ZW5jZSBkZWNvZGVkLiBBc3NlbWJsZSBlc2NhcGUtbGluZSBhbmQgcmVwbGFjZSBvcmlnaW5hbCBsaW5lICovCisKKyAgICAgIC8qIHN0ZXAgMCAqLworICAgICAgLyogZGVyaXZlIHNpZ24gKi8KKyAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CisgICAgICBzaWduID0gKHBSZXN1bHRCYXNlW2lRU0NdID49IChGSVhQX0RCTCkwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBzaWduIG9mIGVzY2FwZSB2YWx1ZSAxNiAqLworCisgICAgICAvKiBzdGVwIDEgKi8KKyAgICAgIC8qIGdldCBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPSAocEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJiBNQVNLX0VTQ0FQRV9QUkVGSVhfVVApID4+IExTQl9FU0NBUEVfUFJFRklYX1VQOworCisgICAgICAvKiBzdGVwIDIgKi8KKyAgICAgIC8qIGNhbGN1bGF0ZSBlc2NhcGUgdmFsdWUgKi8KKyAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0gKEZJWFBfREJMKShzaWduICogKCgoSU5UKSAxIDw8IGVzY2FwZVByZWZpeFVwKSArIGVzY2FwZVdvcmQpKTsKKworICAgICAgLyogZ2V0IGJvdGggZmxhZ3MgZnJvbSBzaWRlaW5mbyAoZmxhZ3MgYXJlIG5vdCBzaGlmdGVkIHRvIHRoZSBsc2ItcG9zaXRpb24pICovCisgICAgICBmbGFnQSA9IHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19GTEFHX0E7CisgICAgICBmbGFnQiA9IHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19GTEFHX0I7CisKKyAgICAgIC8qIHN0ZXAgMyAqLworICAgICAgLyogY2xlYXIgdGhlIHdob2xlIGVzY2FwZSBzaWRlaW5mbyB3b3JkICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSA9IDA7CisKKyAgICAgIC8qIGNoYW5nZSBzdGF0ZSBpbiBkZXBlbmRlbmNlIG9mIGZsYWcgZmxhZ0IgKi8KKyAgICAgIGlmICggZmxhZ0EgIT0gMCApIHsKKyAgICAgICAgLyogZmlyc3QgZXNjYXBlIHNlcXVlbmNlIGRlY29kZWQ7IHByZXZpb3VzIGRlY29kZWQgMTYgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdmFsaWQgbGluZSAqLworCisgICAgICAgIC8qIGNsZWFyIGZsYWdBIGluIHNpZGVpbmZvIHdvcmQgYmVjYXVzZSB0aGlzIGVzY2FwZSBzZXF1ZW5jZSBoYXMgYWxyZWFkeSBiZWVkIGRlY29kZWQgKi8KKyAgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRkxBR19BOworCisgICAgICAgIGlmICggZmxhZ0IgPT0gMCApIHsKKyAgICAgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiB1cGRhdGVkIHBvaW50ZXIgdG8gbmV4dCBhbmQgbGFzdCAxNiAqLworICAgICAgICAgIGlRU0MrKzsKKyAgICAgICAgICBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF0gPSBpUVNDOworCisgICAgICAgICAgLyogY2hhbmdlIHN0YXRlICovCisgICAgICAgICAgcFN0YVtjb2Rld29yZE9mZnNldF0gPSBCT0RZX1NJR05fRVNDX19FU0NfUFJFRklYOworICAgICAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9IGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKworI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKKyAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOworICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQ7CisgICAgfQorI2VuZGlmCisgIH0KKworICByZXR1cm4gU1RPUF9USElTX1NUQVRFOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhiYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuaApAQCAtMCwwICsxLDE1MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBEZWZpbmVzIG9mIHN0YXRlLWNvbnN0YW50cywgbWFza3MgYW5kCisgICAgICAgICAgICAgICAgc3RhdGUtcHJvdG90eXBlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9BQUNERUNfSENSU19IXworI2RlZmluZSBfQUFDREVDX0hDUlNfSF8KKworCisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmb3VyIGRpZmZlcmVudCBraW5kcyBvZiB0eXBlcyBvZiBzdGF0ZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICovCisvKiBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyAqLyAgICAgLyogc3RhcnQgICBtaWRkbGU9c2VsZiAgIG5leHQgICBzdG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIFNUT1BfVEhJU19TVEFURSAgICAgICAgICAgICAwICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQk9EWV9PTkxZICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIC8qICAgWCAgICAgICAgICBYICAgICAgICAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBCT0RZX1NJR05fX0JPRFkgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogICBYICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBubyBzaWduXSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEJPRFlfU0lHTl9fU0lHTiAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICBYIFtzdG9wIGlmIHNpZ24gYml0cyBkZWNvZGVkXSAgICAgICAgICAqLworI2RlZmluZSAgQk9EWV9TSUdOX0VTQ19fQk9EWSAgICAgICAgIDQgICAgICAgICAgICAgIC8qICAgWCAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gc2lnbl0gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBCT0RZX1NJR05fRVNDX19TSUdOICAgICAgICAgNSAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBubyBlc2NhcGUgc2VxdWVuY2VdICAgICAgICAgKi8KKyNkZWZpbmUgIEJPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggICA2ICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgWCAgICAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgICAgIDcgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgYWJzKHNlY29uZCBxc2MpICE9IDE2XSAgICAgICovCisKKy8qIGV4YW1wbGVzOiAqLworCisvKiBCT0RZX09OTFkgICAgICAgICAgICAgICAgICAgIG1lYW5zIG9ubHkgdGhlIGNvZGV3b3JkIGJvZHkgd2lsbCBiZSBkZWNvZGVkOyBubyBzaWduIGJpdHMgd2lsbCBmb2xsb3cgYW5kIG5vIGVzY2FwZXNlcXVlbmNlIHdpbGwgZm9sbG93ICovCisKKy8qIEJPRFlfU0lHTl9fQk9EWSAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgY29kZXdvcmQgY29uc2lzdHMgb2YgdHdvIHBhcnRzOyBib2R5IGFuZCBzaWduIHBhcnQuIFRoZSBwYXJ0ICdfX0JPRFknIGFmdGVyIHRoZSB0d28gdW5kZXJzY29yZXMgc2hvd3MgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgYml0cyB3aGljaCBhcmUgY3VycmVudGx5IGRlY29kZWQgYmVsb25nIHRvIHRoZSAnX19CT0RZJyBvZiB0aGUgY29kZXdvcmQgYW5kIG5vdCB0byB0aGUgc2lnbiBwYXJ0LiAqLworCisvKiBCT0RZX1NJR05fRVNDX19FU0NfUEIgICAgICAgIG1lYW5zIHRoYXQgdGhlIGNvZGV3b3JkIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOyBib2R5LCBzaWduIGFuZCAoaGVyZTogdHdvKSBlc2NhcGUgc2VxdWVuY2VzOyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCA9IFByZWZpeCA9IG9uZXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyA9IEVzY2FwZSBXb3JkICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPSBmaXJzdCBwb3NzaWJsZSAob2YgdHdvKSBFc2NhcGUgc2VxdWVjZXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9IHNlY29uZCBwb3NzaWJsZSAob2YgdHdvKSBFc2NhcGUgc2VxdWVjZXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBhcnQgYWZ0ZXIgdGhlIHR3byB1bmRlcnNjb3JlcyBzaG93cyB0aGF0IHRoZSBjdXJyZW50IGJpdHMgd2hpY2ggYXJlIGRlY29kZWQgYmVsb25nIHRvIHRoZSAnX19FU0NfUEInIC0gcGFydCBvZiB0aGUgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXdvcmQuIFRoYXQgbWVhbnMgdGhlIGJvZHkgYW5kIHRoZSBzaWduIGJpdHMgYXJlIGRlY29kZWQgY29tcGxldGVseSBhbmQgdGhlIGJpdHMgd2hpY2ggYXJlIGRlY29kZWQgbm93IGJlbG9uZyB0byAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXNjYXBlIHNlcXVlbmNlIFtQID0gcHJlZml4OyBCPXNlY29uZCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2VdICovCisKKworI2RlZmluZSAgIE1TQl8zMV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAgICAgICAgICAvKiBtYXNrcyBNU0IgKD0gQml0IDMxKSBpbiBhIDMyIGJpdCB3b3JkICovCisjZGVmaW5lICAgRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSyAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBjYiA+PSAxMSBpcyBkaW1lbnNpb24gMiAqLworI2RlZmluZSAgIEVTQ0FQRV9DT0RFQk9PSyAgICAgICAgICAgICAgICAgICAxMQorCisjZGVmaW5lICAgTUFTS19FU0NBUEVfUFJFRklYX1VQICAgICAgICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgICBMU0JfRVNDQVBFX1BSRUZJWF9VUCAgICAgICAgICAgICAgMTYKKworI2RlZmluZSAgIE1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOICAgICAgICAgICAweDAwMDBGMDAwCisjZGVmaW5lICAgTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTiAgICAgICAgICAgIDEyCisKKyNkZWZpbmUgICBNQVNLX0VTQ0FQRV9XT1JEICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgorI2RlZmluZSAgIE1BU0tfRkxBR19BICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lICAgTUFTS19GTEFHX0IgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworCitleHRlcm4gdm9pZCBEZWNvZGVOb25QQ1dzKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBIX0hDUl9JTkZPIGhIY3IpOworCitVSU5UIEhjcl9TdGF0ZV9CT0RZX09OTFkgICAgICAgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZICAgICAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfV09SRCAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworCisjZW5kaWYgLyogX0FBQ0RFQ19IQ1JTX0hfICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxZWYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwCkBAIC0wLDAgKzEsMzgyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBwZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiB0b29sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY19wbnMuaCIKKworCisjaW5jbHVkZSAiYWFjX3JhbS5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorI2luY2x1ZGUgImJsb2NrLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCisjZGVmaW5lIE5PSVNFX09GRlNFVCA5MCAgICAgICAgICAgLyogY2YuIElTTyAxNDQ5Ni0zIHAuIDE3NSAqLworCisvKiEKKyAgXGJyaWVmIFJlc2V0IEludGVyQ2hhbm5lbCBhbmQgUE5TIGRhdGEKKworICBUaGUgZnVuY3Rpb24gcmVzZXRzIHRoZSBJbnRlckNoYW5uZWwgYW5kIFBOUyBkYXRhCisqLwordm9pZCBDUG5zX1Jlc2V0RGF0YSgKKyAgICBDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhCisgICAgKQoreworICAvKiBBc3NpZ24gcG9pbnRlciBhbHdheXMsIHNpbmNlIHBQbnNEYXRhIGlzIG5vdCBwZXJzaXN0ZW50IGRhdGEgKi8KKyAgcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhID0gcFBuc0ludGVyQ2hhbm5lbERhdGE7CisgIHBQbnNEYXRhLT5QbnNBY3RpdmUgPSAwOworICBwUG5zRGF0YS0+Q3VycmVudEVuZXJneSA9IDA7CisKKyAgRkRLbWVtY2xlYXIocFBuc0RhdGEtPnBuc1VzZWQsKDgqMTYpKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwUG5zSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZCwoOCoxNikqc2l6ZW9mKFVDSEFSKSk7Cit9CisKKy8qIQorICBcYnJpZWYgSW5pdGlhbGl6ZSBQTlMgZGF0YQorCisgIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUE5TIGRhdGEKKyovCit2b2lkIENQbnNfSW5pdFBucygKKyAgICBDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhLAorICAgIElOVCogY3VycmVudFNlZWQsIElOVCogcmFuZG9tU2VlZCkKK3sKKyAgLyogc2F2ZSBwb2ludGVyIHRvIGludGVyIGNoYW5uZWwgZGF0YSAqLworICBwUG5zRGF0YS0+cFBuc0ludGVyQ2hhbm5lbERhdGEgPSBwUG5zSW50ZXJDaGFubmVsRGF0YTsKKworICAvKiB1c2UgcG9pbnRlciBiZWNhdXNlIHNlZWQgaGFzIHRvIGJlCisgICAgIHNhbWUsIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgISAqLworICBwUG5zRGF0YS0+Y3VycmVudFNlZWQgPSBjdXJyZW50U2VlZDsKKyAgcFBuc0RhdGEtPnJhbmRvbVNlZWQgID0gcmFuZG9tU2VlZDsKK30KKworLyohCisgIFxicmllZiBJbmRpY2F0ZXMgaWYgUE5TIGlzIHVzZWQKKworICBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBQTlMgaXMgdXNlZCBvciBub3QKKyAgYWNvcmRkaW5nIHRvIHRoZSBub2lzZSBlbmVyZ3kKKworICBccmV0dXJuICBQTlMgdXNlZAorKi8KK2ludCBDUG5zX0lzUG5zVXNlZCAoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKQoreworICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CisKKyAgcmV0dXJuIHBQbnNEYXRhLT5wbnNVc2VkW3Buc19iYW5kXSAmIChVQ0hBUikxOworfQorCisvKiEKKyAgXGJyaWVmIFNldCBjb3JyZWxhdGlvbgorCisgIFRoZSBmdW5jdGlvbiBhY3RpdmF0ZXMgdGhlIG5vaXNlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGNoYW5uZWwgcGFpcgorKi8KK3ZvaWQgQ1Buc19TZXRDb3JyZWxhdGlvbihDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRvZnBoYXNlKQoreworICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcEludGVyQ2hhbm5lbERhdGEgPSBwUG5zRGF0YS0+cFBuc0ludGVyQ2hhbm5lbERhdGE7CisgIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAqMTYrYmFuZDsKKworICBwSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZFtwbnNfYmFuZF0gPSAob3V0b2ZwaGFzZSkgPyAzIDogMTsKK30KKworLyohCisgIFxicmllZiBJbmRpY2F0ZXMgaWYgY29ycmVsYXRpb24gaXMgdXNlZAorCisgIFRoZSBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgdGhlIG5vaXNlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGNoYW5uZWwgcGFpcgorICBpcyBhY3RpdmF0ZWQKKworICBccmV0dXJuICBQTlMgaXMgY29ycmVsYXRlZAorKi8KK3N0YXRpYworaW50IENQbnNfSXNDb3JyZWxhdGVkKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpCit7CisgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YTsKKyAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOworCisgIHJldHVybiAocEludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWRbcG5zX2JhbmRdICYgMHgwMSkgPyAxIDogMDsKK30KKworLyohCisgIFxicmllZiBJbmRpY2F0ZXMgaWYgY29ycmVsYXRlZCBvdXQgb2YgcGhhc2UgbW9kZSBpcyB1c2VkLgorCisgIFRoZSBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgdGhlIG5vaXNlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGNoYW5uZWwgcGFpcgorICBpcyBhY3RpdmF0ZWQgaW4gb3V0LW9mLXBoYXNlIG1vZGUuCisKKyAgXHJldHVybiAgUE5TIGlzIG91dC1vZi1waGFzZQorKi8KK3N0YXRpYworaW50IENQbnNfSXNPdXRPZlBoYXNlKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpCit7CisgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YTsKKyAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOworCisgIHJldHVybiAocEludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWRbcG5zX2JhbmRdICYgMHgwMikgPyAxIDogMDsKK30KKworLyohCisgIFxicmllZiBSZWFkIFBOUyBpbmZvcm1hdGlvbgorCisgIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgUE5TIGluZm9ybWF0aW9uIGZyb20gdGhlIGJpdHN0cmVhbQorKi8KK3ZvaWQgQ1Buc19SZWFkIChDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiLAorICAgICAgICAgICAgICAgIFNIT1JUICpwU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgVUNIQVIgZ2xvYmFsX2dhaW4sCisgICAgICAgICAgICAgICAgaW50IGJhbmQsCisgICAgICAgICAgICAgICAgaW50IGdyb3VwIC8qID0gMCAqLykKK3sKKyAgaW50IGRlbHRhIDsKKyAgVUlOVCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CisKKyAgaWYgKHBQbnNEYXRhLT5QbnNBY3RpdmUpIHsKKyAgICAvKiBOZXh0IFBOUyBiYW5kIGNhc2UgKi8KKyAgICBkZWx0YSA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZCAoYnMsIGhjYikgLSA2MDsKKyAgfSBlbHNlIHsKKyAgICAvKiBGaXJzdCBQTlMgYmFuZCBjYXNlICovCisgICAgaW50IG5vaXNlU3RhcnRWYWx1ZSA9IEZES3JlYWRCaXRzKGJzLDkpOworCisgICAgZGVsdGEgPSBub2lzZVN0YXJ0VmFsdWUgLSAyNTYgOworICAgIHBQbnNEYXRhLT5QbnNBY3RpdmUgPSAxOworICAgIHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5ID0gZ2xvYmFsX2dhaW4gLSBOT0lTRV9PRkZTRVQ7CisgIH0KKworICBwUG5zRGF0YS0+Q3VycmVudEVuZXJneSArPSBkZWx0YSA7CisgIHBTY2FsZUZhY3RvcltwbnNfYmFuZF0gPSBwUG5zRGF0YS0+Q3VycmVudEVuZXJneTsKKworICBwUG5zRGF0YS0+cG5zVXNlZFtwbnNfYmFuZF0gPSAxOworfQorCisKKy8qKgorICogXGJyaWVmIEdlbmVyYXRlIGEgdmVjdG9yIG9mIG5vaXNlIG9mIGdpdmVuIGxlbmd0aC4gVGhlIG5vaXNlIHZhbHVlcyBhcmUKKyAqICAgICAgICBzY2FsZWQgaW4gb3JkZXIgdG8geWllbGQgYSBub2lzZSBlbmVyZ3kgb2YgMS4wCisgKiBccGFyYW0gc3BlYyBwb2ludGVyIHRvIHdlcmUgdGhlIG5vaXNlIHZhbHVlcyB3aWxsIGJlIHdyaXR0ZW4gdG8uCisgKiBccGFyYW0gc2l6ZSBhbW91bnQgb2Ygbm9pc2UgdmFsdWVzIHRvIGJlIGdlbmVyYXRlZC4KKyAqIFxwYXJhbSBwUmFuZG9tU3RhdGUgcG9pbnRlciB0byB0aGUgc3RhdGUgb2YgdGhlIHJhbmRvbSBnZW5lcmF0b3IgYmVpbmcgdXNlZC4KKyAqIFxyZXR1cm4gZXhwb25lbnQgb2YgZ2VuZXJhdGVkIG5vaXNlIHZlY3Rvci4KKyAqLworc3RhdGljIGludCBHZW5lcmF0ZVJhbmRvbVZlY3RvciAoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwUmFuZG9tU3RhdGUpCit7CisgIGludCBpLCBpbnZOcmdfZSA9IDAsIG5yZ19lID0gMDsKKyAgRklYUF9EQkwgaW52TnJnX20sIG5yZ19tID0gRkwyRlhDT05TVF9EQkwoMC4wZikgOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyID0gc3BlYzsKKyAgaW50IHJhbmRvbVN0YXRlID0gKnBSYW5kb21TdGF0ZTsKKworI2RlZmluZSBHRU5fTk9JU0VfTlJHX1NDQUxFIDcKKworICAvKiBHZW5lcmF0ZSBub2lzZSBhbmQgY2FsY3VsYXRlIGVuZXJneS4gKi8KKyAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQorICB7CisgICAgcmFuZG9tU3RhdGUgPSAoMTY2NDUyNUwgKiByYW5kb21TdGF0ZSkgKyAxMDEzOTA0MjIzTDsgLy8gTnVtZXJpY2FsIFJlY2lwZXMKKyAgICBucmdfbSA9IGZQb3cyQWRkRGl2MihucmdfbSwgKEZJWFBfREJMKXJhbmRvbVN0YXRlPj5HRU5fTk9JU0VfTlJHX1NDQUxFKTsKKyAgICAqcHRyKysgPSAoRklYUF9EQkwpcmFuZG9tU3RhdGU7CisgIH0KKyAgbnJnX2UgPSBHRU5fTk9JU0VfTlJHX1NDQUxFKjIgKyAxOworCisgIC8qIHdlaWdodCBub2lzZSB3aXRoID0gMSAvIHNxcnRfbnJnOyAqLworICBpbnZOcmdfbSA9IGludlNxcnROb3JtMihucmdfbTw8MSwgJmludk5yZ19lKTsKKyAgaW52TnJnX2UgKz0gLSgobnJnX2UtMSk+PjEpOworCisgIGZvciAoaT1zaXplOyBpLS07ICkKKyAgeworICAgIHNwZWNbaV0gPSBmTXVsdChzcGVjW2ldLCBpbnZOcmdfbSk7CisgIH0KKworICAvKiBTdG9yZSByYW5kb20gc3RhdGUgKi8KKyAgKnBSYW5kb21TdGF0ZSA9IHJhbmRvbVN0YXRlOworCisgIHJldHVybiBpbnZOcmdfZTsKK30KKworc3RhdGljIHZvaWQgU2NhbGVCYW5kIChGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlYywgaW50IHNpemUsIGludCBzY2FsZUZhY3RvciwgaW50IHNwZWNTY2FsZSwgaW50IG5vaXNlX2UsIGludCBvdXRfb2ZfcGhhc2UpCit7CisgIGludCBpLCBzaGlmdCwgc2ZFeHBvbmVudDsKKyAgRklYUF9EQkwgc2ZNYXRpc3NhOworCisgIC8qIEdldCBnYWluIGZyb20gc2NhbGUgZmFjdG9yIHZhbHVlID0gMl4oc2NhbGVGYWN0b3IgKiAwLjI1KSAqLworICBzZk1hdGlzc2EgPSBNYW50aXNzYVRhYmxlW3NjYWxlRmFjdG9yICYgMHgwM11bMF07CisgIC8qIHNmRXhwb25lbnQgPSAoc2NhbGVGYWN0b3IgPj4gMikgKyBFeHBvbmVudFRhYmxlW3NjYWxlRmFjdG9yICYgMHgwM11bMF07ICovCisgIC8qIE5vdGU6ICBFeHBvbmVudFRhYmxlW3NjYWxlRmFjdG9yICYgMHgwM11bMF0gaXMgYWx3YXlzIDEuICovCisgIHNmRXhwb25lbnQgPSAoc2NhbGVGYWN0b3IgPj4gMikgKyAxOworCisgIGlmIChvdXRfb2ZfcGhhc2UgIT0gMCkgeworICAgIHNmTWF0aXNzYSA9IC1zZk1hdGlzc2E7CisgIH0KKworICAvKiArMSBiZWNhdXNlIG9mIGZNdWx0RGl2MiBiZWxvdy4gKi8KKyAgc2hpZnQgPSBzZkV4cG9uZW50IC0gc3BlY1NjYWxlICsgMSArIG5vaXNlX2U7CisKKyAgLyogQXBwbHkgZ2FpbiB0byBub2lzZSB2YWx1ZXMgKi8KKyAgaWYgKHNoaWZ0Pj0wKSB7CisgICAgc2hpZnQgPSBmaXhNaW4oIHNoaWZ0LCBERlJBQ1RfQklUUy0xICk7CisgICAgZm9yIChpID0gc2l6ZSA7IGktLSAhPSAwOyApIHsKKyAgICAgIHNwZWMgW2ldID0gZk11bHREaXYyIChzcGVjIFtpXSwgc2ZNYXRpc3NhKSA8PCBzaGlmdDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2hpZnQgPSBmaXhNaW4oIC1zaGlmdCwgREZSQUNUX0JJVFMtMSApOworICAgIGZvciAoaSA9IHNpemUgOyBpLS0gIT0gMDsgKSB7CisgICAgICBzcGVjIFtpXSA9IGZNdWx0RGl2MiAoc3BlYyBbaV0sIHNmTWF0aXNzYSkgPj4gc2hpZnQ7CisgICAgfQorICB9Cit9CisKKworLyohCisgIFxicmllZiBBcHBseSBQTlMKKworICBUaGUgZnVuY3Rpb24gYXBwbGllcyBQTlMgKGkuZS4gaXQgZ2VuZXJhdGVzIG5vaXNlKSBvbiB0aGUgYmFuZHMKKyAgZmxhZ2dlZCBhcyBub2lzeSBiYW5kcworCisqLwordm9pZCBDUG5zX0FwcGx5IChjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgICAgKnBTcGVjU2NhbGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICAgICpwU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwpCit7CisgIGlmIChwUG5zRGF0YS0+UG5zQWN0aXZlKSB7CisgICAgY29uc3Qgc2hvcnQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworCisgICAgaW50IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChwSWNzSW5mbyk7CisKKyAgICBmb3IgKGludCB3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKTsgZ3JvdXArKykgeworICAgICAgZm9yIChpbnQgZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKHBJY3NJbmZvLCBncm91cCk7IGdyb3Vwd2luKyssIHdpbmRvdysrKSB7CisgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSA9IFNQRUMocFNwZWN0cnVtLCB3aW5kb3csIGdyYW51bGVMZW5ndGgpOworCisgICAgICAgIGZvciAoaW50IGJhbmQgPSAwIDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgICAgaWYgKENQbnNfSXNQbnNVc2VkIChwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpKSB7CisgICAgICAgICAgICBVSU5UIHBuc19iYW5kID0gZ3JvdXAqMTYrYmFuZDsKKworICAgICAgICAgICAgaW50IGJhbmRXaWR0aCA9IEJhbmRPZmZzZXRzIFtiYW5kICsgMV0gLSBCYW5kT2Zmc2V0cyBbYmFuZF0gOworICAgICAgICAgICAgaW50IG5vaXNlX2U7CisKKyAgICAgICAgICAgIEZES19BU1NFUlQoYmFuZFdpZHRoID49IDApOworCisgICAgICAgICAgICBpZiAoY2hhbm5lbCA+IDAgJiYgQ1Buc19Jc0NvcnJlbGF0ZWQocFBuc0RhdGEsIGdyb3VwLCBiYW5kKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbm9pc2VfZSA9IEdlbmVyYXRlUmFuZG9tVmVjdG9yIChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzIFtiYW5kXSwgYmFuZFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQbnNEYXRhLT5yYW5kb21TZWVkIFtwbnNfYmFuZF0pIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcFBuc0RhdGEtPnJhbmRvbVNlZWQgW3Buc19iYW5kXSA9ICpwUG5zRGF0YS0+Y3VycmVudFNlZWQgOworCisgICAgICAgICAgICAgIG5vaXNlX2UgPSBHZW5lcmF0ZVJhbmRvbVZlY3RvciAoc3BlY3RydW0gKyBCYW5kT2Zmc2V0cyBbYmFuZF0sIGJhbmRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbnNEYXRhLT5jdXJyZW50U2VlZCkgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb3V0T2ZQaGFzZSAgPSBDUG5zX0lzT3V0T2ZQaGFzZSAocFBuc0RhdGEsIGdyb3VwLCBiYW5kKTsKKworICAgICAgICAgICAgU2NhbGVCYW5kIChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzIFtiYW5kXSwgYmFuZFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBwU2NhbGVGYWN0b3JbcG5zX2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICBwU3BlY1NjYWxlW3dpbmRvd10sIG5vaXNlX2UsIG91dE9mUGhhc2UpIDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzliZGNiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5oCkBAIC0wLDAgKzEsMTIwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBwZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiB0b29sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQTlNfSAorI2RlZmluZSBQTlNfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisKKyNkZWZpbmUgTk9fT0ZCQU5EUyAoKDgqMTYpKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGNvcnJlbGF0ZWRbTk9fT0ZCQU5EU107Cit9IENQbnNJbnRlckNoYW5uZWxEYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YTsKKyAgVUNIQVIgIHBuc1VzZWRbTk9fT0ZCQU5EU107CisgIGludCAgICBDdXJyZW50RW5lcmd5OworICBVQ0hBUiAgUG5zQWN0aXZlOworICBJTlQgICAqY3VycmVudFNlZWQ7CisgIElOVCAgICpyYW5kb21TZWVkOworfSBDUG5zRGF0YTsKKwordm9pZCBDUG5zX0luaXRQbnMgKCBDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgSU5UKiBjdXJyZW50U2VlZCwKKyAgICAgICAgICAgICAgICAgICAgSU5UKiByYW5kb21TZWVkICk7CisKK3ZvaWQgQ1Buc19SZXNldERhdGEgKCBDUG5zRGF0YSAqcFBuc0RhdGEsIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSApOworCisKKyNlbmRpZiAvKiAjaWZuZGVmIFBOU19IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmYwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcApAQCAtMCwwICsxLDQxMiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogdGVtcG9yYWwgbm9pc2Ugc2hhcGluZyB0b29sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY190bnMuaCIKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCisKKworCisvKiEKKyAgXGJyaWVmIFJlc2V0IHRucyBkYXRhCisKKyAgVGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgdG5zIGRhdGEKKworICBccmV0dXJuICBub25lCisqLwordm9pZCBDVG5zX1Jlc2V0KENUbnNEYXRhICpwVG5zRGF0YSkKK3sKKyAgLyogTm90ZTogdGhlIGZvbGxvd2luZyBGREttZW1jbGVhciBzaG91bGQgbm90IGJlIHJlcXVpcmVkLiAqLworICBGREttZW1jbGVhcihwVG5zRGF0YS0+RmlsdGVyLCBUTlNfTUFYX1dJTkRPV1MqVE5TX01BWElNVU1fRklMVEVSUypzaXplb2YoQ0ZpbHRlcikpOworICBGREttZW1jbGVhcihwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzLCBUTlNfTUFYX1dJTkRPV1Mqc2l6ZW9mKFVDSEFSKSk7CisgIHBUbnNEYXRhLT5EYXRhUHJlc2VudCA9IDA7CisgIHBUbnNEYXRhLT5BY3RpdmUgPSAwOworfQorCit2b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgICAgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhKSAgICAgICAgIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBjaGFubmVsIGluZm8gKi8KK3sKKyAgcFRuc0RhdGEtPkRhdGFQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKK30KKworLyohCisgIFxicmllZiBSZWFkIHRucyBkYXRhIGZyb20gYml0c3RyZWFtCisKKyAgVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBlbGVtZW50cyBmb3IgdG5zIGZyb20KKyAgdGhlIGJpdHN0cmVhbS4KKworICBccmV0dXJuICBub25lCisqLworQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKK3sKKyAgVUNIQVIgbl9maWx0LG9yZGVyOworICBVQ0hBUiBsZW5ndGgsY29lZl9yZXMsY29lZl9jb21wcmVzczsKKyAgVUNIQVIgd2luZG93OworICBVQ0hBUiB3aW5zX3Blcl9mcmFtZSA9IEdldFdpbmRvd3NQZXJGcmFtZShwSWNzSW5mbyk7CisgIFVDSEFSIGlzTG9uZ0ZsYWcgPSBJc0xvbmdCbG9jayhwSWNzSW5mbyk7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBpZiAoIXBUbnNEYXRhLT5EYXRhUHJlc2VudCkgeworICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgfQorCisgIGZvciAod2luZG93ID0gMDsgd2luZG93IDwgd2luc19wZXJfZnJhbWU7IHdpbmRvdysrKQorICB7CisgICAgcFRuc0RhdGEtPk51bWJlck9mRmlsdGVyc1t3aW5kb3ddID0gbl9maWx0ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDIgOiAxKTsKKworICAgIGlmIChwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd10gPiBUTlNfTUFYSU1VTV9GSUxURVJTKXsKKyAgICAgICAgcFRuc0RhdGEtPk51bWJlck9mRmlsdGVyc1t3aW5kb3ddID0gbl9maWx0ID0gVE5TX01BWElNVU1fRklMVEVSUzsKKyAgICB9CisKKyAgICBpZiAobl9maWx0KQorICAgIHsKKyAgICAgIGludCBpbmRleDsKKyAgICAgIFVDSEFSIG5leHRzdG9wYmFuZDsKKworICAgICAgY29lZl9yZXMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworCisgICAgICBuZXh0c3RvcGJhbmQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVG90YWwocEljc0luZm8pOworCisgICAgICBmb3IgKGluZGV4PTA7IGluZGV4IDwgbl9maWx0OyBpbmRleCsrKQorICAgICAgeworICAgICAgICBDRmlsdGVyICpmaWx0ZXIgPSAmcFRuc0RhdGEtPkZpbHRlclt3aW5kb3ddW2luZGV4XTsKKworICAgICAgICBsZW5ndGggPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyA2IDogNCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IG5leHRzdG9wYmFuZCl7CisgICAgICAgICAgbGVuZ3RoID0gbmV4dHN0b3BiYW5kOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyLT5TdGFydEJhbmQgPSBuZXh0c3RvcGJhbmQgLSBsZW5ndGg7CisgICAgICAgIGZpbHRlci0+U3RvcEJhbmQgID0gbmV4dHN0b3BiYW5kOworICAgICAgICBuZXh0c3RvcGJhbmQgPSBmaWx0ZXItPlN0YXJ0QmFuZDsKKworICAgICAgICB7CisgICAgICAgICAgZmlsdGVyLT5PcmRlciA9IG9yZGVyID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDUgOiAzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWx0ZXItPk9yZGVyID4gVE5TX01BWElNVU1fT1JERVIpeworICAgICAgICAgIGZpbHRlci0+T3JkZXIgPSBvcmRlciA9IFROU19NQVhJTVVNX09SREVSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9yZGVyKQorICAgICAgICB7CisgICAgICAgICAgVUNIQVIgY29lZixzX21hc2s7CisgICAgICAgICAgVUNIQVIgaTsKKyAgICAgICAgICBTQ0hBUiBuX21hc2s7CisgICAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIHNnbl9tYXNrW10gPSB7ICAweDIsICAweDQsICAweDggfTsKKyAgICAgICAgICBzdGF0aWMgY29uc3QgU0NIQVIgbmVnX21hc2tbXSA9IHsgfjB4MywgfjB4NywgfjB4RiB9OworCisgICAgICAgICAgZmlsdGVyLT5EaXJlY3Rpb24gPSBGREtyZWFkQml0cyhicywxKSA/IC0xIDogMTsKKworICAgICAgICAgIGNvZWZfY29tcHJlc3MgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworCisgICAgICAgICAgZmlsdGVyLT5SZXNvbHV0aW9uID0gY29lZl9yZXMgKyAzOworCisgICAgICAgICAgc19tYXNrID0gc2duX21hc2tbY29lZl9yZXMgKyAxIC0gY29lZl9jb21wcmVzc107CisgICAgICAgICAgbl9tYXNrID0gbmVnX21hc2tbY29lZl9yZXMgKyAxIC0gY29lZl9jb21wcmVzc107CisKKyAgICAgICAgICBmb3IgKGk9MDsgaSA8IG9yZGVyOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgY29lZiA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsZmlsdGVyLT5SZXNvbHV0aW9uIC0gY29lZl9jb21wcmVzcyk7CisgICAgICAgICAgICBmaWx0ZXItPkNvZWZmW2ldID0gKGNvZWYgJiBzX21hc2spID8gKGNvZWYgfCBuX21hc2spIDogY29lZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwVG5zRGF0YS0+QWN0aXZlID0gMTsKKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKworc3RhdGljIHZvaWQgQ1Ruc19GaWx0ZXIgKEZJWFBfREJMICpzcGVjLCBpbnQgc2l6ZSwgaW50IGluYywgRklYUF9UQ0MgY29lZmYgW10sIGludCBvcmRlcikKK3sKKyAgLy8gLSBTaW1wbGUgYWxsLXBvbGUgZmlsdGVyIG9mIG9yZGVyICJvcmRlciIgZGVmaW5lZCBieQorICAvLyAgIHkobikgPSAgeChuKSAtIGEoMikqeShuLTEpIC0gLi4uIC0gYShvcmRlcisxKSp5KG4tb3JkZXIpCisgIC8vCisgIC8vIC0gVGhlIHN0YXRlIHZhcmlhYmxlcyBvZiB0aGUgZmlsdGVyIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGV2ZXJ5IHRpbWUKKyAgLy8KKyAgLy8gLSBUaGUgb3V0cHV0IGRhdGEgaXMgd3JpdHRlbiBvdmVyIHRoZSBpbnB1dCBkYXRhICgiaW4tcGxhY2Ugb3BlcmF0aW9uIikKKyAgLy8KKyAgLy8gLSBBbiBpbnB1dCB2ZWN0b3Igb2YgInNpemUiIHNhbXBsZXMgaXMgcHJvY2Vzc2VkIGFuZCB0aGUgaW5kZXggaW5jcmVtZW50CisgIC8vICAgdG8gdGhlIG5leHQgZGF0YSBzYW1wbGUgaXMgZ2l2ZW4gYnkgImluYyIKKworICBpbnQgaSxqLE47CisgIEZJWFBfREJMICpwU3BlYzsKKyAgRklYUF9EQkwgbWF4VmFsPUZMMkZYQ09OU1RfREJMKDAuMCk7CisgIElOVCBzOworCisgIEZES19BU1NFUlQob3JkZXIgPD0gVE5TX01BWElNVU1fT1JERVIpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3RhdGUsIEZJWFBfREJMLCBUTlNfTUFYSU1VTV9PUkRFUik7CisgIEZES21lbWNsZWFyKHN0YXRlLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKKworICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLGZpeHBfYWJzKHNwZWNbaV0pKTsKKyAgfQorCisgIGlmICggbWF4VmFsID4gRkwyRlhDT05TVF9EQkwoMC4wMzEyNSowLjcwNzEwNjc4MTE4KSApCisgICAgcyA9IGZpeE1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS02LDApOworICBlbHNlCisgICAgcyA9IGZpeE1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS01LDApOworCisgIHMgPSBmaXhNaW4ocywyKTsKKyAgcyA9IHMtMTsKKworICBpZiAoaW5jID09IC0xKQorICAgIHBTcGVjID0gJnNwZWNbc2l6ZSAtIDFdOworICBlbHNlCisgICAgcFNwZWMgPSAmc3BlY1swXTsKKworICBGSVhQX1RDQyAqcENvZWZmOworCisjZGVmaW5lIEZJUlNUX1BBUlRfRkxUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklYUF9EQkwgeCwgKnBTdGF0ZSA9IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcENvZWZmID0gY29lZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB4ID0gKHBTcGVjIFswXT4+MSkgKyBmTXVsdERpdjIgKCpwQ29lZmYrKywgcFN0YXRlIFswXSkgOyAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB4ID0gKHBTcGVjIFswXTw8cykgKyBmTXVsdERpdjIgKCpwQ29lZmYrKywgcFN0YXRlIFswXSkgOworCisjZGVmaW5lIElOTkVSX0ZMVFJfSU5MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB4ID0gZk11bHRBZGREaXYyICh4LCAqcENvZWZmLCBwU3RhdGUgWzFdKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwU3RhdGUgWzBdID0gcFN0YXRlIFsxXSAtIChmTXVsdERpdjIgKCpwQ29lZmYrKywgeCkgPDwyKSA7ICAgICBcCisgICAgICBwU3RhdGUrKzsKKworI2RlZmluZSBMQVNUX1BBUlRfRkxUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqcFNwZWMgPSB4IDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqcFNwZWMgPSB4ID4+IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnBTdGF0ZSA9KC14KSA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcFNwZWMgICArPSBpbmMgOworCisKKyAgIGlmIChvcmRlcj44KQorICAgeworICAgICAgTiA9IChvcmRlci0xKSY3OworCisgICAgICBmb3IgKGkgPSBzaXplIDsgaSAhPSAwIDsgaS0tKQorICAgICAgeworICAgICAgICBGSVJTVF9QQVJUX0ZMVFIKKworICAgICAgICBmb3IgKGogPSBOOyBqID4gMCA7IGotLSkgeyBJTk5FUl9GTFRSX0lOTElORSB9CisKKyAgICAgICAgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUKKyAgICAgICAgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUKKworICAgICAgICBMQVNUX1BBUlRfRkxUUgorICAgICAgfQorCisgICB9IGVsc2UgaWYgKG9yZGVyPjQpIHsKKworICAgICAgTiA9IChvcmRlci0xKSYzOworCisgICAgICBmb3IgKGkgPSBzaXplIDsgaSAhPSAwIDsgaS0tKQorICAgICAgeworICAgICAgICBGSVJTVF9QQVJUX0ZMVFIKKyAgICAgICAgZm9yIChqID0gTjsgaiA+IDAgOyBqLS0pIHsgSU5ORVJfRkxUUl9JTkxJTkUgfQorCisgICAgICAgIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FCisKKyAgICAgICAgTEFTVF9QQVJUX0ZMVFIKKyAgICAgIH0KKworICAgfSBlbHNlIHsKKworICAgICAgTiA9IG9yZGVyLTE7CisKKyAgICAgIGZvciAoaSA9IHNpemUgOyBpICE9IDAgOyBpLS0pCisgICAgICB7CisgICAgICAgIEZJUlNUX1BBUlRfRkxUUgorCisgICAgICAgIGZvciAoaiA9IE47IGogPiAwIDsgai0tKSB7IElOTkVSX0ZMVFJfSU5MSU5FIH0KKworICAgICAgICBMQVNUX1BBUlRfRkxUUgorICAgICAgfQorICAgfQorCisgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHN0YXRlLCBGSVhQX0RCTCwgVE5TX01BWElNVU1fT1JERVIpOworfQorCisvKiEKKyAgXGJyaWVmIEFwcGx5IHRucyB0byBzcGVjdHJhbCBsaW5lcworCisgIFRoZSBmdW5jdGlvbiBhcHBsaWVzIHRoZSB0bnMgdG8gdGhlIHNwZWN0cnVtLAorCisgIFxyZXR1cm4gIG5vbmUKKyovCit2b2lkIENUbnNfQXBwbHkgKAorICAgICAgICBDVG5zRGF0YSAqUkVTVFJJQ1QgcFRuc0RhdGEsIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBpbmZvICovCisgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgKKyAgICAgICAgKQoreworICBpbnQgd2luZG93LGluZGV4LHN0YXJ0LHN0b3Asc2l6ZTsKKworCisgIGlmIChwVG5zRGF0YS0+QWN0aXZlKQorICB7CisgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKGNvZWZmLCBGSVhQX1RDQywgVE5TX01BWElNVU1fT1JERVIpOworCisgICAgICBmb3IgKHdpbmRvdz0wOyB3aW5kb3cgPCBHZXRXaW5kb3dzUGVyRnJhbWUocEljc0luZm8pOyB3aW5kb3crKykKKyAgICAgIHsKKyAgICAgICAgRklYUF9EQkwgKnBTcGVjdHJ1bSA9IFNQRUMocFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgZ3JhbnVsZUxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleCA8IHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnNbd2luZG93XTsgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgIENGaWx0ZXIgKlJFU1RSSUNUIGZpbHRlciA9ICZwVG5zRGF0YS0+RmlsdGVyW3dpbmRvd11baW5kZXhdOworCisgICAgICAgICAgaWYgKGZpbHRlci0+T3JkZXIgPiAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICBGSVhQX1RDQyAqcENvZWZmOworICAgICAgICAgICAgIGludCB0bnNfbWF4X2JhbmRzOworCisgICAgICAgICAgICAgcENvZWZmID0gJmNvZWZmW2ZpbHRlci0+T3JkZXItMV07CisgICAgICAgICAgICAgaWYgKGZpbHRlci0+UmVzb2x1dGlvbiA9PSAzKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCisgICAgICAgICAgICAgICAgICpwQ29lZmYtLSA9IEZES2FhY0RlY190bnNDb2VmZjNbZmlsdGVyLT5Db2VmZltpXSs0XTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCisgICAgICAgICAgICAgICAgICpwQ29lZmYtLSA9IEZES2FhY0RlY190bnNDb2VmZjRbZmlsdGVyLT5Db2VmZltpXSs4XTsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKKyAgICAgICAgICAgICAgIGNhc2UgNDgwOgorICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0gdG5zX21heF9iYW5kc190YmxfNDgwW3BTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGVJbmRleF07CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MTI6CisgICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgPSB0bnNfbWF4X2JhbmRzX3RibF81MTJbcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4XTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0gR2V0TWF4aW11bVRuc0JhbmRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXgpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBzdGFydCA9IGZpeE1pbiggZml4TWluKGZpbHRlci0+U3RhcnRCYW5kLCB0bnNfbWF4X2JhbmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKHBJY3NJbmZvKSApOworCisgICAgICAgICAgICAgc3RhcnQgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RhcnRdOworCisgICAgICAgICAgICAgc3RvcCA9IGZpeE1pbiggZml4TWluKGZpbHRlci0+U3RvcEJhbmQsIHRuc19tYXhfYmFuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChwSWNzSW5mbykgKTsKKworICAgICAgICAgICAgIHN0b3AgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RvcF07CisKKyAgICAgICAgICAgICBzaXplID0gc3RvcCAtIHN0YXJ0OworCisgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICBDVG5zX0ZpbHRlcigmcFNwZWN0cnVtW3N0YXJ0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci0+RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci0+T3JkZXIgKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChjb2VmZiwgRklYUF9UQ0MsIFROU19NQVhJTVVNX09SREVSKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmggYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyOWQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuaApAQCAtMCwwICsxLDEyNiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogdGVtcG9yYWwgbm9pc2Ugc2hhcGluZyB0b29sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUTlNfSAorI2RlZmluZSBUTlNfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCitlbnVtCit7CisgIFROU19NQVhfV0lORE9XUyA9IDgsICAgIC8qIDggKi8KKyAgVE5TX01BWElNVU1fT1JERVIgICA9IDIwLCAgLyogMTIgZm9yIEFBQy1MQyBhbmQgQUFDLVNTUi4gU2V0IHRvIDIwIGZvciBBQUMtTWFpbiAoQU9UIDEpLiBTb21lIGJyb2tlbiBlbmNvZGVycyBhbHNvIGRvIG9yZGVyIDIwIGZvciBBQUMtTEMgOiggKi8KKyAgVE5TX01BWElNVU1fRklMVEVSUyA9IDMKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFNDSEFSIENvZWZmW1ROU19NQVhJTVVNX09SREVSXTsKKworICBVQ0hBUiBTdGFydEJhbmQ7CisgIFVDSEFSIFN0b3BCYW5kOworCisgIFNDSEFSIERpcmVjdGlvbjsKKyAgU0NIQVIgUmVzb2x1dGlvbjsKKworICBVQ0hBUiBPcmRlcjsKK30gQ0ZpbHRlcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ0ZpbHRlciBGaWx0ZXJbVE5TX01BWF9XSU5ET1dTXVtUTlNfTUFYSU1VTV9GSUxURVJTXTsKKyAgVUNIQVIgTnVtYmVyT2ZGaWx0ZXJzW1ROU19NQVhfV0lORE9XU107CisgIFVDSEFSIERhdGFQcmVzZW50OworICBVQ0hBUiBBY3RpdmU7Cit9IENUbnNEYXRhOworCit2b2lkIENUbnNfUmVzZXQoQ1Ruc0RhdGEgKnBUbnNEYXRhKTsKKworI2VuZGlmIC8qICNpZm5kZWYgVE5TX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5YzUwMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTgzOSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIQorICBccGFnZSBkZWZhdWx0IEdlbmVyYWwgT3ZlcnZpZXcgb2YgdGhlIEFBQyBEZWNvZGVyIEltcGxlbWVudGF0aW9uCisKKyAgVGhlIG1haW4gZW50cnkgcG9pbnQgdG8gZGVjb2RlIGEgQUFDIGZyYW1lIGlzIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuIEl0IGhhbmRsZXMgdGhlIGRpZmZlcmVudAorICB0cmFuc3BvcnQgbXVsdGlwbGV4ZXMgYW5kIGJpdHN0cmVhbSBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiBJdCBleHRyYWN0cyB0aGUKKyAgQUFDX3Jhd19kYXRhX2Jsb2NrcyBmcm9tIHRoZXNlIGJpdHN0cmVhbXMgdG8gZnVydGhlciBwcm9jZXNzIHRoZW4gaW4gdGhlIGFjdHVhbCBkZWNvZGluZyBzdGFnZXMuCisKKyAgTm90ZTogQ2xpY2sgb24gYSBmdW5jdGlvbiBvZiBmaWxlIGluIHRoZSBhYm92ZSBpbWFnZSB0byBzZWUgZGV0YWlscyBhYm91dCB0aGUgZnVuY3Rpb24uIEFsc28gbm90ZSwgdGhhdAorICB0aGlzIGlzIGp1c3QgYW4gb3ZlcnZpZXcgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBhbmQgbm90IGEgY29tcGxldGUgY2FsbCBncmFwaC4KKworICA8aDI+MSBCaXRzdHJlYW0gZGVmb3JtYXR0ZXI8L2gyPgorICBUaGUgYmFzaWMgYml0IHN0cmVhbSBwYXJzZXIgZnVuY3Rpb24gQ0NoYW5uZWxFbGVtZW50X1JlYWQoKSBpcyBjYWxsZWQuIEl0IHVzZXMgb3RoZXIgc3ViY2FsbHMgaW4gb3JkZXIKKyAgdG8gcGFyc2UgYW5kIHVucGFjayB0aGUgYml0c3RyZWFtcy4gTm90ZSwgdGhhdCB0aGlzIGluY2x1ZGVzIGh1ZmZtYW5uIGRlY29kaW5nIG9mIHRoZSBjb2RlZCBzcGVjdHJhbCBkYXRhLgorICBUaGlzIG9wZXJhdGlvbiBjYW4gYmUgY29tcHV0YXRpb25hbCBzaWduaWZpY2FudCBzcGVjaWZpY2FsbHkgYXQgaGlnaGVyIGJpdHJhdGVzLiBPcHRpbWl6YXRpb24gaXMgbGlrZWx5IGluCisgIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKCkuCisKKyAgVGhlIGJpdHN0cmVhbSBkZWZvcm1hdHRlciBhbHNvIGluY2x1ZGVzIG1hbnkgYml0ZmllbGQgb3BlcmF0aW9ucy4gUHJvZmlsaW5nIG9uIHRoZSB0YXJnZXQgd2lsbCBkZXRlcm1pbmUKKyAgcmVxdWlyZWQgb3B0aW1pemF0aW9ucy4KKworICA8aDI+MiBBY3R1YWwgZGVjb2RpbmcgdG8gcmV0YWluIHRoZSB0aW1lIGRvbWFpbiBvdXRwdXQ8L2gyPgorICBUaGUgYmFzaWMgYml0c3RyZWFtIGRlZm9ybWF0dGVyIGZ1bmN0aW9uIENDaGFubmVsRWxlbWVudF9EZWNvZGUoKSBmb3IgQ1BFIGVsZW1lbnRzIGFuZCBTQ0UgZWxlbWVudHMgYXJlIGNhbGxlZC4KKyAgRXhjZXB0IGZvciB0aGUgc3RlcmVvIHByb2Nlc3NpbmcgKDIuMSkgd2hpY2ggaXMgb25seSB1c2VkIGZvciBDUEUgZWxlbWVudHMsIHRoZSBmdW5jdGlvbiBjYWxscyBmb3IgQ1BFIG9yIFNDRQorICBhcmUgc2ltaWxhciwgZXhjZXB0IHRoYXQgQ1BFIGFsd2F5cyBwcm9jZXNzZXMgdG8gaW5kZXBlbmRlbnQgY2hhbm5lbHMgd2hpbGUgU0NFIG9ubHkgcHJvY2Vzc2VzIG9uZSBjaGFubmVsLgorCisgIE9mdGVuIHRoZXJlIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGxvbmcgYmxvY2tzIGFuZCBzaG9ydCBibG9ja3MuIEhvd2V2ZXIsIGNvbXB1dGF0aW9uYWwgZXhwZW5zaXZlIGZ1bmN0aW9ucworICB0aGF0IHVzdXNhbGx5IHJlcXVpcmUgb3B0aW1pemF0aW9uIGFyZSBiZWluZyBzaGFyZWQgYnkgdGhlc2UgdHdvIGdyb3VwcywKKworICA8aDM+Mi4xIFN0ZXJlbyBwcm9jZXNzaW5nIGZvciBDUEUgZWxlbWVudHM8L2gzPgorICBDQ2hhbm5lbFBhaXJFbGVtZW50X0RlY29kZSgpIGZpcnN0IGNhbGxlcyB0aGUgam9pbnQgc3RlcmVvICB0b29scyBpbiBzdGVyZW8uY3BwIHdoZW4gcmVxdWlyZWQuCisKKyAgPGgzPjIuMiBTY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGE8L2gzPgorICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEoKS4KKworICA8aDM+Mi4zIEFwcGx5IGFkZGl0aW9uYWwgY29kaW5nIHRvb2xzPC9oMz4KKyAgQXBwbHlUb29scygpIGNhbGxlcyB0aGUgUE5TIHRvb2xzIGluIGNhc2Ugb2YgTVBFRy00IGJpdHN0cmVhbXMsIGFuZCBUTlMgZmlsdGVyaW5nIENUbnNfQXBwbHkoKSBmb3IgTVBFRy0yIGFuZCBNUEVHLTQgYml0c3RyZWFtcy4KKyAgVGhlIGZ1bmN0aW9uIFRuc0ZpbHRlcklJUigpIHdoaWNoIGlzIGNhbGxlZCBieSBDVG5zX0FwcGx5KCkgKDIuMy4xKSBtaWdodCByZXF1aXJlIHNvbWUgb3B0aW1pemF0aW9uLgorCisgIDxoMj4zIEZyZXF1ZW5jeS1Uby1UaW1lIGNvbnZlcnNpb248L2gzPgorICBUaGUgZmlsdGVyYmFuayBpcyBjYWxsZWQgdXNpbmcgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgpIHVzaW5nIHRoZSBNRENUIG1vZHVsZSBmcm9tIHRoZSBGREsgVG9vbHMKKworKi8KKworCisKKyNpbmNsdWRlICJhYWNkZWNvZGVyLmgiCisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAiYWFjX3JhbS5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKworI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKworICAjaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgorCisgICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisKKworCisKKyAgI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKyAgI2luY2x1ZGUgInJ2bGMuaCIKKworCisjaW5jbHVkZSAidHBkZWNfbGliLmgiCisKKyNpbmNsdWRlICJjb25jZWFsLmgiCisKKworCisjZGVmaW5lIENBTl9ET19QUyhhb3QpIFwKKyAgKChhb3QpID09IEFPVF9BQUNfTEMgXAorfHwgKGFvdCkgPT0gQU9UX1NCUiBcCit8fCAoYW90KSA9PSBBT1RfUFMgXAorfHwgKGFvdCkgPT0gQU9UX0VSX0JTQUMgXAorfHwgKGFvdCkgPT0gQU9UX0RSTV9BQUMpCisKKyNkZWZpbmUgSVNfVVNBQyhhb3QpIFwKKyAgKChhb3QpID09IEFPVF9VU0FDIFwKK3x8IChhb3QpID09IEFPVF9SU1ZENTApCisKKyNkZWZpbmUgSVNfTE9XREVMQVkoYW90KSBcCisgICgoYW90KSA9PSBBT1RfRVJfQUFDX0xEIFwKK3x8IChhb3QpID09IEFPVF9FUl9BQUNfRUxEKQorCit2b2lkIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCit7CisKKyAgLyogQXNzaWduIHVzZXIgcmVxdWVzdGVkIG1vZGUgKi8KKyAgc2VsZi0+cW1mTW9kZUN1cnIgPSBzZWxmLT5xbWZNb2RlVXNlcjsKKworICBpZiAoIHNlbGYtPnFtZk1vZGVDdXJyID09IE5PVF9ERUZJTkVEICkKKyAgeworICAgIGlmICggKElTX0xPV0RFTEFZKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19NUFNfUFJFU0VOVCkpCisgICAgICB8fCAoIChzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEpCisgICAgICAgICYmICggKENBTl9ET19QUyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkgJiYgIShzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSkKKyAgICAgICAgICB8fCAoICBJU19VU0FDKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiAgKHNlbGYtPmZsYWdzICYgQUNfTVBTX1BSRVNFTlQpKSApICkgKQorICAgIHsKKyAgICAgIHNlbGYtPnFtZk1vZGVDdXJyID0gTU9ERV9IUTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBNT0RFX0xQOworICAgIH0KKyAgfQorCisKKyAgLyogU2V0IFNCUiB0byBjdXJyZW50IFFNRiBtb2RlLiBFcnJvciBkb2VzIG5vdCBtYXR0ZXIuICovCisgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9RTUZfTU9ERSwgKHNlbGYtPnFtZk1vZGVDdXJyID09IE1PREVfTFApKTsKKyAgc2VsZi0+cHNQb3NzaWJsZSA9ICgoQ0FOX0RPX1BTKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEgJiYgISAoc2VsZi0+ZmxhZ3MgJiBBQ19NUFNfUFJFU0VOVCkpKSAmJiBzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0hRIDsKKyAgRkRLX0FTU0VSVCggISAoIChzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSAmJiBzZWxmLT5wc1Bvc3NpYmxlICkgKTsKK30KKwordm9pZCBDQWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKK3sKK30KKworLyohCisgIFxicmllZiBSZXNldCBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3QuIENhbGwgYmVmb3JlIHBhcnNpbmcgYSBuZXcgZnJhbWUuCisKKyAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKKworICBccmV0dXJuICBFcnJvciBjb2RlCisqLworc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFSZXNldChDQW5jRGF0YSAqYW5jRGF0YSkKK3sKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgeworICAgIGFuY0RhdGEtPm9mZnNldFtpXSA9IDA7CisgIH0KKyAgYW5jRGF0YS0+bnJFbGVtZW50cyA9IDA7CisKKyAgcmV0dXJuIEFBQ19ERUNfT0s7Cit9CisKKy8qIQorICBcYnJpZWYgSW5pdGlhbGl6ZSBhbmNpbGxhcnkgYnVmZmVyCisKKyAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKKyAgXGJ1ZmZlciBQb2ludGVyIHRvIChleHRlcm5hbCkgYW5jIGRhdGEgYnVmZmVyCisgIFxzaXplIFNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIG9uIGJ5IGJ1ZmZlciBpbiBieXRlcworCisgIFxyZXR1cm4gIEVycm9yIGNvZGUKKyovCitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgaWYgKHNpemUgPj0gMCkgeworICAgIGFuY0RhdGEtPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBhbmNEYXRhLT5idWZmZXJTaXplID0gc2l6ZTsKKworICAgIENBYWNEZWNvZGVyX0FuY0RhdGFSZXNldChhbmNEYXRhKTsKKworICAgIHJldHVybiBBQUNfREVDX09LOworICB9CisKKyAgcmV0dXJuIEFBQ19ERUNfQU5DX0RBVEFfRVJST1I7Cit9CisKKy8qIQorICBcYnJpZWYgR2V0IG9uZSBhbmNpbGxhcnkgZGF0YSBlbGVtZW50CisKKyAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKKyAgXGluZGV4IEluZGV4IG9mIHRoZSBhbmMgZGF0YSBlbGVtZW50IHRvIGdldAorICBccHRyIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQKKyAgXHNpemUgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQgaW4gYnl0ZXMKKworICBccmV0dXJuICBFcnJvciBjb2RlCisqLworQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpCit7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKKworICAqcHRyICA9IE5VTEw7CisgICpzaXplID0gMDsKKworICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IDggJiYgaW5kZXggPCBhbmNEYXRhLT5uckVsZW1lbnRzKQorICB7CisgICAgKnB0ciAgPSAmYW5jRGF0YS0+YnVmZmVyW2FuY0RhdGEtPm9mZnNldFtpbmRleF1dOworICAgICpzaXplID0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4KzFdIC0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4XTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworCisvKiEKKyAgXGJyaWVmIFBhcnNlIGFuY2lsbGFyeSBkYXRhCisKKyAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKKyAgXGhCcyBIYW5kbGUgdG8gRkRLIGJpdHN0cmVhbQorICBcYW5jQnl0ZXMgTGVuZ3RoIG9mIGFuY2lsbGFyeSBkYXRhIHRvIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtCisKKyAgXHJldHVybiAgRXJyb3IgY29kZQorKi8KK3N0YXRpYworQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YVBhcnNlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBbmNEYXRhICphbmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFuY0J5dGVzICkKK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOworICBpbnQgcmVhZEJ5dGVzID0gMDsKKworICBpZiAoYW5jRGF0YS0+YnVmZmVyICE9IE5VTEwpCisgIHsKKyAgICBpZiAoYW5jQnl0ZXMgPiAwKSB7CisgICAgICAvKiB3cml0ZSBhbmNpbGxhcnkgZGF0YSB0byBleHRlcm5hbCBidWZmZXIgKi8KKyAgICAgIGludCBvZmZzZXQgPSBhbmNEYXRhLT5vZmZzZXRbYW5jRGF0YS0+bnJFbGVtZW50c107CisKKyAgICAgIGlmICgob2Zmc2V0ICsgYW5jQnl0ZXMpID4gYW5jRGF0YS0+YnVmZmVyU2l6ZSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1RPT19TTUFMTF9BTkNfQlVGRkVSOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYW5jRGF0YS0+bnJFbGVtZW50cyA+PSA4LTEpCisgICAgICB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbmNCeXRlczsgaSsrKSB7CisgICAgICAgICAgYW5jRGF0YS0+YnVmZmVyW2krb2Zmc2V0XSA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgcmVhZEJ5dGVzKys7CisgICAgICAgIH0KKworICAgICAgICBhbmNEYXRhLT5uckVsZW1lbnRzKys7CisgICAgICAgIGFuY0RhdGEtPm9mZnNldFthbmNEYXRhLT5uckVsZW1lbnRzXSA9IGFuY0J5dGVzICsgYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHMtMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVhZEJ5dGVzID0gYW5jQnl0ZXMgLSByZWFkQnl0ZXM7CisKKyAgaWYgKHJlYWRCeXRlcyA+IDApIHsKKyAgICAvKiBza2lwIGRhdGEgKi8KKyAgICBGREtwdXNoRm9yKGhCcywgcmVhZEJ5dGVzPDwzKTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworLyohCisgIFxicmllZiBSZWFkIFN0cmVhbSBEYXRhIEVsZW1lbnQKKworICBcYnMgQml0c3RyZWFtIEhhbmRsZQorCisgIFxyZXR1cm4gIEVycm9yIGNvZGUKKyovCitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0RhdGFTdHJlYW1FbGVtZW50X1JlYWQgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiAgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKmVsZW1lbnRJbnN0YW5jZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgIGFsaWdubWVudEFuY2hvciApCit7CisgIEhBTkRMRV9UUkFOU1BPUlRERUMgIHBUcDsKKyAgQ0FuY0RhdGEgKmFuY0RhdGE7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKKyAgVUlOVCBkYXRhU3RhcnQsIGRzZUJpdHM7CisgIGludCBkYXRhQnl0ZUFsaWduRmxhZywgY291bnQ7CisKKyAgRkRLX0FTU0VSVChzZWxmICE9IE5VTEwpOworCisgIGFuY0RhdGEgPSAmc2VsZi0+YW5jRGF0YTsKKyAgcFRwID0gc2VsZi0+aElucHV0OworCisgIGludCBjcmNSZWcgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwLCAwKTsKKworICAvKiBFbGVtZW50IEluc3RhbmNlIFRhZyAqLworICAqZWxlbWVudEluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsNCk7CisgIC8qIERhdGEgQnl0ZSBBbGlnbiBGbGFnICovCisgIGRhdGFCeXRlQWxpZ25GbGFnID0gRkRLcmVhZEJpdHMoYnMsMSk7CisKKyAgY291bnQgPSBGREtyZWFkQml0cyhicyw4KTsKKworICBpZiAoY291bnQgPT0gMjU1KSB7CisgICAgY291bnQgKz0gRkRLcmVhZEJpdHMoYnMsOCk7IC8qIEVzY0NvdW50ICovCisgIH0KKyAgZHNlQml0cyA9IGNvdW50Kjg7CisKKyAgaWYgKGRhdGFCeXRlQWxpZ25GbGFnKSB7CisgICAgRkRLYnl0ZUFsaWduKGJzLCBhbGlnbm1lbnRBbmNob3IpOworICB9CisKKyAgZGF0YVN0YXJ0ID0gRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKworICBlcnJvciA9IENBYWNEZWNvZGVyX0FuY0RhdGFQYXJzZShhbmNEYXRhLCBicywgY291bnQpOworICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcCwgY3JjUmVnKTsKKworICB7CisgICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGp1bmsgKi8KKyAgICBGREtwdXNoQmFjayhicywgZGF0YVN0YXJ0LUZES2dldFZhbGlkQml0cyhicykpOworCisgICAgLyogUmVhZCBBbmMgZGF0YSBpZiBhdmFpbGFibGUgKi8KKyAgICBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKCBzZWxmLT5oRHJjSW5mbywgYnMsIERWQl9EUkNfQU5DX0RBVEEgKTsKKyAgfQorCisgIHsKKyAgICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOworCisgICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGp1bmsgKi8KKyAgICBGREtwdXNoQmFjayhicywgZGF0YVN0YXJ0LUZES2dldFZhbGlkQml0cyhicykpOworCisgICAgLyogUmVhZCBETVggbWV0YS1kYXRhICovCisgICAgZG14RXJyID0gcGNtRG14X1BhcnNlICgKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhQY21VdGlscywKKyAgICAgICAgICAgICAgICAgICAgIGJzLAorICAgICAgICAgICAgICAgICAgICAgZHNlQml0cywKKyAgICAgICAgICAgICAgICAgICAgIDAgLyogbm90IG1wZWcyICovICk7CisgICAgfQorCisgIC8qIE1vdmUgdG8gdGhlIHZlcnkgZW5kIG9mIHRoZSBlbGVtZW50LiAqLworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1kYXRhU3RhcnQrZHNlQml0cyk7CisKKyAgcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgVFBfUENFX0VOQUJMRQorLyohCisgIFxicmllZiBSZWFkIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQKKworICBcYnMgQml0c3RyZWFtIEhhbmRsZQorICBccFRwIFRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZSBmb3IgQ1JDIGhhbmRsaW5nCisgIFxwY2UgUG9pbnRlciB0byBQQ0UgYnVmZmVyCisgIFxjaGFubmVsQ29uZmlnIEN1cnJlbnQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgIFxhbGlnbkFuY2hvciBBbmNob3IgZm9yIGJ5dGUgYWxpZ25tZW50CisKKyAgXHJldHVybiAgUENFIHN0YXR1cyAoLTE6IGZhaWwsIDA6IG5vIG5ldyBQQ0UsIDE6IFBDRSB1cGRhdGVkLCAyOiBQQ0UgdXBkYXRlZCBuZWVkIHJlLWNvbmZpZykuCisqLworc3RhdGljIGludCBDUHJvZ3JhbUNvbmZpZ0VsZW1lbnRfUmVhZCAoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgSEFORExFX1RSQU5TUE9SVERFQyAgcFRwLAorICAgIENQcm9ncmFtQ29uZmlnICAgICAgKnBjZSwKKyAgICBjb25zdCBVSU5UICAgICAgICAgICBjaGFubmVsQ29uZmlnLAorICAgIGNvbnN0IFVJTlQgICAgICAgICAgIGFsaWduQW5jaG9yICkKK3sKKyAgaW50IHBjZVN0YXR1cyA9IDA7CisgIGludCBjcmNSZWc7CisKKyAgLyogcmVhZCBQQ0UgdG8gdGVtcG9yYWwgYnVmZmVyIGZpcnN0ICovCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKKworICBDUHJvZ3JhbUNvbmZpZ19Jbml0KHRtcFBjZSk7CisgIENQcm9ncmFtQ29uZmlnX1Jlc2V0KHRtcFBjZSk7CisKKyAgY3JjUmVnID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcCwgMCk7CisKKyAgQ1Byb2dyYW1Db25maWdfUmVhZCh0bXBQY2UsIGJzLCBhbGlnbkFuY2hvcik7CisKKyAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHAsIGNyY1JlZyk7CisKKyAgaWYgKCAgQ1Byb2dyYW1Db25maWdfSXNWYWxpZCh0bXBQY2UpCisgICAgJiYgKHRtcFBjZS0+UHJvZmlsZSA9PSAxKSApCisgIHsKKyAgICBpZiAoICFwY2UtPmlzVmFsaWQgJiYgKGNoYW5uZWxDb25maWcgPiAwKSApIHsKKyAgICAgIC8qIENyZWF0ZSBhIHN0YW5kYXJkIGNoYW5uZWwgY29uZmlnIFBDRSB0byBjb21wYXJlIHdpdGggKi8KKyAgICAgIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQoIHBjZSwgY2hhbm5lbENvbmZpZyApOworICAgIH0KKworICAgIGlmIChwY2UtPmlzVmFsaWQpIHsKKyAgICAgIC8qIENvbXBhcmUgdGhlIG5ldyBhbmQgdGhlIG9sZCBQQ0UgKHRhZ3MgaWdub3JlZCkgKi8KKyAgICAgIHN3aXRjaCAoIENQcm9ncmFtQ29uZmlnX0NvbXBhcmUoIHBjZSwgdG1wUGNlICkgKQorICAgICAgeworICAgICAgY2FzZSAxOiAgLyogQ2hhbm5lbCBjb25maWd1cmF0aW9uIG5vdCBjaGFuZ2VkLiBKdXN0IG5ldyBtZXRhZGF0YS4gKi8KKyAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgICAgLyogU3RvcmUgdGhlIGNvbXBsZXRlIFBDRSAqLworICAgICAgICBwY2VTdGF0dXMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgUENFIGJ1dCBubyBjaGFuZ2Ugb2YgY29uZmlnICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAgLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBhcmUgaWRlbnRpY2FsIGJ1dCBub3QgdGhlIGNvbmZpZyAqLworICAgICAgICBpZiAoY2hhbm5lbENvbmZpZyA9PSAwKSB7CisgICAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgIC8qIFN0b3JlIHRoZSBjb21wbGV0ZSBQQ0UgKi8KKyAgICAgICAgICBwY2VTdGF0dXMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBuZWVkcyByZS1jb25maWd1cmF0aW9uICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOiAgLyogVGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCAqLworICAgICAgICBwY2VTdGF0dXMgPSAtMTsgIC8qIE5vdCBzdXBwb3J0ZWQhICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOiAgLyogTm90aGluZyB0byBkbyBiZWNhdXNlIFBDRSBtYXRjaGVzIHRoZSBvbGQgb25lIGV4YWN0bHkuICovCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBwY2VTdGF0dXMgPSAwOyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOworCisgIHJldHVybiBwY2VTdGF0dXM7Cit9CisjZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworCisvKiEKKyAgXGJyaWVmIFBhcnNlIEV4dGVuc2lvbiBQYXlsb2FkCisKKyAgXHNlbGYgSGFuZGxlIG9mIEFBQyBkZWNvZGVyCisgIFxjb3VudCBQb2ludGVyIHRvIGJpdCBjb3VudGVyLgorICBccHJldmlvdXNfZWxlbWVudCBJRCBvZiBwcmV2aW91cyBlbGVtZW50IChyZXF1aXJlZCBieSBzb21lIGV4dGVuc2lvbiBwYXlsb2FkcykKKworICBccmV0dXJuICBFcnJvciBjb2RlCisqLworc3RhdGljCitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2UgKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldmlvdXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmSXNGaWxsRWxlbWVudCkKK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOworICBFWFRfUEFZTE9BRF9UWVBFIGV4dGVuc2lvbl90eXBlOworICBpbnQgYnl0ZXMgPSAoKmNvdW50KSA+PiAzOworICBpbnQgY3JjRmxhZyA9IDA7CisKKyAgaWYgKCpjb3VudCA8IDQpIHsKKyAgICByZXR1cm4gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgfSBlbHNlIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDwgKmNvdW50KSB7CisgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICB9CisKKyAgZXh0ZW5zaW9uX3R5cGUgPSAoRVhUX1BBWUxPQURfVFlQRSkgRkRLcmVhZEJpdHMoaEJzLCA0KTsgICAgLyogYnNfZXh0ZW5zaW9uX3R5cGUgKi8KKyAgKmNvdW50IC09IDQ7CisKKyAgc3dpdGNoIChleHRlbnNpb25fdHlwZSkKKyAgeworICBjYXNlIEVYVF9EWU5BTUlDX1JBTkdFOgorICAgIHsKKyAgICAgIElOVCByZWFkQml0cyA9IGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQoIHNlbGYtPmhEcmNJbmZvLCBoQnMsIE1QRUdfRFJDX0VYVF9EQVRBICk7CisKKyAgICAgIGlmIChyZWFkQml0cyA+ICpjb3VudCkKKyAgICAgIHsgLyogUmVhZCB0b28gbXVjaC4gU29tZXRoaW5nIHdlbnQgd3JvbmchICovCisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICAgICpjb3VudCAtPSByZWFkQml0czsKKyAgICB9CisgICAgYnJlYWs7CisKKworICBjYXNlIEVYVF9TQlJfREFUQV9DUkM6CisgICAgY3JjRmxhZyA9IDE7CisgIGNhc2UgRVhUX1NCUl9EQVRBOgorICAgIGlmIChJU19DSEFOTkVMX0VMRU1FTlQocHJldmlvdXNfZWxlbWVudCkpIHsKKyAgICAgIFNCUl9FUlJPUiBzYnJFcnJvcjsKKworICAgICAgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoc2VsZik7CisKKyAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKKyAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKKyAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgZWxJbmRleAorICAgICAgICAgICAgICApOworCisgICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7CisgICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9QYXJzZSAoCisgICAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCisgICAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgKmNvdW50LAorICAgICAgICAgICAgICAgIGNyY0ZsYWcsCisgICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgICBlbEluZGV4LAorICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgQUNfSU5ERVAgKTsKKyAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcuICovCisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRG8gbm90IHRyeSB0byBhcHBseSBTQlIgYmVjYXVzZSBpbml0aWFsaXppbmcgdGhlIGVsZW1lbnQgZmFpbGVkLiAqLworICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKyAgICAgIH0KKyAgICAgIC8qIENpdGF0aW9uIGZyb20gSVNPL0lFQyAxNDQ5Ni0zIGNoYXB0ZXIgNC41LjIuMS41LjIKKyAgICAgIEZpbGwgZWxlbWVudHMgY29udGFpbmluZyBhbiBleHRlbnNpb25fcGF5bG9hZCgpIHdpdGggYW4gZXh0ZW5zaW9uX3R5cGUgb2YgRVhUX1NCUl9EQVRBCisgICAgICBvciBFWFRfU0JSX0RBVEFfQ1JDIHNoYWxsIG5vdCBjb250YWluIGFueSBvdGhlciBleHRlbnNpb25fcGF5bG9hZCBvZiBhbnkgb3RoZXIgZXh0ZW5zaW9uX3R5cGUuCisgICAgICAqLworICAgICAgaWYgKGZJc0ZpbGxFbGVtZW50KSB7CisgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKmNvdW50KTsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgZmlsbCBlbGVtZW50IHdpdGggYSBrbm93biBsZW5ndGgsIHdlIGFyZSBzY3Jld2VkIGFuIG5vIGZ1cnRoZXIgcGFyc2luZyBtYWtlcyBzZW5zZS4gKi8KKyAgICAgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgeworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBFWFRfRklMTF9EQVRBOgorICAgIHsKKyAgICAgIGludCB0ZW1wOworCisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLDQpOworICAgICAgYnl0ZXMtLTsKKyAgICAgIGlmICh0ZW1wICE9IDApIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChieXRlcyA+IDApIHsKKyAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcyw4KTsKKyAgICAgICAgYnl0ZXMtLTsKKyAgICAgICAgaWYgKHRlbXAgIT0gMHhhNSkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKmNvdW50ID0gYnl0ZXM8PDM7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgRVhUX0RBVEFfRUxFTUVOVDoKKyAgICB7CisgICAgICBpbnQgZGF0YUVsZW1lbnRWZXJzaW9uOworCisgICAgICBkYXRhRWxlbWVudFZlcnNpb24gPSBGREtyZWFkQml0cyhoQnMsNCk7CisgICAgICAqY291bnQgLT0gNDsKKyAgICAgIGlmIChkYXRhRWxlbWVudFZlcnNpb24gPT0gMCkgLyogQU5DX0RBVEEgKi8KKyAgICAgIHsKKyAgICAgICAgaW50IHRlbXAsIGRhdGFFbGVtZW50TGVuZ3RoID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsOCk7CisgICAgICAgICAgKmNvdW50IC09IDg7CisgICAgICAgICAgZGF0YUVsZW1lbnRMZW5ndGggKz0gdGVtcDsKKyAgICAgICAgfSB3aGlsZSAodGVtcCA9PSAyNTUgKTsKKworICAgICAgICBDQWFjRGVjb2Rlcl9BbmNEYXRhUGFyc2UoJnNlbGYtPmFuY0RhdGEsIGhCcywgZGF0YUVsZW1lbnRMZW5ndGgpOworICAgICAgICAqY291bnQgLT0gKGRhdGFFbGVtZW50TGVuZ3RoPDwzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsaWduID0gMCAqLworICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBFWFRfREFUQV9MRU5HVEg6CisgICAgaWYgKCAhZklzRmlsbEVsZW1lbnQgICAgICAgICAgLyogTWFrZXMgbm8gc2VucyB0byBoYXZlIGFuIGFkZGl0aW9uYWwgbGVuZ3RoIGluIGEgZmlsbCAuLi4gICAqLworICAgICAgJiYgKHNlbGYtPmZsYWdzICYgQUNfRVIpICkgIC8qIC4uLiBlbGVtZW50IGJlY2F1c2UgdGhpcyBleHRlbnNpb24gcGF5bG9hZCB0eXBlIHdhcyAuLi4gICAgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAuLi4gY3JlYXRlZCB0byBjaXJjdW12ZW50IHRoZSBtaXNzaW5nIGxlbmd0aCBpbiBFUi1TeW50YXguICovCisgICAgICBpbnQgYml0Q250LCBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgKmNvdW50IC09IDQ7CisKKyAgICAgIGlmIChsZW4gPT0gMTUpIHsKKyAgICAgICAgaW50IGFkZF9sZW4gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAqY291bnQgLT0gODsKKyAgICAgICAgbGVuICs9IGFkZF9sZW47CisKKyAgICAgICAgaWYgKGFkZF9sZW4gPT0gMjU1KSB7CisgICAgICAgICAgbGVuICs9IEZES3JlYWRCaXRzKGhCcywgMTYpOworICAgICAgICAgICpjb3VudCAtPSAxNjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGVuIDw8PSAzOworICAgICAgYml0Q250ID0gbGVuOworCisgICAgICBpZiAoIChFWFRfUEFZTE9BRF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCkgPT0gRVhUX0RBVEFfTEVOR1RIICkgeworICAgICAgICAvKiBDaGVjayBOT1RFIDI6IFRoZSBleHRlbnNpb25fcGF5bG9hZCgpIGluY2x1ZGVkIGhlcmUgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIGV4dGVuc2lvbl90eXBlID09IEVYVF9EQVRBX0xFTkdUSC4gKi8KKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcmV3aW5kIGFuZCBjYWxsIG15c2VsZiBhZ2Fpbi4gKi8KKyAgICAgICAgRkRLcHVzaEJhY2soaEJzLCA0KTsKKworICAgICAgICBlcnJvciA9CisgICAgICAgICAgQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlICgKKyAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICBoQnMsCisgICAgICAgICAgICAgICAgICZiaXRDbnQsCisgICAgICAgICAgICAgICAgICBwcmV2aW91c19lbGVtZW50LAorICAgICAgICAgICAgICAgICAgZWxJbmRleCwKKyAgICAgICAgICAgICAgICAgIDAgKTsKKworICAgICAgICAqY291bnQgLT0gbGVuIC0gYml0Q250OworICAgICAgfQorICAgICAgLyogTm90ZTogdGhlIGZhbGwgdGhyb3VnaCBpbiBjYXNlIHRoZSBpZiBzdGF0ZW1lbnQgYWJvdmUgaXMgbm90IHRha2VuIGlzIGludGVudGlvbmFsLiAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgRVhUX0ZJTDoKKworICBkZWZhdWx0OgorICAgIC8qIGFsaWduID0gNCAqLworICAgIEZES3B1c2hGb3IoaEJzLCAqY291bnQpOworICAgICpjb3VudCA9IDA7CisgICAgYnJlYWs7CisgIH0KKworYmFpbDoKKyAgaWYgKCAoZXJyb3IgIT0gQUFDX0RFQ19PSykKKyAgICAmJiBmSXNGaWxsRWxlbWVudCApCisgIHsgLyogU2tpcCB0aGUgcmVtYWluaW5nIGV4dGVuc2lvbiBieXRlcyAqLworICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKmNvdW50KTsKKyAgICAqY291bnQgPSAwOworICAgIC8qIFBhdGNoIGVycm9yIGNvZGUgYmVjYXVzZSBkZWNvZGluZyBjYW4gZ28gb24uICovCisgICAgZXJyb3IgPSBBQUNfREVDX09LOworICAgIC8qIEJlIHN1cmUgdGhhdCBwYXJzaW5nIGVycm9ycyBoYXZlIGJlZW4gc3RvcmVkLiAqLworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyogIFN0cmVhbSBDb25maWd1cmF0aW9uIGFuZCBJbmZvcm1hdGlvbi4KKworICAgIFRoaXMgY2xhc3MgaG9sZHMgY29uZmlndXJhdGlvbiBhbmQgaW5mb3JtYXRpb24gZGF0YSBmb3IgYSBzdHJlYW0gdG8gYmUgZGVjb2RlZC4gSXQKKyAgICBwcm92aWRlcyB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBhcyB3ZWxsIGFzIHRoZSBkZWNvZGVyIHdpdGggc3Vic3RhbnRpYWwgaW5mb3JtYXRpb24sCisgICAgZS5nLiBwcm9maWxlLCBzYW1wbGluZyByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSBldGMuCisqLworc3RhdGljCit2b2lkIENTdHJlYW1JbmZvSW5pdChDU3RyZWFtSW5mbyAqcFN0cmVhbUluZm8pCit7CisgIHBTdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlID0gMDsKKyAgcFN0cmVhbUluZm8tPnByb2ZpbGUgPSAtMTsKKyAgcFN0cmVhbUluZm8tPmFvdCA9IEFPVF9OT05FOworCisgIHBTdHJlYW1JbmZvLT5jaGFubmVsQ29uZmlnID0gLTE7CisgIHBTdHJlYW1JbmZvLT5iaXRSYXRlID0gMDsKKyAgcFN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSA9IDA7CisKKyAgcFN0cmVhbUluZm8tPmV4dEFvdCAgPSBBT1RfTk9ORTsKKyAgcFN0cmVhbUluZm8tPmV4dFNhbXBsaW5nUmF0ZSA9IDA7CisKKyAgcFN0cmVhbUluZm8tPmZsYWdzID0gMDsKKworICBwU3RyZWFtSW5mby0+ZXBDb25maWcgPSAtMTsgICAvKiBkZWZhdWx0IGlzIG5vIEVSICovCisKKyAgcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzID0gMDsKKyAgcFN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOworICBwU3RyZWFtSW5mby0+ZnJhbWVTaXplID0gMDsKKworICBwU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgPSAwOworCisgIC8qIERSQyAqLworICBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldiA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCB0byBub3QgaW5kaWNhdGVkICovCisgIHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdDogcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZCAqLworfQorCisvKiEKKyAgXGJyaWVmIEluaXRpYWxpemF0aW9uIG9mIEFhY0RlY29kZXJDaGFubmVsSW5mbworCisgIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcG9pbnRlcnMgdG8gQWFjRGVjb2RlckNoYW5uZWxJbmZvIGZvciBlYWNoIGNoYW5uZWwsCisgIHNldCB0aGUgc3RhcnQgdmFsdWVzIGZvciB3aW5kb3cgc2hhcGUgYW5kIHdpbmRvdyBzZXF1ZW5jZSBvZiBvdmVybGFwJmFkZCB0byB6ZXJvLAorICBzZXQgdGhlIG92ZXJsYXAgYnVmZmVyIHRvIHplcm8gYW5kIGluaXRpYWxpemVzIHRoZSBwb2ludGVycyB0byB0aGUgd2luZG93IGNvZWZmaWNpZW50cy4KKyAgXHBhcmFtIGJzRm9ybWF0IGlzIHRoZSBmb3JtYXQgb2YgdGhlIEFBQyBiaXRzdHJlYW0KKworICBccmV0dXJuICBBQUNERUNPREVSIGluc3RhbmNlCisqLworTElOS1NQRUNfQ1BQIEhBTkRMRV9BQUNERUNPREVSIENBYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgYnNGb3JtYXQpICAgIC8qITwgYml0c3RyZWFtIGZvcm1hdCAoYWRpZixhZHRzLGxvYXMsLi4uKS4gKi8KK3sKKyAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZjsKKworICBzZWxmID0gR2V0QWFjRGVjb2RlcigpOworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogQXNzaWduIGNoYW5uZWwgbWFwcGluZyBpbmZvIGFycmF5cyAoZG9pbmcgc28gcmVtb3ZlcyBkZXBlbmRlbmN5IG9mIHNldHRpbmdzIGhlYWRlciBpbiBBUEkgaGVhZGVyKS4gKi8KKyAgc2VsZi0+c3RyZWFtSW5mby5wQ2hhbm5lbEluZGljZXMgPSBzZWxmLT5jaGFubmVsSW5kaWNlczsKKyAgc2VsZi0+c3RyZWFtSW5mby5wQ2hhbm5lbFR5cGUgPSBzZWxmLT5jaGFubmVsVHlwZTsKKworICAvKiBzZXQgZGVmYXVsdCBvdXRwdXQgbW9kZSAqLworICBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZCA9IDE7ICAvKiBpbnRlcmxlYXZlZCAqLworCisgIC8qIGluaXRpYWxpemUgYW5jIGRhdGEgKi8KKyAgQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoJnNlbGYtPmFuY0RhdGEsIE5VTEwsIDApOworCisgIC8qIGluaXRpYWxpemUgc3RyZWFtIGluZm8gKi8KKyAgQ1N0cmVhbUluZm9Jbml0KCZzZWxmLT5zdHJlYW1JbmZvKTsKKworICAvKiBpbml0aWFsaXplIGVycm9yIGNvbmNlYWxtZW50IGNvbW1vbiBkYXRhICovCisgIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpOworCisgIHNlbGYtPmhEcmNJbmZvID0gR2V0RHJjSW5mbygpOworICBpZiAoc2VsZi0+aERyY0luZm8gPT0gTlVMTCkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICAvKiBJbml0IGNvbW1vbiBEUkMgc3RydWN0dXJlICovCisgIGFhY0RlY29kZXJfZHJjSW5pdCggc2VsZi0+aERyY0luZm8gKTsKKyAgLyogU2V0IGRlZmF1bHQgZnJhbWUgZGVsYXkgKi8KKyAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCisgICAgICAgICAgc2VsZi0+aERyY0luZm8sCisgICAgICAgICAgRFJDX0JTX0RFTEFZLAorICAgICAgICAgIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpCisgICAgICAgICk7CisKKworICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMSA9IEdldFdvcmtCdWZmZXJDb3JlMSgpOworICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMiA9IEdldFdvcmtCdWZmZXJDb3JlMigpOworICBpZiAoc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEgPT0gTlVMTAorICAgIHx8c2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTIgPT0gTlVMTCApCisgICAgZ290byBiYWlsOworCisgIHJldHVybiBzZWxmOworCitiYWlsOgorICBDQWFjRGVjb2Rlcl9DbG9zZSggc2VsZiApOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBEZXN0cm95IGFhYyBkZWNvZGVyICovCitMSU5LU1BFQ19DUFAgdm9pZCBDQWFjRGVjb2Rlcl9DbG9zZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQoreworICBpbnQgY2g7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChjaD0wOyBjaDwoOCk7IGNoKyspIHsKKyAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gIT0gTlVMTCkgeworICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVPdmVybGFwQnVmZmVyICgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKCZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSAhPSBOVUxMKSB7CisgICAgICBGcmVlQWFjRGVjb2RlckNoYW5uZWxJbmZvICgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0pOworICAgIH0KKyAgfQorCisgIHNlbGYtPmFhY0NoYW5uZWxzID0gMDsKKworICBpZiAoc2VsZi0+aERyY0luZm8pIHsKKyAgICBGcmVlRHJjSW5mbygmc2VsZi0+aERyY0luZm8pOworICB9CisKKyAgaWYgKHNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUxICE9IE5VTEwpIHsKKyAgICBGcmVlV29ya0J1ZmZlckNvcmUxICgmc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEpOworICB9CisgIGlmIChzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMiAhPSBOVUxMKSB7CisgICAgRnJlZVdvcmtCdWZmZXJDb3JlMiAoJnNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUyKTsKKyAgfQorCisgIEZyZWVBYWNEZWNvZGVyICggJnNlbGYpOworfQorCisKKy8qIQorICBcYnJpZWYgSW5pdGlhbGl6YXRpb24gb2YgZGVjb2RlciBpbnN0YW5jZQorCisgIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZGVjb2Rlci4KKworICBccmV0dXJuICBlcnJvciBzdGF0dXM6IDAgZm9yIHN1Y2Nlc3MsIDw+MCBmb3IgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMKKyovCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYykKK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKKyAgSU5UIGFzY0NoYW5uZWxzLCBjaCwgYXNjQ2hhbmdlZCA9IDA7CisKKyAgaWYgKCFzZWxmKQorICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworCisgIC8vIHNldCBwcm9maWxlIGFuZCBjaGVjayBmb3Igc3VwcG9ydGVkIGFvdAorICAvLyBsZWF2ZSBwcm9maWxlIG9uIGRlZmF1bHQgKD0tMSkgZm9yIGFsbCBvdGhlciBzdXBwb3J0ZWQgTVBFRy00IGFvdCdzIGV4Y2VwdCBhb3Q9MiAoPUFBQy1MQykKKyAgc3dpdGNoIChhc2MtPm1fYW90KSB7CisgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBzZWxmLT5zdHJlYW1JbmZvLnByb2ZpbGUgPSAxOworICAgIGJyZWFrOworCisgIGNhc2UgQU9UX1NCUjoKKyAgY2FzZSBBT1RfUFM6CisgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVDsKKyAgfQorCisgIENQcm9ncmFtQ29uZmlnX0luaXQoJnNlbGYtPnBjZSk7CisKKyAgLyogc2V0IGNoYW5uZWxzICovCisgIHN3aXRjaCAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uKSB7CisgIGNhc2UgMDoKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgICAgLyogZ2V0IGNoYW5uZWxzIGZyb20gcHJvZ3JhbSBjb25maWcgKEFTQykgKi8KKyAgICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCkpIHsKKyAgICAgIGFzY0NoYW5uZWxzID0gYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5OdW1DaGFubmVsczsKKyAgICAgIGlmIChhc2NDaGFubmVscyA+IDApIHsKKyAgICAgICAgaW50IGVsOworICAgICAgICAvKiB2YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgLT4gY29weSBwcm9ncmFtIGNvbmZpZyBlbGVtZW50IChQQ0UpIGZyb20gQVNDICovCisgICAgICAgIEZES21lbWNweSgmc2VsZi0+cGNlLCAmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7CisgICAgICAgIC8qIEJ1aWx0IGVsZW1lbnQgdGFibGUgKi8KKyAgICAgICAgZWwgPSBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIHNlbGYtPmVsZW1lbnRzLCAoOCksICZzZWxmLT5jaE1hcEluZGV4KTsKKyAgICAgICAgZm9yICg7IGVsPCg4KTsgZWwrKykgeworICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsXSA9IElEX05PTkU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYtPmNoTWFwSW5kZXggPSAwOworICAgICAgaWYgKHRyYW5zcG9ydERlY19HZXRGb3JtYXQoc2VsZi0+aElucHV0KSA9PSBUVF9NUDRfQURUUykgeworICAgICAgICAvKiBzZXQgZGVmYXVsdCBtYXhfY2hhbm5lbHMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGJlY2F1c2UgaW4gaW1wbGljaXQgY2hhbm5lbCBtYXBwaW5nIG1vZGUKKyAgICAgICAgICAgd2UgZG9uJ3Qga25vdyB0aGUgYWN0dWFsIG51bWJlciBvZiBjaGFubmVscyB1bnRpbCB3ZSBwcm9jZXNzZWQgYXQgbGVhc3Qgb25lIHJhd19kYXRhX2Jsb2NrKCkuICovCisgICAgICAgIGFzY0NoYW5uZWxzID0gKDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBUUF9QQ0VfRU5BQkxFICovCisgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisgICAgYnJlYWs7CisgIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6CisgICAgYXNjQ2hhbm5lbHMgPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CisgICAgYnJlYWs7CisgIGNhc2UgMTE6CisgICAgYXNjQ2hhbm5lbHMgPSA3OworICAgIGJyZWFrOworICBjYXNlIDc6IGNhc2UgMTI6IGNhc2UgMTQ6CisgICAgYXNjQ2hhbm5lbHMgPSA4OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIH0KKworICBpZiAoYXNjQ2hhbm5lbHMgPiAoOCkpIHsKKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBjb25zdGFudCBtYXBwaW5ncyBmb3IgY2hhbm5lbCBjb25maWcgMS03ICovCisgIGlmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPiAwKSB7CisgICAgaW50IGVsOworICAgIEZES21lbWNweShzZWxmLT5lbGVtZW50cywgZWxlbWVudHNUYWJbYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uLTFdLCBzaXplb2YoTVA0X0VMRU1FTlRfSUQpKkZES21pbig3LCg4KSkpOworICAgIGZvciAoZWw9NzsgZWw8KDgpOyBlbCsrKSB7CisgICAgICBzZWxmLT5lbGVtZW50c1tlbF0gPSBJRF9OT05FOworICAgIH0KKyAgICBmb3IgKGNoPTA7IGNoPGFzY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgICBzZWxmLT5jaE1hcHBpbmdbY2hdID0gY2g7CisgICAgfQorICAgIGZvciAoOyBjaDwoOCk7IGNoKyspIHsKKyAgICAgIHNlbGYtPmNoTWFwcGluZ1tjaF0gPSAyNTU7CisgICAgfQorICAgIHNlbGYtPmNoTWFwSW5kZXggPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CisgIH0KKyAjaWZkZWYgVFBfUENFX0VOQUJMRQorICBlbHNlIHsKKyAgICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCkpIHsKKyAgICAgIC8qIFNldCBtYXRyaXggbWl4ZG93biBpbmZvcyBpZiBhdmFpbGFibGUgZnJvbSBQQ0UuICovCisgICAgICBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UgKCBzZWxmLT5oUGNtVXRpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQuUHNldWRvU3Vycm91bmRFbmFibGUgKTsKKyAgICB9CisgIH0KKyAjZW5kaWYKKworICBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CisKKyAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYW90ICE9IGFzYy0+bV9hb3QpIHsKKyAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCA9IGFzYy0+bV9hb3Q7CisgICAgYXNjQ2hhbmdlZCA9IDE7CisgIH0KKworICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgIT0gKElOVClhc2MtPm1fc2FtcGxlc1BlckZyYW1lKSB7CisgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgPSBhc2MtPm1fc2FtcGxlc1BlckZyYW1lOworICAgIGFzY0NoYW5nZWQgPSAxOworICB9CisKKyAgc2VsZi0+c3RyZWFtSW5mby5iaXRSYXRlICAgICAgICAgICAgPSAwOworCisgIC8qIFNldCBzeW50YXggZmxhZ3MgKi8KKyAgc2VsZi0+ZmxhZ3MgPSAwOworCisgIHNlbGYtPnN0cmVhbUluZm8uZXh0QW90ICAgICAgICAgICAgICAgPSBhc2MtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlOworICBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAgICAgID0gYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OworICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSA/IEFDX1NCUl9QUkVTRU5UIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9wc1ByZXNlbnRGbGFnKSA/IEFDX1BTX1BSRVNFTlQgOiAwOworICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKworICAvKiAtLS0tLS0tLS0gdmNiMTEgLS0tLS0tLS0tLS0tICovCisgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fdmNiMTFGbGFnKSA/IEFDX0VSX1ZDQjExIDogMDsKKworICAvKiAtLS0tLS0tLS0tIHJ2bGMgLS0tLS0tLS0tLS0tICovCisgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fcnZsY0ZsYWcpID8gQUNfRVJfUlZMQyA6IDA7CisKKyAgLyogLS0tLS0tLS0tLS0gaGNyIC0tLS0tLS0tLS0tLSAqLworICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX2hjckZsYWcpID8gQUNfRVJfSENSIDogMDsKKworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIHNlbGYtPmZsYWdzIHw9ICBBQ19FTEQ7CisgICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fc2JyQ3JjRmxhZykgPyBBQ19TQlJDUkMgOiAwOworICAgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3VzZUxkUW1mVGltZUFsaWduKSA/IEFDX0xEX01QUyA6IDA7CisgIH0KKyAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MRCkgPyBBQ19MRCA6IDA7CisgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fZXBDb25maWcgPj0gMCkgPyBBQ19FUiA6IDA7CisKKworICBpZiAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSB7CisgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDE7CisgICAgc2VsZi0+c2JyRW5hYmxlZFByZXYgPSAxOworICB9CisgIGlmIChhc2MtPm1fcHNQcmVzZW50RmxhZykgeworICAgIHNlbGYtPmZsYWdzIHw9IEFDX1BTX1BSRVNFTlQ7CisgIH0KKworICBpZiAoIChhc2MtPm1fZXBDb25maWcgPj0gMCkKKyAgICAmJiAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uIDw9IDApICkgeworICAgIC8qIHdlIGhhdmUgdG8ga25vdyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG90aGVyd2lzZSBubyBkZWNvZGluZyBpcyBwb3NzaWJsZSAqLworICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKKyAgfQorCisgIHNlbGYtPnN0cmVhbUluZm8uZXBDb25maWcgPSBhc2MtPm1fZXBDb25maWc7CisgIC8qIHNlbGYtPmhJbnB1dC0+YXNjLm1fZXBDb25maWcgPSBhc2MtPm1fZXBDb25maWc7ICovCisKKyAgaWYgKGFzYy0+bV9lcENvbmZpZyA+IDEpCisgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUOworCisgIC8qIENoZWNrIGlmIHNhbXBsZXJhdGUgY2hhbmdlZC4gKi8KKyAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSAhPSAoSU5UKWFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSkgeworICAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yOworCisgICAgYXNjQ2hhbmdlZCA9IDE7CisKKyAgICAvKiBVcGRhdGUgc2FtcGxlcmF0ZSBpbmZvLiAqLworICAgIGVycm9yID0gZ2V0U2FtcGxpbmdSYXRlSW5mbygmc2VsZi0+c2FtcGxpbmdSYXRlSW5mbywgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7CisgICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlID0gc2VsZi0+c2FtcGxpbmdSYXRlSW5mby5zYW1wbGluZ1JhdGU7CisgIH0KKworICAvKiBDaGVjayBpZiBhbW91bnQgb2YgY2hhbm5lbHMgaGFzIGNoYW5nZWQuICovCisgIGlmIChzZWxmLT5hc2NDaGFubmVscyAhPSBhc2NDaGFubmVscykKKyAgeworICAgICBhc2NDaGFuZ2VkID0gMTsKKworICAgICAvKiBBbGxvY2F0ZSBhbGwgbWVtb3J5IHN0cnVjdHVyZXMgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgICB7CisgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXNjQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgKmFhY0RlY29kZXJEeW5hbWljRGF0YSA9ICZzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMS0+cEFhY0RlY29kZXJEeW5hbWljRGF0YVtjaCUyXTsKKworICAgICAgICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRvIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKi8KKyAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdID0gR2V0QWFjRGVjb2RlckNoYW5uZWxJbmZvKGNoKTsKKyAgICAgICAgICAgLyogVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgdGhlIER5bmFtaWNEYXRhIGlzIHNwbGl0IGludG8gdHdvIG9yIG1vcmUgcmVnaW9ucyEKKyAgICAgICAgICAgICAgVGhlIG1lbW9yeSBjb3VsZCBiZSByZXVzZWQgYWZ0ZXIgY29tcGxldGVkIGNvcmUgZGVjb2RpbmcuICovCisgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICB9CisgICAgICAgICAgIC8qIEhvb2sgc2hhcmVkIHdvcmsgbWVtb3J5IGludG8gY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSAqLworICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEgPSAgYWFjRGVjb2RlckR5bmFtaWNEYXRhOworICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEgPSAmc2VsZi0+YWFjQ29tbW9uRGF0YTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogQWxsb2NhdGUgcGVyc2lzdGVudCBjaGFubmVsIG1lbW9yeSAqLworICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID09IE5VTEwpIHsKKyAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPSBHZXRBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8oY2gpOworICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgeworICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPSBHZXRPdmVybGFwQnVmZmVyKGNoKTsgLyogVGhpcyBhcmVhIHNpemUgZGVwZW5kcyBvbiB0aGUgQU9UICovCisgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQgPSAoU1BFQ1RSQUxfUFRSKSAmc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTJbY2gqMTAyNF07CisKKyAgICAgICAgIH0KKyAgICAgICAgIENQbnNfSW5pdFBucygmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEuYWFjLlBuc0RhdGEsICZzZWxmLT5hYWNDb21tb25EYXRhLnBuc0ludGVyQ2hhbm5lbERhdGEsICZzZWxmLT5hYWNDb21tb25EYXRhLnBuc0N1cnJlbnRTZWVkLCBzZWxmLT5hYWNDb21tb25EYXRhLnBuc1JhbmRvbVNlZWQpOworICAgICAgIH0KKworICAgICAgIGlmIChhc2NDaGFubmVscyA+IHNlbGYtPmFhY0NoYW5uZWxzKQorICAgICAgIHsKKyAgICAgICAgIC8qIE1ha2UgYWxsb2NhdGVkIGNoYW5uZWwgY291bnQgcGVyc2lzdGVudCBpbiBkZWNvZGVyIGNvbnRleHQuICovCisgICAgICAgICBzZWxmLT5hYWNDaGFubmVscyA9IGFzY0NoYW5uZWxzOworICAgICAgIH0KKworICAgICAgIEhjckluaXRSb20oJnNlbGYtPmFhY0NvbW1vbkRhdGEub3ZlcmxheS5hYWMuZXJIY3JJbmZvKTsKKyAgICAgICBzZXRIY3JUeXBlKCZzZWxmLT5hYWNDb21tb25EYXRhLm92ZXJsYXkuYWFjLmVySGNySW5mbywgSURfU0NFKTsKKyAgICB9CisKKyAgICAvKiBNYWtlIGFtb3VudCBvZiBzaWduYWxsZWQgY2hhbm5lbHMgcGVyc2lzdGVudCBpbiBkZWNvZGVyIGNvbnRleHQuICovCisgICAgc2VsZi0+YXNjQ2hhbm5lbHMgPSBhc2NDaGFubmVsczsKKyAgfQorCisgIC8qIFVwZGF0ZSBzdHJ1Y3R1cmVzICovCisgIGlmIChhc2NDaGFuZ2VkKSB7CisKKyAgICAgLyogVGhpbmdzIHRvIGJlIGRvbmUgZm9yIGVhY2ggY2hhbm5lbCwgd2hpY2ggZG8gbm90IGludm9sdmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgICAgIERvaW5nIHRoZXNlIHRoaW5ncyBvbmx5IG9uIHRoZSBjaGFubmVscyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgKGFzY0NoYW5uZWxzKSBjb3VsZCBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGxhdGVyIChlcnJvciBjb25jZWFsbWVudCkuICovCisgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgc3dpdGNoIChzZWxmLT5zdHJlYW1JbmZvLmFvdCkgeworICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGggPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Z3JhbnVsZUxlbmd0aCA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgIG1kY3RfaW5pdCggJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5JTWRjdCwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgT3ZlcmxhcEJ1ZmZlclNpemUgKTsKKworCisgICAgICAgIC8qIFJlc2V0IERSQyBjb250cm9sIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+ZHJjRGF0YSApOworCisgICAgICAgLyogUmVzZXQgY29uY2VhbG1lbnQgb25seSBpZiBBU0MgY2hhbmdlZC4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZG9uZSB3aXRoIGFueSBjb25maWcgY2FsbGJhY2suCisgICAgICAgICAgRS5nLiBldmVyeSB0aW1lIHRoZSBMQVRNIFNNQyBpcyBwcmVzZW50LiAqLworICAgICAgIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKKyAgICAgfQorICB9CisKKyAgLyogVXBkYXRlIGV4dGVybmFsbHkgdmlzaWJsZSBjb3B5IG9mIGZsYWdzICovCisgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnczsKKworICByZXR1cm4gZXJyOworCitiYWlsOgorICBhYWNEZWNvZGVyX0Nsb3NlKCBzZWxmICk7CisgIHJldHVybiBBQUNfREVDX09VVF9PRl9NRU1PUlk7Cit9CisKKworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKAorICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICBJTlRfUENNICpwVGltZURhdGEsCisgICAgICAgIGNvbnN0IElOVCAgdGltZURhdGFTaXplLAorICAgICAgICBjb25zdCBJTlQgaW50ZXJsZWF2ZWQKKyAgICAgICAgKQoreworICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CisKKyAgQ1Byb2dyYW1Db25maWcgKnBjZTsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CisKKyAgTVA0X0VMRU1FTlRfSUQgdHlwZSA9IElEX05PTkU7ICAgICAgICAgICAgLyogQ3VycmVudCBlbGVtZW50IHR5cGUgKi8KKyAgSU5UIGFhY0NoYW5uZWxzPTA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhbm5lbCBjb3VudGVyIGZvciBjaGFubmVscyBmb3VuZCBpbiB0aGUgYml0c3RyZWFtICovCisgIGludCBjaE91dE1hcElkeDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBjaGFubmVsIG1hcHBpbmcgaW5kZXggKHNlZSBjb21tZW50IGJlbG93KSAqLworCisgIElOVCBhdVN0YXJ0QW5jaG9yID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOyAgLyogQVUgc3RhcnQgYml0IGJ1ZmZlciBwb3NpdGlvbiBmb3IgQVUgYnl0ZSBhbGlnbm1lbnQgKi8KKworICBzZWxmLT5mcmFtZU9LID0gMTsKKworICAvKiBBbnkgc3VwcG9ydGVkIGJhc2UgbGF5ZXIgdmFsaWQgQVUgd2lsbCByZXF1aXJlIG1vcmUgdGhhbiAxNiBiaXRzLiAqLworICBpZiAoICh0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCkgPCAxNSkgJiYgKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpID09IDApIHsKKyAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICB9CisKKworICAvKiBSZXNldCBQcm9ncmFtIENvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgcGNlID0gJnNlbGYtPnBjZTsKKyAgQ1Byb2dyYW1Db25maWdfUmVzZXQocGNlKTsKKworICBDQWFjRGVjb2Rlcl9BbmNEYXRhUmVzZXQoJnNlbGYtPmFuY0RhdGEpOworCisgIHsKKyAgICBpbnQgY2g7CisKKyAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnID09IDApIHsKKyAgICAgIC8qIEluaXQgQ2hhbm5lbC9FbGVtZW50IG1hcHBpbmcgdGFibGUgKi8KKyAgICAgIGZvciAoY2g9MDsgY2g8KDgpOyBjaCsrKSB7CisgICAgICAgIHNlbGYtPmNoTWFwcGluZ1tjaF0gPSAyNTU7CisgICAgICB9CisgICAgICBpZiAoIUNQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSkgeworICAgICAgICBpbnQgZWw7CisgICAgICAgIGZvciAoZWw9MDsgZWw8KDgpOyBlbCsrKSB7CisgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdID0gSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENoZWNrIHNhbXBsaW5nIGZyZXF1ZW5jeSAgKi8KKyAgc3dpdGNoICggc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlICkgeworICAgIGNhc2UgMTYwMDA6CisgICAgY2FzZSAxMjAwMDoKKyAgIGNhc2UgMTEwMjU6CisgICBjYXNlICA4MDAwOgorICAgIGNhc2UgIDczNTA6CisgICAgY2FzZSA0ODAwMDoKKyAgICBjYXNlIDQ0MTAwOgorICAgIGNhc2UgMzIwMDA6CisgICAgY2FzZSAyNDAwMDoKKyAgICBjYXNlIDIyMDUwOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICggISAoc2VsZi0+ZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTApKSApIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworCisgIGlmICggZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCApCisgIHsKKyAgICBpbnQgY2g7CisgICAgLyogQ2xlYXIgaGlzdG9yeSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAvKiBSZXNldCBjb25jZWFsbWVudCAqLworICAgICAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKKyAgICAgIC8qIENsZWFyIG92ZXJsYXAtYWRkIGJ1ZmZlcnMgdG8gYXZvaWQgY2xpY2tzLiAqLworICAgICAgRkRLbWVtY2xlYXIoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyLCBPdmVybGFwQnVmZmVyU2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgfQorICB9CisKKworCisjaWZkZWYgVFBfUENFX0VOQUJMRQorICBpbnQgcGNlUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGluZGljYXRpbmcgYSBQQ0UgaW4gdGhlIGN1cnJlbnQgcmF3X2RhdGFfYmxvY2soKSAqLworI2VuZGlmCisKKworICBJTlQgaGRhYWNEZWNvZGVkID0gMDsKKyAgTVA0X0VMRU1FTlRfSUQgcHJldmlvdXNfZWxlbWVudCA9IElEX0VORDsgLyogTGFzdCBlbGVtZW50IElEIChyZXF1aXJlZCBmb3IgZXh0ZW5zaW9uIHBheWxvYWQgbWFwcGluZyAqLworICBVQ0hBUiBwcmV2aW91c19lbGVtZW50X2luZGV4ID0gMDsgICAgICAgICAvKiBDYW5vbmljYWwgaW5kZXggb2YgbGFzdCBlbGVtZW50ICovCisgIGludCBlbGVtZW50X2NvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgY291bnRlciBmb3IgZWxlbWVudHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworICBpbnQgZWxfY250W0lEX0xBU1RdID0geyAwIH07ICAgICAgICAgICAgICAvKiBlbGVtZW50IGNvdW50ZXIgKCByb2J1c3RuZXNzICkgKi8KKworICB3aGlsZSAoICh0eXBlICE9IElEX0VORCkgJiYgKCEgKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkpICYmIHNlbGYtPmZyYW1lT0sgKQorICB7CisgICAgaW50IGVsX2NoYW5uZWxzOworCisgICAgaWYgKCEgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRHxBQ19TQ0FMQUJMRXxBQ19FUikpKQorICAgICAgdHlwZSA9IChNUDRfRUxFTUVOVF9JRCkgRkRLcmVhZEJpdHMoYnMsMyk7CisgICAgZWxzZSAKKyAgICAgIHR5cGUgPSBzZWxmLT5lbGVtZW50c1tlbGVtZW50X2NvdW50XTsKKworICAgIHNldEhjclR5cGUoJnNlbGYtPmFhY0NvbW1vbkRhdGEub3ZlcmxheS5hYWMuZXJIY3JJbmZvLCB0eXBlKTsKKworCisgICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDApCisgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICBjYXNlIElEX1NDRToKKyAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgY2FzZSBJRF9MRkU6CisgICAgICAgIC8qCisgICAgICAgICAgQ29uc2lzdGVuY3kgY2hlY2sKKyAgICAgICAgKi8KKworICAgICAgICBpZiAodHlwZSA9PSBJRF9DUEUpIHsKKyAgICAgICAgICBlbF9jaGFubmVscyA9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZWxfY2hhbm5lbHMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAoZWxfY250W3R5cGVdID49IChzZWxmLT5hc2NDaGFubmVscz4+KGVsX2NoYW5uZWxzLTEpKSkgfHwgKGFhY0NoYW5uZWxzID4gKHNlbGYtPmFzY0NoYW5uZWxzLWVsX2NoYW5uZWxzKSkgKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIShzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpICkgeworICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICBmb3IgKGNoPTA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKz0xKSB7CisgICAgICAgICAgICBDUG5zX1Jlc2V0RGF0YSgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscytjaF0tPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscytjaF0tPnBDb21EYXRhLT5wbnNJbnRlckNoYW5uZWxEYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzZWxmLT5mcmFtZU9LKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQ2hhbm5lbEVsZW1lbnRfUmVhZCggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbF9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmVwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhJbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmICggc2VsZi0+ZnJhbWVPSykgeworICAgICAgICAgIC8qIExvb2t1cCB0aGUgZWxlbWVudCBhbmQgZGVjb2RlIGl0IG9ubHkgaWYgaXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9ncmFtICovCisgICAgICAgICAgaWYgKCBDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAorICAgICAgICAgICAgICAgICAgcGNlLAorICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVsc10tPkVsZW1lbnRJbnN0YW5jZVRhZywKKyAgICAgICAgICAgICAgICAgIGFhY0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCisgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgJnByZXZpb3VzX2VsZW1lbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgIHR5cGUpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFoZGFhY0RlY29kZWQgKSB7CisgICAgICAgICAgICAgIENDaGFubmVsRWxlbWVudF9EZWNvZGUoCisgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBlbF9jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhYWNDaGFubmVscyArPSAxOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gSURfQ1BFKSB7CisgICAgICAgICAgICAgIGFhY0NoYW5uZWxzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENyZWF0ZSBTQlIgZWxlbWVudCBmb3IgU0JSIGZvciB1cHNhbXBsaW5nIGZvciBMRkUgZWxlbWVudHMsCisgICAgICAgICAgICAgYW5kIGlmIFNCUiB3YXMgZXhwbGljaXRseSBzaWduYWxlZCwgYmVjYXVzZSB0aGUgZmlyc3QgZnJhbWUocykKKyAgICAgICAgICAgICBtYXkgbm90IGNvbnRhaW4gU0JSIHBheWxvYWQgKGJyb2tlbiBlbmNvZGVyLCBiaXQgZXJyb3JzKS4gKi8KKyAgICAgICAgICBpZiAoIChzZWxmLT5mbGFncyAmIEFDX1NCUl9QUkVTRU5UKSB8fCAoc2VsZi0+c2JyRW5hYmxlZCA9PSAxKSApCisgICAgICAgICAgeworICAgICAgICAgICAgU0JSX0VSUk9SIHNickVycm9yOworCisgICAgICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSW5pdEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKKyAgICAgICAgICAgICAgLyogRG8gbm90IHRyeSB0byBhcHBseSBTQlIgYmVjYXVzZSBpbml0aWFsaXppbmcgdGhlIGVsZW1lbnQgZmFpbGVkLiAqLworICAgICAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbF9jbnRbdHlwZV0rKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSURfQ0NFOgorICAgICAgICAvKgorICAgICAgICAgIENvbnNpc3RlbmN5IGNoZWNrCisgICAgICAgICovCisgICAgICAgIGlmICggZWxfY250W3R5cGVdID4gc2VsZi0+YXNjQ2hhbm5lbHMgKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLT5mcmFtZU9LKQorICAgICAgICB7CisgICAgICAgICAgLyogbWVtb3J5IGZvciBzcGVjdHJhbCBsaW5lcyB0ZW1wb3JhbCBvbiBzY3JhdGNoICovCisgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKG1kY3RTcGVjLCBGSVhQX0RCTCwgMTAyNCk7CisKKyAgICAgICAgICAvKiBjcmVhdGUgZHVtbXkgY2hhbm5lbCBmb3IgQ0NFIHBhcnNpbmcgb24gc3RhY2sgKi8KKyAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sICpwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvOworCisgICAgICAgICAgRkRLbWVtY2xlYXIobWRjdFNwZWMsIDEwMjQqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucER5bkRhdGEgPSAgIHNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUxLT5wQWFjRGVjb2RlckR5bmFtaWNEYXRhOworICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wQ29tRGF0YSA9ICAmc2VsZi0+YWFjQ29tbW9uRGF0YTsKKyAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucFNwZWN0cmFsQ29lZmZpY2llbnQgID0gKFNQRUNUUkFMX1BUUiltZGN0U3BlYzsKKyAgICAgICAgICAvKiBBc3N1bWUgQUFDLUxDICovCisgICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLmdyYW51bGVMZW5ndGggPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAvIDg7CisKKyAgICAgICAgICAvKiBSZXNldCBQTlMgZGF0YS4gKi8KKyAgICAgICAgICBDUG5zX1Jlc2V0RGF0YSgmdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLmRhdGEuYWFjLlBuc0RhdGEsICZ0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucENvbURhdGEtPnBuc0ludGVyQ2hhbm5lbERhdGEpOworCisgICAgICAgICAgcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9ICZ0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm87CisgICAgICAgICAgLyogZG8gQ0NFIHBhcnNpbmcgKi8KKyAgICAgICAgICBFcnJvclN0YXR1cyA9IENDaGFubmVsRWxlbWVudF9SZWFkKCBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aElucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChtZGN0U3BlYywgRklYUF9EQkwsIDEwMjQpOworCisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSykgeworICAgICAgICAgICAgLyogTG9va3VwIHRoZSBlbGVtZW50IGFuZCBkZWNvZGUgaXQgb25seSBpZiBpdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0gKi8KKyAgICAgICAgICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBwY2UsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mby0+RWxlbWVudEluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgIHR5cGUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogZGVjb2Rpbmcgb2YgQ0NFIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxfY250W3R5cGVdKys7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX0RTRToKKyAgICAgICAgeworICAgICAgICAgIFVDSEFSIGVsZW1lbnRfaW5zdGFuY2VfdGFnOworCisgICAgICAgICAgQ0RhdGFTdHJlYW1FbGVtZW50X1JlYWQoIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50X2luc3RhbmNlX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVTdGFydEFuY2hvciApOworCisgICAgICAgICAgaWYgKCFDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAorICAgICAgICAgICAgICAgICAgIHBjZSwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgZWxlbWVudF9pbnN0YW5jZV90YWcsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCisgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICB0eXBlKSApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogbW9zdCBsaWtlbHkgYW4gZXJyb3IgaW4gYml0c3RyZWFtIG9jY3VyZWQgKi8KKyAgICAgICAgICAgIC8vc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWZkZWYgVFBfUENFX0VOQUJMRQorICAgICAgY2FzZSBJRF9QQ0U6CisgICAgICAgIHsKKyAgICAgICAgICBpbnQgcmVzdWx0ID0gQ1Byb2dyYW1Db25maWdFbGVtZW50X1JlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1U3RhcnRBbmNob3IgKTsKKyAgICAgICAgICBpZiAoIHJlc3VsdCA8IDAgKSB7CisgICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyAqLworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCByZXN1bHQgPiAxICkgeworICAgICAgICAgICAgLyogQnVpbHQgZWxlbWVudCB0YWJsZSAqLworICAgICAgICAgICAgaW50IGVsSWR4ID0gQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKHBjZSwgc2VsZi0+ZWxlbWVudHMsICg4KSwgJnNlbGYtPmNoTWFwSW5kZXgpOworICAgICAgICAgICAgLyogUmVzZXQgdGhlIHJlbWFpbmluZyB0YWJzICovCisgICAgICAgICAgICBmb3IgKCA7IGVsSWR4PCg4KTsgZWxJZHgrKykgeworICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbElkeF0gPSBJRF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTWFrZSBuZXcgbnVtYmVyIG9mIGNoYW5uZWwgcGVyc2lzdGFudCAqLworICAgICAgICAgICAgc2VsZi0+YXNjQ2hhbm5lbHMgPSBwY2UtPk51bUNoYW5uZWxzOworICAgICAgICAgICAgLyogSWYgUENFIGlzIG5vdCBmaXJzdCBlbGVtZW50IGNvbmNlYWwgdGhpcyBmcmFtZSB0byBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgKi8KKyAgICAgICAgICAgIGlmICggZWxlbWVudF9jb3VudCAhPSAwICkgeworICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcGNlUmVhZCA9IChyZXN1bHQ+PTApID8gMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworCisgICAgICBjYXNlIElEX0ZJTDoKKyAgICAgICAgeworICAgICAgICAgIGludCBiaXRDbnQgPSBGREtyZWFkQml0cyhicyw0KTsgICAgICAgICAgIC8qIGJzX2NvdW50ICovCisKKyAgICAgICAgICBpZiAoYml0Q250ID09IDE1KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlc2NfY291bnQgPSBGREtyZWFkQml0cyhicyw4KTsgICAgIC8qIGJzX2VzY19jb3VudCAqLworICAgICAgICAgICAgYml0Q250ID0gIGVzY19jb3VudCArIDE0OworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIENvbnZlcnQgdG8gYml0cyAqLworICAgICAgICAgIGJpdENudCA8PD0gMzsKKworICAgICAgICAgIHdoaWxlIChiaXRDbnQgPiAwKSB7CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZShzZWxmLCBicywgJmJpdENudCwgcHJldmlvdXNfZWxlbWVudCwgcHJldmlvdXNfZWxlbWVudF9pbmRleCwgMSk7CisgICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX0VYVDoKKyAgICAgICAgeworICAgICAgICAgIElOVCBiaXRDbnQgPSAwOworCisgICAgICAgICAgLyogZ2V0IHRoZSByZW1haW5pbmcgYml0cyBvZiB0aGlzIGZyYW1lICovCisgICAgICAgICAgYml0Q250ID0gdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyhzZWxmLT5oSW5wdXQsIDApOworCisgICAgICAgICAgaWYgKCAoYml0Q250ID4gMCkgJiYgKHNlbGYtPmZsYWdzICYgQUNfU0JSX1BSRVNFTlQpICYmIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19FTEQpKSApCisgICAgICAgICAgeworICAgICAgICAgICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKKyAgICAgICAgICAgIGludCAgZWxJZHgsIG51bUNoRWxlbWVudHMgPSBlbF9jbnRbSURfU0NFXSArIGVsX2NudFtJRF9DUEVdOworCisgICAgICAgICAgICBmb3IgKGVsSWR4ID0gMDsgZWxJZHggPCBudW1DaEVsZW1lbnRzOyBlbElkeCArPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlcnIgPSBzYnJEZWNvZGVyX1BhcnNlICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgIGJzLAorICAgICAgICAgICAgICAgICAgICZiaXRDbnQsCisgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyAmIEFDX1NCUkNSQywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxJZHhdLAorICAgICAgICAgICAgICAgICAgICBlbElkeCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgJiBBQ19JTkRFUCApOworCisgICAgICAgICAgICAgIGlmIChlcnIgIT0gU0JSREVDX09LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgICAgICBjYXNlIFNCUkRFQ19QQVJTRV9FUlJPUjoKKyAgICAgICAgICAgICAgLyogQ2FuIG5vdCBnbyBvbiBwYXJzaW5nIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAgICAgICAgICAgIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgU0JSIGV4dGVuc2lvbiBkYXRhLiAqLworICAgICAgICAgICAgICBGREtwdXNoRm9yKGJzLCBiaXRDbnQpOworICAgICAgICAgICAgICBiaXRDbnQgPSAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0JSREVDX09LOgorICAgICAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAoICEgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0RSTSkpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIGJpdENudCA+IDcgKSB7CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlKHNlbGYsIGJzLCAmYml0Q250LCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCAwKTsKKyAgICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSURfRU5EOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHByZXZpb3VzX2VsZW1lbnQgPSB0eXBlOworICAgIGVsZW1lbnRfY291bnQrKzsKKworICB9ICAgLyogd2hpbGUgKCAodHlwZSAhPSBJRF9FTkQpIC4uLiApICovCisKKyAgaWYgKCAhKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpICkKKyAgeworICAgIC8qIEJ5dGUgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSByYXdfZGF0YV9ibG9jaygpLiAqLworICAgIHsKKyAgICAgIEZES2J5dGVBbGlnbihicywgYXVTdGFydEFuY2hvcik7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgYWxsIGJpdHMgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkgaGF2ZSBiZWVuIHJlYWQuICovCisgICAgaWYgKCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzVG90YWwoc2VsZi0+aElucHV0LCAwKSA+IDAgKSB7CisgICAgICBJTlQgdW5yZWFkQml0cyA9IHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoc2VsZi0+aElucHV0LCAwKTsKKyAgICAgIGlmICggdW5yZWFkQml0cyAhPSAwICkgeworCisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KKyAgICAgICAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0sgJiYgc2VsZi0+ZnJhbWVPSyA9PSAwKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8qIEFsd2F5cyBwdXQgdGhlIGJpdGJ1ZmZlciBhdCB0aGUgcmlnaHQgcG9zaXRpb24gYWZ0ZXIgdGhlIGN1cnJlbnQgQWNjZXNzIFVuaXQuICovCisgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCB1bnJlYWRCaXRzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgbGFzdCBlbGVtZW50LiBUaGUgdGVybWluYXRvciAoSURfRU5EKSBoYXMgdG8gYmUgdGhlIGxhc3Qgb25lIChldmVuIGlmIEVSIHN5bnRheCBpcyB1c2VkKS4gKi8KKyAgICBpZiAoIHNlbGYtPmZyYW1lT0sgJiYgdHlwZSAhPSBJRF9FTkQgKSB7CisgICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KKyAgICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgIH0KKyAgfQorCisgIC8qIE1vcmUgQUFDIGNoYW5uZWxzIHRoYW4gc3BlY2lmaWVkIGJ5IHRoZSBBU0Mgbm90IGFsbG93ZWQuICovCisgIGlmICggKGFhY0NoYW5uZWxzID09IDAgfHwgYWFjQ2hhbm5lbHMgPiBzZWxmLT5hYWNDaGFubmVscykgJiYgIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSApIHsKKyAgICB7CisgICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KKyAgICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICB9CisgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICB9CisgICAgYWFjQ2hhbm5lbHMgPSAwOworICB9CisgIGVsc2UgaWYgKCBhYWNDaGFubmVscyA+IHNlbGYtPmFzY0NoYW5uZWxzICkgeworICAgIC8qIERvIG5vdCBvdmVyd3JpdGUgY3VycmVudCBlcnJvciAqLworICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgIH0KKyAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICBhYWNDaGFubmVscyA9IDA7CisgIH0KKworICBpZiAoIFRSQU5TUE9SVERFQ19PSyAhPSB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soc2VsZi0+aElucHV0KSApCisgIHsKKyAgICBzZWxmLT5mcmFtZU9LPTA7CisgIH0KKworICAvKiBzdG9yZSBvciByZXN0b3JlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGluZm8gKi8KKyAgaWYgKCBzZWxmLT5mcmFtZU9LICYmICEoZmxhZ3MgJihBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSApIHsKKyAgICBzZWxmLT5hYWNDaGFubmVsc1ByZXYgPSBhYWNDaGFubmVsczsgIC8qIHN0b3JlICovCisgICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxUeXBlUHJldiwgc2VsZi0+Y2hhbm5lbFR5cGUsICg4KSpzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7ICAvKiBzdG9yZSAqLworICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlc1ByZXYsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCAoOCkqc2l6ZW9mKFVDSEFSKSk7ICAgICAgICAgLyogc3RvcmUgKi8KKyAgICBzZWxmLT5zYnJFbmFibGVkUHJldiA9IHNlbGYtPnNickVuYWJsZWQ7CisgIH0gZWxzZSB7CisgICAgaWYgKHNlbGYtPmFhY0NoYW5uZWxzID4gMCkgeworICAgICAgYWFjQ2hhbm5lbHMgPSBzZWxmLT5hYWNDaGFubmVsc1ByZXY7ICAvKiByZXN0b3JlICovCisgICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbFR5cGUsIHNlbGYtPmNoYW5uZWxUeXBlUHJldiwgKDgpKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsgIC8qIHJlc3RvcmUgKi8KKyAgICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlcywgc2VsZi0+Y2hhbm5lbEluZGljZXNQcmV2LCAoOCkqc2l6ZW9mKFVDSEFSKSk7ICAgICAgICAgLyogcmVzdG9yZSAqLworICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IHNlbGYtPnNickVuYWJsZWRQcmV2OworICAgICB9CisgIH0KKworICAvKiBVcGRhdGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID0gYWFjQ2hhbm5lbHM7CisKKyAjaWZkZWYgVFBfUENFX0VOQUJMRQorICBpZiAocGNlUmVhZCA9PSAxICYmIENQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSkgeworICAgIC8qIFNldCBtYXRyaXggbWl4ZG93biBpbmZvcyBpZiBhdmFpbGFibGUgZnJvbSBQQ0UuICovCisgICAgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICggc2VsZi0+aFBjbVV0aWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZS0+TWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2UtPk1hdHJpeE1peGRvd25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2UtPlBzZXVkb1N1cnJvdW5kRW5hYmxlICk7CisgIH0KKyAjZW5kaWYKKworICAvKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBkYXRhIHRvIHRyYW5zZnJvbSBpbnRvIHRpbWUgZG9tYWluLCByZXR1cm4uICovCisgIGlmICggISBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgeworICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgfQorCisgIC8qIFNldHVwIHRoZSBvdXRwdXQgY2hhbm5lbCBtYXBwaW5nLiBUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIGZvdXIgcG9zc2liaWxpdGllczoKKyAgICogICAjIHwgY2hDZmcgfCBQQ0UgfCBjQ2hDZmcgfCBjaE91dE1hcElkeAorICAgKiAgLS0tKy0tLS0tLS0rLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqICAgMSB8ICA+IDAgIHwgIG5vIHwgICAgLSAgIHwgY2hDZmcKKyAgICogICAyIHwgICAwICAgfCB5ZXMgfCAgPiAwICAgfCBjQ2hDZmcKKyAgICogICAzIHwgICAwICAgfCB5ZXMgfCAgICAwICAgfCBhYWNDaGFubmVscyB8fCAwCisgICAqICAgNCB8ICAgMCAgIHwgIG5vIHwgICAgLSAgIHwgYWFjQ2hhbm5lbHMgfHwgMAorICAgKiAgLS0tKy0tLS0tLS0rLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqICBXaGVyZSBjaENmZyBpcyB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4IGZyb20gQVNDIGFuZCBjQ2hDZmcgaXMgYSBjb3JyZXNwb25kaW5nIGNoQ2ZnCisgICAqICBkZXJpdmVkIGZyb20gYSBnaXZlbiBQQ0UuIFRoZSB2YXJpYWJsZSBhYWNDaGFubmVscyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCBmb3VuZAorICAgKiAgZHVyaW5nIGJpdHN0cmVhbSBkZWNvZGluZy4gRHVlIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1hcHBpbmcgdGFibGUgaXQgY2FuIG9ubHkgYmUgdXNlZCBmb3IKKyAgICogIG1hcHBpbmcgaWYgaXRzIHZhbHVlIGlzIHNtYWxsZXIgdGhhbiA3LiBPdGhlcndpc2Ugd2UgdXNlIHRoZSBmYWxsYmFjayAoMCkgd2hpY2ggaXMgYSBzaW1wbGUKKyAgICogIHBhc3MtdGhyb3VnaC4gVGhlIHBvc3NpYmlsaXR5ICM0IHNob3VsZCBhcHBlYXIgb25seSB3aXRoIE1QRUctMiAoQURUUykgc3RyZWFtcy4gVGhpcyBpcworICAgKiAgbW9kZSBpcyBjYWxsZWQgImltcGxpY2l0IGNoYW5uZWwgbWFwcGluZyIuCisgICAqLworICBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKGFhY0NoYW5uZWxzPDcpKSA/IGFhY0NoYW5uZWxzIDogc2VsZi0+Y2hNYXBJbmRleDsKKworICAvKgorICAgIEludmVyc2UgdHJhbnNmb3JtCisgICovCisgIHsKKyAgICBpbnQgc3RyaWRlLCBvZmZzZXQsIGM7CisKKyAgICAvKiBUdXJuIG9uL29mZiBEUkMgbW9kdWxlcyBsZXZlbCBub3JtYWxpemF0aW9uIGluIGRpZ2l0YWwgZG9tYWluIGRlcGVuZGluZyBvbiB0aGUgbGltaXRlciBzdGF0dXMuICovCisgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSggc2VsZi0+aERyY0luZm8sIEFQUExZX05PUk1BTElaQVRJT04sIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAwIDogMSApOworICAgIC8qIEV4dHJhY3QgRFJDIGNvbnRyb2wgZGF0YSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzICh3aXRob3V0IGJpdHN0cmVhbSBkZWxheSkgKi8KKyAgICBhYWNEZWNvZGVyX2RyY1Byb2xvZyAoCisgICAgICAgICAgICBzZWxmLT5oRHJjSW5mbywKKyAgICAgICAgICAgIGJzLAorICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgIHNlbGYtPnBjZS5FbGVtZW50SW5zdGFuY2VUYWcsCisgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCisgICAgICAgICAgICBhYWNDaGFubmVscworICAgICAgICAgICk7CisKKyAgICAvKiAiYyIgaXRlcmF0ZXMgaW4gY2Fub25pY2FsIE1QRUcgY2hhbm5lbCBvcmRlciAqLworICAgIGZvciAoYz0wOyBjIDwgYWFjQ2hhbm5lbHM7IGMrKykKKyAgICB7CisgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvOworCisgICAgICAvKiBTZWxlY3QgY29ycmVjdCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KKyAgICAgIGlmIChzZWxmLT5jaE1hcHBpbmdbY10gPj0gYWFjQ2hhbm5lbHMpIHsKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9IHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY107CisgICAgICB9IGVsc2UgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvID0gc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tzZWxmLT5jaE1hcHBpbmdbY11dOworICAgICAgfQorCisgICAgICAvKiBTZXR1cCBvZmZzZXQgYW5kIHN0cmlkZSBmb3IgdGltZSBidWZmZXIgdHJhdmVyc2FsLiAqLworICAgICAgaWYgKGludGVybGVhdmVkKSB7CisgICAgICAgIHN0cmlkZSA9IGFhY0NoYW5uZWxzOworICAgICAgICBvZmZzZXQgPSBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY107CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBvZmZzZXQgPSBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY10gKiBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgIH0KKworCisgICAgICBpZiAoIGZsYWdzJkFBQ0RFQ19GTFVTSCApIHsKKyAgICAgICAgLyogQ2xlYXIgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQgYmVjYXVzZSB3aXRoIEFBQ0RFQ19GTFVTSCBzZXQgaXQgY29udGFpbnMgdW5kZWZpbmVkIGRhdGEuICovCisgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzaXplb2YoRklYUF9EQkwpKnNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAgQ29uY2VhbCBkZWZlY3RpdmUgc3BlY3RyYWwgZGF0YQorICAgICAgKi8KKyAgICAgIENDb25jZWFsbWVudF9BcHBseSgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+Y29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyZBQUNERUNfQ09OQ0VBTCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgICBpZiAoZmxhZ3MgJiAoQUFDREVDX0lOVFJ8QUFDREVDX0NMUkhJU1QpKSB7CisgICAgICAgIC8qIFJlc2V0IERSQyBjb250cm9sIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLT5kcmNEYXRhICk7CisgICAgICB9CisgICAgICAvKiBUaGUgRFJDIG1vZHVsZSBkZW1hbmRzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBnYWluIGZpZWxkIGhvbGRpbmcgdGhlIGdhaW4gc2NhbGUuICovCisgICAgICBzZWxmLT5leHRHYWluWzBdID0gKEZJWFBfREJMKVRETF9HQUlOX1NDQUxJTkc7CisgICAgICAvKiBEUkMgcHJvY2Vzc2luZyAqLworICAgICAgYWFjRGVjb2Rlcl9kcmNBcHBseSAoCisgICAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAorICAgICAgICAgICAgICBzZWxmLT5oU2JyRGVjb2RlciwKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+ZHJjRGF0YSwKKyAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbiwKKyAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgIHNlbGYtPnNickVuYWJsZWQKKyAgICAgICAgICAgICk7CisKKyAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBBQUNERUNfUkVOREVSX0lNRENUOgorICAgICAgICAgIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoCisgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLAorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyZBQUNERUNfQ09OQ0VBTCkpLAorICAgICAgICAgICAgICAgICAgc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEtPm1kY3RPdXRUZW1wCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQ0RFQ19SRU5ERVJfRUxERkI6CisgICAgICAgICAgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZUxvd0RlbGF5KAorICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXSwKKyAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBwVGltZURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgIHN0cmlkZQorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXkgPSAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUqMiAtICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZS8yIC0gMSkvMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICggZmxhZ3MmQUFDREVDX0ZMVVNIICkgeworICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzaXplb2YoRklYUF9EQkwpKnNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+cE92ZXJsYXBCdWZmZXIsIE92ZXJsYXBCdWZmZXJTaXplKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorICAgIH0KKworCisgICAgLyogRXh0cmFjdCBEUkMgY29udHJvbCBkYXRhIGFuZCBtYXAgaXQgdG8gY2hhbm5lbHMgKHdpdGggYml0c3RyZWFtIGRlbGF5KSAqLworICAgIGFhY0RlY29kZXJfZHJjRXBpbG9nICgKKyAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAorICAgICAgICAgICAgYnMsCisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgc2VsZi0+cGNlLkVsZW1lbnRJbnN0YW5jZVRhZywKKyAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywKKyAgICAgICAgICAgIGFhY0NoYW5uZWxzCisgICAgICAgICAgKTsKKyAgfQorCisgIC8qIEFkZCBhZGRpdGlvbmFsIGNvbmNlYWxtZW50IGRlbGF5ICovCisgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgKiBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKworICAvKiBNYXAgRFJDIGRhdGEgdG8gU3RyZWFtSW5mbyBzdHJ1Y3R1cmUgKi8KKyAgYWFjRGVjb2Rlcl9kcmNHZXRJbmZvICgKKyAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAorICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5kcmNQcmVzTW9kZSwKKyAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uZHJjUHJvZ1JlZkxldgorICAgICAgICAgICk7CisKKyAgLyogUmVvcmRlciBjaGFubmVsIHR5cGUgaW5mb3JtYXRpb24gdGFibGVzLiAgKi8KKyAgeworICAgIEFVRElPX0NIQU5ORUxfVFlQRSB0eXBlc1soOCldOworICAgIFVDSEFSIGlkeFsoOCldOworICAgIGludCBjOworCisgICAgRkRLX0FTU0VSVChzaXplb2Yoc2VsZi0+Y2hhbm5lbFR5cGUpID09IHNpemVvZih0eXBlcykpOworICAgIEZES19BU1NFUlQoc2l6ZW9mKHNlbGYtPmNoYW5uZWxJbmRpY2VzKSA9PSBzaXplb2YoaWR4KSk7CisKKyAgICBGREttZW1jcHkodHlwZXMsIHNlbGYtPmNoYW5uZWxUeXBlLCBzaXplb2YodHlwZXMpKTsKKyAgICBGREttZW1jcHkoaWR4LCBzZWxmLT5jaGFubmVsSW5kaWNlcywgc2l6ZW9mKGlkeCkpOworCisgICAgZm9yIChjPTA7IGM8YWFjQ2hhbm5lbHM7IGMrKykgeworICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmdbY2hPdXRNYXBJZHhdW2NdXSA9IHR5cGVzW2NdOworICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXNbc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmdbY2hPdXRNYXBJZHhdW2NdXSA9IGlkeFtjXTsKKyAgICB9CisgIH0KKworICBzZWxmLT5ibG9ja051bWJlcisrOworCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworLyohCisgIFxicmllZiByZXR1cm5zIHRoZSBzdHJlYW1pbmZvIHBvaW50ZXIKKworICBUaGUgZnVuY3Rpb24gaGFuZHMgYmFjayBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbWluZm8gc3RydWN0dXJlCisKKyAgXHJldHVybiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QKKyovCitMSU5LU1BFQ19DUFAgQ1N0cmVhbUluZm8qIENBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8gKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICkKK3sKKyAgaWYgKCFzZWxmKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuICZzZWxmLT5zdHJlYW1JbmZvOworfQorCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmggYi9hYWMvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MTc3MwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaApAQCAtMCwwICsxLDMyMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFBQ0RFQ09ERVJfSAorI2RlZmluZSBBQUNERUNPREVSX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworI2luY2x1ZGUgInRwZGVjX2xpYi5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjaW5jbHVkZSAiYmxvY2suaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworCisjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgorCisgI2luY2x1ZGUgInBjbXV0aWxzX2xpYi5oIgorICNpbmNsdWRlICJsaW1pdGVyLmgiCisKKworLyogQ2FwYWJpbGl0aWVzIGZsYWdzICovCisjZGVmaW5lIENBUEZfQUFDX0xDICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIENBUEZfQUFDX0xEICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIENBUEZfQUFDX1NDQUwgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIENBUEZfQUFDX0VSICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENBUEZfQUFDXzQ4MCAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIENBUEZfQUFDXzUxMiAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIENBUEZfQUFDXzk2MCAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIENBUEZfQUFDXzEwMjQgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIENBUEZfQUFDX0hDUiAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIENBUEZfQUFDX1ZDQjExICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENBUEZfQUFDX1JWTEMgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIENBUEZfQUFDX01QRUc0ICAgICAgICAweDAwMDAwODAwIC8qIFBOUyAqLworI2RlZmluZSBDQVBGX0FBQ19EUkMgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBDQVBGX0FBQ19DT05DRUFMICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBDQVBGX0FBQ19EUk1fQlNGT1JNQVQgMHgwMDAwNDAwMAorI2RlZmluZSBDQVBGX0FBQ19CU0FDICAgICAgICAgMHgwMDAwODAwMAorCit0eXBlZGVmIHN0cnVjdCBBQUNfREVDT0RFUl9JTlNUQU5DRSAqSEFORExFX0FBQ0RFQ09ERVI7CisKKworZW51bQoreworICBMID0gMCwKKyAgUiA9IDEKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgaW50IGJ1ZmZlclNpemU7CisgICAgaW50IG9mZnNldFs4XTsKKyAgICBpbnQgbnJFbGVtZW50czsKK30gQ0FuY0RhdGE7CisKK3R5cGVkZWYgZW51bSB7CisgIE5PVF9ERUZJTkVEID0gLTEsCisgIE1PREVfSFEgICAgID0gIDAsCisgIE1PREVfTFAgICAgID0gIDEKK30gUU1GX01PREU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50ICAgICAgICBic0RlbGF5OworfSBTQlJfUEFSQU1TOworCisKKy8qIEFBQyBkZWNvZGVyIChvcGFxdWUgdG93YXJkIHVzZXJsYW5kKSBzdHJ1Y3QgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBBQUNfREVDT0RFUl9JTlNUQU5DRSB7CisgIElOVCAgICAgICAgICAgICAgICAgICBhYWNDaGFubmVsczsgICAgICAgICAgICAgICAgIC8qITwgQW1vdW50IG9mIEFBQyBkZWNvZGVyIGNoYW5uZWxzIGFsbG9jYXRlZC4gICAgICAgICovCisgIElOVCAgICAgICAgICAgICAgICAgICBhc2NDaGFubmVsczsgICAgICAgICAgICAgICAgIC8qITwgQW1vdW50IG9mIEFBQyBkZWNvZGVyIGNoYW5uZWxzIHNpZ25hbGxlZCBpbiBBU0MuICovCisgIElOVCAgICAgICAgICAgICAgICAgICBibG9ja051bWJlcjsgICAgICAgICAgICAgICAgIC8qITwgZnJhbWUgY291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgSU5UICAgICAgICAgICAgICAgICAgIG5yT2ZMYXllcnM7CisKKyAgSU5UICAgICAgICAgICAgICAgICAgIG91dHB1dEludGVybGVhdmVkOyAgICAgICAgICAgLyohPCBQQ00gb3V0cHV0IGZvcm1hdCAoaW50ZXJsZWF2ZWQvbm9uZSBpbnRlcmxlYXZlZCkuICovCisKKyAgSEFORExFX1RSQU5TUE9SVERFQyAgIGhJbnB1dDsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc3BvcnQgbGF5ZXIgaGFuZGxlLiAqLworCisgIFNhbXBsaW5nUmF0ZUluZm8gICAgICBzYW1wbGluZ1JhdGVJbmZvOyAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgUmF0ZSBpbmZvcm1hdGlvbiB0YWJsZSAqLworCisgIFVDSEFSICAgICAgICAgICAgICAgICBmcmFtZU9LOyAgICAgICAgICAgICAgICAgICAgIC8qITwgV2lsbCBiZSB1bnNldCBpZiBhIGNvbnNpc3RlbmN5IGNoZWNrLCBlLmcuIENSQyBldGMuIGZhaWxzICovCisKKyAgVUlOVCAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyBmb3IgaW50ZXJuYWwgZGVjb2RlciB1c2UuIERPIE5PVCBVU0Ugc2VsZjo6c3RyZWFtaW5mbzo6ZmxhZ3MgISAqLworCisgIE1QNF9FTEVNRU5UX0lEICAgICAgICBlbGVtZW50c1soOCldOyAvKiE8IFRhYmxlIHdoZXJlIHRoZSBlbGVtZW50IElkJ3MgYXJlIGxpc3RlZCAgICAgICAgICAqLworICBVQ0hBUiAgICAgICAgICAgICAgICAgZWxUYWdzWyg4KV07ICAgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudHMgaWQgVGFncyBhcmUgbGlzdGVkICAgICAgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgIGNoTWFwcGluZ1soOCldOyAgIC8qITwgVGFibGUgb2YgTVBFRyBjYW5vbmljYWwgb3JkZXIgdG8gYml0c3RyZWFtIGNoYW5uZWwgb3JkZXIgbWFwcGluZy4gKi8KKworICBBVURJT19DSEFOTkVMX1RZUEUgICAgY2hhbm5lbFR5cGVbKDgpXTsgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCAoZnJvbSAwIHVwdG8gbnVtQ2hhbm5lbHMpLiAgICAgICAgICAgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzWyg4KV07IC8qITwgQXVkaW8gY2hhbm5lbCBpbmRleCBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCAoZnJvbSAwIHVwdG8gbnVtQ2hhbm5lbHMpLiAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMy4yIEV4cGxpY2l0IGNoYW5uZWwgbWFwcGluZyB1c2luZyBhIHByb2dyYW1fY29uZmlnX2VsZW1lbnQoKSAqLworCisKKyAgY29uc3QgVUNIQVIgICAgICAgICAoKmNoYW5uZWxPdXRwdXRNYXBwaW5nKVs4XTsgICAgLyohPCBUYWJsZSBmb3IgTVBFRyBjYW5vbmljYWwgb3JkZXIgdG8gb3V0cHV0IGNoYW5uZWwgb3JkZXIgbWFwcGluZy4gKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgIGNoTWFwSW5kZXg7ICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCB0byBhY2Nlc3Mgb25lIGxpbmUgb2YgdGhlIGNoYW5uZWxPdXRwdXRNYXBwaW5nIHRhYmxlLiBUaGlzIGlzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBub3QgYWxsIDggY2hhbm5lbCBjb25maWd1cmF0aW9ucyBoYXZlIHRoZSBzYW1lIG91dHB1dCBtYXBwaW5nLiAqLworCisgIENQcm9ncmFtQ29uZmlnICAgICAgICAgICAgICAgIHBjZTsKKyAgQ1N0cmVhbUluZm8gICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mbzsgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gU3RyZWFtSW5mbyBkYXRhIChyZWFkIGZyb20gdGhlIGJpdHN0cmVhbSkgKi8KKyAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAgICAgICAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1soOCldOyAgICAgICAvKiE8IFRlbXBvcmFsIGNoYW5uZWwgbWVtb3J5ICovCisgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bKDgpXTsgLyohPCBQZXJzaXN0ZW50IGNoYW5uZWwgbWVtb3J5ICovCisKKyAgQ0FhY0RlY29kZXJDb21tb25EYXRhICAgICAgICAgYWFjQ29tbW9uRGF0YTsgICAgICAgICAgICAgLyohPCBUZW1wb3JhbCBzaGFyZWQgZGF0YSBmb3IgYWxsIGNoYW5uZWxzIGhvb2tlZCBpbnRvIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKi8KKworICBDQ29uY2VhbFBhcmFtcyAgICAgICAgICAgICAgICBjb25jZWFsQ29tbW9uRGF0YTsKKworICBJTlQgICAgICAgICAgICAgICAgICAgYWFjQ2hhbm5lbHNQcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgYW1vdW50IG9mIEFBQyBjb3JlIGNoYW5uZWxzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgZGVjb2RlIGNhbGwuICAgICAgICAgKi8KKyAgQVVESU9fQ0hBTk5FTF9UWVBFICAgIGNoYW5uZWxUeXBlUHJldlsoOCldOyAgICAgLyohPCBBcnJheSBob2xkaW5nIHRoZSBjaGFubmVsVHlwZSB2YWx1ZXMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gICAgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzUHJldlsoOCldOyAgLyohPCBBcnJheSBob2xkaW5nIHRoZSBjaGFubmVsSW5kaWNlcyB2YWx1ZXMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gKi8KKworCisgIEhBTkRMRV9TQlJERUNPREVSICAgaFNickRlY29kZXI7ICAgICAgICAgICAgICAgICAgIC8qITwgU0JSIGRlY29kZXIgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSICAgICAgICAgICAgICAgc2JyRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBTQlIgaGFzIGJlZW4gZGV0ZWN0ZWQgICAgICovCisgIFVDSEFSICAgICAgICAgICAgICAgc2JyRW5hYmxlZFByZXY7ICAgICAgICAgICAgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBTQlIgaGFzIGJlZW4gZGV0ZWN0ZWQgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICBVQ0hBUiAgICAgICAgICAgICAgIHBzUG9zc2libGU7ICAgICAgICAgICAgICAgICAgICAvKiE8IGZsYWcgdG8gc3RvcmUgaWYgUFMgaXMgcG9zc2libGUgICAgICAgICAgICAqLworICBTQlJfUEFSQU1TICAgICAgICAgIHNiclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0cnVjdCB0byBzdG9yZSBhbGwgc2JyIHBhcmFtZXRlcnMgICAgICAgICAqLworCisgIFFNRl9NT0RFICAgcW1mTW9kZUN1cnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGN1cnJlbnQgUU1GIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICovCisgIFFNRl9NT0RFICAgcW1mTW9kZVVzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFFNRiBtb2RlIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCisKKyAgSEFORExFX0FBQ19EUkMgIGhEcmNJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRFJDIGRhdGEgc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KKworCisgIENBbmNEYXRhICAgICAgYW5jRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgc3RydWN0dXJlIHRvIGhhbmRsZSBhbmNpbGxhcnkgZGF0YSAgICAgICAgICovCisKKyAgSEFORExFX1BDTV9ET1dOTUlYICBoUGNtVXRpbHM7ICAgICAgICAgICAgICAgICAgICAgLyohPCBwcml2YXQgZGF0YSBmb3IgdGhlIFBDTSB1dGlscy4gICAgICAgICAgICAgKi8KKyAgVERMaW1pdGVyUHRyIGhMaW1pdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIYW5kbGUgb2YgdGltZSBkb21haW4gbGltaXRlci4gICAgICAgICAgICAgKi8KKyAgVUNIQVIgICAgICAgIGxpbWl0ZXJFbmFibGVVc2VyOyAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgbGltaXRlciBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCisgIFVDSEFSICAgICAgICBsaW1pdGVyRW5hYmxlQ3VycjsgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGN1cnJlbnQgbGltaXRlciBjb25maWd1cmF0aW9uLiAgICAgICAgICovCisKKyAgRklYUF9EQkwgICAgIGV4dEdhaW5bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHYWluIHRoYXQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc2lnbmFsLiAqLworICBVSU5UICAgICAgICAgZXh0R2FpbkRlbGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlbGF5IHRoYXQgbXVzdCBiZSBhY2NvdW50ZWQgZm9yIGV4dEdhaW4uICovCisKK307CisKKworI2RlZmluZSBBQUNfREVCVUdfRVhUSExQICJcCistLS0gQUFDLUNvcmUgLS0tXG5cCisgICAgMHgwMDAxMDAwMCBIZWFkZXIgZGF0YVxuXAorICAgIDB4MDAwMjAwMDAgQ1JDIGRhdGFcblwKKyAgICAweDAwMDQwMDAwIENoYW5uZWwgaW5mb1xuXAorICAgIDB4MDAwODAwMDAgU2VjdGlvbiBkYXRhXG5cCisgICAgMHgwMDEwMDAwMCBTY2FsZWZhY3RvciBkYXRhXG5cCisgICAgMHgwMDIwMDAwMCBQdWxzZSBkYXRhXG5cCisgICAgMHgwMDQwMDAwMCBUbnMgZGF0YVxuXAorICAgIDB4MDA4MDAwMDAgUXVhbnRpemVkIHNwZWN0cnVtXG5cCisgICAgMHgwMTAwMDAwMCBSZXF1YW50aXplZCBzcGVjdHJ1bVxuXAorICAgIDB4MDIwMDAwMDAgVGltZSBvdXRwdXRcblwKKyAgICAweDA0MDAwMDAwIEZhdGFsIGVycm9yc1xuXAorICAgIDB4MDgwMDAwMDAgQnVmZmVyIGZ1bGxuZXNzXG5cCisgICAgMHgxMDAwMDAwMCBBdmVyYWdlIGJpdHJhdGVcblwKKyAgICAweDIwMDAwMDAwIFN5bmNocm9uaXphdGlvblxuXAorICAgIDB4NDAwMDAwMDAgQ29uY2VhbG1lbnRcblwKKyAgICAweDdGRkYwMDAwIGFsbCBBQUMtQ29yZS1JbmZvXG5cCisiCisKKy8qKgorICogXGJyaWVmIFN5bmNocm9uaXNlIFFNRiBtb2RlIGZvciBhbGwgbW9kdWxlcyB1c2luZyBRTUYgZGF0YS4KKyAqIFxwYXJhbSBzZWxmIGRlY29kZXIgaGFuZGxlCisgKi8KK3ZvaWQgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CisKKy8qKgorICogXGJyaWVmIFNpZ25hbCBhIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uIHRvIHRoZSBkZWNvZGVyCisgKiBccGFyYW0gc2VsZiBkZWNvZGVyIGhhbmRsZQorICovCit2b2lkIENBYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihIQU5ETEVfQUFDREVDT0RFUiBzZWxmKTsKKworLyohCisgIFxicmllZiBJbml0aWFsaXplIGFuY2lsbGFyeSBidWZmZXIKKworICBcYW5jRGF0YSBQb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIHN0cnVjdHVyZQorICBcYnVmZmVyIFBvaW50ZXIgdG8gKGV4dGVybmFsKSBhbmMgZGF0YSBidWZmZXIKKyAgXHNpemUgU2l6ZSBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgb24gYnkgYnVmZmVyCisKKyAgXHJldHVybiAgRXJyb3IgY29kZQorKi8KK0FBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFJbml0KENBbmNEYXRhICphbmNEYXRhLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKKworLyohCisgIFxicmllZiBHZXQgb25lIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQKKworICBcYW5jRGF0YSBQb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIHN0cnVjdHVyZQorICBcaW5kZXggSW5kZXggb2YgdGhlIGFuYyBkYXRhIGVsZW1lbnQgdG8gZ2V0CisgIFxwdHIgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYW5jIGRhdGEgZWxlbWVudAorICBcc2l6ZSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgYW5jIGRhdGEgZWxlbWVudAorCisgIFxyZXR1cm4gIEVycm9yIGNvZGUKKyovCitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KENBbmNEYXRhICphbmNEYXRhLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSk7CisKKworLyogaW5pdGlhbGl6YXRpb24gb2YgYWFjIGRlY29kZXIgKi8KK0xJTktTUEVDX0ggSEFORExFX0FBQ0RFQ09ERVIgQ0FhY0RlY29kZXJfT3BlbihUUkFOU1BPUlRfVFlQRSBic0Zvcm1hdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHN0cmVhbS1pbmZvIGVsZW1lbnRzICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0luaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYyk7CisKKy8qIQorICBcYnJpZWYgRGVjb2RlcyBvbmUgYWFjIGZyYW1lCisKKyAgVGhlIGZ1bmN0aW9uIGRlY29kZXMgb25lIGFhYyBmcmFtZS4gVGhlIGRlY29kaW5nIG9mIGNvdXBsaW5nIGNoYW5uZWwKKyAgZWxlbWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWlnaHQgc2lnbmFsLCB0aGF0IHRoZQorICBkYXRhIG9mIHRoZSBjdXJyZW50IGZyYW1lIGlzIGludmFsaWQsIGUuZy4gYXMgYSByZXN1bHQgb2YgYSBwYWNrZXQKKyAgbG9zcyBpbiBzdHJlYW1pbmcgbW9kZS4KKyAgVGhlIGJpdHN0cmVhbSBwb3NpdGlvbiBvZiB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCkgbXVzdAorICBiZSBleGFjdGx5IHRoZSBlbmQgb2YgdGhlIGFjY2VzcyB1bml0LCBpbmNsdWRpbmcgYWxsIGJ5dGUgYWxpZ25tZW50IGJpdHMuCisgIEZvciB0aGlzIHB1cnBvc2UsIHRoZSB2YXJpYWJsZSBhdVN0YXJ0QW5jaG9yIGlzIHVzZWQuCisKKyAgXHJldHVybiAgZXJyb3Igc3RhdHVzCisqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKKyAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAorICAgICAgICBjb25zdCBJTlQgIHRpbWVEYXRhU2l6ZSwKKyAgICAgICAgY29uc3QgSU5UIGludGVybGVhdmVkCisgICAgICAgICk7CisKKy8qIERlc3Ryb3kgYWFjIGRlY29kZXIgKi8KK0xJTktTUEVDX0ggdm9pZCBDQWFjRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKTsKKworLyogZ2V0IHN0cmVhbWluZm8gaGFuZGxlIGZyb20gZGVjb2RlciAqLworTElOS1NQRUNfSCBDU3RyZWFtSW5mbyogQ0FhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBBQUNERUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcCBiL2FhYy9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGViM2MwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlcl9saWIuY3BwCkBAIC0wLDAgKzEsMTE0OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisKKyNpbmNsdWRlICJhYWNfcmFtLmgiCisjaW5jbHVkZSAiYWFjZGVjb2Rlci5oIgorI2luY2x1ZGUgInRwZGVjX2xpYi5oIgorI2luY2x1ZGUgIkZES19jb3JlLmgiIC8qIEZES190b29scyB2ZXJzaW9uIGluZm8gKi8KKworCisgI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworCisKKworI2luY2x1ZGUgImNvbmNlYWwuaCIKKworICNpbmNsdWRlICJhYWNkZWNfZHJjLmgiCisKKworCisvKiBEZWNvZGVyIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDAgMgorI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgNQorI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDIgMTAKKyNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVElUTEUgIkFBQyBEZWNvZGVyIExpYiIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBBQUNERUNPREVSX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUgorc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBtZXRob2QgKTsKKworCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9HZXRGcmVlQnl0ZXMgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgVUlOVCAqcEZyZWVCeXRlcyl7CisKKyAgLyogcmVzZXQgZnJlZSBieXRlcyAqLworICAqcEZyZWVCeXRlcyA9IDA7CisKKyAgLyogY2hlY2sgaGFuZGxlICovCisgIGlmKCFzZWxmKQorICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworCisgIC8qIHJldHVybiBuciBvZiBmcmVlIGJ5dGVzICovCisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9IHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0LCAwKTsKKyAgKnBGcmVlQnl0ZXMgPSBGREtnZXRGcmVlQml0cyhoQnMpID4+IDM7CisKKyAgLyogc3VjY2VzcyAqLworICByZXR1cm4gQUFDX0RFQ19PSzsKK30KKworLyoqCisgKiBDb25maWcgRGVjb2RlciB1c2luZyBhIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCisgKi8KK3N0YXRpYworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY1N0cnVjdCkKK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyOworCisgIC8qIEluaXRpYWxpemUgQUFDIGNvcmUgZGVjb2RlciwgYW5kIHVwZGF0ZSBzZWxmLT5zdHJlYW1pbmZvICovCisgIGVyciA9IENBYWNEZWNvZGVyX0luaXQoc2VsZiwgcEFzY1N0cnVjdCk7CisKKyAgcmV0dXJuIGVycjsKK30KKworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3ICgKKyAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgVUNIQVIgKmNvbmZbXSwKKyAgICAgICAgY29uc3QgVUlOVCBsZW5ndGhbXSApCit7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CisgIFRSQU5TUE9SVERFQ19FUlJPUiAgIGVyclRwOworICBVSU5UIGxheWVyLCBuck9mTGF5ZXJzID0gc2VsZi0+bnJPZkxheWVyczsKKworICBmb3IobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspeworICAgIGlmKGxlbmd0aFtsYXllcl0gPiAwKXsKKyAgICAgIGVyclRwID0gdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyhzZWxmLT5oSW5wdXQsIGNvbmZbbGF5ZXJdLCBsZW5ndGhbbGF5ZXJdLCBsYXllcik7CisgICAgICBpZiAoZXJyVHAgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIHN3aXRjaCAoZXJyVHApIHsKKyAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOgorICAgICAgICAgIGVyciA9IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ6CisgICAgICAgICAgZXJyID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIGlmIGJhc2VsYXllciBpcyBPSyB3ZSBjb250aW51ZSBkZWNvZGluZyAqLworICAgICAgICBpZihsYXllciAgPj0gMSl7CisgICAgICAgICAgc2VsZi0+bnJPZkxheWVycyA9IGxheWVyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKworCitzdGF0aWMgSU5UIGFhY0RlY29kZXJfQ29uZmlnQ2FsbGJhY2sodm9pZCAqaGFuZGxlLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2NTdHJ1Y3QpCit7CisgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOworICBBQUNfREVDT0RFUl9FUlJPUiBlcnIgPSBBQUNfREVDX09LOworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHA7CisKKyAgeworICAgIHsKKyAgICAgIGVyciA9IGFhY0RlY29kZXJfQ29uZmlnKHNlbGYsIHBBc2NTdHJ1Y3QpOworICAgIH0KKyAgfQorICBpZiAoZXJyID09IEFBQ19ERUNfT0spIHsKKyAgICBpZiAoIHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0xEfEFDX0VMRCkKKyAgICAgICYmIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpID4gMCApCisgICAgeworICAgICAgLyogUmV2ZXJ0IHRvIGVycm9yIGNvbmNlYWxtZW50IG1ldGhvZCBOb2lzZSBTdWJzdGl0dXRpb24uCisgICAgICAgICBCZWNhdXNlIGludGVycG9sYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciBVU0FDL1JTVkQ1MCBvcgorICAgICAgICAgdGhlIGFkZGl0aW9uYWwgZGVsYXkgaXMgdW53YW50ZWQgZm9yIGxvdyBkZWxheSBjb2RlY3MuICovCisgICAgICBzZXRDb25jZWFsTWV0aG9kKHNlbGYsIDEpOworI2lmZGVmIERFQlVHCisgICAgICBGREtwcmludGYoIiAgQ29uY2VhbG1lbnQgbWV0aG9kIHdhcyByZXZlcnRlZCB0byAxICFcbiIpOworI2VuZGlmCisgICAgfQorICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOworICB9IGVsc2UgeworICAgIGlmIChJU19JTklUX0VSUk9SKGVycikpIHsKKyAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICB9IC8qIEZhdGFsIGVycm9ycyAqLworICAgIGVsc2UgaWYgKGVyciA9PSBBQUNfREVDX05FRURfVE9fUkVTVEFSVCkgeworICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOworICAgIH0gZWxzZSB7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVyclRwOworfQorCisKKworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0FuY0RhdGFJbml0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplICkKK3sKKyAgQ0FuY0RhdGEgKmFuY0RhdGEgPSAmc2VsZi0+YW5jRGF0YTsKKworICByZXR1cm4gQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoYW5jRGF0YSwgYnVmZmVyLCBzaXplKTsKK30KKworCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKK2FhY0RlY29kZXJfQW5jRGF0YUdldCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgKnNpemUgKQoreworICBDQW5jRGF0YSAqYW5jRGF0YSA9ICZzZWxmLT5hbmNEYXRhOworCisgIHJldHVybiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KGFuY0RhdGEsIGluZGV4LCBwdHIsIHNpemUpOworfQorCisKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUgorc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCAgIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCisgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG1ldGhvZCApCit7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKyAgQ0NvbmNlYWxQYXJhbXMgICpwQ29uY2VhbERhdGEgPSBOVUxMOworICBIQU5ETEVfU0JSREVDT0RFUiBoU2JyRGVjID0gTlVMTDsKKyAgSEFORExFX0FBQ19EUkMgaERyY0luZm8gPSBOVUxMOworICBIQU5ETEVfUENNX0RPV05NSVggaFBjbURteCA9IE5VTEw7CisgIENDb25jZWFsbWVudE1ldGhvZCBiYWNrdXBNZXRob2QgPSBDb25jZWFsTWV0aG9kTm9uZTsKKyAgaW50IGJhY2t1cERlbGF5ID0gMDsKKyAgaW50IGJzRGVsYXkgPSAwOworCisgIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBwQ29uY2VhbERhdGEgPSAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGE7CisgICAgaFNickRlYyA9IHNlbGYtPmhTYnJEZWNvZGVyOworICAgIGhEcmNJbmZvID0gc2VsZi0+aERyY0luZm87CisgICAgaFBjbURteCA9IHNlbGYtPmhQY21VdGlsczsKKyAgfQorCisKKyAgLyogR2V0IGN1cnJlbnQgbWV0aG9kL2RlbGF5ICovCisgIGJhY2t1cE1ldGhvZCA9IENDb25jZWFsbWVudF9HZXRNZXRob2QocENvbmNlYWxEYXRhKTsKKyAgYmFja3VwRGVsYXkgID0gQ0NvbmNlYWxtZW50X0dldERlbGF5KHBDb25jZWFsRGF0YSk7CisKKyAgLyogQmUgc3VyZSB0byBzZXQgQUFDIGFuZCBTQlIgY29uY2VhbG1lbnQgbWV0aG9kIHNpbXVsdGFuZW91c2x5ISAqLworICBlcnJvclN0YXR1cyA9CisgICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcygKKyAgICAgIHBDb25jZWFsRGF0YSwKKyAgICAgIChpbnQpbWV0aG9kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jZWFsTWV0aG9kCisgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbEZhZGVPdXRTbG9wZQorICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxGYWRlSW5TbG9wZQorICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxNdXRlUmVsZWFzZQorICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCAgIC8vIGNvbmNlYWxDb21mTm9pc2VMZXZlbAorICAgICk7CisgIGlmICggKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spCisgICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEdldCBuZXcgZGVsYXkgKi8KKyAgYnNEZWxheSA9IENDb25jZWFsbWVudF9HZXREZWxheShwQ29uY2VhbERhdGEpOworCisgIHsKKyAgICBTQlJfRVJST1Igc2JyRXJyID0gU0JSREVDX09LOworCisgICAgLyogc2V0IFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KKyAgICBzYnJFcnIgPSBzYnJEZWNvZGVyX1NldFBhcmFtICgKKyAgICAgIGhTYnJEZWMsCisgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKKyAgICAgIGJzRGVsYXkKKyAgICApOworCisgICAgc3dpdGNoIChzYnJFcnIpIHsKKyAgICBjYXNlIFNCUkRFQ19PSzoKKyAgICBjYXNlIFNCUkRFQ19OT1RfSU5JVElBTElaRUQ6CisgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHNhdmUgdGhlIHBhcmFtIHZhbHVlIGFuZCBzZXQgbGF0ZXIKKyAgICAgICAgICAgKHdoZW4gU0JSIGhhcyBiZWVuIGluaXRpYWxpemVkKSAqLworICAgICAgICBzZWxmLT5zYnJQYXJhbXMuYnNEZWxheSA9IGJzRGVsYXk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIGVycm9yU3RhdHVzID0KKyAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKKyAgICAgIGhEcmNJbmZvLAorICAgICAgRFJDX0JTX0RFTEFZLAorICAgICAgYnNEZWxheQorICAgICk7CisgIGlmICggKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spCisgICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgUENNRE1YX0VSUk9SIGVyciA9CisgICAgICBwY21EbXhfU2V0UGFyYW0gKAorICAgICAgICBoUGNtRG14LAorICAgICAgICBETVhfQlNfREFUQV9ERUxBWSwKKyAgICAgICAgYnNEZWxheQorICAgICAgKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgUENNRE1YX0lOVkFMSURfSEFORExFOgorICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIGNhc2UgUENNRE1YX09LOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworCitiYWlsOgorICBpZiAoIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKQorICAgICYmIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX0lOVkFMSURfSEFORExFKSApCisgIHsKKyAgICAvKiBSZXZlcnQgdG8gdGhlIGluaXRpYWwgc3RhdGUgKi8KKyAgICBDQ29uY2VhbG1lbnRfU2V0UGFyYW1zICgKKyAgICAgICAgcENvbmNlYWxEYXRhLAorICAgICAgICAoaW50KWJhY2t1cE1ldGhvZCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRAorICAgICAgKTsKKyAgICAvKiBSZXZlcnQgU0JSIGJpdHN0cmVhbSBkZWxheSAqLworICAgIHNickRlY29kZXJfU2V0UGFyYW0gKAorICAgICAgICBoU2JyRGVjLAorICAgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKKyAgICAgICAgYmFja3VwRGVsYXkKKyAgICAgICk7CisgICAgLyogUmV2ZXJ0IERSQyBiaXRzdHJlYW0gZGVsYXkgKi8KKyAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKKyAgICAgICAgaERyY0luZm8sCisgICAgICAgIERSQ19CU19ERUxBWSwKKyAgICAgICAgYmFja3VwRGVsYXkKKyAgICAgICk7CisgICAgLyogUmV2ZXJ0IFBDTSBtaXhkb3duIGJpdHN0cmVhbSBkZWxheSAqLworICAgIHBjbURteF9TZXRQYXJhbSAoCisgICAgICAgIGhQY21EbXgsCisgICAgICAgIERNWF9CU19EQVRBX0RFTEFZLAorICAgICAgICBiYWNrdXBEZWxheQorICAgICAgKTsKKyAgfQorCisgIHJldHVybiBlcnJvclN0YXR1czsKK30KKworCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKK2FhY0RlY29kZXJfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgICAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0RFQ19QQVJBTSAgICAgICBwYXJhbSwgIC8qITwgUGFyYW1ldGVyIHRvIHNldCAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIHZhbHVlKSAgLyohPCBQYXJhbWV0ZXIgdmFsdWVkICAgICAgICAgICAgICAgKi8KK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOworICBDQ29uY2VhbFBhcmFtcyAgKnBDb25jZWFsRGF0YSA9IE5VTEw7CisgIEhBTkRMRV9BQUNfRFJDIGhEcmNJbmZvID0gTlVMTDsKKyAgSEFORExFX1BDTV9ET1dOTUlYIGhQY21EbXggPSBOVUxMOworICBURExpbWl0ZXJQdHIgaFBjbVRkbCA9IE5VTEw7CisKKyAgLyogY2hlY2sgZGVjb2RlciBoYW5kbGUgKi8KKyAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgIHBDb25jZWFsRGF0YSA9ICZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YTsKKyAgICBoRHJjSW5mbyA9IHNlbGYtPmhEcmNJbmZvOworICAgIGhQY21EbXggPSBzZWxmLT5oUGNtVXRpbHM7CisgICAgaFBjbVRkbCA9IHNlbGYtPmhMaW1pdGVyOworICB9IGVsc2UgeworICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIC8qIGNvbmZpZ3VyZSB0aGUgc3Vic3lzdGVtcyAqLworICBzd2l0Y2ggKHBhcmFtKQorICB7CisgIGNhc2UgQUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQ6CisgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgc2VsZi0+b3V0cHV0SW50ZXJsZWF2ZWQgPSB2YWx1ZTsKKyAgICBicmVhazsKKworICBjYXNlIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUzoKKyAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+ICg4KSkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIHsKKyAgICAgIFBDTURNWF9FUlJPUiBlcnI7CisKKyAgICAgIGVyciA9IHBjbURteF9TZXRQYXJhbSAoCisgICAgICAgICAgICAgIGhQY21EbXgsCisgICAgICAgICAgICAgIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAorICAgICAgICAgICAgICB2YWx1ZSApOworCisgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgY2FzZSBQQ01ETVhfT0s6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CisgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTOgorICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgICAgeworICAgICAgUENNRE1YX0VSUk9SIGVycjsKKworICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKKyAgICAgICAgICAgICAgaFBjbURteCwKKyAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsCisgICAgICAgICAgICAgIHZhbHVlICk7CisKKyAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICBjYXNlIFBDTURNWF9PSzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERToKKyAgICB7CisgICAgICBQQ01ETVhfRVJST1IgZXJyOworCisgICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAorICAgICAgICAgICAgICBoUGNtRG14LAorICAgICAgICAgICAgICBETVhfRFVBTF9DSEFOTkVMX01PREUsCisgICAgICAgICAgICAgIHZhbHVlICk7CisKKyAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICBjYXNlIFBDTURNWF9PSzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKworICBjYXNlIEFBQ19QQ01fTElNSVRFUl9FTkFCTEU6CisgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAxKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyID0gdmFsdWU7CisgICAgYnJlYWs7CisKKyAgY2FzZSBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUU6CisgICAgaWYgKHZhbHVlIDw9IDApIHsgIC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIHN3aXRjaCAoc2V0TGltaXRlckF0dGFjayhoUGNtVGRsLCB2YWx1ZSkpIHsKKyAgICBjYXNlIFRETElNSVRfT0s6CisgICAgICBicmVhazsKKyAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9IQU5ETEU6CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEFBQ19QQ01fTElNSVRFUl9SRUxFQVNfVElNRToKKyAgICBpZiAodmFsdWUgPD0gMCkgeyAgLyogbW9kdWxlIGZ1bmN0aW9uIGNvbnZlcnRzIHZhbHVlIHRvIHVuc2lnbmVkICovCisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgICAgc3dpdGNoIChzZXRMaW1pdGVyUmVsZWFzZShoUGNtVGRsLCB2YWx1ZSkpIHsKKyAgICBjYXNlIFRETElNSVRfT0s6CisgICAgICBicmVhazsKKyAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9IQU5ETEU6CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORzoKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZyA9IGNoYW5uZWxNYXBwaW5nVGFibGVQYXNzdGhyb3VnaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVdBVjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworCisKKyAgY2FzZSBBQUNfUU1GX0xPV1BPV0VSOgorICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gMSkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBRTUYgbW9kZSAobWlnaHQgYmUgb3ZlcnJpZGVuKQorICAgICAqICAwOkhRIChjb21wbGV4KQorICAgICAqICAxOkxQIChwYXJ0aWFsbHkgY29tcGxleCkKKyAgICAgKi8KKyAgICBzZWxmLT5xbWZNb2RlVXNlciA9IChRTUZfTU9ERSl2YWx1ZTsKKyAgICBicmVhazsKKworCisgIGNhc2UgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I6CisgICAgLyogRFJDIGNvbXByZXNzaW9uIGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBjb21wcmVzc2lvbikgKi8KKyAgICBlcnJvclN0YXR1cyA9CisgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKKyAgICAgICAgaERyY0luZm8sCisgICAgICAgIERSQ19DVVRfU0NBTEUsCisgICAgICAgIHZhbHVlCisgICAgICApOworICAgIGJyZWFrOworCisgIGNhc2UgQUFDX0RSQ19CT09TVF9GQUNUT1I6CisgICAgLyogRFJDIGJvb3N0IGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBib29zdCkgKi8KKyAgICBlcnJvclN0YXR1cyA9CisgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKKyAgICAgICAgaERyY0luZm8sCisgICAgICAgIERSQ19CT09TVF9TQ0FMRSwKKyAgICAgICAgdmFsdWUKKyAgICAgICk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAvKiBEUkMgcmVmZXJlbmNlIGxldmVsIHF1YW50aXplZCBpbiAwLjI1ZEIgc3RlcHMgdXNpbmcgdmFsdWVzIFswLi4xMjddIGl0IGlzICctJyBmb3IgYW5hbG9nIHNjYWxpbmcgKi8KKyAgICBlcnJvclN0YXR1cyA9CisgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKKyAgICAgICAgaERyY0luZm8sCisgICAgICAgIFRBUkdFVF9SRUZfTEVWRUwsCisgICAgICAgIHZhbHVlCisgICAgICApOworICAgIGJyZWFrOworCisgIGNhc2UgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjoKKyAgICAvKiBEb24ndCBuZWVkIHRvIG92ZXJ3cml0ZSBjdXQvYm9vc3QgdmFsdWVzICovCisgICAgZXJyb3JTdGF0dXMgPQorICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCisgICAgICAgIGhEcmNJbmZvLAorICAgICAgICBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTiwKKyAgICAgICAgdmFsdWUKKyAgICAgICk7CisgICAgYnJlYWs7CisKKworICBjYXNlIEFBQ19UUERFQ19DTEVBUl9CVUZGRVI6CisgICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOworICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKKyAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUJhZEJ5dGVzID0gMDsKKyAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOworICAgIC8qIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOyAqLworICAgIGJyZWFrOworCisgIGNhc2UgQUFDX0NPTkNFQUxfTUVUSE9EOgorICAgIC8qIENoYW5naW5nIHRoZSBjb25jZWFsbWVudCBtZXRob2QgY2FuIGludHJvZHVjZSBhZGRpdGlvbmFsIGJpdHN0cmVhbSBkZWxheS4gQW5kCisgICAgICAgdGhhdCBpbiB0dXJuIGFmZmVjdHMgc3ViIGxpYnJhcmllcyBhbmQgbW9kdWxlcyB3aGljaCBtYWtlcyB0aGUgd2hvbGUgdGhpbmcgcXVpdGUKKyAgICAgICBjb21wbGV4LiAgU28gdGhlIGNvbXBsZXRlIGNoYW5naW5nIHJvdXRpbmUgaXMgcGFja2VkIGludG8gYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2gKKyAgICAgICBrZWVwcyBhbGwgbW9kdWxlcyBhbmQgbGlicyBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgZXZlbiBpbiB0aGUgY2FzZSBhbiBlcnJvciBvY2N1cmVzLiAqLworICAgIGVycm9yU3RhdHVzID0gc2V0Q29uY2VhbE1ldGhvZCAoIHNlbGYsIHZhbHVlICk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworCisgIHJldHVybiAoZXJyb3JTdGF0dXMpOworfQorCisKK0xJTktTUEVDX0NQUCBIQU5ETEVfQUFDREVDT0RFUiBhYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LCBVSU5UIG5yT2ZMYXllcnMpCit7CisgIEFBQ19ERUNPREVSX0lOU1RBTkNFICphYWNEZWMgPSBOVUxMOworICBIQU5ETEVfVFJBTlNQT1JUREVDIHBJbjsKKyAgaW50IGVyciA9IDA7CisKKyAgLyogQWxsb2NhdGUgdHJhbnNwb3J0IGxheWVyIHN0cnVjdC4gKi8KKyAgcEluID0gdHJhbnNwb3J0RGVjX09wZW4odHJhbnNwb3J0Rm10LCBUUF9GTEFHX01QRUc0KTsKKyAgaWYgKHBJbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0cmFuc3BvcnREZWNfU2V0UGFyYW0ocEluLCBUUERFQ19QQVJBTV9JR05PUkVfQlVGRkVSRlVMTE5FU1MsIDEpOworCisgIC8qIEFsbG9jYXRlIEFBQyBkZWNvZGVyIGNvcmUgc3RydWN0LiAqLworICBhYWNEZWMgPSBDQWFjRGVjb2Rlcl9PcGVuKHRyYW5zcG9ydEZtdCk7CisKKyAgaWYgKGFhY0RlYyA9PSBOVUxMKSB7CisgICAgdHJhbnNwb3J0RGVjX0Nsb3NlKCZwSW4pOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBhYWNEZWMtPmhJbnB1dCA9IHBJbjsKKworICBhYWNEZWMtPm5yT2ZMYXllcnMgPSBuck9mTGF5ZXJzOworCisgIGFhY0RlYy0+Y2hhbm5lbE91dHB1dE1hcHBpbmcgPSBjaGFubmVsTWFwcGluZ1RhYmxlV0FWOworCisgIC8qIFJlZ2lzdGVyIENvbmZpZyBVcGRhdGUgY2FsbGJhY2suICovCisgIHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjaywgKHZvaWQqKWFhY0RlYyk7CisKKyAgLyogb3BlbiBTQlIgZGVjb2RlciAqLworICBpZiAoIFNCUkRFQ19PSyAhPSBzYnJEZWNvZGVyX09wZW4gKCAmYWFjRGVjLT5oU2JyRGVjb2RlciApKSB7CisgICAgZXJyID0gLTE7CisgICAgZ290byBiYWlsOworICB9CisgIGFhY0RlYy0+cW1mTW9kZVVzZXIgPSBOT1RfREVGSU5FRDsKKyAgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU2JyQ2FsbGJhY2soYWFjRGVjLT5oSW5wdXQsIChjYlNicl90KXNickRlY29kZXJfSGVhZGVyLCAodm9pZCopYWFjRGVjLT5oU2JyRGVjb2Rlcik7CisKKworICBwY21EbXhfT3BlbiggJmFhY0RlYy0+aFBjbVV0aWxzICk7CisgIGlmIChhYWNEZWMtPmhQY21VdGlscyA9PSBOVUxMKSB7CisgICAgZXJyID0gLTE7CisgICAgZ290byBiYWlsOworICB9CisKKyAgYWFjRGVjLT5oTGltaXRlciA9IGNyZWF0ZUxpbWl0ZXIoVERMX0FUVEFDS19ERUZBVUxUX01TLCBURExfUkVMRUFTRV9ERUZBVUxUX01TLCBTQU1QTEVfTUFYLCAoOCksIDk2MDAwKTsKKyAgaWYgKE5VTEwgPT0gYWFjRGVjLT5oTGltaXRlcikgeworICAgIGVyciA9IC0xOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBhYWNEZWMtPmxpbWl0ZXJFbmFibGVVc2VyID0gKFVDSEFSKS0xOworICBhYWNEZWMtPmxpbWl0ZXJFbmFibGVDdXJyID0gMDsKKworCisKKyAgLyogQXNzdXJlIHRoYXQgYWxsIG1vZHVsZXMgaGF2ZSBzYW1lIGRlbGF5ICovCisgIGlmICggc2V0Q29uY2VhbE1ldGhvZChhYWNEZWMsIENDb25jZWFsbWVudF9HZXRNZXRob2QoJmFhY0RlYy0+Y29uY2VhbENvbW1vbkRhdGEpKSApIHsKKyAgICBlcnIgPSAtMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKyAgaWYgKGVyciA9PSAtMSkgeworICAgIGFhY0RlY29kZXJfQ2xvc2UoYWFjRGVjKTsKKyAgICBhYWNEZWMgPSBOVUxMOworICB9CisgIHJldHVybiBhYWNEZWM7Cit9CisKK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0ZpbGwoCisgICAgICAgIEhBTkRMRV9BQUNERUNPREVSICAgc2VsZiwKKyAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpwQnVmZmVyW10sCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgYnVmZmVyU2l6ZVtdLAorICAgICAgICBVSU5UICAgICAgICAgICAgICAgKnBCeXRlc1ZhbGlkCisgICAgICAgICkKK3sKKyAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOworICAvKiBsb29wIGNvdW50ZXIgZm9yIGxheWVyczsgaWYgbm90IFRUX01QNF9SQVdQQUNLRVRTIHVzZWQgYXMgaW5kZXggZm9yIG9ubHkgCisgICAgIGF2YWlsYWJsZSBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIGxheWVyICAgICAgPSAwOworICBJTlQgbnJPZkxheWVycyA9IHNlbGYtPm5yT2ZMYXllcnM7CisKKyAgeworICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspeworICAgICAgeworICAgICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19GaWxsRGF0YSggc2VsZi0+aElucHV0LCBwQnVmZmVyW2xheWVyXSwgYnVmZmVyU2l6ZVtsYXllcl0sICZwQnl0ZXNWYWxpZFtsYXllcl0sIGxheWVyICk7CisgICAgICAgIGlmICh0cEVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTktOT1dOOyAgLyogTXVzdCBiZSBhbiBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFBQ19ERUNfT0s7Cit9CisKKworc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKK3sKKyAgQ0FhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOworCisgIGlmICggc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCApIHsKKyAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQlNfSU5URVJSVVBUSU9OLCAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBhYWNEZWNvZGVyX1VwZGF0ZUJpdFN0cmVhbUNvdW50ZXJzKENTdHJlYW1JbmZvICpwU2ksIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IG5CaXRzLCBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cykKK3sKKyAgLyogY2FsY3VsYXRlIGJpdCBkaWZmZXJlbmNlIChhbW91bnQgb2YgYml0cyBtb3ZlZCBmb3J3YXJkKSAqLworICBuQml0cyA9IG5CaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgLyogTm90ZTogVGhlIGFtb3VudCBvZiBiaXRzIGNvbnN1bWVkIG1pZ2h0IGJlY29tZSBuZWdhdGl2ZSB3aGVuIHBhcnNpbmcgYQorICAgICBiaXQgc3RyZWFtIHdpdGggc2V2ZXJhbCBzdWIgZnJhbWVzLCBhbmQgd2UgZmluZCBvdXQgYXQgdGhlIGxhc3Qgc3ViIGZyYW1lCisgICAgIHRoYXQgdGhlIHRvdGFsIGZyYW1lIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCB0aGUgc3VtIG9mIHN1YiBmcmFtZSBsZW5ndGguIAorICAgICBJZiB0aGlzIGhhcHBlbnMsIHRoZSB0cmFuc3BvcnQgZGVjb2RlciBtaWdodCB3YW50IHRvIHJld2luZCB0byB0aGUgc3VwcG9zZWQKKyAgICAgZW5kaW5nIG9mIHRoZSB0cmFuc3BvcnQgZnJhbWUsIGFuZCB0aGlzIHBvc2l0aW9uIG1pZ2h0IGJlIGJlZm9yZSB0aGUgbGFzdAorICAgICBhY2Nlc3MgdW5pdCBiZWdpbm5pbmcuICovCisKKyAgLyogQ2FsYyBiaXRyYXRlLiAqLworICBpZiAocFNpLT5mcmFtZVNpemUgPiAwKSB7CisgICAgcFNpLT5iaXRSYXRlID0gKG5CaXRzICogcFNpLT5zYW1wbGVSYXRlKS9wU2ktPmZyYW1lU2l6ZTsKKyAgfQorCisgIC8qIGJpdC9ieXRlIGNvdW50ZXJzICovCisgIHsKKyAgICBpbnQgbkJ5dGVzOworCisgICAgbkJ5dGVzID0gbkJpdHM+PjM7CisgICAgcFNpLT5udW1Ub3RhbEJ5dGVzICs9IG5CeXRlczsKKyAgICBpZiAoSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSkgeworICAgICAgcFNpLT5udW1Ub3RhbEFjY2Vzc1VuaXRzKys7CisgICAgfQorICAgIGlmIChJU19ERUNPREVfRVJST1IoRXJyb3JTdGF0dXMpKSB7CisgICAgICBwU2ktPm51bUJhZEJ5dGVzICs9IG5CeXRlczsKKyAgICAgIHBTaS0+bnVtQmFkQWNjZXNzVW5pdHMrKzsKKyAgICB9CisgIH0KK30KKworc3RhdGljIElOVCBhYWNEZWNvZGVyX0VzdGltYXRlTnVtYmVyT2ZMb3N0RnJhbWVzKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCit7CisgIElOVCBuOworCisgIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50KCAmbiwgc2VsZi0+aElucHV0KTsKKworICByZXR1cm4gbjsKK30KKworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoCisgICAgICAgIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgZmxhZ3MpCit7CisgICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisgICAgSU5UIGxheWVyOworICAgIElOVCBuQml0czsKKyAgICBJTlQgaW50ZXJsZWF2ZWQgPSBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZDsKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CisgICAgaW50IGZUcEludGVycnVwdGlvbiA9IDA7ICAvKiBUcmFuc3BvcnQgb3JpZ2luYXRlZCBpbnRlcnJ1cHRpb24gZGV0ZWN0aW9uLiAqLworICAgIGludCBmVHBDb25jZWFsID0gMDsgICAgICAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgY29uY2VhbG1lbnQuICovCisKKworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIH0KKworICAgIGlmIChmbGFncyAmIEFBQ0RFQ19JTlRSKSB7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CisgICAgfQorCisgICAgaEJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOworCisgICAgLyogR2V0IGN1cnJlbnQgYml0cyBwb3NpdGlvbiBmb3IgYml0cmF0ZSBjYWxjdWxhdGlvbi4gKi8KKyAgICBuQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgIGlmICghIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkgKSApCisgICAgeworICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIGVycjsKKworICAgICAgZm9yKGxheWVyID0gMDsgbGF5ZXIgPCBzZWxmLT5uck9mTGF5ZXJzOyBsYXllcisrKQorICAgICAgeworICAgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoc2VsZi0+aElucHV0LCBsYXllcik7CisgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM6CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1NZTkNfRVJST1I6CisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IGFhY0RlY29kZXJfRXN0aW1hdGVOdW1iZXJPZkxvc3RGcmFtZXMoc2VsZik7CisgICAgICAgICAgICBmVHBJbnRlcnJ1cHRpb24gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOgorICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX05FRURfVE9fUkVTVEFSVDsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19DUkNfRVJST1I6CisgICAgICAgICAgICBmVHBDb25jZWFsID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID4gMCkgeworICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cy0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNpZ25hbCBiaXQgc3RyZWFtIGludGVycnVwdGlvbiB0byBvdGhlciBtb2R1bGVzIGlmIHJlcXVpcmVkLiAqLworICAgIGlmICggZlRwSW50ZXJydXB0aW9uIHx8IChmbGFncyAmIChBQUNERUNfSU5UUnxBQUNERUNfQ0xSSElTVCkpICkKKyAgICB7CisgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQ0xFQVJfSElTVE9SWSwgKGZsYWdzJkFBQ0RFQ19DTFJISVNUKSk7CisgICAgICBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKKyAgICAgIGlmICggISAoZmxhZ3MgJiBBQUNERUNfSU5UUikgKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIEVtcHR5IGJpdCBidWZmZXIgaW4gY2FzZSBvZiBmbHVzaCByZXF1ZXN0LiAqLworICAgIGlmIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkKKyAgICB7CisgICAgICB0cmFuc3BvcnREZWNfU2V0UGFyYW0oc2VsZi0+aElucHV0LCBUUERFQ19QQVJBTV9SRVNFVCwgMSk7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUJhZEJ5dGVzID0gMDsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtVG90YWxCeXRlcyA9IDA7CisgICAgfQorICAgIC8qIFJlc2V0IHRoZSBvdXRwdXQgZGVsYXkgZmllbGQuIFRoZSBtb2R1bGVzIHdpbGwgYWRkIHRoZWlyIGZpZ3VyZXMgb25lIGFmdGVyIGFub3RoZXIuICovCisgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IDA7CisKKyAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZVVzZXI9PShVQ0hBUiktMSkgeworICAgICAgLyogRW5iYWxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgQU9UJ3MuICovCisgICAgICBzZWxmLT5saW1pdGVyRW5hYmxlQ3VyciA9ICggc2VsZi0+ZmxhZ3MgJiAoQUNfTER8QUNfRUxEKSApID8gMCA6IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogVXNlIGxpbWl0ZXIgY29uZmlndXJhdGlvbiBhcyByZXF1ZXN0ZWQuICovCisgICAgICBzZWxmLT5saW1pdGVyRW5hYmxlQ3VyciA9IHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyOworICAgIH0KKyAgICAvKiByZXNldCBsaW1pdGVyIGdhaW4gb24gYSBwZXIgZnJhbWUgYmFzaXMgKi8KKyAgICBzZWxmLT5leHRHYWluWzBdID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oZmxvYXQpKDE8PFRETF9HQUlOX1NDQUxJTkcpKTsKKworCisgICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCAoZlRwQ29uY2VhbCA/IEFBQ0RFQ19DT05DRUFMIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCk7CisKKyAgICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSkgeworICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOworICAgICAgdHBFcnIgPSB0cmFuc3BvcnREZWNfRW5kQWNjZXNzVW5pdChzZWxmLT5oSW5wdXQpOworICAgICAgaWYgKHRwRXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB0aGUgY3VycmVudCBwVGltZURhdGEgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHNpZ25hbCwgdGhlcmUgbm90aGluZyBlbHNlIHdlIGNhbiBkbywgc28gYmFpbC4gKi8KKyAgICBpZiAoICEgSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSApIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICB7CisgICAgICAvKiBFeHBvcnQgZGF0YSBpbnRvIHN0cmVhbWluZm8gc3RydWN0dXJlICovCisgICAgICBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGU7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICB9CisgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9IHNlbGYtPnN0cmVhbUluZm8uYWFjTnVtQ2hhbm5lbHM7CisKKworCisgICAgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoc2VsZik7CisKKy8qIHNiciBkZWNvZGVyICovCisKKyAgICBpZiAoRXJyb3JTdGF0dXMgfHwgKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpIHx8IHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMF0tPmNvbmNlYWxtZW50SW5mby5jb25jZWFsU3RhdGUgPiBDb25jZWFsU3RhdGVfRmFkZUluKQorICAgIHsKKyAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOyAgLyogaWYgYW4gZXJyb3IgaGFzIG9jY3VyZWQgZG8gY29uY2VhbG1lbnQgaW4gdGhlIFNCUiBkZWNvZGVyIHRvbyAqLworICAgIH0KKworICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKQorICAgIHsKKyAgICAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKKyAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM8NykpID8gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA6IHNlbGYtPmNoTWFwSW5kZXg7CisKKyAgICAgIC8qIHNldCBwYXJhbXMgKi8KKyAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zYnJQYXJhbXMuYnNEZWxheSk7CisgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtICggc2VsZi0+aFNickRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0ZMVVNIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSApOworCisgICAgICBpZiAoIHNlbGYtPnN0cmVhbUluZm8uYW90ID09IEFPVF9FUl9BQUNfRUxEICkgeworICAgICAgICAvKiBDb25maWd1cmUgUU1GICovCisgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9MRF9RTUZfVElNRV9BTElHTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5mbGFncyAmIEFDX0xEX01QUykgPyAxIDogMCApOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIFBDTURNWF9FUlJPUiBkbXhFcnI7CisgICAgICAgIElOVCAgbWF4T3V0Q2ggPSAwOworCisgICAgICAgIGRteEVyciA9IHBjbURteF9HZXRQYXJhbShzZWxmLT5oUGNtVXRpbHMsIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAmbWF4T3V0Q2gpOworICAgICAgICBpZiAoIChkbXhFcnIgPT0gUENNRE1YX09LKSAmJiAobWF4T3V0Q2ggPT0gMSkgKSB7CisgICAgICAgICAgLyogRGlzYWJsZSBQUyBwcm9jZXNzaW5nIGlmIHdlIGhhdmUgdG8gY3JlYXRlIGEgbW9ubyBvdXRwdXQgc2lnbmFsLiAqLworICAgICAgICAgIHNlbGYtPnBzUG9zc2libGUgPSAwOworICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLyogYXBwbHkgU0JSIHByb2Nlc3NpbmcgKi8KKyAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9BcHBseSAoIHNlbGYtPmhTYnJEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBzUG9zc2libGUpOworCisKKyAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgeworICAgICAgICNkZWZpbmUgVVBTX1NDQUxFICAyICAvKiBNYXhpbXVtIHVwc2FtcGxpbmcgZmFjdG9yIGlzIDQgKENFTFArU0JSKSAqLworICAgICAgIEZJWFBfREJMICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PFVQU19TQ0FMRSkpOworCisgICAgICAgLyogVXBkYXRlIGRhdGEgaW4gc3RyZWFtaW5mbyBzdHJ1Y3R1cmUuIEFzc3VtZSB0aGF0IHRoZSBTQlIgdXBzYW1wbGluZyBmYWN0b3IgaXMgZWl0aGVyIDEgb3IgMiAqLworICAgICAgIHNlbGYtPmZsYWdzIHw9IEFDX1NCUl9QUkVTRU5UOworICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPT0gNzY4KSB7CisgICAgICAgICAgIHVwc2FtcGxlRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoOC4wZi8oMzw8VVBTX1NDQUxFKSk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDIuMGYvKDE8PFVQU19TQ0FMRSkpOworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAvKiBBcHBseSB1cHNhbXBsaW5nIGZhY3RvciB0byBib3RoIHRoZSBjb3JlIGZyYW1lIGxlbmd0aCBhbmQgdGhlIGNvcmUgZGVsYXkgKi8KKyAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAgICA9ICAgICAgIChJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lPDxVUFNfU0NBTEUsIHVwc2FtcGxlRmFjdG9yKTsKKyAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICA9IChVSU5UKShJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXk8PFVQU19TQ0FMRSwgdXBzYW1wbGVGYWN0b3IpOworICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gc2JyRGVjb2Rlcl9HZXREZWxheSggc2VsZi0+aFNickRlY29kZXIgKTsKKworICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7CisgICAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19QU19QUkVTRU5UOworICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbMF0gPSBBQ1RfRlJPTlQ7CisgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVsxXSA9IEFDVF9GUk9OVDsKKyAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzBdID0gMDsKKyAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzFdID0gMTsKKyAgICAgICB9CisgICAgIH0KKyAgIH0KKworCisgICAgeworICAgIElOVCBwY21MaW1pdGVyU2NhbGUgPSAwOworICAgIFBDTURNWF9FUlJPUiBkbXhFcnIgPSBQQ01ETVhfT0s7CisgICAgaWYgKCBmbGFncyAmIChBQUNERUNfSU5UUiB8IEFBQ0RFQ19DTFJISVNUKSApIHsKKyAgICAgIC8qIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHBhc3QgKGUuZy4gbWl4ZG93biBjb2VmaWNpZW50cykgKi8KKyAgICAgIHBjbURteF9SZXNldCggc2VsZi0+aFBjbVV0aWxzLCBQQ01ETVhfUkVTRVRfQlNfREFUQSApOworICAgIH0KKyAgICAvKiBkbyBQQ00gcG9zdCBwcm9jZXNzaW5nICovCisgICAgZG14RXJyID0gcGNtRG14X0FwcGx5RnJhbWUgKAorICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLAorICAgICAgICAgICAgcFRpbWVEYXRhLAorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsCisgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCisgICAgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZSwKKyAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmcsCisgICAgICAgICAgICAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpID8gJnBjbUxpbWl0ZXJTY2FsZSA6IE5VTEwKKyAgICAgICk7CisgICAgaWYgKGRteEVyciA9PSBQQ01ETVhfSU5WQUxJRF9NT0RFKSB7CisgICAgICAvKiBBbm5vdW5jZSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhlIGN1cnJlbnQgY29tYmluYXRpb24gb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBkb3dubWl4CisgICAgICAgKiBzZXR0aW5ncyBhcmUgbm90IGtub3cgdG8gcHJvZHVjZSBhIHByZWRpY3RhYmxlIGJlaGF2aW9yIGFuZCB0aHVzIG1heWJlIHByb2R1Y2Ugc3RyYW5nZSBvdXRwdXQuICovCisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgIH0KKworICAgIGlmICggZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCApIHsKKyAgICAgIC8qIERlbGV0ZSB0aGUgZGVsYXllZCBzaWduYWwuICovCisgICAgICByZXNldExpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOworICAgIH0KKyAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpCisgICAgeworICAgICAgLyogU2V0IGFjdHVhbCBzaWduYWwgcGFyYW1ldGVycyAqLworICAgICAgc2V0TGltaXRlck5DaGFubmVscyhzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyk7CisgICAgICBzZXRMaW1pdGVyU2FtcGxlUmF0ZShzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKTsKKworICAgICAgYXBwbHlMaW1pdGVyKAorICAgICAgICAgICAgICBzZWxmLT5oTGltaXRlciwKKyAgICAgICAgICAgICAgcFRpbWVEYXRhLAorICAgICAgICAgICAgICBzZWxmLT5leHRHYWluLAorICAgICAgICAgICAgICZwY21MaW1pdGVyU2NhbGUsCisgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUKKyAgICAgICAgICAgICAgKTsKKworICAgICAgLyogQW5ub3VuY2UgdGhlIGFkZGl0aW9uYWwgbGltaXRlciBvdXRwdXQgZGVsYXkgKi8KKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gZ2V0TGltaXRlckRlbGF5KHNlbGYtPmhMaW1pdGVyKTsKKyAgICB9CisgICAgfQorCisKKyAgICAvKiBTaWduYWwgaW50ZXJydXB0aW9uIHRvIHRha2UgZWZmZWN0IGluIG5leHQgZnJhbWUuICovCisgICAgaWYgKCBmbGFncyAmIEFBQ0RFQ19GTFVTSCApIHsKKyAgICAgIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLworICAgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnczsKKworYmFpbDoKKworICAgIC8qIFVwZGF0ZSBTdGF0aXN0aWNzICovCisgICAgYWFjRGVjb2Rlcl9VcGRhdGVCaXRTdHJlYW1Db3VudGVycygmc2VsZi0+c3RyZWFtSW5mbywgaEJzLCBuQml0cywgRXJyb3JTdGF0dXMpOworCisgICAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCitMSU5LU1BFQ19DUFAgdm9pZCBhYWNEZWNvZGVyX0Nsb3NlICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApCit7CisgIGlmIChzZWxmID09IE5VTEwpCisgICAgcmV0dXJuOworCisKKyAgaWYgKHNlbGYtPmhMaW1pdGVyICE9IE5VTEwpIHsKKyAgICBkZXN0cm95TGltaXRlcihzZWxmLT5oTGltaXRlcik7CisgIH0KKworICBpZiAoc2VsZi0+aFBjbVV0aWxzICE9IE5VTEwpIHsKKyAgICBwY21EbXhfQ2xvc2UoICZzZWxmLT5oUGNtVXRpbHMgKTsKKyAgfQorCisKKworICBpZiAoc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCkgeworICAgIHNickRlY29kZXJfQ2xvc2UoJnNlbGYtPmhTYnJEZWNvZGVyKTsKKyAgfQorCisgIGlmIChzZWxmLT5oSW5wdXQgIT0gTlVMTCkgeworICAgIHRyYW5zcG9ydERlY19DbG9zZSgmc2VsZi0+aElucHV0KTsKKyAgfQorCisgIENBYWNEZWNvZGVyX0Nsb3NlKHNlbGYpOworfQorCisKK0xJTktTUEVDX0NQUCBDU3RyZWFtSW5mbyogYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApCit7CisgIHJldHVybiBDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKHNlbGYpOworfQorCitMSU5LU1BFQ19DUFAgSU5UIGFhY0RlY29kZXJfR2V0TGliSW5mbyAoIExJQl9JTkZPICppbmZvICkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHNickRlY29kZXJfR2V0TGliSW5mbyggaW5mbyApOworICB0cmFuc3BvcnREZWNfR2V0TGliSW5mbyggaW5mbyApOworICBGREtfdG9vbHNHZXRMaWJJbmZvKCBpbmZvICk7CisgIHBjbURteF9HZXRMaWJJbmZvKCBpbmZvICk7CisKKyAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGluZm8gKz0gaTsKKworICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfQUFDREVDOworICAvKiBidWlsZCBvd24gbGlicmFyeSBpbmZvICovCisgIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihBQUNERUNPREVSX0xJQl9WTDAsIEFBQ0RFQ09ERVJfTElCX1ZMMSwgQUFDREVDT0RFUl9MSUJfVkwyKTsKKyAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pOworICBpbmZvLT5idWlsZF9kYXRlID0gQUFDREVDT0RFUl9MSUJfQlVJTERfREFURTsKKyAgaW5mby0+YnVpbGRfdGltZSA9IEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUU7CisgIGluZm8tPnRpdGxlID0gQUFDREVDT0RFUl9MSUJfVElUTEU7CisKKyAgLyogU2V0IGZsYWdzICovCisgIGluZm8tPmZsYWdzID0gMAorICAgICAgfCBDQVBGX0FBQ19MQworICAgICAgfCBDQVBGX0FBQ19WQ0IxMQorICAgICAgfCBDQVBGX0FBQ19IQ1IKKyAgICAgIHwgQ0FQRl9BQUNfUlZMQworICAgICAgfCBDQVBGX0VSX0FBQ19MRAorICAgICAgfCBDQVBGX0VSX0FBQ19FTEQKKyAgICAgIHwgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQKKyAgICAgIHwgQ0FQRl9BQUNfRFJDCisKKyAgICAgIHwgQ0FQRl9BQUNfTVBFRzQKKworCisgICAgICB8IENBUEZfQUFDXzEwMjQKKyAgICAgIHwgQ0FQRl9BQUNfOTYwCisKKyAgICAgIHwgQ0FQRl9BQUNfNTEyCisKKyAgICAgIHwgQ0FQRl9BQUNfNDgwCisKKyAgICAgIDsKKyAgLyogRW5kIG9mIGZsYWdzICovCisKKyAgcmV0dXJuIDA7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYXJtL2Jsb2NrX2FybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjMWJmMwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwCkBAIC0wLDAgKzEsMTQwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKKyAgIERlc2NyaXB0aW9uOiAoQVJNIG9wdGltaXNlZCkgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMQorCisvKiBOb3RlOiBUaGlzIGxvb3AgaXMgb25seSBzZXBhcmF0ZWQgZm9yIEFSTSBpbiBvcmRlciB0byBzYXZlIGN5Y2xlcworICAgICAgICAgYnkgbG9vcCB1bnJvbGxpbmcuIFRoZSBBUk0gY29yZSBwcm92aWRlcyBieSBkZWZhdWx0IGEgNS1jeWNsZQorICAgICAgICAgbG9vcCBvdmVyaGVhZCBwZXIgc2FtcGxlLCB0aGF0IGdvZXMgZG93biB0byAxLWN5Y2xlIHBlciBzYW1wbGUKKyAgICAgICAgIHdpdGggYW4gb3B0aW1hbCA0eC1sb29wIGNvbnN0cnVjdCAoZG8gLSA0eCAtIHdoaWxlKS4KKyovCisKK0ZES19JTkxJTkUgc3RhdGljIHZvaWQgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxKAorICAgIEZJWFBfREJMICpwU3BlY3RydW0sCisgICAgaW50IG1heF9iYW5kLAorICAgIGNvbnN0IFNIT1JUICogUkVTVFJJQ1QgQmFuZE9mZnNldHMsCisgICAgaW50IFNwZWNTY2FsZV93aW5kb3csCisgICAgY29uc3QgU0hPUlQgKiBSRVNUUklDVCBwU2ZiU2NhbGUsCisgICAgaW50IHdpbmRvdykKK3sKKyAgaW50IGJhbmRfb2Zmc2V0ID0gMDsKKyAgZm9yIChpbnQgYmFuZD0wOyBiYW5kIDwgbWF4X2JhbmQ7IGJhbmQrKykKKyAgeworICAgIGludCBydW5zID0gYmFuZF9vZmZzZXQ7CisgICAgYmFuZF9vZmZzZXQgPSBCYW5kT2Zmc2V0c1tiYW5kKzFdOworICAgIHJ1bnMgPSBiYW5kX29mZnNldCAtIHJ1bnM7ICAgIC8qIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDQgKi8KKyAgICBpbnQgc2NhbGUgPSBTcGVjU2NhbGVfd2luZG93LXBTZmJTY2FsZVt3aW5kb3cqMTYrYmFuZF07CisgICAgaWYgKHNjYWxlKQorICAgIHsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIEZJWFBfREJMIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgICAgIHRtcDAgPSBwU3BlY3RydW1bMF07CisgICAgICAgIHRtcDEgPSBwU3BlY3RydW1bMV07CisgICAgICAgIHRtcDIgPSBwU3BlY3RydW1bMl07CisgICAgICAgIHRtcDMgPSBwU3BlY3RydW1bM107CisgICAgICAgIHRtcDAgPj49IHNjYWxlOworICAgICAgICB0bXAxID4+PSBzY2FsZTsKKyAgICAgICAgdG1wMiA+Pj0gc2NhbGU7CisgICAgICAgIHRtcDMgPj49IHNjYWxlOworICAgICAgICAqcFNwZWN0cnVtKysgPSB0bXAwOworICAgICAgICAqcFNwZWN0cnVtKysgPSB0bXAxOworICAgICAgICAqcFNwZWN0cnVtKysgPSB0bXAyOworICAgICAgICAqcFNwZWN0cnVtKysgPSB0bXAzOworICAgICAgfSB3aGlsZSAoKHJ1bnMgPSBydW5zLTQpICE9IDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcFNwZWN0cnVtKz0gcnVuczsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcCBiL2FhYy9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZhY2NiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvYmxvY2suY3BwCkBAIC0wLDAgKzEsNzU4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBsb25nL3Nob3J0LWJsb2NrIGRlY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJsb2NrLmgiCisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKworCisKKworI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKyNpbmNsdWRlICJydmxjLmgiCisKKworI2lmIGRlZmluZWQoX19hcm1fXykKKyNpbmNsdWRlICJhcm0vYmxvY2tfYXJtLmNwcCIKKyNlbmRpZgorCisvKiEKKyAgXGJyaWVmIFJlYWQgZXNjYXBlIHNlcXVlbmNlIG9mIGNvZGV3b3JkCisKKyAgVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBlc2NhcGUgc2VxdWVuY2UgZnJvbSB0aGUgYml0c3RyZWFtLAorICBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCBoYXMgdGhlCisgIHZhbHVlIDE2LgorCisgIFxyZXR1cm4gIHF1YW50aXplZCBjb2VmZmljaWVudAorKi8KK0xPTkcgQ0Jsb2NrX0dldEVzY2FwZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLworICAgICAgICAgICAgICAgICAgICAgY29uc3QgTE9ORyBxKSAgICAgICAgLyohPCBxdWFudGl6ZWQgY29lZmZpY2llbnQgKi8KK3sKKyAgTE9ORyBpLCBvZmYsIG5lZyA7CisKKyAgaWYgKHEgPCAwKQorICB7CisgICAgaWYgKHEgIT0gLTE2KSByZXR1cm4gcTsKKyAgICBuZWcgPSAxOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChxICE9ICsxNikgcmV0dXJuIHE7CisgICAgbmVnID0gMDsKKyAgfQorCisgIGZvciAoaT00OyA7IGkrKykKKyAgeworICAgIGlmIChGREtyZWFkQml0cyhicywxKSA9PSAwKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaSA+IDE2KQorICB7CisgICAgaWYgKGkgLSAxNiA+IENBQ0hFX0JJVFMpIHsgLyogY2Fubm90IHJlYWQgbW9yZSB0aGFuICJDQUNIRV9CSVRTIiBiaXRzIGF0IG9uY2UgaW4gdGhlIGZ1bmN0aW9uIEZES3JlYWRCaXRzKCkgKi8KKyAgICAgIHJldHVybiAoTUFYX1FVQU5USVpFRF9WQUxVRSArIDEpOyAvKiByZXR1cm5pbmcgaW52YWxpZCB2YWx1ZSB0aGF0IHdpbGwgYmUgY2FwdHVyZWQgbGF0ZXIgKi8KKyAgICB9CisKKyAgICBvZmYgPSBGREtyZWFkQml0cyhicyxpLTE2KSA8PCAxNjsKKyAgICBvZmYgfD0gRkRLcmVhZEJpdHMoYnMsMTYpOworICB9CisgIGVsc2UKKyAgeworICAgIG9mZiA9IEZES3JlYWRCaXRzKGJzLGkpOworICB9CisKKyAgaSA9IG9mZiArICgxIDw8IGkpOworCisgIGlmIChuZWcpIGkgPSAtaTsKKworICByZXR1cm4gaTsKK30KKworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTY2FsZUZhY3RvckRhdGEoCisgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBVSU5UIGZsYWdzCisgICAgICAgICkKK3sKKyAgaW50IHRlbXA7CisgIGludCBiYW5kOworICBpbnQgZ3JvdXA7CisgIGludCBwb3NpdGlvbiA9IDA7IC8qIGFjY3UgZm9yIGludGVuc2l0eSBkZWx0YSBjb2RpbmcgKi8KKyAgaW50IGZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluOyAvKiBhY2N1IGZvciBzY2FsZSBmYWN0b3IgZGVsdGEgY29kaW5nICovCisgIFVDSEFSICpwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOworICBTSE9SVCAqcFNjYWxlRmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKKyAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0mQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW0JPT0tTQ0xdOworCisgIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKKyAgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCisgICAgeworICAgICAgc3dpdGNoIChwQ29kZUJvb2tbZ3JvdXAqMTYrYmFuZF0pIHsKKworICAgICAgY2FzZSBaRVJPX0hDQjogLyogemVybyBib29rICovCisgICAgICAgIHBTY2FsZUZhY3Rvcltncm91cCoxNitiYW5kXSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAvKiBkZWNvZGUgc2NhbGUgZmFjdG9yICovCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLGhjYik7CisgICAgICAgICAgZmFjdG9yICs9IHRlbXAgLSA2MDsgLyogTUlERkFDIDEuNSBkQiAqLworICAgICAgICB9CisgICAgICAgIHBTY2FsZUZhY3Rvcltncm91cCoxNitiYW5kXSA9IGZhY3RvciAtIDEwMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjogLyogaW50ZW5zaXR5IHN0ZWVyaW5nICovCisgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICB0ZW1wID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLGhjYik7CisgICAgICAgIHBvc2l0aW9uICs9IHRlbXAgLSA2MDsKKyAgICAgICAgcFNjYWxlRmFjdG9yW2dyb3VwKjE2K2JhbmRdID0gcG9zaXRpb24gLSAxMDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5PSVNFX0hDQjogLyogUE5TICovCisgICAgICAgIGlmIChmbGFncyAmIChBQ19NUFNfUkVTfEFDX1VTQUN8QUNfUlNWRDUwKSkgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIENQbnNfUmVhZCggJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsIGJzLCBoY2IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluLCBiYW5kLCBncm91cCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBBQUNfREVDX09LOworfQorCit2b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbykKK3sKKyAgaW50IGJhbmQ7CisgIGludCB3aW5kb3c7CisgIGNvbnN0IFNIT1JUICogUkVTVFJJQ1QgcFNmYlNjYWxlICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7CisgIFNIT1JUICogUkVTVFJJQ1QgcFNwZWNTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKKyAgaW50IGdyb3Vwd2luLGdyb3VwOworICBjb25zdCBTSE9SVCAqIFJFU1RSSUNUIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworICBTUEVDVFJBTF9QVFIgUkVTVFJJQ1QgcFNwZWN0cmFsQ29lZmZpY2llbnQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudDsKKworCisgIEZES21lbWNsZWFyKHBTcGVjU2NhbGUsIDgqc2l6ZW9mKFNIT1JUKSk7CisKKyAgaW50IG1heF9iYW5kID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgZm9yICh3aW5kb3c9MCwgZ3JvdXA9MDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKQorICB7CisgICAgZm9yIChncm91cHdpbj0wOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsgZ3JvdXB3aW4rKywgd2luZG93KyspCisgICAgeworICAgICAgaW50IFNwZWNTY2FsZV93aW5kb3cgPSBwU3BlY1NjYWxlW3dpbmRvd107CisgICAgICBGSVhQX0RCTCAqcFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CisKKyAgICAgIC8qIGZpbmQgc2NhbGluZyBmb3IgY3VycmVudCB3aW5kb3cgKi8KKyAgICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgbWF4X2JhbmQ7IGJhbmQrKykKKyAgICAgIHsKKyAgICAgICAgU3BlY1NjYWxlX3dpbmRvdyA9IGZNYXgoU3BlY1NjYWxlX3dpbmRvdywgKGludClwU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhLkFjdGl2ZSkgeworICAgICAgICBTcGVjU2NhbGVfd2luZG93ICs9IFROU19TQ0FMRTsKKyAgICAgIH0KKworICAgICAgLyogc3RvcmUgc2NhbGluZyBvZiBjdXJyZW50IHdpbmRvdyAqLworICAgICAgcFNwZWNTY2FsZVt3aW5kb3ddID0gU3BlY1NjYWxlX3dpbmRvdzsKKworI2lmZGVmIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMQorCisgICAgICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEocFNwZWN0cnVtLCBtYXhfYmFuZCwgQmFuZE9mZnNldHMsIFNwZWNTY2FsZV93aW5kb3csIHBTZmJTY2FsZSwgd2luZG93KTsKKworI2Vsc2UgLyogRlVOQ1RJT05fQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxICovCisgICAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IG1heF9iYW5kOyBiYW5kKyspCisgICAgICB7CisgICAgICAgIGludCBzY2FsZSA9IFNwZWNTY2FsZV93aW5kb3cgLSBwU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdOworICAgICAgICBpZiAoc2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb2xsb3dpbmcgcmVsYXRpb24gY2FuIGJlIHVzZWQgZm9yIG9wdGltaXphdGlvbnM6IChCYW5kT2Zmc2V0c1tpXSU0KSA9PSAwIGZvciBhbGwgaSAqLworICAgICAgICAgIGludCBtYXhfaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kKzFdOworICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gQmFuZE9mZnNldHNbYmFuZF07IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBTcGVjdHJ1bVtpbmRleF0gPj49IHNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmICAvKiBGVU5DVElPTl9DQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEgKi8KKyAgICB9CisgIH0KKworfQorCitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNlY3Rpb25EYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MpCit7CisgIGludCB0b3AsIGJhbmQ7CisgIGludCBzZWN0X2xlbiwgc2VjdF9sZW5faW5jcjsKKyAgaW50IGdyb3VwOworICBVQ0hBUiBzZWN0X2NiOworICBVQ0hBUiAqcENvZGVCb29rID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsKKyAgLyogSENSIGlucHV0IChsb25nKSAqLworICBTSE9SVCAqcE51bUxpbmVzSW5TZWMgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYU51bUxpbmVJblNlYzRIY3I7CisgIGludCAgICBudW1MaW5lc0luU2VjSWR4ICA9IDA7CisgIFVDSEFSICpwSGNyQ29kZUJvb2sgICAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hQ29kZUJvb2tzNEhjcjsKKyAgY29uc3QgU0hPUlQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubnVtYmVyU2VjdGlvbiA9IDA7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBGREttZW1jbGVhcihwQ29kZUJvb2ssIHNpemVvZihVQ0hBUikqKDgqMTYpKTsKKworICBjb25zdCBpbnQgbmJpdHMgPSAoSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IDEpID8gNSA6IDM7CisKKyAgaW50IHNlY3RfZXNjX3ZhbCA9ICgxIDw8IG5iaXRzKSAtIDEgOworCisgIFVDSEFSIFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIGZvciAoZ3JvdXA9MDsgZ3JvdXA8R2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKKyAgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyApCisgICAgeworICAgICAgc2VjdF9sZW4gPSAwOworICAgICAgaWYgKCBmbGFncyAmIEFDX0VSX1ZDQjExICkgIHsKKyAgICAgICAgc2VjdF9jYiA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNlY3RfY2IgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworCisgICAgICBpZiAoICgoZmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPT0gMCkgfHwgKCBzZWN0X2NiIDwgMTEgKSB8fCAoKHNlY3RfY2IgPiAxMSkgJiYgKHNlY3RfY2IgPCAxNikpICkgeworICAgICAgICBzZWN0X2xlbl9pbmNyID0gRkRLcmVhZEJpdHMoYnMsIG5iaXRzKTsKKyAgICAgICAgd2hpbGUgKHNlY3RfbGVuX2luY3IgPT0gc2VjdF9lc2NfdmFsKQorICAgICAgICB7CisgICAgICAgICAgc2VjdF9sZW4gKz0gc2VjdF9lc2NfdmFsOworICAgICAgICAgIHNlY3RfbGVuX2luY3IgPSBGREtyZWFkQml0cyhicywgbmJpdHMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgc2VjdF9sZW5faW5jciA9IDE7CisgICAgICB9CisKKyAgICAgIHNlY3RfbGVuICs9IHNlY3RfbGVuX2luY3I7CisKKworICAgICAgdG9wID0gYmFuZCArIHNlY3RfbGVuOworCisgICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9IQ1IpIHsKKyAgICAgICAgLyogSENSIGlucHV0IChsb25nKSAtLSBjb2xsZWN0aW5nIHNpZGVpbmZvIChmb3IgSENSLV9sb25nXyBvbmx5KSAqLworICAgICAgICBwTnVtTGluZXNJblNlY1tudW1MaW5lc0luU2VjSWR4XSA9IEJhbmRPZmZzZXRzW3RvcF0gLSBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgbnVtTGluZXNJblNlY0lkeCsrOworICAgICAgICBpZiAobnVtTGluZXNJblNlY0lkeCA+PSBNQVhfU0ZCX0hDUikgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChzZWN0X2NiID09IEJPT0tTQ0wpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqcEhjckNvZGVCb29rKysgPSBzZWN0X2NiOworICAgICAgICB9CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5udW1iZXJTZWN0aW9uKys7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIHNwZWN0cmFsIGxpbmUgbGltaXRzICovCisgICAgICBpZiAoSXNMb25nQmxvY2soICYocEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHRvcCA+IDY0KSB7CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiBzaG9ydCBibG9jayAqLworICAgICAgICBpZiAodG9wICsgZ3JvdXAqMTYgPiAoOCAqIDE2KSkgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiBkZWNvZGVkIGNvZGVib29rIGluZGV4IGlzIGZlYXNpYmxlICovCisgICAgICBpZiAoIChzZWN0X2NiID09IEJPT0tTQ0wpCisgICAgICAgfHwgKCAoc2VjdF9jYiA9PSBJTlRFTlNJVFlfSENCIHx8IHNlY3RfY2IgPT0gSU5URU5TSVRZX0hDQjIpICYmIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPT0gMCkKKyAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9DT0RFX0JPT0s7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIGNvZGVib29rIGluZGV4ICovCisgICAgICBmb3IgKDsgYmFuZCA8IHRvcDsgYmFuZCsrKQorICAgICAgeworICAgICAgICBwQ29kZUJvb2tbZ3JvdXAqMTYrYmFuZF0gPSBzZWN0X2NiOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisvKiBtc286IHByb3ZpZGVzIGEgZmFzdGVyIHdheSB0byBpLXF1YW50aXplIGEgd2hvbGUgYmFuZCBpbiBvbmUgZ28gKi8KKworLyoqCisgKiBcYnJpZWYgaW52ZXJzZSBxdWFudGl6ZSBvbmUgc2ZiLiBFYWNoIHZhbHVlIG9mIHRoZSBzZmIgaXMgcHJvY2Vzc2VkIGFjY29yZGluZyB0byB0aGUKKyAqICAgICAgICBmb3JtdWxhOiBzcGVjdHJ1bVtpXSA9IFNpZ24oc3BlY3RydW1baV0pICogTWF0aXNzYShzcGVjdHJ1bVtpXSleKDQvMykgKiAyXihsc2IvNCkuCisgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byBmaXJzdCBsaW5lIG9mIHRoZSBzZmIgdG8gYmUgaW52ZXJzZSBxdWFudGl6ZWQuCisgKiBccGFyYW0gbm9MaW5lcyBudW1iZXIgb2YgbGluZXMgYmVsb25naW5nIHRvIHRoZSBzZmIuCisgKiBccGFyYW0gbHNiIGxhc3QgMiBiaXRzIG9mIHRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHNmYi4KKyAqIFxwYXJhbSBzY2FsZSBtYXggYWxsb3dlZCBzaGlmdCBzY2FsZSBmb3IgdGhlIHNmYi4KKyAqLworc3RhdGljCit2b2lkIEludmVyc2VRdWFudGl6ZUJhbmQoIEZJWFBfREJMICogUkVTVFJJQ1Qgc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9MaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGUgKQoreworICAgIGNvbnN0IEZJWFBfREJMICogUkVTVFJJQ1QgSW52ZXJzZVF1YW50VGFibGVyPShGSVhQX0RCTCAqKUludmVyc2VRdWFudFRhYmxlOworICAgIGNvbnN0IEZJWFBfREJMICogUkVTVFJJQ1QgTWFudGlzc2FUYWJsZXI9KEZJWFBfREJMICopTWFudGlzc2FUYWJsZVtsc2JdOworICAgIGNvbnN0IFNDSEFSKiBSRVNUUklDVCBFeHBvbmVudFRhYmxlcj0oU0NIQVIqKUV4cG9uZW50VGFibGVbbHNiXTsKKworICAgIEZJWFBfREJMICpwdHIgPSBzcGVjdHJ1bTsKKyAgICBGSVhQX0RCTCBzaWduZWRWYWx1ZTsKKworICAgIEZES19BU1NFUlQobm9MaW5lcz4yKTsKKyAgICBmb3IgKElOVCBpPW5vTGluZXM7IGktLTsgKQorICAgIHsKKyAgICAgICAgaWYgKChzaWduZWRWYWx1ZSA9ICpwdHIrKykgIT0gRkwyRlhDT05TVF9EQkwoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBGSVhQX0RCTCB2YWx1ZSA9IGZBYnMoc2lnbmVkVmFsdWUpOworICAgICAgICAgIFVJTlQgZnJlZUJpdHMgPSBDbnRMZWFkaW5nWmVyb3ModmFsdWUpOworICAgICAgICAgIFVJTlQgZXhwb25lbnQgPSAzMiAtIGZyZWVCaXRzOworCisgICAgICAgICAgVUlOVCB4ID0gKFVJTlQpIChMT05HKXZhbHVlIDw8IChJTlQpIGZyZWVCaXRzOworICAgICAgICAgIHggPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IG91dCBzaWduIGJpdCB0byBhdm9pZCBtYXNraW5nIGxhdGVyIG9uICovCisgICAgICAgICAgVUlOVCB0YWJsZUluZGV4ID0geCA+PiAyNDsKKyAgICAgICAgICB4ID0gKHggPj4gMjApICYgIDB4MEY7CisKKyAgICAgICAgICBVSU5UIHIwPShVSU5UKShMT05HKUludmVyc2VRdWFudFRhYmxlclt0YWJsZUluZGV4KzBdOworICAgICAgICAgIFVJTlQgcjE9KFVJTlQpKExPTkcpSW52ZXJzZVF1YW50VGFibGVyW3RhYmxlSW5kZXgrMV07CisgICAgICAgICAgVUlOVCB0ZW1wPSAocjEgLSByMCkqeCArIChyMCA8PCA0KTsKKworICAgICAgICAgIHZhbHVlID0gZk11bHREaXYyKChGSVhQX0RCTCl0ZW1wLCBNYW50aXNzYVRhYmxlcltleHBvbmVudF0pOworCisgICAgICAgICAgLyogKyAxIGNvbXBlbnNhdGVzIGZNdWx0RGl2MigpICovCisgICAgICAgICAgc2NhbGVWYWx1ZUluUGxhY2UoJnZhbHVlLCBzY2FsZSArIEV4cG9uZW50VGFibGVyW2V4cG9uZW50XSArIDEpOworCisgICAgICAgICAgc2lnbmVkVmFsdWUgPSAoc2lnbmVkVmFsdWUgPCAoRklYUF9EQkwpMCkgPyAtdmFsdWUgOiB2YWx1ZTsKKyAgICAgICAgICBwdHJbLTFdID0gc2lnbmVkVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pCit7CisgIGludCB3aW5kb3csIGdyb3VwLCBncm91cHdpbiwgYmFuZDsKKyAgaW50IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIFVDSEFSICpSRVNUUklDVCBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOworICBTSE9SVCAqUkVTVFJJQ1QgcFNmYlNjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTZmJTY2FsZTsKKyAgU0hPUlQgKlJFU1RSSUNUIHBTY2FsZUZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7CisgIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKworICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlLCAoOCoxNikqc2l6ZW9mKFNIT1JUKSk7CisKKyAgZm9yICh3aW5kb3c9MCwgZ3JvdXA9MDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKQorICB7CisgICAgZm9yIChncm91cHdpbj0wOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsgZ3JvdXB3aW4rKywgd2luZG93KyspCisgICAgeworICAgICAgLyogaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KKyAgICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCisgICAgICB7CisgICAgICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCkgKyBCYW5kT2Zmc2V0c1tiYW5kXTsKKworICAgICAgICBpbnQgbm9MaW5lcyA9IEJhbmRPZmZzZXRzW2JhbmQrMV0gLSBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgaW50IGJuZHMgPSBncm91cCoxNitiYW5kOworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoKHBDb2RlQm9va1tibmRzXSA9PSBaRVJPX0hDQikKKyAgICAgICAgIHx8IChwQ29kZUJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQikKKyAgICAgICAgIHx8IChwQ29kZUJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQjIpCisgICAgICAgICAgICkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocENvZGVCb29rW2JuZHNdID09IE5PSVNFX0hDQikKKyAgICAgICAgeworICAgICAgICAgIC8qIExlYXZlIGhlYWRyb29tIGZvciBQTlMgdmFsdWVzLiArIDEgYmVjYXVzZSBjZWlsKGxvZzIoMl4oMC4yNSozKSkpID0gMSwKKyAgICAgICAgICAgICB3b3JzdCBjYXNlIG9mIGFkZGl0aW9uYWwgaGVhZHJvb20gcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgc2NhbGVmYWN0b3IuICovCisgICAgICAgICAgcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXSA9IChwU2NhbGVGYWN0b3IgW2JuZHNdID4+IDIpICsgMSA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIG1heCBzcGVjdHJhbCBsaW5lIHZhbHVlIG9mIHRoZSBjdXJyZW50IHNmYiAqLworICAgICAgICBGSVhQX0RCTCBsb2NNYXggPSAoRklYUF9EQkwpMDsKKworICAgICAgICBmb3IgKGkgPSBub0xpbmVzOyBpLS0gOyApIHsKKyAgICAgICAgICAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLworICAgICAgICAgIGxvY01heCA9IGZNYXgoZml4cF9hYnMocFNwZWN0cmFsQ29lZmZpY2llbnRbaV0pLCBsb2NNYXgpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlYXAgcm9idXN0bmVzcyBpbXByb3ZlbWVudCAtIERvIG5vdCByZW1vdmUhISEgKi8KKyAgICAgICAgaWYgKGZpeHBfYWJzKGxvY01heCkgPiAoRklYUF9EQkwpTUFYX1FVQU5USVpFRF9WQUxVRSkgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAgIFRoZSBpbnZlcnNlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcyBhcmUgZGVmaW5lZCBieToKKyAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbaV0gPSBTaWduKHBTcGVjdHJhbENvZWZmaWNpZW50W2ldKSAqIDJeKDAuMjUqcFNjYWxlRmFjdG9yW2JuZHNdKSAqIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldXig0LzMpCisgICAgICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbaV0gICAgPSBTaWduKHBTcGVjdHJhbENvZWZmaWNpZW50W2ldKSAqICgyXihwU2NhbGVGYWN0b3JbYm5kc10gJSA0KSAqIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldXig0LzMpKQorICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudF9lW2ldICs9IHBTY2FsZUZhY3RvcltibmRzXS80CisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbXNiID0gcFNjYWxlRmFjdG9yIFtibmRzXSA+PiAyIDsKKyAgICAgICAgICBpbnQgbHNiID0gcFNjYWxlRmFjdG9yIFtibmRzXSAmIDB4MDMgOworCisgICAgICAgICAgaW50IHNjYWxlID0gR2V0U2NhbGVGcm9tVmFsdWUobG9jTWF4LCBsc2IpOworCisgICAgICAgICAgcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXSA9IG1zYiAtIHNjYWxlOworICAgICAgICAgIEludmVyc2VRdWFudGl6ZUJhbmQocFNwZWN0cmFsQ29lZmZpY2llbnQsIG5vTGluZXMsIGxzYiwgc2NhbGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICByZXR1cm4gQUFDX0RFQ19PSzsKK30KKworCitBQUNfREVDT0RFUl9FUlJPUiAgQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncykKK3sKKyAgaW50IGksaW5kZXg7CisgIGludCB3aW5kb3csZ3JvdXAsZ3JvdXB3aW4sZ3JvdXBvZmZzZXQsYmFuZDsKKyAgVUNIQVIgKlJFU1RSSUNUIHBDb2RlQm9vayA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7CisgIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKworICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudDsKKyAgRklYUF9EQkwgbG9jTWF4OworCisgIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworCisgIEZES19BU1NFUlQoQmFuZE9mZnNldHMgIT0gTlVMTCk7CisKKyAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIHNpemVvZihTUEVDVFJVTSkpOworCisgIGlmICggKGZsYWdzICYgQUNfRVJfSENSKSA9PSAwICkKKyAgeworICAgIGdyb3Vwb2Zmc2V0ID0gMDsKKworICAgIC8qIHBsYWluIGh1ZmZtYW4gZGVjb2RlciAgc2hvcnQgKi8KKyAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKKyAgICB7CisgICAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQorICAgICAgeworICAgICAgICBpbnQgYm5kcyA9IGdyb3VwKjE2K2JhbmQ7CisgICAgICAgIFVDSEFSIGN1cnJlbnRDQiA9IHBDb2RlQm9va1tibmRzXTsKKworICAgICAgICAvKiBwYXRjaCB0byBydW4gcGxhaW4taHVmZm1hbi1kZWNvZGVyIHdpdGggdmNiMTEgaW5wdXQgY29kZWJvb2tzIChMQVYtY2hlY2tpbmcgbWlnaHQgYmUgcG9zc2libGUgYmVsb3cgdXNpbmcgdGhlIHZpcnR1YWwgY2IgYW5kIGEgTEFWLXRhYmxlKSAqLworICAgICAgICBpZiAoKGN1cnJlbnRDQiA+PSAxNikgJiYgKGN1cnJlbnRDQiA8PSAzMSkpIHsKKyAgICAgICAgICBwQ29kZUJvb2tbYm5kc10gPSBjdXJyZW50Q0IgPSAxMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEoKGN1cnJlbnRDQiA9PSBaRVJPX0hDQikKKyAgICAgICAgICAgIHx8IChjdXJyZW50Q0IgPT0gTk9JU0VfSENCKQorICAgICAgICAgICAgfHwgKGN1cnJlbnRDQiA9PSBJTlRFTlNJVFlfSENCKQorICAgICAgICAgICAgfHwgKGN1cnJlbnRDQiA9PSBJTlRFTlNJVFlfSENCMikpICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiA9ICZBQUNjb2RlQm9va0Rlc2NyaXB0aW9uVGFibGVbY3VycmVudENCXTsKKyAgICAgICAgICBpbnQgc3RlcCA9IGhjYi0+RGltZW5zaW9uOworICAgICAgICAgIGludCBvZmZzZXQgPSBoY2ItPk9mZnNldDsKKyAgICAgICAgICBpbnQgYml0cyA9IGhjYi0+bnVtQml0czsKKyAgICAgICAgICBpbnQgbWFzayA9ICgxPDxiaXRzKS0xOworCisgICAgICAgICAgZm9yIChncm91cHdpbj0wOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsgZ3JvdXB3aW4rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICB3aW5kb3cgPSBncm91cG9mZnNldCArIGdyb3Vwd2luOworCisgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKKworICAgICAgICAgICAgbG9jTWF4ID0gKEZJWFBfREJMKTAgOworCisgICAgICAgICAgICBmb3IgKGluZGV4PUJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IEJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4Kz1zdGVwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgaWR4ID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLGhjYik7CisKKyAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c3RlcDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gKEZJWFBfREJMKSgoaWR4ICYgbWFzayktb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZHggPj49IGJpdHM7CisKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gRklYUF9EQkwoMCkpCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IChGREtyZWFkQml0cyhicywxKSk/IC10bXAgOiB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCtpXSA9IHRtcDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChjdXJyZW50Q0IgPT0gRVNDQk9PSykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCswXSA9IChGSVhQX0RCTClDQmxvY2tfR2V0RXNjYXBlKGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXgrMF0pOworICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCsxXSA9IChGSVhQX0RCTClDQmxvY2tfR2V0RXNjYXBlKGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXgrMV0pOworCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdyb3Vwb2Zmc2V0ICs9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKKyAgICB9CisgICAgLyogcGxhaW4gaHVmZm1hbiBkZWNvZGluZyAoc2hvcnQpIGZpbmlzaGVkICovCisgIH0KKyAgLyogSENSIC0gSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nICBzaG9ydCAqLworICBlbHNlICAvKiBpZiAoIGZsYWdzICYgQUNfRVJfSENSICkgKi8KKyAgeworICAgIEhfSENSX0lORk8gaEhjciA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJIY3JJbmZvOworICAgIGludCBoY3JTdGF0dXMgPSAwOworCisgICAgLyogYWR2YW5jZWQgSHVmZm1hbiBkZWNvZGluZyBzdGFydHMgaGVyZSAoSENSIGRlY29kaW5nIDopICovCisgICAgaWYgKCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgIT0gMCApIHsKKworICAgICAgLyogSENSIGluaXRpYWxpemF0aW9uIHNob3J0ICovCisgICAgICBoY3JTdGF0dXMgPSBIY3JJbml0KGhIY3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvLCBicyk7CisKKyAgICAgIGlmIChoY3JTdGF0dXMgIT0gMCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEhDUiBkZWNvZGluZyBzaG9ydCAqLworICAgICAgaGNyU3RhdHVzID0gSGNyRGVjb2RlcihoSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgYnMpOworCisgICAgICBpZiAoaGNyU3RhdHVzICE9IDApIHsKKyNpZiBIQ1JfRVJST1JfQ09OQ0VBTE1FTlQKKyAgICAgICAgSGNyTXV0ZUVycm9uZW91c0xpbmVzKGhIY3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworI2VuZGlmIC8qIEhDUl9FUlJPUl9DT05DRUFMTUVOVCAqLworICAgICAgfQorCisgICAgICBGREtwdXNoRm9yIChicywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhKTsKKyAgICB9CisgIH0KKyAgLyogSENSIC0gSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nIHNob3J0IGZpbmlzaGVkICovCisKKworCisgIGlmICggSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pICYmICEoZmxhZ3MgJiAoQUNfRUxEfEFDX1NDQUxBQkxFKSkgKQorICB7CisgICAgLyogYXBwbHkgcHVsc2UgZGF0YSAqLworICAgIENQdWxzZURhdGFfQXBwbHkoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5QdWxzZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgIFNQRUNfTE9ORyhwU3BlY3RyYWxDb2VmZmljaWVudCkpOworICB9CisKKworICByZXR1cm4gQUFDX0RFQ19PSzsKK30KKworCisKK3ZvaWQgQXBwbHlUb29scyAoIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsICkKK3sKKworICBpZiAoICEoZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTB8QUNfTVBTX1JFUykpICkgeworICAgIENQbnNfQXBwbHkoCisgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5kYXRhLmFhYy5QbnNEYXRhLAorICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+aWNzSW5mbywKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+c3BlY1NjYWxlLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+Z3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgIGNoYW5uZWwKKyAgICAgICAgICAgICk7CisgIH0KKworICBDVG5zX0FwcGx5ICgKKyAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wRHluRGF0YS0+VG5zRGF0YSwKKyAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5pY3NJbmZvLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmdyYW51bGVMZW5ndGgKKyAgICAgICAgICApOworfQorCitzdGF0aWMKK2ludCBnZXRXaW5kb3cyTnIoaW50IGxlbmd0aCwgaW50IHNoYXBlKQoreworICBpbnQgbnIgPSAwOworCisgIGlmIChzaGFwZSA9PSAyKSB7CisgICAgLyogTG93IE92ZXJsYXAsIDMvNCB6ZXJvZWQgKi8KKyAgICBuciA9IChsZW5ndGggKiAzKT4+MjsKKyAgfQorCisgIHJldHVybiBucjsKK30KKwordm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNIG91dFNhbXBsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZU9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwV29ya0J1ZmZlcjEgKQoreworICBpbnQgZnIsIGZsLCB0bCwgblNhbXBsZXMsIG5TcGVjOworCisgIC8qIERldGVybWluZSBsZWZ0IHNsb3BlIGxlbmd0aCAoZmwpLCByaWdodCBzbG9wZSBsZW5ndGggKGZyKSBhbmQgdHJhbnNmb3JtIGxlbmd0aCAodGwpLgorICAgICBVU0FDOiBUaGUgc2xvcGUgbGVuZ3RoIG1heSBtaXNtYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBmcmFtZSBpbiBjYXNlIG9mIExQRCAvIEZECisgICAgICAgICAgIHRyYW5zaXRpb25zLiBUaGUgYWRqdXN0bWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBpbWRjdCBpbXBsZW1lbnRhdGlvbi4KKyAgKi8KKyAgdGwgPSBmcmFtZUxlbjsKKyAgblNwZWMgPSAxOworCisgIHN3aXRjaCggcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSApIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT25seUxvbmdTZXF1ZW5jZToKKyAgICAgIGZsID0gZnJhbWVMZW47CisgICAgICBmciA9IGZyYW1lTGVuIC0gZ2V0V2luZG93Mk5yKGZyYW1lTGVuLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMb25nU3RvcFNlcXVlbmNlOgorICAgICAgZmwgPSBmcmFtZUxlbiA+PiAzOworICAgICAgZnIgPSBmcmFtZUxlbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTG9uZ1N0YXJ0U2VxdWVuY2U6IC8qIG9yIFN0b3BTdGFydFNlcXVlbmNlICovCisgICAgICBmbCA9IGZyYW1lTGVuOworICAgICAgZnIgPSBmcmFtZUxlbiA+PiAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFaWdodFNob3J0U2VxdWVuY2U6CisgICAgICBmbCA9IGZyID0gZnJhbWVMZW4gPj4gMzsKKyAgICAgIHRsID4+PSAzOworICAgICAgblNwZWMgPSA4OworICAgICAgYnJlYWs7CisgIH0KKworICB7CisgICAgaW50IGk7CisKKyAgICB7CisgICAgICBGSVhQX0RCTCAqdG1wID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPndvcmtCdWZmZXJDb3JlMS0+bWRjdE91dFRlbXA7CisKKyAgICAgIG5TYW1wbGVzID0gaW1kY3RfYmxvY2soCisgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LAorICAgICAgICAgICAgICB0bXAsCisgICAgICAgICAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCksCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgICAgblNwZWMsCisgICAgICAgICAgICAgIGZyYW1lTGVuLAorICAgICAgICAgICAgICB0bCwKKyAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoZmwsIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCisgICAgICAgICAgICAgIGZsLAorICAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZShmciwgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgICAgZnIsCisgICAgICAgICAgICAgIChGSVhQX0RCTCkwICk7CisKKyAgICAgIGZvciAoaT0wOyBpPGZyYW1lTGVuOyBpKyspIHsKKyAgICAgICAgb3V0U2FtcGxlc1tpKnN0cmlkZV0gPSBJTURDVF9TQ0FMRSh0bXBbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEZES19BU1NFUlQoblNhbXBsZXMgPT0gZnJhbWVMZW4pOworCit9CisKKyNpbmNsdWRlICJsZGZpbHRiYW5rLmgiCit2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheSggQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgc3RyaWRlICkKK3sKKyAgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkayAoCisgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGVbMF0sCisgICAgICAgICAgb3V0U2FtcGxlcywKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5wT3ZlcmxhcEJ1ZmZlciwKKyAgICAgICAgICBzdHJpZGUsCisgICAgICAgICAgZnJhbWVMZW4KKyAgICAgICAgICApOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvYmxvY2suaCBiL2FhYy9saWJBQUNkZWMvc3JjL2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzOTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2Jsb2NrLmgKQEAgLTAsMCArMSwzMjIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IGxvbmcvc2hvcnQtYmxvY2sgZGVjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJMT0NLX0gKKyNkZWZpbmUgQkxPQ0tfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKy8qIFBOUyAob2YgYmxvY2spICovCit2b2lkIENQbnNfUmVhZCAoQ1Buc0RhdGEgKnBQbnNEYXRhLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwKKyAgICAgICAgICAgICAgICBTSE9SVCAqcFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgIFVDSEFSIGdsb2JhbF9nYWluLAorICAgICAgICAgICAgICAgIGludCBiYW5kLAorICAgICAgICAgICAgICAgIGludCBncm91cCk7CisKKwordm9pZCBDUG5zX0FwcGx5IChjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgICAgKnBTcGVjU2NhbGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICAgICpwU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwpOworCisKKworLyogVE5TIChvZiBibG9jaykgKi8KKy8qIQorICBcYnJpZWYgUmVhZCB0bnMgZGF0YS1wcmVzZW50IGZsYWcgZnJvbSBiaXRzdHJlYW0KKworICBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIGRhdGEtcHJlc2VudCBmbGFnIGZvciB0bnMgZnJvbQorICB0aGUgYml0c3RyZWFtLgorCisgIFxyZXR1cm4gIG5vbmUKKyovCit2b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSk7CisKK3ZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTAsCisgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTEsCisgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgY29uc3QgaW50IGZDb21tb25XaW5kb3cKKyAgICAgICAgKTsKKworQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CisKK3ZvaWQgQ1Ruc19BcHBseSAoIENUbnNEYXRhICpSRVNUUklDVCBwVG5zRGF0YSwgLyohPCBwb2ludGVyIHRvIGFhYyBkZWNvZGVyIGluZm8gKi8KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgpOworCisvKiBCbG9jayAqLworCitMT05HIENCbG9ja19HZXRFc2NhcGUoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIGNvbnN0IExPTkcgcSk7CisKKy8qKgorICogXGJyaWVmIFJlYWQgc2NhbGUgZmFjdG9yIGRhdGEuIFNlZSBjaGFwdGVyIDQuNi4yLjMuMiBvZiBJU08vSUVDIDE0NDk2LTMuCisgKiAgICAgICAgVGhlIFNGX09GRlNFVCA9IDEwMCB2YWx1ZSByZWZlcmVuY2VkIGluIGNoYXB0ZXIgNC42LjIuMy4zIGlzIGFscmVhZHkgc3Vic3RyYWN0ZWQKKyAqICAgICAgICBmcm9tIHRoZSBzY2FsZSBmYWN0b3IgdmFsdWVzLiBBbHNvIGluY2x1ZGVzIFBOUyBkYXRhIHJlYWRpbmcuCisgKiBccGFyYW0gYnMgYml0IHN0cmVhbSBoYW5kbGUgZGF0YSBzb3VyY2UKKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvIHdlcmUgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGZsYWdzIHRoZSBkZWNvZGVyIGZsYWdzLgorICovCitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNjYWxlRmFjdG9yRGF0YSgKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZCBIdWZmbWFuIGVuY29kZWQgc3BlY3RyYWwgZGF0YS4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvLgorICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHNhbXBsaW5nIHJhdGUgaW5mbyAoc2ZiIG9mZnNldHMpLgorICogXHBhcmFtIGZsYWdzIHN5bnRheCBmbGFncy4KKyAqLworQUFDX0RFQ09ERVJfRVJST1IgIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MpOworCisKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2VjdGlvbkRhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncyk7CisKKy8qKgorICogXGJyaWVmIGZpbmQgYSBjb21tb24gZXhwb25lbnQgKHNoaWZ0IGZhY3RvcikgZm9yIGFsbCBzZmIgaW4gZWFjaCBTcGVjdHJhbCB3aW5kb3csIGFuZCBzdG9yZSB0aGVtIGludG8KKyAqICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOjpzcGVjU2NhbGUuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgaW5mby4KKyAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyBzYW1wbGluZyByYXRlIGluZm8gKHNmYiBvZmZzZXRzKS4KKyAqLwordm9pZCBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOworCisvKioKKyAqIFxicmllZiBBcHBseSBUTlMgYW5kIFBOUyB0b29scy4KKyAqLwordm9pZCBBcHBseVRvb2xzICggQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwgKTsKKworLyoqCisgKiBcYnJpZWYgVHJhbnNmb3JtIE1EQ1Qgc3BlY3RyYWwgZGF0YSBpbnRvIHRpbWUgZG9tYWluCisgKi8KK3ZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZShDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSBvdXRTYW1wbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgZnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIxKTsKKworLyoqCisgKiBcYnJpZWYgVHJhbnNmb3JtIGRvdWJsZSBsYXBwZWQgTURDVCAoQUFDLUVMRCkgc3BlY3RyYWwgZGF0YSBpbnRvIHRpbWUgZG9tYWluLgorICovCit2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheShDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgZnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHN0cmlkZSk7CisKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgMl4obHNiLzQpICogdmFsdWVeKDQvMykKKyAqIFxwYXJhbSBwVmFsdWUgcG9pbnRlciB0byBxdWFudGl6ZWQgdmFsdWUuIFRoZSBpbnZlcnNlIHF1YW50aXplZCByZXN1bHQgaXMgc3RvcmVkIGJhY2sgaGVyZS4KKyAqIFxwYXJhbSBsc2IgMiBMU0JzIG9mIHRoZSBzY2FsZSBmYWN0b3IgKHNjYWxlRmFjdG9yICUgNCkgYXBwbGllZCBhcyBwb3dlciAyIGZhY3RvciB0byB0aGUKKyAqICAgICAgICByZXN1bHRpbmcgaW52ZXJzZSBxdWFudGl6ZWQgdmFsdWUuCisgKiBccmV0dXJuIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IChtYW50aXNzYSkgc3RvcmVkIGludG8gKnBWYWx1ZS4KKyAqLworRkRLX0lOTElORQoraW50IEV2YWx1YXRlUG93ZXI0MyAoIEZJWFBfREJMICpwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgVUlOVCBsc2IgKQoreworICBGSVhQX0RCTCB2YWx1ZTsKKyAgVUlOVCBmcmVlQml0czsKKyAgVUlOVCBleHBvbmVudDsKKworICB2YWx1ZSA9ICpwVmFsdWU7CisgIGZyZWVCaXRzID0gZk5vcm16ICh2YWx1ZSkgOworICBleHBvbmVudCA9IERGUkFDVF9CSVRTIC0gZnJlZUJpdHMgOworICBGREtfQVNTRVJUIChleHBvbmVudCA8IDE0KTsKKworICBVSU5UIHggPSAoKChpbnQpdmFsdWUgPDwgZnJlZUJpdHMpID4+IDE5KSA7CisgIFVJTlQgdGFibGVJbmRleCA9ICh4ICYgMHgwRkZGKSA+PiA0IDsKKyAgRklYUF9EQkwgaW52UVZhbCA7CisKKyAgeCA9IHggJiAweDBGOworCisgIFVJTlQgcjA9KExPTkcpSW52ZXJzZVF1YW50VGFibGUgW3RhYmxlSW5kZXgrMF07CisgIFVJTlQgcjE9KExPTkcpSW52ZXJzZVF1YW50VGFibGUgW3RhYmxlSW5kZXgrMV07CisgIFVTSE9SVCBueD0xNi14OworICBVSU5UIHRlbXA9KHIwKSpueCsocjEpKng7CisgIGludlFWYWwgPSAoRklYUF9EQkwpdGVtcDsKKworICBGREtfQVNTRVJUKGxzYiA8IDQpOworICAqcFZhbHVlID0gZk11bHREaXYyIChpbnZRVmFsLCBNYW50aXNzYVRhYmxlIFtsc2JdW2V4cG9uZW50XSkgOworCisgIC8qICsgMSBjb21wZW5zYXRlcyBmTXVsdERpdjIoKS4gKi8KKyAgcmV0dXJuIEV4cG9uZW50VGFibGUgW2xzYl1bZXhwb25lbnRdICsgMTsKK30KKworLyoqCisgKiBcYnJpZWYgZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzaGlmdCBzY2FsZSBmb3IgdGhlIGdpdmVuIHF1YW50aXplZCB2YWx1ZSBhbmQgc2NhbGUgKGZhY3RvciAlIDQpIHZhbHVlLgorICovCitGREtfSU5MSU5FIGludCBHZXRTY2FsZUZyb21WYWx1ZSAoRklYUF9EQkwgdmFsdWUsIHVuc2lnbmVkIGludCBsc2IpCit7CisgIGlmICh2YWx1ZSE9KEZJWFBfREJMKTApCisgIHsKKyAgICBpbnQgc2NhbGUgPSBFdmFsdWF0ZVBvd2VyNDMgKCZ2YWx1ZSwgbHNiKSA7CisgICAgcmV0dXJuIENudExlYWRpbmdaZXJvcyAodmFsdWUpIC0gc2NhbGUgLSAyIDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7IC8qIFJldHVybiB6ZXJvLCBiZWNhdXNlIGl0cyB1c2VsZXNzIHRvIHNjYWxlIGEgemVybyB2YWx1ZSwgc2F2ZXMgd29ya2xvYWQgYW5kIGF2b2lkcyBzY2FsaW5nIG92ZXJzaGlmdHMuICovCit9CisKKworLy8jaWZkZWYgQUFDREVDX0hVRkZNQU5ERUNPREVSX0VOQUJMRQorCisvKiEKKyAgXGJyaWVmIFJlYWQgaHVmZm1hbiBjb2Rld29yZAorCisgIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgaHVmZm1hbiBjb2Rld29yZCBmcm9tIHRoZSBiaXRzdHJlYW0gYW5kCisgIHJldHVybnMgdGhlIGluZGV4IHZhbHVlLgorCisgIFxyZXR1cm4gIGluZGV4IHZhbHVlCisqLworaW5saW5lIGludCBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IgKSAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gY29kZWJvb2sgZGVzY3JpcHRpb24gKi8KK3sKKyAgVUlOVCB2YWw7CisgIFVJTlQgaW5kZXggPSAwOworICBjb25zdCBVU0hPUlQgKCpDb2RlQm9vaykgW0h1ZmZtYW5FbnRyaWVzXSA9IGhjYi0+Q29kZUJvb2s7CisKKyAgd2hpbGUgKDEpCisgIHsKKyAgICB2YWwgPSBDb2RlQm9va1tpbmRleF1bRkRLcmVhZEJpdHMoYnMsSHVmZm1hbkJpdHMpXTsgLyogRXhwZW5zaXZlIG1lbW9yeSBhY2Nlc3MgKi8KKworICAgIGlmICgodmFsICYgMSkgPT0gMCkKKyAgICB7CisgICAgICBpbmRleCA9IHZhbD4+MjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHZhbCAmIDIpCisgICAgICB7CisgICAgICAgIEZES3B1c2hCYWNrQ2FjaGUoYnMsMSk7CisgICAgICB9CisKKyAgICAgIHZhbCA+Pj0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiB2YWw7Cit9CisKKy8vI2VuZGlmIC8qIEFBQ0RFQ19IVUZGTUFOREVDT0RFUl9FTkFCTEUgKi8KKworI2VuZGlmIC8qICNpZm5kZWYgQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9jaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc1MDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5jcHAKQEAgLTAsMCArMSw0NTEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJhYWNkZWNvZGVyLmgiCisjaW5jbHVkZSAiYmxvY2suaCIKKyNpbmNsdWRlICJhYWNkZWNfdG5zLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKworI2luY2x1ZGUgImNvbmNlYWwuaCIKKworI2luY2x1ZGUgInJ2bGMuaCIKKworI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKworCitzdGF0aWMKK3ZvaWQgTWFwTWlkU2lkZU1hc2tUb1Buc0NvcnJlbGF0aW9uIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdKQoreworICBpbnQgZ3JvdXA7CisKKyAgZm9yIChncm91cCA9IDAgOyBncm91cCA8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgVUNIQVIgZ3JvdXBNYXNrID0gMSA8PCBncm91cDsKKworICAgIGZvciAoVUNIQVIgYmFuZCA9IDAgOyBiYW5kIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5NYXhTZkJhbmRzOyBiYW5kKyspIHsKKyAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgeyAvKiBjaGFubmVscyBhcmUgY29ycmVsYXRlZCAqLworICAgICAgICBDUG5zX1NldENvcnJlbGF0aW9uKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCwgMCk7CisKKyAgICAgICAgaWYgKENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCkgJiYKKyAgICAgICAgICAgIENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCkpCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5Nc1VzZWRbYmFuZF0gXj0gZ3JvdXBNYXNrOyAvKiBjbGVhciB0aGUgZ3JvdXBNYXNrLWJpdCAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiEKKyAgXGJyaWVmIERlY29kZSBjaGFubmVsIHBhaXIgZWxlbWVudAorCisgIFRoZSBmdW5jdGlvbiBkZWNvZGVzIGEgY2hhbm5lbCBwYWlyIGVsZW1lbnQuCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3ZvaWQgQ0NoYW5uZWxFbGVtZW50X0RlY29kZSggQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwgLyohPCBwb2ludGVyIHRvIGFhYyBkZWNvZGVyIGNoYW5uZWwgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbF9jaGFubmVscykKK3sKKyAgaW50IGNoLCBtYXliZV9qc3RlcmVvID0gMDsKKworICBtYXliZV9qc3RlcmVvID0gKGVsX2NoYW5uZWxzID4gMSk7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAoIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfSU1EQ1QKKyAgICAgIHx8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfRUxERkIgKQorICAgIHsKKyAgICAgIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgICB9CisgIH0KKworCisKKyAgaWYgKG1heWJlX2pzdGVyZW8pIHsKKyAgICAvKiBhcHBseSBtcyAqLworICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSB7CisgICAgICBpbnQgbWF4U2ZCYW5kc0wgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pOworICAgICAgaW50IG1heFNmQmFuZHNSID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKTsKKyAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLlBuc0FjdGl2ZSB8fCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5kYXRhLmFhYy5QbnNEYXRhLlBuc0FjdGl2ZSkgeworICAgICAgICBNYXBNaWRTaWRlTWFza1RvUG5zQ29ycmVsYXRpb24ocEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisgICAgICB9CisKKyAgICAgIENKb2ludFN0ZXJlb19BcHBseU1TKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dHcm91cExlbmd0aFRhYmxlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZkJhbmRzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmQmFuZHNSKTsKKyAgICB9CisKKyAgICAvKiBhcHBseSBpbnRlbnNpdHkgc3RlcmVvICovIC8qIG1vZGlmaWVzIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXS0+YVNwZWNTZmIgKi8KKyAgICBDSm9pbnRTdGVyZW9fQXBwbHlJUyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dHcm91cExlbmd0aFRhYmxlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA/IDEgOiAwKTsKKworICB9CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspCisgIHsKKyAgICB7CisgICAgICAvKiB3cml0ZSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+c3BlY1NjYWxlICovCisgICAgICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKworICAgICAgQXBwbHlUb29scyAocEFhY0RlY29kZXJDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8sIGZsYWdzLCBjaCk7CisgICAgfQorCisgIH0KKworICBDUnZsY19FbGVtZW50Q2hlY2soCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgIGZsYWdzLAorICAgICAgICAgIGVsX2NoYW5uZWxzCisgICAgICAgICAgKTsKK30KKwordm9pZCBDQ2hhbm5lbF9Db2RlYm9va1RhYmxlSW5pdChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQoreworICBpbnQgYiwgdywgbWF4QmFuZHMsIG1heFdpbmRvd3M7CisgIGludCBtYXhTZmIgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBVQ0hBUiAqcENvZGVCb29rID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsKKworICBpZiAoIElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSApIHsKKyAgICBtYXhCYW5kcyA9IDY0OworICAgIG1heFdpbmRvd3MgPSAxOworICB9IGVsc2UgeworICAgIG1heEJhbmRzID0gMTY7CisgICAgbWF4V2luZG93cyA9IDg7CisgIH0KKworICBmb3IgKHcgPSAwOyB3PG1heFdpbmRvd3M7IHcrKykgeworICAgIGZvciAoYiA9IDA7IGIgPCBtYXhTZmI7IGIrKykgeworICAgICAgcENvZGVCb29rW2JdID0gRVNDQk9PSzsKKyAgICB9CisgICAgZm9yICg7IGI8bWF4QmFuZHM7IGIrKykgeworICAgICAgcENvZGVCb29rW2JdID0gWkVST19IQ0I7CisgICAgfQorICAgIHBDb2RlQm9vayArPSBtYXhCYW5kczsKKyAgfQorfQorCisKKy8qCisgKiBBcmJpdHJhcnkgb3JkZXIgYml0c3RyZWFtIHBhcnNlcgorICovCisKK0FBQ19ERUNPREVSX0VSUk9SIENDaGFubmVsRWxlbWVudF9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmcmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1iZXJPZkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIHBUcERlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19ERUNfT0s7CisgIGNvbnN0IGVsZW1lbnRfbGlzdF90ICpsaXN0OworICBpbnQgaSwgY2gsIGRlY2lzaW9uX2JpdDsKKyAgaW50IGNyY1JlZzEgPSAtMSwgY3JjUmVnMiA9IC0xOworCisgIEZES19BU1NFUlQoIChudW1iZXJPZkNoYW5uZWxzID09IDEpIHx8IChudW1iZXJPZkNoYW5uZWxzID09IDIpICk7CisKKyAgLyogR2V0IGNoYW5uZWwgZWxlbWVudCBzZXF1ZW5jZSB0YWJsZSAqLworICBsaXN0ID0gZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoYW90LCBlcENvbmZpZywgbnVtYmVyT2ZDaGFubmVscywgMCk7CisgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIENUbnNfUmVzZXQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5UbnNEYXRhKTsKKyAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgeworICAgIENUbnNfUmVzZXQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5UbnNEYXRhKTsKKyAgfQorCisgIGlmIChmbGFncyAmIChBQ19FTER8QUNfU0NBTEFCTEUpKSB7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDE7CisgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3c7CisgICAgfQorICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OworICAgIH0KKyAgfQorCisgIC8qIEl0ZXJhdGUgdGhyb3VnaCBzZXF1ZW5jZSB0YWJsZSAqLworICBpID0gMDsKKyAgY2ggPSAwOworICBkZWNpc2lvbl9iaXQgPSAwOworICBkbyB7CisgICAgc3dpdGNoIChsaXN0LT5pZFtpXSkgeworICAgIGNhc2UgZWxlbWVudF9pbnN0YW5jZV90YWc6CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5FbGVtZW50SW5zdGFuY2VUYWcgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvbW1vbl93aW5kb3c6CisgICAgICBkZWNpc2lvbl9iaXQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSB7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBpY3NfaW5mbzoKKyAgICAgIC8qIFJlYWQgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KKyAgICAgIGVycm9yID0gSWNzUmVhZCggaEJzLAorICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICk7CisKKyAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIgJiYgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvID0gcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIGx0cF9kYXRhX3ByZXNlbnQ6CisgICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSAhPSAwKSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIG1zOgorICAgICAgaWYgKCBDSm9pbnRTdGVyZW9fUmVhZCgKKyAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLCAKKyAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgICAgR2V0U2NhbGVNYXhGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPmljc0luZm8pLAorICAgICAgICAgICAgICBmbGFncykgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgZ2xvYmFsX2dhaW46CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGhCcyw4KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzZWN0aW9uX2RhdGE6CisgICAgICBlcnJvciA9IENCbG9ja19SZWFkU2VjdGlvbkRhdGEoIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyApOworICAgICAgYnJlYWs7CisKKworICAgIGNhc2Ugc2NhbGVfZmFjdG9yX2RhdGE6CisgICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7CisgICAgICAgIC8qIHJlYWQgUlZMQyBkYXRhIGZyb20gYml0c3RyZWFtIChlcnJvciBzZW5zLiBjYXQuIDEpICovIAorICAgICAgICBDUnZsY19SZWFkKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBoQnMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBlcnJvciA9IENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBoQnMsIGZsYWdzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBwdWxzZToKKyAgICAgIGlmICggQ1B1bHNlRGF0YV9SZWFkKCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5QdWxzZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZywgLyogcHVsc2UgZGF0YSBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgcHJlc2VudCBpbiBsb25nIGJsb2NrcyEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICApICE9IDAgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0bnNfZGF0YV9wcmVzZW50OgorICAgICAgQ1Ruc19SZWFkRGF0YVByZXNlbnRGbGFnKGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+VG5zRGF0YSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRuc19kYXRhOgorICAgICAgLyogdG5zX2RhdGFfcHJlc2VudCBpcyBjaGVja2VkIGluc2lkZSBDVG5zX1JlYWQoKS4gKi8KKyAgICAgIGVycm9yID0gQ1Ruc19SZWFkKGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+VG5zRGF0YSwgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLCBmbGFncyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGE6CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQ6CisgICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSkgeworICAgICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfR0FJTl9DT05UUk9MX0RBVEE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXNjMl9ydmxjOgorICAgICAgaWYgKGZsYWdzICYgQUNfRVJfUlZMQykgeworICAgICAgICBDUnZsY19EZWNvZGUoCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgaEJzCisgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlc2MxX2hjcjoKKyAgICAgIGlmIChmbGFncyAmIEFDX0VSX0hDUikgeworICAgICAgICBDSGNyX1JlYWQoaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSApOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNwZWN0cmFsX2RhdGE6CisgICAgICBlcnJvciA9IENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKTsKKyAgICAgIGlmIChmbGFncyAmIEFDX0VMRCkgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfRUxERkI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU1EQ1Q7CisgICAgICB9CisgICAgICBicmVhazsKKworCisgICAgICAvKiBDUkMgaGFuZGxpbmcgKi8KKyAgICBjYXNlIGFkdHNjcmNfc3RhcnRfcmVnMToKKyAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcERlYywgMTkyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcyOgorICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7CisgICAgICAgIGNyY1JlZzIgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAxMjgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcxOgorICAgIGNhc2UgZHJtY3JjX2VuZF9yZWc6CisgICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKKyAgICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcyOgorICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7CisgICAgICAgIHRyYW5zcG9ydERlY19DcmNFbmRSZWcocFRwRGVjLCBjcmNSZWcyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgZHJtY3JjX3N0YXJ0X3JlZzoKKyAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcERlYywgMCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogTm9uIGRhdGEgY2FzZXMgKi8KKyAgICBjYXNlIG5leHRfY2hhbm5lbDoKKyAgICAgIGNoID0gKGNoICsgMSkgJSBudW1iZXJPZkNoYW5uZWxzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsaW5rX3NlcXVlbmNlOgorICAgICAgbGlzdCA9IGxpc3QtPm5leHRbZGVjaXNpb25fYml0XTsKKyAgICAgIGk9LTE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpKys7CisKKyAgfSB3aGlsZSAobGlzdC0+aWRbaV0gIT0gZW5kX29mX3NlcXVlbmNlKTsKKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDY5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9jaGFubmVsLmgKQEAgLTAsMCArMSwxNDggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDSEFOTkVMX0gKKyNkZWZpbmUgQ0hBTk5FTF9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKKyNpbmNsdWRlICJ0cGRlY19saWIuaCIKKworLyoqCisgKiBcYnJpZWYgSW5pdCBjb2RlQm9vayBTRkIgaW5kaWNlcyAoc2VjdGlvbiBkYXRhKSB3aXRoIEhDQl9FU0MuIFVzZWZ1bCBmb3IgYml0c3RyZWFtcworICogd2hpY2ggZG8gbm90IGhhdmUgYW55IHNlY3Rpb24gZGF0YSwgYnV0IHN0aWxsIFNGQidzIChzY2FsZSBmYWN0b3IgYmFuZHMpLiBUaGlzIGhhcworICogdGhlIGVmZmVjdCB0aGF0IHVwdG8gdGhlIGFtb3VudCBvZiB0cmFuc21pdHRlZCBTRkIgYXJlIHRyZWF0ZWQgYXMgbm9uLXplcm8uCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgYSB2YWxpZCBpY3NJbmZvIHN0cnVjdC4KKyAqLwordm9pZCBDQ2hhbm5lbF9Db2RlYm9va1RhYmxlSW5pdChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKworLyoqCisgKiBcYnJpZWYgZGVjb2RlIGEgY2hhbm5lbCBlbGVtZW50LiBUbyBiZSBjYWxsZWQgYWZ0ZXIgQ0NoYW5uZWxFbGVtZW50X1JlYWQoKQorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gcG9pbnRlciB0byBjaGFubmVsIGRhdGEgc3RydWN0LiBEZXBlbmRpbmcgb24gZWxfY2hhbm5lbHMgZWl0aGVyIG9uZSBvciB0d28uCisgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gcG9pbnRlciB0byBzYW1wbGUgcmF0ZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBlbF9jaGFubmVscyBhbW91bnQgb2YgY2hhbm5lbHMgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZGVjb2RlZC4KKyAqIFxwYXJhbSBvdXRwdXQgcG9pbnRlciB0byB0aW1lIGRvbWFpbiBvdXRwdXQgYnVmZmVyIChBQ0VMUCkKKyAqIFxwYXJhbSBzdHJpZGUgZmFjdG9yIGZvciBhY2Nlc3Npbmcgb3V0cHV0CisgKi8KK3ZvaWQgQ0NoYW5uZWxFbGVtZW50X0RlY29kZSAoIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVsX2NoYW5uZWxzICk7CisKKworLyoqCisgKiBcYnJpZWYgUmVhZCBjaGFubmVsIGVsZW1lbnQgb2YgZ2l2ZW4gdHlwZSBmcm9tIGJpdHN0cmVhbS4KKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSB0byBhY2Nlc3MgYml0c3RyZWFtIGRhdGEuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBwb2ludGVyIGFycmF5IHRvIHN0b3JlIGNoYW5uZWwgaW5mb3JtYXRpb24uCisgKiBccGFyYW0gYW90IEF1ZGlvIE9iamVjdCBUeXBlCisgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIHRhYmxlLgorICogXHBhcmFtIGZsYWdzIHBhcnNlciBndWlkYW5jZSBmbGFncworICogXHBhcmFtIG51bWJlck9mQ2hhbm5lbHMgYW1vdW4gb2YgY2hhbm5lbHMgY29udGFpbmVkIGluIHRoZSBvYmplY3QgdG8gYmUgcGFyc2VkLgorICogXHBhcmFtIGVwQ29uZmlnIHRoZSBjdXJyZW50IGVwQ29uZmlnIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIEF1ZGlvIFNwZWNpZmljIENvbmZpZy4KKyAqIFxwYXJhbSBwVHAgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlIHJlcXVpcmVkIGZvciBBRFRTIENSQyBjaGVja2luZy4KKyAqIC4uLgorICogXHJldHVybiBhbiBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciBjb2RlLgorICovCitBQUNfREVDT0RFUl9FUlJPUiBDQ2hhbm5lbEVsZW1lbnRfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZnJhbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtYmVyT2ZDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIGVwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBwVHBEZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIENIQU5ORUxfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDU4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5jcHAKQEAgLTAsMCArMSwyNzYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IGluZGl2aWR1YWwgY2hhbm5lbCBzdHJlYW0gaW5mbworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKyNpbmNsdWRlICJhYWNfcmFtLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisKK0FBQ19ERUNPREVSX0VSUk9SIEljc1JlYWRNYXhTZmIgKAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbworICAgICAgICApCit7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKyAgaW50IG5iaXRzOworCisgIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpIHsKKyAgICBuYml0cyA9IDY7CisgICAgcEljc0luZm8tPlRvdGFsU2ZCYW5kcyA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgfSBlbHNlIHsKKyAgICBuYml0cyA9IDQ7CisgICAgcEljc0luZm8tPlRvdGFsU2ZCYW5kcyA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgIH0KKyAgcEljc0luZm8tPk1heFNmQmFuZHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLCBuYml0cyk7CisKKyAgaWYgKHBJY3NJbmZvLT5NYXhTZkJhbmRzID4gcEljc0luZm8tPlRvdGFsU2ZCYW5kcyl7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKKworQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvKiBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKK3sKKyAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOworCisgIHBJY3NJbmZvLT5WYWxpZCA9IDA7CisKKyAgaWYgKGZsYWdzICYgQUNfRUxEKXsKKyAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBPbmx5TG9uZ1NlcXVlbmNlOworICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDA7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCAhKGZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwKSkgKSB7CisgICAgICBGREtyZWFkQml0cyhicywxKTsKKyAgICB9CisgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICAgIGlmIChmbGFncyAmIEFDX0xEKSB7CisgICAgICBpZiAocEljc0luZm8tPldpbmRvd1NoYXBlKSB7CisgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDI7IC8qIHNlbGVjdCBsb3cgb3ZlcmxhcCBpbnN0ZWFkIG9mIEtCRCAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNhbml0eSBjaGVjayAqLworICBpZiAoIChmbGFncyAmIChBQ19FTER8QUNfTEQpKSAmJiBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgIT0gT25seUxvbmdTZXF1ZW5jZSkgeworICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IE9ubHlMb25nU2VxdWVuY2U7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIEVycm9yU3RhdHVzID0gSWNzUmVhZE1heFNmYihicywgcEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoSXNMb25nQmxvY2socEljc0luZm8pKQorICB7CisgICAgaWYgKCAhKGZsYWdzICYgKEFDX0VMRHxBQ19TQ0FMQUJMRXxBQ19CU0FDfEFDX1VTQUN8QUNfUlNWRDUwKSkgKSAvKiBJZiBub3QgRUxEIG5vciBTY2FsYWJsZSBub3IgQlNBQyBub3IgVVNBQyBzeW50YXggdGhlbiAuLi4gKi8KKyAgICB7CisgICAgICBpZiAoKFVDSEFSKUZES3JlYWRCaXRzKGJzLDEpICE9IDAgKSAvKiBVQ0hBUiBQcmVkaWN0b3JEYXRhUHJlc2VudCAqLworICAgICAgeworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5TVVBQT1JURURfUFJFRElDVElPTjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMgPSAxOworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFswXSA9IDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgSU5UIGk7CisgICAgVUlOVCBtYXNrOworCisgICAgcEljc0luZm8tPlNjYWxlRmFjdG9yR3JvdXBpbmcgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDcpOworCisgICAgcEljc0luZm8tPldpbmRvd0dyb3VwcyA9IDAgOworCisgICAgZm9yIChpPTA7IGkgPCAoOC0xKTsgaSsrKQorICAgIHsKKyAgICAgIG1hc2sgPSAxIDw8ICg2IC0gaSk7CisgICAgICBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbaV0gPSAxOworCisgICAgICBpZiAocEljc0luZm8tPlNjYWxlRmFjdG9yR3JvdXBpbmcgJiBtYXNrKQorICAgICAgeworICAgICAgICBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbcEljc0luZm8tPldpbmRvd0dyb3Vwc10rKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwcysrOworICAgICAgfQorICAgIH0KKworICAgIC8qIGxvb3AgcnVucyB0byBpIDwgNyBvbmx5ICovCisgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzgtMV0gPSAxOworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMrKzsKKyAgfQorCisKK2JhaWw6CisgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQorICAgIHBJY3NJbmZvLT5WYWxpZCA9IDE7CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKKy8qCisgIGludGVybGVhdmUgY29kZWJvb2tzIHRoZSBmb2xsb3dpbmcgd2F5CisKKyAgICA5ICg4NHcpIHwgIDEgKDUxdykKKyAgIDEwICg4MncpIHwgIDIgKDM5dykKKyAgU0NMICg2NXcpIHwgIDQgKDM4dykKKyAgICAzICgzOXcpIHwgIDUgKDQxdykKKyAgICAgICAgICAgIHwgIDYgKDQwdykKKyAgICAgICAgICAgIHwgIDcgKDMxdykKKyAgICAgICAgICAgIHwgIDggKDMxdykKKyAgICAgKDI3MHcpICAgICAoMjcxdykKKyovCisKKworLyoKKyAgVGFibGUgZW50cmllcyBhcmUgc29ydGVkIGFzIGZvbGxvd2luZzoKKyAgfCBudW1fc3diX2xvbmdfd2luZG93IHwgc2ZiYW5kc19sb25nIHwgbnVtX3N3Yl9zaG9ydF93aW5kb3cgfCBzZmJhbmRzX3Nob3J0IHwKKyovCitBQUNfREVDT0RFUl9FUlJPUiBnZXRTYW1wbGluZ1JhdGVJbmZvKAorICAgICAgICBTYW1wbGluZ1JhdGVJbmZvICp0LAorICAgICAgICBVSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgVUlOVCBzYW1wbGluZ1JhdGVJbmRleCwKKyAgICAgICAgVUlOVCBzYW1wbGluZ1JhdGUKKyAgICAgICAgKQoreworICBpbnQgaW5kZXggPSAwOworCisKKyAgdC0+c2FtcGxpbmdSYXRlSW5kZXggPSBzYW1wbGluZ1JhdGVJbmRleDsKKyAgdC0+c2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworCisgIHN3aXRjaCAoc2FtcGxlc1BlckZyYW1lKSB7CisgIGNhc2UgMTAyNDoKKyAgICBpbmRleCA9IDA7CisgICAgYnJlYWs7CisgIGNhc2UgOTYwOgorICAgIGluZGV4ID0gMTsKKyAgICBicmVhazsKKyAgY2FzZSA1MTI6CisgICAgaW5kZXggPSAzOworICAgIGJyZWFrOworICBjYXNlIDQ4MDoKKyAgICBpbmRleCA9IDQ7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKworICB0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmcgPSBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5zZmJPZmZzZXRMb25nOworICB0LT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0ID0gc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0uc2ZiT2Zmc2V0U2hvcnQ7CisgIHQtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nID0gc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0ubnVtYmVyT2ZTZmJMb25nOworICB0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQgPSBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5udW1iZXJPZlNmYlNob3J0OworCisgIGlmICh0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmcgPT0gTlVMTCB8fCB0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9PSAwKSB7CisgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisKKyAgRkRLX0FTU0VSVCh0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmdbdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmddID09IHNhbXBsZXNQZXJGcmFtZSk7CisgIEZES19BU1NFUlQodC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9PSBOVUxMIHx8IHQtPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnRbdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0XSo4ID09IHNhbXBsZXNQZXJGcmFtZSk7CisKKyAgcmV0dXJuIEFBQ19ERUNfT0s7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDkyYWIzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uaApAQCAtMCwwICsxLDQ1MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogaW5kaXZpZHVhbCBjaGFubmVsIHN0cmVhbSBpbmZvCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDSEFOTkVMSU5GT19ICisjZGVmaW5lIENIQU5ORUxJTkZPX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgImFhY19yb20uaCIKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJvdmVybGFwYWRkLmgiCisKKyNpbmNsdWRlICJtZGN0LmgiCisjaW5jbHVkZSAic3RlcmVvLmgiCisjaW5jbHVkZSAicHVsc2VkYXRhLmgiCisjaW5jbHVkZSAiYWFjZGVjX3Rucy5oIgorCisjaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgorCisjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgorI2luY2x1ZGUgInJ2bGNfaW5mby5oIgorCisKKyNpbmNsdWRlICJjb25jZWFsX3R5cGVzLmgiCisKKyAjaW5jbHVkZSAiYWFjZGVjX2RyY190eXBlcy5oIgorCisvKiBPdXRwdXQgcmVuZGVyaW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bSB7CisgIEFBQ0RFQ19SRU5ERVJfSU5WQUxJRCA9IDAsCisgIEFBQ0RFQ19SRU5ERVJfSU1EQ1QsCisgIEFBQ0RFQ19SRU5ERVJfRUxERkIsCisgIEFBQ0RFQ19SRU5ERVJfTFBELAorICBBQUNERUNfUkVOREVSX0lOVElNRENUCit9IEFBQ0RFQ19SRU5ERVJfTU9ERTsKKworZW51bSB7CisgIE1BWF9RVUFOVElaRURfVkFMVUUgPSA4MTkxCit9OworCitlbnVtCit7CisgIE9ubHlMb25nU2VxdWVuY2UgPSAwLAorICBMb25nU3RhcnRTZXF1ZW5jZSwKKyAgRWlnaHRTaG9ydFNlcXVlbmNlLAorICBMb25nU3RvcFNlcXVlbmNlCit9OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IFNIT1JUICpTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgIGNvbnN0IFNIT1JUICpTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICBVQ0hBUiBOdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgVUNIQVIgTnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICBVSU5UIHNhbXBsaW5nUmF0ZUluZGV4OworICBVSU5UIHNhbXBsaW5nUmF0ZTsKK30gU2FtcGxpbmdSYXRlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUNIQVIgQ29tbW9uV2luZG93OworICBVQ0hBUiBHbG9iYWxHYWluOworCit9IENSYXdEYXRhSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUNIQVIgV2luZG93R3JvdXBMZW5ndGhbOF07CisgIFVDSEFSIFdpbmRvd0dyb3VwczsKKyAgVUNIQVIgVmFsaWQ7CisKKyAgVUNIQVIgV2luZG93U2hhcGU7ICAgIC8qIDA6IHNpbmUgd2luZG93LCAxOiBLQkQsIDI6IGxvdyBvdmVybGFwICovCisgIFVDSEFSIFdpbmRvd1NlcXVlbmNlOyAvKiBTZWUgZW51bSBhYm92ZSwgMDogbG9uZywgMTogc3RhcnQsIDI6IHNob3J0LCAzOiBzdG9wICovCisgIFVDSEFSIE1heFNmQmFuZHM7CisgIFVDSEFSIFNjYWxlRmFjdG9yR3JvdXBpbmc7CisKKyAgVUNIQVIgVG90YWxTZkJhbmRzOworCit9IENJY3NJbmZvOworCisKK2VudW0KK3sKKyAgWkVST19IQ0IgPSAwLAorICBFU0NCT09LICA9IDExLAorICBOU1BFQ0JPT0tTID0gRVNDQk9PSyArIDEsCisgIEJPT0tTQ0wgICAgPSBOU1BFQ0JPT0tTLAorICBOT0lTRV9IQ0IgICAgICA9IDEzLAorICBJTlRFTlNJVFlfSENCMiA9IDE0LAorICBJTlRFTlNJVFlfSENCICA9IDE1LAorICBMQVNUX0hDQgorfTsKKworI2RlZmluZSBUTlNfU0NBTEUgIDMKKworLyoKKyAqIFRoaXMgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIG9uZSBmb3IgZXZlcnkgY2hhbm5lbCBhbmQgbXVzdCBiZSBwZXJzaXN0ZW50LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBGSVhQX0RCTCAqcE92ZXJsYXBCdWZmZXI7CisgIG1kY3RfdCBJTWRjdDsKKworCisKKyAgQ0RyY0NoYW5uZWxEYXRhICAgZHJjRGF0YTsKKyAgQ0NvbmNlYWxtZW50SW5mbyBjb25jZWFsbWVudEluZm87CisKK30gQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbzsKKworCisvKgorICogVGhpcyB1bmlvbiBtdXN0IGJlIGFsbG9jYXRlZCBmb3IgZXZlcnkgZWxlbWVudCAodXAgdG8gMiBjaGFubmVscykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAvKiBDb21tb24gYml0IHN0cmVhbSBkYXRhICovCisgIFNIT1JUIGFTY2FsZUZhY3RvclsoOCoxNildOyAgICAgICAgICAgLyogU3BlY3RyYWwgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaCBzZmIgaW4gZWFjaCB3aW5kb3cuICovCisgIFNIT1JUIGFTZmJTY2FsZVsoOCoxNildOyAgICAgICAgICAgICAgLyogY291bGQgYmUgZnJlZSBhZnRlciBBcHBseVRvb2xzKCkgKi8KKyAgVUNIQVIgYUNvZGVCb29rWyg4KjE2KV07ICAgICAgICAgICAgICAvKiBzZWN0aW9uIGRhdGE6IGNvZGVib29rIGZvciBlYWNoIHdpbmRvdyBhbmQgc2ZiLiAqLworICBDVG5zRGF0YSAgICAgICAgIFRuc0RhdGE7CisgIENSYXdEYXRhSW5mbyAgICAgUmF3RGF0YUluZm87CisKKyAgc2hvdWxkQmVVbmlvbiB7CisKKyAgICBzdHJ1Y3QgeworICAgICAgQ1B1bHNlRGF0YSBQdWxzZURhdGE7CisgICAgICBTSE9SVCBhTnVtTGluZUluU2VjNEhjcltNQVhfU0ZCX0hDUl07ICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvciBEcm0gc3ludGF4ICovCisgICAgICBVQ0hBUiBhQ29kZUJvb2tzNEhjcltNQVhfU0ZCX0hDUl07ICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvciBEcm0gc3ludGF4LiBTYW1lIGFzICJhQ29kZUJvb2siID8gKi8KKyAgICAgIFNIT1JUIGxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOworICAgICAgU0NIQVIgbGVuT2ZMb25nZXN0Q29kZXdvcmQ7CisgICAgICBTQ0hBUiBudW1iZXJTZWN0aW9uOworICAgICAgU0NIQVIgcnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LOworICAgICAgU0NIQVIgcnZsY0ludGVuc2l0eVVzZWQ7CisgICAgfSBhYWM7CisgIH0gc3BlY2lmaWNUbzsKKworfSBDQWFjRGVjb2RlckR5bmFtaWNEYXRhOworCit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBDQWFjRGVjb2RlckR5bmFtaWNEYXRhIHBBYWNEZWNvZGVyRHluYW1pY0RhdGFbMl07CisKKyAgLyogQ29tbW9uIHNpZ25hbCBkYXRhLCBjYW4gYmUgdXNlZCBvbmNlIHRoZSBiaXQgc3RyZWFtIGRhdGEgZnJvbSBhYm92ZSBpcyBub3QgdXNlZCBhbnltb3JlLiAqLworICBGSVhQX0RCTCBtZGN0T3V0VGVtcFsxMDI0XTsKKyAgRklYUF9EQkwgc2JyV29ya0J1ZmZlclsxMDI0KjJdOworCit9IENXb3JrQnVmZmVyQ29yZTE7CisKKy8qIENvbW1vbiBkYXRhIHJlZmVyZW5jZWQgYnkgYWxsIGNoYW5uZWxzICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgQ1dvcmtCdWZmZXJDb3JlMSAqd29ya0J1ZmZlckNvcmUxOworICBGSVhQX0RCTCogd29ya0J1ZmZlckNvcmUyOworCisgIENQbnNJbnRlckNoYW5uZWxEYXRhIHBuc0ludGVyQ2hhbm5lbERhdGE7CisgIElOVCBwbnNDdXJyZW50U2VlZDsKKyAgSU5UIHBuc1JhbmRvbVNlZWRbKDgqMTYpXTsKKworICBDSm9pbnRTdGVyZW9EYXRhIGpvaW50U3RlcmVvRGF0YTsgICAgICAgICAgICAgIC8qIE9uZSBmb3Igb25lIGVsZW1lbnQgKi8KKworICBzaG91bGRCZVVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgQ0VySGNySW5mbyBlckhjckluZm87CisgICAgICBDRXJSdmxjSW5mbyBlclJ2bGNJbmZvOworICAgICAgU0hPUlQgYVJ2bGNTY2ZFc2NbUlZMQ19NQVhfU0ZCXTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICBTSE9SVCBhUnZsY1NjZkZ3ZFtSVkxDX01BWF9TRkJdOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgICAgIFNIT1JUIGFSdmxjU2NmQndkW1JWTENfTUFYX1NGQl07ICAgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLworICAgIH0gYWFjOworCisgIH0gb3ZlcmxheTsKKworfSBDQWFjRGVjb2RlckNvbW1vbkRhdGE7CisKKworLyoKKyAqIFRoaXMgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIG9uZSBmb3IgZXZlcnkgY2hhbm5lbHMgb2YgZXZlcnkgZWxlbWVudCBhbmQgbXVzdCBiZSBwZXJzaXN0ZW50LgorICogQW1vbmcgaXRzIG1lbWJlcnMsIHRoZSBmb2xsb3dpbmcgbWVtb3J5IGFyZWFzIGNhbiBiZSBvdmVyd3JpdHRlbiB1bmRlciB0aGUgZ2l2ZW4gY29uZGl0aW9uczoKKyAqICAtIHBTcGVjdHJhbENvZWZmaWNpZW50IFRoZSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGltZSBzaWduYWwgcmVuZGVyaW5nLgorICogIC0gZGF0YSBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGltZSBzaWduYWwgcmVuZGVyaW5nLgorICogIC0gcER5bkRhdGEgbWVtb3J5IHBvaW50ZWQgdG8gY2FuIGJlIG92ZXJ3cml0dGVuIGFmdGVyIGVhY2ggQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGNhbGwuCisgKiAgLSBwQ29tRGF0YS0+b3ZlcmxheSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudDsgICAgICAgICAgICAgLyogU3BlY3RyYWwgY29lZmZpY2llbnRzIG9mIGVhY2ggd2luZG93ICovCisgIFNIT1JUIHNwZWNTY2FsZVs4XTsgICAgICAgICAgICAgICAgICAvKiBTY2FsZSBzaGlmdCB2YWx1ZXMgb2YgZWFjaCBzcGVjdHJ1bSB3aW5kb3cgKi8KKyAgQ0ljc0luZm8gaWNzSW5mbzsKKyAgSU5UIGdyYW51bGVMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIHNtYWxsZXN0IHNwZWN0cnVtIHBpZWNlICovCisgIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKKworICBBQUNERUNfUkVOREVSX01PREUgcmVuZGVyTW9kZTsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzaWduYWwgcmVuZGVyaW5nIG1vZGUgKi8KKworICBzaG91bGRCZVVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgQ1Buc0RhdGEgUG5zRGF0YTsgLyogTm90IHJlcXVpcmVkIGZvciBVU0FDICovCisgICAgfSBhYWM7CisKKyAgICBzdHJ1Y3QgeworICAgIH0gdXNhYzsKKyAgfSBkYXRhOworCisgIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgKnBEeW5EYXRhOyAvKiBEYXRhIHJlcXVpcmVkIGZvciBvbmUgZWxlbWVudCBhbmQgZGlzY2FyZGVkIGFmdGVyIGRlY29kaW5nICovCisgIENBYWNEZWNvZGVyQ29tbW9uRGF0YSAgKnBDb21EYXRhOyAvKiBEYXRhIHJlcXVpcmVkIGZvciBvbmUgY2hhbm5lbCBhdCBhIHRpbWUgZHVyaW5nIGRlY29kZSAqLworCit9IENBYWNEZWNvZGVyQ2hhbm5lbEluZm87CisKKy8qIGNoYW5uZWxpbmZvLmNwcCAqLworCitBQUNfREVDT0RFUl9FUlJPUiBnZXRTYW1wbGluZ1JhdGVJbmZvKFNhbXBsaW5nUmF0ZUluZm8gKnQsIFVJTlQgc2FtcGxlc1BlckZyYW1lLCBVSU5UIHNhbXBsaW5nUmF0ZUluZGV4LCBVSU5UIHNhbXBsaW5nUmF0ZSk7CisKKy8qKgorICogXGJyaWVmIFJlYWQgbWF4IFNGQiBmcm9tIGJpdCBzdHJlYW0gYW5kIGFzc2lnbiBUb3RhbFNmQmFuZHMgYWNjb3JkaW5nCisgKiAgICAgICAgdG8gdGhlIHdpbmRvdyBzZXF1ZW5jZSBhbmQgc2FtcGxlIHJhdGUuCisgKiBccGFyYW0gaEJzIGJpdCBzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlCisgKiBccGFyYW0gcEljc0luZm8gSWNzSW5mbyBzdHJ1Y3R1cmUgdG8gcmVhZCB0aGUgd2luZG93IHNlcXVlbmNlIGFuZCBzdG9yZSBNYXhTZkJhbmRzIGFuZCBUb3RhbFNmQmFuZHMKKyAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyByZWFkIG9ubHkKKyAqLworQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZE1heFNmYiAoCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbworICAgICAgICApOworCitBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkKAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvKiBTYW1wbGluZ1JhdGVJbmZvVGFibGUsCisgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgKTsKKworLyogc3RlcmVvLmNwcCwgb25seSBjYWxsZWQgZnJvbSB0aGlzIGZpbGUgKi8KKworLyohCisgIFxicmllZiBBcHBsaWVzIE1TIHN0ZXJlby4gCisgIAorICBUaGUgZnVuY3Rpb24gYXBwbGllcyBNUyBzdGVyZW8uCisKKyAgXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gYWFjIGNoYW5uZWwgaW5mby4KKyAgXHBhcmFtIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzIHBvaW50ZXIgdG8gc2NhbGVmYWN0b3IgYmFuZCBvZmZzZXRzLgorICBccGFyYW0gcFdpbmRvd0dyb3VwTGVuZ3RoIHBvaW50ZXIgdG8gd2luZG93IGdyb3VwIGxlbmd0aCBhcnJheS4KKyAgXHBhcmFtIHdpbmRvd0dyb3VwcyBudW1iZXIgb2Ygd2luZG93IGdyb3Vwcy4KKyAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluIGxlZnQgY2hhbm5lbC4KKyAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluIHJpZ2h0IGNoYW5uZWwuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgZGlmZmVyIGZyb20gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCBvbmx5IGZvciBVU0FDLgorICBccmV0dXJuICBub25lCisqLwordm9pZCBDSm9pbnRTdGVyZW9fQXBwbHlNUyhDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwV2luZG93R3JvdXBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUik7CisKKy8qIQorICBcYnJpZWYgQXBwbGllcyBpbnRlbnNpdHkgc3RlcmVvCisKKyAgVGhlIGZ1bmN0aW9uIGFwcGxpZXMgaW50ZW5zaXR5IHN0ZXJlby4KKworICBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBhYWMgY2hhbm5lbCBpbmZvLgorICBccGFyYW0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMgcG9pbnRlciB0byBzY2FsZWZhY3RvciBiYW5kIG9mZnNldHMuCisgIFxwYXJhbSBwV2luZG93R3JvdXBMZW5ndGggcG9pbnRlciB0byB3aW5kb3cgZ3JvdXAgbGVuZ3RoIGFycmF5LgorICBccGFyYW0gd2luZG93R3JvdXBzIG51bWJlciBvZiB3aW5kb3cgZ3JvdXBzLgorICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkIG51bWJlciBvZiB0cmFuc21pdHRlZCBzY2FsZWZhY3RvciBiYW5kcy4KKyAgXHBhcmFtIENvbW1vbldpbmRvdyBjb21tb24gd2luZG93IGJpdC4KKyAgXHJldHVybiAgbm9uZQorKi8KK3ZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5SVMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIENvbW1vbldpbmRvdyk7CisKKworLyogYWFjZGVjX3Bucy5jcHAgKi8KK2ludCBDUG5zX0lzUG5zVXNlZCAoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKTsKKwordm9pZCBDUG5zX1NldENvcnJlbGF0aW9uKENQbnNEYXRhICpwUG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dG9mcGhhc2UpOworCisvKioqKioqKioqKioqKioqKioqIGlubGluZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqLworCitpbmxpbmUgVUNIQVIgSXNWYWxpZChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCit7CisgIHJldHVybiBwSWNzSW5mby0+VmFsaWQ7Cit9CisKK2lubGluZSBVQ0hBUiBJc0xvbmdCbG9jayhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCit7CisgIHJldHVybiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlICE9IEVpZ2h0U2hvcnRTZXF1ZW5jZSk7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRXaW5kb3dTaGFwZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCit7CisgIHJldHVybiBwSWNzSW5mby0+V2luZG93U2hhcGU7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRXaW5kb3dTZXF1ZW5jZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCit7CisgIHJldHVybiBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7Cit9CisKK2lubGluZSBjb25zdCBTSE9SVCAqR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8qIHNhbXBsaW5nUmF0ZUluZm8pCit7CisgIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpCisgIHsKKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBzYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICB9Cit9CisKK2lubGluZSBpbnQgR2V0V2luZG93c1BlckZyYW1lKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKK3sKKyAgcmV0dXJuIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSA/IDggOiAxOworfQorCitpbmxpbmUgVUNIQVIgR2V0V2luZG93R3JvdXBzKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKK3sKKyAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cHM7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cExlbmd0aChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IElOVCBpbmRleCkKK3sKKyAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFtpbmRleF07Cit9CisKK2lubGluZSBjb25zdCBVQ0hBUiAqR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCit7CisgIHJldHVybiBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGg7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQoreworICByZXR1cm4gcEljc0luZm8tPk1heFNmQmFuZHM7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRTY2FsZU1heEZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMCwgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMSkKK3sKKyAgcmV0dXJuIGZNYXgocEljc0luZm8wLT5NYXhTZkJhbmRzLCBwSWNzSW5mbzEtPk1heFNmQmFuZHMpOworfQorCitpbmxpbmUgVUNIQVIgR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKK3sKKyAgcmV0dXJuIHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHM7Cit9CisKKy8qIE5vdGU6IFRoaXMgZnVuY3Rpb24gYXBwbGllcyB0byBBQUMtTEMgb25seSAhICovCitpbmxpbmUgVUNIQVIgR2V0TWF4aW11bVRuc0JhbmRzKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgaW50IHNhbXBsaW5nUmF0ZUluZGV4KQoreworICByZXR1cm4gdG5zX21heF9iYW5kc190Ymxbc2FtcGxpbmdSYXRlSW5kZXhdWyFJc0xvbmdCbG9jayhwSWNzSW5mbyldOworfQorCisjZW5kaWYgLyogI2lmbmRlZiBDSEFOTkVMSU5GT19IICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY29uY2VhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzMTNlZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwCkBAIC0wLDAgKzEsMTg2NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogaW5kZXBlbmRlbnQgY2hhbm5lbCBjb25jZWFsbWVudAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBccGFnZSBjb25jZWFsbWVudCBBQUMgY29yZSBjb25jZWFsbWVudAorCisgIFRoaXMgQUFDIGNvcmUgaW1wbGVtZW50YXRpb24gaW5jbHVkZXMgYSBjb25jZWFsbWVudCBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGVuYWJsZWQKKyAgdXNpbmcgdGhlIHNldmVyYWwgZGVmaW5lcyBkdXJpbmcgY29tcGlsYXRpb24uCisKKyAgVGhlcmUgYXJlIHZhcmlvdXMgdGVzdHMgaW5zaWRlIHRoZSBjb3JlLCBzdGFydGluZyB3aXRoIHNpbXBsZSBDUkMgdGVzdHMgYW5kIGVuZGluZyBpbgorICBhIHZhcmlldHkgb2YgcGxhdXNpYmlsaXR5IGNoZWNrcy4gSWYgc3VjaCBhIGNoZWNrIGluZGljYXRlcyBhbiBpbnZhbGlkIGJpdHN0cmVhbSwgdGhlbgorICBjb25jZWFsbWVudCBpcyBhcHBsaWVkLgorCisgIENvbmNlYWxtZW50IGlzIGFsc28gYXBwbGllZCB3aGVuIHRoZSBjYWxsaW5nIG1haW4gcHJvZ3JhbSBpbmRpY2F0ZXMgYSBkaXN0b3J0ZWQgb3IgbWlzc2luZworICBkYXRhIGZyYW1lIHVzaW5nIHRoZSBmcmFtZU9LIGZsYWcuIFRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXIuCisgIChTZWUgYmVsb3cpCisKKyAgVGhlcmUgYXJlIHRocmVlIGNvbmNlYWxtZW50LW1vZGVzOgorCisgIDEpIE11dGluZzogVGhlIHNwZWN0cmFsIGRhdGEgaXMgc2ltcGx5IHNldCB0byB6ZXJvIGluIGNhc2Ugb2YgYW4gZGV0ZWN0ZWQgZXJyb3IuCisKKyAgMikgTm9pc2Ugc3Vic3RpdHV0aW9uOiBJbiBjYXNlIG9mIGFuIGRldGVjdGVkIGVycm9yLCBjb25jZWFsbWVudCBjb3BpZXMgdGhlIGxhc3QgZnJhbWUgYW5kIGFkZHMKKyAgICAgYXR0ZW51YXRlcyB0aGUgc3BlY3RyYWwgZGF0YS4gRm9yIHRoaXMgbW9kZSB5b3UgaGF2ZSB0byBzZXQgdGhlICNDT05DRUFMX05PSVNFIGRlZmluZS4KKyAgICAgTm9pc2Ugc3Vic3RpdHV0aW9uIGFkZHMgbm8gYWRkaXRpb25hbCBkZWxheS4KKworICAzKSBJbnRlcnBvbGF0aW9uOiBUaGUgaW50ZXJwb2xhdGlvbiByb3V0aW5lIHN3YXBzIHRoZSBzcGVjdHJhbCBkYXRhIGZyb20gdGhlIHByZXZpb3VzIGFuZCB0aGUKKyAgICAgY3VycmVudCBmcmFtZSBqdXN0IGJlZm9yZSB0aGUgZmluYWwgZnJlcXVlbmN5IHRvIHRpbWUgY29udmVyc2lvbi4gSW4gY2FzZSBhIHNpbmdsZSBmcmFtZSBpcworICAgICBjb3JydXB0ZWQsIGNvbmNlYWxtYW50IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBsYXN0IGdvb2QgYW5kIHRoZSBmaXJzdCBnb29kIGZyYW1lIHRvIGNyZWF0ZQorICAgICB0aGUgc3BlY3RyYWwgZGF0YSBmb3IgdGhlIG1pc3NpbmcgZnJhbWUuIElmIG11bHRpcGxlIGZyYW1lcyBhcmUgY29ycnVwdGVkLCBjb25jZWFsbWVudAorICAgICBpbXBsZW1lbnRzIGZpcnN0IGEgZmFkZSBvdXQgYmFzZWQgb24gc2xpZ2h0bHkgbW9kaWZpZWQgc3BlY3RyYWwgdmFsdWVzIGZyb20gdGhlIGxhc3QgZ29vZAorICAgICBmcmFtZS4gQXMgc29vbiBhcyBnb29kIGZyYW1lcyBhcmUgYXZhaWxhYmxlLCBjb25jZWFsbWFudCBmYWRlcyBpbiB0aGUgbmV3IHNwZWN0cmFsIGRhdGEuCisgICAgIEZvciB0aGlzIG1vZGUgeW91IGhhdmUgdG8gc2V0IHRoZSAjQ09OQ0VBTF9JTlRFUiBkZWZpbmUuIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UsIHlvdSBhbHNvCisgICAgIG5lZWQgdG8gc2V0ICNTQlJfQlNfREVMQVlfRU5BQkxFLCB3aGljaCBiYXNpY2FsbHkgYWRkcyBhcHByb3JpYXRlIGRlbGF5IGluIHRoZSBTQlIgZGVjb2Rlci4KKyAgICAgTm90ZSB0aGF0IHRoZSBJbnRlcnBvbGF0aW5nLUNvbmNlYWxtZW50IGluY3JlYXNlcyB0aGUgZGVsYXkgb2YgeW91ciBkZWNvZGVyIGJ5IG9uZSBmcmFtZQorICAgICBhbmQgdGhhdCBpdCBkb2VzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgc3VjaCBhcyBtZW1vcnkgYW5kIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eS4KKworICA8aDI+SG93IGNvbmNlYWxtZW50IGNhbiBiZSB1c2VkIHdpdGggZXJyb3JzIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXI8L2gyPgorCisgIE1hbnkgZXJyb3JzIGNhbiBvciBoYXZlIHRvIGJlIGRldGVjdGVkIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXIuIEZvciBleGFtcGxlIGluIElQIGJhc2VkIHN5c3RlbXMKKyAgcGFja2V0IGxvc3MgY2FuIG9jY3VyLiBUaGUgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgc2hvdWxkIGluZGljYXRlIHN1Y2ggcGFja2V0IGxvc3MgYnkgaW5zZXJ0aW5nCisgIGFuIGVtcHR5IGZyYW1lIHdpdGggZnJhbWVPSz0wLgorKi8KKworI2luY2x1ZGUgImNvbmNlYWwuaCIKKworI2luY2x1ZGUgImFhY19yb20uaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisKKy8qIFBOUyAob2YgYmxvY2spICovCisjaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgorI2luY2x1ZGUgImJsb2NrLmgiCisKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisKKyNkZWZpbmUgQ09OQ0VBTF9ERkxUX0NPTUZfTk9JU0VfTEVWRUwgICAgICggNDYgKSAgLyogfj0gLTcwIGRCICovCisKKworLyogZGVmYXVsdCBzZXR0aW5ncyAqLworI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERU9VVF9GUkFNRVMgICAgICAgKCA1ICkKKyNkZWZpbmUgQ09OQ0VBTF9ERkxUX0ZBREVJTl9GUkFNRVMgICAgICAgICggNSApCisjZGVmaW5lIENPTkNFQUxfREZMVF9NVVRFX1JFTEVBU0VfRlJBTUVTICAoIDMgKQorCisjZGVmaW5lIENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUiAgICAgICAgICAoIDAuNzA3MTA2NzgxMTg2NTQ4ZiApICAgLyogMS9zcXJ0KDIpICovCisKKy8qIHNvbWUgb2Z0ZW4gdXNlZCBjb25zdGFudHM6ICovCisjZGVmaW5lIEZJWFBfWkVSTyAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikKKyNkZWZpbmUgRklYUF9PTkUgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmKQorI2RlZmluZSBGSVhQX0ZMX0NPUlJFQ1RJT04gIEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzNmKQorCisvKiBGb3IgcGFyYW1ldGVyIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQ09OQ0VBTF9QQVJBTUVURVJfQklUUyAgICAgICAgICAgICAgKCA4ICkKKyNkZWZpbmUgQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SICAgICAgICAgICAgKCAoMTw8Q09OQ0VBTF9QQVJBTUVURVJfQklUUyktMSApCisvKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNSAgKCBGTDJGWENPTlNUX0RCTCgwLjk3MTYyNzk1MTU3NzEwNjE3NCkgKSovICAvKiAtMC4yNSBkQiAqLworI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1X0xEICBGTDJGWENPTlNUX0RCTCgtMC4wNDE1MjQxMDExODYwOTIwMjk1OTY4NTM0NDUyMTIyOTkpCisvKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzA1MCAgKCBGTDJGWENPTlNUX0RCTCgwLjk0NDA2MDg3NjI4NTkyMzM4MCkgKSovICAvKiAtMC41MCBkQiAqLworI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDUwX0xEIEZMMkZYQ09OU1RfREJMKC0wLjA4MzA0ODIwMjM3MjE4NDA1OTI1MzU5NzAwODE0NTI5MykKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICBDQ29uY2VhbG1lbnRfRXhwYW5kLAorICBDQ29uY2VhbG1lbnRfQ29tcHJlc3MKK30KK0NDb25jZWFsbWVudEV4cGFuZFR5cGU7CisKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBmYWNNb2Q0VGFibGVbNF0gPSB7CisgIEZMMkZYQ09OU1RfU0dMKDAuNTAwMDAwMDAwZiksICAgLyogRklYUF9TR0woMHg0MDAwKSwgIDJeLSgxLTAsMDApICovCisgIEZMMkZYQ09OU1RfU0dMKDAuNTk0NjAzNTU4ZiksICAgLyogRklYUF9TR0woMHg0YzFiKSwgIDJeLSgxLTAsMjUpICovCisgIEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxZiksICAgLyogRklYUF9TR0woMHg1YTgyKSwgIDJeLSgxLTAsNTApICovCisgIEZMMkZYQ09OU1RfU0dMKDAuODQwODk2NDE1ZikgICAgLyogRklYUF9TR0woMHg2YmEyKSAgIDJeLSgxLTAsNzUpICovCit9OworCisKKworCitzdGF0aWMgdm9pZAorICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kgKAorICAgIEZJWFBfREJMICAgICAgICAgICAgICAgKnNwZWN0cnVtLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKKyAgICBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlICBleCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3kKKyAgKTsKKworc3RhdGljIHZvaWQKKyAgQ0NvbmNlYWxtZW50X0ludGVycG9sYXRlQnVmZmVyICgKKyAgICBGSVhQX0RCTCAgICAqc3BlY3RydW0sCisgICAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGVQcmV2LAorICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlQWN0LAorICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlT3V0LAorICAgIGludCAgICAgICAgICplblBydiwKKyAgICBpbnQgICAgICAgICAqZW5BY3QsCisgICAgaW50ICAgICAgICAgIHNmYkNudCwKKyAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldAorICApOworCitzdGF0aWMgaW50CisgIENDb25jZWFsbWVudF9BcHBseUludGVyICgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICAgICAgICpwQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgaW50ICBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgaW50ICBpbXByb3ZlVG9uYWwsCisgICAgY29uc3QgaW50ICBmcmFtZU9rCisgICk7CisKKworCitzdGF0aWMgaW50CisgIENDb25jZWFsbWVudF9BcHBseU5vaXNlICgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBpbnQgICAgc2FtcGxlc1BlckZyYW1lLAorICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgKTsKKworc3RhdGljIHZvaWQKKyAgQ0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlICgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAorICAgIGludCBmcmFtZU9rCisgICk7CisKK3N0YXRpYyB2b2lkCisgIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24gKAorICAgIGludCAgICAgICAgaVJhbmRvbVBoYXNlLAorICAgIEZJWFBfREJMICAqc3BlYywKKyAgICBpbnQgICAgICAgIHNhbXBsZXNQZXJGcmFtZQorICApOworCisKK3N0YXRpYyBpbnQgQ0NvbmNlYWxtZW50X0dldFdpblNlcShpbnQgcHJldldpblNlcSkKK3sKKyAgaW50IG5ld1dpblNlcSA9IE9ubHlMb25nU2VxdWVuY2U7CisKKyAgLyogVHJ5IHRvIGhhdmUgb25seSBsb25nIGJsb2NrcyAqLworICBpZiAoIHByZXZXaW5TZXEgPT0gTG9uZ1N0YXJ0U2VxdWVuY2UKKyAgICB8fCBwcmV2V2luU2VxID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSApCisgIHsKKyAgICBuZXdXaW5TZXEgPSBMb25nU3RvcFNlcXVlbmNlOworICB9CisKKyAgcmV0dXJuIChuZXdXaW5TZXEpOworfQorCisKKy8qIQorICBcYnJpZWYgSW5pdCBjb21tb24gY29uY2VhbG1lbnQgaW5mb3JtYXRpb24gZGF0YQorCisgIFxwQ29uY2VhbENvbW1vbkRhdGEgUG9pbnRlciB0byB0aGUgY29uY2VhbG1lbnQgY29tbW9uIGRhdGEgc3RydWN0dXJlLgorCisgIFxyZXR1cm4gIG5vbmUKKyovCit2b2lkCisgIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSAoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSkKK3sKKyAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YSAhPSBOVUxMKQorICB7CisgICAgaW50IGk7CisKKyAgICAvKiBTZXQgZGVmYXVsdCBlcnJvciBjb25jZWFsbWVudCB0ZWNobmlxdWUgKi8KKyAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm1ldGhvZCA9IENvbmNlYWxNZXRob2RJbnRlcjsKKworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyAgICAgPSBDT05DRUFMX0RGTFRfRkFERU9VVF9GUkFNRVM7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgICAgICA9IENPTkNFQUxfREZMVF9GQURFSU5fRlJBTUVTOworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMgPSBDT05DRUFMX0RGTFRfTVVURV9SRUxFQVNFX0ZSQU1FUzsKKworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+Y29tZm9ydE5vaXNlTGV2ZWwgICAgPSBDT05DRUFMX0RGTFRfQ09NRl9OT0lTRV9MRVZFTDsKKworICAgIC8qIEluaXQgZmFkZSBmYWN0b3JzIChzeW1ldHJpYykgKi8KKyAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbMF0gPSBGTDJGWENPTlNUX1NHTCggQ09OQ0VBTF9ERkxUX0ZBREVfRkFDVE9SICk7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbMF0gID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yWzBdOworCisgICAgZm9yIChpID0gMTsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgeworICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW2ldID0gRlhfREJMMkZYX1NHTChmTXVsdChwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaS0xXSxGTDJGWENPTlNUX1NHTChDT05DRUFMX0RGTFRfRkFERV9GQUNUT1IpKSk7CisgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcltpXSAgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaV07CisgICAgfQorICB9Cit9CisKKworCisvKiEKKyAgXGJyaWVmIEdldCBjdXJyZW50IGNvbmNlYWxtZW50IG1ldGhvZC4KKworICBccENvbmNlYWxDb21tb25EYXRhIFBvaW50ZXIgdG8gY29tbW9uIGNvbmNlYWxtZW50IGRhdGEgKGZvciBhbGwgY2hhbm5lbHMpCisKKyAgXHJldHVybiBDb25jZWFsbWVudCBtZXRob2QuCisqLworQ0NvbmNlYWxtZW50TWV0aG9kCisgIENDb25jZWFsbWVudF9HZXRNZXRob2QoIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgKQoreworICBDQ29uY2VhbG1lbnRNZXRob2QgbWV0aG9kID0gQ29uY2VhbE1ldGhvZE5vbmU7CisKKyAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YSAhPSBOVUxMKSB7CisgICAgbWV0aG9kID0gcENvbmNlYWxDb21tb25EYXRhLT5tZXRob2Q7CisgIH0KKworICByZXR1cm4gKG1ldGhvZCk7Cit9CisKKworLyohCisgIFxicmllZiBJbml0IGNvbmNlYWxtZW50IGluZm9ybWF0aW9uIGZvciBlYWNoIGNoYW5uZWwKKworICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGNvbmNlYWxtZW50IGluZm9ybWF0aW9uLiBUd28gbWV0aG9kcyBjYW4gYmUgY2hvc2VuOgorICAgICAgICAgICAgIDAgPSBpbnRlcnBvbGF0aW9uIG1ldGhvZCAoYWRkcyBkZWxheSkKKyAgICAgICAgICAgICAxID0gbm9pc2Ugc3Vic3RpdHV0aW9uIChubyBkZWxheSwgbG93IGNvbXBsZXhpdHkpCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3ZvaWQKKyAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSAoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxDaGFubmVsSW5mbywKKyAgICBDQ29uY2VhbFBhcmFtcyAgICpwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgaW50IHNhbXBsZXNQZXJGcmFtZSApCit7CisgIGludCBpOworCisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPnBDb25jZWFsUGFyYW1zID0gcENvbmNlYWxDb21tb25EYXRhOworCisgIEZES21lbWNsZWFyKHBDb25jZWFsQ2hhbm5lbEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIDEwMjQgKiBzaXplb2YoRklYUF9DTkNMKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIHBDb25jZWFsQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVtpXSA9IDA7CisgIH0KKworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5pUmFuZG9tUGhhc2UgICA9IDA7CisKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+d2luZG93U2VxdWVuY2UgPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5kb3dTaGFwZSAgICA9IDA7CisKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+cHJldkZyYW1lT2tbMF0gPSAxOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5wcmV2RnJhbWVPa1sxXSA9IDE7CisKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+Y250RmFkZUZyYW1lcyAgPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7CisKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+Y29uY2VhbFN0YXRlICAgPSBDb25jZWFsU3RhdGVfT2s7CisKK30KKworCisvKiEKKyAgXGJyaWVmIFNldCBlcnJvciBjb25jZWFsbWVudCBwYXJhbWV0ZXJzCisKKyAgXGNvbmNlYWxQYXJhbXMKKyAgXG1ldGhvZAorICBcZmFkZU91dFNsb3BlCisgIFxmYWRlSW5TbG9wZQorICBcbXV0ZVJlbGVhc2UKKyAgXGNvbWZOb2lzZUxldmVsCisKKyAgXHJldHVybiAgbm9uZQorKi8KK0FBQ19ERUNPREVSX0VSUk9SCisgIENDb25jZWFsbWVudF9TZXRQYXJhbXMgKAorICAgIENDb25jZWFsUGFyYW1zICpjb25jZWFsUGFyYW1zLAorICAgIGludCAgbWV0aG9kLAorICAgIGludCAgZmFkZU91dFNsb3BlLAorICAgIGludCAgZmFkZUluU2xvcGUsCisgICAgaW50ICBtdXRlUmVsZWFzZSwKKyAgICBpbnQgIGNvbWZOb2lzZUxldmVsICkKK3sKKyAgLyogc2V0IGNvbmNlYWxtZW50IHRlY2huaXF1ZSAqLworICBpZiAobWV0aG9kICE9IEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKKyAgICBzd2l0Y2ggKChDQ29uY2VhbG1lbnRNZXRob2QpbWV0aG9kKQorICAgIHsKKyAgICBjYXNlIENvbmNlYWxNZXRob2RNdXRlOgorICAgIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOgorICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgICAgLyogQmUgc3VyZSB0byBlbmFibGUgZGVsYXkgYWRqdXN0bWVudCBvZiBTQlIgZGVjb2RlciEgKi8KKyAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgcGFyYW0gKi8KKyAgICAgICAgY29uY2VhbFBhcmFtcy0+bWV0aG9kID0gKENDb25jZWFsbWVudE1ldGhvZCltZXRob2Q7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICB9CisgIH0KKworICAvKiBzZXQgbnVtYmVyIG9mIGZyYW1lcyBmb3IgZmFkZS1vdXQgc2xvcGUgKi8KKyAgaWYgKGZhZGVPdXRTbG9wZSAhPSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7CisgICAgaWYgKCAoZmFkZU91dFNsb3BlIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUykKKyAgICAgICYmIChmYWRlT3V0U2xvcGUgPj0gMCkgKQorICAgIHsKKyAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgcGFyYW0gKi8KKyAgICAgICAgY29uY2VhbFBhcmFtcy0+bnVtRmFkZU91dEZyYW1lcyA9IGZhZGVPdXRTbG9wZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICB9CisKKyAgLyogc2V0IG51bWJlciBvZiBmcmFtZXMgZm9yIGZhZGUtaW4gc2xvcGUgKi8KKyAgaWYgKGZhZGVJblNsb3BlICE9IEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKKyAgICBpZiAoIChmYWRlSW5TbG9wZSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpCisgICAgICAmJiAoZmFkZUluU2xvcGUgPj0gMSkgKQorICAgIHsKKyAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgcGFyYW0gKi8KKyAgICAgICAgY29uY2VhbFBhcmFtcy0+bnVtRmFkZUluRnJhbWVzID0gZmFkZUluU2xvcGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgfQorCisgIC8qIHNldCBudW1iZXIgb2YgZXJyb3ItZnJlZSBmcmFtZXMgYWZ0ZXIgd2hpY2ggdGhlIG11dGluZyB3aWxsIGJlIHJlbGVhc2VkICovCisgIGlmIChtdXRlUmVsZWFzZSAhPSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7CisgICAgaWYgKCAobXV0ZVJlbGVhc2UgPCAoQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzw8MSkpCisgICAgICAmJiAobXV0ZVJlbGVhc2UgPj0gMCkgKQorICAgIHsKKyAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzZXQgcGFyYW0gKi8KKyAgICAgICAgY29uY2VhbFBhcmFtcy0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMgPSBtdXRlUmVsZWFzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICB9CisKKyAgLyogc2V0IGNvbmZvcnQgbm9pc2UgbGV2ZWwgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCB3aGlsZSBpbiBzdGF0ZSAnbXV0aW5nJyAqLworICBpZiAoY29tZk5vaXNlTGV2ZWwgIT0gQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCkgeworICAgIGlmICggKGNvbWZOb2lzZUxldmVsIDwgLTEpCisgICAgICB8fCAoY29tZk5vaXNlTGV2ZWwgPiAxMjcpICkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIH0gZWxzZSB7CisgICAgICBjb25jZWFsUGFyYW1zLT5jb21mb3J0Tm9pc2VMZXZlbCA9IGNvbWZOb2lzZUxldmVsOworICAgIH0KKyAgfQorCisgIHJldHVybiAoQUFDX0RFQ19PSyk7Cit9CisKKworLyohCisgIFxicmllZiBTZXQgZmFkZS1vdXQvaW4gYXR0ZW51YXRpb24gZmFjdG9yIHZlY3RvcnMKKworICBcY29uY2VhbFBhcmFtcworICBcZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yCisgIFxmYWRlSW5BdHRlbnVhdGlvblZlY3RvcgorCisgIFxyZXR1cm4gMCBpZiBPSyBhbGwgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9ycworKi8KK0FBQ19ERUNPREVSX0VSUk9SCisgIENDb25jZWFsbWVudF9TZXRBdHRlbnVhdGlvbiAoCisgICAgQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCisgICAgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKKyAgICBTSE9SVCAqZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgKQoreworICBpZiAoIChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IgPT0gTlVMTCkKKyAgICAmJiAoZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgID09IE5VTEwpICkgeworICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICB9CisKKyAgLyogRmFkZS1vdXQgZmFjdG9ycyAqLworICBpZiAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yICE9IE5VTEwpCisgIHsKKyAgICBpbnQgaTsKKworICAgIC8qIGNoZWNrIHF1YW50aXplZCBmYWN0b3JzIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgeworICAgICAgaWYgKChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0gPCAwKSB8fCAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldID4gQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SKSkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbmNlYWxQYXJhbXMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgfQorCisgICAgLyogbm93IGRlcXVhbnRpemUgZmFjdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIAorICAgIHsKKyAgICAgIGNvbmNlYWxQYXJhbXMtPmZhZGVPdXRGYWN0b3JbaV0gPQorICAgICAgICBGWF9EQkwyRlhfU0dMKCBmTGRQb3coICAgIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKChJTlQpKEZMMkZYQ09OU1RfREJMKDEuMC8yLjApPj4oQ09OQ0VBTF9QQVJBTUVURVJfQklUUy0xKSkgKiAoSU5UKWZhZGVPdXRBdHRlbnVhdGlvblZlY3RvcltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0VBTF9QQVJBTUVURVJfQklUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICB9CisKKyAgLyogRmFkZS1pbiBmYWN0b3JzICovCisgIGlmIChmYWRlSW5BdHRlbnVhdGlvblZlY3RvciAhPSBOVUxMKQorICB7CisgICAgaW50IGk7CisKKyAgICAvKiBjaGVjayBxdWFudGl6ZWQgZmFjdG9ycyBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIHsKKyAgICAgIGlmICgoZmFkZUluQXR0ZW51YXRpb25WZWN0b3JbaV0gPCAwKSB8fCAoZmFkZUluQXR0ZW51YXRpb25WZWN0b3JbaV0gPiBDT05DRUFMX01BWF9RVUFOVF9GQUNUT1IpKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgIH0KKyAgICBpZiAoY29uY2VhbFBhcmFtcyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICB9CisKKyAgICAvKiBub3cgZGVxdWFudGl6ZSBmYWN0b3JzICovCisgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykKKyAgICB7CisgICAgICBjb25jZWFsUGFyYW1zLT5mYWRlSW5GYWN0b3JbaV0gPQorICAgICAgICBGWF9EQkwyRlhfU0dMKCBmTGRQb3coIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGSVhQX09ORT4+Q09OQ0VBTF9QQVJBTUVURVJfQklUUykgKiAoSU5UKWZhZGVJbkF0dGVudWF0aW9uVmVjdG9yW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0VBTF9QQVJBTUVURVJfQklUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKyAgfQorCisgIHJldHVybiAoQUFDX0RFQ19PSyk7Cit9CisKKworLyohCisgIFxicmllZiBHZXQgc3RhdGUgb2YgY29uY2VhbG1lbnQgbW9kdWxlLgorCisgIFxwQ29uY2VhbENoYW5uZWxJbmZvCisKKyAgXHJldHVybiBDb25jZWFsbWVudCBzdGF0ZS4KKyovCitDQ29uY2VhbG1lbnRTdGF0ZQorICBDQ29uY2VhbG1lbnRfR2V0U3RhdGUgKAorICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsQ2hhbm5lbEluZm8KKyAgKQoreworICBDQ29uY2VhbG1lbnRTdGF0ZSBzdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKworICBpZiAocENvbmNlYWxDaGFubmVsSW5mbyAhPSBOVUxMKSB7CisgICAgc3RhdGUgPSBwQ29uY2VhbENoYW5uZWxJbmZvLT5jb25jZWFsU3RhdGU7CisgIH0KKworICByZXR1cm4gKHN0YXRlKTsKK30KKworCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfZmFrZVBuc0RhdGEgKAorICAgQ1Buc0RhdGEgKnBQbnNEYXRhLAorICAgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICBTSE9SVCAqcFNwZWNTY2FsZSwKKyAgIFNIT1JUICpwU2NhbGVGYWN0b3IsCisgICBjb25zdCBpbnQgbGV2ZWwgKQoreworICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcEludGVyQ2hhbm5lbERhdGEgPSBwUG5zRGF0YS0+cFBuc0ludGVyQ2hhbm5lbERhdGE7CisKKyAgaW50ICBwbnNCYW5kLCBiYW5kLCBncm91cCwgd2luOworICAvL2ludCAgZGVsdGEgPSAwOworICBpbnQgIHdpbmRvd3NQZXJGcmFtZSA9IEdldFdpbmRvd3NQZXJGcmFtZShwSWNzSW5mbyk7CisgIGludCAgcmVmTGV2ZWwgPSAod2luZG93c1BlckZyYW1lID4gMSkgPyA4MiA6IDkxOworCisgIEZES19BU1NFUlQobGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSAxMjcpOworCisgIGZvciAod2luID0gMDsgd2luIDwgd2luZG93c1BlckZyYW1lOyB3aW4rKykgeworICAgIHBTcGVjU2NhbGVbd2luXSA9IDMxOworICB9CisKKyAgLyogZmFrZSBJQ1MgaW5mbyBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKCFJc1ZhbGlkKHBJY3NJbmZvKSkgeworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMgPSAxOworICAgIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpIHsKKyAgICAgIHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHMgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbMF0gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHMgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzBdID0gODsKKyAgICB9CisgICAgcEljc0luZm8tPk1heFNmQmFuZHMgPSBwSWNzSW5mby0+VG90YWxTZkJhbmRzOworICB9CisKKyAgLyogZ2xvYmFsIGFjdGl2YXRlIFBOUyAqLworICBwUG5zRGF0YS0+UG5zQWN0aXZlID0gMTsKKyAgLyogc2V0IGVuZXJneSBsZXZlbCAqLworICBwUG5zRGF0YS0+Q3VycmVudEVuZXJneSA9IGZpeE1heCggMCwgcmVmTGV2ZWwgLSBsZXZlbCApOworCisgIC8qCisgICAgdmFsdWU6IHwgQXZnLiBSTVMgcG93ZXIgfCBBdmcuIFJNUyBwb3dlciB8CisgICAgICAgICAgIHwgc3BlY1NjYWxlID0gMjIgfCBzcGVjU2NhbGUgPSAzMSB8CisgICAgLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgIDUgIHwgICAgICAgICAgICAgICAgfCAgLTk5LjAgZEIKKyAgICAgICAxNSAgfCAgICAgICAgICAgICAgICB8ICAtOTAuMCBkQgorICAgICAgIDI1ICB8ICAgICAgICAgICAgICAgIHwgIC04OS43IGRCIAorICAgICAgIDM1ICB8ICAgICAgICAgICAgICAgIHwgIC04NS4zIGRCCisgICAgICAuLi4gIHwgICAgLi4uICAgICAgICAgfCAgIC4uLgorICAgICAgIDQ1ICB8ICAtNjkuOSBkQiAgICAgIHwgIC03MC4wIGRCCisgICAgICAgNTAgIHwgIC02Mi4yIGRCICAgICAgfCAgCisgICAgICAgNTUgIHwgIC01NS42IGRCICAgICAgfCAgLTU0LjYgZEIKKyAgICAgICA2MCAgfCAgLTQ3LjAgZEIgICAgICB8CisgICAgICAgNjUgIHwgIC0zOS41IGRCICAgICAgfCAgLTM5LjUgZEIKKyAgICAgICA3MCAgfCAgLTMxLjkgZEIgICAgICB8ICAKKyAgICAgICA3NSAgfCAgLTI0LjQgZEIgICAgICB8ICAtMjQuNCBkQgorICAgICAgIDgwICB8ICAtMTYuOSBkQiAgICAgIHwgIAorICAgICAgIDg1ICB8ICAgLTkuNCBkQiAoYykgIHwgICAtOS40IGRCCisgICAgICAgOTAgIHwgICAtMy45IGRCIChjKSAgfCAgCisgICAgICAgOTUgIHwgICAgICAgICAgICAgICAgfCAgIC0yLjEgZEIKKyAgICAgIDEwMCAgfCAgICAgICAgICAgICAgICB8ICAgLTEuNiBkQgorICAgICAgMTA1ICB8ICAgICAgICAgICAgICAgIHwgICAtMS40IGRCCisgICovCisKKyAgZm9yIChncm91cD0wOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyk7IGdyb3VwKyspCisgIHsKKyAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChwSWNzSW5mbyk7IGJhbmQrKykKKyAgICB7CisgICAgICBwbnNCYW5kID0gZ3JvdXAgKiAxNiArIGJhbmQ7CisKKyAgICAgIGlmIChwbnNCYW5kID49IE5PX09GQkFORFMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy9wUG5zRGF0YS0+Q3VycmVudEVuZXJneSArPSBkZWx0YSA7CisgICAgICBwU2NhbGVGYWN0b3JbcG5zQmFuZF0gPSBwUG5zRGF0YS0+Q3VycmVudEVuZXJneTsKKyAgICAgIHBJbnRlckNoYW5uZWxEYXRhLT5jb3JyZWxhdGVkW3Buc0JhbmRdID0gMDsKKyAgICAgIHBQbnNEYXRhLT5wbnNVc2VkW3Buc0JhbmRdID0gMTsKKyAgICB9CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmIFN0b3JlIGRhdGEgZm9yIGNvbmNlYWxtZW50IHRlY2huaXF1ZXMgYXBwbGllZCBsYXRlcgorCisgIEludGVyZmFjZSBmdW5jdGlvbiB0byBzdG9yZSBkYXRhIGZvciBkaWZmZXJlbnQgY29uY2VhbG1lbnQgc3RyYXRlZ2llcworCisgICBccmV0dXJuICBub25lCisgKi8KK3ZvaWQKKyAgQ0NvbmNlYWxtZW50X1N0b3JlICgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyApCit7CisgIGlmICggIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBECisgICAgICApICkKKyAgeworICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9ICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICAgIFNIT1JUICAgICpwU3BlY1NjYWxlICAgICAgICAgICA9ICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CisgICAgQ0ljc0luZm8gKnBJY3NJbmZvICAgICAgICAgICAgID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisKKyAgICBTSE9SVCAgdFNwZWNTY2FsZVs4XTsKKyAgICBVQ0hBUiAgdFdpbmRvd1NoYXBlLCB0V2luZG93U2VxdWVuY2U7CisKKyAgICAvKiBzdG9yZSBvbGQgd2luZG93IGluZm9zIGZvciBzd2FwcGluZyAqLworICAgIHRXaW5kb3dTZXF1ZW5jZSA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlOworICAgIHRXaW5kb3dTaGFwZSAgICA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworCisgICAgLyogc3RvcmUgb2xkIHNjYWxlIGZhY3RvcnMgZm9yIHN3YXBwaW5nICovCisgICAgRkRLbWVtY3B5KHRTcGVjU2NhbGUsIGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKKworICAgIC8qIHN0b3JlIG5ldyB3aW5kb3cgaW5mb3MgKi8KKyAgICBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9IEdldFdpbmRvd1NlcXVlbmNlKHBJY3NJbmZvKTsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZSAgICA9IEdldFdpbmRvd1NoYXBlKHBJY3NJbmZvKTsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuICA9ICooR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShwSWNzSW5mbykrR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKS0xKTsKKworICAgIC8qIHN0b3JlIG5ldyBzY2FsZSBmYWN0b3JzICovCisgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgcFNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKKworICAgIGlmIChDQ29uY2VhbG1lbnRfR2V0RGVsYXkoaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMpID09IDApCisgICAgeworICAgICAgLyogc3RvcmUgbmV3IHNwZWN0cmFsIGJpbnMgKi8KKyNpZiAoQ05DTF9GUkFDVF9CSVRTID09IERGUkFDVF9CSVRTKQorICAgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIHBTcGVjdHJhbENvZWZmaWNpZW50LCAxMDI0ICogc2l6ZW9mKEZJWFBfQ05DTCkpOworI2Vsc2UKKyAgICAgIEZJWFBfQ05DTCAqUkVTVFJJQ1QgcENuY2wgPSAmaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFsxMDI0LTFdOworICAgICAgRklYUF9EQkwgICpSRVNUUklDVCBwU3BlYyA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFsxMDI0LTFdOworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgICpwQ25jbC0tID0gRlhfREJMMkZYX0NOQ0woKnBTcGVjLS0pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0gJmhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKKyAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKKyAgICAgIGludCBpOworCisgICAgICAvKiBzd2FwIHNwZWN0cmFsIGRhdGEgKi8KKyAgICAgIGZvciAoaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgIEZJWFBfREJMIHRTcGVjID0gKnBTcGVjOworICAgICAgICAqcFNwZWMtLSA9IEZYX0NOQ0wyRlhfREJMKCpwQ25jbCk7CisgICAgICAgICpwQ25jbC0tID0gRlhfREJMMkZYX0NOQ0woIHRTcGVjKTsKKyAgICAgIH0KKworICAgICAgLyogY29tcGxldGUgc3dhcHBpbmcgb2Ygd2luZG93IGluZm9zICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSB0V2luZG93U2VxdWVuY2U7CisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSB0V2luZG93U2hhcGU7CisKKyAgICAgIC8qIGNvbXBsZXRlIHN3YXBwaW5nIG9mIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgIEZES21lbWNweShwU3BlY1NjYWxlLCB0U3BlY1NjYWxlLCA4KnNpemVvZihTSE9SVCkpOworICAgIH0KKyAgfQorICAKK30KKworCisvKiEKKyAgXGJyaWVmIEFwcGx5IGNvbmNlYWxtZW50CisKKyAgSW50ZXJmYWNlIGZ1bmN0aW9uIHRvIGRpZmZlcmVudCBjb25jZWFsbWVudCBzdHJhdGVnaWVzCisKKyAgIFxyZXR1cm4gIG5vbmUKKyAqLworaW50CisgIENDb25jZWFsbWVudF9BcHBseSAoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICBjb25zdCBVQ0hBUiBsYXN0THBkTW9kZSwKKyAgICBjb25zdCBpbnQgZnJhbWVPaywKKyAgICBjb25zdCBVSU5UIGZsYWdzKQoreworICBpbnQgYXBwbGllZFByb2Nlc3NpbmcgPSAwOworCisgIGlmICggKGZyYW1lT2sgPT0gMCkKKyAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSAhPSAoQUFDREVDX1JFTkRFUl9NT0RFKWhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlKSApIHsKKyAgICAvKiByZXN0b3JlIHRoZSBsYXN0IHJlbmRlciBtb2RlIHRvIHN0YXkgaW4gdGhlIHNhbWUgZG9tYWluIHdoaWNoIGFsbG93cyB0byBkbyBhIHByb3BlciBjb25jZWFsbWVudCAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPSAoQUFDREVDX1JFTkRFUl9NT0RFKWhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlOworICB9IGVsc2UgeworICAgIC8qIG90aGVyd2lzZSBzdG9yZSB0aGUgY3VycmVudCBtb2RlICovCisgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGUgPSAoU0NIQVIpcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZTsKKyAgfQorCisgIGlmICggZnJhbWVPayApCisgIHsKKyAgICAvKiBSZXNjdWUgY3VycmVudCBkYXRhIGZvciBjb25jZWFsbWVudCBpbiBmdXR1cmUgZnJhbWVzICovCisgICAgQ0NvbmNlYWxtZW50X1N0b3JlICggaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKTsKKyAgICAvKiBSZXNldCBpbmRleCB0byByYW5kb20gc2lnbiB2ZWN0b3IgdG8gbWFrZSBzaWduIGNhbGN1bGF0aW9uIGZyYW1lIGFnbm9zdGljIAorICAgICAgIChvbmx5IGRlcGVuZHMgb24gbnVtYmVyIG9mIHN1YnNlcXVlbnRseSBjb25jZWFsZWQgc3BlY3RyYWwgYmxvY2tzKSAqLworICAgICAgICBoQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgPSAwOworICB9CisKKyAgLyogaGFuZCBjdXJyZW50IGZyYW1lIHN0YXR1cyB0byB0aGUgc3RhdGUgbWFjaGluZSAqLworICBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoIGhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVPayApOworCisgIHsKKyAgICAvKiBDcmVhdGUgZGF0YSBmb3Igc2lnbmFsIHJlbmRlcmluZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGNvbmNlYWxtZW50IG1ldGhvZCBhbmQgZGVjb2RlciBvcGVyYXRpbmcgbW9kZS4gKi8KKworCisgICAgaWYgKCAhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQKKyAgICAgICAgKQorICAgICAgICApCisgICAgeworICAgICAgc3dpdGNoIChoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bWV0aG9kKQorICAgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE11dGU6CisgICAgICAgIGlmICghZnJhbWVPaykgeworICAgICAgICAgIC8qIE11dGUgc3BlY3RyYWwgZGF0YSBpbiBjYXNlIG9mIGVycm9ycyAqLworICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAvKiBTZXQgbGFzdCB3aW5kb3cgc2hhcGUgKi8KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLldpbmRvd1NoYXBlID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CisgICAgICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENvbmNlYWxNZXRob2ROb2lzZToKKyAgICAgICAgLyogTm9pc2Ugc3Vic3RpdHV0aW9uIGVycm9yIGNvbmNlYWxtZW50IHRlY2huaXF1ZSAqLworICAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9CisgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UgKGhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgICAgICAvKiBFbmVyZ3kgaW50ZXJwb2xhdGlvbiBjb25jZWFsbWVudCBiYXNlZCBvbiAzR1BQICovCisgICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0KKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlJbnRlciAoaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8qIGRvbid0IHVzZSB0b25hbCBpbXByb3ZlbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU9rKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogdXBkYXRlIGhpc3RvcnkgKi8KKyAgaENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0gPSBoQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXTsKKyAgaENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gPSBmcmFtZU9rOworCisgIHJldHVybiBhcHBsaWVkUHJvY2Vzc2luZzsKK30KKworLyohCitcYnJpZWYgQXBwbHkgY29uY2VhbG1lbnQgbm9pc2Ugc3Vic3RpdHV0aW9uCisKKyAgSW4gY2FzZSBvZiBmcmFtZSBsb3N0IHRoaXMgZnVuY3Rpb24gcHJvZHVjZXMgYSBub2lzeSBmcmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgIGVuZXJnaWVzIHZhbHVlcyBvZiBwYXN0IGZyYW1lLgorCitccmV0dXJuICBub25lCisgKi8KK3N0YXRpYyBpbnQKKyAgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UgKENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpCit7CisgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgPSBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKKworICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPSAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgU0hPUlQgICAgKnBTcGVjU2NhbGUgICAgICAgICAgID0gIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKKyAgQ0ljc0luZm8gKnBJY3NJbmZvICAgICAgICAgICAgID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisKKyAgaW50IGFwcGxpZWRQcm9jZXNzaW5nID0gMDsKKworICBGREtfQVNTRVJUKChzYW1wbGVzUGVyRnJhbWU+PTQ4MCkgJiYgKHNhbXBsZXNQZXJGcmFtZTw9MTAyNCkpOworICBGREtfQVNTRVJUKChzYW1wbGVzUGVyRnJhbWUmMHgxRikgPT0gMCk7CisKKyAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCisgIHsKKyAgY2FzZSBDb25jZWFsU3RhdGVfT2s6CisgICAgLyogTm90aGluZyB0byBkbyBoZXJlISAqLworICAgIGJyZWFrOworCisgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKKyAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKKyAgICB7CisgICAgICAvKiByZXN0b3JlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMgZnJvbSBidWZmZXIgd2l0aCBhIHNwZWNpZmljIG11dGluZyAqLworICAgICAgRklYUF9TR0wgIGZhYzsKKyAgICAgIGludCB3aW4sIG51bVdpbmRvd3MgPSAxOworICAgICAgaW50IHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZTsKKyAgICAgIGludCB0RmFkZUZyYW1lcywgbGFzdFdpbmRvdyA9IDA7CisgICAgICBpbnQgd2luX2lkeF9zdHJpZGUgPSAxOworCisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8gIT0gTlVMTCk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKKyAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8PSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpOworCisgICAgICAvKiBnZXQgYXR0ZW51YXRpb24gZmFjdG9yICovCisgICAgICB0RmFkZUZyYW1lcyA9IHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXM7CisgICAgICBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbdEZhZGVGcmFtZXNdOworCisgICAgICAvKiBzZXQgb2xkIHdpbmRvdyBwYXJhbWV0ZXJzICovCisgICAgICB7CisgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSAgICA9IHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZTsKKworICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0gMikgeworICAgICAgICAgIC8qIHNob3J0IGJsb2NrIGhhbmRsaW5nICovCisgICAgICAgICAgbnVtV2luZG93cyA9IDg7CisgICAgICAgICAgd2luZG93TGVuICA9IHNhbXBsZXNQZXJGcmFtZSA+PiAzOworICAgICAgICAgIGxhc3RXaW5kb3cgPSBudW1XaW5kb3dzIC0gcENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKHdpbiA9IDA7IHdpbiA8IG51bVdpbmRvd3M7IHdpbisrKSB7CisgICAgICAgIEZJWFBfQ05DTCAqcENuY2wgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50ICsgKGxhc3RXaW5kb3cgKiB3aW5kb3dMZW4pOworICAgICAgICBGSVhQX0RCTCAgKnBPdXQgID0gcFNwZWN0cmFsQ29lZmZpY2llbnQgKyAod2luICogd2luZG93TGVuKTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgRkRLX0FTU0VSVCgobGFzdFdpbmRvdyAqIHdpbmRvd0xlbiArIHdpbmRvd0xlbikgPD0gc2FtcGxlc1BlckZyYW1lKTsKKworICAgICAgICAvKiByZXN0b3JlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMgZnJvbSBidWZmZXIgd2l0aCBhIHNwZWNpZmljIGF0dGVudWF0aW9uICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgICAgIHBPdXRbaV0gPSBmTXVsdChwQ25jbFtpXSwgZmFjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGx5IHJhbmRvbSBjaGFuZ2Ugb2Ygc2lnbiBmb3Igc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisgICAgICAgIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24ocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dMZW4gKTsKKworICAgICAgICAvKiBJbmNyZW1lbnQgcmFuZG9tIHBoYXNlIGluZGV4IHRvIGF2b2lkIHJlcGV0aXRpb24gYXJ0aWZhY3RzLiAqLworICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgPSAocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlICsgMSkgJiAoQUFDX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICAgICAgICAvKiBzZXQgb2xkIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgICAgcFNwZWNTY2FsZVt3aW4qd2luX2lkeF9zdHJpZGVdID0gcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlW3dpbl9pZHhfc3RyaWRlKmxhc3RXaW5kb3crK107CisKKyAgICAgICAgaWYgKCAobGFzdFdpbmRvdyA+PSBudW1XaW5kb3dzKQorICAgICAgICAgICYmIChudW1XaW5kb3dzID4gIDEpICkKKyAgICAgICAgeworICAgICAgICAgIC8qIGVuZCBvZiBzZXF1ZW5jZSAtPiByZXdpbmQgKi8KKyAgICAgICAgICBsYXN0V2luZG93ID0gbnVtV2luZG93cyAtIHBDb25jZWFsbWVudEluZm8tPmxhc3RXaW5HcnBMZW47CisgICAgICAgICAgLyogdXBkYXRlIHRoZSBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gZ2V0IGEgZmFzdGVyIGZhZGUtb3V0ICovCisgICAgICAgICAgdEZhZGVGcmFtZXMgKz0gMTsKKyAgICAgICAgICBpZiAodEZhZGVGcmFtZXMgPCBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3Rvclt0RmFkZUZyYW1lc107CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhYyA9IChGSVhQX1NHTCkwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBzdG9yZSB0ZW1wIHZhcnMgKi8KKyAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSB0RmFkZUZyYW1lczsKKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKKyAgICB7CisgICAgICAvKiBzZXQgZHVtbXkgd2luZG93IHBhcmFtZXRlcnMgKi8KKyAgICAgIHBJY3NJbmZvLT5WYWxpZCAgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmlnZ2VyIHRoZSBnZW5lcmF0aW9uIG9mIGEgY29uc2l0ZW50IEljc0luZm8gKi8KKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSAgICA9IHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOyAgICAvKiBQcmV2ZW50IGFuIGludmFsaWQgV2luZG93U2hhcGUgKHJlcXVpcmVkIGZvciBGL1QgdHJhbnNmb3JtKSAqLworICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gQ0NvbmNlYWxtZW50X0dldFdpblNlcShwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSk7CisgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9IHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsgLyogU3RvcmUgZm9yIG5leHQgZnJhbWUgKHNwZWN0cnVtIGluIGNvbmNlYWxtZW50IGJ1ZmZlciBjYW4ndCBiZSB1c2VkIGF0IGFsbCkgKi8KKworICAgICAgLyogbXV0ZSBzcGVjdHJhbCBkYXRhICovCisgICAgICBGREttZW1jbGVhcihwU3BlY3RyYWxDb2VmZmljaWVudCwgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgIGlmICggIShmbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpIAorICAgICAgICAgICAmJiBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsID49IDAKKyAgICAgICAgICAgJiYgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbCA8PSA2MSAvKiAtOTBkQiAqLykKKyAgICAgICAgeworICAgICAgICAvKiBpbnNlcnQgY29tZm9ydCBub2lzZSB1c2luZyBQTlMgKi8KKyAgICAgICAgQ0NvbmNlYWxtZW50X2Zha2VQbnNEYXRhICgKKyAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLmFhYy5QbnNEYXRhLAorICAgICAgICAgIHBJY3NJbmZvLAorICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGUsCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsCisgICAgICAgICk7CisKKyAgICAgICAgQ1Buc19BcHBseSAoCisgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKKyAgICAgICAgICAgICAgICBwSWNzSW5mbywKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyBhcHBseSB0byBmaXJzdCBjaGFubmVsICovCisgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKKyAgICB7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKKyAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzKTsKKworICAgICAgLyogYXR0ZW51YXRlIHNpZ25hbCB0byBnZXQgYSBzbW9vdGggZmFkZS1pbiAqLworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBPdXQgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbc2FtcGxlc1BlckZyYW1lLTFdOworICAgICAgRklYUF9TR0wgZmFjID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lc107CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gc2FtcGxlc1BlckZyYW1lOyBpICE9IDA7IGktLSkgeworICAgICAgICAqcE91dCA9IGZNdWx0KCpwT3V0LCBmYWMpOworICAgICAgICBwT3V0LS07CisgICAgICB9CisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogd2Ugc2hvdWxkbid0IGNvbWUgaGVyZSBhbnl3YXkgKi8KKyAgICBGREtfQVNTRVJUKDApOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGFwcGxpZWRQcm9jZXNzaW5nOworfQorCisKKy8qIQorICBcYnJpZWYgQXBwbHkgY29uY2VhbG1lbnQgaW50ZXJwb2xhdGlvbgorCisgIFRoZSBmdW5jdGlvbiBzd2FwcyB0aGUgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGFuZCB0aGUgcHJldmlvdXMgZnJhbWUuIElmIGFuCisgIGVycm9yIGhhcyBvY2N1cmVkLCBmcmFtZSBpbnRlcnBvbGF0aW9uIGlzIHBlcmZvcm1lZCB0byByZXN0b3JlIHRoZSBtaXNzaW5nCisgIGZyYW1lLiBJbiBjYXNlIG9mIG11bHRpcGxlIGZhdWx0eSBmcmFtZXMsIGZhZGUtaW4gYW5kIGZhZGUtb3V0IGlzIGFwcGxpZWQuCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3N0YXRpYyBpbnQKKyAgQ0NvbmNlYWxtZW50X0FwcGx5SW50ZXIgKAorICAgIENDb25jZWFsbWVudEluZm8gICAgICAgKnBDb25jZWFsbWVudEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBpbnQgIHNhbXBsZXNQZXJGcmFtZSwKKyAgICBjb25zdCBpbnQgIGltcHJvdmVUb25hbCwKKyAgICBjb25zdCBpbnQgIGZyYW1lT2sgKQoreworICBDQ29uY2VhbFBhcmFtcyAgICpwQ29uY2VhbENvbW1vbkRhdGEgICAgPSAgcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXM7CisKKyAgRklYUF9EQkwgICAgICAgICAqcFNwZWN0cmFsQ29lZmZpY2llbnQgID0gIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgIENJY3NJbmZvICAgICAgICAgKnBJY3NJbmZvICAgICAgICAgICAgICA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworICBTSE9SVCAgICAgICAgICAgICpwU3BlY1NjYWxlICAgICAgICAgICAgPSAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOworCisKKyAgaW50IHNmYkVuZXJneVByZXZbNjRdOworICBpbnQgc2ZiRW5lcmd5QWN0IFs2NF07CisKKyAgaW50IGksIGFwcGxpZWRQcm9jZXNzaW5nID0gMDsKKworICAvKiBjbGVhci9pbml0ICovCisgIEZES21lbWNsZWFyKHNmYkVuZXJneVByZXYsIDY0ICogc2l6ZW9mKGludCkpOworICBGREttZW1jbGVhcihzZmJFbmVyZ3lBY3QsICA2NCAqIHNpemVvZihpbnQpKTsKKworCisgIGlmICghZnJhbWVPaykKKyAgeworICAgIC8qIFJlc3RvcmUgbGFzdCBmcmFtZSBmcm9tIGNvbmNlYWxtZW50IGJ1ZmZlciAqLworICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSAgICA9IHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlOworCisgICAgLyogUmVzdG9yZSBzcGVjdHJhbCBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNQZXJGcmFtZTsgaSsrKSB7CisgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSA9IEZYX0NOQ0wyRlhfREJMKHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbaV0pOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgc2NhbGUgZmFjdG9ycyAqLworICAgIEZES21lbWNweShwU3BlY1NjYWxlLCBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGUsIDgqc2l6ZW9mKFNIT1JUKSk7CisgIH0KKworICAvKiBpZiBwcmV2aW91cyBmcmFtZSB3YXMgbm90IG9rICovCisgIGlmICghcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0pIHsKKworICAgIC8qIGlmIGN1cnJlbnQgZnJhbWUgKGZfbikgaXMgb2sgYW5kIHRoZSBsYXN0IGJ1dCBvbmUgZnJhbWUgKGZfKG4tMikpCisgICAgICAgd2FzIG9rLCB0b28sIHRoZW4gaW50ZXJwb2xhdGUgYm90aCBmcmFtZXMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUKKyAgICAgICB0aGUgY3VycmVudCBvdXRwdXQgZnJhbWUgKGZfKG4tMSkpLiBPdGhlcndpc2UsIHVzZSB0aGUgbGFzdCBzdG9yZWQKKyAgICAgICBmcmFtZSAoZl8obi0yKSBvciBmXyhuLTMpIG9yIC4uLikuICovCisgICAgaWYgKGZyYW1lT2sgJiYgcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0pCisgICAgeworICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworCisKKyAgICAgIC8qIEludGVycG9sYXRlIGJvdGggZnJhbWVzIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjdXJyZW50IG91dHB1dCBmcmFtZSAoZl8obi0xKSkuICovCisgICAgICBpZiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgeworICAgICAgICAvKiBmXyhuLTIpID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICAvKiBzaG9ydC0tPz8/Pz8/LS1zaG9ydCwgc2hvcnQtLT8/Pz8/Py0tbG9uZyBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIC8qIHNob3J0LS1zaG9ydC0tLXNob3J0LCBzaG9ydC0tLWxvbmctLS1sb25nIGludGVycG9sYXRpb24gKi8KKworICAgICAgICBpbnQgd25kOworCisgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsgLyogZl9uID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICAgIC8qIHNob3J0LS1zaG9ydC0tLXNob3J0IGludGVycG9sYXRpb24gKi8KKworICAgICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0ICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAxOworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEVpZ2h0U2hvcnRTZXF1ZW5jZTsKKworICAgICAgICAgIGZvciAod25kID0gMDsgd25kIDwgODsgd25kKyspCisgICAgICAgICAgeworICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgICAgICAgICAgICAmcFNwZWN0cmFsQ29lZmZpY2llbnRbd25kICogKHNhbXBsZXNQZXJGcmFtZSAvIDgpXSwgLyogc3BlY18obi0yKSAqLworICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCisgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCisgICAgICAgICAgICAgICBzZmJFbmVyZ3lQcmV2KTsKKworICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFt3bmQgKiAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBzcGVjX24gKi8KKyAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgRWlnaHRTaG9ydFNlcXVlbmNlLAorICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKKworICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0ludGVycG9sYXRlQnVmZmVyKAorICAgICAgICAgICAgICAmcFNwZWN0cmFsQ29lZmZpY2llbnRbd25kICogKHNhbXBsZXNQZXJGcmFtZSAvIDgpXSwgLyogc3BlY18obi0xKSAqLworICAgICAgICAgICAgICAmcFNwZWNTY2FsZVt3bmRdLAorICAgICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlW3duZF0sCisgICAgICAgICAgICAgICZwU3BlY1NjYWxlW3duZF0sCisgICAgICAgICAgICAgICBzZmJFbmVyZ3lQcmV2LAorICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0LAorICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsLAorICAgICAgICAgICAgICAgcFNmYk9mZnNldCk7CisKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8qIGZfbiAhPSBFaWdodFNob3J0U2VxdWVuY2UgKi8KKyAgICAgICAgICAvKiBzaG9ydC0tLWxvbmctLS1sb25nIGludGVycG9sYXRpb24gKi8KKworICAgICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgICAgU0hPUlQgc3BlY1NjYWxlT3V0OworCisgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KCZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUgLSAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBbd25kXSBzcGVjXyhuLTIpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9FeHBhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CisKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY19uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5TG9uZ1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYpOworCisgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMDsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBMb25nU3RvcFNlcXVlbmNlOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNQZXJGcmFtZSA7IGkrKykgeworICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbaV0gPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50W2ldOyAvKiBzcGVjX24gKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7IC8qIHNlYXJjaCBmb3IgbWF4KHNwZWNTY2FsZSkgKi8KKyAgICAgICAgICAgIGlmIChwU3BlY1NjYWxlW2ldID4gcFNwZWNTY2FsZVswXSkgeworICAgICAgICAgICAgICBwU3BlY1NjYWxlWzBdID0gcFNwZWNTY2FsZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoCisgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY18obi0xKSAqLworICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlWzBdLAorICAgICAgICAgICAmcFNwZWNTY2FsZVswXSwKKyAgICAgICAgICAgJnNwZWNTY2FsZU91dCwKKyAgICAgICAgICAgIHNmYkVuZXJneVByZXYsCisgICAgICAgICAgICBzZmJFbmVyZ3lBY3QsCisgICAgICAgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwsCisgICAgICAgICAgICBwU2ZiT2Zmc2V0KTsKKworICAgICAgICAgIHBTcGVjU2NhbGVbMF0gPSBzcGVjU2NhbGVPdXQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxvbmctLT8/Pz8/Py0tc2hvcnQsIGxvbmctLT8/Pz8/Py0tbG9uZyBpbnRlcnBvbGF0aW9uICovCisgICAgICAgIC8qIGxvbmctLS1sb25nLS0tc2hvcnQsIGxvbmctLS1sb25nLS0tbG9uZyBpbnRlcnBvbGF0aW9uICovCisKKyAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgIFNIT1JUIHNwZWNTY2FsZUFjdCAgICAgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbMF07CisKKyAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBTcGVjdHJhbENvZWZmaWNpZW50LCAgLyogc3BlY18obi0yKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5TG9uZ1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldik7CisKKyAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgeyAgLyogZl9uID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICAgIC8qIGxvbmctLS1sb25nLS0tc2hvcnQgaW50ZXJwb2xhdGlvbiAqLworCisgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMTsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBMb25nU3RhcnRTZXF1ZW5jZTsKKworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsgLyogc2VhcmNoIGZvciBtYXgoc3BlY1NjYWxlKSAqLworICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVtpXSA+IHNwZWNTY2FsZUFjdCkgeworICAgICAgICAgICAgICBzcGVjU2NhbGVBY3QgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogRXhwYW5kIGZpcnN0IHNob3J0IHNwZWN0cnVtICovCisgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsICAvKiBzcGVjX24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2h0U2hvcnRTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0V4cGFuZCwgIC8qICEhISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGxvbmctLS1sb25nLS0tbG9uZyBpbnRlcnBvbGF0aW9uICovCisKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAwOworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IE9ubHlMb25nU2VxdWVuY2U7CisKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgIC8qIHNwZWNfbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seUxvbmdTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOworICAgICAgICB9CisKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoCisgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgIC8qIHNwZWNfKG4tMSkgKi8KKyAgICAgICAgICAgJnBTcGVjU2NhbGVbMF0sCisgICAgICAgICAgICZzcGVjU2NhbGVBY3QsCisgICAgICAgICAgICZwU3BlY1NjYWxlWzBdLAorICAgICAgICAgICAgc2ZiRW5lcmd5UHJldiwKKyAgICAgICAgICAgIHNmYkVuZXJneUFjdCwKKyAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwKKyAgICAgICAgICAgIHBTZmJPZmZzZXQpOworCisgICAgICB9CisgICAgfQorCisgICAgICAvKiBOb2lzZSBzdWJzdGl0dXRpb24gb2Ygc2lnbiBvZiB0aGUgb3V0cHV0IHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLworICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbiAocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUpOworICAgICAgLyogSW5jcmVtZW50IHJhbmRvbSBwaGFzZSBpbmRleCB0byBhdm9pZCByZXBldGl0aW9uIGFydGlmYWN0cy4gKi8KKyAgICAgIHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSA9IChwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgKyAxKSAmIChBQUNfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICB9CisKKyAgLyogc2NhbGUgc3BlY3RydW0gYWNjb3JkaW5nIHRvIGNvbmNlYWxtZW50IHN0YXRlICovCisgIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKQorICB7CisgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKKyAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgYnJlYWs7CisKKyAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKKyAgICB7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKKyAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyk7CisKKyAgICAgIC8qIHJlc3RvcmUgZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBmcm9tIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgbXV0aW5nICovCisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE91dCA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUtMV07CisgICAgICBGSVhQX1NHTCBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lc107CisKKyAgICAgIGZvciAoaSA9IHNhbXBsZXNQZXJGcmFtZTsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICAgKnBPdXQgPSBmTXVsdCgqcE91dCwgZmFjKTsKKyAgICAgICAgcE91dC0tOworICAgICAgfQorICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46CisgICAgeworICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IDApOworICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyk7CisKKyAgICAgIC8qIGF0dGVudWF0ZSBzaWduYWwgdG8gZ2V0IGEgc21vb3RoIGZhZGUtaW4gKi8KKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwT3V0ID0gJnBTcGVjdHJhbENvZWZmaWNpZW50W3NhbXBsZXNQZXJGcmFtZS0xXTsKKyAgICAgIEZJWFBfU0dMIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW3BDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXNdOworCisgICAgICBmb3IgKGkgPSBzYW1wbGVzUGVyRnJhbWU7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgICpwT3V0ID0gZk11bHQoKnBPdXQsIGZhYyk7CisgICAgICAgIHBPdXQtLTsKKyAgICAgIH0KKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKKyAgICB7CisgICAgICBpbnQgZmFjID0gcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbDsKKworICAgICAgLyogc2V0IGR1bW15IHdpbmRvdyBwYXJhbWV0ZXJzICovCisgICAgICBwSWNzSW5mby0+VmFsaWQgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiBhIGNvbnNpdGVudCBJY3NJbmZvICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsgICAgLyogUHJldmVudCBhbiBpbnZhbGlkIFdpbmRvd1NoYXBlIChyZXF1aXJlZCBmb3IgRi9UIHRyYW5zZm9ybSkgKi8KKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IENDb25jZWFsbWVudF9HZXRXaW5TZXEocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UpOworICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPSBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7IC8qIFN0b3JlIGZvciBuZXh0IGZyYW1lIChzcGVjdHJ1bSBpbiBjb25jZWFsbWVudCBidWZmZXIgY2FuJ3QgYmUgdXNlZCBhdCBhbGwpICovCisKKyAgICAgIC8qIG11dGUgc3BlY3RyYWwgZGF0YSAqLworICAgICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIHNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICBpZiAoZmFjID49IDAgJiYgZmFjIDw9IDYxKSB7CisgICAgICAgIC8qIGluc2VydCBjb21mb3J0IG5vaXNlIHVzaW5nIFBOUyAqLworICAgICAgICBDQ29uY2VhbG1lbnRfZmFrZVBuc0RhdGEgKAorICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgcEljc0luZm8sCisgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCisgICAgICAgICAgZmFjCisgICAgICAgICk7CisKKyAgICAgICAgQ1Buc19BcHBseSAoCisgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKKyAgICAgICAgICAgICAgICBwSWNzSW5mbywKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyBhcHBseSB0byBmaXJzdCBjaGFubmVsICovCisgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogbm90aGluZyB0byBkbyBoZXJlICovCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gYXBwbGllZFByb2Nlc3Npbmc7Cit9CisKKworLyohCisgIFxicmllZiBDYWxjdWxhdGUgdGhlIHNwZWN0cmFsIGVuZXJneQorCisgIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGJhbmQtd2lzZSB0aGUgc3BlY3RyYWwgZW5lcmd5LiBUaGlzIGlzIHVzZWQgZm9yCisgIGZyYW1lIGludGVycG9sYXRpb24uCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3N0YXRpYyB2b2lkCisgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSAoCisgICAgRklYUF9EQkwgICAgICAgICAgICAgICAqc3BlY3RydW0sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgYmxvY2tUeXBlLAorICAgIENDb25jZWFsbWVudEV4cGFuZFR5cGUgIGV4cGFuZFR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5ICkKK3sKKyAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQ7CisgIGludCBsaW5lLCBzZmIsIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IDA7CisgIAorICAvKiBJbiB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9ucywgZW5BY2N1IGlzIGluaXRpYWxpemVkIHdpdGggTFNCLXZhbHVlIGluIG9yZGVyIHRvIGF2b2lkIHplcm8gZW5lcmd5LWxldmVsICovCisKKyAgbGluZSA9IDA7CisKKyAgc3dpdGNoKGJsb2NrVHlwZSkgeworCisgIGNhc2UgT25seUxvbmdTZXF1ZW5jZToKKyAgY2FzZSBMb25nU3RhcnRTZXF1ZW5jZToKKyAgY2FzZSBMb25nU3RvcFNlcXVlbmNlOgorCisgICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7CisgICAgICAvKiBzdGFuZGFyZCBsb25nIGNhbGN1bGF0aW9uICovCisgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOworCisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKKyAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7CisgICAgICAgIGludCBzZmJTY2FsZSA9IChzaXplb2YoTE9ORyk8PDMpIC0gQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiKzFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7CisgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgIGZvciAoIDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKKyAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyBsaW5lKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGNvbXByZXNzIGxvbmcgdG8gc2hvcnQgKi8KKyAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzY2FsZUZhY3RvckJhbmRzVG90YWw7IHNmYisrKSB7CisgICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOworICAgICAgICBpbnQgc2ZiU2NhbGUgPSAoc2l6ZW9mKExPTkcpPDwzKSAtIENudExlYWRpbmdaZXJvcyhwU2ZiT2Zmc2V0W3NmYisxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOworICAgICAgICAvKiBzY2FsaW5nIGRlcGVuZHMgb24gc2ZiIHdpZHRoLiAqLworICAgICAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdIDw8IDM7IGxpbmUrKykgeworICAgICAgICAgIGVuQWNjdSArPSAoZW5BY2N1ICsgKGZQb3cyRGl2MigqKHNwZWN0cnVtICsgbGluZSkpID4+IHNmYlNjYWxlKSkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgRWlnaHRTaG9ydFNlcXVlbmNlOgorCisgICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7CisgICAgICAvKiAgIHN0YW5kYXJkIHNob3J0IGNhbGN1bGF0aW9uICovCisgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgcFNmYk9mZnNldCAgICAgICAgICAgID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgeworICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKKyAgICAgICAgaW50IHNmYlNjYWxlID0gKHNpemVvZihMT05HKTw8MykgLSBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIrMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKKyAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KKyAgICAgICAgZm9yICggOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgeworICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZTsKKyAgICAgICAgfQorICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogIGV4cGFuZCBzaG9ydCB0byBsb25nIHNwZWN0cnVtICovCisgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOworCisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKKyAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7CisgICAgICAgIGludCBzZmJTY2FsZSA9IChzaXplb2YoTE9ORyk8PDMpIC0gQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiKzFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7CisgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgIGZvciAoIDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKKyAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyAobGluZSA+PiAzKSkpID4+IHNmYlNjYWxlOworICAgICAgICB9CisgICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmIEludGVycG9sYXRlIGJ1ZmZlcgorCisgIFRoZSBmdW5jdGlvbiBjcmVhdGVzIHRoZSBpbnRlcnBvbGF0ZWQgc3BlY3RyYWwgZGF0YSBhY2NvcmRpbmcgdG8gdGhlCisgIGVuZXJneSBvZiB0aGUgbGFzdCBnb29kIGZyYW1lIGFuZCB0aGUgY3VycmVudCAoZ29vZCkgZnJhbWUuCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3N0YXRpYyB2b2lkCisgIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlciAoCisgICAgRklYUF9EQkwgICAgKnNwZWN0cnVtLAorICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlUHJ2LAorICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlQWN0LAorICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlT3V0LAorICAgIGludCAgICAgICAgICplblBydiwKKyAgICBpbnQgICAgICAgICAqZW5BY3QsCisgICAgaW50ICAgICAgICAgIHNmYkNudCwKKyAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCApCit7CisgIGludCAgICBzZmIsIGxpbmUgPSAwOworICBpbnQgICAgZmFjX3NoaWZ0OworICBpbnQgICAgZmFjX21vZDsKKyAgRklYUF9EQkwgYWNjdTsKKworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKworICAgIGZhY19zaGlmdCA9IGVuUHJ2W3NmYl0gLSBlbkFjdFtzZmJdICsgKCgqcFNwZWNTY2FsZUFjdCAtICpwU3BlY1NjYWxlUHJ2KSA8PCAxKTsKKyAgICBmYWNfbW9kICAgPSBmYWNfc2hpZnQgJiAzOworICAgIGZhY19zaGlmdCA9IChmYWNfc2hpZnQgPj4gMikgKyAxOworICAgIGZhY19zaGlmdCArPSAqcFNwZWNTY2FsZVBydiAtIGZpeE1heCgqcFNwZWNTY2FsZVBydiwgKnBTcGVjU2NhbGVBY3QpOworCisgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYisxXTsgbGluZSsrKSB7CisgICAgICBhY2N1ID0gZk11bHQoKihzcGVjdHJ1bStsaW5lKSwgZmFjTW9kNFRhYmxlW2ZhY19tb2RdKTsKKyAgICAgIGlmIChmYWNfc2hpZnQgPCAwKSB7CisgICAgICAgIGFjY3UgPj49IC1mYWNfc2hpZnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBhY2N1IDw8PSBmYWNfc2hpZnQ7CisgICAgICB9CisgICAgICAqKHNwZWN0cnVtK2xpbmUpID0gYWNjdTsKKyAgICB9CisgIH0KKyAgKnBTcGVjU2NhbGVPdXQgPSBmaXhNYXgoKnBTcGVjU2NhbGVQcnYsICpwU3BlY1NjYWxlQWN0KTsKK30KKworCisKKworc3RhdGljIElOVCBmaW5kRXF1aUZhZGVGcmFtZSAoCisgICAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSwKKyAgICBJTlQgYWN0RmFkZUluZGV4LAorICAgIGludCBkaXJlY3Rpb24gKQoreworICBGSVhQX1NHTCAqcEZhY3RvcjsKKyAgRklYUF9TR0wgIHJlZmVyZW5jZVZhbDsKKyAgRklYUF9TR0wgIG1pbkRpZmYgPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKworICBJTlQgIG51bUZyYW1lcyA9IDA7CisgIElOVCAgbmV4dEZhZGVJbmRleCA9IDA7CisKKyAgaW50ICBpOworCisgIC8qIGluaXQgZGVwZW5kaW5nIG9uIGRpcmVjdGlvbiAqLworICBpZiAoZGlyZWN0aW9uID09IDApIHsgIC8qIEZBREUtT1VUID0+IEZBREUtSU4gKi8KKyAgICBudW1GcmFtZXMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lczsKKyAgICByZWZlcmVuY2VWYWwgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbYWN0RmFkZUluZGV4XSA+PiAxOworICAgIHBGYWN0b3IgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcjsKKyAgfQorICBlbHNlIHsgIC8qIEZBREUtSU4gPT4gRkFERS1PVVQgKi8KKyAgICBudW1GcmFtZXMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXM7CisgICAgcmVmZXJlbmNlVmFsID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbYWN0RmFkZUluZGV4XSA+PiAxOworICAgIHBGYWN0b3IgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3I7CisgIH0KKworICAvKiBzZWFyY2ggZm9yIG1pbmltdW0gZGlmZmVyZW5jZSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICBGSVhQX1NHTCBkaWZmID0gZml4cF9hYnMoKHBGYWN0b3JbaV0+PjEpIC0gcmVmZXJlbmNlVmFsKTsKKyAgICBpZiAoZGlmZiA8IG1pbkRpZmYpIHsKKyAgICAgIG1pbkRpZmYgPSBkaWZmOworICAgICAgbmV4dEZhZGVJbmRleCA9IGk7CisgICAgfQorICB9CisKKyAgLyogY2hlY2sgYW5kIGFkanVzdCBkZXBlbmRpbmcgb24gZGlyZWN0aW9uICovCisgIGlmIChkaXJlY3Rpb24gPT0gMCkgeyAgLyogRkFERS1PVVQgPT4gRkFERS1JTiAqLworICAgIGlmICgoKHBGYWN0b3JbbmV4dEZhZGVJbmRleF0+PjEpIDw9IHJlZmVyZW5jZVZhbCkgJiYgKG5leHRGYWRlSW5kZXggPiAwKSkgeworICAgICAgbmV4dEZhZGVJbmRleCAtPSAxOworICAgIH0KKyAgfQorICBlbHNlIHsgIC8qIEZBREUtSU4gPT4gRkFERS1PVVQgKi8KKyAgICBpZiAoKChwRmFjdG9yW25leHRGYWRlSW5kZXhdPj4xKSA+PSByZWZlcmVuY2VWYWwpICYmIChuZXh0RmFkZUluZGV4IDwgbnVtRnJhbWVzLTEpKSB7CisgICAgICBuZXh0RmFkZUluZGV4ICs9IDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChuZXh0RmFkZUluZGV4KTsKK30KKworCisvKiEKKyAgXGJyaWVmIFVwZGF0ZSB0aGUgY29uY2VhbG1lbnQgc3RhdGUKKworICBUaGUgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbmNlYWxtZW50IHN0YXRlLW1hY2hpbmUuIFRoZQorICBzdGF0ZXMgYXJlOiBtdXRlLCBmYWRlLWluLCBmYWRlLW91dCwgaW50ZXJwb2xhdGUgYW5kIGZyYW1lLW9rLgorCisgIFxyZXR1cm4gIG5vbmUKKyovCitzdGF0aWMgdm9pZAorICBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUgKAorICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCisgICAgaW50IGZyYW1lT2sgKQoreworICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhID0gcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXM7CisKKyAgc3dpdGNoIChwQ29uY2VhbENvbW1vbkRhdGEtPm1ldGhvZCkKKyAgeworICBjYXNlIENvbmNlYWxNZXRob2ROb2lzZToKKyAgICB7CisgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICE9IENvbmNlYWxTdGF0ZV9PaykgeworICAgICAgICAvKiBjb3VudCB0aGUgdmFsaWQgZnJhbWVzIGR1cmluZyBjb25jZWFsbWVudCBwcm9jZXNzICovCisgICAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgKz0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyAgPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIC0tIFNUQVRFIE1BQ0hJTkUgZm9yIE5vaXNlIFN1YnN0aXR1dGlvbiAtLSAqLworICAgICAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCisgICAgICB7CisgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKKyAgICAgICAgaWYgKCFmcmFtZU9rKSB7CisgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBTSU5HTEUtRlJBTUUtTE9TUyAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICAgPSBDb25jZWFsU3RhdGVfU2luZ2xlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgfQorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgID0gMDsKKyAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZTogIC8qIEp1c3QgYSBwcmUtc3RhZ2UgYmVmb3JlIGZhZGUtb3V0IGJlZ2lucy4gU3RheSBoZXJlIG9ubHkgb25lIGZyYW1lISAqLworICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICs9IDE7CisgICAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4gcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZUluOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKCBwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtT1VUICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6CisgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKz0gMTsgIC8qIHVzZWQgdG8gYWRkcmVzcyB0aGUgZmFkZS1vdXQgZmFjdG9ycyAqLworICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7CisgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZUluOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKCBwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6CisgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKKyAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAtIDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgorICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIC09IDE7ICAvKiB1c2VkIHRvIGFkZHJlc3MgdGhlIGZhZGUtaW4gZmFjdG9ycyAqLworICAgICAgICBpZiAoZnJhbWVPaykgeworICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6CisgIGNhc2UgQ29uY2VhbE1ldGhvZFRvbmFsOgorICAgIHsKKyAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgIT0gQ29uY2VhbFN0YXRlX09rKSB7CisgICAgICAgIC8qIGNvdW50IHRoZSB2YWxpZCBmcmFtZXMgZHVyaW5nIGNvbmNlYWxtZW50IHByb2Nlc3MgKi8KKyAgICAgICAgaWYgKCBwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSB8fAorICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdICYmICFwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSAmJiBmcmFtZU9rKSApIHsKKyAgICAgICAgICAvKiBUaGUgZnJhbWUgaXMgT0sgZXZlbiBpZiBpdCBjYW4gYmUgZXN0aW1hdGVkIGJ5IHRoZSBlbmVyZ3kgaW50ZXJwb2xhdGlvbiBhbGdvcml0aG0gKi8KKyAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzICA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogLS0gU1RBVEUgTUFDSElORSBmb3IgZW5lcmd5IGludGVycG9sYXRpb24gLS0gKi8KKyAgICAgIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKQorICAgICAgeworICAgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6CisgICAgICAgIGlmICghKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdIHx8CisgICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdICYmICFwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSAmJiBmcmFtZU9rKSkpIHsKKyAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID4gMCkgeworICAgICAgICAgICAgLyogRmFkZSBvdXQgb25seSBpZiB0aGUgZW5lcmd5IGludGVycG9sYXRpb24gYWxnb3JpdGhtIGNhbiBub3QgYmUgYXBwbGllZCEgKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAgPSAwOworICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgorICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgorICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICs9IDE7CisKKyAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4gcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgeworICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLUlOICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogRmFkZU91dCAtPiBGYWRlSW4gKi8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgorICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7CisgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlSW47CisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgLSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKKyAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtPSAxOyAgLyogdXNlZCB0byBhZGRyZXNzIHRoZSBmYWRlLWluIGZhY3RvcnMgKi8KKworICAgICAgICBpZiAoZnJhbWVPayB8fCBwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSkgeworICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfSAvKiBFbmQgc3dpdGNoKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgKi8KKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBEb24ndCBuZWVkIGEgc3RhdGUgbWFjaGluZSBmb3Igb3RoZXIgY29uY2VhbG1lbnQgbWV0aG9kcy4gKi8KKyAgICBicmVhazsKKyAgfQorCit9CisKKworLyohCitcYnJpZWYgUmFuZG9taXplcyB0aGUgc2lnbiBvZiB0aGUgc3BlY3RyYWwgZGF0YQorCisgIFRoZSBmdW5jdGlvbiB0b2dnbGVzIHRoZSBzaWduIG9mIHRoZSBzcGVjdHJhbCBkYXRhIHJhbmRvbWx5LiBUaGlzIGlzCisgIHVzZWZ1bCB0byBlbnN1cmUgdGhlIHF1YWxpdHkgb2YgdGhlIGNvbmNlYWxlZCBmcmFtZXMuCisKK1xyZXR1cm4gIG5vbmUKKyAqLworc3RhdGljCit2b2lkIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24gKGludCByYW5kb21QaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaTsKKyAgVVNIT1JUIHBhY2tlZFNpZ249MDsKKworICAvKiByYW5kb20gdGFibGUgNTEyeDE2Yml0IGhhcyBiZWVuIHJlZHVjZWQgdG8gNTEyIHBhY2tlZCBzaWduIGJpdHMgPSAzMngxNiBiaXQgKi8KKworICAvKiByZWFkIGN1cnJlbnQgcGFja2VkIHNpZ24gd29yZCAqLworICBwYWNrZWRTaWduID0gcmFuZG9tU2lnbltyYW5kb21QaGFzZT4+NF07CisgIHBhY2tlZFNpZ24gPj49IChyYW5kb21QaGFzZSYweGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzUGVyRnJhbWUgOyBpKyspIHsKKyAgICBpZiAoKHJhbmRvbVBoYXNlICYgMHhmKSA9PSAwKSB7CisgICAgICBwYWNrZWRTaWduID0gcmFuZG9tU2lnbltyYW5kb21QaGFzZT4+NF07CisgICAgfQorCisgICAgaWYgKHBhY2tlZFNpZ24gJiAweDEpIHsKKyAgICAgIHNwZWNbaV0gPSAtc3BlY1tpXTsKKyAgICB9CisgICAgcGFja2VkU2lnbiA+Pj0gMTsKKworICAgIHJhbmRvbVBoYXNlID0gKHJhbmRvbVBoYXNlICsgMSkgJiAoQUFDX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgR2V0IGZhZGVpbmcgZmFjdG9yIGZvciBjdXJyZW50IGNvbmNlYWxtZW50IHN0YXRlLgorCisgIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmYWN0b3IgdXNlZCBmb3IgZmFkaW5nIHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBpbnRlcm5hbCBzdGF0ZS4KKworICBccmV0dXJuIEZhZGUgZmFjdG9yCisgKi8KK0ZJWFBfREJMCisgIENDb25jZWFsbWVudF9HZXRGYWRlRmFjdG9yICgKKyAgICAgIENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgICBjb25zdCBpbnQgZlByZXZpb3VzRmFjdG9yCisgICkKK3sKKyAgRklYUF9EQkwgZmFjID0gKEZJWFBfREJMKTA7CisKKyAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSA9IGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zOworCisgIGlmIChoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bWV0aG9kID4gQ29uY2VhbE1ldGhvZE11dGUpIHsKKyAgICBzd2l0Y2ggKGhDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX09rOgorICAgICAgICBmYWMgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9TaW5nbGU6CisgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgorICAgICAgICB7CisgICAgICAgICAgaW50IGlkeCA9IGhDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgLSAoKGZQcmV2aW91c0ZhY3RvciAhPSAwKSA/IDEgOiAwKTsKKyAgICAgICAgICBmYWMgPSAoaWR4IDwgMCkgPyAoRklYUF9EQkwpTUFYVkFMX0RCTCA6IEZYX1NHTDJGWF9EQkwocENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW2lkeF0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgorICAgICAgICB7CisgICAgICAgICAgaW50IGlkeCA9IGhDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKyAoKGZQcmV2aW91c0ZhY3RvciAhPSAwKSA/IDEgOiAwKTsKKyAgICAgICAgICBmYWMgPSAoaWR4ID49IGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5udW1GYWRlSW5GcmFtZXMpID8gKEZJWFBfREJMKTAgOiBGWF9TR0wyRlhfREJMKHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW2lkeF0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoZmFjKTsKK30KKworCisvKiEKKyAgXGJyaWVmIEdldCBmYWRlaW5nIGZhY3RvciBmb3IgY3VycmVudCBjb25jZWFsbWVudCBzdGF0ZS4KKworICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RhdGUgKG9rIG9yIG5vdCkgb2YgdGhlIHByZXZpb3VzIGZyYW1lLgorICBJZiBjYWxsZWQgYmVmb3JlIHRoZSBmdW5jdGlvbiBDQ29uY2VhbG1lbnRfQXBwbHkoKSBzZXQgdGhlIGZCZWZvcmVBcHBseQorICBmbGFnIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4KKworICBccmV0dXJuIEZyYW1lIE9LIGZsYWcgb2YgcHJldmlvdXMgZnJhbWUuCisgKi8KK2ludAorICBDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2sgKAorICAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkKKyAgKQoreworICBpbnQgcHJldkZyYW1lT2sgPSAxOworCisgIGlmIChoQ29uY2VhbG1lbnRJbmZvICE9IE5VTEwpIHsKKyAgICBwcmV2RnJhbWVPayA9IGhDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rW2ZCZWZvcmVBcHBseSAmIDB4MV07CisgIH0KKworICByZXR1cm4gcHJldkZyYW1lT2s7Cit9CisKKy8qIQorICBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgZnJhbWVzIGludHJvZHVjZWQgYnkgY29uY2VhbG1lbnQgdGVjaG5pcXVlLiAKKworICBccmV0dXJuIE51bWJlciBvZiBkZWxheSBmcmFtZXMuCisgKi8KK1VJTlQKKyAgQ0NvbmNlYWxtZW50X0dldERlbGF5ICgKKyAgICAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEKKyAgKQoreworICBVSU5UIGZyYW1lRGVsYXkgPSAwOworCisgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEgIT0gTlVMTCkgeworICAgIHN3aXRjaCAocENvbmNlYWxDb21tb25EYXRhLT5tZXRob2QpIHsKKyAgICBjYXNlIENvbmNlYWxNZXRob2RUb25hbDoKKyAgICBjYXNlIENvbmNlYWxNZXRob2RJbnRlcjoKKyAgICAgIGZyYW1lRGVsYXkgPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBmcmFtZURlbGF5OworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9jb25jZWFsLmggYi9hYWMvbGliQUFDZGVjL3NyYy9jb25jZWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlNjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2NvbmNlYWwuaApAQCAtMCwwICsxLDE0OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogaW5kZXBlbmRlbnQgY2hhbm5lbCBjb25jZWFsbWVudAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NPTkNFQUxfSF8KKyNkZWZpbmUgX0NPTkNFQUxfSF8KKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorCisjZGVmaW5lIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQgKCAweEZGRkUgKQorCit2b2lkIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSAgKENDb25jZWFsUGFyYW1zICAgKnBDb25jZWFsQ29tbW9uRGF0YSk7CisKK3ZvaWQgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxQYXJhbXMgICAqcENvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHNhbXBsZXNQZXJGcmFtZSk7CisKK0NDb25jZWFsbWVudE1ldGhvZAorICAgICBDQ29uY2VhbG1lbnRfR2V0TWV0aG9kICAgICAgIChDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKKworVUlOVAorICBDQ29uY2VhbG1lbnRfR2V0RGVsYXkgICAgICAgICAgIChDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKKworQUFDX0RFQ09ERVJfRVJST1IKKyAgICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcyAgICAgICAoQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGZhZGVPdXRTbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBmYWRlSW5TbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtdXRlUmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBjb21mTm9pc2VMZXZlbCk7CisKK0NDb25jZWFsbWVudFN0YXRlCisgICAgIENDb25jZWFsbWVudF9HZXRTdGF0ZSAgICAgICAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8pOworCitBQUNfREVDT0RFUl9FUlJPUgorICAgICBDQ29uY2VhbG1lbnRfU2V0QXR0ZW51YXRpb24gIChDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmZhZGVJbkF0dGVudWF0aW9uVmVjdG9yKTsKKwordm9pZCBDQ29uY2VhbG1lbnRfU3RvcmUgICAgICAgICAgIChDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICk7CisKK2ludCAgQ0NvbmNlYWxtZW50X0FwcGx5ICAgICAgICAgICAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGxhc3RMcGRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRnJhbWVPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CisKK0ZJWFBfREJMCisgICAgIENDb25jZWFsbWVudF9HZXRGYWRlRmFjdG9yICAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmUHJldmlvdXNGYWN0b3IpOworCitpbnQgIENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPayAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkpOworCisjZW5kaWYgLyogI2lmbmRlZiBfQ09OQ0VBTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmM2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9jb25jZWFsX3R5cGVzLmgKQEAgLTAsMCArMSwxNzggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRXJyb3IgY29uY2VhbG1lbnQgc3RydWN0cyBhbmQgdHlwZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTkNFQUxfVFlQRVNfSAorI2RlZmluZSBDT05DRUFMX1RZUEVTX0gKKworCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJydmxjX2luZm8uaCIKKworCisjZGVmaW5lIENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMgICAgICAoIDE2ICkKKworICNkZWZpbmUgRklYUF9DTkNMICAgICAgICBGSVhQX0RCTAorICNkZWZpbmUgRkwyRlhDT05TVF9DTkNMICBGTDJGWENPTlNUX0RCTAorICNkZWZpbmUgRlhfREJMMkZYX0NOQ0wKKyAjZGVmaW5lIEZYX0NOQ0wyRlhfREJMCisgI2RlZmluZSBDTkNMX0ZSQUNUX0JJVFMgIERGUkFDVF9CSVRTCisKKy8qIFdhcm5pbmc6IERvIG5vdCBldmVyIGNoYW5nZSB0aGVzZSB2YWx1ZXMuICovCit0eXBlZGVmIGVudW0KK3sKKyAgQ29uY2VhbE1ldGhvZE5vbmUgID0gLTEsCisgIENvbmNlYWxNZXRob2RNdXRlICA9ICAwLAorICBDb25jZWFsTWV0aG9kTm9pc2UgPSAgMSwKKyAgQ29uY2VhbE1ldGhvZEludGVyID0gIDIsCisgIENvbmNlYWxNZXRob2RUb25hbCA9ICAzCisKK30gQ0NvbmNlYWxtZW50TWV0aG9kOworCisKK3R5cGVkZWYgZW51bQoreworICBDb25jZWFsU3RhdGVfT2ssCisgIENvbmNlYWxTdGF0ZV9TaW5nbGUsCisgIENvbmNlYWxTdGF0ZV9GYWRlSW4sCisgIENvbmNlYWxTdGF0ZV9NdXRlLAorICBDb25jZWFsU3RhdGVfRmFkZU91dAorCit9IENDb25jZWFsbWVudFN0YXRlOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfU0dMICBmYWRlT3V0RmFjdG9yW0NPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlNdOworICBGSVhQX1NHTCAgZmFkZUluRmFjdG9yIFtDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTXTsKKworICBDQ29uY2VhbG1lbnRNZXRob2QgIG1ldGhvZDsKKworICBpbnQgIG51bUZhZGVPdXRGcmFtZXM7CisgIGludCAgbnVtRmFkZUluRnJhbWVzOworICBpbnQgIG51bU11dGVSZWxlYXNlRnJhbWVzOworICBpbnQgIGNvbWZvcnROb2lzZUxldmVsOworCit9IENDb25jZWFsUGFyYW1zOworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsUGFyYW1zOworCisgIEZJWFBfQ05DTCBzcGVjdHJhbENvZWZmaWNpZW50WzEwMjRdOworICBTSE9SVCAgICAgc3BlY1NjYWxlWzhdOworCisgIElOVCAgICBpUmFuZG9tUGhhc2U7CisgIElOVCAgICBwcmV2RnJhbWVPa1syXTsKKyAgSU5UICAgIGNudEZhZGVGcmFtZXM7CisgIElOVCAgICBjbnRWYWxpZEZyYW1lczsKKworICBTSE9SVCBhUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbUlZMQ19NQVhfU0ZCXTsgIC8qIG5lZWRlZCBvbmNlIHBlciBjaGFubmVsICovCisgIFVDSEFSIGFSdmxjUHJldmlvdXNDb2RlYm9va1tSVkxDX01BWF9TRkJdOyAgICAgLyogbmVlZGVkIG9uY2UgcGVyIGNoYW5uZWwgKi8KKyAgU0NIQVIgcnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSzsKKyAgU0NIQVIgcnZsY1ByZXZpb3VzQmxvY2tUeXBlOworCisKKyAgU0NIQVIgIGxhc3RSZW5kZXJNb2RlOworCisgIFVDSEFSICB3aW5kb3dTaGFwZTsKKyAgVUNIQVIgIHdpbmRvd1NlcXVlbmNlOworICBVQ0hBUiAgbGFzdFdpbkdycExlbjsKKworICBDQ29uY2VhbG1lbnRTdGF0ZSBjb25jZWFsU3RhdGU7CisKK30gQ0NvbmNlYWxtZW50SW5mbzsKKworCisjZW5kaWYgLyogI2lmbmRlZiBDT05DRUFMX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2RlYnVnLmggYi9hYWMvbGliQUFDZGVjL3NyYy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDMyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9kZWJ1Zy5oCkBAIC0wLDAgKzEsOTcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IGRlYnVnIG91dHB1dAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREVCVUdfSAorI2RlZmluZSBERUJVR19ICisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4Y2M0MQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoKKyAqICAgZmlsZW5hbWU6IGxkZmlsdGJhbmsuYworICogICBwcm9qZWN0IDogTVBFRy00IEF1ZGlvIERlY29kZXIKKyAqICAgY29udGVudHMvZGVzY3JpcHRpb246IGxvdyBkZWxheSBmaWx0ZXJiYW5rCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImxkZmlsdGJhbmsuaCIKKworCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKyNpbmNsdWRlICJtZGN0LmgiCisKKyNkZWZpbmUgTERGQl9IRUFEUk9PTSAyCisKK3N0YXRpYyB2b2lkIG11bHRFMl9EaW52Rl9mZGsoSU5UX1BDTSAqb3V0cHV0LCBGSVhQX0RCTCogeCwgY29uc3QgRklYUF9XVEIqIGZiLCBGSVhQX0RCTCogeiwgY29uc3QgaW50IE4sIGNvbnN0IGludCAgc3RyaWRlKQoreworICBpbnQgaSwgc2NhbGU7CisKKyAgLyogIHNjYWxlIGZvciBGSVhQX0RCTCAtPiBJTlRfUENNIGNvbnZlcnNpb24uICovCisgIHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpIC0gTERGQl9IRUFEUk9PTTsKKworICBmb3IoaT0wO2k8Ti80O2krKykKKyAgeworICAgIEZJWFBfREJMIHowLCB6MiwgdG1wOworCisgICAgejIgPSB4W04vMitpXTsKKyAgICB6MCA9IHoyICsgKCBmTXVsdERpdjIoeltOLzIraV0sIGZiWzIqTiArIGldKSA+PiAoLVdUUzItMSkgKTsKKworICAgIHpbTi8yK2ldID0geFtOLzItMS1pXSArICggZk11bHREaXYyKHpbTiArIGldLCBmYlsyKk4gKyBOLzIgKyBpXSkgPj4gKC1XVFMyLTEpICk7CisKKyAgICB0bXAgPSAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbTitOLzItMS1pXSkgKyBmTXVsdERpdjIoeltpXSwgZmJbTitOLzIraV0pICkgOworCisjaWYgKFNBTVBMRV9CSVRTIDw9IDE2KQorICAgIEZES19BU1NFUlQoICgtV1RTMS0xICsgc2NhbGUpID49IDApOworICAgIG91dHB1dFsoTiozLzQtMS1pKSpzdHJpZGVdID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wLCAtV1RTMS0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbHNlCisgICAgRkRLX0FTU0VSVCggKFdUUzErMSAtIHNjYWxlKSA+PSAwKTsKKyAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wLCBXVFMxKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOworI2VuZGlmCisKKyAgICB6W2ldID0gejA7CisgICAgeltOICsgaV0gPSB6MjsKKyAgfQorCisgIGZvcihpPU4vNDtpPE4vMjtpKyspCisgIHsKKyAgICBGSVhQX0RCTCB6MCwgejIsIHRtcDAsIHRtcDE7CisKKyAgICB6MiA9IHhbTi8yK2ldOworICAgIHowID0gejIgKyAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbMipOICsgaV0pID4+ICgtV1RTMi0xKSApOworCisgICAgeltOLzIraV0gPSB4W04vMi0xLWldICsgKCBmTXVsdERpdjIoeltOICsgaV0sIGZiWzIqTiArIE4vMiArIGldKSA+PiAoLVdUUzItMSkgKTsKKworICAgIHRtcDAgPSAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbTi8yLTEtaV0pICAgKyBmTXVsdERpdjIoeltpXSwgZmJbTi8yK2ldKSAgICkgOworICAgIHRtcDEgPSAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbTitOLzItMS1pXSkgKyBmTXVsdERpdjIoeltpXSwgZmJbTitOLzIraV0pICkgOworCisjaWYgKFNBTVBMRV9CSVRTIDw9IDE2KQorICAgIEZES19BU1NFUlQoICgtV1RTMC0xICsgc2NhbGUpID49IDApOworICAgIG91dHB1dFsoaS1OLzQpKnN0cmlkZV0gICAgID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wMCwgLVdUUzAtMSArIHNjYWxlLCBTQU1QTEVfQklUUyk7CisgICAgb3V0cHV0WyhOKjMvNC0xLWkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAxLCAtV1RTMS0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbHNlCisgICAgRkRLX0FTU0VSVCggKFdUUzArMSAtIHNjYWxlKSA+PSAwKTsKKyAgICBvdXRwdXRbKGktTi80KSpzdHJpZGVdICAgICA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMCwgV1RTMCsxIC0gc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMSwgV1RTMSsxIC0gc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbmRpZgorICAgIHpbaV0gPSB6MDsKKyAgICB6W04gKyBpXSA9IHoyOworICB9CisKKyAgLyogRXhjaGFuZ2UgcXVhcnRlciBwYXJ0cyBvZiB4IHRvIGJyaW5nIHRoZW0gaW4gdGhlICJyaWdodCIgb3JkZXIgKi8KKyAgZm9yKGk9MDtpPE4vNDtpKyspCisgIHsKKyAgICBGSVhQX0RCTCB0bXAwID0gZk11bHREaXYyKHpbaV0sIGZiW04vMitpXSk7CisKKyNpZiAoU0FNUExFX0JJVFMgPD0gMTYpCisgICAgRkRLX0FTU0VSVCggKC1XVFMwLTEgKyBzY2FsZSkgPj0gMCk7CisgICAgb3V0cHV0WyhOKjMvNCArIGkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAwLCAtV1RTMC0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbHNlCisgICAgRkRLX0FTU0VSVCggKFdUUzArMSAtIHNjYWxlKSA+PSAwKTsKKyAgICBvdXRwdXRbKE4qMy80ICsgaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMCwgV1RTMCsxIC0gc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbmRpZgorICB9Cit9CisKK2ludCBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrIChGSVhQX0RCTCAqbWRjdERhdGEsIGNvbnN0IGludCBtZGN0RGF0YV9lLCBJTlRfUENNICpvdXRwdXQsIEZJWFBfREJMICpmc19idWZmZXIsIGNvbnN0IGludCBzdHJpZGUsIGNvbnN0IGludCBOKSB7CisKKyAgY29uc3QgRklYUF9XVEIgKmNvZWY7CisgIEZJWFBfREJMIGdhaW4gPSAoRklYUF9EQkwpMDsKKyAgaW50IHNjYWxlID0gbWRjdERhdGFfZSArIE1EQ1RfT1VUX0hFQURST09NIC0gTERGQl9IRUFEUk9PTTsgLyogVGhlIExERkJfSEVBRFJPT00gaXMgY29tcGVuc2F0ZWQgaW5zaWRlIG11bHRFMl9EaW52Rl9mZGsoKSBiZWxvdyAqLworCisgIC8qIFNlbGVjdCBMRCB3aW5kb3cgc2xvcGUgKi8KKyAgaWYgKE4gPT0gNTEyKQorICAgIGNvZWYgPSAoRklYUF9XVEIqKUxvd0RlbGF5U3ludGhlc2lzNTEyOworICBlbHNlCisgICAgY29lZiA9IChGSVhQX1dUQiopTG93RGVsYXlTeW50aGVzaXM0ODA7CisKKyAgLyoKKyAgICAgQXBwbHkgZXhwb25lbnQgYW5kIDEvTiBmYWN0b3IuCisgICAgIE5vdGU6ICJzY2FsZSIgaXMgb2ZmIGJ5IG9uZSBiZWNhdXNlIGZvciBMRF9NRENUIHRoZSB3aW5kb3cgbGVuZ3RoIGlzIHR3aWNlCisgICAgIHRoZSB3aW5kb3cgbGVuZ3RoIG9mIGEgcmVndWxhciBNRENULiBUaGlzIGlzIGNvcnJlY3RlZCBpbnNpZGUgbXVsdEUyX0RpbnZGX2ZkaygpLgorICAgICBSZWZlciB0byBJU08vSUVDIDE0NDk2LTM6MjAwOSBwYWdlIDI3NywgY2hhcHRlciA0LjYuMjAuMiAiTG93IERlbGF5IFdpbmRvdyIuCisgICAqLworICBpbWRjdF9nYWluKCZnYWluLCAmc2NhbGUsIE4pOworCisgIGRjdF9JVihtZGN0RGF0YSwgTiwgJnNjYWxlKTsKKworICBpZiAoZ2FpbiAhPSAoRklYUF9EQkwpMCkgeworICAgIHNjYWxlVmFsdWVzV2l0aEZhY3RvcihtZGN0RGF0YSwgZ2FpbiwgTiwgc2NhbGUpOworICB9IGVsc2UgeworICAgIHNjYWxlVmFsdWVzKG1kY3REYXRhLCBOLCBzY2FsZSk7CisgIH0KKworICAvKiBTaW5jZSBhbGwgZXhwb25lbnQgYW5kIGZhY3RvcnMgaGF2ZSBiZWVuIGFwcGxpZWQsIGN1cnJlbnQgZXhwb25lbnQgaXMgemVyby4gKi8KKyAgbXVsdEUyX0RpbnZGX2ZkayhvdXRwdXQsIG1kY3REYXRhLCBjb2VmLCBmc19idWZmZXIsIE4sIHN0cmlkZSk7CisKKyAgcmV0dXJuICgxKTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjk0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmgKQEAgLTAsMCArMSwxMDkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKworICogICBmaWxlbmFtZTogbGRmaWx0YmFuay5oCisgKiAgIHByb2plY3QgOiBNUEVHLTQgQXVkaW8gRGVjb2RlcgorICogICBjb250ZW50cy9kZXNjcmlwdGlvbjogbG93IGRlbGF5IGZpbHRlcmJhbmsgaW50ZXJmYWNlCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTERGSUxUQkFOS19ICisjZGVmaW5lIF9MREZJTFRCQU5LX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworCitpbnQgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkayAoCisgICAgICAgIEZJWFBfREJMICptZGN0ZGF0YV9tLAorICAgICAgICBjb25zdCBpbnQgbWRjdGRhdGFfZSwKKyAgICAgICAgSU5UX1BDTSAqbWRjdE91dCwKKyAgICAgICAgRklYUF9EQkwgKmZzX2J1ZmZlciwKKyAgICAgICAgY29uc3QgaW50IHN0cmlkZSwKKyAgICAgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoCisgICAgICAgICk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmggYi9hYWMvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2OWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL292ZXJsYXBhZGQuaApAQCAtMCwwICsxLDEwNSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE9WRVJMQVBBRERfSAorI2RlZmluZSBPVkVSTEFQQUREX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSAgT3ZlcmxhcEJ1ZmZlclNpemUgICgxMDI0KjIpCisKK3R5cGVkZWYgRklYUF9EQkwgU1BFQ1RSVU1bMTAyNF07Cit0eXBlZGVmIEZJWFBfREJMICogU1BFQ1RSQUxfUFRSOworCisjZGVmaW5lIFNQRUNfTE9ORyhwdHIpICAgICAgIChwdHIpCisjZGVmaW5lIFNQRUMocHRyLHcsZ2wpICAgICAgKChwdHIpKygodykqKGdsKSkpCisKKworI2VuZGlmIC8qICNpZm5kZWYgT1ZFUkxBUEFERF9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJmMGVjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcApAQCAtMCwwICsxLDE1OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogcHVsc2UgZGF0YSB0b29sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInB1bHNlZGF0YS5oIgorCisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorCisKK0lOVCBDUHVsc2VEYXRhX1JlYWQoCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBDUHVsc2VEYXRhICpjb25zdCBQdWxzZURhdGEsCisgICAgICAgIGNvbnN0IFNIT1JUICpzZmJfc3RhcnRsaW5lcywKKyAgICAgICAgY29uc3Qgdm9pZCAqcEljc0luZm8sCisgICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lX2xlbmd0aAorICAgICAgICApCit7CisgIGludCBpLCBrPTA7CisgIGNvbnN0IFVJTlQgTWF4U2ZCYW5kcyA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgoQ0ljc0luZm8qKXBJY3NJbmZvKTsKKworICAvKiByZXNldCBwdWxzZSBkYXRhIGZsYWcgKi8KKyAgUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50ID0gMDsKKworICBpZiAoKFB1bHNlRGF0YS0+UHVsc2VEYXRhUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdChicykpICE9IDApIHsKKyAgICBpZiAoIUlzTG9uZ0Jsb2NrKChDSWNzSW5mbyopcEljc0luZm8pKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgfQorCisgICAgUHVsc2VEYXRhLT5OdW1iZXJQdWxzZSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisgICAgUHVsc2VEYXRhLT5QdWxzZVN0YXJ0QmFuZCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNik7CisKKyAgICBpZiAoUHVsc2VEYXRhLT5QdWxzZVN0YXJ0QmFuZCA+PSBNYXhTZkJhbmRzKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgfQorCisgICAgayA9IHNmYl9zdGFydGxpbmVzW1B1bHNlRGF0YS0+UHVsc2VTdGFydEJhbmRdOworCisgICAgZm9yIChpPTA7IGk8PVB1bHNlRGF0YS0+TnVtYmVyUHVsc2U7IGkrKykgeworICAgICAgUHVsc2VEYXRhLT5QdWxzZU9mZnNldFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNSk7CisgICAgICBQdWxzZURhdGEtPlB1bHNlQW1wW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgICAgIGsgKz0gUHVsc2VEYXRhLT5QdWxzZU9mZnNldFtpXTsKKyAgICB9CisKKyAgICBpZiAoayA+PSBmcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgIH0KKyAgfQorCisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ1B1bHNlRGF0YV9BcHBseShDUHVsc2VEYXRhICpQdWxzZURhdGEsICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBwdWxzZSBkYXRhIHNpZGUgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywgLyohPCBwb2ludGVyIHRvIHNjYWxlZmFjdG9yIGJhbmQgb2Zmc2V0cyAqLworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb2VmKSAgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBzcGVjdHJ1bSAqLworeworICBpbnQgaSxrOworCisgIGlmIChQdWxzZURhdGEtPlB1bHNlRGF0YVByZXNlbnQpCisgIHsKKyAgICBrID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbUHVsc2VEYXRhLT5QdWxzZVN0YXJ0QmFuZF07CisKKyAgICBmb3IgKGk9MDsgaTw9UHVsc2VEYXRhLT5OdW1iZXJQdWxzZTsgaSsrKQorICAgIHsKKyAgICAgIGsgKz0gUHVsc2VEYXRhLT5QdWxzZU9mZnNldFtpXTsKKyAgICAgIGlmIChjb2VmIFtrXSA+IChGSVhQX0RCTCkwKSBjb2VmW2tdICs9IChGSVhQX0RCTCkoaW50KVB1bHNlRGF0YS0+UHVsc2VBbXBbaV07CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2tdIC09IChGSVhQX0RCTCkoaW50KVB1bHNlRGF0YS0+UHVsc2VBbXBbaV07CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5N2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5oCkBAIC0wLDAgKzEsMTQ1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBwdWxzZSBkYXRhIHRvb2wKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBVTFNFREFUQV9ICisjZGVmaW5lIFBVTFNFREFUQV9ICisKKworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2RlZmluZSBOX01BWF9MSU5FUyA0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVDSEFSIFB1bHNlRGF0YVByZXNlbnQ7CisgIFVDSEFSIE51bWJlclB1bHNlOworICBVQ0hBUiBQdWxzZVN0YXJ0QmFuZDsKKyAgVUNIQVIgUHVsc2VPZmZzZXRbTl9NQVhfTElORVNdOworICBVQ0hBUiBQdWxzZUFtcFtOX01BWF9MSU5FU107Cit9IENQdWxzZURhdGE7CisKKy8qKgorICogXGJyaWVmIFJlYWQgcHVsc2UgZGF0YSBmcm9tIGJpdHN0cmVhbQorICoKKyAqIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgZWxlbWVudHMgZm9yIHB1bHNlIGRhdGEgZnJvbQorICogdGhlIGJpdHN0cmVhbS4KKyAqCisgKiBccGFyYW0gYnMgYml0IHN0cmVhbSBoYW5kbGUgZGF0YSBzb3VyY2UuCisgKiBccGFyYW0gUHVsc2VEYXRhIHBvaW50ZXIgdG8gYSBDUHVsc2VEYXRhIHdlcmUgdGhlIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBNYXhTZkJhbmRzIG1heCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzLgorICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsICE9IDAgb24gcGFyc2UgZXJyb3IuCisgKi8KK0lOVCBDUHVsc2VEYXRhX1JlYWQoCisgICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBDUHVsc2VEYXRhICpjb25zdCBQdWxzZURhdGEsCisgICAgICAgIGNvbnN0IFNIT1JUICpzZmJfc3RhcnRsaW5lcywKKyAgICAgICAgY29uc3Qgdm9pZCAqcEljc0luZm8sCisgICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lX2xlbmd0aAorICAgICAgICApOworCisvKioKKyAqIFxicmllZiBBcHBseSBwdWxzZSBkYXRhIHRvIHNwZWN0cmFsIGxpbmVzCisgKgorICogVGhlIGZ1bmN0aW9uIGFwcGxpZXMgdGhlIHB1bHNlIGRhdGEgdG8gdGhlCisgKiBzcGVjaWZpZWQgc3BlY3RyYWwgbGluZXMuCisgKgorICogXHBhcmFtIFB1bHNlRGF0YSBwb2ludGVyIHRvIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgcHVsc2UgZGF0YS4KKyAqIFxwYXJhbSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyBzY2FsZSBmYWN0b3IgYmFuZCBsaW5lIG9mZnNldCB0YWJsZS4KKyAqIFxwYXJhbSBjb2VmIHBvaW50ZXIgdG8gdGhlIHNwZWN0cmFsIGRhdGEgd2VyZSBwdWxzZSBkYXRhIHNob3VsZCBiZSBhcHBsaWVkIHRvLgorICogXHJldHVybiAgbm9uZQorKi8KK3ZvaWQgQ1B1bHNlRGF0YV9BcHBseShDUHVsc2VEYXRhICpQdWxzZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb2VmKTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBQVUxTRURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsYy5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9ydmxjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYwYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsYy5jcHAKQEAgLTAsMCArMSwxMjE1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgUlZMQyBEZWNvZGVyCisgIFxhdXRob3IgUm9iZXJ0IFdlaWRuZXIKKyovCisKKyNpbmNsdWRlICJydmxjLmgiCisKKworI2luY2x1ZGUgImJsb2NrLmgiCisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAicnZsY2JpdC5oIgorI2luY2x1ZGUgInJ2bGNjb25jZWFsLmgiCisjaW5jbHVkZSAiYWFjZGVjX2hjci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBmdW5jdGlvbjogICAgIHJ2bGNJbml0CisKKyAgICAgZGVzY3JpcHRpb246ICBpbml0IFJWTEMgYnkgZGF0YSBmcm9tIGNoYW5uZWxpbmZvLCB3aGljaCB3YXMgZGVjb2RlZCBwcmV2aW91c2x5IGFuZAorICAgICAgICAgICAgICAgICAgIHNldCB1cCBwb2ludGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgY2hhbm5lbCBpbmZvIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBiaXRzdHJlYW0gc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgIC0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYwordm9pZCBydmxjSW5pdCAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCisgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCit7CisgIC8qIFJWTEMgY29tbW9uIGluaXRpYWxpemF0aW9uIHBhcnQgMiBvZiAyICovCisgIFNIT1JUICAgICAqcFNjZkVzYyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYzsKKyAgU0hPUlQgICAgICpwU2NmRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkOworICBTSE9SVCAgICAgKnBTY2ZCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2Q7CisgIFNIT1JUICAgICAqcFNjYWxlRmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKKyAgaW50IGJuZHM7CisKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID0gMDsKKworICBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjID0gMDsKKyAgcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCA9IDA7CisgIHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QgPSAwOworCisgIHBSdmxjLT5pbnRlbnNpdHlfdXNlZCA9IDA7CisgIHBSdmxjLT5lcnJvckxvZ1J2bGMgICA9IDA7CisKKyAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gQ09OQ0VBTF9NQVhfSU5JVDsKKyAgcFJ2bGMtPmNvbmNlYWxfbWluID0gQ09OQ0VBTF9NSU5fSU5JVDsKKworICBwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID0gQ09OQ0VBTF9NQVhfSU5JVDsKKyAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IENPTkNFQUxfTUlOX0lOSVQ7CisKKyAgcFJ2bGMtPnBIdWZmVHJlZVJ2bGNFc2NhcGUgID0gYUh1ZmZUcmVlUnZsY0VzY2FwZTsKKyAgcFJ2bGMtPnBIdWZmVHJlZVJ2bENvZGV3ZHMgID0gYUh1ZmZUcmVlUnZsQ29kZXdkczsKKworICAvKiBpbml0IHNjZiBhcnJheXMgKGZvciBzYXZldHkgKGluIGNhc2Ugb2YgdGhlcmUgYXJlIG9ubHkgemVybyBjb2RlYm9va3MpKSAqLworICBmb3IgKGJuZHMgPSAwOyBibmRzIDwgUlZMQ19NQVhfU0ZCOyBibmRzKyspIHsKKyAgICBwU2NmRndkW2JuZHNdID0gMDsKKyAgICBwU2NmQndkW2JuZHNdID0gMDsKKyAgICBwU2NmRXNjW2JuZHNdID0gMDsKKyAgICBwU2NhbGVGYWN0b3JbYm5kc10gPSAwOworICB9CisKKyAgLyogc2V0IGJhc2UgYml0c3RyZWFtIHB0ciB0byB0aGUgUlZMLWNvZGVkIHBhcnQgKHN0YXJ0IG9mIFJWTEMgZGF0YSAoRVNDIDIpKSAqLworICBGREtzeW5jQ2FjaGUgKGJzKTsKKworICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QgPSBGREtnZXRCaXRDbnQoYnMpOyAvKiBmaXJzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciAgZm9yd2FyZCBkZWNvZGluZyAqLworICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxCd2QgPSBGREtnZXRCaXRDbnQoYnMpICsgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmIC0gMTsgLyogbGFzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciBiYWNrd2FyZCBkZWNvZGluZyAqLworCisgIC8qIHNraXAgUlZMQy1iaXRzdHJlYW0tcGFydCAtLSBwb2ludGluZyBub3cgdG8gZXNjYXBlcyAoaWYgcHJlc2VudCkgb3IgdG8gVE5TIGRhdGEgKGlmIHByZXNlbnQpICovCisgIEZES3B1c2hGb3IgKGJzLCBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YpOworCisgIGlmICggcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCAhPSAwICkgeworCisgICAgLyogbG9jYXRlIGludGVybmFsIGJpdHN0cmVhbSBwdHIgYXQgZXNjYXBlcyAod2hpY2ggaXMgdGhlIHNlY29uZCBwYXJ0KSAqLworICAgIEZES3N5bmNDYWNoZSAoYnMpOworICAgIHBSdmxjLT5iaXRzdHJlYW1JbmRleEVzYyA9IEZES2dldEJpdENudChicyk7CisKKyAgICAvKiBza2lwIGVzY2FwZVJWTEMtYml0c3RyZWFtLXBhcnQgLS0gcG9pbnRpbmcgdG8gVE5TIGRhdGEgKGlmIHByZXNlbnQpICAgdG8gbWFrZSBkZWNvZGVyIGNvbnRpbnVlICovCisgICAgLyogZGVjb2Rpbmcgb2YgUlZMQyBzaG91bGQgd29yayBkZXNwaXRlIHRoaXMgc2Vjb25kIHB1c2hGb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uIGJlY2F1c2UgICAgICAgICovCisgICAgLyogYml0c3RyZWFtIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkIGZvciBib3RoIEVTQzIgZGF0YSBwYXJ0cyAoUlZMLWNvZGVkIHZhbHVlcyBhbmQgRVNDLWNvZGVkIHZhbHVlcykgKi8KKyAgICBGREtwdXNoRm9yIChicywgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpOworICB9CisKKyNpZiBWRVJCT1NFX1JWTENfSU5JVAorICBEZWJ1Z091dHB1dEluaXQocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisjZW5kaWYKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBmdW5jdGlvbjogICAgIHJ2bGNDaGVja0ludGVuc2l0eUNiCisKKyAgICAgZGVzY3JpcHRpb246ICBDaGVjayBpZiBhIGludGVuc2l0eSBjb2RlYm9vayBpcyB1c2VkIGluIHRoZSBjdXJyZW50IGNoYW5uZWwuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBjaGFubmVsIGluZm8gc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBvdXRwdXQ6ICAgIC0gaW50ZW5zaXR5X3VzZWQ6IDAgbm8gaW50ZW5zaXR5IGNvZGVib29rIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGludGVuc2l0eSBjb2RlYm9vayBpcyB1c2VkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgIC0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYwordm9pZCBydmxjQ2hlY2tJbnRlbnNpdHlDYiAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQoreworICBpbnQgZ3JvdXAsIGJhbmQsIGJuZHM7CisKKyAgcFJ2bGMtPmludGVuc2l0eV91c2VkID0gMDsKKworICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgaWYgKCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKSB8fCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikgKSB7CisgICAgICAgIHBSdmxjLT5pbnRlbnNpdHlfdXNlZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0RlY29kZUVzY2FwZVdvcmQKKworICAgICBkZXNjcmlwdGlvbjogIERlY29kZSBhIGh1ZmZtYW4gY29kZWQgUlZMQyBFc2NhcGUtd29yZC4gVGhpcyB2YWx1ZSBpcyBwYXJ0IG9mIGEgRFBDTSBjb2RlZAorICAgICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9yLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAgLSBhIHNpbmdsZSBSVkxDLUVzY2FwZSB2YWx1ZSB3aGljaCBoYWQgdG8gYmUgYXBwbGllZCB0byBhIERQQ00gdmFsdWUgKHdoaWNoCisgICAgICAgICAgICAgICAgICAgICBoYXMgYSBhYnNvbHV0ZSB2YWx1ZSBvZiA3KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljCitTQ0hBUiBydmxjRGVjb2RlRXNjYXBlV29yZCAoQ0VyUnZsY0luZm8gICAgICAgICAgKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicykKK3sKKyAgaW50ICAgICAgICAgICBpOworICBTQ0hBUiAgICAgICAgIHZhbHVlOworICBVQ0hBUiAgICAgICAgIGNhcnJ5Qml0OworICBVSU5UICAgICAgICAgIHRyZWVOb2RlOworICBVSU5UICAgICAgICAgIGJyYW5jaFZhbHVlOworICBVSU5UICAgICAgICAgIGJyYW5jaE5vZGU7CisKKyAgVVNIT1JUKiAgICAgICBwQml0c3RyZWFtSW5kZXhFc2M7CisgIGNvbnN0IFVJTlQqICAgcEVzY1RyZWU7CisKKyAgcEVzY1RyZWUgPSBwUnZsYy0+cEh1ZmZUcmVlUnZsY0VzY2FwZTsKKyAgcEJpdHN0cmVhbUluZGV4RXNjID0gJihwUnZsYy0+Yml0c3RyZWFtSW5kZXhFc2MpOworICB0cmVlTm9kZSA9ICpwRXNjVHJlZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IGF0IHN0YXJ0aW5nIG5vZGUgKi8KKworICBmb3IgKGk9TUFYX0xFTl9SVkxDX0VTQ0FQRV9XT1JELTE7IGkgPj0gMDsgaS0tKSB7CisgICAgY2FycnlCaXQgPSBydmxjUmVhZEJpdEZyb21CaXRzdHJlYW0oYnMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRzdHJlYW1JbmRleEVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0QpOworCisgICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4gaHVmZm1hbiBkZWNvZGluZyB0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKworICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PSBURVNUX0JJVF8xMCkgeyAgICAgICAgICAgICAgICAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gYSBSVkxDLWVzY2FwZS13b3JkIGlzIGNvbXBsZXRlbHkgZGVjb2RlZCAqLworICAgICAgdmFsdWUgPSAoU0NIQVIpIGJyYW5jaE5vZGUgJiBDTFJfQklUXzEwOworICAgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgLT0gKE1BWF9MRU5fUlZMQ19FU0NBUEVfV09SRCAtIGkpOworCisgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPCAwKSB7CisgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9BTExfRVNDQVBFX1dPUkRTX0lOVkFMSUQ7CisgICAgICAgIHZhbHVlID0gLTE7CisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0cmVlTm9kZSA9ICoocEVzY1RyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICB9CisgIH0KKworICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfQUxMX0VTQ0FQRV9XT1JEU19JTlZBTElEOworCisgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0RlY29kZUVzY2FwZXMKKworICAgICBkZXNjcmlwdGlvbjogIERlY29kZXMgYWxsIGh1ZmZtYW4gY29kZWQgUlZMQyBFc2NhcGUgV29yZHMuCisgICAgICAgICAgICAgICAgICAgSGVyZSBhIGRpZmZlcmVuY2UgdG8gdGhlIHBzZXVkby1jb2RlLWltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgY2FuIGJlIAorICAgICAgICAgICAgICAgICAgIGZvdW5kLiBBIHdoaWxlIGxvb3AgKGFuZCBub3QgdHdvIG5lc3RlZCBmb3IgbG9vcHMpIGlzIHVzZWQgZm9yIHR3byByZWFzb25zOgorCisgICAgICAgICAgICAgICAgICAgMS4gVGhlIHBsYWluIGh1ZmZtYW4gZW5jb2RlZCBlc2NhcGVzIGFyZSBkZWNvZGVkIGJlZm9yZSB0aGUgUlZMLWNvZGVkIAorICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9ycy4gVGhlcmVmb3JlIHRoZSBlc2NhcGVzIGFyZSBwcmVzZW50IGluIHRoZSBzZWNvbmQgc3RlcCAKKyAgICAgICAgICAgICAgICAgICAgICB3aGVuIGRlY29kaW5nIHRoZSBSVkwtY29kZWQtc2NhbGVmYWN0b3IgdmFsdWVzIGluIGZvcndhcmQgYW5kIAorICAgICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkIGRpcmVjdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIFJWTC1jb2RlZCBzY2FsZWZhY3RvcnMgYXJlIGRlY29kZWQgYW5kIHRoZXJlIGEgZXNjYXBlIGlzIAorICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgdGhlbiBpdCBpcyBqdXN0IHRha2VuIG91dCBvZiB0aGUgYXJyYXkgaW4gYXNjZW5kaW5nIG9yZGVyLgorCisgICAgICAgICAgICAgICAgICAgMi4gSXQncyBmYXN0ZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC0gaGFuZGxlIHRvIEZESyBiaXRzdHJlYW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAgLSAwIG9rICAgICB0aGUgZGVjb2RlZCBlc2NhcGVzIHNlZW0gdG8gYmUgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAtIDEgZXJyb3IgIHRoZXJlIHdhcyBhIGVycm9yIGRldGVjdGVkIGR1cmluZyBkZWNvZGluZyBlc2NhcGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gYWxsIGVzY2FwZXMgYXJlIGludmFsaWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYwordm9pZCBydmxjRGVjb2RlRXNjYXBlcyAoQ0VyUnZsY0luZm8gICAgICAgICAgKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgICAgKnBFc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMpCit7CisgIFNDSEFSICBlc2NXb3JkOworICBTQ0hBUiAgZXNjQ250PTA7CisgIFNIT1JUKiBwRXNjQml0Q250U3VtOworCisgIHBFc2NCaXRDbnRTdW0gPSAmKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKTsKKworICAvKiBEZWNvZGUgYWxsIFJWTEMtRXNjYXBlIHdvcmRzIHdpdGggYSBwbGFpbiBIdWZmbWFuLURlY29kZXIgKi8KKyAgd2hpbGUgKCAqcEVzY0JpdENudFN1bSA+IDAgKSB7CisgICAgZXNjV29yZCA9IHJ2bGNEZWNvZGVFc2NhcGVXb3JkKHBSdmxjLCBicyk7CisKKyAgICBpZiAoZXNjV29yZCA+PSAwKSB7CisKKyAgICAgIHBFc2NbZXNjQ250XSA9IGVzY1dvcmQ7CisgICAgICBlc2NDbnQrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfQUxMX0VTQ0FQRV9XT1JEU19JTlZBTElEOworICAgICAgcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYyA9IGVzY0NudDsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSAvKiBhbGwgUlZMQyBlc2NhcGVzIGRlY29kZWQgKi8KKworICBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjID0gZXNjQ250OworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGZ1bmN0aW9uOiAgICAgZGVjb2RlUlZMQ29kZXdvcmQKKworICAgICBkZXNjcmlwdGlvbjogIERlY29kZXMgYSBSVkwtY29kZWQgZHBjbS13b3JkICgtcGFydCkuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpbnB1dDogICAgIC0gRkRLIGJpdHN0cmVhbSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHJldHVybjogICAgLSBhIGRwY20gdmFsdWUgd2hpY2ggaXMgd2l0aGluIHJhbmdlIFswLDEsLi4sMTRdIGluIGNhc2Ugb2Ygbm8gZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgVGhlIG9mZnNldCBvZiA3IG11c3QgYmUgc3VidHJhY3RlZCB0byBnZXQgYSB2YWxpZCBkcGNtIHNjYWxlZmFjdG9yIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBlcnJvcnMgYSBmb3JiaWRkZW4gY29kZXdvcmQgaXMgZGV0ZWN0ZWQgLS0+IHJldHVybmluZyAtMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworU0NIQVIgZGVjb2RlUlZMQ29kZXdvcmQgKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywgQ0VyUnZsY0luZm8gKnBSdmxjKQoreworICBpbnQgICAgIGk7CisgIFNDSEFSICAgdmFsdWU7CisgIFVDSEFSICAgY2FycnlCaXQ7CisgIFVJTlQgICAgYnJhbmNoVmFsdWU7CisgIFVJTlQgICAgYnJhbmNoTm9kZTsKKworICBjb25zdCBVSU5UICpwUnZsQ29kZVRyZWUgPSBwUnZsYy0+cEh1ZmZUcmVlUnZsQ29kZXdkczsKKyAgVUNIQVIgICBkaXJlY3Rpb24gICAgICAgID0gcFJ2bGMtPmRpcmVjdGlvbjsKKyAgVVNIT1JUICpwQml0c3RySW5keFJ2bCAgID0gcFJ2bGMtPnBCaXRzdHJJbmR4UnZsX1JWTDsKKyAgVUlOVCAgICB0cmVlTm9kZSAgICAgICAgID0gKnBSdmxDb2RlVHJlZTsKKworICBmb3IgKGk9TUFYX0xFTl9SVkxDX0NPREVfV09SRC0xOyBpID49IDA7IGktLSkgeyAKKyAgICBjYXJyeUJpdCA9IHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShicywgICAgICAgICAgICAgLyogZ2V0IG5leHQgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdHN0ckluZHhSdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uKTsKKworICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwgICAgICAgICAgICAgICAgICAgICAvKiBodWZmbWFuIGRlY29kaW5nLCBkbyBhIHNpbmdsZSBzdGVwIGluIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisKKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1jb2Rld29yZCBpcyBjb21wbGV0ZWx5IGRlY29kZWQgKi8KKyAgICAgIHZhbHVlID0gKFNDSEFSKSAoYnJhbmNoTm9kZSAmIENMUl9CSVRfMTApOworICAgICAgKnBSdmxjLT5wUnZsQml0Q250X1JWTCAtPSAoTUFYX0xFTl9SVkxDX0NPREVfV09SRCAtIGkpOyAgCisgICAgICAKKyAgICAgIC8qIGNoZWNrIGF2YWlsYWJsZSBiaXRzIGZvciBkZWNvZGluZyAqLworICAgICAgaWYgKCpwUnZsYy0+cFJ2bEJpdENudF9SVkwgPCAwKSB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gIEZXRCkgeyAKKyAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfUlZMX1NVTV9CSVRfQ09VTlRFUl9CRUxPV19aRVJPX0ZXRDsgfQorICAgICAgICBlbHNlIHsgCisgICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX1JWTF9TVU1fQklUX0NPVU5URVJfQkVMT1dfWkVST19CV0Q7IH0KKyAgICAgICAgdmFsdWUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2lnbmFsaXplIGFuIGVycm9yIGluIHJldHVybiB2YWx1ZSwgYmVjYXVzZSB0b28gbWFueSBiaXRzIHdhcyBkZWNvZGVkICovCisgICAgICB9CisgICAgICAKKyAgICAgIC8qIGNoZWNrIG1heCB2YWx1ZSBvZiBkcGNtIHZhbHVlICovCisgICAgICBpZiAodmFsdWUgPiBNQVhfQUxMT1dFRF9EUENNX0lOREVYKSB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gIEZXRCkgeyAKKyAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfRk9SQklEREVOX0NXX0RFVEVDVEVEX0ZXRDsgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IAorICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfQldEOyAKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWduYWxpemUgYW4gZXJyb3IgaW4gcmV0dXJuIHZhbHVlLCBiZWNhdXNlIGEgZm9yYmlkZGVuIGN3IHdhcyBkZXRlY3RlZCovCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBhIGRwY20gdmFsdWUgd2l0aCBvZmZzZXQgKzcgb3IgYW4gZXJyb3Igc3RhdHVzICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgdHJlZU5vZGUgPSAqKHBSdmxDb2RlVHJlZSArIGJyYW5jaFZhbHVlKTsgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgfQorICB9CisgIAorICByZXR1cm4gLTE7ICAKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBmdW5jdGlvbjogICAgIHJ2bGNEZWNvZGVGb3J3YXJkCisKKyAgICAgZGVzY3JpcHRpb246ICBEZWNvZGUgUlZMLWNvZGVkIGNvZGV3b3JkcyBpbiBmb3J3YXJkIGRpcmVjdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlucHV0OiAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGNoYW5uZWwgaW5mbyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAtIGhhbmRsZSB0byBGREsgYml0c3RyZWFtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgIC0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYwordm9pZCBydmxjRGVjb2RlRm9yd2FyZCAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCit7CisgIGludCBiYW5kICA9IDA7CisgIGludCBncm91cCA9IDA7CisgIGludCBibmRzICA9IDA7CisKKyAgU0hPUlQgZHBjbTsKKworICBTSE9SVCAgZmFjdG9yICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKKyAgU0hPUlQgIHBvc2l0aW9uID0gLSBTRl9PRkZTRVQ7CisgIFNIT1JUICBub2lzZW5yZyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CisKKyAgU0hPUlQqIHBTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2Q7CisgIFNIT1JUKiBwU2NmRXNjID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOworICBVQ0hBUiogcEVzY0Z3ZENudCA9ICYocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCk7CisgIAorICBwUnZsYy0+cFJ2bEJpdENudF9SVkwgPSAmKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9md2QpOworICBwUnZsYy0+cEJpdHN0ckluZHhSdmxfUlZMID0gJihwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QpOworCisgICpwRXNjRndkQ250ICAgICAgID0gMDsKKyAgcFJ2bGMtPmRpcmVjdGlvbiAgPSBGV0Q7CisgIHBSdmxjLT5ub2lzZV91c2VkID0gMDsKKyAgcFJ2bGMtPnNmX3VzZWQgICAgPSAwOworICBwUnZsYy0+bGFzdFNjZiAgICA9IDA7CisgIHBSdmxjLT5sYXN0TnJnICAgID0gMDsKKyAgcFJ2bGMtPmxhc3RJcyAgICAgPSAwOyAgICAgICAgIAorCisgIHJ2bGNDaGVja0ludGVuc2l0eUNiKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworCisgIC8qIG1haW4gbG9vcCBmd2QgbG9uZyAqLworICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworCisgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKKworICAgICAgY2FzZSBaRVJPX0hDQiA6CisgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAwOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMiA6CisgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IgIDoKKyAgICAgICAgLyogc3RvcmUgZHBjbV9pc19wb3NpdGlvbiAqLworICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKKyAgICAgICAgaWYgKCBkcGNtIDwgMCApIHsKKyAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCisgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgCisgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7CisgICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9PSBDT05DRUFMX01BWF9JTklUKSB7CisgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb3NpdGlvbiArPSBkcGNtOworICAgICAgICBwU2NmRndkW2JuZHNdID0gcG9zaXRpb247CisgICAgICAgIHBSdmxjLT5sYXN0SXMgPSBwb3NpdGlvbjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTk9JU0VfSENCIDoKKyAgICAgICAgaWYgKHBSdmxjLT5ub2lzZV91c2VkID09IDApIHsKKyAgICAgICAgICBwUnZsYy0+bm9pc2VfdXNlZCA9IDE7CisgICAgICAgICAgcFJ2bGMtPmZpcnN0X25vaXNlX2JhbmQgPSBibmRzOworICAgICAgICAgIG5vaXNlbnJnICs9IHBSdmxjLT5kcGNtX25vaXNlX25yZzsKKyAgICAgICAgICBwU2NmRndkW2JuZHNdID0gMTAwICsgbm9pc2Vucmc7ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcFJ2bGMtPmxhc3ROcmcgPSBub2lzZW5yZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKKyAgICAgICAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCisgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOyAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsgCisgICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7CisgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID0gYm5kczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBub2lzZW5yZyArPSBkcGNtOworICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAxMDAgKyBub2lzZW5yZzsKKyAgICAgICAgICBwUnZsYy0+bGFzdE5yZyA9IG5vaXNlbnJnOyAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEucG5zVXNlZFtibmRzXSA9IDE7CisgICAgICAgIGJyZWFrIDsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIHBSdmxjLT5zZl91c2VkID0gMTsKKyAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7CisgICAgICAgIGlmICggZHBjbSA8IDAgKSB7CisgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgeworICAgICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgeworICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7IAorICAgICAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjKys7IH0KKyAgICAgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqcEVzY0Z3ZENudCkrKzsKKyAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9IGJuZHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhY3RvciArPSBkcGNtOworICAgICAgICBwU2NmRndkW2JuZHNdID0gZmFjdG9yOworICAgICAgICBwUnZsYy0+bGFzdFNjZiA9IGZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogcG9zdGZldGNoIGZ3ZCBsb25nICovCisgIGlmIChwUnZsYy0+aW50ZW5zaXR5X3VzZWQpIHsKKyAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsgICAgICAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KKyAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCisgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgCisgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKKyAgICAgICAgfQorICAgICAgICAoKnBFc2NGd2RDbnQpKys7ICAKKyAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgeworICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gPSBkcGNtOworICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZnVuY3Rpb246ICAgICBydmxjRGVjb2RlQmFja3dhcmQKKworICAgICBkZXNjcmlwdGlvbjogIERlY29kZSBSVkwtY29kZWQgY29kZXdvcmRzIGluIGJhY2t3YXJkIGRpcmVjdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlucHV0OiAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGNoYW5uZWwgaW5mbyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAtIGhhbmRsZSBGREsgYml0c3RyZWFtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgIC0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYwordm9pZCBydmxjRGVjb2RlQmFja3dhcmQgKENFclJ2bGNJbmZvICAgICAgICAgICAgKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCit7CisgIFNIT1JUICBiYW5kLCBncm91cCwgZHBjbSwgb2Zmc2V0OworICBTSE9SVCAgYm5kcyA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOworCisgIFNIT1JUICBmYWN0b3IgICAgID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKKyAgU0hPUlQgIHBvc2l0aW9uICAgPSBwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUOworICBTSE9SVCAgbm9pc2VucmcgICA9IHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CisKKyAgU0hPUlQgKnBTY2ZCd2QgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2Q7CisgIFNIT1JUICpwU2NmRXNjICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOworICBVQ0hBUiAqcEVzY0VzY0NudCA9ICYocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYyk7CisgIFVDSEFSICpwRXNjQndkQ250ID0gJihwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzQndkKTsKKworICBwUnZsYy0+cFJ2bEJpdENudF9SVkwgPSAmKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9id2QpOworICBwUnZsYy0+cEJpdHN0ckluZHhSdmxfUlZMID0gJihwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxCd2QpOworCisgICpwRXNjQndkQ250ID0gMDsKKyAgcFJ2bGMtPmRpcmVjdGlvbiA9IEJXRDsKKyAgcFNjZkVzYyArPSAqcEVzY0VzY0NudCAtIDE7ICAgICAgICAgICAgIC8qIHNldCBwU2NmRXNjIHRvIGxhc3QgZW50cnkgKi8KKyAgcFJ2bGMtPmZpcnN0U2NmID0gMDsKKyAgcFJ2bGMtPmZpcnN0TnJnID0gMDsKKyAgcFJ2bGMtPmZpcnN0SXMgPSAwOworCisgIC8qIHByZWZldGNoIGxvbmcgQldEICovCisgIGlmIChwUnZsYy0+aW50ZW5zaXR5X3VzZWQpIHsKKyAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsgICAgICAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KKyAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgcFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiA9IDA7CisgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBibmRzOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKKyAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgeworICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBibmRzOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeworICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07CisgICAgICAgIH0KKyAgICAgICAgKCpwRXNjQndkQ250KSsrOyAgCisgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKKyAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gYm5kczsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uID0gZHBjbTsKKyAgfQorCisgIC8qIG1haW4gbG9vcCBsb25nIEJXRCAqLworICBmb3IgKGdyb3VwPXBSdmxjLT5udW1XaW5kb3dHcm91cHMtMTsgZ3JvdXAgPj0gMDsgZ3JvdXAtLSkgeworICAgIGZvciAoYmFuZD1wUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgaWYgKChiYW5kID09IDApICYmIChwUnZsYy0+bnVtV2luZG93R3JvdXBzICE9IDEpKQorICAgICAgICBvZmZzZXQgPSAxNiAtIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCArIDE7CisgICAgICBlbHNlCisgICAgICAgIG9mZnNldCA9IDE7CisKKyAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgeworCisgICAgICBjYXNlIFpFUk9fSENCIDoKKyAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyIDoKKyAgICAgIGNhc2UgSU5URU5TSVRZX0hDQiAgOgorICAgICAgICAvKiBzdG9yZSBkcGNtX2lzX3Bvc2l0aW9uICovCisgICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOworICAgICAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOworICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKKyAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7CisgICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7CisgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gLT0gZHBjbTsgIAorICAgICAgICBwUnZsYy0+Zmlyc3RJcyA9IHBvc2l0aW9uOyAKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTk9JU0VfSENCIDoKKyAgICAgICAgaWYgKCBibmRzID09IHBSdmxjLT5maXJzdF9ub2lzZV9iYW5kICkgeworICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgKyBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2OyAgICAgICAgIAorICAgICAgICAgIHBSdmxjLT5maXJzdE5yZyA9IHBTY2ZCd2RbYm5kc107CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7CisgICAgICAgICAgaWYgKCBkcGNtIDwgMCApIHsKKyAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKKyAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IG5vaXNlbnJnOworICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7CisgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKKyAgICAgICAgICBub2lzZW5yZyAtPSBkcGNtOworICAgICAgICAgIHBSdmxjLT5maXJzdE5yZyA9IG5vaXNlbnJnOworICAgICAgICB9CisgICAgICAgIGJyZWFrIDsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOworICAgICAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBmYWN0b3I7CisgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gZmFjdG9yOworICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKKyAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqcEVzY0J3ZENudCkrKzsKKyAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IGZhY3RvcjsKKyAgICAgICAgZmFjdG9yIC09IGRwY207CisgICAgICAgIHBSdmxjLT5maXJzdFNjZiA9IGZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZnVuY3Rpb246ICAgICBydmxjRmluYWxFcnJvckRldGVjdGlvbiAgICAgICAgICAgICAKKworICAgICBkZXNjcmlwdGlvbjogIENhbGwgUlZMQyBjb25jZWFsbWVudCBpZiBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gZGVjb2RpbmcgcHJvY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgY2hhbm5lbCBpbmZvIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcmV0dXJuOiAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMKK3ZvaWQgcnZsY0ZpbmFsRXJyb3JEZXRlY3Rpb24gKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbykKK3sKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBVQ0hBUiBFcnJvclN0YXR1c0NvbXBsZXRlICAgICAgID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNMZW5ndGhGd2QgICAgICA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGVuZ3RoQndkICAgICAgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNGaXJzdFNjZiAgICAgICA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGFzdFNjZiAgICAgICAgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0ZpcnN0TnJnICAgICAgID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNMYXN0TnJnICAgICAgICA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzRmlyc3RJcyAgICAgICAgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xhc3RJcyAgICAgICAgID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dCd2QgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c051bUVzY2FwZXNGd2QgID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkICA9IDA7CisgIFVDSEFSIENvbmNlYWxTdGF0dXMgICAgICAgICAgICAgPSAxOworICBVQ0hBUiBjdXJyZW50QmxvY2tUeXBlOyAgLyogc2hvcnQ6IDAsIG5vdCBzaG9ydDogMSovCisKKyNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCisgIENIQVIgIFN0cmF0ZWd5WzYwXT0iTm8iOworICBTSE9SVCBjb25jZWFsX21heDsKKyAgU0hPUlQgY29uY2VhbF9taW47CisjZW5kaWYKKworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMTsKKworICAvKiBpbnZhbGlkIGVzY2FwZSB3b3JkcywgYml0IGNvdW50ZXIgdW5lcXVhbCB6ZXJvLCBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgKi8KKyAgaWYgKHBSdmxjLT5lcnJvckxvZ1J2bGMgJiBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9GV0QpCisgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCA9IDE7CisKKyAgaWYgKHBSdmxjLT5lcnJvckxvZ1J2bGMgJiBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QpCisgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCA9IDE7CisKKyAgLyogYml0IGNvdW50ZXIgZm9yd2FyZCB1bmVxdWFsIHplcm8gKi8KKyAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9md2QpCisgICAgRXJyb3JTdGF0dXNMZW5ndGhGd2QgPSAxOworCisgIC8qIGJpdCBjb3VudGVyIGJhY2t3YXJkIHVuZXF1YWwgemVybyAqLworICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmX2J3ZCkKKyAgICBFcnJvclN0YXR1c0xlbmd0aEJ3ZCA9IDE7CisKKyAgLyogYml0IGNvdW50ZXIgZXNjYXBlIHNlcXVlbmNlcyB1bmVxdWFsIHplcm8gKi8KKyAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCisgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKQorICAgICAgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzID0gMTsKKworICBpZiAocFJ2bGMtPnNmX3VzZWQpIHsKKyAgICAvKiBmaXJzdCBkZWNvZGVkIHNjZiBkb2VzIG5vdCBtYXRjaCB0byBnbG9iYWwgZ2FpbiBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocFJ2bGMtPmZpcnN0U2NmICE9IChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCkgKSAKKyAgICAgIEVycm9yU3RhdHVzRmlyc3RTY2YgPSAxOworCisgICAgLyogbGFzdCBkZWNvZGVkIHNjZiBkb2VzIG5vdCBtYXRjaCB0byByZXYgZ2xvYmFsIGdhaW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocFJ2bGMtPmxhc3RTY2YgIT0gKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQpICkgCisgICAgICBFcnJvclN0YXR1c0xhc3RTY2YgPSAxOworICB9CisKKyAgaWYgKHBSdmxjLT5ub2lzZV91c2VkKSB7CisgICAgLyogZmlyc3QgZGVjb2RlZCBucmcgZG9lcyBub3QgbWF0Y2ggdG8gZHBjbV9ub2lzZV9ucmcgaW4gYmFja3dhcmQgZGlyZWN0aW9uICovCisgICAgaWYgKHBSdmxjLT5maXJzdE5yZyAhPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgLSBTRl9PRkZTRVQgLTkwIC0gMjU2KSApIAorICAgICAgRXJyb3JTdGF0dXNGaXJzdE5yZyA9IDE7CisKKyAgICAvKiBsYXN0IGRlY29kZWQgbnJnIGRvZXMgbm90IG1hdGNoIHRvIGRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiBpbiBmb3J3YXJkIGRpcmVjdGlvbiAqLworICAgIGlmIChwUnZsYy0+bGFzdE5yZyAhPSAocFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQgLSA5MCAtIDI1NikgKSAKKyAgICAgIEVycm9yU3RhdHVzTGFzdE5yZyA9IDE7CisgIH0KKworICBpZiAocFJ2bGMtPmludGVuc2l0eV91c2VkKSB7CisgICAgLyogZmlyc3QgZGVjb2RlZCBpcyBwb3NpdGlvbiBkb2VzIG5vdCBtYXRjaCBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocFJ2bGMtPmZpcnN0SXMgIT0gKC1TRl9PRkZTRVQpICkgCisgICAgICBFcnJvclN0YXR1c0ZpcnN0SXMgPSAxOworCisgICAgLyogbGFzdCBkZWNvZGVkIGlzIHBvc2l0aW9uIGRvZXMgbm90IG1hdGNoIGluIGZvcndhcmQgZGlyZWN0aW9uICovCisgICAgaWYgKHBSdmxjLT5sYXN0SXMgIT0gKHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQpICkgCisgICAgICBFcnJvclN0YXR1c0xhc3RJcyA9IDE7CisgIH0KKworICAvKiBkZWNvZGVkIGVzY2FwZXMgYW5kIHVzZWQgZXNjYXBlcyBpbiBmb3J3YXJkIGRpcmVjdGlvbiBkbyBub3QgZml0ICovCisgIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJiAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpKSB7CisgICAgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzRndkID0gMTsKKyAgfQorCisgIC8qIGRlY29kZWQgZXNjYXBlcyBhbmQgdXNlZCBlc2NhcGVzIGluIGJhY2t3YXJkIGRpcmVjdGlvbiBkbyBub3QgZml0ICovCisgIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpKSB7CisgICAgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkID0gMTsKKyAgfQorCisjaWYgVkVSQk9TRV9SVkxDX09VVFBVVAorICBjb25jZWFsX21heCA9IHBSdmxjLT5jb25jZWFsX21heDsKKyAgY29uY2VhbF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW47CisjZW5kaWYKKworICBpZiAoICAgIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcworICAgICAgfHwgKCAKKyAgICAgICAgICAgKCAgIChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgCisgICAgICAgICAgICAmJiAocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKQorICAgICAgICAgICAgJiYgKEVycm9yU3RhdHVzTGFzdFNjZiB8fCBFcnJvclN0YXR1c0xhc3ROcmcgfHwgRXJyb3JTdGF0dXNMYXN0SXMpICkKKyAgICAgICAgICAgCisgICAgICAgICAgICAmJiAKKworICAgICAgICAgICAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSAKKyAgICAgICAgICAgICYmIChwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzQndkICE9IHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpCisgICAgICAgICAgICAmJiAoRXJyb3JTdGF0dXNGaXJzdFNjZiB8fCBFcnJvclN0YXR1c0ZpcnN0TnJnIHx8IEVycm9yU3RhdHVzRmlyc3RJcykgKSAKKyAgICAgICAgICkgICAgCisgICAgICB8fCAoICAgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSAKKyAgICAgICAgICAmJiAoKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQgLSBwUnZsYy0+bGFzdFNjZikgPCAtMTUpCisgICAgICAgICApCisgICAgICB8fCAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSAKKyAgICAgICAgICAmJiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gcFJ2bGMtPmZpcnN0U2NmKSA8IC0xNSkKKyAgICAgICAgICkKKyAgICAgKSB7CisgICAgaWYgKChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgfHwgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSkgeworICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gMDsgCisgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCwgKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IEZES21pbihwUnZsYy0+Y29uY2VhbF9tYXgscFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyk7IAorICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KHBSdmxjLT5jb25jZWFsX21pbixwUnZsYy0+Y29uY2VhbF9taW5fZXNjKTsKKyAgICB9CisgIH0KKworICBFcnJvclN0YXR1c0NvbXBsZXRlID0gICAgRXJyb3JTdGF0dXNMYXN0U2NmIHx8IEVycm9yU3RhdHVzRmlyc3RTY2YgfHwgRXJyb3JTdGF0dXNMYXN0TnJnIHx8IEVycm9yU3RhdHVzRmlyc3ROcmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVycm9yU3RhdHVzTGFzdElzIHx8IEVycm9yU3RhdHVzRmlyc3RJcyB8fCBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3RndkIHx8IEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dCd2QgCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBFcnJvclN0YXR1c0xlbmd0aEZ3ZCB8fCBFcnJvclN0YXR1c0xlbmd0aEJ3ZCB8fCBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgfHwgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzRndkIAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkOworCisgIGN1cnJlbnRCbG9ja1R5cGUgPSAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgPyAwIDogMTsKKworICAgCisgIGlmICghRXJyb3JTdGF0dXNDb21wbGV0ZSkgeworICAgIGludCBiYW5kOworICAgIGludCBncm91cDsKKyAgICBpbnQgYm5kczsKKyAgICBpbnQgbGFzdFNmYkluZGV4OworCisgICAgbGFzdFNmYkluZGV4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMgPiAxKSA/IDE2IDogNjQ7CisKKyAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8cFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKQorICAgIHsKKyAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBiYW5kIDxsYXN0U2ZiSW5kZXg7IGJhbmQrKykgeworICAgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgICAgICAgRkRLX0FTU0VSVChibmRzID49IDAgJiYgYm5kcyA8IFJWTENfTUFYX1NGQik7CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPSBaRVJPX0hDQjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGJhbmQ7CisgICAgaW50IGdyb3VwOworCisgICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZCBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZworICAgICAgIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dCBqdXN0IAorICAgICAgIGFmdGVyIGRlY29kaW5nIHNvbWUgbW9yZSAod3JvbmcpIHNjYWxlZmFjdG9ycy4gVXNlIHRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBkZWNvZGluZywgYmFja3dhcmQgZGVjb2RpbmcKKyAgICAgICBhbmQgcHJldmlvdXMgZnJhbWUuICovCisgICAgaWYgKCAgICgocFJ2bGMtPmNvbmNlYWxfbWluICE9IENPTkNFQUxfTUlOX0lOSVQpIHx8IChwUnZsYy0+Y29uY2VhbF9tYXggIT0gQ09OQ0VBTF9NQVhfSU5JVCkpICYmIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAKKyAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNCbG9ja1R5cGUgPT0gY3VycmVudEJsb2NrVHlwZSkgJiYgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sKKyAgICAgICAgJiYgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICYmIENvbmNlYWxTdGF0dXMgKQorICAgIHsKKyAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cz0wOworI2lmIFZFUkJPU0VfUlZMQ19PVVRQVVQKKyAgICAgIEZES3N0cmNweShTdHJhdGVneSwiWWVzIChCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlKSIpOworI2VuZGlmCisgICAgfQorCisgICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZCBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZworICAgICAgIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dCBqdXN0IAorICAgICAgIGFmdGVyIGRlY29kaW5nIHNvbWUgbW9yZSAod3JvbmcpIHNjYWxlZmFjdG9ycy4gVXNlIHRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RpbmcuICovCisgICAgaWYgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAgJiYgKChwUnZsYy0+Y29uY2VhbF9taW4gIT0gQ09OQ0VBTF9NSU5fSU5JVCkgfHwgKHBSdmxjLT5jb25jZWFsX21heCAhPSBDT05DRUFMX01BWF9JTklUKSkKKyAgICAgICAgJiYgIShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyAmJiBwUnZsYy0+c2ZfY29uY2VhbG1lbnQgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNCbG9ja1R5cGUgPT0gY3VycmVudEJsb2NrVHlwZSkpCisgICAgICAgICYmIENvbmNlYWxTdGF0dXMgKQorICAgIHsKKyAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cz0wOworI2lmIFZFUkJPU0VfUlZMQ19PVVRQVVQKKyAgICAgIEZES3N0cmNweShTdHJhdGVneSwiWWVzIChCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lKSIpOworI2VuZGlmCisgICAgfQorCisgICAgLyogTm8gZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZXNjYXBlcyBhbmQgZHBjbSB2YWx1ZXMgaG93ZXZlciB0aGUgZmlyc3QgYW5kIGxhc3QgdmFsdWUgCisgICAgICAgb2YgYSBncm91cCAoaXMsbnJnLHNmKSBpcyBpbmNvcnJlY3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICAmJiAoKEVycm9yU3RhdHVzTGFzdFNjZiAmJiBFcnJvclN0YXR1c0ZpcnN0U2NmKSAKKyAgICAgICAgfHwgKEVycm9yU3RhdHVzTGFzdE5yZyAmJiBFcnJvclN0YXR1c0ZpcnN0TnJnKSB8fCAoRXJyb3JTdGF0dXNMYXN0SXMgJiYgRXJyb3JTdGF0dXNGaXJzdElzKSkgCisgICAgICAgICYmICEoRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCB8fCBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkIHx8IEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyApICYmIENvbmNlYWxTdGF0dXMpCisgICAgeworICAgICAgU3RhdGlzdGljYWxFc3RpbWF0aW9uIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgIENvbmNlYWxTdGF0dXM9MDsKKyNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCisgICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoU3RhdGlzdGljYWxFc3RpbWF0aW9uKSIpOworI2VuZGlmCisgICAgfQorCisgICAgLyogQSBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZyBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3YXMgZGV0ZWN0ZWQuIFVzZSB0aGUgc21hbGxlciBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgCisgICAgICAgZGVjb2RpbmcsIGJhY2t3YXJkIGRlY29kaW5nIGFuZCBwcmV2aW91cyBmcmFtZS4gKi8KKyAgICBpZiAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICYmIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LICYmIHBSdmxjLT5zZl9jb25jZWFsbWVudAorICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9PSBjdXJyZW50QmxvY2tUeXBlKSAmJiBDb25jZWFsU3RhdHVzICkKKyAgICB7CisgICAgICBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKKyAgICAgIENvbmNlYWxTdGF0dXM9MDsKKyNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCisgICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoUHJlZGljdGl2ZUludGVycG9sYXRpb24pIik7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBDYWxsIGZyYW1lIGNvbmNlYWxtZW50LCBiZWNhdXNlIG5vIGJldHRlciBzdHJhdGVneSB3YXMgZm91bmQuIFNldHRpbmcgdGhlIHNjYWxlZmFjdG9ycyB0byB6ZXJvIGlzIGRvbmUgZm9yIGRlYnVnZ2luZyAKKyAgICAgICBwdXJwb3NlcyAqLworICAgIGlmIChDb25jZWFsU3RhdHVzKSB7CisgICAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbMTYqZ3JvdXArYmFuZF0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCisgICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoRnJhbWVDb25jZWFsbWVudCkiKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisjaWYgVkVSQk9TRV9SVkxDX09VVFBVVAorICBEZWJ1Z091dHB1dERpc3RvcnRlZEJpdHN0cmVhbXMocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyxFcnJvclN0YXR1c0xlbmd0aEZ3ZCxFcnJvclN0YXR1c0xlbmd0aEJ3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyxFcnJvclN0YXR1c0ZpcnN0U2NmLEVycm9yU3RhdHVzTGFzdFNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzRmlyc3ROcmcsRXJyb3JTdGF0dXNMYXN0TnJnLEVycm9yU3RhdHVzRmlyc3RJcyxFcnJvclN0YXR1c0xhc3RJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QsRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCxFcnJvclN0YXR1c051bUVzY2FwZXNGd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c051bUVzY2FwZXNCd2QsY29uY2VhbF9tYXgsY29uY2VhbF9taW4sU3RyYXRlZ3kpOworI2VuZGlmCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZnVuY3Rpb246ICAgICBDUnZsY19SZWFkICAgICAgICAgICAgIAorCisgICAgIGRlc2NyaXB0aW9uOiAgUmVhZCBSVkxDIEVTQzEgZGF0YSAoc2lkZSBpbmZvKSBmcm9tIGJpdHN0cmVhbS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlucHV0OiAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGNoYW5uZWwgaW5mbyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgYml0c3RyZWFtIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcmV0dXJuOiAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIENSdmxjX1JlYWQgKAorICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKK3sKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworCisgIGludCAgZ3JvdXAsYmFuZDsKKworICAvKiBSVkxDIGxvbmcgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gIEluaXQgcGFydCAxIG9mIDIgKi8KKyAgcFJ2bGMtPm51bVdpbmRvd0dyb3VwcyAgID0gR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgcFJ2bGMtPm5vaXNlX3VzZWQgICAgICAgICAgICAgICA9ICAwOyAgICAgICAgICAgICAgICAgIC8qIG5vaXNlIGRldGVjdGlvbiAqLworICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgICAgICAgICAgID0gIDA7ICAgICAgICAgICAgICAgICAgLyogb25seSBmb3IgZGVidWdnaW5nICovCisgIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSAgMDsgICAgICAgICAgICAgICAgICAvKiBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KKyAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgICA9IC0xOyAvKiBkZWZhdWx0IHZhbHVlIGlzIHVzZWQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29uY2VhbG1lbnQgKi8KKworICAvKiByZWFkIG9ubHkgZXJyb3Igc2Vuc2l0aXZpdHkgY2xhc3MgMSBkYXRhIChFU0MgMSAtIGRhdGEpICovCisgIHBSdmxjLT5zZl9jb25jZWFsbWVudCAgICA9IEZES3JlYWRCaXRzKGJzLDEpOyAgICAgICAgICAgICAgICAgICAgLyogIzEgKi8KKyAgcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAgID0gRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAgICAgICAvKiAjMiAqLworCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7CisgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmID0gRkRLcmVhZEJpdHMoYnMsMTEpOyAgICAgICAgICAgICAgICAgLyogIzMgKi8KKyAgfSAgICAgICAgICAgIAorICBlbHNlIHsKKyAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgPSBGREtyZWFkQml0cyhicyw5KTsgICAgICAgICAgICAgICAgICAvKiAjMyAqLworICB9CisKKyAgLyogY2hlY2sgaWYgbm9pc2UgY29kZWJvb2sgaXMgdXNlZCAqLworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbMTYqZ3JvdXArYmFuZF0gPT0gTk9JU0VfSENCKSB7CisgICAgICAgIHBSdmxjLT5ub2lzZV91c2VkID0gMTsKKyAgICAgICAgYnJlYWs7ICAKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocFJ2bGMtPm5vaXNlX3VzZWQpIAorICAgIHBSdmxjLT5kcGNtX25vaXNlX25yZyA9IEZES3JlYWRCaXRzKGJzLCA5KTsgICAgICAgICAgICAgIC8qICM0ICBQTlMgKi8gICAgCisKKyAgcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAvKiAjNSAgICAgICovCisKKyAgaWYgKCBwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50KSB7CisgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPSBGREtyZWFkQml0cyhicywgOCk7ICAgICAgLyogIzYgICAgICAqLworICB9CisKKyAgaWYgKHBSdmxjLT5ub2lzZV91c2VkKSB7IAorICAgIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSBGREtyZWFkQml0cyhicywgOSk7ICAgIC8qICM3ICBQTlMgKi8gICAgCisgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmIC09IDk7CisgIH0KKworICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfZndkID0gcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmOworICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfYndkID0gcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIGZ1bmN0aW9uOiAgICAgQ1J2bGNfRGVjb2RlICAgICAgICAgICAgIAorCisgICAgIGRlc2NyaXB0aW9uOiAgRGVjb2RlIHJ2bGMgZGF0YQorICAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiByZWFkcyBib3RoIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCB0aGUgc2NhbGVmYWN0b3JzIGluIGZvcndhcmQKKyAgICAgICAgICAgICAgICAgICBhbmQgYmFja3dhcmQgZGlyZWN0aW9uLiBJZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBkZWNvZGluZyBwcm9jZXNzIHdoaWNoIGNhbiAKKyAgICAgICAgICAgICAgICAgICBub3QgYmUgY29uY2VhbGVkIHdpdGggdGhlIHJ2bGMgY29uY2VhbG1lbnQgZnJhbWUgY29uY2VhbG1lbnQgd2lsbCBiZSBpbml0aWF0ZWQuIAorICAgICAgICAgICAgICAgICAgIFRoZW4gdGhlIGVsZW1lbnQgInJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyIgaW4gdGhlIGRlY29kZXIgY2hhbm5lbCBpbmZvIGlzIHNldCAKKyAgICAgICAgICAgICAgICAgICB0byAwIG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gMS4gCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBjaGFubmVsIGluZm8gc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIHBlcnNpc3RlbnQgY2hhbm5lbCBpbmZvIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBiaXRzdHJlYW0gc3RydWN0dXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICByZXR1cm46ICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBDUnZsY19EZWNvZGUgKAorICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGJzCisgICAgICAgICkKK3sKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBJTlQgIGJpdENudE9mZnN0OworICBVSU5UIHNhdmVCaXRDbnQ7CisKKyAgcnZsY0luaXQocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyxicyk7ICAKKworICAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLworICBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsKKworI2lmIFJWTENfQURWQU5DRURfQklUU1RSRUFNX0VSUk9SX0dFTkVSQVRPUl9TRgorICBHZW5lcmF0ZVNpbmdsZUJpdEVycm9yKHBSdmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4UnZsRndkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisjZW5kaWYKKworI2lmIFJWTENfQURWQU5DRURfQklUU1RSRUFNX0VSUk9SX0dFTkVSQVRPUl9FU0MKKyAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCisgICAgR2VuZXJhdGVTaW5nbGVCaXRFcnJvcihwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4RXNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisjZW5kaWYKKworICBpZiAoIHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCisgICAgcnZsY0RlY29kZUVzY2FwZXMocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYywgYnMpOworCisgIHJ2bGNEZWNvZGVGb3J3YXJkKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIGJzKTsgICAgCisgIHJ2bGNEZWNvZGVCYWNrd2FyZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBicyk7CisgIHJ2bGNGaW5hbEVycm9yRGV0ZWN0aW9uKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOworCisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjSW50ZW5zaXR5VXNlZCA9IHBSdmxjLT5pbnRlbnNpdHlfdXNlZDsKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YS5QbnNBY3RpdmUgPSBwUnZsYy0+bm9pc2VfdXNlZDsKKworICAvKiByZXN0b3JlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLworICBiaXRDbnRPZmZzdCA9IHNhdmVCaXRDbnQgLSBGREtnZXRCaXRDbnQoYnMpOworICBpZiggYml0Q250T2Zmc3QgKSB7CisgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudE9mZnN0KTsKKyAgfQorfQorCit2b2lkIENSdmxjX0VsZW1lbnRDaGVjayAoCisgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAorICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICBjb25zdCBJTlQgZWxDaGFubmVscworICAgICAgICApCit7CisgIGludCBjaDsKKworICAvKiBSZXF1aXJlZCBmb3IgTVBTIHJlc2lkdWFscy4gKi8KKyAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFJWTEMgc3BlY2lmaWMgc2FuaXR5IGNoZWNrcyAqLworICBpZiAoIChmbGFncyAmIEFDX0VSX1JWTEMpICYmIChlbENoYW5uZWxzID09IDIpKSB7IC8qIHRvIGJlIHJldmlld2VkICovCisgICAgaWYgKCAoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID09IDApIHx8CisgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID09IDApICkKKyAgICAgICAgJiYgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuTXNNYXNrUHJlc2VudCAgKSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPSAwOworICAgIH0KKworICAgIGlmICggICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKQorICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAxKQorICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID09IDEpICl7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICB9CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBlbENoYW5uZWxzOyBjaCArKykKKyAgeworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID0gKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSA/IDAgOiAxOworICAgIGlmIChmbGFncyAmIEFDX0VSX1JWTEMpIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyA9IDA7CisgICAgfQorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsYy5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDVmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9ydmxjLmgKQEAgLTAsMCArMSwxMzQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBEZWZpbmVzIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgZm9yIFJWTEMKKyAgXGF1dGhvciBSb2JlcnQgV2VpZG5lcgorKi8KKworI2lmbmRlZiBSVkxDX0gKKyNkZWZpbmUgUlZMQ19ICisKKworCisjaW5jbHVkZSAiYWFjZGVjb2Rlci5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJydmxjX2luZm8uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgZXJyb3JMb2dSdmxjOiBBIHdvcmQgb2YgMzIgYml0cyB1c2VkIGZvciBsb2dnaW5nIHBvc3NpYmxlIGVycm9ycyAqLworLyogICAgICAgICAgICAgICAgICB3aXRoaW4gUlZMQyBpbiBjYXNlIG9mIGRpc3RvcnRlZCBiaXRzdHJlYW1zLiAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRCAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgIC8qICBFU0MtRGVjICBEdXJpbmcgUlZMQy1Fc2NhcGUtZGVjb2RpbmcgdGhlcmUgaGF2ZSBiZWVuIG1vcmUgYml0cyBkZWNvZGVkIGFzIHRoZXJlIGFyZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEICAgIDB4NDAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEICAgIDB4MjAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAvKiAgUlZMLURlYyAgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkIGZ3ZCAobG9uZytzaHJ0KSAqLworI2RlZmluZSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QgICAgICAgICAgICAgMHgwNDAwMDAwMCAgIC8qICBSVkwtRGVjICBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgYndkIChsb25nK3NocnQpICovCisKKworCit2b2lkIENSdmxjX1JlYWQgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKTsKKwordm9pZCBDUnZsY19EZWNvZGUgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGJzKTsKKworLyoqCisgKiBcYnJpZWYgcGVyZm9ybWUgc2FuaXR5IGNoZWNrcyB0byB0aGUgY2hhbm5lbCBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gb25lIGNoYW5uZWwgZWxlbWVudC4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvCisgKiBccGFyYW0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICogXHBhcmFtIGVsQ2hhbm5lbHMgYW1vdW50IG9mIGNoYW5uZWxzIG9mIHRoZSBjaGFubmVsIGVsZW1lbnQuCisgKi8KK3ZvaWQgQ1J2bGNfRWxlbWVudENoZWNrICgKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgIGNvbnN0IElOVCBlbENoYW5uZWxzCisgICAgICAgICk7CisKKworCisKKyNlbmRpZiAvKiBSVkxDX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY19pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5MzRhZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oCkBAIC0wLDAgKzEsMTc2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgRGVmaW5lcyBzdHJ1Y3R1cmVzIGZvciBSVkxDCisgIFxhdXRob3IgUm9iZXJ0IFdlaWRuZXIKKyovCisjaWZuZGVmIFJWTENfSU5GT19ICisjZGVmaW5lIFJWTENfSU5GT19ICisKKworCisjZGVmaW5lIEZXRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIC8qIGJpdHN0cmVhbSBkZWNvZGluZyBkaXJlY3Rpb24gZm9yd2FyZCAoUlZMIGNvZGVkIHBhcnQpICovCisjZGVmaW5lIEJXRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIC8qIGJpdHN0cmVhbSBkZWNvZGluZyBkaXJlY3Rpb24gYmFja3dhcmQgKFJWTCBjb2RlZCBwYXJ0KSAqLworCisjZGVmaW5lIE1BWF9SVkwgICAgICAgICAgICAgICAgICAgICAgIDcgICAgIC8qIHBvc2l0aXZlIFJWTEMgZXNjYXBlICovCisjZGVmaW5lIE1JTl9SVkwgICAgICAgICAgICAgICAgICAgICAgLTcgICAgIC8qIG5lZ2F0aXZlIFJWTEMgZXNjYXBlICovCisjZGVmaW5lIE1BWF9BTExPV0VEX0RQQ01fSU5ERVggICAgICAgMTQgICAgIC8qIHRoZSBtYXhpbXVtIGFsbG93ZWQgaW5kZXggb2YgYSBkZWNvZGVkIGRwY20gdmFsdWUgKG9mZnNldCAnVEFCTEVfT0ZGU0VUJyBpbmNsIC0tPiBtdXN0IGJlIHN1YnRyYWN0ZWQpICovCisjZGVmaW5lIFRBQkxFX09GRlNFVCAgICAgICAgICAgICAgICAgIDcgICAgIC8qIGRwY20gb2Zmc2V0IG9mIHZhbGlkIG91dHB1dCB2YWx1ZXMgb2YgcnZsIHRhYmxlIGRlY29kaW5nLCB0aGUgcnZsIHRhYmxlIG91bHkgcmV0dXJucyBwb3NpdGl2ZSB2YWx1ZXMsIHRoZXJlZm9yZSB0aGUgb2Zmc2V0ICovCisjZGVmaW5lIE1BWF9MRU5fUlZMQ19DT0RFX1dPUkQgICAgICAgIDkgICAgIC8qIG1heCBsZW5ndGggb2YgYSBSVkwgY29kZXdvcmQgaW4gYml0cyAqLworI2RlZmluZSBNQVhfTEVOX1JWTENfRVNDQVBFX1dPUkQgICAgIDIwICAgICAvKiBtYXggbGVuZ3RoIG9mIGh1ZmZtYW4gY29kZWQgUlZMQyBlc2NhcGUgd29yZCBpbiBiaXRzICovCisKKyNkZWZpbmUgRFBDTV9OT0lTRV9OUkdfQklUUyAgICAgICAgICAgOQorI2RlZmluZSBTRl9PRkZTRVQgICAgICAgICAgICAgICAgICAgMTAwICAgICAvKiBvZmZzZXQgZm9yIGNvcnJlY3Rpbmcgc2NmIHZhbHVlICovCisKKyNkZWZpbmUgQ09OQ0VBTF9NQVhfSU5JVCAgICAgICAgICAgMTMxMSAgICAgLyogYXJiaXRyYXJ5IHZhbHVlICovCisjZGVmaW5lIENPTkNFQUxfTUlOX0lOSVQgICAgICAgICAgLTEzMTEgICAgIC8qIGFyYml0cmFyeSB2YWx1ZSAqLworCisjZGVmaW5lIFJWTENfTUFYX1NGQiAgICAgICAgICAgICAgKCg4KSAqICgxNikpCisKKy8qIHNpZGVpbmZvIG9mIFJWTEMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIC0tLS0tLS0gRVNDIDEgRGF0YTogLS0tLS0tLS0tICovICAgICAvKiBvcmRlciBvZiBSVkxDLWJpdHN0cmVhbSBjb21wb25lbnRzIGluIGJpdHN0cmVhbSAoUlZMQy1pbml0aWFsaXphdGlvbiksIGV2ZXJ5IGNvbXBvbmVudCBhcHBlYXJzIG9ubHkgb25jZSBpbiBiaXRzdHJlYW0gKi8KKyAgSU5UICAgICAgICBzZl9jb25jZWFsbWVudDsgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgKi8KKyAgSU5UICAgICAgICByZXZfZ2xvYmFsX2dhaW47ICAgICAgICAgICAgIC8qIDIgICAgICAgICAgKi8KKyAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19zZjsgICAgICAgICAgIC8qIDMgICAgICAgICAgKi8gIC8qIG9yaWdpbmFsIHZhbHVlLCBnZXRzIG1vZGlmaWVkIChzdWJ0cmFjdCA5KSBpbiBjYXNlIG9mIG5vaXNlIChQTlMpOyBpcyBrZXB0IGZvciBsYXRlciB1c2UgKi8KKyAgSU5UICAgICAgICBkcGNtX25vaXNlX25yZzsgICAgICAgICAgICAgIC8qIDQgb3B0aW9uYWwgKi8KKyAgSU5UICAgICAgICBzZl9lc2NhcGVzX3ByZXNlbnQ7ICAgICAgICAgIC8qIDUgICAgICAgICAgKi8KKyAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19lc2NhcGVzOyAgICAgIC8qIDYgb3B0aW9uYWwgKi8KKyAgSU5UICAgICAgICBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb247ICAgIC8qIDcgb3B0aW9uYWwgKi8KKworICBJTlQgICAgICAgIGRwY21faXNfbGFzdF9wb3NpdGlvbjsKKworICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2Z3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgZm9yd2FyZCBkZWNvZGluZyAqLworICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2J3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKworICAvKiBmb3IgUlZMLUNvZGV3b3JkIGRlY29kZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmd2QgYW5kIGJ3ZCBkZWNvZGluZyAqLworICBTSE9SVCAgICAgKnBSdmxCaXRDbnRfUlZMOworICBVU0hPUlQgICAgKnBCaXRzdHJJbmR4UnZsX1JWTDsKKworICBVQ0hBUiAgICAgIG51bVdpbmRvd0dyb3VwczsKKyAgVUNIQVIgICAgICBtYXhTZmJUcmFuc21pdHRlZDsKKyAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9ncm91cDsKKyAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9iYW5kOworICBVQ0hBUiAgICAgIGRpcmVjdGlvbjsKKworICAvKiBiaXRzdHJlYW0gaW5kaWNlcyAqLworICBVU0hPUlQgICAgIGJpdHN0cmVhbUluZGV4UnZsRndkOyAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIFJWTC1jb2RlZC1zY2FsZWZhY3RvciBkYXRhIChFU0MgMikgZm9yIGZvcndhcmQgIGRlY29kaW5nICovCisgIFVTSE9SVCAgICAgYml0c3RyZWFtSW5kZXhSdmxCd2Q7ICAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgUlZMLWNvZGVkLXNjYWxlZmFjdG9yIGRhdGEgKEVTQyAyKSBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKyAgVVNIT1JUICAgICBiaXRzdHJlYW1JbmRleEVzYzsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyB3aGVyZSBSVkxDLWVzY2FwZXMgc3RhcnQgKEVTQyAyKSAqLworCisgIC8qIGRlY29kaW5nIHRyZWVzICovCisgIGNvbnN0IFVJTlQgKnBIdWZmVHJlZVJ2bENvZGV3ZHM7CisgIGNvbnN0IFVJTlQgKnBIdWZmVHJlZVJ2bGNFc2NhcGU7CisKKyAgLyogZXNjYXBlIGNvdW50ZXJzICovCisgIFVDSEFSICAgICAgbnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkOyAgICAvKiB3aGVuIGRlY29kaW5nIFJWTC1jb2RlcyBmb3J3YXJkICAqLworICBVQ0hBUiAgICAgIG51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZDsgICAgLyogd2hlbiBkZWNvZGluZyBSVkwtY29kZXMgYmFja3dhcmQgKi8KKyAgVUNIQVIgICAgICBudW1EZWNvZGVkRXNjYXBlV29yZHNFc2M7ICAgIC8qIHdoZW4gZGVjb2RpbmcgdGhlIGVzY2FwZS1Xb3JkcyAqLworCisgIFNDSEFSICAgICAgbm9pc2VfdXNlZDsKKyAgU0NIQVIgICAgICBpbnRlbnNpdHlfdXNlZDsKKyAgU0NIQVIgICAgICBzZl91c2VkOworCisgIFNIT1JUICAgICAgZmlyc3RTY2Y7CisgIFNIT1JUICAgICAgbGFzdFNjZjsKKyAgU0hPUlQgICAgICBmaXJzdE5yZzsKKyAgU0hPUlQgICAgICBsYXN0TnJnOworICBTSE9SVCAgICAgIGZpcnN0SXM7CisgIFNIT1JUICAgICAgbGFzdElzOworCisgIC8qIC0tLS0tLSBSVkxDIGVycm9yIGRldGVjdGlvbiAtLS0tLS0gKi8KKyAgVUlOVCAgICAgICBlcnJvckxvZ1J2bGM7ICAgICAgICAgICAgICAgIC8qIHN0b3JlIFJWTEMgZXJyb3JzICAqLworICBTSE9SVCAgICAgIGNvbmNlYWxfbWluOyAgICAgICAgICAgICAgICAgLyogaXMgc2V0IGF0IGJhY2t3YXJkIGRlY29kaW5nICAqLworICBTSE9SVCAgICAgIGNvbmNlYWxfbWF4OyAgICAgICAgICAgICAgICAgLyogaXMgc2V0IGF0IGZvcndhcmQgIGRlY29kaW5nICAqLworICBTSE9SVCAgICAgIGNvbmNlYWxfbWluX2VzYzsgICAgICAgICAgICAgLyogaXMgc2V0IGF0IGJhY2t3YXJkIGRlY29kaW5nICAqLworICBTSE9SVCAgICAgIGNvbmNlYWxfbWF4X2VzYzsgICAgICAgICAgICAgLyogaXMgc2V0IGF0IGZvcndhcmQgIGRlY29kaW5nICAqLworfSBDRXJSdmxjSW5mbzsKKwordHlwZWRlZiBDRXJSdmxjSW5mbyBSVkxDX0lORk87IC8qIHRlbXAgKi8KKworCisKKyNlbmRpZiAvKiBSVkxDX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9ydmxjYml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZiYjkzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBSVkxDIGJpdHN0cmVhbSByZWFkaW5nCisgIFxhdXRob3IgUm9iZXJ0IFdlaWRuZXIKKyovCisKKyNpbmNsdWRlICJydmxjYml0LmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgZnVuY3Rpb246ICAgICBydmxjUmVhZEJpdEZyb21CaXRzdHJlYW0KKworICAgICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJpdCBmcm9tIHRoZSBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvIHJlYWQgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCB2ZXJ5IG9mdGVuLCB0aGVyZWZvcmUgaXQgbWFrZXMgc2Vuc2UgdG8gaW5saW5lIGl0IChydW50aW1lKS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlucHV0OiAgICAgLSBiaXRzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAtIHBQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgIC0gcmVhZERpcmVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcmV0dXJuOiAgICAtIGJpdCBmcm9tIGJpdHN0cmVhbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVUNIQVIgcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtIChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKQoreworICBVSU5UICAgYml0OworICBJTlQgICAgcmVhZEJpdE9mZnNldCA9ICpwUG9zaXRpb24tRkRLZ2V0Qml0Q250KGJzKTsKKworICBpZiggcmVhZEJpdE9mZnNldCApIHsKKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgcmVhZEJpdE9mZnNldCk7CisgIH0KKworICBpZiAocmVhZERpcmVjdGlvbiA9PSBGV0QpIHsKKyAgICBiaXQgPSBGREtyZWFkQml0cyhicywgMSk7CisKKyAgICAqcFBvc2l0aW9uICs9IDE7CisgIH0gZWxzZSB7CisgICAgLyogdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGJyb3RoZXIgZnVuY3Rpb24gb2YgRkRLcmVhZEJpdHMoKSAqLworICAgIGJpdCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBGREtwdXNoQmFjayhicywgMik7CisKKyAgICAqcFBvc2l0aW9uIC09IDE7CisgIH0KKworICByZXR1cm4gKGJpdCk7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL3J2bGNiaXQuaCBiL2FhYy9saWJBQUNkZWMvc3JjL3J2bGNiaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZiYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5oCkBAIC0wLDAgKzEsMTAzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisgICBEZXNjcmlwdGlvbjogUlZMQyBEZWNvZGVyOiBCaXRzdHJlYW0gcmVhZGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFJWTENCSVRfSAorI2RlZmluZSBSVkxDQklUX0gKKworCisKKyNpbmNsdWRlICJydmxjLmgiCisKK1VDSEFSIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisKKworI2VuZGlmIC8qIFJWTENCSVRfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuY3BwIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzNkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5jcHAKQEAgLTAsMCArMSw2OTcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBydmxjIGNvbmNlYWxtZW50CisgIFxhdXRob3IgSm9zZWYgSG9lcGZsCisqLworCisjaW5jbHVkZSAicnZsY2NvbmNlYWwuaCIKKworCisjaW5jbHVkZSAiYmxvY2suaCIKKyNpbmNsdWRlICJydmxjLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGZ1bmN0aW9uOiAgICAgIGNhbGNSZWZWYWxGd2QKKworICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKKyAgICAgICAgICAgICAgICAgY29uY2VhbF9taW4uIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ2llcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgorICAgICAgICAgICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBpbnRlcm5zaXR5IGRhdGEKKyAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgbm9pc2UgZW5lcmd5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICByZXR1cm46ICAgICAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMKK3ZvaWQgY2FsY1JlZlZhbEZ3ZCAoQ0VyUnZsY0luZm8gKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZklzRndkLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZk5yZ0Z3ZCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZGd2QpCit7CisgIGludCBiYW5kLGJuZHMsZ3JvdXAsc3RhcnRCYW5kOworICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKKyAgaW50IGNvbmNlYWxfbWluLGNvbmNlYWxfZ3JvdXBfbWluOworICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CisKKworICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKKyAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OworICBlbHNlCisgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKKworICBjb25jZWFsX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbiAlIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOworICBjb25jZWFsX2dyb3VwX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbiAvIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOworCisgIC8qIGNhbGN1bGF0ZSBmaXJzdCByZWZlcmVuY2UgdmFsdWUgZm9yIGFwcHJvYWNoIGluIGZvcndhcmQgZGlyZWN0aW9uICovCisgIGlkSXMgPSBpZE5yZyA9IGlkU2NmID0gMTsKKworICAvKiBzZXQgcmVmZXJlbmNlIHZhbHVlcyAqLworICAqcmVmSXNGd2QgPSAtIFNGX09GRlNFVDsKKyAgKnJlZk5yZ0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CisgICpyZWZTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKKworICBzdGFydEJhbmQgPSBjb25jZWFsX21pbi0xOworICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA+PSAwOyBncm91cC0tKSB7CisgICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKKyAgICAgICAgICBpZiAoaWRJcykgeworICAgICAgICAgICAgKnJlZklzRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgICAgaWRJcz0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PSVNFX0hDQjoKKyAgICAgICAgICBpZiAoaWROcmcpIHsKKyAgICAgICAgICAgICpyZWZOcmdGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBpZE5yZz0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoaWRTY2YpIHsKKyAgICAgICAgICAgICpyZWZTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBpZFNjZj0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzdGFydEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsKKyAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGZ1bmN0aW9uOiAgICAgIGNhbGNSZWZWYWxCd2QKKworICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKKyAgICAgICAgICAgICAgICAgY29uY2VhbF9tYXguIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ2llcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgorICAgICAgICAgICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBpbnRlcm5zaXR5IGRhdGEKKyAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgbm9pc2UgZW5lcmd5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICByZXR1cm46ICAgICAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMKK3ZvaWQgY2FsY1JlZlZhbEJ3ZCAoQ0VyUnZsY0luZm8gKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZklzQndkLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZk5yZ0J3ZCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZCd2QpCit7CisgIGludCBiYW5kLGJuZHMsZ3JvdXAsc3RhcnRCYW5kOworICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKKyAgaW50IGNvbmNlYWxfbWF4LGNvbmNlYWxfZ3JvdXBfbWF4OworICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CisKKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCisgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKKyAgZWxzZQorICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CisKKyAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9ncm91cF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKworICAvKiBjYWxjdWxhdGUgZmlyc3QgcmVmZXJlbmNlIHZhbHVlIGZvciBhcHByb2FjaCBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KKyAgaWRJcyA9IGlkTnJnID0gaWRTY2YgPSAxOworCisgIC8qIHNldCByZWZlcmVuY2UgdmFsdWVzICovCisgICpyZWZJc0J3ZCA9IHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQ7CisgICpyZWZOcmdCd2QgPSBwUnZsYy0+cmV2X2dsb2JhbF9nYWluICsgcFJ2bGMtPmRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2ICsgcFJ2bGMtPmRwY21fbm9pc2VfbnJnOworICAqcmVmU2NmQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKKworICBzdGFydEJhbmQ9Y29uY2VhbF9tYXgrMTsKKworICAvKiBpZiBuZWVkZWQsIHJlLXNldCByZWZlcmVuY2UgdmFsdWVzICovCisgIGZvciAoZ3JvdXA9Y29uY2VhbF9ncm91cF9tYXg7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKKyAgICAgICAgY2FzZSBaRVJPX0hDQjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICAgIGlmIChpZElzKSB7CisgICAgICAgICAgICAqcmVmSXNCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgICBpZElzPTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTk9JU0VfSENCOgorICAgICAgICAgIGlmIChpZE5yZykgeworICAgICAgICAgICAgKnJlZk5yZ0J3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICAgIGlkTnJnPTA7ICAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoaWRTY2YpIHsKKyAgICAgICAgICAgICpyZWZTY2ZCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgICBpZFNjZj0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzdGFydEJhbmQ9MDsKKyAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZnVuY3Rpb246ICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZQorCisgIGRlc2NyaXB0aW9uOiAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgYmlkaXJlY3Rpb25hbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbgorICAgICAgICAgICAgICAgICBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlIGlzb2xhdGVkIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgJ2NvbmNlYWxfbWluJyBhbmQgJ2NvbmNlYWxfbWF4JyBhbmQgdGhlICdzZl9jb25jZWFsbWVudCcgZmxhZyBpcyBub3Qgc2V0LiBUaGUKKyAgICAgICAgICAgICAgICAgc2V0cyBvZiBzY2FsZWZhY3RvcnMgZGVjb2RlZCBpbiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gYXJlIGNvbXBhcmVkCisgICAgICAgICAgICAgICAgIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZQorICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuIFRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgc2NhbGVmYWN0b3JzIHdpdGggdGhpcyBhcHByb2FjaCBhcmNoaWV2ZQorICAgICAgICAgICAgICAgICBnb29kIHJlc3VsdHMgaW4gYXVkaW8gcXVhbGl0eS4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsCisgICAgICAgICAgICAgICAgIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YSBiZXR3ZWVuIGNvbmNlYWxfbWluIGFuZAorICAgICAgICAgICAgICAgICBjb25jZWFsX21heAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgcmV0dXJuOiAgICAgICAgLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQoreworICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIGludCBiYW5kLGJuZHMsc3RhcnRCYW5kLGVuZEJhbmQsZ3JvdXA7CisgIGludCBjb25jZWFsX21pbixjb25jZWFsX21heDsKKyAgaW50IGNvbmNlYWxfZ3JvdXBfbWluLGNvbmNlYWxfZ3JvdXBfbWF4OworICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CisKKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsKKyAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OworICB9CisgIGVsc2UgeworICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CisgIH0KKyAgCisgIC8qIElmIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBqdXN0IGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIGZvciBjb25jZWFsbWVudCB0byBhCisgICAgIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZSBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBwb3NzaWJseSAKKyAgICAgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpCisgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKKworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpCisgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CisKKyAgY29uY2VhbF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9ncm91cF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IHBSdmxjLT5jb25jZWFsX21heCkgeworCisgICAgaW50IHJlZklzRndkLHJlZk5yZ0Z3ZCxyZWZTY2ZGd2Q7CisgICAgaW50IHJlZklzQndkLHJlZk5yZ0J3ZCxyZWZTY2ZCd2Q7CisKKyAgICBibmRzID0gcFJ2bGMtPmNvbmNlYWxfbWluOworICAgIGNhbGNSZWZWYWxGd2QocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbywmcmVmSXNGd2QsJnJlZk5yZ0Z3ZCwmcmVmU2NmRndkKTsKKyAgICBjYWxjUmVmVmFsQndkKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sJnJlZklzQndkLCZyZWZOcmdCd2QsJnJlZlNjZkJ3ZCk7CisKKyAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKKyAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKKyAgICAgICAgaWYgKHJlZklzRndkIDwgcmVmSXNCd2QpIAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZJc0Z3ZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZJc0J3ZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PSVNFX0hDQjoKKyAgICAgICAgaWYgKHJlZk5yZ0Z3ZCA8IHJlZk5yZ0J3ZCkKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcmVmTnJnRndkOworICAgICAgICBlbHNlCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZk5yZ0J3ZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAocmVmU2NmRndkIDwgcmVmU2NmQndkKQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZTY2ZGd2Q7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZlNjZkJ3ZDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21heF07CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21pbl0gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWluXTsKKworICAgIC8qIGNvbnNpZGVyIHRoZSBzbWFsbGVyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHZhbHVlIGFzIHRoZSBjb3JyZWN0IG9uZSAqLyAgCisgICAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47ICAgICAgCisgICAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAgIAorICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OyAgICAgIAorICAgIGVsc2UgICAgICAgICAgCisgICAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7ICAgICAgIAorCisgICAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsgIAorICAgICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8PSBlbmRCYW5kOyBiYW5kKyspIHsgIAorICAgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsgIAorICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKSAgCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICB9ICAKKyAgICAgIHN0YXJ0QmFuZCA9IDA7ICAgCisgICAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAgCisgICAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgIAorICAgIH0gIAorICB9CisKKyAgLyogbm93IGNvcHkgYWxsIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIgd2hpY2ggbmVlZHMgbm90IHRvIGJlIGNvbmNlYWxlZCAqLworICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkgCisgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKKyAgZWxzZSAgICAgICAgCisgICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgICAgIAorICBmb3IgKGdyb3VwPTA7IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBlbmRCYW5kOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICB9CisgICAgaWYgKChncm91cCsxKSA9PSBjb25jZWFsX2dyb3VwX21pbikgCisgICAgICBlbmRCYW5kID0gY29uY2VhbF9taW47ICAgIAorICB9CisKKyAgc3RhcnRCYW5kID0gY29uY2VhbF9tYXgrMTsgICAgCisgIGZvciAoZ3JvdXA9Y29uY2VhbF9ncm91cF9tYXg7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgIH0KKyAgICBzdGFydEJhbmQgPSAwOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGZ1bmN0aW9uOiAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UKKworICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIGJpZGlyZWN0aW9uYWwgZXN0aW1hdGlvbiBpcyBnZW5lcmFsbHkgcGVyZm9ybWVkIHdoZW4KKyAgICAgICAgICAgICAgICAgYSBzaW5nbGUgYml0IGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgYml0IGVycm9yIGNhbiBiZSBpc29sYXRlZCBiZXR3ZWVuIAorICAgICAgICAgICAgICAgICAnY29uY2VhbF9taW4nIGFuZCAnY29uY2VhbF9tYXgnLCB0aGUgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzIHNldCBhbmQgdGhlIAorICAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZSBoYXMgdGhlIHNhbWUgYmxvY2sgdHlwZSBhcyB0aGUgY3VycmVudCBmcmFtZS4gVGhlIHNjYWxlZmFjdG9yIAorICAgICAgICAgICAgICAgICBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiBhbmQgdGhlIHNjYWxlZmFjdG9yIG9mIHRoZSBwcmV2aW91cyAKKyAgICAgICAgICAgICAgICAgZnJhbWUgYXJlIGNvbXBhcmVkIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZSBjb25zaWRlcmVkIAorICAgICAgICAgICAgICAgICBhcyB0aGUgY29ycmVjdCBvbmUuIEF0IHRoaXMgdGhlIGNvZGVib29rIG9mIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBmcmFtZSBtdXN0IAorICAgICAgICAgICAgICAgICBiZSBvZiB0aGUgc2FtZSBzZXQgKHNjZiwgbnJnLCBpcykgaW4gZWFjaCBzY2FsZWZhY3RvcmJhbmQuIE90aGVyd2lzZSB0aGUgCisgICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9yIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBpcyBub3QgY29uc2lkZXJlZCBpbiB0aGUgbWluaW11bSBjYWxjdWxhdGlvbi4gCisgICAgICAgICAgICAgICAgIFRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgc2NhbGVmYWN0b3JzIHdpdGggdGhpcyBhcHByb2FjaCBhcmNoaWV2ZSBnb29kIHJlc3VsdHMgCisgICAgICAgICAgICAgICAgIGluIGF1ZGlvIHF1YWxpdHkuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLCBpbnRlbnNpdHkgZGF0YSAKKyAgICAgICAgICAgICAgICAgYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhIGJldHdlZW4gY29uY2VhbF9taW4gYW5kIAorICAgICAgICAgICAgICAgICBjb25jZWFsX21heAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgcmV0dXJuOiAgICAgICAgLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlICgKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICAgICAgICApCit7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKKyAgaW50IGJhbmQsYm5kcyxzdGFydEJhbmQsZW5kQmFuZCxncm91cDsKKyAgaW50IGNvbmNlYWxfbWluLGNvbmNlYWxfbWF4OworICBpbnQgY29uY2VhbF9ncm91cF9taW4sY29uY2VhbF9ncm91cF9tYXg7CisgIGludCBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgaW50IGNvbW1vbk1pbjsKKworICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgeworICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CisgIH0KKyAgZWxzZSB7CisgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKKyAgfQorCisgIC8qIElmIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBqdXN0IGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIGZvciBjb25jZWFsbWVudCB0byBhCisgICAgIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZSBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBwb3NzaWJseSAKKyAgICAgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpCisgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKKworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpCisgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CisKKyAgY29uY2VhbF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKyAgY29uY2VhbF9ncm91cF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKKworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdOyAgCisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21pbl07ICAKKworICAvKiBjb25zaWRlciB0aGUgc21hbGxlciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCB2YWx1ZSBhcyB0aGUgY29ycmVjdCBvbmUgKi8KKyAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47ICAgIAorICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpIAorICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgICAgCisgIGVsc2UgICAgICAgIAorICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgICAgIAorCisgIGZvciAoZ3JvdXA9Y29uY2VhbF9ncm91cF9taW47IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8PSBlbmRCYW5kOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICAgIGlmICggKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IpIHx8IChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCMikgKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOT0lTRV9IQ0I6CisgICAgICAgICAgaWYgKCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1OT0lTRV9IQ0IgKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKCAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1aRVJPX0hDQikKKyAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPU5PSVNFX0hDQikKKyAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPUlOVEVOU0lUWV9IQ0IpIAorICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQjIpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhcnRCYW5kID0gMDsgCisgICAgaWYgKChncm91cCsxKSA9PSBjb25jZWFsX2dyb3VwX21heCkKKyAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsKKyAgfQorCisgIC8qIG5vdyBjb3B5IGFsbCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdoaWNoIG5lZWRzIG5vdCB0byBiZSBjb25jZWFsZWQgKi8KKyAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IDApIAorICAgIGVuZEJhbmQgPSBjb25jZWFsX21pbjsgICAgCisgIGVsc2UgICAgICAgIAorICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7ICAgICAKKyAgZm9yIChncm91cD0wOyBncm91cCA8PSBjb25jZWFsX2dyb3VwX21pbjsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgZW5kQmFuZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgfQorICAgIGlmICgoZ3JvdXArMSkgPT0gY29uY2VhbF9ncm91cF9taW4pIAorICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKKyAgfQorCisgIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWF4KzE7ICAgIAorICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICB9CisgICAgc3RhcnRCYW5kID0gMDsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBmdW5jdGlvbjogICAgICBTdGF0aXN0aWNhbEVzdGltYXRpb24KKworICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIHN0YXRpc3RpY2FsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuIAorICAgICAgICAgICAgICAgICBib3RoIHRoZSBzdGFydCB2YWx1ZSBhbmQgdGhlIGVuZCB2YWx1ZSBhcmUgZGlmZmVyZW50IGFuZCBubyBmdXJ0aGVyIGVycm9ycyBoYXZlIAorICAgICAgICAgICAgICAgICBiZWVuIGRldGVjdGVkLiBDb25zaWRlcmluZyB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCBzY2FsZWZhY3RvcnMsIHRoZSAKKyAgICAgICAgICAgICAgICAgc2V0IHdpdGggdGhlIGxvd2VyIHNjYWxlZmFjdG9ycyBpbiBzdW0gd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZS4gCisgICAgICAgICAgICAgICAgIFRoZSBzY2FsZWZhY3RvcnMgYXJlIGRpZmZlcmVudGlhbGx5IGVuY29kZWQuIE5vcm1hbGx5IGl0IHdvdWxkIHJlYWNoIHRvIGNvbXBhcmUgCisgICAgICAgICAgICAgICAgIG9uZSBwYWlyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHNjYWxlZmFjdG9ycyB0byBzcGVjaWZ5IHRoZSBsb3dlciAKKyAgICAgICAgICAgICAgICAgc2V0LiBCdXQgaGF2aW5nIGRldGVjdGVkIG5vIGZ1cnRoZXIgZXJyb3JzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGFic2VuY2UKKyAgICAgICAgICAgICAgICAgb2YgZXJyb3JzLiBUaGVyZWZvcmUgYWxsIHNjYWxlZmFjdG9ycyBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgYXJlIHN1bW1lZCB1cCBzZXBlcmF0ZWx5LiBUaGUgc2V0IHdpdGggdGhlIGxvd2VyIHN1bSB3aWxsIGJlIHVzZWQuIFRoZSBzdHJhdGVneSAKKyAgICAgICAgICAgICAgICAgbXVzdCBiZSBhcHBsaWVkIHRvIHNjYWxlZmFjdG9ycywgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICByZXR1cm46ICAgICAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFN0YXRpc3RpY2FsRXN0aW1hdGlvbiAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKK3sKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBpbnQgYmFuZCxibmRzLGdyb3VwOworICBpbnQgc3VtSXNGd2Qsc3VtSXNCd2Q7ICAgICAgICAgICAgLyogc3VtIG9mIGludGVuc2l0eSBkYXRhIGZvcndhcmQvYmFja3dhcmQgKi8KKyAgaW50IHN1bU5yZ0Z3ZCxzdW1OcmdCd2Q7ICAgICAgICAgIC8qIHN1bSBvZiBub2lzZSBlbmVyZ3kgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCisgIGludCBzdW1TY2ZGd2Qsc3VtU2NmQndkOyAgICAgICAgICAvKiBzdW0gb2Ygc2NhbGVmYWN0b3IgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCisgIGludCB1c2VJc0Z3ZCx1c2VOcmdGd2QsdXNlU2NmRndkOyAvKiB0aGUgZmxhZ3Mgc2lnbmFscyB0aGUgZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBmaW5hbCByZXN1bHQgKi8KKyAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOworCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKQorICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CisgIGVsc2UKKyAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OworCisgIHN1bUlzRndkID0gc3VtSXNCd2QgPSBzdW1OcmdGd2QgPSBzdW1OcmdCd2QgPSBzdW1TY2ZGd2QgPSBzdW1TY2ZCd2QgPSAwOworICB1c2VJc0Z3ZCA9IHVzZU5yZ0Z3ZCA9IHVzZVNjZkZ3ZCA9IDA7CisKKyAgLyogY2FsY3VsYXRlIHN1bSBvZiBlYWNoIGdyb3VwIChzY2YsbnJnLGlzKSBvZiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KKyAgZm9yIChncm91cD0wOyBncm91cDxwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKKyAgICAgICAgY2FzZSBaRVJPX0hDQjoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CisgICAgICAgICAgc3VtSXNGd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgIHN1bUlzQndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5PSVNFX0hDQjoKKyAgICAgICAgICBzdW1OcmdGd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgIHN1bU5yZ0J3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgYnJlYWsgOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc3VtU2NmRndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICBzdW1TY2ZCd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGZpbmQgZm9yIGVhY2ggZ3JvdXAgKHNjZixucmcsaXMpIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiAqLworICBpZiAoIHN1bUlzRndkIDwgc3VtSXNCd2QgKQorICAgIHVzZUlzRndkID0gMTsKKworICBpZiAoIHN1bU5yZ0Z3ZCA8IHN1bU5yZ0J3ZCApCisgICAgdXNlTnJnRndkID0gMTsKKworICBpZiAoIHN1bVNjZkZ3ZCA8IHN1bVNjZkJ3ZCApCisgICAgdXNlU2NmRndkID0gMTsKKworICAvKiBjb25jZWFsIGVhY2ggZ3JvdXAgKHNjZixucmcsaXMpICovCisgIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICAgIGlmICh1c2VJc0Z3ZCkKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5PSVNFX0hDQjoKKyAgICAgICAgICBpZiAodXNlTnJnRndkKQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmICh1c2VTY2ZGd2QpCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZGVzY3JpcHRpb246ICAgQXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBpbnRlcnBvbGF0aW9uCisgICAgICAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbiAKKyAgICAgICAgICAgICAgICAgdGhlIGVycm9yIGNhbm5vdCBiZSBpc29sYXRlZCBiZXR3ZWVuICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcsIHRoZSAKKyAgICAgICAgICAgICAgICAgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzIHNldCBhbmQgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyB0aGUgc2FtZSBibG9jayB0eXBlIAorICAgICAgICAgICAgICAgICBhcyB0aGUgY3VycmVudCBmcmFtZS4gQ2hlY2sgZm9yIGVhY2ggc2NhbGVmYWN0b3JiYW5kIGlmIHRoZSBzYW1lIHR5cGUgb2YgZGF0YSAKKyAgICAgICAgICAgICAgICAgKHNjYWxlZmFjdG9yLCBpbnRlcm5zaXR5IGRhdGEsIG5vaXNlIGVuZXJnaWVzKSBpcyB0cmFuc21pdHRlZC4gSWYgc28gdXNlIHRoZSAKKyAgICAgICAgICAgICAgICAgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGluIHRoZSBjdXJyZW50IGZyYW1lLiBPdGhlcndpc2Ugc2V0IAorICAgICAgICAgICAgICAgICB0aGUgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGZvciB0aGlzIHNjYWxlZmFjdG9yYmFuZCB0byB6ZXJvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICByZXR1cm46ICAgICAgICAtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFByZWRpY3RpdmVJbnRlcnBvbGF0aW9uICgKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICAgICAgICApCit7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKKyAgaW50IGJhbmQsYm5kcyxncm91cDsKKyAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOworICBpbnQgY29tbW9uTWluOworCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKQorICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CisgIGVsc2UKKyAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OworCisgIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICAgIGlmICggKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IpIHx8IChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCMikgKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IC0xMTA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTk9JU0VfSENCOgorICAgICAgICAgIGlmICggcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09Tk9JU0VfSENCICkgeworICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAtMTEwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmICggICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9WkVST19IQ0IpCisgICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1OT0lTRV9IQ0IpIAorICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQikgCisgICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1JTlRFTlNJVFlfSENCMikgKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjYmNkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuaApAQCAtMCwwICsxLDExMiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIHJ2bGMgY29uY2VhbG1lbnQKKyAgXGF1dGhvciBKb3NlZiBIb2VwZmwKKyovCisKKyNpZm5kZWYgUlZMQ0NPTkNFQUxfSAorI2RlZmluZSBSVkxDQ09OQ0VBTF9ICisKKworCisjaW5jbHVkZSAicnZsYy5oIgorCit2b2lkIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisKK3ZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlU2NmT2ZQcmV2RnJhbWVBc1JlZmVyZW5jZSgKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICAgICAgICApOworCit2b2lkIFN0YXRpc3RpY2FsRXN0aW1hdGlvbiAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisKK3ZvaWQgUHJlZGljdGl2ZUludGVycG9sYXRpb24gKAorICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCisgICAgICAgICk7CisKKworI2VuZGlmIC8qIFJWTENDT05DRUFMX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL3N0ZXJlby5jcHAgYi9hYWMvbGliQUFDZGVjL3NyYy9zdGVyZW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjgyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZGVjL3NyYy9zdGVyZW8uY3BwCkBAIC0wLDAgKzEsMjk3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBqb2ludCBzdGVyZW8gcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzdGVyZW8uaCIKKworCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorCitlbnVtCit7CisgIEwgPSAwLAorICBSID0gMQorfTsKKworCitpbnQgQ0pvaW50U3RlcmVvX1JlYWQoCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhLAorICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAorICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAorICAgICAgICBjb25zdCBVSU5UIGZsYWdzCisgICAgICAgICkKK3sKKyAgaW50IGdyb3VwLGJhbmQ7CisKKyAgcEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisKKyAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkLCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQqc2l6ZW9mKFVDSEFSKSk7CisKKyAgc3dpdGNoIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50KQorICB7CisgICAgY2FzZSAwIDogLyogbm8gTS9TICovCisgICAgICAvKiBhbGwgZmxhZ3MgYXJlIGFscmVhZHkgY2xlYXJlZCAqLworICAgICAgYnJlYWsgOworCisgICAgY2FzZSAxIDogLyogcmVhZCBtc191c2VkICovCisKKyAgICAgIGZvciAoZ3JvdXA9MDsgZ3JvdXA8d2luZG93R3JvdXBzOyBncm91cCsrKQorICAgICAgeworICAgICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKKyAgICAgICAgeworICAgICAgICAgIHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSB8PSAoRkRLcmVhZEJpdHMoYnMsMSkgPDwgZ3JvdXApOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhayA7CisKKyAgICBjYXNlIDIgOiAvKiBmdWxsIHNwZWN0cnVtIE0vUyAqLworCisgICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKKyAgICAgIHsKKyAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdID0gMjU1IDsgIC8qIHNldCBhbGwgZmxhZ3MgdG8gMSAqLworICAgICAgfQorICAgICAgYnJlYWsgOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5TVMoCisgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKKyAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKKyAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKKyAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwsCisgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSCisgICAgICAgICkKK3sKKyAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhOworICBpbnQgd2luZG93LCBncm91cCwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOworCisgIEZES19BU1NFUlQoc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCA9PSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSKTsKKyAgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTDsKKyAgZm9yICh3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKQorICB7CisgICAgVUNIQVIgZ3JvdXBNYXNrID0gMSA8PCBncm91cDsKKworICAgIGZvciAoaW50IGdyb3Vwd2luPTA7IGdyb3Vwd2luPHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07IGdyb3Vwd2luKyssIHdpbmRvdysrKQorICAgIHsKKyAgICAgIGludCBiYW5kOworICAgICAgRklYUF9EQkwgKmxlZnRTcGVjdHJ1bSwgKnJpZ2h0U3BlY3RydW07CisgICAgICBTSE9SVCAqbGVmdFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKKyAgICAgIFNIT1JUICpyaWdodFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKKworICAgICAgbGVmdFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAgIHJpZ2h0U3BlY3RydW0gPSBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmdyYW51bGVMZW5ndGgpOworCisgICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKKyAgICAgIHsKKyAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykKKyAgICAgICAgeworICAgICAgICAgIGludCBsU2NhbGU9bGVmdFNjYWxlW2JhbmRdOworICAgICAgICAgIGludCByU2NhbGU9cmlnaHRTY2FsZVtiYW5kXTsKKyAgICAgICAgICBpbnQgY29tbW9uU2NhbGU9bFNjYWxlID4gclNjYWxlID8gbFNjYWxlOnJTY2FsZTsKKworICAgICAgICAgIC8qIElTTy9JRUMgMTQ0OTYtMyBDaGFwdGVyIDQuNi44LjEuMSA6CisgICAgICAgICAgICAgTS9TIGpvaW50IGNoYW5uZWwgY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgaWYgY29tbW9uX3dpbmRvdyBpcyCRMZIuICovCisgICAgICAgICAgRkRLX0FTU0VSVChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbykgPT0gR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKKyAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PSBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworCisgICAgICAgICAgY29tbW9uU2NhbGUrKzsKKyAgICAgICAgICBsZWZ0U2NhbGVbYmFuZF09Y29tbW9uU2NhbGU7CisgICAgICAgICAgcmlnaHRTY2FsZVtiYW5kXT1jb21tb25TY2FsZTsKKworICAgICAgICAgIGxTY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMtMSwgY29tbW9uU2NhbGUgLSBsU2NhbGUpOworICAgICAgICAgIHJTY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMtMSwgY29tbW9uU2NhbGUgLSByU2NhbGUpOworCisgICAgICAgICAgRkRLX0FTU0VSVChsU2NhbGUgPj0gMCAmJiByU2NhbGUgPj0gMCk7CisKKyAgICAgICAgICBmb3IgKGludCBpbmRleD1wU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsgaW5kZXg8cFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCsxXTsgaW5kZXgrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQgID0gbGVmdFNwZWN0cnVtIFtpbmRleF0gOworICAgICAgICAgICAgRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudCA9IHJpZ2h0U3BlY3RydW0gW2luZGV4XSA7CisKKyAgICAgICAgICAgIGxlZnRDb2VmZmljaWVudCA+Pj0gbFNjYWxlIDsKKyAgICAgICAgICAgIHJpZ2h0Q29lZmZpY2llbnQgPj49IHJTY2FsZSA7CisKKyAgICAgICAgICAgIGxlZnRTcGVjdHJ1bSBbaW5kZXhdID0gbGVmdENvZWZmaWNpZW50ICsgcmlnaHRDb2VmZmljaWVudCA7CisgICAgICAgICAgICByaWdodFNwZWN0cnVtIFtpbmRleF0gPSBsZWZ0Q29lZmZpY2llbnQgLSByaWdodENvZWZmaWNpZW50IDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBNc1VzZWQgZmxhZ3MgaWYgbm8gZXhwbGljaXQgc2lnbmFsbGluZyB3YXMgdHJhbnNtaXR0ZWQuIE5lY2Vzc2FyeSBmb3IgaW50ZW5zaXR5IGNvZGluZy4KKyAgICAgUE5TIGNvcnJlbGF0aW9uIHNpZ25hbGxpbmcgd2FzIG1hcHBlZCBiZWZvcmUgY2FsbGluZyBDSm9pbnRTdGVyZW9fQXBwbHlNUygpLiAqLworICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9PSAyKSB7CisgICAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkLCBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqIHNpemVvZihVQ0hBUikpOworICB9Cit9CisKK3ZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5SVMoCisgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKKyAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKKyAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKKyAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKKyAgICAgICAgY29uc3QgVUlOVCBDb21tb25XaW5kb3cKKyAgICAgICAgKQoreworICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGE7CisKKyAgZm9yIChpbnQgd2luZG93PTAsZ3JvdXA9MDsgZ3JvdXA8d2luZG93R3JvdXBzOyBncm91cCsrKQorICB7CisgICAgVUNIQVIgKkNvZGVCb29rOworICAgIFNIT1JUICpTY2FsZUZhY3RvcjsKKyAgICBVQ0hBUiBncm91cE1hc2sgPSAxIDw8IGdyb3VwOworCisgICAgQ29kZUJvb2sgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFDb2RlQm9va1tncm91cCoxNl07CisgICAgU2NhbGVGYWN0b3IgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTY2FsZUZhY3Rvcltncm91cCoxNl07CisKKyAgICBmb3IgKGludCBncm91cHdpbj0wOyBncm91cHdpbjxwV2luZG93R3JvdXBMZW5ndGhbZ3JvdXBdOyBncm91cHdpbisrLCB3aW5kb3crKykKKyAgICB7CisgICAgICBGSVhQX0RCTCAqbGVmdFNwZWN0cnVtLCAqcmlnaHRTcGVjdHJ1bTsKKyAgICAgIFNIT1JUICpsZWZ0U2NhbGUgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cqMTZdOworICAgICAgU0hPUlQgKnJpZ2h0U2NhbGUgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cqMTZdOworICAgICAgaW50IGJhbmQ7CisKKyAgICAgIGxlZnRTcGVjdHJ1bSA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICByaWdodFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5ncmFudWxlTGVuZ3RoKTsKKworICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8c2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCisgICAgICB7CisgICAgICAgIGlmICgoQ29kZUJvb2sgW2JhbmRdID09IElOVEVOU0lUWV9IQ0IpIHx8CisgICAgICAgICAgICAoQ29kZUJvb2sgW2JhbmRdID09IElOVEVOU0lUWV9IQ0IyKSkKKyAgICAgICAgeworICAgICAgICAgIGludCBiYW5kU2NhbGUgPSAtKFNjYWxlRmFjdG9yIFtiYW5kXSArIDEwMCkgOworCisgICAgICAgICAgaW50IG1zYiA9IGJhbmRTY2FsZSA+PiAyIDsKKyAgICAgICAgICBpbnQgbHNiID0gYmFuZFNjYWxlICYgMHgwMyA7CisKKyAgICAgICAgICAvKiBleHBvbmVudCBvZiBNYW50aXNzYVRhYmxlW2xzYl1bMF0gaXMgMSwgdGh1cyBtc2IrMSBiZWxvdy4gKi8KKyAgICAgICAgICBGSVhQX0RCTCBzY2FsZSA9IE1hbnRpc3NhVGFibGVbbHNiXVswXTsKKworICAgICAgICAgIC8qIElTTy9JRUMgMTQ0OTYtMyBDaGFwdGVyIDQuNi44LjIuMyA6CisgICAgICAgICAgICAgVGhlIHVzZSBvZiBpbnRlbnNpdHkgc3RlcmVvIGNvZGluZyBpcyBzaWduYWxlZCBieSB0aGUgdXNlIG9mIHRoZSBwc2V1ZG8gY29kZWJvb2tzCisgICAgICAgICAgICAgSU5URU5TSVRZX0hDQiBhbmQgSU5URU5TSVRZX0hDQjIgKDE1IGFuZCAxNCkgb25seSBpbiB0aGUgcmlnaHQgY2hhbm5lbCBvZiBhCisgICAgICAgICAgICAgY2hhbm5lbF9wYWlyX2VsZW1lbnQoKSBoYXZpbmcgYSBjb21tb24gaWNzX2luZm8oKSAoY29tbW9uX3dpbmRvdyA9PSAxKS4gKi8KKyAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PSBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09IEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKSk7CisKKyAgICAgICAgICByaWdodFNjYWxlW2JhbmRdID0gbGVmdFNjYWxlW2JhbmRdK21zYisxOworCisgICAgICAgICAgaWYgKENvbW1vbldpbmRvdyAmJiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgZ3JvdXBNYXNrKSkKKyAgICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChDb2RlQm9va1tiYW5kXSA9PSBJTlRFTlNJVFlfSENCKSAvKiBfTk9UXyBpbi1waGFzZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBzY2FsZSA9IC1zY2FsZSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ29kZUJvb2tbYmFuZF0gPT0gSU5URU5TSVRZX0hDQjIpIC8qIG91dC1vZi1waGFzZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBzY2FsZSA9IC1zY2FsZSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpbnQgaW5kZXg9cFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07IGluZGV4PHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4KyspCisgICAgICAgICAgeworICAgICAgICAgICAgcmlnaHRTcGVjdHJ1bVtpbmRleF0gPSBmTXVsdChsZWZ0U3BlY3RydW1baW5kZXhdLHNjYWxlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNkZWMvc3JjL3N0ZXJlby5oIGIvYWFjL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5YjQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNkZWMvc3JjL3N0ZXJlby5oCkBAIC0wLDAgKzEsMTM0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBqb2ludCBzdGVyZW8gcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU1RFUkVPX0gKKyNkZWZpbmUgU1RFUkVPX0gKKworCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKK2VudW0KK3sKKyAgSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzID0gOCwKKyAgSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgPSA2NAorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUNIQVIgTXNNYXNrUHJlc2VudDsKKyAgVUNIQVIgTXNVc2VkW0pvaW50U3RlcmVvTWF4aW11bUJhbmRzXTsgLyohPCBldmVyeSBhcnJ5IGVsZW1lbnQgY29udGFpbnMgZmxhZ3MgZm9yIHVwIHRvIDggZ3JvdXBzICovCit9IENKb2ludFN0ZXJlb0RhdGE7CisKKworLyohCisgIFxicmllZiBSZWFkIGpvaW50IHN0ZXJlbyBkYXRhIGZyb20gYml0c3RyZWFtCisKKyAgVGhlIGZ1bmN0aW9uIHJlYWRzIGpvaW50IHN0ZXJlbyBkYXRhIGZyb20gYml0c3RyZWFtLgorCisgIFxwYXJhbSBicyBiaXQgc3RyZWFtIGhhbmRsZSBkYXRhIHNvdXJjZS4KKyAgXHBhcmFtIHBKb2ludFN0ZXJlb0RhdGEgcG9pbnRlciB0byBzdGVyZW8gZGF0YSBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZSBkZWNvZGVkIGRhdGEuCisgIFxwYXJhbSB3aW5kb3dHcm91cHMgbnVtYmVyIG9mIHdpbmRvdyBncm91cHMuCisgIFxwYXJhbSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzLgorICBccGFyYW0gZmxhZ3MgZGVjb2RlciBmbGFncworCisgIFxyZXR1cm4gIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisqLworaW50IENKb2ludFN0ZXJlb19SZWFkKAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSwKKyAgICAgICAgaW50IHdpbmRvd0dyb3VwcywKKyAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKKyAgICAgICAgVUlOVCBmbGFncworICAgICAgICApOworCisKKyNlbmRpZiAvKiAjaWZuZGVmIFNURVJFT19IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL2luY2x1ZGUvYWFjZW5jX2xpYi5oIGIvYWFjL2xpYkFBQ2VuYy9pbmNsdWRlL2FhY2VuY19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBlMWNkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9pbmNsdWRlL2FhY2VuY19saWIuaApAQCAtMCwwICsxLDEyMjUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLTQgSEUtQUFDIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogXGZpbGUgICBhYWNlbmNfbGliLmgKKyAqIFxicmllZiAgRkRLIEFBQyBFbmNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgorICoKK1xtYWlucGFnZSAgSW50cm9kdWN0aW9uCisKK1xzZWN0aW9uIFNjb3BlCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBhbmQgdXNhZ2Ugb2YgdGhlIElTTy9NUEVHLTIvNCBBQUMgRW5jb2RlcgorbGlicmFyeSBkZXZlbG9wZWQgYnkgdGhlIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIChJSVMpLgorCitUaGUgbGlicmFyeSBpbXBsZW1lbnRzIGVuY29kaW5nIG9uIHRoZSBiYXNpcyBvZiB0aGUgTVBFRy0yIGFuZCBNUEVHLTQgQUFDIExvdy1Db21wbGV4aXR5CitzdGFuZGFyZCwgYW5kIGRlcGVuZGluZyBvbiB0aGUgbGlicmFyeSdzIGNvbmZpZ3VyYXRpb24sIE1QRUctNCBIaWdoLUVmZmljaWVuY3kgQUFDIHYyIGFuZC9vciBBQUMtRUxEIHN0YW5kYXJkLgorCitBbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIG9yIEFBQy1FTEQgdmVyc2lvbnMKK29mIHRoZSBsaWJyYXJ5LiBBbGwgcmVmZXJlbmNlcyB0byBQUyAoUGFyYW1ldHJpYyBTdGVyZW8pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIHYyCit2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KKworXHNlY3Rpb24gZW5jQmFzaWNzIEVuY29kZXIgQmFzaWNzCisKK1RoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00IEFBQyBhdWRpbyBjb2RpbmcKK3N0YW5kYXJkLiBUbyB1bmRlcnN0YW5kIGFsbCB0aGUgdGVybXMgaW4gdGhpcyBkb2N1bWVudCwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHMuCisKKy0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KKy0gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgQUFDLCBzdWJwYXJ0cyAxIGFuZCA0KSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctNCBBQUMgYXVkaW8gYml0c3RyZWFtcy4KKy0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAorCitNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlIHNpZ25hbC4gVGhlIHNpZ25hbCBpcworcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cworYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC4gXG4KK0FuIE1QRUctMiBvciBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yIExheWVyLTMgKG1wMyksIHRoZQorbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aAorYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCisKKworXHBhZ2UgTElCVVNFIExpYnJhcnkgVXNhZ2UKKworXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpcHRpb24gQVBJIEZpbGVzCisKK0FsbCBBUEkgaGVhZGVyIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgL2luY2x1ZGUgb2YgdGhlIHJlbGVhc2UgcGFja2FnZS4gQWxsIGhlYWRlciBmaWxlcworYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBlbmNvZGVyIGxpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdAorYWFjZW5jX2xpYi5oLgorCitJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGVuY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZQorbGliQUFDZW5jLmEvbGliRkRLLmEgKExJTlVYKSBvciBGREtfZmFzdGFhY2xpYi5saWIgKE1TIFZpc3VhbCBDKyspIGZvciB0aGUgcGxhaW4gQUFDLUxDIGNvcmUgZW5jb2RlcgorYW5kIGxpYlNCUmVuYy5hIChMSU5VWCkgb3IgRkRLX3NickVuY0xpYi5saWIgKE1TIFZpc3VhbCBDKyspIGZvciB0aGUgU0JSIChTcGVjdHJhbCBCYW5kCitSZXBsaWNhdGlvbikgYW5kIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgbW9kdWxlcy4KKworXHNlY3Rpb24gQ2FsbGluZ1NlcXVlbmNlIENhbGxpbmcgU2VxdWVuY2UKKworRm9yIGVuY29kaW5nIG9mIElTTy9NUEVHLTIvNCBBQUMgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZCBhbmQgb3V0cHV0Cit3cml0ZSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGFuZCBjbG9zZSBmdW5jdGlvbnMgYXJlIGxlZnQgb3V0LCBzaW5jZSB0aGV5IG1heSBiZQoraW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgorbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dC4KKworLSMgQ2FsbCBhYWNFbmNPcGVuKCkgdG8gYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHJlcXVpcmVkIFxyZWYgZW5jT3BlbiAiY29uZmlndXJhdGlvbiIuXG4KK1xkb250aW5jbHVkZSBtYWluLmNwcAorXHNraXBsaW5lIGhBYWNFbmNvZGVyID0KK1xza2lwbGluZSBhYWNFbmNPcGVuCistIyBDYWxsIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmb3IgZWFjaCBwYXJhbWV0ZXIgdG8gYmUgc2V0LiBBT1QsIHNhbXBsaW5ncmF0ZSwgY2hhbm5lbE1vZGUsIGJpdHJhdGUgYW5kIHRyYW5zcG9ydCB0eXBlIGFyZSBccmVmIGVuY1BhcmFtcyAibWFuZGF0b3J5Ii4KK1xjb2RlCisgICAgRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKK1xlbmRjb2RlCistIyBDYWxsIGFhY0VuY0VuY29kZSgpIHdpdGggTlVMTCBwYXJhbWV0ZXJzIHRvIFxyZWYgZW5jUmVjb25mICJpbml0aWFsaXplIiBlbmNvZGVyIGluc3RhbmNlIHdpdGggcHJlc2VudCBwYXJhbWV0ZXIgc2V0LgorXHNraXBsaW5lIGFhY0VuY0VuY29kZQorLSMgQ2FsbCBhYWNFbmNJbmZvKCkgdG8gcmV0cmlldmUgYSBjb25maWd1cmF0aW9uIGRhdGEgYmxvY2sgdG8gYmUgdHJhbnNtaXR0ZWQgb3V0IG9mIGJhbmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBSRkMzNjQwIG9yIFJGQzMwMTYgbGlrZSB0cmFuc3BvcnQuCitcZG9udGluY2x1ZGUgbWFpbi5jcHAKK1xza2lwbGluZSBlbmNJbmZvCitcc2tpcGxpbmUgYWFjRW5jSW5mbworLSMgRW5jb2RlIGlucHV0IGF1ZGlvIGRhdGEgaW4gbG9vcC4KK1xza2lwIEVuY29kZSBhcyBsb25nIGFzCitcc2tpcGxpbmUgZG8KK1x1bnRpbCB7CitGZWVkIFxyZWYgZmVlZEluQnVmICJpbnB1dCBidWZmZXIiIHdpdGggbmV3IGF1ZGlvIGRhdGEgYW5kIHByb3ZpZGUgaW5wdXQvb3V0cHV0IFxyZWYgYnVmRGVzICJhcmd1bWVudHMiIHRvIGFhY0VuY0VuY29kZSgpLgorXHNraXBsaW5lIGFhY0VuY0VuY29kZQorXHVudGlsIDsKK1dyaXRlIFxyZWYgd3JpdGVPdXREYXRhICJvdXRwdXQgZGF0YSIgdG8gZmlsZSBvciBhdWRpbyBkZXZpY2UuIFxza2lwbGluZSB3aGlsZQorLSMgQ2FsbCBhYWNFbmNDbG9zZSgpIGFuZCBkZXN0cm95IGVuY29kZXIgaW5zdGFuY2UuCitcc2tpcGxpbmUgYWFjRW5jQ2xvc2UKKworXHNlY3Rpb24gZW5jT3BlbiBFbmNvZGVyIEluc3RhbmNlIEFsbG9jYXRpb24KKworVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KKy0gSWYgdGhlIGFtb3VudCBvZiBtZW1vcnkgY29uc3VtcHRpb24gaXMgbm90IGFuIGlzc3VlLCB0aGUgZW5jb2RlciBpbnN0YW5jZSBjYW4gYmUgYWxsb2NhdGVkCitmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIGF1ZGlvIGNoYW5uZWxzIChmb3IgZXhhbXBsZSA2IG9yIDgpIHdpdGggdGhlIGZ1bGwgZnVuY3Rpb25hbCByYW5nZSBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkuCitUaGlzIGlzIHRoZSBkZWZhdWx0IG9wZW4gcHJvY2VkdXJlIGZvciB0aGUgQUFDIGVuY29kZXIgaWYgbWVtb3J5IGNvbnN1bXB0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgbWluaW1pemVkLgorXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwwKSBcZW5kY29kZQorLSBJZiB0aGUgcmVxdWlyZWQgTVBFRy00IEFPVHMgZG8gbm90IGNhbGwgZm9yIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugb2YgdGhlIGxpYnJhcnksIGVuY29kZXIgbW9kdWxlcyBjYW4gYmUgYWxsb2NhdGVkIHNlbGVjdGl2ZWx5LgorXHZlcmJhdGltCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBQUMgfCBTQlIgfCAgUFMgfCBNRCB8ICAgICAgICAgRkxBR1MgICAgICAgICB8IHZhbHVlCistLS0tLSstLS0tLSstLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KKyAgWCAgfCAgLSAgfCAgLSAgfCAgLSB8ICgweDAxKSAgICAgICAgICAgICAgICB8ICAweDAxCisgIFggIHwgIFggIHwgIC0gIHwgIC0gfCAoMHgwMXwweDAyKSAgICAgICAgICAgfCAgMHgwMworICBYICB8ICBYICB8ICBYICB8ICAtIHwgKDB4MDF8MHgwMnwweDA0KSAgICAgIHwgIDB4MDcKKyAgWCAgfCAgLSAgfCAgLSAgfCAgWCB8ICgweDAxICAgICAgICAgIHwweDEwKSB8ICAweDExCisgIFggIHwgIFggIHwgIC0gIHwgIFggfCAoMHgwMXwweDAyICAgICB8MHgxMCkgfCAgMHgxMworICBYICB8ICBYICB8ICBYICB8ICBYIHwgKDB4MDF8MHgwMnwweDA0fDB4MTApIHwgIDB4MTcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC0gQUFDOiBBbGxvY2F0ZSBBQUMgQ29yZSBFbmNvZGVyIG1vZHVsZS4KKyAtIFNCUjogQWxsb2NhdGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiBtb2R1bGUuCisgLSBQUzogQWxsb2NhdGUgUGFyYW1ldHJpYyBTdGVyZW8gbW9kdWxlLgorIC0gTUQ6IEFsbG9jYXRlIE1ldGEgRGF0YSBtb2R1bGUgd2l0aGluIEFBQyBlbmNvZGVyLgorXGVuZHZlcmJhdGltCitcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2Rlcix2YWx1ZSwwKSBcZW5kY29kZQorLSBTcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgY2FuIGJlIGRvbmUgYXMgZm9sbG93cy4KKyAtIEZvciBleGFtcGxlIGFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2hpY2ggc3VwcG9ydHMgMiBjaGFubmVscyBmb3IgYWxsIHN1cHBvcnRlZCBBT1RzLgorICAgVGhlIGxpYnJhcnkgaXRzZWxmIG1heSBiZSBjYXBhYmxlIG9mIGVuY29kaW5nIHVwIHRvIDYgb3IgOCBjaGFubmVscyBidXQgaW4gdGhpcyBleGFtcGxlIG9ubHkgMiBjaGFubmVsIGVuY29kaW5nIGlzIHJlcXVpcmVkIGFuZCB0aHVzIG9ubHkgYnVmZmVycyBmb3IgMiBjaGFubmVscyBhcmUgYWxsb2NhdGVkIHRvIHNhdmUgZGF0YSBtZW1vcnkuCitcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDIpIFxlbmRjb2RlCisgLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4gYmUgZGVub3RlZCBzZXBhcmF0ZWx5LlxuCisgICBJbiB0aGlzIGV4YW1wbGUgdGhlIGVuY29kZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBtYXhpbXVtIG9mIDYgY2hhbm5lbHMgb3V0IG9mIHdoaWNoIHVwIHRvIDIgY2hhbm5lbHMgc3VwcG9ydCBTQlIuCisgICBUaGlzIGVuY29kZXIgaW5zdGFuY2UgY2FuIHByb2R1Y2UgZm9yIGV4YW1wbGUgNS4xIGNoYW5uZWwgQUFDLUxDIHN0cmVhbXMgb3Igc3RlcmVvIEhFLUFBQyAodjIpIHN0cmVhbXMuCisgICBIRS1BQUMgNS4xIG11bHRpIGNoYW5uZWwgaXMgbm90IHBvc3NpYmxlIHNpbmNlIG9ubHkgMiBvdXQgb2YgNiBjaGFubmVscyBzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuCitcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDZ8KDI8PDgpKSBcZW5kY29kZQorXG4KKworXHNlY3Rpb24gYnVmRGVzIElucHV0L091dHB1dCBBcmd1bWVudHMKKworXHN1YnNlY3Rpb24gYWxsb2NJT0J1ZnMgUHJvdmlkZSBCdWZmZXIgRGVzY3JpcHRvcnMKK0luIHRoZSBwcmVzZW50IGVuY29kZXIgQVBJLCB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBkZXNjcmliZWQgd2l0aCBccmVmIEFBQ0VOQ19CdWZEZXNjICJidWZmZXIgZGVzY3JpcHRvcnMiLiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgYSBmbGV4aWJsZSBoYW5kbGluZworb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHdpdGhvdXQgaW1wYWN0IHRvIHRoZSBhY3R1YWwgZW5jb2RpbmcgY2FsbC4gT3B0aW9uYWwgYnVmZmVycyBhcmUgbmVjZXNzYXJ5IGUuZy4gZm9yIGFuY2lsbGFyeSBkYXRhLCBtZXRhIGRhdGEgaW5wdXQgb3IgYWRkaXRpb25hbCBvdXRwdXQKK2J1ZmZlcnMgZGVzY3JpYmluZyBzdXBlcmZyYW1pbmcgZGF0YSBpbiBEQUIrIG9yIERSTSsuXG4KK0F0IGxlYXN0IG9uZSBpbnB1dCBidWZmZXIgZm9yIGF1ZGlvIGlucHV0IGRhdGEgYW5kIG9uZSBvdXRwdXQgYnVmZmVyIGZvciBiaXRzdHJlYW0gZGF0YSBtdXN0IGJlIGFsbG9jYXRlZC4gVGhlIGlucHV0IGJ1ZmZlciBzaXplIGNhbiBiZSBhIHVzZXIgZGVmaW5lZCBtdWx0aXBsZQorb2YgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscy4gUENNIGlucHV0IGRhdGEgd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgdXNlciBkZWZpbmVkIFBDTSBidWZmZXIgdG8gYW4gaW50ZXJuYWwgaW5wdXQgYnVmZmVyIGFuZCBzbyBpbnB1dCBkYXRhIGNhbiBiZSBsZXNzIHRoYW4gb25lIEFBQyBhdWRpbyBmcmFtZS4KK1RoZSBvdXRwdXQgYnVmZmVyIHNpemUgc2hvdWxkIGJlIDYxNDQgYml0cyBwZXIgY2hhbm5lbCBleGNsdWRpbmcgdGhlIExGRSBjaGFubmVsLgorSWYgdGhlIG91dHB1dCBkYXRhIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIsIGFuIEFBQ0VOQ19FUlJPUiB3aWxsIGJlIHJldHVybmVkIGJ5IGFhY0VuY0VuY29kZSgpLgorXGRvbnRpbmNsdWRlIG1haW4uY3BwCitcc2tpcGxpbmUgaW5wdXRCdWZmZXIKK1x1bnRpbCBvdXRwdXRCdWZmZXIKK0FsbCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGNsdXN0ZXJlZCBpbiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBhcnJheXMuCitcc2tpcGxpbmUgaW5CdWZmZXIKK1x1bnRpbCBvdXRCdWZmZXJFbFNpemUKK0FsbG9jYXRlIGJ1ZmZlciBkZXNjcmlwdG9ycworXHNraXBsaW5lIEFBQ0VOQ19CdWZEZXNjCitcc2tpcGxpbmUgQUFDRU5DX0J1ZkRlc2MKK0luaXRpYWxpemUgaW5wdXQgYnVmZmVyIGRlc2NyaXB0b3IKK1xza2lwbGluZSBpbkJ1ZkRlc2MKK1x1bnRpbCBidWZFbFNpemVzCitJbml0aWFsaXplIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvcgorXHNraXBsaW5lIG91dEJ1ZkRlc2MKK1x1bnRpbCBidWZFbFNpemVzCisKK1xzdWJzZWN0aW9uIGFyZ0xpc3RzIFByb3ZpZGUgSW5wdXQvT3V0cHV0IEFyZ3VtZW50IExpc3RzCitUaGUgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMgb2YgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbCBhcmUgZGVzY3JpYmVkIGluIGFyZ3VtZW50IHN0cnVjdHVyZXMuCitcZG9udGluY2x1ZGUgbWFpbi5jcHAKK1xza2lwbGluZSBBQUNFTkNfSW5BcmdzCitcc2tpcGxpbmUgQUFDRU5DX091dEFyZ3MKKworXHNlY3Rpb24gZmVlZEluQnVmIEZlZWQgSW5wdXQgQnVmZmVyCitUaGUgaW5wdXQgYnVmZmVyIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEgbW9kdWxvIGJ1ZmZlci4gTmV3IGF1ZGlvIGRhdGEgaW4gdGhlIGZvcm0gb2YgcHVsc2UtY29kZS0KK21vZHVsYXRlZCBzYW1wbGVzIChQQ00pIG11c3QgYmUgcmVhZCBmcm9tIGV4dGVybmFsIGFuZCBiZSBmZWQgdG8gdGhlIGlucHV0IGJ1ZmZlciBkZXBlbmRpbmcgb24gaXRzCitmaWxsIGxldmVsLiBUaGUgcmVxdWlyZWQgc2FtcGxlIGJpdHJhdGUgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhIHR5cGUgSU5UX1BDTSB3aGljaCBpcyAxNiwgMjQgb3IgMzIKK2JpdHMgd2lkZSkgaXMgZml4ZWQgYW5kIGRlcGVuZHMgb24gbGlicmFyeSBjb25maWd1cmF0aW9uICh1c3VhbGx5IDE2IGJpdCkuCisKK1xkb250aW5jbHVkZSBtYWluLmNwcAorXHNraXBsaW5lIFdBVl9JbnB1dFJlYWQKK1x1bnRpbCA7CitBZnRlciB0aGUgZW5jb2RlcidzIGludGVybmFsIGJ1ZmZlciBpcyBmZWQgd2l0aCBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLCBhbmQgYWFjRW5jRW5jb2RlKCkKK3Byb2Nlc3NlZCB0aGUgbmV3IGlucHV0IGRhdGEsIHVwZGF0ZS9tb3ZlIHJlbWFpbmluZyBzYW1wbGVzIGluIGlucHV0IGJ1ZmZlciwgc2ltdWxhdGluZyBhIG1vZHVsbyBidWZmZXI6Citcc2tpcGxpbmUgb3V0YXJncy5udW1JblNhbXBsZXM+MAorXHVudGlsIH0KKworXHNlY3Rpb24gd3JpdGVPdXREYXRhIE91dHB1dCBCaXRzdHJlYW0gRGF0YQorSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHRoZQorZm9sbG93aW5nIGNvbmRpdGlvbiBpcyB0cnVlOgorXGRvbnRpbmNsdWRlIG1haW4uY3BwCitcc2tpcCBWYWxpZCBiaXRzdHJlYW0gYXZhaWxhYmxlCitcc2tpcGxpbmUgb3V0YXJncworCitcc2tpcGxpbmUgb3V0Qnl0ZXM+MAorCitJZiB5b3UgdXNlIGZpbGUgSS9PIHRoZW4gZm9yIGV4YW1wbGUgY2FsbCBtcGVnRmlsZVdyaXRlX1dyaXRlKCkgZnJvbSB0aGUgbGlicmFyeSBsaWJNcGVnRmlsZVdyaXRlCisKK1xkb250aW5jbHVkZSBtYWluLmNwcAorXHNraXBsaW5lIG1wZWdGaWxlV3JpdGVfV3JpdGUKKworXHNlY3Rpb24gY2ZnTWV0YURhdGEgTWV0YSBEYXRhIENvbmZpZ3VyYXRpb24KKworSWYgdGhlIHByZXNlbnQgbGlicmFyeSBpcyBjb25maWd1cmVkIHdpdGggTWV0YWRhdGEgc3VwcG9ydCwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkCithdWRpbyBiaXRzdHJlYW0gd2hpbGUgZW5jb2RpbmcuCisKK1RvIHdvcmsgd2l0aCBtZXRhIGRhdGEgdGhlIGVuY29kZXIgaW5zdGFuY2UgaGFzIHRvIGJlIFxyZWYgZW5jT3BlbiAiYWxsb2NhdGVkIiB3aXRoIG1ldGEgZGF0YSBzdXBwb3J0LiBUaGUgbWV0YSBkYXRhIG1vZGUgbXVzdCBiZSBiZSBjb25maWd1cmVkIHdpdGgKK3RoZSA6OkFBQ0VOQ19NRVRBREFUQV9NT0RFIHBhcmFtZXRlciBhbmQgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZ1bmN0aW9uLgorXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX01FVEFEQVRBX01PREUsIDAtMik7IFxlbmRjb2RlCisKK1RoaXMgY29uZmlndXJhdGlvbiBpbmRpY2F0ZXMgaG93IHRvIGVtYmVkIG1ldGEgZGF0YSBpbnRvIGJpdHN0cmVtLiBFaXRoZXIgbm8gaW5zZXJ0aW9uLCBNUEVHIG9yIEVUU0kgc3R5bGUuCitUaGUgbWV0YSBkYXRhIGl0c2VsZiBtdXN0IGJlIHNwZWNpZmllZCB3aXRoaW4gdGhlIG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgQUFDRU5DX01ldGFEYXRhLgorCitDaGFuZ2luZyBvbmUgb2YgdGhlIEFBQ0VOQ19NZXRhRGF0YSBzZXR1cCBwYXJhbWV0ZXJzIGNhbiBiZSBhY2hpZXZlZCBmcm9tIG91dHNpZGUgdGhlIGxpYnJhcnkgd2l0aGluIDo6SU5fTUVUQURBVEFfU0VUVVAgaW5wdXQKK2J1ZmZlci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgbWV0YSBkYXRhIHNldHVwIHN0cnVjdHVyZSBldmVyeSBmcmFtZS4gSWYgdGhlcmUgaXMgbm8gbmV3IG1ldGEgc2V0dXAgZGF0YSBhdmFpbGFibGUsIHRoZQorZW5jb2RlciB1c2VzIHRoZSBwcmV2aW91cyBzZXR1cCBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGluaXRpYWwgc3RhdGUuCisKK0luIGdlbmVyYWwgdGhlIGF1ZGlvIGNvbXByZXNzb3IgYW5kIGxpbWl0ZXIgd2l0aGluIHRoZSBlbmNvZGVyIGxpYnJhcnkgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgcGFyYW1ldGVyCitBQUNFTkNfTWV0YURhdGE6OmRyY19wcm9maWxlIGFuZCBhbmQgQUFDRU5DX01ldGFEYXRhOjpjb21wX3Byb2ZpbGUuCitcbgorCitcc2VjdGlvbiBlbmNSZWNvbmYgRW5jb2RlciBSZWNvbmZpZ3VyYXRpb24KKworVGhlIGVuY29kZXIgbGlicmFyeSBhbGxvd3MgcmVjb25maWd1cmF0aW9uIG9mIHRoZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggbmV3IHNldHRpbmdzCitjb250aW51b3VzbHkgYmV0d2VlbiBlbmNvZGluZyBmcmFtZXMuIEVhY2ggcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQgbXVzdCBiZSBzZXQgd2l0aAorYSBzaW5nbGUgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGNhbGwuIFRoZSBpbnRlcm5hbCBzdGF0dXMgb2YgZWFjaCBwYXJhbWV0ZXIgY2FuIGJlCityZXRyaWV2ZWQgd2l0aCBhbiBhYWNFbmNvZGVyX0dldFBhcmFtKCkgY2FsbC5cbgorVGhlcmUgaXMgbm8gc3RhbmQtYWxvbmUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGF2YWlsYWJsZS4gV2hlbiBwYXJhbWV0ZXJzIHdlcmUKK21vZGlmaWVkIGZyb20gb3V0c2lkZSB0aGUgbGlicmFyeSwgYW4gaW50ZXJuYWwgY29udHJvbCBtZWNoYW5pc20gdHJpZ2dlcnMgdGhlIG5lY2Vzc2FyeQorcmVjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbGxvd2luZworYWFjRW5jRW5jb2RlKCkgY2FsbC4gVGhpcyBzdGF0ZSBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSBleHRlcm5hbCB2aWEgdGhlIEFBQ0VOQ19JTklUX1NUQVRVUworYW5kIGFhY0VuY29kZXJfR2V0UGFyYW0oKSBmdW5jdGlvbi4gVGhlIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIGNhbiBhbHNvIGJlIGFwcGxpZWQKK2ltbWVkaWF0ZWx5IHdoZW4gYWxsIHBhcmFtZXRlcnMgb2YgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbCBhcmUgTlVMTCB3aXRoIGEgdmFsaWQgZW5jb2RlcgoraGFuZGxlLlxuXG4KK1RoZSBpbnRlcm5hbCByZWNvbmZpZ3VyYXRpb24gcHJvY2VzcyBjYW4gYmUgY29udHJvbGxlZCBmcm9tIGV4dGVybiB3aXRoIHRoZSBmb2xsb3dpbmcgYWNjZXNzLgorXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NPTlRST0xfU1RBVEUsIEFBQ0VOQ19DVFJMRkxBR1MpOyBcZW5kY29kZQorCisKK1xzZWN0aW9uIGVuY1BhcmFtcyBFbmNvZGVyIFBhcmFtZXRyaXphdGlvbgorCitBbGwgcGFyYW1ldGVyZXMgbGlzdGVkIGluIDo6QUFDRU5DX1BBUkFNIGNhbiBiZSBtb2RpZmllZCB3aXRoaW4gYW4gZW5jb2RlciBpbnN0YW5jZS4KKworXHN1YnNlY3Rpb24gZW5jTWFuZGF0b3J5IE1hbmRhdG9yeSBFbmNvZGVyIFBhcmFtZXRlcnMKK1RoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZSBlbmNvZGVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkLgorXGNvZGUKK2FhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BT1QsIHZhbHVlKTsKK2FhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFLCB2YWx1ZSk7CithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfU0FNUExFUkFURSwgdmFsdWUpOworYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7CitcZW5kY29kZQorQmV5b25kIHRoYXQgaXMgYW4gaW50ZXJuYWwgYXV0byBtb2RlIHdoaWNoIHByZWluaXRpemlhbGl6ZXMgdGhlIDo6QUFDRU5DX0JJVFJBVEUgcGFyYW1ldGVyCitpZiB0aGUgcGFyYW1ldGVyIHdhcyBub3Qgc2V0IGZyb20gZXh0ZXJuLiBUaGUgYml0cmF0ZSBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlCitjaGFubmVscyBhbmQgc2FtcGxpbmcgcmF0ZSBhbmQgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzLgorXGNvZGUKK0FBQy1MQyAoQU9UX0FBQ19MQyk6IDEuNSBiaXRzIHBlciBzYW1wbGUKK0hFLUFBQyAoQU9UX1NCUik6IDAuNjI1IGJpdHMgcGVyIHNhbXBsZSAoZHVhbHJhdGUgc2JyKQorSEUtQUFDIChBT1RfU0JSKTogMS4xMjUgYml0cyBwZXIgc2FtcGxlIChkb3duc2FtcGxlZCBzYnIpCitIRS1BQUMgdjIgKEFPVF9QUyk6IDAuNSBiaXRzIHBlciBzYW1wbGUKK1xlbmRjb2RlCisKK1xzdWJzZWN0aW9uIGNoYW5uZWxNb2RlIENoYW5uZWwgTW9kZSBDb25maWd1cmF0aW9uCitUaGUgaW5wdXQgYXVkaW8gZGF0YSBpcyBkZXNjcmliZWQgd2l0aCB0aGUgOjpBQUNFTkNfQ0hBTk5FTE1PREUgcGFyYW1ldGVyIGluIHRoZQorYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGNhbGwuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhICdudW1iZXIgb2YKK2lucHV0IGNoYW5uZWxzJyBhcmd1bWVudC4gSW5zdGVhZCwgdGhlIGNoYW5uZWxNb2RlIG11c3QgYmUgc2V0IGFzIGZvbGxvd3MuCitcY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsIHZhbHVlKTsgXGVuZGNvZGUKK1RoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIDo6Q0hBTk5FTF9NT0RFIGFuZCBjYW4gYmUgbWFwcGVkIGZyb20gdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscworaW4gdGhlIGZvbGxvd2luZyB3YXkuCitcZG9udGluY2x1ZGUgbWFpbi5jcHAKK1xza2lwIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CitcdW50aWwgcmV0dXJuCisKK1xzdWJzZWN0aW9uIGVuY1F1YWwgQXVkaW8gUXVhbGl0eSBDb25zaWRlcmF0aW9ucworVGhlIGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIGlzIHN1Z2dlc3RlZCB0byBiZSB1c2VkLiBFbmNvZGVyIHRvb2xzIHN1Y2ggYXMgVE5TIGFuZCBQTlMKK2FyZSBhY3RpdmF0ZWQgYnkgZGVmYXVsdCBhbmQgYXJlIGludGVybmFsbHkgY29udHJvbGxlZCAoc2VlIFxyZWYgQkVIQVZJT1VSX1RPT0xTKS4KKworVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBxdWFsaXR5IHBhcmFtZXRlciBjYWxsZWQgOjpBQUNFTkNfQUZURVJCVVJORVIuIEluIHRoZSBkZWZhdWx0Citjb25maWd1cmF0aW9uIHRoaXMgcXVhbGl0eSBzd2l0Y2ggaXMgZGVhY3RpdmF0ZWQgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIHdvcmtsb2FkCitpbmNyZWFzZSB3aGljaCBtaWdodCBiZSBzaWduaWZpY2FudC4gSWYgd29ya2xvYWQgaXMgbm90IGFuIGlzc3VlIGluIHRoZSBhcHBsaWNhdGlvbgord2UgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLgorXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0FGVEVSQlVSTkVSLCAxKTsgXGVuZGNvZGUKKworXHN1YnNlY3Rpb24gZW5jRUxEIEVMRCBBdXRvIENvbmZpZ3VyYXRpb24gTW9kZQorRm9yIEVMRCBjb25maWd1cmF0aW9uIGEgc28gY2FsbGVkIGF1dG8gY29uZmlndXJhdG9yIGlzIGF2YWlsYWJsZSB3aGljaCBjb25maWd1cmVzIFNCUiBhbmQgdGhlIFNCUiByYXRpbyBieSBpdHNlbGYuCitUaGUgY29uZmlndXJhdG9yIGlzIHVzZWQgd2hlbiB0aGUgZW5jb2RlciBwYXJhbWV0ZXIgOjpBQUNFTkNfU0JSX01PREUgYW5kIDo6QUFDRU5DX1NCUl9SQVRJTyBhcmUgbm90IHNldCBleHBsaWNpdGVseS4KKworQmFzZWQgb24gc2FtcGxpbmcgcmF0ZSBhbmQgY2hvc2VuIGJpdHJhdGUgcGVyIGNoYW5uZWwgYSByZWFzb25hYmxlIFNCUiBjb25maWd1cmF0aW9uIHdpbGwgYmUgdXNlZC4KK1x2ZXJiYXRpbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNhbXBsaW5nIFJhdGUgIHwgQ2hhbm5lbCBCaXRyYXRlIHwgIFNCUiB8ICAgICAgIFNCUiBSYXRpbworLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgXW1pbiwgMTZdIGtIeiAgIHwgICAgIG1pbiAtIDI3OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgICB8ICAgMjgwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorIF0xNiAtIDI0XSBrSHogICB8ICAgICBtaW4gLSAzOTk5OSB8ICAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgICAgfCAgIDQwMDAwIC0gICBtYXggfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyBdMjQgLSAzMl0ga0h6ICAgfCAgICAgbWluIC0gMjc5OTkgfCAgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICAgIHwgICAyODAwMCAtIDU1OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgICB8ICAgNTYwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorIF0zMiAtIDQ0LjFdIGtIeiB8ICAgICBtaW4gLSA2Mzk5OSB8ICAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgICAgfCAgIDY0MDAwIC0gICBtYXggfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyBdNDQuMSAtIDQ4XSBrSHogfCAgICAgbWluIC0gNjM5OTkgfCAgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICAgIHwgICA2NDAwMCAtIG1heCAgIHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZW5kdmVyYmF0aW0KKworCitcc2VjdGlvbiBhdWRpb2NoQ2ZnIEF1ZGlvIENoYW5uZWwgQ29uZmlndXJhdGlvbgorVGhlIE1QRUcgc3RhbmRhcmQgcmVmZXJzIG9mdGVuIHRvIHRoZSBzby1jYWxsZWQgQ2hhbm5lbCBDb25maWd1cmF0aW9uLiBUaGlzIENoYW5uZWwgQ29uZmlndXJhdGlvbiBpcyB1c2VkIGZvciBhIGZpeGVkIENoYW5uZWwKK01hcHBpbmcuIFRoZSBjb25maWd1cmF0aW9ucyAxLTcgYXJlIHByZWRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBhbmQgdXNlZCBmb3IgaW1wbGljaXQgc2lnbmFsbGluZyB3aXRoaW4gdGhlIGVuY29kZWQgYml0c3RyZWFtLgorRm9yIHVzZXIgZGVmaW5lZCBDb25maWd1cmF0aW9ucyB0aGUgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGlzIHNldCB0byAwIGFuZCB0aGUgQ2hhbm5lbCBNYXBwaW5nIG11c3QgYmUgZXhwbGVjaXRseSBkZXNjcmliZWQgd2l0aCBhbiBhcHByb3ByaWF0ZQorUHJvZ3JhbSBDb25maWcgRWxlbWVudC4gVGhlIHByZXNlbnQgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgdXNlciB0byBjb25maWd1cmUgdGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24gZnJvbQorZXh0ZXJuLiBUaGUgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmaXhlZCBDaGFubmVsIE1vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gQ2hhbm5lbCBDb25maWd1cmF0aW9uIGFzIGZvbGxvdy4KK1x2ZXJiYXRpbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENoYW5uZWxNb2RlICAgICAgICAgICB8IENoQ2ZnICB8IGZyb250X0VsICAgICAgfCBzaWRlX0VsICB8IGJhY2tfRWwgIHwgbGZlX0VsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tCitNT0RFXzEgICAgICAgICAgICAgICAgIHwgICAgICAxIHwgU0NFICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorTU9ERV8yICAgICAgICAgICAgICAgICB8ICAgICAgMiB8IENQRSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKK01PREVfMV8yICAgICAgICAgICAgICAgfCAgICAgIDMgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CitNT0RFXzFfMl8xICAgICAgICAgICAgIHwgICAgICA0IHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgU0NFICAgICAgfAorTU9ERV8xXzJfMiAgICAgICAgICAgICB8ICAgICAgNSB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSAgICAgIHwKK01PREVfMV8yXzJfMSAgICAgICAgICAgfCAgICAgIDYgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUgICAgICB8IExGRQorTU9ERV8xXzJfMl8yXzEgICAgICAgICB8ICAgICAgNyB8IFNDRSwgQ1BFLCBDUEUgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tCitNT0RFXzdfMV9SRUFSX1NVUlJPVU5EIHwgICAgICAwIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFLCBDUEUgfCBMRkUKK01PREVfN18xX0ZST05UX0NFTlRFUiAgfCAgICAgIDAgfCBTQ0UsIENQRSwgQ1BFIHwgICAgICAgICAgfCBDUEUgICAgICB8IExGRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC0gU0NFOiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LgorIC0gQ1BFOiBDaGFubmVsIFBhaXIuCisgLSBTQ0U6IExvdyBGcmVxdWVuY3kgRWxlbWVudC4KK1xlbmR2ZXJiYXRpbQorCitNb3Jlb3ZlciwgdGhlIFRhYmxlIGRlc2NyaWJlcyBhbGwgZml4ZWQgQ2hhbm5lbCBFbGVtZW50cyBmb3IgZWFjaCBDaGFubmVsIE1vZGUgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGEgc3BlYWtlciBhcnJhbmdlbWVudC4gVGhlCithcnJhbmdlbWVudCBpbmNsdWRlcyBmcm9udCwgc2lkZSwgYmFjayBhbmQgbGZlIEF1ZGlvIENoYW5uZWwgRWxlbWVudHMuXG4KK1RoaXMgbWFwcGluZyBvZiBBdWRpbyBDaGFubmVsIEVsZW1lbnRzIGlzIGRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBmb3IgQ2hhbm5lbCBDb25maWcgMS03LiBUaGUgQ2hhbm5lbCBhc3NpZ25tZW50IGZvciBNT0RFXzFfMSwKK01PREVfMl8yIGFuZCBNT0RFXzJfMSBpcyB1c2VkIGZyb20gdGhlIEFSSUIgc3RhbmRhcmQuIEFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCBhcyBzdWdnZXN0ZWQgaW4gTVBFRy5cbgorSW4gY2FzZSBvZiBDaGFubmVsIENvbmZpZyAwIG9yIHdyaXRpbmcgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnRzLCB0aGUgZW5jb2RlciBlbmFibGVzIHRoZSB3cml0aW5nIG9mIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQKK2l0c2VsZiBhcyBkZXNjcmliZWQgaW4gXHJlZiBlbmNQQ0UuIFRoZSBjb25maWd1cmF0aW9uIHVzZWQgaW4gUHJvZ3JhbSBDb25maWcgRWxlbWVudCByZWZlcnMgdG8gdGhlIGRlbm90ZWQgVGFibGUuXG4KK0Jlc2lkZSB0aGUgQ2hhbm5lbCBFbGVtZW50IGFzc2lnbm1lbnQgdGhlIENoYW5uZWwgTW9kZXMgYXJlIHJlc3Bvc2libGUgZm9yIGF1ZGlvIGlucHV0IGRhdGEgY2hhbm5lbCBtYXBwaW5nLiBUaGUgQ2hhbm5lbCBNYXBwaW5nCitvZiB0aGUgYXVkaW8gZGF0YSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCA6OkFBQ0VOQ19DSEFOTkVMT1JERVIgd2hpY2ggY2FuIGJlIE1QRUcgb3IgV0FWIGxpa2Ugb3JkZXIuXG4KK0ZvbGxvd2luZyBUYWJsZSBkZXNjcmliZXMgdGhlIGNvbXBsZXRlIGNoYW5uZWwgbWFwcGluZyBmb3IgYm90aCBDaGFubmVsIE9yZGVyIGNvbmZpZ3VyYXRpb25zLgorXHZlcmJhdGltCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NoYW5uZWxNb2RlICAgICAgICAgICAgfCAgTVBFRy1DaGFubmVsb3JkZXIgICAgICAgICAgICB8ICBXQVYtQ2hhbm5lbG9yZGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KK01PREVfMSAgICAgICAgICAgICAgICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8IDAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfAorTU9ERV8yICAgICAgICAgICAgICAgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwgICB8CitNT0RFXzFfMiAgICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgICB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwKK01PREVfMV8yXzEgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgICB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDMgfCAgIHwgICB8ICAgfAorTU9ERV8xXzJfMiAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgMyB8IDQgfCAgIHwgICB8CitNT0RFXzFfMl8yXzEgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgICB8ICAgfCAyIHwgMCB8IDEgfCA0IHwgNSB8IDMgfCAgIHwKK01PREVfMV8yXzJfMl8xICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCA2IHwgNyB8IDAgfCAxIHwgNCB8IDUgfCAzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KK01PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCAwIHwgMSB8IDYgfCA3IHwgNCB8IDUgfCAzCitNT0RFXzdfMV9GUk9OVF9DRU5URVIgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyIHwgNiB8IDcgfCAwIHwgMSB8IDQgfCA1IHwgMworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZW5kdmVyYmF0aW0KKworVGhlIGRlbm90ZWQgbWFwcGluZyBpcyBpbXBvcnRhbnQgZm9yIGNvcnJlY3QgYXVkaW8gY2hhbm5lbCBhc3NpZ25tZW50IHdoZW4gdXNpbmcgTVBFRyBvciBXQVYgb3JkZXJpbmcuIFRoZSBpbmNvbWluZyBhdWRpbworY2hhbm5lbHMgYXJlIGRpc3RyaWJ1dGVkIE1QRUcgbGlrZSBzdGFydGluZyBhdCB0aGUgZnJvbnQgY2hhbm5lbHMgYW5kIGVuZGluZyBhdCB0aGUgYmFjayBjaGFubmVscy4gVGhlIGRpc3RyaWJ1dGlvbiBpcyB1c2VkIGFzCitkZXNjcmliZWQgaW4gVGFibGUgY29uY2VyaW5nIENoYW5uZWwgQ29uZmlnIGFuZCBmaXggY2hhbm5lbCBlbGVtZW50cy4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZm9yIGNsYXJpZmljYXRpb24uCisKK1x2ZXJiYXRpbQorRXhhbXBsZTogTU9ERV8xXzJfMl8xIC0gV0FWLUNoYW5uZWxvcmRlciA1LjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElucHV0IENoYW5uZWwgICAgICB8IENvZGVyIENoYW5uZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDIgKGZyb250IGNlbnRlcikgICB8IDAgKFNDRSBjaGFubmVsKQorIDAgKGxlZnQgY2VudGVyKSAgICB8IDEgKDFzdCBvZiAxc3QgQ1BFKQorIDEgKHJpZ2h0IGNlbnRlcikgICB8IDIgKDJuZCBvZiAxc3QgQ1BFKQorIDQgKGxlZnQgc3Vycm91bmQpICB8IDMgKDFzdCBvZiAybmQgQ1BFKQorIDUgKHJpZ2h0IHN1cnJvdW5kKSB8IDQgKDJuZCBvZiAybmQgQ1BFKQorIDMgKExGRSkgICAgICAgICAgICB8IDUgKExGRSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGVuZHZlcmJhdGltCisKKworXHNlY3Rpb24gc3VwcEJpdHJhdGVzIFN1cHBvcnRlZCBCaXRyYXRlcworCitUaGUgRkRLIEFBQyBFbmNvZGVyIHByb3ZpZGVzIGEgd2lkZSByYW5nZSBvZiBzdXBwb3J0ZWQgYml0cmF0ZXMuCitUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgQXVkaW8gT2JqZWN0IFR5cGUuIEZvciBBQUMtTEMgdGhlIG1pbmltdW0KK2JpdHJhdGUgaXMgdGhlIGJpdHJhdGUgdGhhdCBpcyByZXF1aXJlZCB0byB3cml0ZSB0aGUgbW9zdCBiYXNpYyBhbmQgbWluaW1hbCB2YWxpZCBiaXRzdHJlYW0uCitJdCBjb25zaXN0cyBvZiB0aGUgYml0c3RyZWFtIGZvcm1hdCBoZWFkZXIgaW5mb3JtYXRpb24gYW5kIG90aGVyIHN0YXRpYy9tYW5kYXRvcnkgaW5mb3JtYXRpb24KK3dpdGhpbiB0aGUgQUFDIHBheWxvYWQuIFRoZSBtYXhpbXVtIEFBQyBmcmFtZXNpemUgYWxsb3dlZCBieSB0aGUgTVBFRy00IHN0YW5kYXJkCitkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYml0cmF0ZSBmb3IgQUFDLUxDLiBGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgYSBsaWJyYXJ5IGludGVybmFsCitsb29rLXVwIHRhYmxlIGlzIHVzZWQuCisKK0EgZ29vZCB3b3JraW5nIHBvaW50IGluIHRlcm1zIG9mIGF1ZGlvIHF1YWxpdHksIHNhbXBsaW5nIHJhdGUgYW5kIGJpdHJhdGUsIGlzIGF0IDEgdG8gMS41CitiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgQUFDLUxDLCAwLjYyNSBiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgZHVhbHJhdGUgSEUtQUFDLCAxLjEyNSBiaXRzL2F1ZGlvIHNhbXBsZQorZm9yIGRvd25zYW1wbGVkIEhFLUFBQyBhbmQgMC41IGJpdHMvYXVkaW8gc2FtcGxlIGZvciBIRS1BQUMgdjIuCitGb3IgZXhhbXBsZSBmb3Igb25lIGNoYW5uZWwgd2l0aCBhIHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiA0OCBrSHosIHRoZSByYW5nZSBmcm9tCis0OCBrYml0L3MgdG8gNzIga2JpdC9zIGFjaGlldmVzIHJlYXNvbmFibGUgYXVkaW8gcXVhbGl0eSBmb3IgQUFDLUxDLgorCitGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdGhlIGxvd2VzdCBwb3NzaWJsZSBhdWRpbyBpbnB1dCBzYW1wbGluZyBmcmVxdWVuY3kgaXMgMTYga0h6IGJlY2F1c2UgdGhlbiB0aGUKK0FBQy1MQyBjb3JlIGVuY29kZXIgb3BlcmF0ZXMgaW4gZHVhbCByYXRlIG1vZGUgYXQgaXRzIGxvd2VzdCBwb3NzaWJsZSBzYW1wbGluZyBmcmVxdWVuY3ksIHdoaWNoIGlzIDgga0h6LgorSEUtQUFDIHYyIHJlcXVpcmVzIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgorCitQbGVhc2Ugbm90ZSB0aGF0IGluIEhFLUFBQyBvciBIRS1BQUMgdjIgbW9kZSB0aGUgZW5jb2RlciBzdXBwb3J0cyBtdWNoIGhpZ2hlciBiaXRyYXRlcyB0aGFuIGFyZQorYXBwcm9wcmlhdGUgZm9yIEhFLUFBQyBvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlLCBhdCBhIGJpdHJhdGUgb2YgbW9yZSB0aGFuIDY0IGtiaXQvcyBmb3IgYSBzdGVyZW8KK2F1ZGlvIHNpZ25hbCBhdCA0NC4xIGtIeiBpdCB1c3VhbGx5IG1ha2VzIHNlbnNlIHRvIHVzZSBBQUMtTEMsIHdoaWNoIHdpbGwgcHJvZHVjZSBiZXR0ZXIgYXVkaW8KK3F1YWxpdHkgYXQgdGhhdCBiaXRyYXRlIHRoYW4gSEUtQUFDIG9yIEhFLUFBQyB2Mi4KKworXHNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZyBSZWNvbW1lbmRlZCBTYW1wbGluZyBSYXRlIGFuZCBCaXRyYXRlIENvbWJpbmF0aW9ucworCitUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCit3aGljaCB3ZSBkZXRlcm1pbmVkIGJ5IHZpcnR1ZSBvZiBudW1lcm91cyBsaXN0ZW5pbmcgdGVzdHMuCisKK1xzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdMQyBBQUMtTEMsIEhFLUFBQywgSEUtQUFDdjIgaW4gRHVhbHJhdGUgU0JSIG1vZGUuCitcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitBQUMgTEMgKyBTQlIgKyBQUyAgfCAgIDgwMDAgLSAgMTE5OTkgIHwgICAgICAgICAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMgorQUFDIExDICsgU0JSICsgUFMgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKK0FBQyBMQyArIFNCUiArIFBTICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCitBQUMgTEMgKyBTQlIgKyBQUyAgfCAgNDAwMDAgLSAgNTYwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0FBQyBMQyArIFNCUiAgICAgICB8ICAgODAwMCAtICAxMTk5OSAgfCAgICAgICAgIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCitBQUMgTEMgKyBTQlIgICAgICAgfCAgMTIwMDAgLSAgMTc5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQorQUFDIExDICsgU0JSICAgICAgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKK0FBQyBMQyArIFNCUiAgICAgICB8ICA0MDAwMCAtICA1NjAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCitBQUMgTEMgKyBTQlIgICAgICAgfCAgMTYwMDAgLSAgMjc5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMgorQUFDIExDICsgU0JSICAgICAgIHwgIDI4MDAwIC0gIDYzOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKK0FBQyBMQyArIFNCUiAgICAgICB8ICA2NDAwMCAtIDEyODAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gIDY5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKK0FBQyBMQyArIFNCUiAgICAgICB8ICA3MDAwMCAtIDE1OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCitBQUMgTEMgKyBTQlIgICAgICAgfCAxNjAwMDAgLSAyNDU5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNQorQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMjY1OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICA1LjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitBQUMgTEMgICAgICAgICAgICAgfCAgIDgwMDAgLSAgMTU5OTkgIHwgMTEuMDI1LCAxMi4wMCwgMTYuMDAgIHwgICAgIDEyLjAwICB8ICAgICAgMQorQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDEKK0FBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCitBQUMgTEMgICAgICAgICAgICAgfCAgMzIwMDAgLSAgNTU5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQorQUFDIExDICAgICAgICAgICAgIHwgIDU2MDAwIC0gMTYwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKK0FBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMSAtIDI4ODAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDIKK0FBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAyCitBQUMgTEMgICAgICAgICAgICAgfCAgMzIwMDAgLSAgMzk5OTkgIHwgIDE2LjAwLCAyMi4wNSwgMjQuMDAgIHwgICAgIDIyLjA1ICB8ICAgICAgMgorQUFDIExDICAgICAgICAgICAgIHwgIDQwMDAwIC0gIDk1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKK0FBQyBMQyAgICAgICAgICAgICB8ICA5NjAwMCAtIDExMTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCitBQUMgTEMgICAgICAgICAgICAgfCAxMTIwMDAgLSAzMjAwMDEgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgorQUFDIExDICAgICAgICAgICAgIHwgMzIwMDAyIC0gNTc2MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitBQUMgTEMgICAgICAgICAgICAgfCAxNjAwMDAgLSAyMzk5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8IDUsIDUuMQorQUFDIExDICAgICAgICAgICAgIHwgMjQwMDAwIC0gMjc5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKK0FBQyBMQyAgICAgICAgICAgICB8IDI4MDAwMCAtIDgwMDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGVuZHZlcmJhdGltIFxuCisKK1xzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdMRCBBQUMtTEQsIEFBQy1FTEQsIEFBQy1FTEQgd2l0aCBTQlIgaW4gRHVhbHJhdGUgU0JSIG1vZGUuCitcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQorRUxEICsgU0JSICAgICAgICAgIHwgIDI1MDAwIC0gIDMxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKK0VMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxEICsgU0JSICAgICAgICAgIHwgIDMyMDAwIC0gIDUxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKK0VMRCArIFNCUiAgICAgICAgICB8ICA1MjAwMCAtIDEyODAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxEICsgU0JSICAgICAgICAgIHwgIDcyMDAwIC0gMTYwMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDMKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAgOTYwMDAgLSAyMTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRCArIFNCUiAgICAgICAgICB8IDEyMDAwMCAtIDI0NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxEICsgU0JSICAgICAgICAgIHwgMTIwMDAwIC0gMjY2MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICA1LjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitMRCwgRUxEICAgICAgICAgICAgfCAgMTYwMDAgLSAgMTk5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDE2LjAwICB8ICAgICAgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDIwMDAwIC0gIDM5OTk5ICB8ICAgICAgICAxNi4wMCAtIDMyLjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKK0xELCBFTEQgICAgICAgICAgICB8ICA0MDAwMCAtICA0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCitMRCwgRUxEICAgICAgICAgICAgfCAgNTAwMDAgLSAgNjE5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDYyMDAwIC0gIDg0OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKK0xELCBFTEQgICAgICAgICAgICB8ICA4NTAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorTEQsIEVMRCAgICAgICAgICAgIHwgIDY0MDAwIC0gIDc1OTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKK0xELCBFTEQgICAgICAgICAgICB8ICA3NjAwMCAtICA5Nzk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCitMRCwgRUxEICAgICAgICAgICAgfCAgOTgwMDAgLSAxMzU5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgorTEQsIEVMRCAgICAgICAgICAgIHwgMTM2MDAwIC0gMzg0MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitMRCwgRUxEICAgICAgICAgICAgfCAgOTYwMDAgLSAxMTM5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMworTEQsIEVMRCAgICAgICAgICAgIHwgMTE0MDAwIC0gMTQ2OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAgICAgIDMKK0xELCBFTEQgICAgICAgICAgICB8IDE0NzAwMCAtIDIwMzk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAzCitMRCwgRUxEICAgICAgICAgICAgfCAyMDQwMDAgLSA1NzYwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMworLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0xELCBFTEQgICAgICAgICAgICB8IDEyODAwMCAtIDE1MTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA0CitMRCwgRUxEICAgICAgICAgICAgfCAxNTIwMDAgLSAxOTU5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgNAorTEQsIEVMRCAgICAgICAgICAgIHwgMTk2MDAwIC0gMjcxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDQKK0xELCBFTEQgICAgICAgICAgICB8IDI3MjAwMCAtIDc2ODAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorTEQsIEVMRCAgICAgICAgICAgIHwgMTYwMDAwIC0gMTg5OTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDUKK0xELCBFTEQgICAgICAgICAgICB8IDE5MDAwMCAtIDI0NDk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA1CitMRCwgRUxEICAgICAgICAgICAgfCAyNDUwMDAgLSAzMzk5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgNQorTEQsIEVMRCAgICAgICAgICAgIHwgMzQwMDAwIC0gOTYwMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZW5kdmVyYmF0aW0gXG4KKworXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0VMRCBBQUMtRUxEIHdpdGggU0JSIGluIERvd25zYW1wbGVkIFNCUiBtb2RlLgorXHZlcmJhdGltCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxEICsgU0JSICAgICAgICAgIHwgIDE4MDAwIC0gIDI0OTk5ICB8ICAgICAgICAxNi4wMCAtIDIyLjA1ICB8ICAgICAyMi4wNSAgfCAgICAgIDEKKyhkb3duc2FtcGxlZCBTQlIpICB8ICAyNTAwMCAtICAzNTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCisgICAgICAgICAgICAgICAgICAgfCAgMzYwMDAgLSAgNjQwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xlbmR2ZXJiYXRpbSBcbgorCisKK1xwYWdlIEVOQ09ERVJCRUhBVklPVVIgRW5jb2RlciBCZWhhdmlvdXIKKworXHNlY3Rpb24gQkVIQVZJT1VSX0JBTkRXSURUSCBCYW5kd2lkdGgKKworVGhlIEZESyBBQUMgZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IHVzZSB0aGUgZnVsbCBmcmVxdWVuY3kgcmFuZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbCwgYnV0IHJlc3RyaWN0cyB0aGUgYmFuZHdpZHRoCithY2NvcmRpbmcgdG8gY2VydGFpbiBsaWJyYXJ5LWludGVybmFsIHNldHRpbmdzLiBUaGV5IGNhbiBiZSBjaGFuZ2VkIGluIHRoZSB0YWJsZSAiYmFuZFdpZHRoVGFibGUiIGluIHRoZQorZmlsZSBiYW5kd2lkdGguY3BwIChpZiBhdmFpbGFibGUpLgorCitUaGUgZW5jb2RlciBBUEkgcHJvdmlkZXMgdGhlIDo6QUFDRU5DX0JBTkRXSURUSCBwYXJhbWV0ZXIgdG8gYWRqdXN0IHRoZSBiYW5kd2lkdGggZXhwbGljaXRseS4KK1xjb2RlCithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQkFORFdJRFRILCB2YWx1ZSk7CitcZW5kY29kZQorCitIb3dldmVyIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MsIGJlY2F1c2UgdGhleSBhcmUgYmFzZWQgb24gbnVtZXJpb3VzIGxpc3RlbmluZwordGVzdHMgYW5kIGNhcmVmdWwgdHdlYWtzIHRvIGVuc3VyZSB0aGUgYmVzdCBvdmVyYWxsIGVuY29kaW5nIHF1YWxpdHkuCisKK1RoZW9yZXRpY2FsbHkgYSBzaWduYWwgb2YgZm9yIGV4YW1wbGUgNDgga0h6IGNhbiBjb250YWluIGZyZXF1ZW5jaWVzIHVwIHRvIDI0IGtIeiwgYnV0IHRvIHVzZSB0aGlzIGZ1bGwgcmFuZ2UKK2luIGFuIGF1ZGlvIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCBtYWtlIHNlbnNlLiBVc3VhbGx5IHRoZSBlbmNvZGVyIGhhcyBhIHZlcnkgbGltaXRlZCBhbW91bnQgb2YKK2JpdHMgdG8gc3BlbmQgKHR5cGljYWxseSAxMjgga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIGFuZCB0byBhbGxvdyBmdWxsIHJhbmdlIGJhbmR3aWR0aCB3b3VsZAord2FzdGUgYSBsb3Qgb2YgdGhlc2UgYml0cyBmb3IgZnJlcXVlbmNpZXMgdGhlIGh1bWFuIGVhciBpcyBoYXJkbHkgYWJsZSB0byBwZXJjZWl2ZSBhbnl3YXksIGlmIGF0IGFsbC4gSGVuY2UgaXQKK2lzIHdpc2UgdG8gdXNlIHRoZSBhdmFpbGFibGUgYml0cyBmb3IgdGhlIHJlYWxseSBpbXBvcnRhbnQgZnJlcXVlbmN5IHJhbmdlIGFuZCBqdXN0IHNraXAgdGhlIHJlc3QuCitBdCBsb3dlciBiaXRyYXRlcyAoZS4gZy4gPD0gODAga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIGFuIGV2ZW4gc21hbGxlcgorYmFuZHdpZHRoLCBiZWNhdXNlIGFuIGVuY29kZWQgc2lnbmFsIHdpdGggc21hbGxlciBiYW5kd2lkdGggYW5kIGhlbmNlIGxlc3MgYXJ0aWZhY3RzIHNvdW5kcyBiZXR0ZXIgdGhhbiBhIHNpZ25hbAord2l0aCBoaWdoZXIgYmFuZHdpZHRoIGJ1dCB0aGVuIG1vcmUgY29kaW5nIGFydGVmYWN0cyBhY3Jvc3MgYWxsIGZyZXF1ZW5jaWVzLiBUaGVzZSBhcnRlZmFjdHMgd291bGQgb2NjdXIgaWYKK3NtYWxsIGJpdHJhdGVzIGFuZCBoaWdoIGJhbmR3aWR0aHMgYXJlIGNob3NlbiBiZWNhdXNlIHRoZSBhdmFpbGFibGUgYml0cyBhcmUganVzdCBub3QgZW5vdWdoIHRvIGVuY29kZSBhbGwKK2ZyZXF1ZW5jaWVzIHdlbGwuCisKK1VuZm9ydHVuYXRlbHkgc29tZSBwZW9wbGUgZXZhbHVhdGUgZW5jb2RpbmcgcXVhbGl0eSBiYXNlZCBvbiBwb3NzaWJsZSBiYW5kd2lkdGggYXMgd2VsbCwgYnV0IGl0IGlzIGEgdHdvLXNpZGVkCitzd29yZCBjb25zaWRlcmluZyB0aGUgdHJhZGUtb2ZmIGRlc2NyaWJlZCBhYm92ZS4KKworQW5vdGhlciBhc3BlY3QgaXMgd29ya2xvYWQgY29uc3VtcHRpb24uIFRoZSBoaWdoZXIgdGhlIGFsbG93ZWQgYmFuZHdpZHRoLCB0aGUgbW9yZSBmcmVxdWVuY3kgbGluZXMgaGF2ZSB0byBiZQorcHJvY2Vzc2VkLCB3aGljaCBpbiB0dXJuIGluY3JlYXNlcyB0aGUgd29ya2xvYWQuCisKK1xzZWN0aW9uIEZSQU1FU0laRVNfQU5EX0JJVF9SRVNFUlZPSVIgRnJhbWUgU2l6ZXMgJiBCaXQgUmVzZXJ2b2lyCisKK0ZvciBBQUMgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gY29uc3RhbnQgYml0IHJhdGUgYW5kIGNvbnN0YW50IGZyYW1lCitsZW5ndGggZHVlIHRvIHRoZSBzby1jYWxsZWQgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUsIHdoaWNoIGFsbG93cyB0aGUgZW5jb2RlciB0byB1c2UgbGVzcworYml0cyBpbiBhbiBBQUMgZnJhbWUgZm9yIHRob3NlIGF1ZGlvIHNpZ25hbCBzZWN0aW9ucyB3aGljaCBhcmUgZWFzeSB0byBlbmNvZGUsCithbmQgdGhlbiBzcGVuZCB0aGVtIGF0IGEgbGF0ZXIgcG9pbnQgaW4KK3RpbWUgZm9yIG1vcmUgY29tcGxleCBhdWRpbyBzZWN0aW9ucy4gVGhlIGV4dGVudCB0byB3aGljaCB0aGlzICJiaXQgZXhjaGFuZ2UiCitpcyBkb25lIGlzIGxpbWl0ZWQgdG8gYWxsb3cgZm9yIHJlbGlhYmxlIGFuZCByZWxhdGl2ZWx5IGxvdyBkZWxheSByZWFsIHRpbWUKK3N0cmVhbWluZy4KK092ZXIgYSBsb25nZXIgcGVyaW9kIGluIHRpbWUgdGhlIGJpdHJhdGUgd2lsbCBiZSBjb25zdGFudCBpbiB0aGUgQUFDIGNvbnN0YW50CitiaXRyYXRlIG1vZGUsIGUuZy4gZm9yIElTRE4gdHJhbnNtaXNzaW9uLiBUaGlzIG1lYW5zIHRoYXQgaW4gQUFDIGVhY2ggYml0c3RyZWFtCitmcmFtZSB3aWxsIGluIGdlbmVyYWwgaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggaW4gYnl0ZXMgYnV0IG92ZXIgdGltZSBpdAord2lsbCByZWFjaCB0aGUgdGFyZ2V0IGJpdHJhdGUuIE9uZSBjb3VsZCBhbHNvIG1ha2UgYW4gTVBFRyBjb21wbGlhbnQKK0FBQyBlbmNvZGVyIHdoaWNoIGFsd2F5cyBwcm9kdWNlcyBjb25zdGFudCBsZW5ndGggcGFja2FnZXMgZm9yIGVhY2ggQUFDIGZyYW1lLAorYnV0IHRoZSBhdWRpbyBxdWFsaXR5IHdvdWxkIGJlIGNvbnNpZGVyYWJseSB3b3JzZSBzaW5jZSB0aGUgYml0IHJlc2Vydm9pcgordGVjaG5pcXVlIHdvdWxkIGhhdmUgdG8gYmUgc3dpdGNoZWQgb2ZmIGNvbXBsZXRlbHkuIEEgaGlnaGVyIGJpdCByYXRlIHdvdWxkIGhhdmUKK3RvIGJlIHVzZWQgdG8gZ2V0IHRoZSBzYW1lIGF1ZGlvIHF1YWxpdHkgYXMgd2l0aCBhbiBlbmFibGVkIGJpdCByZXNlcnZvaXIuCisKK1RoZSBtYXhpbXVtIEFBQyBmcmFtZSBsZW5ndGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIGF2YWlsYWJsZSBiaXQgcmVzZXJ2b2lyLCBpcyBkZWZpbmVkCithcyA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwuCisKK0ZvciBtcDMgYnkgdGhlIHdheSwgdGhlIHNhbWUgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUgZXhpc3RzLCBidXQgdGhlcmUgZWFjaCBiaXQKK3N0cmVhbSBmcmFtZSBoYXMgYSBjb25zdGFudCBsZW5ndGggZm9yIGEgZ2l2ZW4gYml0IHJhdGUgKGlnbm9yaW5nIHRoZQorcGFkZGluZyBieXRlKS4gSW4gbXAzIHRoZXJlIGlzIGEgc28tY2FsbGVkICJiYWNrIHBvaW50ZXIiIHdoaWNoIHRlbGxzCit0aGUgZGVjb2RlciB3aGljaCBiaXRzIGJlbG9uZyB0byB0aGUgY3VycmVudCBtcDMgZnJhbWUgLSBhbmQgaW4gZ2VuZXJhbCBzb21lIG9yCittYW55IGJpdHMgaGF2ZSBiZWVuIHRyYW5zbWl0dGVkIGluIGFuIGVhcmxpZXIgbXAzIGZyYW1lLiBCYXNpY2FsbHkgdGhpcyBsZWFkcyB0bwordGhlIHNhbWUgImJpdCBleGNoYW5nZSBiZXR3ZWVuIG1wMyBmcmFtZXMiIGFzIGluIEFBQyBidXQgd2l0aCB2aXJ0dWFsbHkgY29uc3RhbnQKK2xlbmd0aCBmcmFtZXMuCisKK1RoaXMgdmFyaWFibGUgZnJhbWUgbGVuZ3RoIGF0ICJjb25zdGFudCBiaXQgcmF0ZSIgaXMgbm90IHNvbWV0aGluZyBzcGVjaWFsCitpbiB0aGlzIEZyYXVuaG9mZXIgSUlTIEFBQyBlbmNvZGVyLiBBQUMgaGFzIGJlZW4gZGVzaWduZWQgaW4gdGhhdCB3YXkuCisKK1xzdWJzZWN0aW9uIEJFSEFWSU9VUl9FU1RJTV9BVkdfRlJBTUVTSVpFUyBFc3RpbWF0aW5nIEF2ZXJhZ2UgRnJhbWUgU2l6ZXMKKworQSBIRS1BQUMgdjEgb3IgdjIgYXVkaW8gZnJhbWUgY29udGFpbnMgMjA0OCBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAodGhlcmUgaXMKK2Fsc28gb25lIG1vZGUgd2l0aCAxOTIwIHNhbXBsZXMgcGVyIGNoYW5uZWwgYnV0IHRoaXMgaXMgb25seSBmb3Igc3BlY2lhbCBwdXJwb3Nlcworc3VjaCBhcyBEQUIrIGRpZ2l0YWwgcmFkaW8pLgorCitUaGUgbnVtYmVyIG9mIEhFLUFBQyBmcmFtZXMgXGYkTlxfRlJBTUVTXGYkIHBlciBzZWNvbmQgYXQgNDQuMSBrSHogaXM6CisKK1xmWworTlxfRlJBTUVTID0gNDQxMDAgLyAyMDQ4ID0gMjEuNTMzMgorXGZdCisKK0F0IGEgYml0IHJhdGUgb2YgOCBrYnBzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHBlciBmcmFtZSBcZiROXF9CSVRTXF9QRVJcX0ZSQU1FXGYkIGlzOgorCitcZlsKK05cX0JJVFNcX1BFUlxfRlJBTUUgPSA4MDAwIC8gMjEuNTMzMiA9IDM3MS41MgorXGZdCisKK3doaWNoIGlzIGFib3V0IDQ2LjQ0IGJ5dGVzIHBlciBlbmNvZGVkIGZyYW1lLgorCitBdCBhIGJpdCByYXRlIG9mIDMyIGticHMsIHdoaWNoIGlzIHF1aXRlIGhpZ2ggZm9yIHNpbmdsZSBjaGFubmVsIEhFLUFBQyB2MSwgaXQgaXM6CisKK1xmWworTlxfQklUU1xfUEVSXF9GUkFNRSA9IDMyMDAwIC8gMjEuNTMzMiA9IDE0ODYKK1xmXQorCit3aGljaCBpcyBhYm91dCAxODUuNzYgYnl0ZXMgcGVyIGVuY29kZWQgZnJhbWUuCisKK1RoZXNlIGJpdHMvZnJhbWUgZmlndXJlcyBhcmUgYXZlcmFnZSBmaWd1cmVzIHdoZXJlIGVhY2ggQUFDIGZyYW1lIGdlbmVyYWxseSBoYXMgYSBkaWZmZXJlbnQKK3NpemUgaW4gYnl0ZXMuIFRvIGNhbGN1bGF0ZSB0aGUgc2FtZSBmb3IgQUFDLUxDIGp1c3QgdXNlIDEwMjQgaW5zdGVhZCBvZiAyMDQ4IFBDTSBzYW1wbGVzIHBlcgorZnJhbWUgYW5kIGNoYW5uZWwuCitGb3IgQUFDLUxEL0VMRCBpdCBpcyBlaXRoZXIgNDgwIG9yIDUxMiBQQ00gc2FtcGxlcyBwZXIgZnJhbWUgYW5kIGNoYW5uZWwuCisKKworXHNlY3Rpb24gQkVIQVZJT1VSX1RPT0xTIEVuY29kZXIgVG9vbHMKKworVGhlIEFBQyBlbmNvZGVyIHN1cHBvcnRzIFROUywgUE5TLCBNUywgSW50ZW5zaXR5IGFuZCBhY3RpdmF0ZXMgdGhlc2UgdG9vbHMgZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyBzaWduYWwgYW5kCit0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIChpLmUuIGJpdHJhdGUgb3IgQU9UKS4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGVzZSB0b29scyBtYW51YWxseS4KKworUE5TIGltcHJvdmVzIGVuY29kaW5nIHF1YWxpdHkgb25seSBmb3IgY2VydGFpbiBiaXRyYXRlcy4gVGhlcmVmb3JlIGl0IG1ha2VzIHNlbnNlIHRvIGFjdGl2YXRlIFBOUyBvbmx5IGZvcgordGhlc2UgYml0cmF0ZXMgYW5kIHNhdmUgdGhlIHByb2Nlc3NpbmcgcG93ZXIgcmVxdWlyZWQgZm9yIFBOUyAoYWJvdXQgMTAgJSBvZiB0aGUgZW5jb2Rlcikgd2hlbiB1c2luZyBvdGhlcgorYml0cmF0ZXMuIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGUgZW5jb2RlciBsaWJyYXJ5LiBQTlMgaXMgZGlzYWJsZWQgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkgaWYKK2FuIE1QRUctMiBBT1QgaXMgY2hvb3NlbiBzaW5jZSBQTlMgaXMgYW4gTVBFRy00IEFBQyBmZWF0dXJlLgorCitJZiBTQlIgaXMgYWN0aXZhdGVkLCB0aGUgZW5jb2RlciBhdXRvbWF0aWNhbGx5IGRlYWN0aXZhdGVzIFBOUyBpbnRlcm5hbGx5LiBJZiBUTlMgaXMgZGlzYWJsZWQgYnV0IFBOUyBpcyBhbGxvd2VkLAordGhlIGVuY29kZXIgZGVhY3RpdmF0ZXMgUE5TIGNhbGN1bGF0aW9uIGludGVybmFsbHkuCisKKyovCisKKyNpZm5kZWYgX0FBQ19FTkNfTElCX0hfCisjZGVmaW5lIF9BQUNfRU5DX0xJQl9IXworCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKworLyoqCisgKiAgQUFDIGVuY29kZXIgZXJyb3IgY29kZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQUFDRU5DX09LICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiBBbGwgZmluZS4gKi8KKworICAgIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSAgICAgICAgID0gMHgwMDIwLCAgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCisgICAgQUFDRU5DX01FTU9SWV9FUlJPUiAgICAgICAgICAgPSAweDAwMjEsICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKyAgICBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSICA9IDB4MDAyMiwgIC8qITwgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUuICovCisgICAgQUFDRU5DX0lOVkFMSURfQ09ORklHICAgICAgICAgPSAweDAwMjMsICAvKiE8IENvbmZpZ3VyYXRpb24gbm90IHByb3ZpZGVkLiAqLworCisgICAgQUFDRU5DX0lOSVRfRVJST1IgICAgICAgICAgICAgPSAweDAwNDAsICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgICAgQUFDRU5DX0lOSVRfQUFDX0VSUk9SICAgICAgICAgPSAweDAwNDEsICAvKiE8IEFBQyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICAgIEFBQ0VOQ19JTklUX1NCUl9FUlJPUiAgICAgICAgID0gMHgwMDQyLCAgLyohPCBTQlIgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgICBBQUNFTkNfSU5JVF9UUF9FUlJPUiAgICAgICAgICA9IDB4MDA0MywgIC8qITwgVHJhbnNwb3J0IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiAgICAgICAgPSAweDAwNDQsICAvKiE8IE1ldGEgZGF0YSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworCisgICAgQUFDRU5DX0VOQ09ERV9FUlJPUiAgICAgICAgICAgPSAweDAwNjAsICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLworCisgICAgQUFDRU5DX0VOQ09ERV9FT0YgICAgICAgICAgICAgPSAweDAwODAgICAvKiE8IEVuZCBvZiBmaWxlIHJlYWNoZWQuICovCisKK30gQUFDRU5DX0VSUk9SOworCisKKy8qKgorICogIEFBQyBlbmNvZGVyIGJ1ZmZlciBkZXNjcmlwdG9ycyBpZGVudGlmaWVyLgorICogIFRoaXMgaWRlbnRpZmllciBhcmUgdXNlZCB3aXRoaW4gYnVmZmVyIGRlc2NyaXB0b3JzIEFBQ0VOQ19CdWZEZXNjOjpidWZmZXJJZGVudGlmaWVycy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBJbnB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KKyAgICBJTl9BVURJT19EQVRBICAgICAgPSAwLCAgICAgICAgICAgICAgICAgIC8qITwgQXVkaW8gaW5wdXQgYnVmZmVyLCBpbnRlcmxlYXZlZCBJTlRfUENNIHNhbXBsZXMuICovCisgICAgSU5fQU5DSUxMUllfREFUQSAgID0gMSwgICAgICAgICAgICAgICAgICAvKiE8IEFuY2lsbGFyeSBkYXRhIHRvIGJlIGVtYmVkZGVkIGludG8gYml0c3RyZWFtLiAqLworICAgIElOX01FVEFEQVRBX1NFVFVQICA9IDIsICAgICAgICAgICAgICAgICAgLyohPCBTZXR1cCBzdHJ1Y3R1cmUgZm9yIGVtYmVkZGluZyBtZXRhIGRhdGEuICovCisKKyAgICAvKiBPdXRwdXQgYnVmZmVyIGlkZW50aWZpZXIuICovCisgICAgT1VUX0JJVFNUUkVBTV9EQVRBID0gMywgICAgICAgICAgICAgICAgICAvKiE8IEJ1ZmZlciBob2xkcyBiaXRzdHJlYW0gb3V0cHV0IGRhdGEuICovCisgICAgT1VUX0FVX1NJWkVTICAgICAgID0gNCAgICAgICAgICAgICAgICAgICAvKiE8IEJ1ZmZlciBjb250YWlucyBzaXplcyBvZiBlYWNoIGFjY2VzcyB1bml0LiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5lY2Vzc2FyeSBmb3Igc3VwZXJmcmFtaW5nLiAqLworCit9IEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyOworCisKKy8qKgorICogIEFBQyBlbmNvZGVyIGhhbmRsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUFDRU5DT0RFUiAqSEFORExFX0FBQ0VOQ09ERVI7CisKKworLyoqCisgKiAgUHJvdmlkZXMgc29tZSBpbmZvIGFib3V0IHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIFVJTlQgICAgICAgICAgICAgICAgbWF4T3V0QnVmQnl0ZXM7ICAgICAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBlbmNvZGVyIGJpdHN0cmVhbSBieXRlcyB3aXRoaW4gb25lIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIGRlcGVuZHMgb24gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIGluIGVuY29kZXIgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBzdXBlcmZyYW1pbmcgKGFzIHVzZWQgZm9yIGV4YW1wbGUgaW4gREFCKyksIHNpemUgaGFzIHRvIGJlIGEgbXVsdGlwbGUgYWNjb3JkaW5nbHkuICovCisKKyAgICBVSU5UICAgICAgICAgICAgICAgIG1heEFuY0J5dGVzOyAgICAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIHdpdGhpbiBvbmUgZnJhbWUuICovCisKKyAgICBVSU5UICAgICAgICAgICAgICAgIGluQnVmRmlsbExldmVsOyAgICAgIC8qITwgSW50ZXJuYWwgaW5wdXQgYnVmZmVyIGZpbGwgbGV2ZWwgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4gVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNsZWFyZWQgaWYgc2FtcGxpbmdyYXRlIG9yIGNoYW5uZWwoTW9kZS9PcmRlcikgY2hhbmdlcy4gKi8KKworICAgIFVJTlQgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsczsgICAgICAgLyohPCBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgZXhwZWN0ZWQgaW4gZW5jb2RpbmcgcHJvY2Vzcy4gKi8KKworICAgIFVJTlQgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg7ICAgICAgICAgLyohPCBBbW91bnQgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBlYWNoIGZyYW1lIHBlciBjaGFubmVsLCBkZXBlbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYXVkaW8gb2JqZWN0IHR5cGUgY29uZmlndXJhdGlvbi4gKi8KKworICAgIFVJTlQgICAgICAgICAgICAgICAgZW5jb2RlckRlbGF5OyAgICAgICAgLyohPCBDb2RlYyBkZWxheSBpbiBQQ00gc2FtcGxlcy9jaGFubmVsLiBEZXBlbmRzIG9uIGZyYW1lbGVuZ3RoIGFuZCBBT1QuIERvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZnJhbWluZyBkZWxheSBmb3IgZmlsbGluZyB1cCBlbmNvZGVyIFBDTSBpbnB1dCBidWZmZXIuICovCisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIGNvbmZCdWZbNjRdOyAgICAgICAgIC8qITwgQ29uZmlndXJhdGlvbiBidWZmZXIgaW4gYmluYXJ5IGZvcm1hdCBhcyBhbiBBdWRpb1NwZWNpZmljQ29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydCB0eXBlLiAqLworCisgICAgVUlOVCAgICAgICAgICAgICAgICBjb25mU2l6ZTsgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBjb25mQnVmLiAqLworCit9IEFBQ0VOQ19JbmZvU3RydWN0OworCisKKy8qKgorICogIERlc2NyaWJlcyB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSU5UICAgICAgICAgICAgICAgICBudW1CdWZzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBidWZmZXJzLiAqLworICAgIHZvaWQgICAgICAgICAgICAgICoqYnVmczsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciBjb250YWluaW5nIGJ1ZmZlciBhZGRyZXNzZXMuICovCisgICAgSU5UICAgICAgICAgICAgICAgICpidWZmZXJJZGVudGlmaWVyczsgICAvKiE8IElkZW50aWZpZXIgb2YgZWFjaCBidWZmZXIgZWxlbWVudC4gU2VlIDo6QUFDRU5DX0J1ZmZlcklkZW50aWZpZXIuICovCisgICAgSU5UICAgICAgICAgICAgICAgICpidWZTaXplczsgICAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgaW4gOC1iaXQgYnl0ZXMuICovCisgICAgSU5UICAgICAgICAgICAgICAgICpidWZFbFNpemVzOyAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgZWxlbWVudCBpbiBieXRlcy4gKi8KKworfSBBQUNFTkNfQnVmRGVzYzsKKworCisvKioKKyAqICBEZWZpbmVzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0IGNoYW5uZWxzKS4gKi8KKyAgICBJTlQgICAgICAgICAgICAgICAgIG51bUFuY0J5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIHRvIGJlIGVuY29kZWQuICovCisKK30gQUFDRU5DX0luQXJnczsKKworCisvKioKKyAqICBEZWZpbmVzIHRoZSBvdXRwdXQgYXJndW1lbnRzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSU5UICAgICAgICAgICAgICAgICBudW1PdXRCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzdHJlYW0gYnl0ZXMgZ2VuZXJhdGVkIGR1cmluZyBhYWNFbmNFbmNvZGUoKS4gKi8KKyAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgYnkgdGhlIGVuY29kZXIuICovCisgICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4gKi8KKworfSBBQUNFTkNfT3V0QXJnczsKKworCisvKioKKyAqICBNZXRhIERhdGEgQ29tcHJlc3Npb24gUHJvZmlsZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FICAgICAgICAgID0gMCwgICAvKiE8IE5vbmUuICovCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNU1RBTkRBUkQgID0gMSwgICAvKiE8IEZpbG0gc3RhbmRhcmQuICovCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQgICAgID0gMiwgICAvKiE8IEZpbG0gbGlnaHQuICovCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEID0gMywgICAvKiE8IE11c2ljIHN0YW5kYXJkLiAqLworICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNMSUdIVCAgICA9IDQsICAgLyohPCBNdXNpYyBsaWdodC4gKi8KKyAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1NQRUVDSCAgICAgICAgPSA1ICAgIC8qITwgU3BlZWNoLiAqLworCit9IEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRTsKKworCisvKioKKyAqICBNZXRhIERhdGEgc2V0dXAgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGRyY19wcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUcgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGNvbXBfcHJvZmlsZTsgICAgICAgICAgICAvKiE8IEVUU0kgaGVhdnkgY29tcHJlc3Npb24gcHJvZmlsZS4gU2VlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFLiAqLworCisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWw7ICAgICAgLyohPCBVc2VkIHRvIGRlZmluZSBleHBlY3RlZCBsZXZlbCB0bzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiAqLworICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbDsgICAgIC8qITwgQWRqdXN0IGxpbWl0ZXIgdG8gYXZvaWQgb3ZlcmxvYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KKworICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsgIC8qITwgRmxhZywgaWYgcHJvZ19yZWZfbGV2ZWwgaXMgcHJlc2VudCAqLworICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWw7ICAgICAgICAgIC8qITwgUHJvZ3JhbW1lIFJlZmVyZW5jZSBMZXZlbCA9IERpYWxvZ3VlIExldmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMxLjc1ZEIgLi4gMCBkQiA7IHN0ZXBzaXplOiAwLjI1ZEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiovCisKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIFBDRV9taXhkb3duX2lkeF9wcmVzZW50OyAvKiE8IEZsYWcsIGlmIGRteC1pZHggc2hvdWxkIGJlIHdyaXR0ZW4gaW4gcHJvZ3JhbW1lIGNvbmZpZyBlbGVtZW50ICovCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBFVFNJX0RteEx2bF9wcmVzZW50OyAgICAgLyohPCBGbGFnLCBpZiBkbXgtbHZsIHNob3VsZCBiZSB3cml0dGVuIGluIEVUU0ktYW5jRGF0YSAqLworCisgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJNaXhMZXZlbDsgICAgICAgICAgLyohPCBDZW50ZXIgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKyAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIHN1cnJvdW5kTWl4TGV2ZWw7ICAgICAgICAvKiE8IFN1cnJvdW5kIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCisKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGRvbGJ5U3Vycm91bmRNb2RlOyAgICAgICAvKiE8IEluZGljYXRpb24gZm9yIERvbGJ5IFN1cnJvdW5kIEVuY29kaW5nIE1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvbGJ5IFN1cnJvdW5kIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiAyLWNoIGF1ZGlvIHBhcnQgaXMgbm90IERvbGJ5IHN1cnJvdW5kIGVuY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogMi1jaCBhdWRpbyBwYXJ0IGlzIERvbGJ5IHN1cnJvdW5kIGVuY29kZWQgKi8KK30gQUFDRU5DX01ldGFEYXRhOworCisKKy8qKgorICogQUFDIGVuY29kZXIgY29udHJvbCBmbGFncy4KKyAqCisgKiBJbiBpbnRlcmFjdGlvbiB3aXRoIHRoZSA6OkFBQ0VOQ19DT05UUk9MX1NUQVRFIHBhcmFtZXRlciBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsCisgKiBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgZnJvbSBleHRlcm4gd2hlbiBuZWNlc3NhcnkuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEFBQ0VOQ19JTklUX05PTkUgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBEbyBub3QgdHJpZ2dlciBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBBQUNFTkNfSU5JVF9DT05GSUcgICAgICAgICAgICA9IDB4MDAwMSwgIC8qITwgSW5pdGlhbGl6ZSBhbGwgZW5jb2RlciBtb2R1bGVzIGNvbmZpZ3VyYXRpb24uICovCisgICAgQUFDRU5DX0lOSVRfU1RBVEVTICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IFJlc2V0IGFsbCBlbmNvZGVyIG1vZHVsZXMgaGlzdG9yeSBidWZmZXIuICovCisgICAgQUFDRU5DX0lOSVRfVFJBTlNQT1JUICAgICAgICAgPSAweDEwMDAsICAvKiE8IEluaXRpYWxpemUgdHJhbnNwb3J0IGxpYiB3aXRoIG5ldyBwYXJhbWV0ZXJzLiAqLworICAgIEFBQ0VOQ19SRVNFVF9JTkJVRkZFUiAgICAgICAgID0gMHgyMDAwLCAgLyohPCBSZXNldCBmaWxsIGxldmVsIG9mIGludGVybmFsIGlucHV0IGJ1ZmZlci4gKi8KKyAgICBBQUNFTkNfSU5JVF9BTEwgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgSW5pdGlhbGl6ZSBhbGwuICovCit9CitBQUNFTkNfQ1RSTEZMQUdTOworCisKKy8qKgorICogXGJyaWVmICBBQUMgZW5jb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMuCisgKgorICogVXNlIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbiB0byBjb25maWd1cmUsIG9yIHVzZSBhYWNFbmNvZGVyX0dldFBhcmFtKCkgZnVuY3Rpb24gdG8gcmVhZAorICogdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBBQUNFTkNfQU9UICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLCAgLyohPCBBdWRpbyBvYmplY3QgdHlwZS4gU2VlIDo6QVVESU9fT0JKRUNUX1RZUEUgaW4gRkRLX2F1ZGlvLmguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOTogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gYW5kIFBhcmFtZXRyaWMgU3RlcmVvIChIRS1BQUMgdjIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgb25seSB3aXRoIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIzOiBNUEVHLTQgQUFDIExvdy1EZWxheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzOTogTVBFRy00IEFBQyBFbmhhbmNlZCBMb3ctRGVsYXkuIFNpbmNlIHRoZXJlIGlzIG5vIDo6QVVESU9fT0JKRUNUX1RZUEUgZm9yIEVMRCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3aXRoIFNCUiBkZWZpbmVkLCBlbmFibGUgU0JSIGV4cGxpY2l0ZWx5IGJ5IDo6QUFDRU5DX1NCUl9NT0RFIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMjk6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTMyOiBNUEVHLTIgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxNTY6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGFuZCBQYXJhbWV0cmljIFN0ZXJlbyAoSEUtQUFDIHYyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBvbmx5IHdpdGggc3RlcmVvIGlucHV0IGF1ZGlvIGRhdGEuICovCisKKyAgQUFDRU5DX0JJVFJBVEUgICAgICAgICAgICAgICAgICA9IDB4MDEwMSwgIC8qITwgVG90YWwgZW5jb2RlciBiaXRyYXRlLiBUaGlzIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgYW5kIGludGVyYWN0cyB3aXRoIDo6QUFDRU5DX0JJVFJBVEVNT0RFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIENCUjogQml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgXHJlZiBzdXBwQml0cmF0ZXMgZm9yIGRldGFpbHMuICovCisKKyAgQUFDRU5DX0JJVFJBVEVNT0RFICAgICAgICAgICAgICA9IDB4MDEwMiwgIC8qITwgQml0cmF0ZSBtb2RlLiBDb25maWd1cmF0aW9uIGNhbiBiZSBkaWZmZXJlbnQga2luZCBvZiBiaXRyYXRlIGNvbmZpZ3VyYXRpb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IENvbnN0YW50IGJpdHJhdGUsIHVzZSBiaXRyYXRlIGFjY29yZGluZyB0byA6OkFBQ0VOQ19CSVRSQVRFLiAoZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXRoaW4gbm9uZSBMRC9FTEQgOjpBVURJT19PQkpFQ1RfVFlQRSwgdGhlIENCUiBtb2RlIG1ha2VzIHVzZSBvZiBmdWxsIGFsbG93ZWQgYml0cmVzZXJ2b2lyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNvbnRyYXN0LCBhdCBMb3ctRGVsYXkgOjpBVURJT19PQkpFQ1RfVFlQRSB0aGUgYml0cmVzZXJ2b2lyIGlzIGtlcHQgdmVyeSBzbWFsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA4OiBMRC9FTEQgZnVsbCBiaXRyZXNlcnZvaXIgZm9yIHBhY2tldCBiYXNlZCB0cmFuc21pc3Npb24uICovCisKKyAgQUFDRU5DX1NBTVBMRVJBVEUgICAgICAgICAgICAgICA9IDB4MDEwMywgIC8qITwgQXVkaW8gaW5wdXQgZGF0YSBzYW1wbGluZyByYXRlLiBFbmNvZGVyIHN1cHBvcnRzIGZvbGxvd2luZyBzYW1wbGluZyByYXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwICovCisKKyAgQUFDRU5DX1NCUl9NT0RFICAgICAgICAgICAgICAgICA9IDB4MDEwNCwgIC8qITwgQ29uZmlndXJlIFNCUiBpbmRlcGVuZGVudGx5IG9mIHRoZSBjaG9zZW4gQXVkaW8gT2JqZWN0IFR5cGUgOjpBVURJT19PQkpFQ1RfVFlQRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIEVMRCBhdWRpbyBvYmplY3QgdHlwZSBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC0xOiBVc2UgRUxEIFNCUiBhdXRvIGNvbmZpZ3VyYXRvciAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGlzYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLiAqLworCisgIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSCAgICAgICAgICAgPSAweDAxMDUsICAvKiE8IENvcmUgZW5jb2RlciAoQUFDKSBhdWRpbyBmcmFtZSBsZW5ndGggaW4gc2FtcGxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDI0OiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNTEyOiBEZWZhdWx0IExEL0VMRCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDQ4MDogT3B0aW9uYWwgbGVuZ3RoIGluIExEL0VMRCBjb25maWd1cmF0aW9uLiAqLworCisgIEFBQ0VOQ19DSEFOTkVMTU9ERSAgICAgICAgICAgICAgPSAweDAxMDYsICAvKiE8IFNldCBleHBsaWNpdCBjaGFubmVsIG1vZGUuIENoYW5uZWwgbW9kZSBtdXN0IG1hdGNoIHdpdGggbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtNyBhbmQgMzMsMzQ6IE1QRUcgY2hhbm5lbCBtb2RlcyBzdXBwb3J0ZWQsIHNlZSA6OkNIQU5ORUxfTU9ERSBpbiBGREtfYXVkaW8uaC4gKi8KKworICBBQUNFTkNfQ0hBTk5FTE9SREVSICAgICAgICAgICAgID0gMHgwMTA3LCAgLyohPCBJbnB1dCBhdWRpbyBkYXRhIGNoYW5uZWwgb3JkZXJpbmcgc2NoZW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkuIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IFdBVkUgZmlsZSBmb3JtYXQgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBMLCBSLCBDLCBMRkUsIFNMLCBTUikuICovCisKKyAgQUFDRU5DX1NCUl9SQVRJTyAgICAgICAgICAgICAgICA9IDB4MDEwOCwgIC8qITwgIENvbnRyb2xzIGFjdGl2YXRpb24gb2YgZG93bnNhbXBsZWQgU0JSLiBXaXRoIGRvd25zYW1wbGVkIFNCUiwgdGhlIGRlbGF5IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ZXIuIE9uIHRoZSBvdGhlciBoYW5kLCBmb3IgYWNoaWV2aW5nIHRoZSBzYW1lIHF1YWxpdHkgbGV2ZWwsIGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgbW9yZSBiaXRzIHRoYW4gZHVhbC1yYXRlIFNCUi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggZG93bnNhbXBsZWQgU0JSLCB0aGUgQUFDIGVuY29kZXIgd2lsbCB3b3JrIGF0IHRoZSBzYW1lIHNhbXBsaW5nIHJhdGUgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlIgZW5jb2RlciAoc2luZ2xlIHJhdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bnNhbXBsZWQgU0JSIGlzIHN1cHBvcnRlZCBmb3IgQUFDLUVMRCBhbmQgSEUtQUFDdjEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRHVhbC1yYXRlIFNCUiAgIChkZWZhdWx0IGZvciBIRS1BQUMpLiAqLworCisgIEFBQ0VOQ19BRlRFUkJVUk5FUiAgICAgICAgICAgICAgPSAweDAyMDAsICAvKiE8IFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIGFmdGVyYnVybmVyIGZlYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhZnRlcmJ1cm5lciBpcyBhIHR5cGUgb2YgYW5hbHlzaXMgYnkgc3ludGhlc2lzIGFsZ29yaXRobSB3aGljaCBpbmNyZWFzZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHF1YWxpdHkgYnV0IGFsc28gdGhlIHJlcXVpcmVkIHByb2Nlc3NpbmcgcG93ZXIuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSB0aGlzIGlmIGFkZGl0aW9uYWwgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBwcm9jZXNzaW5nIHBvd2VyIGNvbnN1bXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIHByb2JsZW0uIElmIGluY3JlYXNlZCBNSHogYW5kIG1lbW9yeSBjb25zdW1wdGlvbiBhcmUgYW4gaXNzdWUgdGhlbiB0aGUgTUh6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtZW1vcnkgY29zdCBvZiB0aGlzIG9wdGlvbmFsIG1vZHVsZSBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBpbXByb3ZlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhdWRpbyBxdWFsaXR5IG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgYWZ0ZXJidXJuZXIgKGRlZmF1bHQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBhZnRlcmJ1cm5lci4gKi8KKworICBBQUNFTkNfQkFORFdJRFRIICAgICAgICAgICAgICAgID0gMHgwMjAzLCAgLyohPCBDb3JlIGVuY29kZXIgYXVkaW8gYmFuZHdpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERldGVybWluZSBiYW5kd2lkdGggaW50ZXJuYWxseSAoZGVmYXVsdCwgc2VlIGNoYXB0ZXIgXHJlZiBCRUhBVklPVVJfQkFORFdJRFRIKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIHRvIGZzLzI6IEZyZXF1ZW5jeSBiYW5kd2lkdGggaW4gSGVydHouIChFeHBlcnRzIG9ubHksIGJldHRlciBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoIHRoaXMgdmFsdWUgdG8gYXZvaWQgZGVncmFkZWQgYXVkaW8gcXVhbGl0eSkgKi8KKworICBBQUNFTkNfVFJBTlNNVVggICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBUcmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkLiBTZWUgOjpUUkFOU1BPUlRfVFlQRSBpbiBGREtfYXVkaW8uaC4gRm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGNhbiBiZSBjb25maWd1cmVkIGluIGVuY29kZXIgbGlicmFyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiByYXcgYWNjZXNzIHVuaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogQURJRiBiaXRzdHJlYW0gZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogQURUUyBiaXRzdHJlYW0gZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNjogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNzogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAwLCBvdXQgb2YgYmFuZCBTdHJlYW1NdXhDb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDogQXVkaW8gU3luYyBTdHJlYW0gKExPQVMpICovCisKKyAgQUFDRU5DX0hFQURFUl9QRVJJT0QgICAgICAgICAgICA9IDB4MDMwMSwgIC8qITwgRnJhbWUgY291bnQgcGVyaW9kIGZvciBzZW5kaW5nIGluLWJhbmQgY29uZmlndXJhdGlvbiBidWZmZXJzIHdpdGhpbiBMQVRNL0xPQVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGxheWVyLiBBZGRpdGlvbmFsbHkgdGhpcyBwYXJhbWV0ZXIgY29uZmlndXJlcyB0aGUgUENFIHJlcGV0aXRpb24gcGVyaW9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJhd19kYXRhX2Jsb2NrKCkuIFNlZSBccmVmIGVuY1BDRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweEZGOiBhdXRvLW1vZGUgZGVmYXVsdCAxMCBmb3IgVFRfTVA0X0FEVFMsIFRUX01QNF9MT0FTIGFuZCBUVF9NUDRfTEFUTV9NQ1AxLCBvdGhlcndpc2UgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBuOiBGcmFtZSBjb3VudCBwZXJpb2QuICovCisKKyAgQUFDRU5DX1NJR05BTElOR19NT0RFICAgICAgICAgICA9IDB4MDMwMiwgIC8qITwgU2lnbmFsaW5nIG1vZGUgb2YgdGhlIGV4dGVuc2lvbiBBT1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogSW1wbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZSBzaWduYWxpbmcgKGRlZmF1bHQgZm9yIG5vbi1NUEVHLTQgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBT1QncyBhbmQgZm9yIHRoZSB0cmFuc3BvcnQgZm9ybWF0cyBBRElGIGFuZCBBRFRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGltcGxpY2l0IHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZCBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seSBkZWNvZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG9ubHkgZGVjb2RlIHRoZSBsb3ctZnJlcXVlbmN5IHBhcnQgb2YgdGhlIHN0cmVhbSwgcmVzdWx0aW5nIGluIGEgYmFuZC1saW1pdGVkIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2Qgd29ya3Mgd2l0aCBhbGwgdHJhbnNwb3J0IGZvcm1hdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFeHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIGJ5IGV2ZXJ5IEFBQyBkZWNvZGVyLCBldmVuIEFBQy1MQy1vbmx5IGRlY29kZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGRlY29kZXIgbm90IGNhcGFibGUgb2YgZGVjb2RpbmcgUFMgd2lsbCBvbmx5IGRlY29kZSB0aGUgQUFDLUxDK1NCUiBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBjb250YWluZWQgUFMsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGEgZGVjb2RlZCBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEZvciBMT0FTL0xBVE0sIGl0IG9ubHkgd29ya3Mgd2l0aCBBdWRpb011eFZlcnNpb249PTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgKGRlZmF1bHQgZm9yIE1QRUctNCBiYXNlZCBBT1QncyBhbmQgZm9yIGFsbCB0cmFuc3BvcnQgZm9ybWF0cyBleGNsdWRpbmcgQURJRiBhbmQgQURUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIG9ubHkgYnkgSEUtQUFDIGRlY29kZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgbm90IGRlY29kZSBhIHN0cmVhbSB0aGF0IHVzZXMgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBkZWNvZGVyIG5vdCBjYXBhYmxlIG9mIGRlY29kaW5nIFBTIHdpbGwgbm90IGRlY29kZSB0aGUgc3RyZWFtIGF0IGFsbCBpZiBpdCBjb250YWluZWQgUFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEl0IHdvcmtzIHdpdGggTE9BUy9MQVRNIGFuZCB0aGUgTVBFRy00IEZpbGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGFsd2F5cyBleHBlcmllbmNlcyB0aGUgYmVzdCBhdWRpbyBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgYSBmdWxsIEhFLUFBQy1jYXBhYmxlIGRlY29kZXIgd2lsbCBkZWNvZGUgdGhvc2Ugc3RyZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBpcyBwbGF5ZWQgYXQgZnVsbCBiYW5kd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYmVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZW5jb2RlIHdpdGggaW1wbGljaXQgU0JSIHNpZ25hbGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZGVjb2RlciBjYXBhYmxlIG9mIEFBQy1MQyBvbmx5IHdpbGwgdGhlbiBvbmx5IGRlY29kZSB0aGUgQUFDIHBhcnQsIHdoaWNoIG1lYW5zIHRoZSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB3aWxsIHNvdW5kIGJhbmQtbGltaXRlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIE1QRUctMiB0cmFuc3BvcnQgdHlwZXMgKEFEVFMsQURJRiksIG9ubHkgaW1wbGljaXQgc2lnbmFsaW5nIGlzIHBvc3NpYmxlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgTE9BUyBhbmQgTEFUTSwgZXhwbGljaXQgYmFja3dhcmRzIGNvbXBhdGlibGUgc2lnbmFsaW5nIG9ubHkgd29ya3MgdG9nZXRoZXIgd2l0aCBBdWRpb011eFZlcnNpb249PTEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhc29uIGlzIHRoYXQsIGZvciBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgQVNDLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBkZWNvZGVyIHRoYXQgaXMgb25seSBjYXBhYmxlIG9mIGRlY29kaW5nIEFBQy1MQyB3aWxsIHNraXAgdGhpcyBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV2ZXJ0aGVsZXNzLCBmb3IganVtcGluZyB0byB0aGUgZW5kIG9mIHRoZSBBU0MsIGl0IG5lZWRzIHRvIGtub3cgdGhlIEFTQyBsZW5ndGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc21pdHRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVNDIGlzIGEgZmVhdHVyZSBvZiBBdWRpb011eFZlcnNpb249PTEsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0cmFuc21pdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgQVNDIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLCB0aGVyZWZvcmUgYW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHBhcnNlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQVMvTEFUTSBzdHJlYW0gdGhhdCB3YXMgYmVpbmcgZW5jb2RlZCB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRvd25zYW1wbGVkIFNCUiwgZXhwbGljaXQgc2lnbmFsaW5nIGlzIG1hbmRhdG9yeS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHNhbXBsaW5nIGZyZXF1ZW5jeSAod2hpY2ggaXMgaW4gY2FzZSBvZiBTQlIgdGhlIHNhbXBsaW5nIGZyZXF1cW5jeSBvZiB0aGUgU0JSIHBhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gb25seSBiZSBzaWduYWxlZCBpbiBleHBsaWNpdCBtb2RlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQUFDLUVMRCwgdGhlIFNCUiBpbmZvcm1hdGlvbiBpcyB0cmFuc21pdHRlZCBpbiB0aGUgRUxEU3BlY2lmaWMgQ29uZmlnLCB3aGljaCBpcyBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TcGVjaWZpY0NvbmZpZy4gVGhlcmVmb3JlLCB0aGUgc2V0dGluZ3MgaGVyZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIEFBQy1FTEQuKi8KKworICBBQUNFTkNfVFBTVUJGUkFNRVMgICAgICAgICAgICAgID0gMHgwMzAzLCAgLyohPCBOdW1iZXIgb2Ygc3ViIGZyYW1lcyBpbiBhIHRyYW5zcG9ydCBmcmFtZSBmb3IgTE9BUy9MQVRNIG9yIEFEVFMgKGRlZmF1bHQgMSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURUUzogTWF4aW11bSBudW1iZXIgb2Ygc3ViIGZyYW1lcyByZXN0cmljdGVkIHRvIDQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTE9BUy9MQVRNOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gMi4qLworCisgIEFBQ0VOQ19QUk9URUNUSU9OICAgICAgICAgICAgICAgPSAweDAzMDYsICAvKiE8IENvbmZpZ3VyZSBwcm90ZWN0aW9uIGluIHRyYW5wc29ydCBsYXllcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBwcm90ZWN0aW9uLiAoZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBDUkMgYWN0aXZlIGZvciBBRFRTIGJpdHN0cmVhbSBmb3JtYXQuICovCisKKyAgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFICAgICAgICA9IDB4MDUwMCwgIC8qITwgQ29uc3RhbnQgYW5jaWxsYXJ5IGRhdGEgYml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBFaXRoZXIgbm8gYW5jaWxsYXJ5IGRhdGEgb3IgaW5zZXJ0IGV4YWN0IG51bWJlciBvZiBieXRlcywgZGVub3RlZCB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBwYXJhbWV0ZXIsIG51bUFuY0J5dGVzIGluIEFBQ0VOQ19JbkFyZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogSW5zZXJ0IGFuY2lsbGFyeSBkYXRhIHdpdGggc3BlY2lmaWVkIGJpdHJhdGUuICovCisKKyAgQUFDRU5DX01FVEFEQVRBX01PREUgICAgICAgICAgICA9IDB4MDYwMCwgIC8qITwgQ29uZmlndXJlIE1ldGEgRGF0YS4gU2VlIDo6QUFDRU5DX01ldGFEYXRhIGZvciBmdXJ0aGVyIGRldGFpbHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRG8gbm90IGVtYmVkIGFueSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbWJlZCBNUEVHIGRlZmluZWQgbWV0YWRhdGEgb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBFbWJlZCBhbGwgbWV0YWRhdGEuICovCisKKyAgQUFDRU5DX0NPTlRST0xfU1RBVEUgICAgICAgICAgICA9IDB4RkYwMCwgIC8qITwgVGhlcmUgaXMgYW4gYXV0b21hdGljIHByb2Nlc3Mgd2hpY2ggaW50ZXJuYWxseSByZWNvbmZpZ3VyZXMgdGhlIGVuY29kZXIgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNoYW5nZWQgb3IgYW4gZXJyb3Igb2NjdXJlZC4gVGhpcyBwYXJhbWVydGVyIGFsbG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGluZyBvciBnZXR0aW5nIHRoZSBjb250cm9sIHN0YXR1cyBvZiB0aGlzIHByb2Nlc3MuIFNlZSA6OkFBQ0VOQ19DVFJMRkxBR1MuICovCisKKyAgQUFDRU5DX05PTkUgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgLS0tLS0tICovCisKK30gQUFDRU5DX1BBUkFNOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgIE9wZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGVuY29kZXIuCisgKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBlbmNvZGVyIGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbmFsIHJhbmdlIGRlbm90ZWQgYnkgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgKiBQcmVpbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgKgorICogXHBhcmFtIHBoQWFjRW5jb2RlciAgQSBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKiBccGFyYW0gZW5jTW9kdWxlcyAgICBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBlbmNvZGVyIGluc3RhbmNlOgorICogICAgICAgICAgICAgICAgICAgICAgLSAweDA6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGF2YWlsYWJsZSBlbmNvZGVyIG1vZHVsZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAtIGVsc2U6IFNlbGVjdCBtZW1vcnkgYWxsb2NhdGlvbiByZWdhcmRpbmcgZW5jb2RlciBtb2R1bGVzLiBGb2xsb3dpbmcgZmxhZ3MgYXJlIHBvc3NpYmxlIGFuZCBjYW4gYmUgY29tYmluZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwMTogQUFDIG1vZHVsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDAyOiBTQlIgbW9kdWxlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDQ6IFBTIG1vZHVsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDEwOiBNZXRhZGF0YSBtb2R1bGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZXhhbXBsZTogKDB4MDF8MHgwMnwweDA0fDB4MTApIGFsbG9jYXRlcyBhbGwgbW9kdWxlcyBhbmQgaXMgZXF1aXZhbGVudCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGVub3RldCBieSAweDAuCisgKiBccGFyYW0gbWF4Q2hhbm5lbHMgICBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgYWxsb2NhdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5czoKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gMDogQWxsb2NhdGUgbWF4aW11bSBudW1iZXIgb2YgQUFDIGFuZCBTQlIgY2hhbm5lbHMgYXMgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHM6IFVzZSBzYW1lIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBpbiBBQUMgYW5kIFNCUiBtb2R1bGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAtIG5DaGFubmVscyB8IChuU2JyQ2g8PDgpOiBOdW1iZXIgb2YgU0JSIGNoYW5uZWxzIGNhbiBiZSBkaWZmZXJlbnQgdG8gQUFDIGNoYW5uZWxzIHRvIHNhdmUgZGF0YSBtZW1vcnkuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfTUVNT1JZX0VSUk9SLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCisgKi8KK0FBQ0VOQ19FUlJPUiBhYWNFbmNPcGVuKAorICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiAgICAgICAgKnBoQWFjRW5jb2RlciwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBlbmNNb2R1bGVzLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIG1heENoYW5uZWxzCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIENsb3NlIHRoZSBlbmNvZGVyIGluc3RhbmNlLgorICoKKyAqIERlYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCisgKgorICogXHBhcmFtIHBoQWFjRW5jb2RlciAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KKyAqLworQUFDRU5DX0VSUk9SIGFhY0VuY0Nsb3NlKAorICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiAgICAgICAgKnBoQWFjRW5jb2RlcgorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmIEVuY29kZSBhdWRpbyBkYXRhLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IGZvciBlbmNvZGluZyBhdWRpbyBkYXRhLiBJbiBhZGRpdGlvbiB0aGUgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFuIGVuY29kZXIgKHJlKWNvbmZpZ3VyYXRpb24KKyAqIHByb2Nlc3MuCisgKiAtIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHVudGlsIHRoZSBmaWxsIGxldmVsIGFsbG93cyBlbmNvZGluZyBhIHNpbmdsZSBmcmFtZS4KKyAqICAgVGhpcyBmdW5jdGlvbmFsaXR5IGFsbG93cyBhbiBleHRlcm5hbCBidWZmZXIgd2l0aCByZWR1Y2VkIHNpemUgaW4gY29tcGFyaXNvbiB0byB0aGUgQUFDIG9yIEhFLUFBQyBhdWRpbyBmcmFtZSBsZW5ndGguCisgKiAtIElmIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCBpcyB6ZXJvLCBqdXN0IGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGl0IGlzCisgKiAgIHJlcXVlc3RlZC4KKyAqIC0gQXQgdGhlIGVuZCBvZiBhIGZpbGUgdGhlIGZsdXNoaW5nIHByb2Nlc3MgY2FuIGJlIHRyaWdnZXJkIHZpYSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCB0byAtMS4KKyAqICAgVGhlIGVuY29kZXIgZGVsYXkgbGluZXMgYXJlIGZ1bGx5IGZsdXNoZWQgd2hlbiB0aGUgZW5jb2RlciByZXR1cm5zIG5vIHZhbGlkIGJpdHN0cmVhbSBkYXRhIEFBQ0VOQ19PdXRBcmdzOjpudW1PdXRCeXRlcy4KKyAqICAgRnVydGhlcm1vcmUgdGhlIGVuZCBvZiBmaWxlIGlzIHNpZ25hbGVkIGJ5IHRoZSByZXR1cm4gdmFsdWUgQUFDRU5DX0VOQ09ERV9FT0YuCisgKiAtIElmIGFuIGVycm9yIG9jY3VyZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lIG9yIGFueSBvZiB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIGNoYW5nZWQsIGFuIGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24KKyAqICAgcHJvY2VzcyB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlIGVuY29kaW5nIHRoZSBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLgorICogLSBUaGUgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCBmb3IgYW4gaW5kZXBlbmRlbnQgcmVjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2l0aG91dCBlbmNvZGluZy4gVGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgdG8gYmUgYQorICogICB2YWxpZCBlbmNvZGVyIGhhbmRsZSBhbmQgYWxsIG90aGVyIHBhcmFtZXRlcnMgY2FuIGJlIHNldCB0byBOVUxMLgorICogLSBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZXJuYWwgYml0YnVmZmVyIGluIG91dEJ1ZkRlc2MgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHdyaXRpbmcgdGhlIHdob2xlIGJpdHN0cmVhbSwgYW4gaW50ZXJuYWwKKyAqICAgZXJyb3Igd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBhIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZC4KKyAqCisgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGluQnVmRGVzYyAgICAgICAgICAgICBJbnB1dCBidWZmZXIgZGVzY3JpcHRvciwgc2VlIEFBQ0VOQ19CdWZEZXNjOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEF0IGxlYXN0IG9uZSBpbnB1dCBidWZmZXIgd2l0aCBhdWRpbyBkYXRhIGlzIGV4cGVjdGVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE9wdGlvbmFsbHkgYSBzZWNvbmQgaW5wdXQgYnVmZmVyIHdpdGggYW5jaWxsYXJ5IGRhdGEgY2FuIGJlIGZlZC4KKyAqIFxwYXJhbSBvdXRCdWZEZXNjICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBkZXNjcmlwdG9yLCBzZWUgQUFDRU5DX0J1ZkRlc2M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGVuY29kZWQgYml0c3RyZWFtLgorICogXHBhcmFtIGluYXJncyAgICAgICAgICAgICAgICBJbnB1dCBhcmd1bWVudHMsIHNlZSBBQUNFTkNfSW5BcmdzLgorICogXHBhcmFtIG91dGFyZ3MgICAgICAgICAgICAgICBPdXRwdXQgYXJndW1lbnRzLCBBQUNFTkNfT3V0QXJncy4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfRU5DT0RFX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kaW5nIHByb2Nlc3MuCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgQUFDRU5DX0lOSVRfRVJST1IsIEFBQ0VOQ19JTklUX0FBQ19FUlJPUiwgQUFDRU5DX0lOSVRfU0JSX0VSUk9SLCBBQUNFTkNfSU5JVF9UUF9FUlJPUiwKKyAqICAgICAgICAgICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGVyIGluaXRpYWxpemF0aW9uLgorICogICAgICAgICAgLSBBQUNFTkNfRU5DT0RFX0VPRiwgd2hlbiBmbHVzaGluZyBmdWxseSBjb25jbHVkZWQuCisgKi8KK0FBQ0VOQ19FUlJPUiBhYWNFbmNFbmNvZGUoCisgICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCisgICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqaW5CdWZEZXNjLAorICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKm91dEJ1ZkRlc2MsCisgICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgICAgICAqaW5hcmdzLAorICAgICAgICBBQUNFTkNfT3V0QXJncyAgICAgICAgICAgKm91dGFyZ3MKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgQWNxdWlyZSBpbmZvIGFib3V0IHByZXNlbnQgZW5jb2RlciBpbnN0YW5jZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBpbmZvcm1hdGlvbiBvZiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uLiBJbiBhZGRpdGlvbiB0byBpbmZvcm1hdGl2ZSBpbnRlcm5hbCBzdGF0ZXMsCisgKiBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayBvZiB0aGUgY3VycmVudCBlbmNvZGVyIHNldHRpbmdzIHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBmb3JtYXQgaXMgZWl0aGVyIEF1ZGlvIFNwZWNpZmljIENvbmZpZworICogaW4gY2FzZSBvZiBSYXcgUGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0IG9yIFN0cmVhbU11eENvbmZpZyBpbiBjYXNlIG9mIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiBUaGUgY29uZmlndXJhdGlvbgorICogZGF0YSBibG9jayBpcyBiaW5hcnkgY29kZWQgYXMgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IGF1ZGlvKSwgdG8gYmUgdXNlZCBkaXJlY3RseSBmb3IgTVBFRy00IEZpbGUgRm9ybWF0CisgKiBvciBSRkMzMDE2IG9yIFJGQzM2NDAgYXBwbGljYXRpb25zLgorICoKKyAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcEluZm8gICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQUFDRU5DX0luZm9TdHJ1Y3QuIEZpbGxlZCBvbiByZXR1cm4uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK0FBQ0VOQ19FUlJPUiBhYWNFbmNJbmZvKAorICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAorICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCAgICAgICAgKnBJbmZvCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIFNldCBvbmUgc2luZ2xlIEFBQyBlbmNvZGVyIHBhcmFtZXRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIGFsbCBlbmNvZGVyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIDo6QUFDRU5DX1BBUkFNLiBFYWNoIHBhcmFtZXRlciBtdXN0IGJlCisgKiBzZXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGNhbGwuIEFuIGludGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmFuZ2Ugd2lsbCBiZSBkb25lIGFuZCBhbgorICogaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgc2lnbmFsZWQuIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBhZG9wdGlvbiBpcyBwYXJ0IG9mIHRoZSBzdWJzZXF1ZW50IGFhY0VuY0VuY29kZSgpIGNhbGwuCisgKgorICogXHBhcmFtIGhBYWNFbmNvZGVyICAgICAgICAgICBBIHZhbGlkIEFBQyBlbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwYXJhbSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRvIGJlIHNldC4gU2VlIDo6QUFDRU5DX1BBUkFNLgorICogXHBhcmFtIHZhbHVlICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdmFsdWUuIFNlZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gaW4gOjpBQUNFTkNfUEFSQU0uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiwgQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgorICovCitBQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKKyAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbSwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICB2YWx1ZQorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmICBHZXQgb25lIHNpbmdsZSBBQUMgZW5jb2RlciBwYXJhbWV0ZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY29tcGxlbWVudCB0byBhYWNFbmNvZGVyX1NldFBhcmFtKCkuIEFmdGVyIGVuY29kZXIgcmVpbml0aWFsaXphdGlvbiB3aXRoIHVzZXIgZGVmaW5lZCBzZXR0aW5ncywKKyAqIHRoZSBpbnRlcm5hbCBzdGF0dXMgY2FuIGJlIG9idGFpbmVkIG9mIGVhY2ggcGFyYW1ldGVyLCBzcGVjaWZpZWQgd2l0aCA6OkFBQ0VOQ19QQVJBTS4KKyAqCisgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgcmV0dXJuZWQuIFNlZSA6OkFBQ0VOQ19QQVJBTS4KKyAqCisgKiBccmV0dXJuICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHZhbHVlIG9mIHNwZWNpZmVkIHBhcmFtZXRlciA6OkFBQ0VOQ19QQVJBTS4KKyAqLworVUlOVCBhYWNFbmNvZGVyX0dldFBhcmFtKAorICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAorICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBlbmNvZGVyIGxpYnJhcnkgYnVpbGQuCisgKgorICogRmlsbCBhIGdpdmVuIExJQl9JTkZPIHN0cnVjdHVyZSB3aXRoIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitBQUNFTkNfRVJST1IgYWFjRW5jR2V0TGliSW5mbygKKyAgICAgICAgTElCX0lORk8gICAgICAgICAgICAgICAgICppbmZvCisgICAgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAgLyogX0FBQ19FTkNfTElCX0hfICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2VlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmNwcApAQCAtMCwwICsxLDE5NCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3JzOiAgICAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKyAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBNZW1vcnkgbGF5b3V0CisgIFxhdXRob3IgTWFya3VzIExvaHdhc3NlcgorKi8KKworI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKKworICBDX0FBTExPQ19NRU0gKEFBQ2R5bmFtaWNfUkFNLCBGSVhQX0RCTCwgQUFDX0VOQ19EWU5fUkFNX1NJWkUvc2l6ZW9mKEZJWFBfREJMKSkKKworLyoKKyAgU3RhdGljIG1lbW9yeSBhcmVhcywgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW4gaW4gb3RoZXIgc2VjdGlvbnMgb2YgdGhlIGRlY29kZXIgIQorKi8KKworLyoKKyBUaGUgc3RydWN0dXJlIEFhY0VuY29kZXIgY29udGFpbnMgYWxsIEVuY29kZXIgc3RydWN0dXJlcy4KKyovCisKK0NfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FhY0VuY29kZXIsICAgICAgICAgICBBQUNfRU5DLCAgICAgICAgICAxKQorCisKKy8qCisgICBUaGUgc3RydWN0dXJlIFBTWV9JTlRFUk5BbCBjb250YWlucyBhbGwgcHN5Y2ggY29uZmlndXJhdGlvbiBhbmQgZGF0YSBwb2ludGVyLgorICAgKiBQc3lTdGF0aWMgaG9sZHMgbGFzdCBhbmQgY3VycmVudCBQc3ljaCBkYXRhLgorICAgKiBQc3lJbnB1dEJ1ZmZlciBjb250YWlucyB0aW1lIGlucHV0LiBTaWduYWwgaXMgbmVlZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgUHN5Y2guCisgICAgIE1lbW9yeSBjYW4gYmUgcmV1c2VkIGFmdGVyIHNpZ25hbCBpcyBpbiB0aW1lIGRvbWFpbi4KKyAgICogUHN5RGF0YSBjb250YWlucyBzcGVjdHJhbCwgbnJnIGFuZCB0aHJlc2hvbGQgaW5mb3JtYXRpb24uIE5lY2Vzc2FyeSBkYXRhIGFyZQorICAgICBjb3BpZWQgaW50byBQc3lPdXQsIHNvIG1lbW9yeSBpcyBhdmFpbGFibGUgYWZ0ZXIgbGVhdmluZyBwc3ljaC4KKyAgICogVG5zRGF0YSwgQ2hhb3NNZWFzdXJlLCBQbnNEYXRhIGFyZSB0ZW1wb3JhcmlseSBuZWNlc3NhcnksIGUuZy4gdXNlIG1lbW9yeSBmcm9tCisgICAgIFBzeUlucHV0QnVmZmVyLgorKi8KKworQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeUVsZW1lbnQsIFBTWV9FTEVNRU5ULCAxLCAoOCkpCisKK0NfQUxMT0NfTUVNICAoUmFtX2FhY0VuY19Qc3lJbnRlcm5hbCwgUFNZX0lOVEVSTkFMLCAxKQorQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeVN0YXRpYywgICBQU1lfU1RBVElDLCAgIDEsICg4KSkKKworQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNLCBNQVhfSU5QVVRfQlVGRkVSX1NJWkUsICg4KSkKKworICBQU1lfRFlOQU1JQyAqR2V0UmFtX2FhY0VuY19Qc3lEeW5hbWljIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgICAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKKyAgICAgIHJldHVybiAoKFBTWV9EWU5BTUlDKikgKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIG4qc2l6ZW9mKFBTWV9EWU5BTUlDKSkpOworICB9CisKKyAgQ19BTExPQ19NRU0gKFJhbV9ic091dGJ1ZmZlciwgVUNIQVIsIE9VVFBVVEJVRkZFUl9TSVpFKQorCisvKgorICAgVGhlIHN0cnVjdHVyZSBQU1lfT1VUIGhvbGRzIGFsbCBwc3ljaG9hY2NvdXN0aWMgZGF0YSBuZWVkZWQKKyAgIGluIHF1YW50aXphdGlvbiBtb2R1bGUKKyovCitDX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUHN5T3V0LCAgICAgICAgIFBTWV9PVVQsIDEsICgxKSkKKworQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzLCBQU1lfT1VUX0VMRU1FTlQsIDEsICgxKSooOCkpCitDX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbCwgIFBTWV9PVVRfQ0hBTk5FTCwgMSwgKDEpKig4KSkKKworCisvKgorICAgVGhlIHN0cnVjdHVyZSBRQ19TVEFURSBjb250YWlucyBwcmVpbml0aWFsaXplZCBzZXR0aW5ncyBhbmQgcXVhbnRpemVyIHN0cnVjdHVyZXMuCisgICAqIEFkanVzdFRocmVzaG9sZCBzdHJ1Y3R1cmUgY29udGFpbnMgZWxlbWVudC13aXNlIHNldHRpbmdzLgorICAgKiBFbGVtZW50Qml0cyBjb250YWlucyBlbGVtbnQtd2lzZSBiaXQgY29uc3VtcHRpb24gc2V0dGluZ3MuCisgICAqIFdoZW4gQ1JDIGlzIGFjdGl2ZSwgbG9va3VwIHRhYmxlIGlzIG5lY2Vzc2FyeSBmb3IgZmFzdCBjcmMgY2FsY3VsYXRpb24uCisgICAqIEJpdGNvdW50ZXIgY29udGFpbnMgYnVmZmVyIHRvIGZpbmQgb3B0aW1hbCBjb2RlYm9va3MgYW5kIG1pbmltYWwgYml0IGNvbnN1bXB0aW9uLgorICAgICBWYWx1ZXMgYXJlIHRlbXBvcmFyaWx5LCBzbyBkeW5hbWljIG1lbW9yeSBjYW4gYmUgdXNlZC4KKyovCisKK0NfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1FDc3RhdGUsIFFDX1NUQVRFLCAxKQorQ19BTExPQ19NRU0gKFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkLCBBREpfVEhSX1NUQVRFLCAxKQorCitDX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50LCBBVFNfRUxFTUVOVCwgMSwgKDgpKQorQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX0VsZW1lbnRCaXRzLCBFTEVNRU5UX0JJVFMsIDEsICg4KSkKK0NfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0JpdENudHJTdGF0ZSwgQklUQ05UUl9TVEFURSwgMSkKKworICBJTlQgKkdldFJhbV9hYWNFbmNfQml0TG9va1VwKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKKyAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKKyAgICByZXR1cm4gKChJTlQqKSAoZHluYW1pY19SQU0gKyBQX0JVRl8xKSk7CisgIH0KKyAgSU5UICpHZXRSYW1fYWFjRW5jX01lcmdlR2Fpbkxvb2tVcChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7CisgICAgcmV0dXJuICgoSU5UKikgKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIHNpemVvZihJTlQpKihNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpKSkpOworICB9CisKKworLyoKKyAgIFRoZSBzdHJ1Y3R1cmUgUUNfT1VUIGNvbnRhaW5zIHNldHRpbmdzIGFuZCBzdHJ1Y3R1cmVzIGhvbGRpbmcgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgbmVlZGVkIGluIGJpdHN0cmVhbXdyaXRlci4KKyovCisKK0NfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19RQ291dCwgUUNfT1VULCAxLCAoMSkpCitDX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCwgKDEpLCAoOCkpCisgIFFDX09VVF9DSEFOTkVMICpHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbCAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgeworICAgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7CisgICAgICByZXR1cm4gKChRQ19PVVRfQ0hBTk5FTCopIChkeW5hbWljX1JBTSArIFBfQlVGXzAgKyBuKnNpemVvZihRQ19PVVRfQ0hBTk5FTCkpKTsKKyAgfQorCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2RhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmgKQEAgLTAsMCArMSwyMjYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yczogICAgICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCisgICBDb250ZW50cy9kZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBNZW1vcnkgbGF5b3V0ICAgCisgIFxhdXRob3IgTWFya3VzIExvaHdhc3NlcgorKi8KKworI2lmbmRlZiBBQUNfRU5DX1JBTV9ICisjZGVmaW5lIEFBQ19FTkNfUkFNX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgImFhY2VuYy5oIgorI2luY2x1ZGUgInBzeV9kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicHN5X21haW4uaCIKKyNpbmNsdWRlICJiaXRlbmMuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKyAgI2RlZmluZSAgT1VUUFVUQlVGRkVSX1NJWkUgICAgKDgxOTIpICAvKiE8IE91dHB1dCBidWZmZXIgc2l6ZSBoYXMgdG8gYmUgYXQgbGVhc3QgNjE0NCBiaXRzIHBlciBjaGFubmVsICg3NjggYnl0ZXMpLiBGREsgYml0YnVmZmVyIGltcGxlbWVudGF0aW9uIGV4cGVjdHMgYnVmZmVyIG9mIHNpemUgMl5uLiAqLworCisKKy8qCisgIE1vdmVkIEFBQ19FTkMgc3RydWN0IGRlZmluaXRpb24gZnJvbSBhYWNfZW5jLmNwcCBpbnRvIGFhY0VuY19yYW0uaCB0byBnZXQgc2l6ZSBhbmQgcmVzcGVjdGl2ZQorICBzdGF0aWMgbWVtb3J5IGluIGFhY0VuY19yYW0uY3BwLgorICBhYWNfZW5jLmggaXMgdGhlIG91dHdhcmQgdmlzaWJsZSBoZWFkZXIgZmlsZSBhbmQgcHV0dGluZyB0aGUgc3RydWN0IGludG8gd291bGQgY2F1c2UgbmVjZXNzaXR5CisgIG9mIGFkZGl0aW9uYWwgdmlzaWJsZSBoZWFkZXIgZmlsZXMgb3V0c2lkZSBsaWJyYXJ5LgorKi8KKworLyogZGVmaW5lIGhCaXRzdHJlYW0gc2l6ZTogbWF4IEFBQyBmcmFtZWxlbmd0aCBpcyA2MTQ0IGJpdHMvY2hhbm5lbCAqLworLyojZGVmaW5lIEJVRkZFUl9CSVRTVFJfU0laRSAoKDY0MDAqKDgpL2JiV29yZFNpemUpICAgICsoKGJiV29yZFNpemUgLSAxKSAvIGJiV29yZFNpemUpKSovCisKK3N0cnVjdCBBQUNfRU5DIHsKKworICBBQUNFTkNfQ09ORklHICAgICpjb25maWc7CisKKyAgSU5UICAgICAgICAgICAgICAgYW5jaWxsYXJ5Qml0c1BlckZyYW1lOyAgICAgICAgICAgICAgLyogYW5jaWxsYXJ5IGJpdHMgcGVyIGZyYW1lIGNhbGN1bGF0ZWQgZnJvbSBhbmNpbGxhcnkgcmF0ZSAqLworCisgIENIQU5ORUxfTUFQUElORyAgIGNoYW5uZWxNYXBwaW5nOworCisgIFFDX1NUQVRFICAgICAgICAgKnFjS2VybmVsOworICBRQ19PVVQgICAgICAgICAgICpxY091dFsoMSldOworCisgIFBTWV9PVVQgICAgICAgICAgKnBzeU91dFsoMSldOworICBQU1lfSU5URVJOQUwgICAgICpwc3lLZXJuZWw7CisKKyAgLyogbGlmZXRpbWUgdmFycyAqLworCisgIENIQU5ORUxfTU9ERSBlbmNvZGVyTW9kZTsKKyAgSU5UIGJhbmR3aWR0aDkwZEI7CisgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CisKKyAgSU5UICAgIGRvbnRXcml0ZUFkaWY7ICAgICAgLyogdXNlOiB3cml0ZSBBRElGIGhlYWRlciBvbmx5IGJlZm9yZSAxc3QgZnJhbWUgKi8KKworICBGSVhQX0RCTCAgKmR5bmFtaWNfUkFNOworCisKKyAgSU5UIG1heENoYW5uZWxzOyAgICAgICAgICAgLyogdXNlZCB3aGlsZSBhbGxvY2F0aW9uICovCisgIElOVCBtYXhFbGVtZW50czsKKyAgSU5UIG1heEZyYW1lczsKKworICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgIC8qIEFPVCB0byBiZSB1c2VkIHdoaWxlIGVuY29kaW5nLiAgKi8KKworfSA7CisKKyNkZWZpbmUgbWF4U2l6ZShhLGIpICggKChhKT4oYikpID8gKGEpIDogKGIpICkKKworI2RlZmluZSBCSVRfTE9PS19VUF9TSVpFICAgICAgICAgKCBzaXplb2YoSU5UKSooTUFYX1NGQl9MT05HKihDT0RFX0JPT0tfRVNDX05EWCsxKSkgKQorI2RlZmluZSBNRVJHRV9HQUlOX0xPT0tfVVBfU0laRSAgKCBzaXplb2YoSU5UKSpNQVhfU0ZCX0xPTkcgKQorCisKKworLyogRHluYW1pYyBSQU0gLSBBbGxvY2F0aW9uICovCisvKgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgIFBfQlVGXzAgICB8ICAgICAgICAgUF9CVUZfMSAgICAgICAgICAgIHwKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIHwgIFFDX09VVF9DSCAgfCAgICAgICAgIFBTWV9EWU4gICAgICAgICAgICB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgICAgICAgICAgIHwgQml0TG9va1VwK01lcmdlR2Fpbkxvb2tVcCAgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgICAgICAgICAgICB8ICBCaXRzdHJlYW0gb3V0cHV0IGJ1ZmZlciAgIHwKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworKi8KKworI2RlZmluZSBCVUZfU0laRV8wICAgICAgICggQUxJR05fU0laRShzaXplb2YoUUNfT1VUX0NIQU5ORUwpKig4KSkgKQorI2RlZmluZSBCVUZfU0laRV8xICAgICAgICggQUxJR05fU0laRShtYXhTaXplKHNpemVvZihQU1lfRFlOQU1JQyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF9MT09LX1VQX1NJWkUrTUVSR0VfR0FJTl9MT09LX1VQX1NJWkUpKSkgKQorCisjZGVmaW5lIFBfQlVGXzAgICAgICAgICAgKCAwICkKKyNkZWZpbmUgUF9CVUZfMSAgICAgICAgICAoIFBfQlVGXzAgKyBCVUZfU0laRV8wICkKKworI2RlZmluZSBBQUNfRU5DX0RZTl9SQU1fU0laRSAgKCBCVUZfU0laRV8wICsgQlVGX1NJWkVfMSApCisKKworICBIX0FMTE9DX01FTSAoQUFDZHluYW1pY19SQU0sIEZJWFBfREJMKQorLyoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCitFTkQgLSBEeW5hbWljIFJBTSAtIEFsbG9jYXRpb24gKi8KKworLyoKKyAgU2VlIGZ1cnRoZXIgTWVtb3J5IEFsbG9jYXRpb24gZGV0YWlscyBpbiBhYWNFbmNfcmFtLmNwcAorKi8KKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfQWFjRW5jb2RlciwgQUFDX0VOQykKKworICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lFbGVtZW50LCBQU1lfRUxFTUVOVCkKKworICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lJbnRlcm5hbCwgUFNZX0lOVEVSTkFMKQorICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lTdGF0aWMsIFBTWV9TVEFUSUMpCisgIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNKQorCisgIFBTWV9EWU5BTUlDICpHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOworICBIX0FMTE9DX01FTSAoUmFtX2JzT3V0YnVmZmVyLCBVQ0hBUikKKworICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsLCBQU1lfT1VUX0NIQU5ORUwpCisKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUHN5T3V0LCBQU1lfT1VUKQorICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cywgUFNZX09VVF9FTEVNRU5UKQorCisgIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1FDc3RhdGUsIFFDX1NUQVRFKQorICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQsIEFESl9USFJfU1RBVEUpCisKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50LCBBVFNfRUxFTUVOVCkKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfRWxlbWVudEJpdHMsIEVMRU1FTlRfQklUUykKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfQml0Q250clN0YXRlLCBCSVRDTlRSX1NUQVRFKQorCisgIElOVCAqR2V0UmFtX2FhY0VuY19CaXRMb29rVXAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CisgIElOVCAqR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CisgIFFDX09VVF9DSEFOTkVMICpHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbCAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CisKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNvdXQsIFFDX09VVCkKKyAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCkKKworCisjZW5kaWYgLyogI2lmbmRlZiBBQUNfRU5DX1JBTV9IICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uY3BwCkBAIC0wLDAgKzEsMTIzMiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3JzOiAgICAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKyAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCisKKy8qCisgICBIdWZmbWFuIFRhYmxlcworKi8KK2NvbnN0IElOVCBGREthYWNFbmNfaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeyB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDl9LCB7MHgwMDBhMDAwOCwweDAwMDcwMDA2LDB4MDAwYTAwMDh9LCB7MHgwMDBiMDAwOSwweDAwMDkwMDA4LDB4MDAwYjAwMDl9IH0sCisgICAgeyB7MHgwMDBhMDAwOCwweDAwMDcwMDA2LDB4MDAwYTAwMDd9LCB7MHgwMDA3MDAwNiwweDAwMDUwMDA1LDB4MDAwNzAwMDZ9LCB7MHgwMDA5MDAwNywweDAwMDcwMDA2LDB4MDAwYTAwMDh9IH0sCisgICAgeyB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDh9LCB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDh9LCB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDl9IH0KKyAgfSwKKyAgeworICAgIHsgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA3fSwgezB4MDAwNzAwMDYsMHgwMDA1MDAwNSwweDAwMDcwMDA2fSwgezB4MDAwOTAwMDcsMHgwMDA3MDAwNiwweDAwMDkwMDA4fSB9LAorICAgIHsgezB4MDAwNzAwMDYsMHgwMDA1MDAwNSwweDAwMDcwMDA2fSwgezB4MDAwNTAwMDUsMHgwMDAxMDAwMywweDAwMDUwMDA1fSwgezB4MDAwNzAwMDYsMHgwMDA1MDAwNSwweDAwMDcwMDA2fSB9LAorICAgIHsgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA3fSwgezB4MDAwNzAwMDYsMHgwMDA1MDAwNSwweDAwMDcwMDA2fSwgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA4fSB9CisgIH0sCisgIHsKKyAgICB7IHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0sIHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwOH0sIHsweDAwMGIwMDA4LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0gfSwKKyAgICB7IHsweDAwMGEwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwN30sIHsweDAwMDcwMDA2LDB4MDAwNTAwMDQsMHgwMDA3MDAwNn0sIHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDBhMDAwN30gfSwKKyAgICB7IHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0sIHsweDAwMGEwMDA3LDB4MDAwNzAwMDYsMHgwMDA5MDAwOH0sIHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0gfQorICB9Cit9OworCisKK2NvbnN0IElOVCBGREthYWNFbmNfaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeyB7MHgwMDAxMDAwNCwweDAwMDQwMDA1LDB4MDAwODAwMDh9LCB7MHgwMDA0MDAwNSwweDAwMDUwMDA0LDB4MDAwODAwMDh9LCB7MHgwMDA5MDAwOSwweDAwMDkwMDA4LDB4MDAwYTAwMGJ9IH0sCisgICAgeyB7MHgwMDA0MDAwNSwweDAwMDYwMDA1LDB4MDAwOTAwMDh9LCB7MHgwMDA2MDAwNSwweDAwMDYwMDA0LDB4MDAwOTAwMDh9LCB7MHgwMDA5MDAwOCwweDAwMDkwMDA3LDB4MDAwYTAwMGF9IH0sCisgICAgeyB7MHgwMDA5MDAwOSwweDAwMGEwMDA4LDB4MDAwZDAwMGJ9LCB7MHgwMDA5MDAwOCwweDAwMDkwMDA4LDB4MDAwYjAwMGF9LCB7MHgwMDBiMDAwYiwweDAwMGEwMDBhLDB4MDAwYzAwMGJ9IH0KKyAgfSwKKyAgeworICAgIHsgezB4MDAwNDAwMDQsMHgwMDA2MDAwNSwweDAwMGEwMDA4fSwgezB4MDAwNjAwMDQsMHgwMDA3MDAwNCwweDAwMGEwMDA4fSwgezB4MDAwYTAwMDgsMHgwMDBhMDAwOCwweDAwMGMwMDBhfSB9LAorICAgIHsgezB4MDAwNTAwMDQsMHgwMDA3MDAwNCwweDAwMGIwMDA4fSwgezB4MDAwNjAwMDQsMHgwMDA3MDAwNCwweDAwMGEwMDA3fSwgezB4MDAwOTAwMDgsMHgwMDA5MDAwNywweDAwMGIwMDA5fSB9LAorICAgIHsgezB4MDAwOTAwMDgsMHgwMDBhMDAwOCwweDAwMGQwMDBhfSwgezB4MDAwODAwMDcsMHgwMDA5MDAwNywweDAwMGMwMDA5fSwgezB4MDAwYTAwMGEsMHgwMDBiMDAwOSwweDAwMGMwMDBhfSB9CisgIH0sCisgIHsKKyAgICB7IHsweDAwMDgwMDA4LDB4MDAwYTAwMDgsMHgwMDBmMDAwYn0sIHsweDAwMDkwMDA4LDB4MDAwYjAwMDcsMHgwMDBmMDAwYX0sIHsweDAwMGQwMDBiLDB4MDAwZTAwMGEsMHgwMDEwMDAwY30gfSwKKyAgICB7IHsweDAwMDgwMDA4LDB4MDAwYTAwMDcsMHgwMDBlMDAwYX0sIHsweDAwMDkwMDA3LDB4MDAwYTAwMDcsMHgwMDBlMDAwOX0sIHsweDAwMGMwMDBhLDB4MDAwYzAwMDksMHgwMDBmMDAwYn0gfSwKKyAgICB7IHsweDAwMGIwMDBiLDB4MDAwYzAwMGEsMHgwMDEwMDAwY30sIHsweDAwMGEwMDBhLDB4MDAwYjAwMDksMHgwMDBmMDAwYn0sIHsweDAwMGMwMDBiLDB4MDAwYzAwMGEsMHgwMDBmMDAwYn0gfQorICB9Cit9OworCitjb25zdCBJTlQgRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNls5XVs5XT0KK3sKKyAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYTAwMDksIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGJ9LAorICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwYX0sCisgIHsweDAwMGMwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA2LCAweDAwMDgwMDA2LCAweDAwMDcwMDA2LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5fSwKKyAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNDAwMDQsIDB4MDAwNTAwMDQsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAorICB7MHgwMDBhMDAwOSwgMHgwMDA4MDAwNywgMHgwMDA3MDAwNiwgMHgwMDA0MDAwNCwgMHgwMDAxMDAwNCwgMHgwMDA0MDAwNCwgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNywgMHgwMDBiMDAwOX0sCisgIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMDgwMDA2LCAweDAwMDUwMDA0LCAweDAwMDQwMDA0LCAweDAwMDUwMDA0LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fSwKKyAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwOTAwMDYsIDB4MDAwODAwMDYsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAorICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBjMDAwYX0sCisgIHsweDAwMGQwMDBiLCAweDAwMGMwMDBhLCAweDAwMGMwMDA5LCAweDAwMGIwMDA5LCAweDAwMGEwMDA5LCAweDAwMGEwMDA5LCAweDAwMGIwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBifQorfTsKKworY29uc3QgSU5UIEZES2FhY0VuY19odWZmX2x0YWI3XzhbOF1bOF09Cit7CisgIHsweDAwMDEwMDA1LCAweDAwMDMwMDA0LCAweDAwMDYwMDA1LCAweDAwMDcwMDA2LCAweDAwMDgwMDA3LCAweDAwMDkwMDA4LCAweDAwMGEwMDA5LCAweDAwMGIwMDBhfSwKKyAgezB4MDAwMzAwMDQsIDB4MDAwNDAwMDMsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDYsIDB4MDAwODAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDh9LAorICB7MHgwMDA2MDAwNSwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDA4MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOH0sCisgIHsweDAwMDcwMDA2LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4fSwKKyAgezB4MDAwODAwMDcsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAorICB7MHgwMDA5MDAwOCwgMHgwMDA4MDAwNywgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwYX0sCisgIHsweDAwMGEwMDA5LCAweDAwMDkwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5fSwKKyAgezB4MDAwYjAwMGEsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGF9Cit9OworCitjb25zdCBJTlQgRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbMTNdWzEzXT0KK3sKKyAgezB4MDAwMTAwMDYsIDB4MDAwMzAwMDUsIDB4MDAwNjAwMDYsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDksIDB4MDAwYjAwMGEsIDB4MDAwYjAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGIsIDB4MDAwZDAwMGIsIDB4MDAwZDAwMGN9LAorICB7MHgwMDAzMDAwNSwgMHgwMDA0MDAwNCwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYn0sCisgIHsweDAwMDYwMDA2LCAweDAwMDYwMDA0LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGMwMDBhfSwKKyAgezB4MDAwODAwMDYsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDUsIDB4MDAwOTAwMDUsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDcsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGF9LAorICB7MHgwMDA5MDAwNywgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNiwgMHgwMDBhMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYX0sCisgIHsweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA4LCAweDAwMGMwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBifSwKKyAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGJ9LAorICB7MHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBkMDAwOSwgMHgwMDBkMDAwOSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYiwgMHgwMDBkMDAwYn0sCisgIHsweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGUwMDBhLCAweDAwMGQwMDBiLCAweDAwMGUwMDBifSwKKyAgezB4MDAwYjAwMGEsIDB4MDAwYTAwMDksIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGN9LAorICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBmMDAwY30sCisgIHsweDAwMGMwMDBiLCAweDAwMGIwMDBhLCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLCAweDAwMGYwMDBiLCAweDAwMGYwMDBjfSwKKyAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGMsIDB4MDAwZTAwMGMsIDB4MDAwZTAwMGMsIDB4MDAwZjAwMGN9Cit9OworCitjb25zdCBVQ0hBUiBGREthYWNFbmNfaHVmZl9sdGFiMTFbMTddWzE3XT0KK3sKKyAgezB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGMsIDB4MGIsIDB4MGMsIDB4MGMsIDB4MGF9LAorICB7MHgwNSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwOH0sCisgIHsweDA2LCAweDA1LCAweDA1LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgezB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICB7MHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgIHsweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgIHsweDBhLCAweDA5LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDA4fSwKKyAgezB4MGEsIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MDh9LAorICB7MHgwYiwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwOH0sCisgIHsweDBiLCAweDBhLCAweDA5LCAweDA5LCAweDBhLCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA4fSwKKyAgezB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDl9LAorICB7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOX0sCisgIHsweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA5fSwKKyAgezB4MGMsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGMsIDB4MGMsIDB4MDl9LAorICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwNX0KK307CisKK2NvbnN0IFVDSEFSIEZES2FhY0VuY19odWZmX2x0YWJzY2ZbMTIxXT0KK3sKKyAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwgMHgxMSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwZiwgMHgwZiwKKyAgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYywgMHgwYiwgMHgwYywgMHgwYiwgMHgwYSwgMHgwYSwKKyAgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNSwKKyAgMHgwNiwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYywKKyAgMHgwYywgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZSwgMHgwZSwgMHgxMCwgMHgwZiwgMHgxMCwgMHgwZiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMworfTsKKworCitjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjFbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7IHsweDA3ZjgsMHgwMWYxLDB4MDdmZH0sIHsweDAzZjUsMHgwMDY4LDB4MDNmMH0sIHsweDA3ZjcsMHgwMWVjLDB4MDdmNX0gfSwKKyAgICB7IHsweDAzZjEsMHgwMDcyLDB4MDNmNH0sIHsweDAwNzQsMHgwMDExLDB4MDA3Nn0sIHsweDAxZWIsMHgwMDZjLDB4MDNmNn0gfSwKKyAgICB7IHsweDA3ZmMsMHgwMWUxLDB4MDdmMX0sIHsweDAxZjAsMHgwMDYxLDB4MDFmNn0sIHsweDA3ZjIsMHgwMWVhLDB4MDdmYn0gfQorICB9LAorICB7CisgICAgeyB7MHgwMWYyLDB4MDA2OSwweDAxZWR9LCB7MHgwMDc3LDB4MDAxNywweDAwNmZ9LCB7MHgwMWU2LDB4MDA2NCwweDAxZTV9IH0sCisgICAgeyB7MHgwMDY3LDB4MDAxNSwweDAwNjJ9LCB7MHgwMDEyLDB4MDAwMCwweDAwMTR9LCB7MHgwMDY1LDB4MDAxNiwweDAwNmR9IH0sCisgICAgeyB7MHgwMWU5LDB4MDA2MywweDAxZTR9LCB7MHgwMDZiLDB4MDAxMywweDAwNzF9LCB7MHgwMWUzLDB4MDA3MCwweDAxZjN9IH0KKyAgfSwKKyAgeworICAgIHsgezB4MDdmZSwweDAxZTcsMHgwN2YzfSwgezB4MDFlZiwweDAwNjAsMHgwMWVlfSwgezB4MDdmMCwweDAxZTIsMHgwN2ZhfSB9LAorICAgIHsgezB4MDNmMywweDAwNmEsMHgwMWU4fSwgezB4MDA3NSwweDAwMTAsMHgwMDczfSwgezB4MDFmNCwweDAwNmUsMHgwM2Y3fSB9LAorICAgIHsgezB4MDdmNiwweDAxZTAsMHgwN2Y5fSwgezB4MDNmMiwweDAwNjYsMHgwMWY1fSwgezB4MDdmZiwweDAxZjcsMHgwN2Y0fSB9CisgIH0KK307CisKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMlszXVszXVszXVszXT0KK3sKKyAgeworICAgIHsgezB4MDFmMywweDAwNmYsMHgwMWZkfSwgezB4MDBlYiwweDAwMjMsMHgwMGVhfSwgezB4MDFmNywweDAwZTgsMHgwMWZhfSB9LAorICAgIHsgezB4MDBmMiwweDAwMmQsMHgwMDcwfSwgezB4MDAyMCwweDAwMDYsMHgwMDJifSwgezB4MDA2ZSwweDAwMjgsMHgwMGU5fSB9LAorICAgIHsgezB4MDFmOSwweDAwNjYsMHgwMGY4fSwgezB4MDBlNywweDAwMWIsMHgwMGYxfSwgezB4MDFmNCwweDAwNmIsMHgwMWY1fSB9CisgIH0sCisgIHsKKyAgICB7IHsweDAwZWMsMHgwMDJhLDB4MDA2Y30sIHsweDAwMmMsMHgwMDBhLDB4MDAyN30sIHsweDAwNjcsMHgwMDFhLDB4MDBmNX0gfSwKKyAgICB7IHsweDAwMjQsMHgwMDA4LDB4MDAxZn0sIHsweDAwMDksMHgwMDAwLDB4MDAwN30sIHsweDAwMWQsMHgwMDBiLDB4MDAzMH0gfSwKKyAgICB7IHsweDAwZWYsMHgwMDFjLDB4MDA2NH0sIHsweDAwMWUsMHgwMDBjLDB4MDAyOX0sIHsweDAwZjMsMHgwMDJmLDB4MDBmMH0gfQorICB9LAorICB7CisgICAgeyB7MHgwMWZjLDB4MDA3MSwweDAxZjJ9LCB7MHgwMGY0LDB4MDAyMSwweDAwZTZ9LCB7MHgwMGY3LDB4MDA2OCwweDAxZjh9IH0sCisgICAgeyB7MHgwMGVlLDB4MDAyMiwweDAwNjV9LCB7MHgwMDMxLDB4MDAwMiwweDAwMjZ9LCB7MHgwMGVkLDB4MDAyNSwweDAwNmF9IH0sCisgICAgeyB7MHgwMWZiLDB4MDA3MiwweDAxZmV9LCB7MHgwMDY5LDB4MDAyZSwweDAwZjZ9LCB7MHgwMWZmLDB4MDA2ZCwweDAxZjZ9IH0KKyAgfQorfTsKKworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIzWzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeyB7MHgwMDAwLDB4MDAwOSwweDAwZWZ9LCB7MHgwMDBiLDB4MDAxOSwweDAwZjB9LCB7MHgwMWViLDB4MDFlNiwweDAzZjJ9IH0sCisgICAgeyB7MHgwMDBhLDB4MDAzNSwweDAxZWZ9LCB7MHgwMDM0LDB4MDAzNywweDAxZTl9LCB7MHgwMWVkLDB4MDFlNywweDAzZjN9IH0sCisgICAgeyB7MHgwMWVlLDB4MDNlZCwweDFmZmF9LCB7MHgwMWVjLDB4MDFmMiwweDA3Zjl9LCB7MHgwN2Y4LDB4MDNmOCwweDBmZjh9IH0KKyAgfSwKKyAgeworICAgIHsgezB4MDAwOCwweDAwMzgsMHgwM2Y2fSwgezB4MDAzNiwweDAwNzUsMHgwM2YxfSwgezB4MDNlYiwweDAzZWMsMHgwZmY0fSB9LAorICAgIHsgezB4MDAxOCwweDAwNzYsMHgwN2Y0fSwgezB4MDAzOSwweDAwNzQsMHgwM2VmfSwgezB4MDFmMywweDAxZjQsMHgwN2Y2fSB9LAorICAgIHsgezB4MDFlOCwweDAzZWEsMHgxZmZjfSwgezB4MDBmMiwweDAxZjEsMHgwZmZifSwgezB4MDNmNSwweDA3ZjMsMHgwZmZjfSB9CisgIH0sCisgIHsKKyAgICB7IHsweDAwZWUsMHgwM2Y3LDB4N2ZmZX0sIHsweDAxZjAsMHgwN2Y1LDB4N2ZmZH0sIHsweDFmZmIsMHgzZmZhLDB4ZmZmZn0gfSwKKyAgICB7IHsweDAwZjEsMHgwM2YwLDB4M2ZmY30sIHsweDAxZWEsMHgwM2VlLDB4M2ZmYn0sIHsweDBmZjYsMHgwZmZhLDB4N2ZmY30gfSwKKyAgICB7IHsweDA3ZjIsMHgwZmY1LDB4ZmZmZX0sIHsweDAzZjQsMHgwN2Y3LDB4N2ZmYn0sIHsweDBmZjcsMHgwZmY5LDB4N2ZmYX0gfQorICB9Cit9OworCitjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjRbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7IHsweDAwMDcsMHgwMDE2LDB4MDBmNn0sIHsweDAwMTgsMHgwMDA4LDB4MDBlZn0sIHsweDAxZWYsMHgwMGYzLDB4MDdmOH0gfSwKKyAgICB7IHsweDAwMTksMHgwMDE3LDB4MDBlZH0sIHsweDAwMTUsMHgwMDAxLDB4MDBlMn0sIHsweDAwZjAsMHgwMDcwLDB4MDNmMH0gfSwKKyAgICB7IHsweDAxZWUsMHgwMGYxLDB4MDdmYX0sIHsweDAwZWUsMHgwMGU0LDB4MDNmMn0sIHsweDA3ZjYsMHgwM2VmLDB4MDdmZH0gfQorICB9LAorICB7CisgICAgeyB7MHgwMDA1LDB4MDAxNCwweDAwZjJ9LCB7MHgwMDA5LDB4MDAwNCwweDAwZTV9LCB7MHgwMGY0LDB4MDBlOCwweDAzZjR9IH0sCisgICAgeyB7MHgwMDA2LDB4MDAwMiwweDAwZTd9LCB7MHgwMDAzLDB4MDAwMCwweDAwNmJ9LCB7MHgwMGUzLDB4MDA2OSwweDAxZjN9IH0sCisgICAgeyB7MHgwMGViLDB4MDBlNiwweDAzZjZ9LCB7MHgwMDZlLDB4MDA2YSwweDAxZjR9LCB7MHgwM2VjLDB4MDFmMCwweDAzZjl9IH0KKyAgfSwKKyAgeworICAgIHsgezB4MDBmNSwweDAwZWMsMHgwN2ZifSwgezB4MDBlYSwweDAwNmYsMHgwM2Y3fSwgezB4MDdmOSwweDAzZjMsMHgwZmZmfSB9LAorICAgIHsgezB4MDBlOSwweDAwNmQsMHgwM2Y4fSwgezB4MDA2YywweDAwNjgsMHgwMWY1fSwgezB4MDNlZSwweDAxZjIsMHgwN2Y0fSB9LAorICAgIHsgezB4MDdmNywweDAzZjEsMHgwZmZlfSwgezB4MDNlZCwweDAxZjEsMHgwN2Y1fSwgezB4MDdmZSwweDAzZjUsMHgwN2ZjfSB9CisgIH0KK307Citjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjVbOV1bOV09Cit7CisgIHsweDFmZmYsIDB4MGZmNywgMHgwN2Y0LCAweDA3ZTgsIDB4MDNmMSwgMHgwN2VlLCAweDA3ZjksIDB4MGZmOCwgMHgxZmZkfSwKKyAgezB4MGZmZCwgMHgwN2YxLCAweDAzZTgsIDB4MDFlOCwgMHgwMGYwLCAweDAxZWMsIDB4MDNlZSwgMHgwN2YyLCAweDBmZmF9LAorICB7MHgwZmY0LCAweDAzZWYsIDB4MDFmMiwgMHgwMGU4LCAweDAwNzAsIDB4MDBlYywgMHgwMWYwLCAweDAzZWEsIDB4MDdmM30sCisgIHsweDA3ZWIsIDB4MDFlYiwgMHgwMGVhLCAweDAwMWEsIDB4MDAwOCwgMHgwMDE5LCAweDAwZWUsIDB4MDFlZiwgMHgwN2VkfSwKKyAgezB4MDNmMCwgMHgwMGYyLCAweDAwNzMsIDB4MDAwYiwgMHgwMDAwLCAweDAwMGEsIDB4MDA3MSwgMHgwMGYzLCAweDA3ZTl9LAorICB7MHgwN2VmLCAweDAxZWUsIDB4MDBlZiwgMHgwMDE4LCAweDAwMDksIDB4MDAxYiwgMHgwMGViLCAweDAxZTksIDB4MDdlY30sCisgIHsweDA3ZjYsIDB4MDNlYiwgMHgwMWYzLCAweDAwZWQsIDB4MDA3MiwgMHgwMGU5LCAweDAxZjEsIDB4MDNlZCwgMHgwN2Y3fSwKKyAgezB4MGZmNiwgMHgwN2YwLCAweDAzZTksIDB4MDFlZCwgMHgwMGYxLCAweDAxZWEsIDB4MDNlYywgMHgwN2Y4LCAweDBmZjl9LAorICB7MHgxZmZjLCAweDBmZmMsIDB4MGZmNSwgMHgwN2VhLCAweDAzZjMsIDB4MDNmMiwgMHgwN2Y1LCAweDBmZmIsIDB4MWZmZX0KK307CisKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNls5XVs5XT0KK3sKKyAgezB4MDdmZSwgMHgwM2ZkLCAweDAxZjEsIDB4MDFlYiwgMHgwMWY0LCAweDAxZWEsIDB4MDFmMCwgMHgwM2ZjLCAweDA3ZmR9LAorICB7MHgwM2Y2LCAweDAxZTUsIDB4MDBlYSwgMHgwMDZjLCAweDAwNzEsIDB4MDA2OCwgMHgwMGYwLCAweDAxZTYsIDB4MDNmN30sCisgIHsweDAxZjMsIDB4MDBlZiwgMHgwMDMyLCAweDAwMjcsIDB4MDAyOCwgMHgwMDI2LCAweDAwMzEsIDB4MDBlYiwgMHgwMWY3fSwKKyAgezB4MDFlOCwgMHgwMDZmLCAweDAwMmUsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDYsIDB4MDAyOSwgMHgwMDZiLCAweDAxZWV9LAorICB7MHgwMWVmLCAweDAwNzIsIDB4MDAyZCwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMywgMHgwMDJmLCAweDAwNzMsIDB4MDFmYX0sCisgIHsweDAxZTcsIDB4MDA2ZSwgMHgwMDJiLCAweDAwMDcsIDB4MDAwMSwgMHgwMDA1LCAweDAwMmMsIDB4MDA2ZCwgMHgwMWVjfSwKKyAgezB4MDFmOSwgMHgwMGVlLCAweDAwMzAsIDB4MDAyNCwgMHgwMDJhLCAweDAwMjUsIDB4MDAzMywgMHgwMGVjLCAweDAxZjJ9LAorICB7MHgwM2Y4LCAweDAxZTQsIDB4MDBlZCwgMHgwMDZhLCAweDAwNzAsIDB4MDA2OSwgMHgwMDc0LCAweDAwZjEsIDB4MDNmYX0sCisgIHsweDA3ZmYsIDB4MDNmOSwgMHgwMWY2LCAweDAxZWQsIDB4MDFmOCwgMHgwMWU5LCAweDAxZjUsIDB4MDNmYiwgMHgwN2ZjfQorfTsKKworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI3WzhdWzhdPQoreworICB7MHgwMDAwLCAweDAwMDUsIDB4MDAzNywgMHgwMDc0LCAweDAwZjIsIDB4MDFlYiwgMHgwM2VkLCAweDA3Zjd9LAorICB7MHgwMDA0LCAweDAwMGMsIDB4MDAzNSwgMHgwMDcxLCAweDAwZWMsIDB4MDBlZSwgMHgwMWVlLCAweDAxZjV9LAorICB7MHgwMDM2LCAweDAwMzQsIDB4MDA3MiwgMHgwMGVhLCAweDAwZjEsIDB4MDFlOSwgMHgwMWYzLCAweDAzZjV9LAorICB7MHgwMDczLCAweDAwNzAsIDB4MDBlYiwgMHgwMGYwLCAweDAxZjEsIDB4MDFmMCwgMHgwM2VjLCAweDAzZmF9LAorICB7MHgwMGYzLCAweDAwZWQsIDB4MDFlOCwgMHgwMWVmLCAweDAzZWYsIDB4MDNmMSwgMHgwM2Y5LCAweDA3ZmJ9LAorICB7MHgwMWVkLCAweDAwZWYsIDB4MDFlYSwgMHgwMWYyLCAweDAzZjMsIDB4MDNmOCwgMHgwN2Y5LCAweDA3ZmN9LAorICB7MHgwM2VlLCAweDAxZWMsIDB4MDFmNCwgMHgwM2Y0LCAweDAzZjcsIDB4MDdmOCwgMHgwZmZkLCAweDBmZmV9LAorICB7MHgwN2Y2LCAweDAzZjAsIDB4MDNmMiwgMHgwM2Y2LCAweDA3ZmEsIDB4MDdmZCwgMHgwZmZjLCAweDBmZmZ9Cit9OworCitjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjhbOF1bOF09Cit7CisgIHsweDAwMGUsIDB4MDAwNSwgMHgwMDEwLCAweDAwMzAsIDB4MDA2ZiwgMHgwMGYxLCAweDAxZmEsIDB4MDNmZX0sCisgIHsweDAwMDMsIDB4MDAwMCwgMHgwMDA0LCAweDAwMTIsIDB4MDAyYywgMHgwMDZhLCAweDAwNzUsIDB4MDBmOH0sCisgIHsweDAwMGYsIDB4MDAwMiwgMHgwMDA2LCAweDAwMTQsIDB4MDAyZSwgMHgwMDY5LCAweDAwNzIsIDB4MDBmNX0sCisgIHsweDAwMmYsIDB4MDAxMSwgMHgwMDEzLCAweDAwMmEsIDB4MDAzMiwgMHgwMDZjLCAweDAwZWMsIDB4MDBmYX0sCisgIHsweDAwNzEsIDB4MDAyYiwgMHgwMDJkLCAweDAwMzEsIDB4MDA2ZCwgMHgwMDcwLCAweDAwZjIsIDB4MDFmOX0sCisgIHsweDAwZWYsIDB4MDA2OCwgMHgwMDMzLCAweDAwNmIsIDB4MDA2ZSwgMHgwMGVlLCAweDAwZjksIDB4MDNmY30sCisgIHsweDAxZjgsIDB4MDA3NCwgMHgwMDczLCAweDAwZWQsIDB4MDBmMCwgMHgwMGY2LCAweDAxZjYsIDB4MDFmZH0sCisgIHsweDAzZmQsIDB4MDBmMywgMHgwMGY0LCAweDAwZjcsIDB4MDFmNywgMHgwMWZiLCAweDAxZmMsIDB4MDNmZn0KK307CisKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiOVsxM11bMTNdPQoreworICB7MHgwMDAwLCAweDAwMDUsIDB4MDAzNywgMHgwMGU3LCAweDAxZGUsIDB4MDNjZSwgMHgwM2Q5LCAweDA3YzgsIDB4MDdjZCwgMHgwZmM4LCAweDBmZGQsIDB4MWZlNCwgMHgxZmVjfSwKKyAgezB4MDAwNCwgMHgwMDBjLCAweDAwMzUsIDB4MDA3MiwgMHgwMGVhLCAweDAwZWQsIDB4MDFlMiwgMHgwM2QxLCAweDAzZDMsIDB4MDNlMCwgMHgwN2Q4LCAweDBmY2YsIDB4MGZkNX0sCisgIHsweDAwMzYsIDB4MDAzNCwgMHgwMDcxLCAweDAwZTgsIDB4MDBlYywgMHgwMWUxLCAweDAzY2YsIDB4MDNkZCwgMHgwM2RiLCAweDA3ZDAsIDB4MGZjNywgMHgwZmQ0LCAweDBmZTR9LAorICB7MHgwMGU2LCAweDAwNzAsIDB4MDBlOSwgMHgwMWRkLCAweDAxZTMsIDB4MDNkMiwgMHgwM2RjLCAweDA3Y2MsIDB4MDdjYSwgMHgwN2RlLCAweDBmZDgsIDB4MGZlYSwgMHgxZmRifSwKKyAgezB4MDFkZiwgMHgwMGViLCAweDAxZGMsIDB4MDFlNiwgMHgwM2Q1LCAweDAzZGUsIDB4MDdjYiwgMHgwN2RkLCAweDA3ZGMsIDB4MGZjZCwgMHgwZmUyLCAweDBmZTcsIDB4MWZlMX0sCisgIHsweDAzZDAsIDB4MDFlMCwgMHgwMWU0LCAweDAzZDYsIDB4MDdjNSwgMHgwN2QxLCAweDA3ZGIsIDB4MGZkMiwgMHgwN2UwLCAweDBmZDksIDB4MGZlYiwgMHgxZmUzLCAweDFmZTl9LAorICB7MHgwN2M0LCAweDAxZTUsIDB4MDNkNywgMHgwN2M2LCAweDA3Y2YsIDB4MDdkYSwgMHgwZmNiLCAweDBmZGEsIDB4MGZlMywgMHgwZmU5LCAweDFmZTYsIDB4MWZmMywgMHgxZmY3fSwKKyAgezB4MDdkMywgMHgwM2Q4LCAweDAzZTEsIDB4MDdkNCwgMHgwN2Q5LCAweDBmZDMsIDB4MGZkZSwgMHgxZmRkLCAweDFmZDksIDB4MWZlMiwgMHgxZmVhLCAweDFmZjEsIDB4MWZmNn0sCisgIHsweDA3ZDIsIDB4MDNkNCwgMHgwM2RhLCAweDA3YzcsIDB4MDdkNywgMHgwN2UyLCAweDBmY2UsIDB4MGZkYiwgMHgxZmQ4LCAweDFmZWUsIDB4M2ZmMCwgMHgxZmY0LCAweDNmZjJ9LAorICB7MHgwN2UxLCAweDAzZGYsIDB4MDdjOSwgMHgwN2Q2LCAweDBmY2EsIDB4MGZkMCwgMHgwZmU1LCAweDBmZTYsIDB4MWZlYiwgMHgxZmVmLCAweDNmZjMsIDB4M2ZmNCwgMHgzZmY1fSwKKyAgezB4MGZlMCwgMHgwN2NlLCAweDA3ZDUsIDB4MGZjNiwgMHgwZmQxLCAweDBmZTEsIDB4MWZlMCwgMHgxZmU4LCAweDFmZjAsIDB4M2ZmMSwgMHgzZmY4LCAweDNmZjYsIDB4N2ZmY30sCisgIHsweDBmZTgsIDB4MDdkZiwgMHgwZmM5LCAweDBmZDcsIDB4MGZkYywgMHgxZmRjLCAweDFmZGYsIDB4MWZlZCwgMHgxZmY1LCAweDNmZjksIDB4M2ZmYiwgMHg3ZmZkLCAweDdmZmV9LAorICB7MHgxZmU3LCAweDBmY2MsIDB4MGZkNiwgMHgwZmRmLCAweDFmZGUsIDB4MWZkYSwgMHgxZmU1LCAweDFmZjIsIDB4M2ZmYSwgMHgzZmY3LCAweDNmZmMsIDB4M2ZmZCwgMHg3ZmZmfQorfTsKKworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMFsxM11bMTNdPQoreworICB7MHgwMDIyLCAweDAwMDgsIDB4MDAxZCwgMHgwMDI2LCAweDAwNWYsIDB4MDBkMywgMHgwMWNmLCAweDAzZDAsIDB4MDNkNywgMHgwM2VkLCAweDA3ZjAsIDB4MDdmNiwgMHgwZmZkfSwKKyAgezB4MDAwNywgMHgwMDAwLCAweDAwMDEsIDB4MDAwOSwgMHgwMDIwLCAweDAwNTQsIDB4MDA2MCwgMHgwMGQ1LCAweDAwZGMsIDB4MDFkNCwgMHgwM2NkLCAweDAzZGUsIDB4MDdlN30sCisgIHsweDAwMWMsIDB4MDAwMiwgMHgwMDA2LCAweDAwMGMsIDB4MDAxZSwgMHgwMDI4LCAweDAwNWIsIDB4MDBjZCwgMHgwMGQ5LCAweDAxY2UsIDB4MDFkYywgMHgwM2Q5LCAweDAzZjF9LAorICB7MHgwMDI1LCAweDAwMGIsIDB4MDAwYSwgMHgwMDBkLCAweDAwMjQsIDB4MDA1NywgMHgwMDYxLCAweDAwY2MsIDB4MDBkZCwgMHgwMWNjLCAweDAxZGUsIDB4MDNkMywgMHgwM2U3fSwKKyAgezB4MDA1ZCwgMHgwMDIxLCAweDAwMWYsIDB4MDAyMywgMHgwMDI3LCAweDAwNTksIDB4MDA2NCwgMHgwMGQ4LCAweDAwZGYsIDB4MDFkMiwgMHgwMWUyLCAweDAzZGQsIDB4MDNlZX0sCisgIHsweDAwZDEsIDB4MDA1NSwgMHgwMDI5LCAweDAwNTYsIDB4MDA1OCwgMHgwMDYyLCAweDAwY2UsIDB4MDBlMCwgMHgwMGUyLCAweDAxZGEsIDB4MDNkNCwgMHgwM2UzLCAweDA3ZWJ9LAorICB7MHgwMWM5LCAweDAwNWUsIDB4MDA1YSwgMHgwMDVjLCAweDAwNjMsIDB4MDBjYSwgMHgwMGRhLCAweDAxYzcsIDB4MDFjYSwgMHgwMWUwLCAweDAzZGIsIDB4MDNlOCwgMHgwN2VjfSwKKyAgezB4MDFlMywgMHgwMGQyLCAweDAwY2IsIDB4MDBkMCwgMHgwMGQ3LCAweDAwZGIsIDB4MDFjNiwgMHgwMWQ1LCAweDAxZDgsIDB4MDNjYSwgMHgwM2RhLCAweDA3ZWEsIDB4MDdmMX0sCisgIHsweDAxZTEsIDB4MDBkNCwgMHgwMGNmLCAweDAwZDYsIDB4MDBkZSwgMHgwMGUxLCAweDAxZDAsIDB4MDFkNiwgMHgwM2QxLCAweDAzZDUsIDB4MDNmMiwgMHgwN2VlLCAweDA3ZmJ9LAorICB7MHgwM2U5LCAweDAxY2QsIDB4MDFjOCwgMHgwMWNiLCAweDAxZDEsIDB4MDFkNywgMHgwMWRmLCAweDAzY2YsIDB4MDNlMCwgMHgwM2VmLCAweDA3ZTYsIDB4MDdmOCwgMHgwZmZhfSwKKyAgezB4MDNlYiwgMHgwMWRkLCAweDAxZDMsIDB4MDFkOSwgMHgwMWRiLCAweDAzZDIsIDB4MDNjYywgMHgwM2RjLCAweDAzZWEsIDB4MDdlZCwgMHgwN2YzLCAweDA3ZjksIDB4MGZmOX0sCisgIHsweDA3ZjIsIDB4MDNjZSwgMHgwMWU0LCAweDAzY2IsIDB4MDNkOCwgMHgwM2Q2LCAweDAzZTIsIDB4MDNlNSwgMHgwN2U4LCAweDA3ZjQsIDB4MDdmNSwgMHgwN2Y3LCAweDBmZmJ9LAorICB7MHgwN2ZhLCAweDAzZWMsIDB4MDNkZiwgMHgwM2UxLCAweDAzZTQsIDB4MDNlNiwgMHgwM2YwLCAweDA3ZTksIDB4MDdlZiwgMHgwZmY4LCAweDBmZmUsIDB4MGZmYywgMHgwZmZmfQorfTsKKworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMVsyMV1bMTddPQoreworICB7MHgwMDAwLCAweDAwMDYsIDB4MDAxOSwgMHgwMDNkLCAweDAwOWMsIDB4MDBjNiwgMHgwMWE3LCAweDAzOTAsIDB4MDNjMiwgMHgwM2RmLCAweDA3ZTYsIDB4MDdmMywgMHgwZmZiLCAweDA3ZWMsIDB4MGZmYSwgMHgwZmZlLCAweDAzOGV9LAorICB7MHgwMDA1LCAweDAwMDEsIDB4MDAwOCwgMHgwMDE0LCAweDAwMzcsIDB4MDA0MiwgMHgwMDkyLCAweDAwYWYsIDB4MDE5MSwgMHgwMWE1LCAweDAxYjUsIDB4MDM5ZSwgMHgwM2MwLCAweDAzYTIsIDB4MDNjZCwgMHgwN2Q2LCAweDAwYWV9LAorICB7MHgwMDE3LCAweDAwMDcsIDB4MDAwOSwgMHgwMDE4LCAweDAwMzksIDB4MDA0MCwgMHgwMDhlLCAweDAwYTMsIDB4MDBiOCwgMHgwMTk5LCAweDAxYWMsIDB4MDFjMSwgMHgwM2IxLCAweDAzOTYsIDB4MDNiZSwgMHgwM2NhLCAweDAwOWR9LAorICB7MHgwMDNjLCAweDAwMTUsIDB4MDAxNiwgMHgwMDFhLCAweDAwM2IsIDB4MDA0NCwgMHgwMDkxLCAweDAwYTUsIDB4MDBiZSwgMHgwMTk2LCAweDAxYWUsIDB4MDFiOSwgMHgwM2ExLCAweDAzOTEsIDB4MDNhNSwgMHgwM2Q1LCAweDAwOTR9LAorICB7MHgwMDlhLCAweDAwMzYsIDB4MDAzOCwgMHgwMDNhLCAweDAwNDEsIDB4MDA4YywgMHgwMDliLCAweDAwYjAsIDB4MDBjMywgMHgwMTllLCAweDAxYWIsIDB4MDFiYywgMHgwMzlmLCAweDAzOGYsIDB4MDNhOSwgMHgwM2NmLCAweDAwOTN9LAorICB7MHgwMGJmLCAweDAwM2UsIDB4MDAzZiwgMHgwMDQzLCAweDAwNDUsIDB4MDA5ZSwgMHgwMGE3LCAweDAwYjksIDB4MDE5NCwgMHgwMWEyLCAweDAxYmEsIDB4MDFjMywgMHgwM2E2LCAweDAzYTcsIDB4MDNiYiwgMHgwM2Q0LCAweDAwOWZ9LAorICB7MHgwMWEwLCAweDAwOGYsIDB4MDA4ZCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzQsIDB4MDE5ZiwgMHgwMWFmLCAweDAxYmYsIDB4MDM5OSwgMHgwM2JmLCAweDAzYjQsIDB4MDNjOSwgMHgwM2U3LCAweDAwYTh9LAorICB7MHgwMWI2LCAweDAwYWIsIDB4MDBhNCwgMHgwMGFhLCAweDAwYjIsIDB4MDBjMiwgMHgwMGM1LCAweDAxOTgsIDB4MDFhNCwgMHgwMWI4LCAweDAzOGMsIDB4MDNhNCwgMHgwM2M0LCAweDAzYzYsIDB4MDNkZCwgMHgwM2U4LCAweDAwYWR9LAorICB7MHgwM2FmLCAweDAxOTIsIDB4MDBiZCwgMHgwMGJjLCAweDAxOGUsIDB4MDE5NywgMHgwMTlhLCAweDAxYTMsIDB4MDFiMSwgMHgwMzhkLCAweDAzOTgsIDB4MDNiNywgMHgwM2QzLCAweDAzZDEsIDB4MDNkYiwgMHgwN2RkLCAweDAwYjR9LAorICB7MHgwM2RlLCAweDAxYTksIDB4MDE5YiwgMHgwMTljLCAweDAxYTEsIDB4MDFhYSwgMHgwMWFkLCAweDAxYjMsIDB4MDM4YiwgMHgwM2IyLCAweDAzYjgsIDB4MDNjZSwgMHgwM2UxLCAweDAzZTAsIDB4MDdkMiwgMHgwN2U1LCAweDAwYjd9LAorICB7MHgwN2UzLCAweDAxYmIsIDB4MDFhOCwgMHgwMWE2LCAweDAxYjAsIDB4MDFiMiwgMHgwMWI3LCAweDAzOWIsIDB4MDM5YSwgMHgwM2JhLCAweDAzYjUsIDB4MDNkNiwgMHgwN2Q3LCAweDAzZTQsIDB4MDdkOCwgMHgwN2VhLCAweDAwYmF9LAorICB7MHgwN2U4LCAweDAzYTAsIDB4MDFiZCwgMHgwMWI0LCAweDAzOGEsIDB4MDFjNCwgMHgwMzkyLCAweDAzYWEsIDB4MDNiMCwgMHgwM2JjLCAweDAzZDcsIDB4MDdkNCwgMHgwN2RjLCAweDA3ZGIsIDB4MDdkNSwgMHgwN2YwLCAweDAwYzF9LAorICB7MHgwN2ZiLCAweDAzYzgsIDB4MDNhMywgMHgwMzk1LCAweDAzOWQsIDB4MDNhYywgMHgwM2FlLCAweDAzYzUsIDB4MDNkOCwgMHgwM2UyLCAweDAzZTYsIDB4MDdlNCwgMHgwN2U3LCAweDA3ZTAsIDB4MDdlOSwgMHgwN2Y3LCAweDAxOTB9LAorICB7MHgwN2YyLCAweDAzOTMsIDB4MDFiZSwgMHgwMWMwLCAweDAzOTQsIDB4MDM5NywgMHgwM2FkLCAweDAzYzMsIDB4MDNjMSwgMHgwM2QyLCAweDA3ZGEsIDB4MDdkOSwgMHgwN2RmLCAweDA3ZWIsIDB4MDdmNCwgMHgwN2ZhLCAweDAxOTV9LAorICB7MHgwN2Y4LCAweDAzYmQsIDB4MDM5YywgMHgwM2FiLCAweDAzYTgsIDB4MDNiMywgMHgwM2I5LCAweDAzZDAsIDB4MDNlMywgMHgwM2U1LCAweDA3ZTIsIDB4MDdkZSwgMHgwN2VkLCAweDA3ZjEsIDB4MDdmOSwgMHgwN2ZjLCAweDAxOTN9LAorICB7MHgwZmZkLCAweDAzZGMsIDB4MDNiNiwgMHgwM2M3LCAweDAzY2MsIDB4MDNjYiwgMHgwM2Q5LCAweDAzZGEsIDB4MDdkMywgMHgwN2UxLCAweDA3ZWUsIDB4MDdlZiwgMHgwN2Y1LCAweDA3ZjYsIDB4MGZmYywgMHgwZmZmLCAweDAxOWR9LAorICB7MHgwMWMyLCAweDAwYjUsIDB4MDBhMSwgMHgwMDk2LCAweDAwOTcsIDB4MDA5NSwgMHgwMDk5LCAweDAwYTAsIDB4MDBhMiwgMHgwMGFjLCAweDAwYTksIDB4MDBiMSwgMHgwMGIzLCAweDAwYmIsIDB4MDBjMCwgMHgwMThmLCAweDAwMDR9LAorICB7MHgwMDE4LCAweDAwMmUsIDB4MDAwMCwgMHgwMDVhLCAweDAwYTUsIDB4MDBmOCwgMHgwMGI3LCAweDAwOTQsIDB4MDBmOSwgMHgwMDRkLCAweDAwMjEsIDB4MDAyYiwgMHgwMDRmLCAweDAwN2IsIDB4MDBiYywgMHgwMDQ2LCAweDAwMTV9LAorICB7MHgwMDQyLCAweDAwMzcsIDB4MDA3OCwgMHgwMDBkLCAweDAwNjgsIDB4MDA1ZiwgMHgwMDBkLCAweDAwNWUsIDB4MDA1YSwgMHgwMGJlLCAweDAwNjMsIDB4MDA3ZSwgMHgwMDFmLCAweDAwOTIsIDB4MDAxYSwgMHgwMGFiLCAweDAwMzJ9LAorICB7MHgwMGU2LCAweDAwMzcsIDB4MDAwMCwgMHgwMDU4LCAweDAwMGIsIDB4MDA1YSwgMHgwMGUxLCAweDAwNWQsIDB4MDAyOSwgMHgwMDE3LCAweDAwN2UsIDB4MDA2OSwgMHgwMGFhLCAweDAwNTQsIDB4MDAyOSwgMHgwMDMyLCAweDAwNDF9LAorICB7MHgwMDQ2LCAweDAwZWEsIDB4MDAzNCwgMHgwMGVhLCAweDAwMTEsIDB4MDAxYiwgMHgwMGE5LCAweDAwOTQsIDB4MDBlMiwgMHgwMDMxLCAweDAwZDAsIDB4MDBlNSwgMHgwMDA3LCAweDAwNzAsIDB4MDA2OSwgMHgwMDNlLCAweDAwMjF9Cit9OworCitjb25zdCBJTlQgRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZlsxMjFdPQoreworICAweDAwMDNmZmU4LCAweDAwMDNmZmU2LCAweDAwMDNmZmU3LCAweDAwMDNmZmU1LCAweDAwMDdmZmY1LCAweDAwMDdmZmYxLCAweDAwMDdmZmVkLCAweDAwMDdmZmY2LAorICAweDAwMDdmZmVlLCAweDAwMDdmZmVmLCAweDAwMDdmZmYwLCAweDAwMDdmZmZjLCAweDAwMDdmZmZkLCAweDAwMDdmZmZmLCAweDAwMDdmZmZlLCAweDAwMDdmZmY3LAorICAweDAwMDdmZmY4LCAweDAwMDdmZmZiLCAweDAwMDdmZmY5LCAweDAwMDNmZmU0LCAweDAwMDdmZmZhLCAweDAwMDNmZmUzLCAweDAwMDFmZmVmLCAweDAwMDFmZmYwLAorICAweDAwMDBmZmY1LCAweDAwMDFmZmVlLCAweDAwMDBmZmYyLCAweDAwMDBmZmYzLCAweDAwMDBmZmY0LCAweDAwMDBmZmYxLCAweDAwMDA3ZmY2LCAweDAwMDA3ZmY3LAorICAweDAwMDAzZmY5LCAweDAwMDAzZmY1LCAweDAwMDAzZmY3LCAweDAwMDAzZmYzLCAweDAwMDAzZmY2LCAweDAwMDAzZmYyLCAweDAwMDAxZmY3LCAweDAwMDAxZmY1LAorICAweDAwMDAwZmY5LCAweDAwMDAwZmY3LCAweDAwMDAwZmY2LCAweDAwMDAwN2Y5LCAweDAwMDAwZmY0LCAweDAwMDAwN2Y4LCAweDAwMDAwM2Y5LCAweDAwMDAwM2Y3LAorICAweDAwMDAwM2Y1LCAweDAwMDAwMWY4LCAweDAwMDAwMWY3LCAweDAwMDAwMGZhLCAweDAwMDAwMGY4LCAweDAwMDAwMGY2LCAweDAwMDAwMDc5LCAweDAwMDAwMDNhLAorICAweDAwMDAwMDM4LCAweDAwMDAwMDFhLCAweDAwMDAwMDBiLCAweDAwMDAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDBhLCAweDAwMDAwMDBjLCAweDAwMDAwMDFiLAorICAweDAwMDAwMDM5LCAweDAwMDAwMDNiLCAweDAwMDAwMDc4LCAweDAwMDAwMDdhLCAweDAwMDAwMGY3LCAweDAwMDAwMGY5LCAweDAwMDAwMWY2LCAweDAwMDAwMWY5LAorICAweDAwMDAwM2Y0LCAweDAwMDAwM2Y2LCAweDAwMDAwM2Y4LCAweDAwMDAwN2Y1LCAweDAwMDAwN2Y0LCAweDAwMDAwN2Y2LCAweDAwMDAwN2Y3LCAweDAwMDAwZmY1LAorICAweDAwMDAwZmY4LCAweDAwMDAxZmY0LCAweDAwMDAxZmY2LCAweDAwMDAxZmY4LCAweDAwMDAzZmY4LCAweDAwMDAzZmY0LCAweDAwMDBmZmYwLCAweDAwMDA3ZmY0LAorICAweDAwMDBmZmY2LCAweDAwMDA3ZmY1LCAweDAwMDNmZmUyLCAweDAwMDdmZmQ5LCAweDAwMDdmZmRhLCAweDAwMDdmZmRiLCAweDAwMDdmZmRjLCAweDAwMDdmZmRkLAorICAweDAwMDdmZmRlLCAweDAwMDdmZmQ4LCAweDAwMDdmZmQyLCAweDAwMDdmZmQzLCAweDAwMDdmZmQ0LCAweDAwMDdmZmQ1LCAweDAwMDdmZmQ2LCAweDAwMDdmZmYyLAorICAweDAwMDdmZmRmLCAweDAwMDdmZmU3LCAweDAwMDdmZmU4LCAweDAwMDdmZmU5LCAweDAwMDdmZmVhLCAweDAwMDdmZmViLCAweDAwMDdmZmU2LCAweDAwMDdmZmUwLAorICAweDAwMDdmZmUxLCAweDAwMDdmZmUyLCAweDAwMDdmZmUzLCAweDAwMDdmZmU0LCAweDAwMDdmZmU1LCAweDAwMDdmZmQ3LCAweDAwMDdmZmVjLCAweDAwMDdmZmY0LAorICAweDAwMDdmZmYzCit9OworCisvKgorICB0YWJsZSBvZiAoMC41MDAwMC4uLjEuMDAwMDApIF4wLjc1CisqLworY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX21UYWJfM180W01BTlRfU0laRV0gPQoreworICBRVEMoMHg0YzFiZjgyOSksIFFUQygweDRjMzg4MGRlKSwgUVRDKDB4NGM1NTA2MDMpLCBRVEMoMHg0YzcxODc5YyksIFFUQygweDRjOGUwNWFhKSwgUVRDKDB4NGNhYTgwMzApLCBRVEMoMHg0Y2M2ZjcyZiksIFFUQygweDRjZTM2YWFiKSwKKyAgUVRDKDB4NGNmZmRhYTQpLCBRVEMoMHg0ZDFjNDcxZCksIFFUQygweDRkMzhiMDE5KSwgUVRDKDB4NGQ1NTE1OWEpLCBRVEMoMHg0ZDcxNzdhMSksIFFUQygweDRkOGRkNjMxKSwgUVRDKDB4NGRhYTMxNGIpLCBRVEMoMHg0ZGM2ODhmMyksCisgIFFUQygweDRkZTJkZDJhKSwgUVRDKDB4NGRmZjJkZjIpLCBRVEMoMHg0ZTFiN2I0ZCksIFFUQygweDRlMzdjNTNkKSwgUVRDKDB4NGU1NDBiYzUpLCBRVEMoMHg0ZTcwNGVlNiksIFFUQygweDRlOGM4ZWEzKSwgUVRDKDB4NGVhOGNhZmQpLAorICBRVEMoMHg0ZWM1MDNmNyksIFFUQygweDRlZTEzOTkyKSwgUVRDKDB4NGVmZDZiZDApLCBRVEMoMHg0ZjE5OWFiNCksIFFUQygweDRmMzVjNjQwKSwgUVRDKDB4NGY1MWVlNzUpLCBRVEMoMHg0ZjZlMTM1NiksIFFUQygweDRmOGEzNGU0KSwKKyAgUVRDKDB4NGZhNjUzMjEpLCBRVEMoMHg0ZmMyNmUxMCksIFFUQygweDRmZGU4NWIyKSwgUVRDKDB4NGZmYTlhMGEpLCBRVEMoMHg1MDE2YWIxOCksIFFUQygweDUwMzJiOGUwKSwgUVRDKDB4NTA0ZWMzNjIpLCBRVEMoMHg1MDZhY2FhMSksCisgIFFUQygweDUwODZjZWEwKSwgUVRDKDB4NTBhMmNmNWUpLCBRVEMoMHg1MGJlY2NlMCksIFFUQygweDUwZGFjNzI1KSwgUVRDKDB4NTBmNmJlMzEpLCBRVEMoMHg1MTEyYjIwNSksIFFUQygweDUxMmVhMmEzKSwgUVRDKDB4NTE0YTkwMGQpLAorICBRVEMoMHg1MTY2N2E0NSksIFFUQygweDUxODI2MTRjKSwgUVRDKDB4NTE5ZTQ1MjQpLCBRVEMoMHg1MWJhMjVjZiksIFFUQygweDUxZDYwMzUwKSwgUVRDKDB4NTFmMWRkYTcpLCBRVEMoMHg1MjBkYjRkNiksIFFUQygweDUyMjk4OGUwKSwKKyAgUVRDKDB4NTI0NTU5YzYpLCBRVEMoMHg1MjYxMjc4OSksIFFUQygweDUyN2NmMjJkKSwgUVRDKDB4NTI5OGI5YjEpLCBRVEMoMHg1MmI0N2UxOSksIFFUQygweDUyZDAzZjY1KSwgUVRDKDB4NTJlYmZkOTgpLCBRVEMoMHg1MzA3YjhiNCksCisgIFFUQygweDUzMjM3MGI5KSwgUVRDKDB4NTMzZjI1YWEpLCBRVEMoMHg1MzVhZDc4OSksIFFUQygweDUzNzY4NjU2KSwgUVRDKDB4NTM5MjMyMTUpLCBRVEMoMHg1M2FkZGFjNiksIFFUQygweDUzYzk4MDZiKSwgUVRDKDB4NTNlNTIzMDYpLAorICBRVEMoMHg1NDAwYzI5OCksIFFUQygweDU0MWM1ZjI0KSwgUVRDKDB4NTQzN2Y4YWIpLCBRVEMoMHg1NDUzOGYyZSksIFFUQygweDU0NmYyMmFmKSwgUVRDKDB4NTQ4YWIzMzApLCBRVEMoMHg1NGE2NDBiMyksIFFUQygweDU0YzFjYjM4KSwKKyAgUVRDKDB4NTRkZDUyYzIpLCBRVEMoMHg1NGY4ZDc1MyksIFFUQygweDU1MTQ1OGViKSwgUVRDKDB4NTUyZmQ3OGQpLCBRVEMoMHg1NTRiNTMzOSksIFFUQygweDU1NjZjYmYzKSwgUVRDKDB4NTU4MjQxYmIpLCBRVEMoMHg1NTlkYjQ5MiksCisgIFFUQygweDU1YjkyNDdiKSwgUVRDKDB4NTVkNDkxNzcpLCBRVEMoMHg1NWVmZmI4NyksIFFUQygweDU2MGI2MmFkKSwgUVRDKDB4NTYyNmM2ZWIpLCBRVEMoMHg1NjQyMjg0MiksIFFUQygweDU2NWQ4NmI0KSwgUVRDKDB4NTY3OGUyNDIpLAorICBRVEMoMHg1Njk0M2FlZSksIFFUQygweDU2YWY5MGI5KSwgUVRDKDB4NTZjYWUzYTQpLCBRVEMoMHg1NmU2MzNiMiksIFFUQygweDU3MDE4MGU0KSwgUVRDKDB4NTcxY2NiM2IpLCBRVEMoMHg1NzM4MTJiOCksIFFUQygweDU3NTM1NzVlKSwKKyAgUVRDKDB4NTc2ZTk5MmUpLCBRVEMoMHg1Nzg5ZDgyOSksIFFUQygweDU3YTUxNDUwKSwgUVRDKDB4NTdjMDRkYTYpLCBRVEMoMHg1N2RiODQyYiksIFFUQygweDU3ZjZiN2UxKSwgUVRDKDB4NTgxMWU4YzkpLCBRVEMoMHg1ODJkMTZlNiksCisgIFFUQygweDU4NDg0MjM4KSwgUVRDKDB4NTg2MzZhYzApLCBRVEMoMHg1ODdlOTA4MSksIFFUQygweDU4OTliMzdjKSwgUVRDKDB4NThiNGQzYjEpLCBRVEMoMHg1OGNmZjEyMyksIFFUQygweDU4ZWIwYmQzKSwgUVRDKDB4NTkwNjIzYzIpLAorICBRVEMoMHg1OTIxMzhmMiksIFFUQygweDU5M2M0YjYzKSwgUVRDKDB4NTk1NzViMTkpLCBRVEMoMHg1OTcyNjgxMiksIFFUQygweDU5OGQ3MjUzKSwgUVRDKDB4NTlhODc5ZGEpLCBRVEMoMHg1OWMzN2VhYiksIFFUQygweDU5ZGU4MGM2KSwKKyAgUVRDKDB4NTlmOTgwMmQpLCBRVEMoMHg1YTE0N2NlMCksIFFUQygweDVhMmY3NmUyKSwgUVRDKDB4NWE0YTZlMzQpLCBRVEMoMHg1YTY1NjJkNiksIFFUQygweDVhODA1NGNiKSwgUVRDKDB4NWE5YjQ0MTQpLCBRVEMoMHg1YWI2MzBiMiksCisgIFFUQygweDVhZDExYWE2KSwgUVRDKDB4NWFlYzAxZjEpLCBRVEMoMHg1YjA2ZTY5NiksIFFUQygweDViMjFjODk1KSwgUVRDKDB4NWIzY2E3ZWYpLCBRVEMoMHg1YjU3ODRhNiksIFFUQygweDViNzI1ZWJjKSwgUVRDKDB4NWI4ZDM2MzEpLAorICBRVEMoMHg1YmE4MGIwNiksIFFUQygweDViYzJkZDNlKSwgUVRDKDB4NWJkZGFjZDkpLCBRVEMoMHg1YmY4NzlkOCksIFFUQygweDVjMTM0NDNkKSwgUVRDKDB4NWMyZTBjMDkpLCBRVEMoMHg1YzQ4ZDEzZSksIFFUQygweDVjNjM5M2RjKSwKKyAgUVRDKDB4NWM3ZTUzZTUpLCBRVEMoMHg1Yzk5MTE1YSksIFFUQygweDVjYjNjYzNjKSwgUVRDKDB4NWNjZTg0OGQpLCBRVEMoMHg1Y2U5M2E0ZSksIFFUQygweDVkMDNlZDgwKSwgUVRDKDB4NWQxZTllMjQpLCBRVEMoMHg1ZDM5NGMzYiksCisgIFFUQygweDVkNTNmN2M3KSwgUVRDKDB4NWQ2ZWEwYzkpLCBRVEMoMHg1ZDg5NDc0MiksIFFUQygweDVkYTNlYjMzKSwgUVRDKDB4NWRiZThjOWUpLCBRVEMoMHg1ZGQ5MmI4NCksIFFUQygweDVkZjNjN2U1KSwgUVRDKDB4NWUwZTYxYzMpLAorICBRVEMoMHg1ZTI4ZjkyMCksIFFUQygweDVlNDM4ZGZjKSwgUVRDKDB4NWU1ZTIwNTkpLCBRVEMoMHg1ZTc4YjAzNyksIFFUQygweDVlOTMzZDk5KSwgUVRDKDB4NWVhZGM4N2UpLCBRVEMoMHg1ZWM4NTBlOSksIFFUQygweDVlZTJkNmRhKSwKKyAgUVRDKDB4NWVmZDVhNTMpLCBRVEMoMHg1ZjE3ZGI1NCksIFFUQygweDVmMzI1OWUwKSwgUVRDKDB4NWY0Y2Q1ZjYpLCBRVEMoMHg1ZjY3NGY5OSksIFFUQygweDVmODFjNmM4KSwgUVRDKDB4NWY5YzNiODcpLCBRVEMoMHg1ZmI2YWRkNCksCisgIFFUQygweDVmZDExZGIzKSwgUVRDKDB4NWZlYjhiMjMpLCBRVEMoMHg2MDA1ZjYyNiksIFFUQygweDYwMjA1ZWJkKSwgUVRDKDB4NjAzYWM0ZTkpLCBRVEMoMHg2MDU1MjhhYyksIFFUQygweDYwNmY4YTA1KSwgUVRDKDB4NjA4OWU4ZjcpLAorICBRVEMoMHg2MGE0NDU4MyksIFFUQygweDYwYmU5ZmE5KSwgUVRDKDB4NjBkOGY3NmIpLCBRVEMoMHg2MGYzNGNjYSksIFFUQygweDYxMGQ5ZmM3KSwgUVRDKDB4NjEyN2YwNjIpLCBRVEMoMHg2MTQyM2U5ZSksIFFUQygweDYxNWM4YTdhKSwKKyAgUVRDKDB4NjE3NmQzZjkpLCBRVEMoMHg2MTkxMWIxYiksIFFUQygweDYxYWI1ZmUxKSwgUVRDKDB4NjFjNWEyNGQpLCBRVEMoMHg2MWRmZTI1ZiksIFFUQygweDYxZmEyMDE4KSwgUVRDKDB4NjIxNDViN2EpLCBRVEMoMHg2MjJlOTQ4NSksCisgIFFUQygweDYyNDhjYjNiKSwgUVRDKDB4NjI2MmZmOWQpLCBRVEMoMHg2MjdkMzFhYiksIFFUQygweDYyOTc2MTY3KSwgUVRDKDB4NjJiMThlZDEpLCBRVEMoMHg2MmNiYjllYiksIFFUQygweDYyZTVlMmI2KSwgUVRDKDB4NjMwMDA5MzMpLAorICBRVEMoMHg2MzFhMmQ2MiksIFFUQygweDYzMzQ0ZjQ1KSwgUVRDKDB4NjM0ZTZlZGQpLCBRVEMoMHg2MzY4OGMyYiksIFFUQygweDYzODJhNzMwKSwgUVRDKDB4NjM5Y2JmZWMpLCBRVEMoMHg2M2I2ZDY2MSksIFFUQygweDYzZDBlYTkwKSwKKyAgUVRDKDB4NjNlYWZjN2EpLCBRVEMoMHg2NDA1MGMxZiksIFFUQygweDY0MWYxOTgyKSwgUVRDKDB4NjQzOTI0YTIpLCBRVEMoMHg2NDUzMmQ4MCksIFFUQygweDY0NmQzNDFmKSwgUVRDKDB4NjQ4NzM4N2UpLCBRVEMoMHg2NGExM2E5ZSksCisgIFFUQygweDY0YmIzYTgxKSwgUVRDKDB4NjRkNTM4MjgpLCBRVEMoMHg2NGVmMzM5MyksIFFUQygweDY1MDkyY2M0KSwgUVRDKDB4NjUyMzIzYmIpLCBRVEMoMHg2NTNkMTg3OSksIFFUQygweDY1NTcwYjAwKSwgUVRDKDB4NjU3MGZiNTApLAorICBRVEMoMHg2NThhZTk2YiksIFFUQygweDY1YTRkNTUwKSwgUVRDKDB4NjViZWJmMDEpLCBRVEMoMHg2NWQ4YTY4MCksIFFUQygweDY1ZjI4YmNjKSwgUVRDKDB4NjYwYzZlZTgpLCBRVEMoMHg2NjI2NGZkMyksIFFUQygweDY2NDAyZThmKSwKKyAgUVRDKDB4NjY1YTBiMWMpLCBRVEMoMHg2NjczZTU3ZCksIFFUQygweDY2OGRiZGIwKSwgUVRDKDB4NjZhNzkzYjgpLCBRVEMoMHg2NmMxNjc5NSksIFFUQygweDY2ZGIzOTQ5KSwgUVRDKDB4NjZmNTA4ZDQpLCBRVEMoMHg2NzBlZDYzNiksCisgIFFUQygweDY3MjhhMTcyKSwgUVRDKDB4Njc0MjZhODcpLCBRVEMoMHg2NzVjMzE3NyksIFFUQygweDY3NzVmNjQzKSwgUVRDKDB4Njc4ZmI4ZWIpLCBRVEMoMHg2N2E5Nzk3MSksIFFUQygweDY3YzMzN2Q1KSwgUVRDKDB4NjdkY2Y0MTgpLAorICBRVEMoMHg2N2Y2YWUzYiksIFFUQygweDY4MTA2NjNmKSwgUVRDKDB4NjgyYTFjMjUpLCBRVEMoMHg2ODQzY2ZlZCksIFFUQygweDY4NWQ4MTk5KSwgUVRDKDB4Njg3NzMxMjkpLCBRVEMoMHg2ODkwZGU5ZiksIFFUQygweDY4YWE4OWZhKSwKKyAgUVRDKDB4NjhjNDMzM2QpLCBRVEMoMHg2OGRkZGE2NyksIFFUQygweDY4Zjc3ZjdhKSwgUVRDKDB4NjkxMTIyNzcpLCBRVEMoMHg2OTJhYzM1ZSksIFFUQygweDY5NDQ2MjMwKSwgUVRDKDB4Njk1ZGZlZWUpLCBRVEMoMHg2OTc3OTk5YSksCisgIFFUQygweDY5OTEzMjMyKSwgUVRDKDB4NjlhYWM4YmEpLCBRVEMoMHg2OWM0NWQzMSksIFFUQygweDY5ZGRlZjk4KSwgUVRDKDB4NjlmNzdmZjApLCBRVEMoMHg2YTExMGUzYSksIFFUQygweDZhMmE5YTc3KSwgUVRDKDB4NmE0NDI0YTgpLAorICBRVEMoMHg2YTVkYWNjYyksIFFUQygweDZhNzczMmU2KSwgUVRDKDB4NmE5MGI2ZjYpLCBRVEMoMHg2YWFhMzhmZCksIFFUQygweDZhYzNiOGZiKSwgUVRDKDB4NmFkZDM2ZjIpLCBRVEMoMHg2YWY2YjJlMiksIFFUQygweDZiMTAyY2NkKSwKKyAgUVRDKDB4NmIyOWE0YjIpLCBRVEMoMHg2YjQzMWE5MiksIFFUQygweDZiNWM4ZTZmKSwgUVRDKDB4NmI3NjAwNGEpLCBRVEMoMHg2YjhmNzAyMiksIFFUQygweDZiYThkZGY5KSwgUVRDKDB4NmJjMjQ5ZDApLCBRVEMoMHg2YmRiYjNhNyksCisgIFFUQygweDZiZjUxYjgwKSwgUVRDKDB4NmMwZTgxNWEpLCBRVEMoMHg2YzI3ZTUzNyksIFFUQygweDZjNDE0NzE4KSwgUVRDKDB4NmM1YWE2ZmQpLCBRVEMoMHg2Yzc0MDRlNyksIFFUQygweDZjOGQ2MGQ3KSwgUVRDKDB4NmNhNmJhY2UpLAorICBRVEMoMHg2Y2MwMTJjYyksIFFUQygweDZjZDk2OGQyKSwgUVRDKDB4NmNmMmJjZTEpLCBRVEMoMHg2ZDBjMGVmOSksIFFUQygweDZkMjU1ZjFkKSwgUVRDKDB4NmQzZWFkNGIpLCBRVEMoMHg2ZDU3Zjk4NSksIFFUQygweDZkNzE0M2NjKSwKKyAgUVRDKDB4NmQ4YThjMjEpLCBRVEMoMHg2ZGEzZDI4MyksIFFUQygweDZkYmQxNmY1KSwgUVRDKDB4NmRkNjU5NzYpLCBRVEMoMHg2ZGVmOWEwOCksIFFUQygweDZlMDhkOGFiKSwgUVRDKDB4NmUyMjE1NjApLCBRVEMoMHg2ZTNiNTAyNyksCisgIFFUQygweDZlNTQ4OTAyKSwgUVRDKDB4NmU2ZGJmZjEpLCBRVEMoMHg2ZTg2ZjRmNSksIFFUQygweDZlYTAyODBlKSwgUVRDKDB4NmViOTU5M2UpLCBRVEMoMHg2ZWQyODg4NSksIFFUQygweDZlZWJiNWUzKSwgUVRDKDB4NmYwNGUxNWEpLAorICBRVEMoMHg2ZjFlMGFlYSksIFFUQygweDZmMzczMjk0KSwgUVRDKDB4NmY1MDU4NTkpLCBRVEMoMHg2ZjY5N2MzOSksIFFUQygweDZmODI5ZTM1KSwgUVRDKDB4NmY5YmJlNGUpLCBRVEMoMHg2ZmI0ZGM4NSksIFFUQygweDZmY2RmOGQ5KSwKKyAgUVRDKDB4NmZlNzEzNGQpLCBRVEMoMHg3MDAwMmJlMCksIFFUQygweDcwMTk0MjkzKSwgUVRDKDB4NzAzMjU3NjcpLCBRVEMoMHg3MDRiNmE1ZCksIFFUQygweDcwNjQ3Yjc2KSwgUVRDKDB4NzA3ZDhhYjEpLCBRVEMoMHg3MDk2OTgxMSksCisgIFFUQygweDcwYWZhMzk0KSwgUVRDKDB4NzBjOGFkM2QpLCBRVEMoMHg3MGUxYjUwYyksIFFUQygweDcwZmFiYjAxKSwgUVRDKDB4NzExM2JmMWQpLCBRVEMoMHg3MTJjYzE2MSksIFFUQygweDcxNDVjMWNlKSwgUVRDKDB4NzE1ZWMwNjQpLAorICBRVEMoMHg3MTc3YmQyNCksIFFUQygweDcxOTBiODBmKSwgUVRDKDB4NzFhOWIxMjQpLCBRVEMoMHg3MWMyYTg2NiksIFFUQygweDcxZGI5ZGQ0KSwgUVRDKDB4NzFmNDkxNzApLCBRVEMoMHg3MjBkODMzOSksIFFUQygweDcyMjY3MzMxKSwKKyAgUVRDKDB4NzIzZjYxNTkpLCBRVEMoMHg3MjU4NGRiMCksIFFUQygweDcyNzEzODM4KSwgUVRDKDB4NzI4YTIwZjEpLCBRVEMoMHg3MmEzMDdkYiksIFFUQygweDcyYmJlY2Y5KSwgUVRDKDB4NzJkNGQwNDkpLCBRVEMoMHg3MmVkYjFjZSksCisgIFFUQygweDczMDY5MTg3KSwgUVRDKDB4NzMxZjZmNzUpLCBRVEMoMHg3MzM4NGI5OCksIFFUQygweDczNTEyNWYzKSwgUVRDKDB4NzM2OWZlODQpLCBRVEMoMHg3MzgyZDU0ZCksIFFUQygweDczOWJhYTRlKSwgUVRDKDB4NzNiNDdkODkpLAorICBRVEMoMHg3M2NkNGVmZCksIFFUQygweDczZTYxZWFiKSwgUVRDKDB4NzNmZWVjOTQpLCBRVEMoMHg3NDE3YjhiOCksIFFUQygweDc0MzA4MzE5KSwgUVRDKDB4NzQ0OTRiYjYpLCBRVEMoMHg3NDYyMTI5MSksIFFUQygweDc0N2FkN2FhKSwKKyAgUVRDKDB4NzQ5MzliMDIpLCBRVEMoMHg3NGFjNWM5OCksIFFUQygweDc0YzUxYzZmKSwgUVRDKDB4NzRkZGRhODYpLCBRVEMoMHg3NGY2OTZkZSksIFFUQygweDc1MGY1MTc4KSwgUVRDKDB4NzUyODBhNTQpLCBRVEMoMHg3NTQwYzE3NCksCisgIFFUQygweDc1NTk3NmQ3KSwgUVRDKDB4NzU3MjJhN2UpLCBRVEMoMHg3NThhZGM2OSksIFFUQygweDc1YTM4YzliKSwgUVRDKDB4NzViYzNiMTIpLCBRVEMoMHg3NWQ0ZTdjZiksIFFUQygweDc1ZWQ5MmQ0KSwgUVRDKDB4NzYwNjNjMjEpLAorICBRVEMoMHg3NjFlZTNiNiksIFFUQygweDc2Mzc4OTk0KSwgUVRDKDB4NzY1MDJkYmMpLCBRVEMoMHg3NjY4ZDAyZSksIFFUQygweDc2ODE3MGViKSwgUVRDKDB4NzY5YTBmZjMpLCBRVEMoMHg3NmIyYWQ0NyksIFFUQygweDc2Y2I0OGU3KSwKKyAgUVRDKDB4NzZlM2UyZDUpLCBRVEMoMHg3NmZjN2IxMCksIFFUQygweDc3MTUxMTlhKSwgUVRDKDB4NzcyZGE2NzMpLCBRVEMoMHg3NzQ2Mzk5YiksIFFUQygweDc3NWVjYjEzKSwgUVRDKDB4Nzc3NzVhZGMpLCBRVEMoMHg3NzhmZThmNiksCisgIFFUQygweDc3YTg3NTYxKSwgUVRDKDB4NzdjMTAwMWYpLCBRVEMoMHg3N2Q5ODkzMCksIFFUQygweDc3ZjIxMDk1KSwgUVRDKDB4NzgwYTk2NGQpLCBRVEMoMHg3ODIzMWE1YiksIFFUQygweDc4M2I5Y2JkKSwgUVRDKDB4Nzg1NDFkNzUpLAorICBRVEMoMHg3ODZjOWM4NCksIFFUQygweDc4ODUxOWU5KSwgUVRDKDB4Nzg5ZDk1YTYpLCBRVEMoMHg3OGI2MGZiYiksIFFUQygweDc4Y2U4ODI4KSwgUVRDKDB4NzhlNmZlZWYpLCBRVEMoMHg3OGZmNzQwZiksIFFUQygweDc5MTdlNzhhKSwKKyAgUVRDKDB4NzkzMDU5NWYpLCBRVEMoMHg3OTQ4Yzk5MCksIFFUQygweDc5NjEzODFkKSwgUVRDKDB4Nzk3OWE1MDYpLCBRVEMoMHg3OTkyMTA0YyksIFFUQygweDc5YWE3OWYwKSwgUVRDKDB4NzljMmUxZjEpLCBRVEMoMHg3OWRiNDg1MiksCisgIFFUQygweDc5ZjNhZDExKSwgUVRDKDB4N2EwYzEwMzEpLCBRVEMoMHg3YTI0NzFiMCksIFFUQygweDdhM2NkMTkxKSwgUVRDKDB4N2E1NTJmZDMpLCBRVEMoMHg3YTZkOGM3NiksIFFUQygweDdhODVlNzdkKSwgUVRDKDB4N2E5ZTQwZTYpLAorICBRVEMoMHg3YWI2OThiMiksIFFUQygweDdhY2VlZWUzKSwgUVRDKDB4N2FlNzQzNzgpLCBRVEMoMHg3YWZmOTY3MyksIFFUQygweDdiMTdlN2QyKSwgUVRDKDB4N2IzMDM3OTkpLCBRVEMoMHg3YjQ4ODVjNSksIFFUQygweDdiNjBkMjU5KSwKKyAgUVRDKDB4N2I3OTFkNTUpLCBRVEMoMHg3YjkxNjZiOSksIFFUQygweDdiYTlhZTg2KSwgUVRDKDB4N2JjMWY0YmMpLCBRVEMoMHg3YmRhMzk1YyksIFFUQygweDdiZjI3YzY2KSwgUVRDKDB4N2MwYWJkZGIpLCBRVEMoMHg3YzIyZmRiYiksCisgIFFUQygweDdjM2IzYzA3KSwgUVRDKDB4N2M1Mzc4YzApLCBRVEMoMHg3YzZiYjNlNSksIFFUQygweDdjODNlZDc4KSwgUVRDKDB4N2M5YzI1NzkpLCBRVEMoMHg3Y2I0NWJlOSksIFFUQygweDdjY2M5MGM3KSwgUVRDKDB4N2NlNGM0MTQpLAorICBRVEMoMHg3Y2ZjZjVkMiksIFFUQygweDdkMTUyNjAwKSwgUVRDKDB4N2QyZDU0OWYpLCBRVEMoMHg3ZDQ1ODFiMCksIFFUQygweDdkNWRhZDMyKSwgUVRDKDB4N2Q3NWQ3MjcpLCBRVEMoMHg3ZDhkZmY4ZiksIFFUQygweDdkYTYyNjZhKSwKKyAgUVRDKDB4N2RiZTRiYmEpLCBRVEMoMHg3ZGQ2NmY3ZCksIFFUQygweDdkZWU5MWI2KSwgUVRDKDB4N2UwNmIyNjQpLCBRVEMoMHg3ZTFlZDE4OCksIFFUQygweDdlMzZlZjIyKSwgUVRDKDB4N2U0ZjBiMzQpLCBRVEMoMHg3ZTY3MjViZCksCisgIFFUQygweDdlN2YzZWJkKSwgUVRDKDB4N2U5NzU2MzYpLCBRVEMoMHg3ZWFmNmMyOCksIFFUQygweDdlYzc4MDkzKSwgUVRDKDB4N2VkZjkzNzgpLCBRVEMoMHg3ZWY3YTRkNyksIFFUQygweDdmMGZiNGIxKSwgUVRDKDB4N2YyN2MzMDcpLAorICBRVEMoMHg3ZjNmY2ZkOCksIFFUQygweDdmNTdkYjI1KSwgUVRDKDB4N2Y2ZmU0ZWYpLCBRVEMoMHg3Zjg3ZWQzNiksIFFUQygweDdmOWZmM2ZiKSwgUVRDKDB4N2ZiN2Y5M2UpLCBRVEMoMHg3ZmNmZmNmZiksIFFUQygweDdmZTdmZjQwKQorfTsKKworLyoKKyAgdGFibGUgb2YgcG93KDIuMCwwLjI1KnEpLzIuMCwgcVswLi40KQorKi8KK2NvbnN0IEZJWFBfUVREIEZES2FhY0VuY19xdWFudFRhYmxlUVs0XSA9IHsgUVRDKDB4NDAwMDAwMDApLCBRVEMoMHg0YzFiZjdmZiksIFFUQygweDVhODI3OTdmKSwgUVRDKDB4NmJhMjdlN2YpIH07CisKKy8qCisgIHRhYmxlIG9mIHBvdygyLjAsMC43NSplKS84LjAsIGVbMC4uNCkKKyovCitjb25zdCBGSVhQX1FURCBGREthYWNFbmNfcXVhbnRUYWJsZUVbNF0gPSB7IFFUQygweDEwMDAwMDAwKSwgUVRDKDB4MWFlODlmOTkpLCBRVEMoMHgyZDQxM2NjZCksIFFUQygweDRjMWJmODI4KSB9OworCisKKy8qCisgIHRhYmxlIHRvIGNvdW50IHVzZWQgbnVtYmVyIG9mIGJpdHMKKyovCitjb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJMb25nW01BWF9TRkJfTE9ORyArIDFdID0KK3sKKyAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksCisgIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LAorICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwKKyAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMGUsCisgIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorICAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKyAgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlCit9OworCisKK2NvbnN0IFNIT1JUIEZES2FhY0VuY19zaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9Cit7CisgIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDBhLAorICAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGQsIDB4MDAwZAorfTsKKworCisKKworCisKKy8qCisgIFBzeSBDb25maWd1cmF0aW9uIGNvbnN0YW50cworKi8KKworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQgPSB7CisgICAgNDAsCisgICAgeyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgICAyMCwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgODAgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY184MDAwX3Nob3J0XzEyOCA9IHsKKyAgICAxNSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgMTIsIDE2LCAyMCwgMjAgfQorfTsKKworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTEwMjVfbG9uZ18xMDI0ID0geworICAgIDQzLAorICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLAorICAgICAgNjQsIDY0LCA2NCB9Cit9OworY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzExMDI1X3Nob3J0XzEyOCA9IHsKKyAgICAxNSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAgfQorfTsKKworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTIwMDBfbG9uZ18xMDI0ID0geworICAgIDQzLAorICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLAorICAgICAgNjQsIDY0LCA2NCB9Cit9OworY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzEyMDAwX3Nob3J0XzEyOCA9IHsKKyAgICAxNSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAgfQorfTsKKworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTYwMDBfbG9uZ18xMDI0ID0geworICAgIDQzLAorICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgICAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLAorICAgICAgNjQsIDY0LCA2NCB9Cit9OworY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzE2MDAwX3Nob3J0XzEyOCA9IHsKKyAgICAxNSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzIyMDUwX2xvbmdfMTAyNCA9IHsKKyAgICA0NywKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICA4LCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDM2LCAzNiwgNDAsIDQ0LCA0OCwKKyAgICAgIDUyLCA1MiwgNjQsIDY0LCA2NCwgNjQsIDY0IH0KK307Citjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMjIwNTBfc2hvcnRfMTI4ID0geworICAgIDE1LAorICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDE2LCAyMCB9Cit9OworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMjQwMDBfbG9uZ18xMDI0ID0geworICAgIDQ3LAorICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICAgIDgsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LAorICAgICAgNTIsIDUyLCA2NCwgNjQsIDY0LCA2NCwgNjQgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18yNDAwMF9zaG9ydF8xMjggPSB7CisgICAgMTUsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDIwIH0KK307Citjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18zMjAwMF9sb25nXzEwMjQgPSB7CisgICAgNTEsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsCisgICAgICAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18zMjAwMF9zaG9ydF8xMjggPSB7CisgICAgMTQsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzQ0MTAwX2xvbmdfMTAyNCA9IHsKKyAgICA0OSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwKKyAgICAgIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTYgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY180NDEwMF9zaG9ydF8xMjggPSB7CisgICAgMTQsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzQ4MDAwX2xvbmdfMTAyNCA9IHsKKyAgICA0OSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwKKyAgICAgIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTYgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY180ODAwMF9zaG9ydF8xMjggPSB7CisgICAgMTQsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzY0MDAwX2xvbmdfMTAyNCA9IHsKKyAgICA0NywKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwKKyAgICAgIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjQsIDI0LCAyOCwgMzYsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKKyAgICAgIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwIH0KK307Citjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNjQwMDBfc2hvcnRfMTI4ID0geworICAgIDEyLAorICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTYsIDI4LCAzNiB9Cit9OworY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODgyMDBfbG9uZ18xMDI0ID0geworICAgIDQxLAorICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLAorICAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LCAzNiwgNDQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAorICAgICAgNjQgfQorfTsKK2NvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY184ODIwMF9zaG9ydF8xMjggPSB7CisgICAgMTIsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxNiwgMjgsIDM2IH0KK307Citjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY185NjAwMF9sb25nXzEwMjQgPSB7CisgICAgNDEsCisgICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsCisgICAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyNCwgMjgsIDM2LCA0NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCisgICAgICA2NCB9Cit9OworY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzk2MDAwX3Nob3J0XzEyOCA9IHsKKyAgICAxMiwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDE2LCAyOCwgMzYgfQorfTsKKworCisvKgorICBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cworKi8KKworLyoKKyAgMyBiaXQgcmVzb2x1dGlvbgorKi8KK2NvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjNbOF09Cit7CisgIDB4ODFmMWQyMDEsIDB4OTEyNjE0ODEsIDB4YWRiOTIzMDEsIDB4ZDQzOGFmMDAsIDB4MDAwMDAwMDAsIDB4Mzc4OTgwODAsIDB4NjQxMzBkZmYsIDB4N2NjYTZmZmYKK307Citjb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zQ29lZmYzQm9yZGVyc1s4XT17CisgIDB4ODAwMDAwMDEgLyotNCovLCAgMHg4N2I4MjZkZiAvKi0zKi8sICAweDlkZjI0MTU0IC8qLTIqLywgIDB4YmZmZmZmZTUgLyotMSovLAorICAweGU5YzVlNTc4IC8qIDAqLywgIDB4MWM3YjkwZjAgLyogMSovLCAgMHg0ZmNlODNhOSAvKiAyKi8sICAweDczNTJmMmMzIC8qIDMqLworfTsKKworLyoKKyAgNCBiaXQgcmVzb2x1dGlvbgorKi8KK2NvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdPQoreworICAweDgwOGJjODgxLCAweDg0ZTJlNTgxLCAweDhkNmI0YTAxLCAweDk5ZGE5MjAxLCAweGE5YzQ1NzAxLCAweGJjOWRkZTgxLCAweGQxYzJkNTAwLCAweGU4N2FlNTQwLAorICAweDAwMDAwMDAwLCAweDFhOWNkOWMwLCAweDM0MGZmMjQwLCAweDRiM2M4YmZmLCAweDVmMWY1ZTdmLCAweDZlZDllYjdmLCAweDc5YmMzODdmLCAweDdmNGM3ZTdmCit9OworY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbMTZdPQoreworICAweDgwMDAwMDAxIC8qLTgqLywgIDB4ODIyZGVmZjAgLyotNyovLCAgMHg4OGE0YmZlNiAvKi02Ki8sICAweDkzMmMxNTlkIC8qLTUqLywKKyAgMHhhMTY4MjdjMiAvKi00Ki8sICAweGIyZGNkZTI3IC8qLTMqLywgIDB4YzZmMjBiOTEgLyotMiovLCAgMHhkY2Y4OWM2NCAvKi0xKi8sCisgIDB4ZjQzMDhjZTEgLyogMCovLCAgMHgwZDYxMzA1NCAvKiAxKi8sICAweDI3OGRkZTgwIC8qIDIqLywgIDB4NDAwMDAwMWIgLyogMyovLAorICAweDU1YTYxMjdiIC8qIDQqLywgIDB4Njc4ZGRlOGYgLyogNSovLCAgMHg3NGVmMGVkNyAvKiA2Ki8sICAweDdkMzNmMGRhIC8qIDcqLworfTsKK2NvbnN0IEZJWFBfREJMIEZES2FhY0VuY19tVGFiXzRfM0VsY1s1MTJdPXsKKyAgRkwyRlhDT05TVF9EQkwoMC4zOTY4NTAyNjI5OTIwNDk5KSxGTDJGWENPTlNUX0RCTCgwLjM5Nzg4NDA2MzQ4NjgzMzUpLEZMMkZYQ09OU1RfREJMKDAuMzk4OTE4NTM1OTM1NDcxMSksRkwyRlhDT05TVF9EQkwoMC4zOTk5NTM2Nzk0NjYxNDMyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MDA5ODk0OTMyMDk4NTMxKSxGTDJGWENPTlNUX0RCTCgwLjQwMjAyNTk3NjMwMDQxMTUpLEZMMkZYQ09OU1RfREJMKDAuNDAzMDYzMTI3ODc0NDIyNyksRkwyRlhDT05TVF9EQkwoMC40MDQxMDA5NDcwNzEyNjk1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MDUxMzk0MzMwMzMwOTk2KSxGTDJGWENPTlNUX0RCTCgwLjQwNjE3ODU4NDkwNDgxMTApLEZMMkZYQ09OU1RfREJMKDAuNDA3MjE4NDAxODM0MDM4MCksRkwyRlhDT05TVF9EQkwoMC40MDgyNTg4ODI5NzExMzcyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MDkzMDAwMjc0NjkxNzM5KSxGTDJGWENPTlNUX0RCTCgwLjQxMDM0MTgzNDQ4MzkwNzgpLEZMMkZYQ09OU1RfREJMKDAuNDExMzg0MzAzMTczNzc5OCksRkwyRlhDT05TVF9EQkwoMC40MTI0Mjc0MzI2OTk4OTgwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MTM0NzEyMjIyMjYwMjQ1KSxGTDJGWENPTlNUX0RCTCgwLjQxNDUxNTY3MDkxODU2MjApLEZMMkZYQ09OU1RfREJMKDAuNDE1NTYwNzc3OTQ2NTQwMCksRkwyRlhDT05TVF9EQkwoMC40MTY2MDY1NDI0ODE2MDIyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MTc2NTI5NjM2OTc5OTMyKSxGTDJGWENPTlNUX0RCTCgwLjQxODcwMDA0MDc3MjU0NTIpLEZMMkZYQ09OU1RfREJMKDAuNDE5NzQ3NzcyODg0NjY1MiksRkwyRlhDT05TVF9EQkwoMC40MjA3OTYxNTkyMTYzMjIyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MjE4NDUxOTg5NTIwMzQ1KSxGTDJGWENPTlNUX0RCTCgwLjQyMjg5NDg5MTI3ODg1NjcpLEZMMkZYQ09OU1RfREJMKDAuNDIzOTQ1MjM1Mzg2MzY3MyksRkwyRlhDT05TVF9EQkwoMC40MjQ5OTYyMzA0NjY2NTY0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MjYwNDc4NzU3MTQzMTMwKSxGTDJGWENPTlNUX0RCTCgwLjQyNzEwMDE3MDMyNjQxMjQpLEZMMkZYQ09OU1RfREJMKDAuNDI4MTUzMTEzNTAyNTA0NiksRkwyRlhDT05TVF9EQkwoMC40MjkyMDY3MDQ0NDQ2MDE3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MzAyNjA5NDIzNTcxNjU4KSxGTDJGWENPTlNUX0RCTCgwLjQzMTMxNTgyNjQ0NzA5NzApLEZMMkZYQ09OU1RfREJMKDAuNDMyMzcxMzU1OTIzNzIxNiksRkwyRlhDT05TVF9EQkwoMC40MzM0Mjc1Mjk5OTg3ODAzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40MzQ0ODQzNDc4ODY0MTYxKSxGTDJGWENPTlNUX0RCTCgwLjQzNTU0MTgwODgwMzE2MzApLEZMMkZYQ09OU1RfREJMKDAuNDM2NTk5OTExOTY3OTMzOSksRkwyRlhDT05TVF9EQkwoMC40Mzc2NTg2NTY2MDIwMDk2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40Mzg3MTgwNDE5MjkwMjcyKSxGTDJGWENPTlNUX0RCTCgwLjQzOTc3ODA2NzE3NDk2ODMpLEZMMkZYQ09OU1RfREJMKDAuNDQwODM4NzMxNTY4MTQ4MCksRkwyRlhDT05TVF9EQkwoMC40NDE5MDAwMzQzMzkyMDM5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NDI5NjE5NzQ3MjEwODQ3KSxGTDJGWENPTlNUX0RCTCgwLjQ0NDAyNDU1MTk0OTAzODgpLEZMMkZYQ09OU1RfREJMKDAuNDQ1MDg3NzY1MjYwNjAzOCksRkwyRlhDT05TVF9EQkwoMC40NDYxNTE2MTM4OTU1OTUzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NDcyMTYwOTcwOTYwOTYzKSxGTDJGWENPTlNUX0RCTCgwLjQ0ODI4MTIxNDEwNjQ0NTgpLEZMMkZYQ09OU1RfREJMKDAuNDQ5MzQ2OTY0MTczMjI4NiksRkwyRlhDT05TVF9EQkwoMC40NTA0MTMzNDY1NDUyNjQ4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NTE0ODAzNjA0NzM1OTg0KSxGTDJGWENPTlNUX0RCTCgwLjQ1MjU0ODAwNTIxMTQ4NzUpLEZMMkZYQ09OU1RfREJMKDAuNDUzNjE2MjgwMDE0MzkzOSksRkwyRlhDT05TVF9EQkwoMC40NTQ2ODUxODQxMzk5NzE5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NTU3NTQ3MTY4NDgwNTkxKSxGTDJGWENPTlNUX0RCTCgwLjQ1NjgyNDg3NzQwMDY2NTIpLEZMMkZYQ09OU1RfREJMKDAuNDU3ODk1NjY1MDYxOTYyMyksRkwyRlhDT05TVF9EQkwoMC40NTg5NjcwNzkwOTgyNzQ2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NjAwMzkxMTg3NzgwNjg4KSxGTDJGWENPTlNUX0RCTCgwLjQ2MTExMTc4MzM3MTk0MzApLEZMMkZYQ09OU1RfREJMKDAuNDYyMTg1MDcyMTUyNjE4NCksRkwyRlhDT05TVF9EQkwoMC40NjMyNTg5ODQzOTQ5Mjc4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NjQzMzM1MTkzNzU4MDY5KSxGTDJGWENPTlNUX0RCTCgwLjQ2NTQwODY3NjM3NDI4NDIpLEZMMkZYQ09OU1RfREJMKDAuNDY2NDg0NDU0NjcxNDcxMyksRkwyRlhDT05TVF9EQkwoMC40Njc1NjA4NTM1NTA1NTMyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40Njg2Mzc4NzIyOTY3NzkwKSxGTDJGWENPTlNUX0RCTCgwLjQ2OTcxNTUxMDE5NzQ1MjIpLEZMMkZYQ09OU1RfREJMKDAuNDcwNzkzNzY2NTQxOTIxNiksRkwyRlhDT05TVF9EQkwoMC40NzE4NzI2NDA2MjE1NzEzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NzI5NTIxMzE3Mjk4MTE4KSxGTDJGWENPTlNUX0RCTCgwLjQ3NDAzMjIzOTE2MjA3MTEpLEZMMkZYQ09OU1RfREJMKDAuNDc1MTEyOTYyMjE1Nzg0NSksRkwyRlhDT05TVF9EQkwoMC40NzYxOTQzMDAxOTAzODY3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40NzcyNzYyNTIzODczMDE1KSxGTDJGWENPTlNUX0RCTCgwLjQ3ODM1ODgxODEwOTkzMzgpLEZMMkZYQ09OU1RfREJMKDAuNDc5NDQxOTk2NjYzNjU5OSksRkwyRlhDT05TVF9EQkwoMC40ODA1MjU3ODczNTU4MTkwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC40ODE2MTAxODk0OTU3MDQyKSxGTDJGWENPTlNUX0RCTCgwLjQ4MjY5NTIwMjM5NDU1MzcpLEZMMkZYQ09OU1RfREJMKDAuNDgzNzgwODI1MzY1NTQyMSksRkwyRlhDT05TVF9EQkwoMC40ODQ4NjcwNTc3MjM3NzE0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40ODU5NTM4OTg3ODYyNjMyKSxGTDJGWENPTlNUX0RCTCgwLjQ4NzA0MTM0Nzg3MTk0ODgpLEZMMkZYQ09OU1RfREJMKDAuNDg4MTI5NDA0MzAxNjYyMSksRkwyRlhDT05TVF9EQkwoMC40ODkyMTgwNjczOTgxMjk4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40OTAzMDczMzY0ODU5NjQwKSxGTDJGWENPTlNUX0RCTCgwLjQ5MTM5NzIxMDg5MTY1MzMpLEZMMkZYQ09OU1RfREJMKDAuNDkyNDg3Njg5OTQzNTU0NSksRkwyRlhDT05TVF9EQkwoMC40OTM1Nzg3NzI5NzE4ODQ0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40OTQ2NzA0NTkzMDg3MTE2KSxGTDJGWENPTlNUX0RCTCgwLjQ5NTc2Mjc0ODI4Nzk0ODQpLEZMMkZYQ09OU1RfREJMKDAuNDk2ODU1NjM5MjQ1MzQyMyksRkwyRlhDT05TVF9EQkwoMC40OTc5NDkxMzE1MTg0Njg0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC40OTkwNDMyMjQ0NDY3MjExKSxGTDJGWENPTlNUX0RCTCgwLjUwMDEzNzkxNzM3MTMwNjIpLEZMMkZYQ09OU1RfREJMKDAuNTAxMjMzMjA5NjM1MjMyOCksRkwyRlhDT05TVF9EQkwoMC41MDIzMjkxMDA1ODMzMDU2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MDM0MjU1ODk1NjIxMTcxKSxGTDJGWENPTlNUX0RCTCgwLjUwNDUyMjY3NTkyMDAzOTkpLEZMMkZYQ09OU1RfREJMKDAuNTA1NjIwMzU5MDA3MjE4MSksRkwyRlhDT05TVF9EQkwoMC41MDY3MTg2MzgxNzU1NjExKSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MDc4MTc1MTI3Nzg3MzQ2KSxGTDJGWENPTlNUX0RCTCgwLjUwODkxNjk4MjE3MjE1MzYpLEZMMkZYQ09OU1RfREJMKDAuNTEwMDE3MDQ1NzEyOTc0OSksRkwyRlhDT05TVF9EQkwoMC41MTExMTc3MDI3NjAwODkzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MTIyMTg5NTI2NzQxMTQzKSxGTDJGWENPTlNUX0RCTCgwLjUxMzMyMDc5NDgxNzM4NjgpLEZMMkZYQ09OU1RfREJMKDAuNTE0NDIzMjI4NTUzOTU1MiksRkwyRlhDT05TVF9EQkwoMC41MTU1MjYyNTMyNDk1NzI2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MTY2Mjk4NjgyNzE2ODk0KSxGTDJGWENPTlNUX0RCTCgwLjUxNzczNDA3Mjk4OTQ0NjApLEZMMkZYQ09OU1RfREJMKDAuNTE4ODM4ODY2NzczNjY1MiksRkwyRlhDT05TVF9EQkwoMC41MTk5NDQyNDg5OTY4NDU3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MjEwNTAyMTkwMzMxNTQ0KSxGTDJGWENPTlNUX0RCTCgwLjUyMjE1Njc3NjI1ODQxOTgpLEZMMkZYQ09OU1RfREJMKDAuNTIzMjYzOTIwMDUwMTI0NyksRkwyRlhDT05TVF9EQkwoMC41MjQzNzE2NDk3ODczOTg5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MjU0Nzk5NjQ4NTEwMTMwKSxGTDJGWENPTlNUX0RCTCgwLjUyNjU4ODg2NDYyMzM3MDUpLEZMMkZYQ09OU1RfREJMKDAuNTI3Njk4MzQ4NDg4NTAyMSksRkwyRlhDT05TVF9EQkwoMC41Mjg4MDg0MTU4MzIwNTc0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41Mjk5MTkwNjYwNDEyOTk1KSxGTDJGWENPTlNUX0RCTCgwLjUzMTAzMDI5ODUwNTA5NzUpLEZMMkZYQ09OU1RfREJMKDAuNTMyMTQyMTEyNjEzOTE5OCksRkwyRlhDT05TVF9EQkwoMC41MzMyNTQ1MDc3NTk4Mjc0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41MzQzNjc0ODMzMzY0Njc4KSxGTDJGWENPTlNUX0RCTCgwLjUzNTQ4MTAzODczOTA2NzUpLEZMMkZYQ09OU1RfREJMKDAuNTM2NTk1MTczMzY0NDI2MiksRkwyRlhDT05TVF9EQkwoMC41Mzc3MDk4ODY2MTA5MDk3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41Mzg4MjUxNzc4Nzg0NDM4KSxGTDJGWENPTlNUX0RCTCgwLjUzOTk0MTA0NjU2ODUwNzUpLEZMMkZYQ09OU1RfREJMKDAuNTQxMDU3NDkyMDg0MTI3MiksRkwyRlhDT05TVF9EQkwoMC41NDIxNzQ1MTM4Mjk4Njk1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NDMyOTIxMTEyMTE4MzUzKSxGTDJGWENPTlNUX0RCTCgwLjU0NDQxMDI4MzYzNzY1MzQpLEZMMkZYQ09OU1RfREJMKDAuNTQ1NTI5MDMwNTE2NDc0NCksRkwyRlhDT05TVF9EQkwoMC41NDY2NDgzNTEyNTg5NjQyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NDc3NjgyNDUyNzcyOTc2KSxGTDJGWENPTlNUX0RCTCgwLjU0ODg4ODcxMTk4NTE1MjkpLEZMMkZYQ09OU1RfREJMKDAuNTUwMDA5NzUwNzk3NzA1MCksRkwyRlhDT05TVF9EQkwoMC41NTExMzEzNjExMzE2MTk0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NTIyNTM1NDI0MDUwNDY3KSxGTDJGWENPTlNUX0RCTCgwLjU1MzM3NjI5NDAzNzYxNTgpLEZMMkZYQ09OU1RfREJMKDAuNTU0NDk5NjE1NDUwNDI4NCksRkwyRlhDT05TVF9EQkwoMC41NTU2MjM1MDYwNjYwNTI4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NTY3NDc5NjUzMDg1MTgzKSxGTDJGWENPTlNUX0RCTCgwLjU1Nzg3Mjk5MjYwMzMwODcpLEZMMkZYQ09OU1RfREJMKDAuNTU4OTk4NTg3Mzc3MzU2OSksRkwyRlhDT05TVF9EQkwoMC41NjAxMjQ3NDkwNTkwMzg5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NjEyNTE0NzcwNzgxNjgzKSxGTDJGWENPTlNUX0RCTCgwLjU2MjM3ODc3MDg2NTk4OTgpLEZMMkZYQ09OU1RfREJMKDAuNTYzNTA2NjI5ODU1MTc0MiksRkwyRlhDT05TVF9EQkwoMC41NjQ2MzUwNTM0Nzk4MTI1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NjU3NjQwNDExNzU0MDk3KSxGTDJGWENPTlNUX0RCTCgwLjU2Njg5MzU5MjM3ODg3OTkpLEZMMkZYQ09OU1RfREJMKDAuNTY4MDIzNzA2NTI4NTQwNCksRkwyRlhDT05TVF9EQkwoMC41NjkxNTQzODMwNjQxMDU5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NzAyODU2MjE0MjY2ODMyKSxGTDJGWENPTlNUX0RCTCgwLjU3MTQxNzQyMTA1ODc2NTUpLEZMMkZYQ09OU1RfREJMKDAuNTcyNTQ5NzgxNDA0MjI3MSksRkwyRlhDT05TVF9EQkwoMC41NzM2ODI3MDE5MDgzMTc3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NzQ4MTYxODIwMTc2NTczKSxGTDJGWENPTlNUX0RCTCgwLjU3NTk1MDIyMTE4MDIzMDQpLEZMMkZYQ09OU1RfREJMKDAuNTc3MDg0ODE4ODQ1MzgxMCksRkwyRlhDT05TVF9EQkwoMC41NzgyMTk5NzQ0NjM4MDY3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41NzkzNTU2ODc0ODc1NTQyKSxGTDJGWENPTlNUX0RCTCgwLjU4MDQ5MTk1NzM3MDAxMzEpLEZMMkZYQ09OU1RfREJMKDAuNTgxNjI4NzgzNTY1OTExNiksRkwyRlhDT05TVF9EQkwoMC41ODI3NjYxNjU1MzEzMTA0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41ODM5MDQxMDI3MjM1OTc5KSxGTDJGWENPTlNUX0RCTCgwLjU4NTA0MjU5NDYwMTQ4NTApLEZMMkZYQ09OU1RfREJMKDAuNTg2MTgxNjQwNjI1MDAwMCksRkwyRlhDT05TVF9EQkwoMC41ODczMjEyNDAyNTU0ODM0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41ODg0NjEzOTI5NTU1ODI2KSxGTDJGWENPTlNUX0RCTCgwLjU4OTYwMjA5ODE4OTI0NzQpLEZMMkZYQ09OU1RfREJMKDAuNTkwNzQzMzU1NDIxNzI0MiksRkwyRlhDT05TVF9EQkwoMC41OTE4ODUxNjQxMTk1NTE3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41OTMwMjc1MjM3NTA1NTU2KSxGTDJGWENPTlNUX0RCTCgwLjU5NDE3MDQzMzc4Mzg0MzQpLEZMMkZYQ09OU1RfREJMKDAuNTk1MzEzODkzNjg5Nzk5OSksRkwyRlhDT05TVF9EQkwoMC41OTY0NTc5MDI5NDAwODE5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC41OTc2MDI0NjEwMDc2MTM5KSxGTDJGWENPTlNUX0RCTCgwLjU5ODc0NzU2NzM2NjU4MjUpLEZMMkZYQ09OU1RfREJMKDAuNTk5ODkzMjIxNDkyNDMyMSksRkwyRlhDT05TVF9EQkwoMC42MDEwMzk0MjI4NjE4NTk3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MDIxODYxNzA5NTI4MTA2KSxGTDJGWENPTlNUX0RCTCgwLjYwMzMzMzQ2NTI0NDQ3MzMpLEZMMkZYQ09OU1RfREJMKDAuNjA0NDgxMzA1MjE3Mjc0OCksRkwyRlhDT05TVF9EQkwoMC42MDU2Mjk2OTAzNTI4NzYxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MDY3Nzg2MjAxMzQxNjcxKSxGTDJGWENPTlNUX0RCTCgwLjYwNzkyODA5NDA0NTI2MjUpLEZMMkZYQ09OU1RfREJMKDAuNjA5MDc4MTExNTcxNDk2NiksRkwyRlhDT05TVF9EQkwoMC42MTAyMjg2NzIxOTk0MTkyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MTEzNzk3NzU0MTY3OTA4KSxGTDJGWENPTlNUX0RCTCgwLjYxMjUzMTQyMDcxMjU3NzcpLEZMMkZYQ09OU1RfREJMKDAuNjEzNjgzNjA3NTc2OTQ4MiksRkwyRlhDT05TVF9EQkwoMC42MTQ4MzYzMzU1MDEyNjc0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MTU5ODk2MDM5NzgwOTI5KSxGTDJGWENPTlNUX0RCTCgwLjYxNzE0MzQxMjUwMTE3MDgpLEZMMkZYQ09OU1RfREJMKDAuNjE4Mjk3NzYwNTY1NDMwNSksRkwyRlhDT05TVF9EQkwoMC42MTk0NTI2NDc2NjY5ODA4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MjA2MDgwNzMzMDMxMDU0KSxGTDJGWENPTlNUX0RCTCgwLjYyMTc2NDAzNjk3MjI1ODQpLEZMMkZYQ09OU1RfREJMKDAuNjIyOTIwNTM4MTc0MDU5OCksRkwyRlhDT05TVF9EQkwoMC42MjQwNzc1NzY0MDkyOTE5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MjUyMzUxNTExNzk4OTM5KSxGTDJGWENPTlNUX0RCTCgwLjYyNjM5MzI2MTk4ODk1ODYpLEZMMkZYQ09OU1RfREJMKDAuNjI3NTUxOTA4MzQwNzI3NSksRkwyRlhDT05TVF9EQkwoMC42Mjg3MTEwODk3NDA1ODY5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42Mjk4NzA4MDU2OTUwNjM1KSxGTDJGWENPTlNUX0RCTCgwLjYzMTAzMTA1NTcxMTgyMDMpLEZMMkZYQ09OU1RfREJMKDAuNjMyMTkxODM5Mjk5NjUyMyksRkwyRlhDT05TVF9EQkwoMC42MzMzNTMxNTU5Njg0ODIzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MzQ1MTUwMDUyMjkzNTcxKSxGTDJGWENPTlNUX0RCTCgwLjYzNTY3NzM4NjU5NDQ0MzIpLEZMMkZYQ09OU1RfREJMKDAuNjM2ODQwMjk5NTc3MDIyNCksRkwyRlhDT05TVF9EQkwoMC42MzgwMDM3NDM2OTE0ODgxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42MzkxNjc3MTg0NTMzNDExKSxGTDJGWENPTlNUX0RCTCgwLjY0MDMzMjIyMzM3OTE4NTYpLEZMMkZYQ09OU1RfREJMKDAuNjQxNDk3MjU3OTg2NzI1NCksRkwyRlhDT05TVF9EQkwoMC42NDI2NjI4MjE3OTQ3NTk0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NDM4Mjg5MTQzMjMxNzc5KSxGTDJGWENPTlNUX0RCTCgwLjY0NDk5NTUzNTA5Mjk1ODgpLEZMMkZYQ09OU1RfREJMKDAuNjQ2MTYyNjgzNjI2MTYzNiksRkwyRlhDT05TVF9EQkwoMC42NDczMzAzNTk0NDU5MzMwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NDg0OTg1NjIwNzY0ODM5KSxGTDJGWENPTlNUX0RCTCgwLjY0OTY2NzI5MTA0MzEwNDcpLEZMMkZYQ09OU1RfREJMKDAuNjUwODM2NTQ1ODcyMTUxOCksRkwyRlhDT05TVF9EQkwoMC42NTIwMDYzMjYwOTEwNDU5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NTMxNzY2MzEyMjgyNjc5KSxGTDJGWENPTlNUX0RCTCgwLjY1NDM0NzQ2MDgxMzM1NTIpLEZMMkZYQ09OU1RfREJMKDAuNjU1NTE4ODE0Mzc2ODk3OSksRkwyRlhDT05TVF9EQkwoMC42NTY2OTA2OTE0NTA1MzQ5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NTc4NjMwOTE1NjY5NTA5KSxGTDJGWENPTlNUX0RCTCgwLjY1OTAzNjAxNDI1OTg3MTUpLEZMMkZYQ09OU1RfREJMKDAuNjYwMjA5NDU5MDY0MDYwMyksRkwyRlhDT05TVF9EQkwoMC42NjEzODM0MjU1MTUzMTQ5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NjI1NTc5MTMxNTA0NjM1KSxGTDJGWENPTlNUX0RCTCgwLjY2MzczMjkyMTUwNzM2MTApLEZMMkZYQ09OU1RfREJMKDAuNjY0OTA4NDUwMTI0ODg1MSksRkwyRlhDT05TVF9EQkwoMC42NjYwODQ0OTg1NDI5MzM1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NjcyNjEwNjYzMDI0MTk3KSxGTDJGWENPTlNUX0RCTCgwLjY2ODQzODE1Mjk0NTI2OTEpLEZMMkZYQ09OU1RfREJMKDAuNjY5NjE1NzU4MDE0NDE2MyksRkwyRlhDT05TVF9EQkwoMC42NzA3OTM4ODEwNTM4MDExKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NzE5NzI1MjE2MDgzNjQ2KSxGTDJGWENPTlNUX0RCTCgwLjY3MzE1MTY3OTIyNDA0NjUpLEZMMkZYQ09OU1RfREJMKDAuNjc0MzMxMzUzNDQ3NzgwNyksRkwyRlhDT05TVF9EQkwoMC42NzU1MTE1NDM4Mjc0OTI3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42NzY2OTIyNDk5MTIwOTU1KSxGTDJGWENPTlNUX0RCTCgwLjY3Nzg3MzQ3MTI1MTQ4NjUpLEZMMkZYQ09OU1RfREJMKDAuNjc5MDU1MjA3Mzk2NTQzNSksRkwyRlhDT05TVF9EQkwoMC42ODAyMzc0NTc4OTkxMjIzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42ODE0MjAyMjIzMTIwNTI0KSxGTDJGWENPTlNUX0RCTCgwLjY4MjYwMzUwMDE4OTEzNDApLEZMMkZYQ09OU1RfREJMKDAuNjgzNzg3MjkxMDg1MTM0NSksRkwyRlhDT05TVF9EQkwoMC42ODQ5NzE1OTQ1NTU3ODUzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42ODYxNTY0MTAxNTc3Nzg0KSxGTDJGWENPTlNUX0RCTCgwLjY4NzM0MTczNzQ0ODc2MjkpLEZMMkZYQ09OU1RfREJMKDAuNjg4NTI3NTc1OTg3MzQyMCksRkwyRlhDT05TVF9EQkwoMC42ODk3MTM5MjUzMzMwNjk3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC42OTA5MDA3ODUwNDY0NDczKSxGTDJGWENPTlNUX0RCTCgwLjY5MjA4ODE1NDY4ODkxOTgpLEZMMkZYQ09OU1RfREJMKDAuNjkzMjc2MDMzODIyODczNyksRkwyRlhDT05TVF9EQkwoMC42OTQ0NjQ0MjIwMTE2MzMyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC42OTU2NTMzMTg4MTk0NTY1KSxGTDJGWENPTlNUX0RCTCgwLjY5Njg0MjcyMzgxMTUzMzIpLEZMMkZYQ09OU1RfREJMKDAuNjk4MDMyNjM2NTUzOTgxMyksRkwyRlhDT05TVF9EQkwoMC42OTkyMjMwNTY2MTM4NDM1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MDA0MTM5ODM1NTkwODQ1KSxGTDJGWENPTlNUX0RCTCgwLjcwMTYwNTQxNjk1ODU4NjkpLEZMMkZYQ09OU1RfREJMKDAuNzAyNzk3MzU2MzgyMTQ5OSksRkwyRlhDT05TVF9EQkwoMC43MDM5ODk4MDE0MDA0ODQzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MDUxODI3NTE1ODUyMTA2KSxGTDJGWENPTlNUX0RCTCgwLjcwNjM3NjIwNjUwODg1NTQpLEZMMkZYQ09OU1RfREJMKDAuNzA3NTcwMTY1NzQ0ODQ4MyksRkwyRlhDT05TVF9EQkwoMC43MDg3NjQ2Mjg4Njc1MTk2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MDk5NTk1OTU0NTIwOTYwKSxGTDJGWENPTlNUX0RCTCgwLjcxMTE1NTA2NTA3NDY5ODgpLEZMMkZYQ09OU1RfREJMKDAuNzEyMzUxMDM3MzEyMzQwMiksRkwyRlhDT05TVF9EQkwoMC43MTM1NDc1MTE3NDI5MjAyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MTQ3NDQ0ODc5NDUyMjQ0KSxGTDJGWENPTlNUX0RCTCgwLjcxNTk0MTk2NTQ5ODkyMDApLEZMMkZYQ09OU1RfREJMKDAuNzE3MTM5OTQzOTg0NTUzOCksRkwyRlhDT05TVF9EQkwoMC43MTgzMzg0MjI5ODM1NDg2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MTk1Mzc0MDIwNzgyMDA1KSxGTDJGWENPTlNUX0RCTCgwLjcyMDczNjg4MDg1MTY3NjIpLEZMMkZYQ09OU1RfREJMKDAuNzIxOTM2ODU4ODg4MDA5NyksRkwyRlhDT05TVF9EQkwoMC43MjMxMzczMzU3NzIwOTk3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MjQzMzgzMTEwODk3MDY2KSxGTDJGWENPTlNUX0RCTCgwLjcyNTUzOTc4NDQyNzQ0OTYpLEZMMkZYQ09OU1RfREJMKDAuNzI2NzQxNzU1MzcyODA0MyksRkwyRlhDT05TVF9EQkwoMC43Mjc5NDQyMjM1MTQwOTkyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MjkxNDcxODg0NDA1MTMwKSxGTDJGWENPTlNUX0RCTCgwLjczMDM1MDY0OTc0MjA3MjQpLEZMMkZYQ09OU1RfREJMKDAuNzMxNTU0NjA3MDA5NjQ4NyksRkwyRlhDT05TVF9EQkwoMC43MzI3NTkwNTk4MzQ5NTUzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43MzM5NjQwMDc4MTA1NDQ1KSxGTDJGWENPTlNUX0RCTCgwLjczNTE2OTQ1MDUyOTgwNTUpLEZMMkZYQ09OU1RfREJMKDAuNzM2Mzc1Mzg3NTg2OTYxMCksRkwyRlhDT05TVF9EQkwoMC43Mzc1ODE4MTg1NzcwNjQ3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43Mzg3ODg3NDMwOTU5OTg3KSxGTDJGWENPTlNUX0RCTCgwLjczOTk5NjE2MDc0MDQ3MDYpLEZMMkZYQ09OU1RfREJMKDAuNzQxMjA0MDcxMTA4MDEwOCksRkwyRlhDT05TVF9EQkwoMC43NDI0MTI0NzM3OTY5NzAxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NDM2MjEzNjg0MDY1MTY2KSxGTDJGWENPTlNUX0RCTCgwLjc0NDgzMDc1NDUzNjYzMzQpLEZMMkZYQ09OU1RfREJMKDAuNzQ2MDQwNjMxNzg4MTE1OCksRkwyRlhDT05TVF9EQkwoMC43NDcyNTA5OTk3NjI1Njg2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NDg0NjE4NTgwNjI0MDM2KSxGTDJGWENPTlNUX0RCTCgwLjc0OTY3MzIwNjI5MDgzNzIpLEZMMkZYQ09OU1RfREJMKDAuNzUwODg1MDQ0MDUxODg3MiksRkwyRlhDT05TVF9EQkwoMC43NTIwOTczNzA5NTAzNzA0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NTMzMTAxODY1OTE5MDA5KSxGTDJGWENPTlNUX0RCTCgwLjc1NDUyMzQ5MDU4Mjg4NjIpLEZMMkZYQ09OU1RfREJMKDAuNzU1NzM3MjgyNTMwNTI1MiksRkwyRlhDT05TVF9EQkwoMC43NTY5NTE1NjIwNDI4MDYyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NTgxNjYzMjg3Mjg1MDM1KSxGTDJGWENPTlNUX0RCTCgwLjc1OTM4MTU4MjE5NzE3NTYpLEZMMkZYQ09OU1RfREJMKDAuNzYwNTk3MzIyMDU5MTYxOSksRkwyRlhDT05TVF9EQkwoMC43NjE4MTM1NDc5MjU1ODEwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NjMwMzAyNTk0MDgzMjc3KSxGTDJGWENPTlNUX0RCTCgwLjc2NDI0NzQ1NjEyMDA3MDgpLEZMMkZYQ09OU1RfREJMKDAuNzY1NDY1MTM3Njc0MjUwNSksRkwyRlhDT05TVF9EQkwoMC43NjY2ODMzMDM2ODUwNzYwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43Njc5MDE5NTM3Njc1MjI3KSxGTDJGWENPTlNUX0RCTCgwLjc2OTEyMTA4NzUzNzMzMDcpLEZMMkZYQ09OU1RfREJMKDAuNzcwMzQwNzA0NjExMDAxMSksRkwyRlhDT05TVF9EQkwoMC43NzE1NjA4MDQ2MDU3OTQ4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43NzI3ODEzODcxMzk3MjkzKSxGTDJGWENPTlNUX0RCTCgwLjc3NDAwMjQ1MTgzMTU3NjUpLEZMMkZYQ09OU1RfREJMKDAuNzc1MjIzOTk4MzAwODYwNSksRkwyRlhDT05TVF9EQkwoMC43NzY0NDYwMjYxNjc4NTUxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43Nzc2Njg1MzUwNTM1ODE0KSxGTDJGWENPTlNUX0RCTCgwLjc3ODg5MTUyNDU3OTgwNTQpLEZMMkZYQ09OU1RfREJMKDAuNzgwMTE0OTk0MzY5MDM2MCksRkwyRlhDT05TVF9EQkwoMC43ODEzMzg5NDQwNDQ1MjIzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43ODI1NjMzNzMyMzAyNTEzKSxGTDJGWENPTlNUX0RCTCgwLjc4Mzc4ODI4MTU1MDk0NTgpLEZMMkZYQ09OU1RfREJMKDAuNzg1MDEzNjY4NjMyMDYyMSksRkwyRlhDT05TVF9EQkwoMC43ODYyMzk1MzQwOTk3ODc0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43ODc0NjU4Nzc1ODEwMzc4KSxGTDJGWENPTlNUX0RCTCgwLjc4ODY5MjY5ODcwMzQ1NTkpLEZMMkZYQ09OU1RfREJMKDAuNzg5OTE5OTk3MDk1NDA4OCksRkwyRlhDT05TVF9EQkwoMC43OTExNDc3NzIzODU5ODUzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC43OTIzNzYwMjQyMDQ5OTQ0KSxGTDJGWENPTlNUX0RCTCgwLjc5MzYwNDc1MjE4Mjk2MjMpLEZMMkZYQ09OU1RfREJMKDAuNzk0ODMzOTU1OTUxMTMwOCksRkwyRlhDT05TVF9EQkwoMC43OTYwNjM2MzUxNDE0NTQ2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC43OTcyOTM3ODkzODY1OTk1KSxGTDJGWENPTlNUX0RCTCgwLjc5ODUyNDQxODMxOTkzOTkpLEZMMkZYQ09OU1RfREJMKDAuNzk5NzU1NTIxNTc1NTU3MCksRkwyRlhDT05TVF9EQkwoMC44MDA5ODcwOTg3ODgyMzU5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MDIyMTkxNDk1OTM0NjQ0KSxGTDJGWENPTlNUX0RCTCgwLjgwMzQ1MTY3MzYyNzQzMDEpLEZMMkZYQ09OU1RfREJMKDAuODA0Njg0NjcwNTI3MDE4NSksRkwyRlhDT05TVF9EQkwoMC44MDU5MTgxMzk5Mjk4MTEwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MDcxNTIwODE0NzQwODIyKSxGTDJGWENPTlNUX0RCTCgwLjgwODM4NjQ5NDc5ODc5ODkpLEZMMkZYQ09OU1RfREJMKDAuODA5NjIxMzc5NTQzNjE2NiksRkwyRlhDT05TVF9EQkwoMC44MTA4NTY3MzUzNDg4Nzg0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MTIwOTI1NjE4NTU2MTI3KSxGTDJGWENPTlNUX0RCTCgwLjgxMzMyODg1ODcwNTUzMDgpLEZMMkZYQ09OU1RfREJMKDAuODE0NTY1NjI1NTQxMDI1MyksRkwyRlhDT05TVF9EQkwoMC44MTU4MDI4NjIwMDUxNjc0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MTcwNDA1Njc3NDE3MDUzKSxGTDJGWENPTlNUX0RCTCgwLjgxODI3ODc0MjM5NTA2MjIpLEZMMkZYQ09OU1RfREJMKDAuODE5NTE3Mzg1NjEwMzM0MSksRkwyRlhDT05TVF9EQkwoMC44MjA3NTY0OTcwMzMyODc1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MjE5OTYwNzYzMTAzNTgwKSxGTDJGWENPTlNUX0RCTCgwLjgyMzIzNjEyMzA4ODY0NzcpLEZMMkZYQ09OU1RfREJMKDAuODI0NDc2NjM3MDE1OTIzNCksRkwyRlhDT05TVF9EQkwoMC44MjU3MTc2MTc3NDA2MTUwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MjY5NTkwNjQ5MTE4MTI1KSxGTDJGWENPTlNUX0RCTCgwLjgyODIwMDk3ODE3OTI2NTApLEZMMkZYQ09OU1RfREJMKDAuODI5NDQzMzU3MTkzMzc4NCksRkwyRlhDT05TVF9EQkwoMC44MzA2ODYyMDE2MDUyMTMyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MzE5Mjk1MTEwNjY0ODMxKSxGTDJGWENPTlNUX0RCTCgwLjgzMzE3MzI4NTIyOTU1MjApLEZMMkZYQ09OU1RfREJMKDAuODM0NDE3NTIzNzQ3NDMzNiksRkwyRlhDT05TVF9EQkwoMC44MzU2NjIyMjYyNzM3ODc4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44MzY5MDczOTI0NjI5MjAyKSxGTDJGWENPTlNUX0RCTCgwLjgzODE1MzAyMTk2OTc3OTMpLEZMMkZYQ09OU1RfREJMKDAuODM5Mzk5MTE0NDQ5OTU0NSksRkwyRlhDT05TVF9EQkwoMC44NDA2NDU2Njk1NTk2NzUyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NDE4OTI2ODY5NTU4MDc5KSxGTDJGWENPTlNUX0RCTCgwLjg0MzE0MDE2NjI5NTg1NDQpLEZMMkZYQ09OU1RfREJMKDAuODQ0Mzg4MTA3MjM3OTUwNyksRkwyRlhDT05TVF9EQkwoMC44NDU2MzY1MDk0NDA4NjQyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NDY4ODUzNzI1NjM5OTIzKSxGTDJGWENPTlNUX0RCTCgwLjg0ODEzNDY5NjI2NzM2MDYpLEZMMkZYQ09OU1RfREJMKDAuODQ5Mzg0NDgwMjExNjIwOCksRkwyRlhDT05TVF9EQkwoMC44NTA2MzQ3MjQwNTgwNDkyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NTE4ODU0Mjc0Njg1NDQyKSxGTDJGWENPTlNUX0RCTCgwLjg1MzEzNjU5MDEwNTYyNTMpLEZMMkZYQ09OU1RfREJMKDAuODU0Mzg4MjExNjMyNDMwNyksRkwyRlhDT05TVF9EQkwoMC44NTU2NDAyOTE3MTI3MTU3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NTY4OTI4MzAwMTA4NTEyKSxGTDJGWENPTlNUX0RCTCgwLjg1ODE0NTgyNjE5MTgyMDkpLEZMMkZYQ09OU1RfREJMKDAuODU5Mzk5Mjc5OTIxMjIwNyksRkwyRlhDT05TVF9EQkwoMC44NjA2NTMxOTA4NjUyNTYzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NjE5MDc1NTg2OTA3NDE0KSxGTDJGWENPTlNUX0RCTCgwLjg2MzE2MjM4MzA2NTA5NjIpLEZMMkZYQ09OU1RfREJMKDAuODY0NDE3NjYzNjU2MzQ1MiksRkwyRlhDT05TVF9EQkwoMC44NjU2NzM0MDAxMzMxMTYxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NjY5Mjk1OTIxNjQ2Mzc1KSxGTDJGWENPTlNUX0RCTCgwLjg2ODE4NjIzOTQyMDczNzEpLEZMMkZYQ09OU1RfREJMKDAuODY5NDQzMzQxNTcxODQwNyksRkwyRlhDT05TVF9EQkwoMC44NzA3MDA4OTgyODg5Njk1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NzE5NTg5MDkyNDM3MzkxKSxGTDJGWENPTlNUX0RCTCgwLjg3MzIxNzM3NDEwODM1NzQpLEZMMkZYQ09OU1RfREJMKDAuODc0NDc2MjkyNTU1NjIzMiksRkwyRlhDT05TVF9EQkwoMC44NzU3MzU2NjQyNTg5MjQxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44NzY5OTU0ODg4OTIyMzUyKSxGTDJGWENPTlNUX0RCTCgwLjg3ODI1NTc2NjEzMDExNzEpLEZMMkZYQ09OU1RfREJMKDAuODc5NTE2NDk1NjQ3NzE0NiksRkwyRlhDT05TVF9EQkwoMC44ODA3Nzc2NzcxMjA3NTQ1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44ODIwMzkzMTAyMjU1NDQzKSxGTDJGWENPTlNUX0RCTCgwLjg4MzMwMTM5NDYzODk3MDQpLEZMMkZYQ09OU1RfREJMKDAuODg0NTYzOTMwMDM4NDk2OSksRkwyRlhDT05TVF9EQkwoMC44ODU4MjY5MTYxMDIxNjI5KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44ODcwOTAzNTI1MDg1ODE5KSxGTDJGWENPTlNUX0RCTCgwLjg4ODM1NDIzODkzNjkzOTkpLEZMMkZYQ09OU1RfREJMKDAuODg5NjE4NTc1MDY2OTkzMyksRkwyRlhDT05TVF9EQkwoMC44OTA4ODMzNjA1NzkwNjc4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC44OTIxNDg1OTUxNTQwNTY1KSxGTDJGWENPTlNUX0RCTCgwLjg5MzQxNDI3ODQ3MzQxODcpLEZMMkZYQ09OU1RfREJMKDAuODk0NjgwNDEwMjE5MTc3NiksRkwyRlhDT05TVF9EQkwoMC44OTU5NDY5OTAwNzM5MTkxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC44OTcyMTQwMTc3MjA3OTA2KSxGTDJGWENPTlNUX0RCTCgwLjg5ODQ4MTQ5Mjg0MzQ5ODUpLEZMMkZYQ09OU1RfREJMKDAuODk5NzQ5NDE1MTI2MzA3NyksRkwyRlhDT05TVF9EQkwoMC45MDEwMTc3ODQyNTQwMzkwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MDIyODY1OTk5MTIwNjgyKSxGTDJGWENPTlNUX0RCTCgwLjkwMzU1NTg2MTc4NjMyNDIpLEZMMkZYQ09OU1RfREJMKDAuOTA0ODI1NTY5NTYzMjg3OCksRkwyRlhDT05TVF9EQkwoMC45MDYwOTU3MjI5Mjk5ODk1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MDczNjYzMjE1NzQwMDkyKSxGTDJGWENPTlNUX0RCTCgwLjkwODYzNzM2NTE4MzQ3MjkpLEZMMkZYQ09OU1RfREJMKDAuOTA5OTA4ODUzNDQ3MDUyOCksRkwyRlhDT05TVF9EQkwoMC45MTExODA3ODYwNTM5NjQ3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MTI0NTMxNjI2OTM5NjcyKSxGTDJGWENPTlNUX0RCTCgwLjkxMzcyNTk4MzA1NzM1OTQpLEZMMkZYQ09OU1RfREJMKDAuOTE0OTk5MjQ2ODM0OTgwNSksRkwyRlhDT05TVF9EQkwoMC45MTYyNzI5NTM3MTgyMDcxKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MTc1NDcxMDMzOTg5NTI0KSxGTDJGWENPTlNUX0RCTCgwLjkxODgyMTY5NTU2OTY2NDgpLEZMMkZYQ09OU1RfREJMKDAuOTIwMDk2NzI5OTIzMzI1OCksRkwyRlhDT05TVF9EQkwoMC45MjEzNzIyMDYxNTM0NDk0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MjI2NDgxMjM5NTQwNzk1KSxGTDJGWENPTlNUX0RCTCgwLjkyMzkyNDQ4MzAxOTc4OTYpLEZMMkZYQ09OU1RfREJMKDAuOTI1MjAxMjgzMDQ1NjgwNSksRkwyRlhDT05TVF9EQkwoMC45MjY0Nzg1MjM3MjczNzkzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45Mjc3NTYyMDQ3NjEwMzc2KSxGTDJGWENPTlNUX0RCTCgwLjkyOTAzNDMyNTg0MzMzMDUpLEZMMkZYQ09OU1RfREJMKDAuOTMwMzEyODg2NjcxNDU0NyksRkwyRlhDT05TVF9EQkwoMC45MzE1OTE4ODY5NDMxMjc1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45MzI4NzEzMjYzNTY1ODQ4KSxGTDJGWENPTlNUX0RCTCgwLjkzNDE1MTIwNDYxMDU4MDIpLEZMMkZYQ09OU1RfREJMKDAuOTM1NDMxNTIxNDA0MzgzNiksRkwyRlhDT05TVF9EQkwoMC45MzY3MTIyNzY0Mzc3NzkyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45Mzc5OTM0Njk0MTEwNjQ4KSxGTDJGWENPTlNUX0RCTCgwLjkzOTI3NTEwMDAyNTA0OTcpLEZMMkZYQ09OU1RfREJMKDAuOTQwNTU3MTY3OTgxMDU0MiksRkwyRlhDT05TVF9EQkwoMC45NDE4Mzk2NzI5ODA5MDcyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NDMxMjI2MTQ3MjY5NDU2KSxGTDJGWENPTlNUX0RCTCgwLjk0NDQwNTk5MjkyMjAxMjQpLEZMMkZYQ09OU1RfREJMKDAuOTQ1Njg5ODA3MjY5NDU1OCksRkwyRlhDT05TVF9EQkwoMC45NDY5NzQwNTc0NzMxMjc1KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NDgyNTg3NDMyMzczODEwKSxGTDJGWENPTlNUX0RCTCgwLjk0OTU0Mzg2NDI2NzA3MTMpLEZMMkZYQ09OU1RfREJMKDAuOTUwODI5NDIwMjY3NTUyMiksRkwyRlhDT05TVF9EQkwoMC45NTIxMTU0MTA5NDQ2NzYzKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NTM0MDE4MzYwMDQ3OTI2KSxGTDJGWENPTlNUX0RCTCgwLjk1NDY4ODY5NTE1NDc0NTUpLEZMMkZYQ09OU1RfREJMKDAuOTU1OTc1OTg4MTAxODczOCksRkwyRlhDT05TVF9EQkwoMC45NTcyNjM3MTQ1NTQwMDg3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NTg1NTE4NzQyMTk0NzMyKSxGTDJGWENPTlNUX0RCTCgwLjk1OTg0MDQ2NjgwNzA4MDIpLEZMMkZYQ09OU1RfREJMKDAuOTYxMTI5NDkyMDI2MTMxNyksRkwyRlhDT05TVF9EQkwoMC45NjI0MTg5NDk1ODY0MTY4KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NjM3MDg4MzkxOTgyMTEwKSxGTDJGWENPTlNUX0RCTCgwLjk2NDk5OTE2MDU3MjI3NTApLEZMMkZYQ09OU1RfREJMKDAuOTY2Mjg5OTEzNDE5ODUyNCksRkwyRlhDT05TVF9EQkwoMC45Njc1ODEwOTc0NTI2Njk3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45Njg4NzI3MTIzODI5MzQzKSxGTDJGWENPTlNUX0RCTCgwLjk3MDE2NDc1NzkyMzMzMzApLEZMMkZYQ09OU1RfREJMKDAuOTcxNDU3MjMzNzg3MDMxNiksRkwyRlhDT05TVF9EQkwoMC45NzI3NTAxMzk2ODc2NzI3KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NzQwNDM0NzUzMzkzNzQ5KSxGTDJGWENPTlNUX0RCTCgwLjk3NTMzNzI0MDQ1NjczMTMpLEZMMkZYQ09OU1RfREJMKDAuOTc2NjMxNDM0NzU0ODA4NyksRkwyRlhDT05TVF9EQkwoMC45Nzc5MjYwNTc5NDkxNDYwKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45NzkyMjExMDk3NTU3NTI3KSxGTDJGWENPTlNUX0RCTCgwLjk4MDUxNjU4OTg5MTEwODEpLEZMMkZYQ09OU1RfREJMKDAuOTgxODEyNDk4MDcyMTYwMCksRkwyRlhDT05TVF9EQkwoMC45ODMxMDg4MzQwMTYzMjMyKSwKKyAgRkwyRlhDT05TVF9EQkwoMC45ODQ0MDU1OTc0NDE0Nzg2KSxGTDJGWENPTlNUX0RCTCgwLjk4NTcwMjc4ODA2NTk3MTYpLEZMMkZYQ09OU1RfREJMKDAuOTg3MDAwNDA1NjA4NjExMSksRkwyRlhDT05TVF9EQkwoMC45ODgyOTg0NDk3ODg2Njg0KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45ODk1OTY5MjAzMjU4NzU5KSxGTDJGWENPTlNUX0RCTCgwLjk5MDg5NTgxNjk0MDQyNTUpLEZMMkZYQ09OU1RfREJMKDAuOTkyMTk1MTM5MzUyOTY4MCksRkwyRlhDT05TVF9EQkwoMC45OTM0OTQ4ODcyODQ2MTE2KSwKKyAgRkwyRlhDT05TVF9EQkwoMC45OTQ3OTUwNjA0NTY5MjA2KSxGTDJGWENPTlNUX0RCTCgwLjk5NjA5NTY1ODU5MTkxNDQpLEZMMkZYQ09OU1RfREJMKDAuOTk3Mzk2NjgxNDEyMDY2NSksRkwyRlhDT05TVF9EQkwoMC45OTg2OTgxMjg2NDAzMDI1KQorfTsKKworY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3NwZWNFeHBNYW50VGFibGVDb21iRWxjWzRdWzE0XSA9Cit7CisgIHtGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpLCBGTDJGWENPTlNUX0RCTCgwLjc5MzcwMDUyNTk4NDA5OTgpLCBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLAorICAgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwKKyAgIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksCisgICBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpfSwKKworICB7RkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwKKyAgIEZMMkZYQ09OU1RfREJMKDAuNzQ5MTUzNTM4NDM4MzQwOCksIEZMMkZYQ09OU1RfREJMKDAuOTQzODc0MzEyNjgxNjkzNSksIEZMMkZYQ09OU1RfREJMKDAuNTk0NjAzNTU3NTAxMzYwNSksIEZMMkZYQ09OU1RfREJMKDAuNzQ5MTUzNTM4NDM4MzQwOCksCisgICBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLCBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLAorICAgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KX0sCisKKyAge0ZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksCisgICBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLCBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLCBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLAorICAgRkwyRlhDT05TVF9EQkwoMC41NjEyMzEwMjQxNTQ2ODY1KSwgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc2KSwgRkwyRlhDT05TVF9EQkwoMC44OTA4OTg3MTgxNDAzMzkzKSwgRkwyRlhDT05TVF9EQkwoMC41NjEyMzEwMjQxNTQ2ODY1KSwKKyAgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5Myl9LAorCisgIHtGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLCBGTDJGWENPTlNUX0RCTCgwLjUyOTczMTU0NzE3OTY0NzcpLCBGTDJGWENPTlNUX0RCTCgwLjY2NzQxOTkyNzA4NTAxNzIpLCBGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLAorICAgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwKKyAgIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksCisgICBGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLCBGTDJGWENPTlNUX0RCTCgwLjUyOTczMTU0NzE3OTY0NzcpfQorfTsKKworY29uc3QgVUNIQVIgRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbNF1bMTRdID0KK3sKKyAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKKyAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKKyAgezEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4fSwKKyAgezEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5fQorfTsKKworCisjZGVmaW5lIFdUUzAgMQorI2RlZmluZSBXVFMxIDAKKyNkZWZpbmUgV1RTMiAtMgorCitjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczUxMlsxNTM2XSA9IHsKKyAgLyogcGFydCAwICovCisgIFdUQzAoMHhmYWM1YTc3MCksIFdUQzAoMHhmYWFmYmFiOCksIFdUQzAoMHhmYTk5NmE0MCksIFdUQzAoMHhmYTgyYmJkMCksIFdUQzAoMHhmYTZiYjUzOCksIFdUQzAoMHhmYTU0NWMzOCksIFdUQzAoMHhmYTNjYjY5OCksIFdUQzAoMHhmYTI0Y2EyOCksIAorICBXVEMwKDB4ZmEwYzljYTgpLCBXVEMwKDB4ZjlmNDMzZTgpLCBXVEMwKDB4ZjlkYjk1ODApLCBXVEMwKDB4ZjljMmMyOTgpLCBXVEMwKDB4ZjlhOWI4MDApLCBXVEMwKDB4Zjk5MDcyNTApLCBXVEMwKDB4Zjk3NmVlMzgpLCBXVEMwKDB4Zjk1ZDJiODgpLCAKKyAgV1RDMCgweGY5NDMyZDEwKSwgV1RDMCgweGY5MjhmNWMwKSwgV1RDMCgweGY5MGU4ODY4KSwgV1RDMCgweGY4ZjNlNDAwKSwgV1RDMCgweGY4ZDkwM2EwKSwgV1RDMCgweGY4YmRlMjM4KSwgV1RDMCgweGY4YTI3YWYwKSwgV1RDMCgweGY4ODZjZGU4KSwgCisgIFdUQzAoMHhmODZhZTAyMCksIFdUQzAoMHhmODRlYjZjMCksIFdUQzAoMHhmODMyNTZmOCksIFdUQzAoMHhmODE1YzRiOCksIFdUQzAoMHhmN2Y5MDJjMCksIFdUQzAoMHhmN2RjMTNiMCksIFdUQzAoMHhmN2JlZmE2MCksIFdUQzAoMHhmN2ExYmE0MCksIAorICBXVEMwKDB4Zjc4NDU3YzApLCBXVEMwKDB4Zjc2NmQ3ODApLCBXVEMwKDB4Zjc0OTNkOTApLCBXVEMwKDB4ZjcyYjg5OTApLCBXVEMwKDB4ZjcwZGI1ZjApLCBXVEMwKDB4ZjZlZmJkMzApLCBXVEMwKDB4ZjZkMTlhMjApLCBXVEMwKDB4ZjZiMzUyZTApLCAKKyAgV1RDMCgweGY2OTRmOGMwKSwgV1RDMCgweGY2NzY5ZGEwKSwgV1RDMCgweGY2NTg1MzEwKSwgV1RDMCgweGY2M2EyOGQwKSwgV1RDMCgweGY2MWMyYzYwKSwgV1RDMCgweGY1ZmU2YjEwKSwgV1RDMCgweGY1ZTBmMjUwKSwgV1RDMCgweGY1YzNjZWIwKSwgCisgIFdUQzAoMHhmNWE3MGJlMCksIFdUQzAoMHhmNThhYjVhMCksIFdUQzAoMHhmNTZlZDdiMCksIFdUQzAoMHhmNTUzN2U0MCksIFdUQzAoMHhmNTM4YjYxMCksIFdUQzAoMHhmNTFlOGJmMCksIFdUQzAoMHhmNTA1MGM5MCksIFdUQzAoMHhmNGVjNDMzMCksIAorICBXVEMwKDB4ZjRkNDM5YjApLCBXVEMwKDB4ZjRiY2Y5YjApLCBXVEMwKDB4ZjRhNjhjZTApLCBXVEMwKDB4ZjQ5MGZhODApLCBXVEMwKDB4ZjQ3YzQ3NjApLCBXVEMwKDB4ZjQ2ODc4MzApLCBXVEMwKDB4ZjQ1NThmMDApLCBXVEMwKDB4ZjQ0MzRmYzApLCAKKyAgV1RDMCgweGY0MzE0MDcwKSwgV1RDMCgweGY0MWVlNDUwKSwgV1RDMCgweGY0MGJjMTMwKSwgV1RDMCgweGYzZjc5OWMwKSwgV1RDMCgweGYzZTI2ZDMwKSwgV1RDMCgweGYzY2MzZDcwKSwgV1RDMCgweGYzYjUwYzgwKSwgV1RDMCgweGYzOWNkZDYwKSwgCisgIFdUQzAoMHhmMzgzYjQ0MCksIFdUQzAoMHhmMzY5OTU1MCksIFdUQzAoMHhmMzRlODRjMCksIFdUQzAoMHhmMzMyODZiMCksIFdUQzAoMHhmMzE1OWYxMCksIFdUQzAoMHhmMmY3ZDFiMCksIFdUQzAoMHhmMmQ5MjI5MCksIFdUQzAoMHhmMmI5OTRkMCksIAorICBXVEMwKDB4ZjI5OTJhZDApLCBXVEMwKDB4ZjI3N2U2ZDApLCBXVEMwKDB4ZjI1NWNiNjApLCBXVEMwKDB4ZjIzMmRkMDApLCBXVEMwKDB4ZjIwZjIyNDApLCBXVEMwKDB4ZjFlYWExZDApLCBXVEMwKDB4ZjFjNTYyNDApLCBXVEMwKDB4ZjE5ZjYzZDApLCAKKyAgV1RDMCgweGYxNzhhMGYwKSwgV1RDMCgweGYxNTExM2EwKSwgV1RDMCgweGYxMjhiNWMwKSwgV1RDMCgweGYwZmY3ZmQwKSwgV1RDMCgweGYwZDU2ODYwKSwgV1RDMCgweGYwYWE2NjEwKSwgV1RDMCgweGYwN2U2ZmQwKSwgV1RDMCgweGYwNTE4MTkwKSwgCisgIFdUQzAoMHhmMDIzOWNkMCksIFdUQzAoMHhlZmY0YzMyMCksIFdUQzAoMHhlZmM0ZjcyMCksIFdUQzAoMHhlZjk0NTA4MCksIFdUQzAoMHhlZjYyZmNlMCksIFdUQzAoMHhlZjMxMmE0MCksIFdUQzAoMHhlZWZmMDVjMCksIFdUQzAoMHhlZWNjYTJjMCksIAorICBXVEMwKDB4ZWU5OWZhYTApLCBXVEMwKDB4ZWU2NzA1YTApLCBXVEMwKDB4ZWUzM2JiNjApLCBXVEMwKDB4ZWUwMDAwNjApLCBXVEMwKDB4ZWRjYmE2NjApLCBXVEMwKDB4ZWQ5NjdlODApLCBXVEMwKDB4ZWQ2MDViODApLCBXVEMwKDB4ZWQyOTNiNDApLCAKKyAgV1RDMCgweGVjZjE0NmEwKSwgV1RDMCgweGVjYjhhOGEwKSwgV1RDMCgweGVjN2Y4YmMwKSwgV1RDMCgweGVjNDYxMjYwKSwgV1RDMCgweGVjMGM1NzIwKSwgV1RDMCgweGViZDI3NDQwKSwgV1RDMCgweGViOTg4MjIwKSwgV1RDMCgweGViNWU3MDQwKSwgCisgIFdUQzAoMHhlYjI0MDRjMCksIFdUQzAoMHhlYWU5MDQ0MCksIFdUQzAoMHhlYWFkMzNjMCksIFdUQzAoMHhlYTcwNjZjMCksIFdUQzAoMHhlYTMyN2Y2MCksIFdUQzAoMHhlOWYzNjAwMCksIFdUQzAoMHhlOWIyZWQ2MCksIFdUQzAoMHhlOTcxMzkyMCksIAorICBXVEMwKDB4ZTkyZTgxZTApLCBXVEMwKDB4ZThlYjA4YzApLCBXVEMwKDB4ZThhNzBlNjApLCBXVEMwKDB4ZTg2MmQ4ZTApLCBXVEMwKDB4ZTgxZWIzNDApLCBXVEMwKDB4ZTdkYWU4YTApLCBXVEMwKDB4ZTc5N2MxYTApLCBXVEMwKDB4ZTc1NTRjYTApLCAKKyAgV1RDMCgweGU3MTM1ZGMwKSwgV1RDMCgweGU2ZDFjNmEwKSwgV1RDMCgweGU2OTA1NzIwKSwgV1RDMCgweGU2NGViOWMwKSwgV1RDMCgweGU2MGM3MzAwKSwgV1RDMCgweGU1YzkwNjAwKSwgV1RDMCgweGU1ODNmOTIwKSwgV1RDMCgweGU1M2QxY2UwKSwgCisgIFdUQzAoMHhlNGY0OGM4MCksIFdUQzAoMHhlNGFhNjY0MCksIFdUQzAoMHhlNDVlY2FhMCksIFdUQzAoMHhlNDEyMGJlMCksIFdUQzAoMHhlM2M0YWU2MCksIFdUQzAoMHhlMzc3Mzg2MCksIFdUQzAoMHhlMzJhMmVhMCksIFdUQzAoMHhlMmRkZWVhMCksIAorICBXVEMwKDB4ZTI5MmFmMDApLCBXVEMwKDB4ZTI0OGE0YTApLCBXVEMwKDB4ZTIwMDAxNDApLCBXVEMwKDB4ZTFiOGI2NDApLCBXVEMwKDB4ZTE3Mjc0NDApLCBXVEMwKDB4ZTEyY2U5MDApLCBXVEMwKDB4ZTBlN2MyODApLCBXVEMwKDB4ZTBhMmI0MjApLCAKKyAgV1RDMCgweGUwNWQ3NmMwKSwgV1RDMCgweGUwMTdjMzYwKSwgV1RDMCgweGRmZDE1NDQwKSwgV1RDMCgweGRmOGEwNTQwKSwgV1RDMCgweGRmNDFkMzAwKSwgV1RDMCgweGRlZjhiYjQwKSwgV1RDMCgweGRlYWViZDQwKSwgV1RDMCgweGRlNjNlN2MwKSwgCisgIFdUQzAoMHhkZTE4NTk0MCksIFdUQzAoMHhkZGNjMzE4MCksIFdUQzAoMHhkZDdmOTAwMCksIFdUQzAoMHhkZDMyOWU4MCksIFdUQzAoMHhkY2U1OGU4MCksIFdUQzAoMHhkYzk4OTMwMCksIFdUQzAoMHhkYzRiZGU0MCksIFdUQzAoMHhkYmZmOTZjMCksIAorICBXVEMwKDB4ZGJiM2Q3ODApLCBXVEMwKDB4ZGI2OGJiODApLCBXVEMwKDB4ZGIxZTVjODApLCBXVEMwKDB4ZGFkNGMzODApLCBXVEMwKDB4ZGE4YmU4NDApLCBXVEMwKDB4ZGE0M2MxYzApLCBXVEMwKDB4ZDlmYzQ3NDApLCBXVEMwKDB4ZDliNTY2NDApLCAKKyAgV1RDMCgweGQ5NmYwNDQwKSwgV1RDMCgweGQ5MjkwNjAwKSwgV1RDMCgweGQ4ZTM1MDgwKSwgV1RDMCgweGQ4OWRjZDQwKSwgV1RDMCgweGQ4NTg2YjQwKSwgV1RDMCgweGQ4MTMxOTQwKSwgV1RDMCgweGQ3Y2RjNjQwKSwgV1RDMCgweGQ3ODg2MTgwKSwgCisgIFdUQzAoMHhkNzQyZGM4MCksIFdUQzAoMHhkNmZkMjc4MCksIFdUQzAoMHhkNmI3MzQwMCksIFdUQzAoMHhkNjcwZmQ4MCksIFdUQzAoMHhkNjJhOGE0MCksIFdUQzAoMHhkNWUzZTA4MCksIFdUQzAoMHhkNTlkMDg0MCksIFdUQzAoMHhkNTU2MmI4MCksIAorICBXVEMwKDB4ZDUwZjk1NDApLCBXVEMwKDB4ZDRjOTkyYzApLCBXVEMwKDB4ZDQ4NDZmODApLCBXVEMwKDB4ZDQ0MDVhODApLCBXVEMwKDB4ZDNmZDY1ODApLCBXVEMwKDB4ZDNiYmExNDApLCBXVEMwKDB4ZDM3YjFjODApLCBXVEMwKDB4ZDMzYmI3ODApLCAKKyAgV1RDMCgweGQyZmQyNDAwKSwgV1RDMCgweGQyYmYxMjQwKSwgV1RDMCgweGQyODEzMzAwKSwgV1RDMCgweGQyNDM1YWMwKSwgV1RDMCgweGQyMDU3ZmMwKSwgV1RDMCgweGQxYzc5YTAwKSwgV1RDMCgweGQxODlhMjQwKSwgV1RDMCgweGQxNGI5ZGMwKSwgCisgIFdUQzAoMHhkMTBkOWUwMCksIFdUQzAoMHhkMGNmYjU4MCksIFdUQzAoMHhkMDkxZjZjMCksIFdUQzAoMHhkMDU0ODEwMCksIFdUQzAoMHhkMDE3N2Y0MCksIFdUQzAoMHhjZmRiMWNjMCksIFdUQzAoMHhjZjlmODRjMCksIFdUQzAoMHhjZjY0ZDc4MCksIAorICBXVEMwKDB4Y2YyYjJiMDApLCBXVEMwKDB4Y2VmMjk0NDApLCBXVEMwKDB4Y2ViYjI2NDApLCBXVEMwKDB4Y2U4NGMwMDApLCBXVEMwKDB4Y2U0ZjBiYzApLCBXVEMwKDB4Y2UxOWIyMDApLCBXVEMwKDB4Y2RlNDVkNDApLCBXVEMwKDB4Y2RhZWVkYzApLCAKKyAgV1RDMCgweGNkNzk3OWMwKSwgV1RDMCgweGNkNDQxOWMwKSwgV1RDMCgweGNkMGVlNmMwKSwgV1RDMCgweGNjZGEwNTQwKSwgV1RDMCgweGNjYTVhNTAwKSwgV1RDMCgweGNjNzFmNjQwKSwgV1RDMCgweGNjM2YyODAwKSwgV1RDMCgweGNjMGQ0MzAwKSwgCisgIFdUQzAoMHhjYmRjMmEwMCksIFdUQzAoMHhjYmFiYmU4MCksIFdUQzAoMHhjYjdiZTIwMCksIFdUQzAoMHhjYjRjODIwMCksIFdUQzAoMHhjYjFkOTgwMCksIFdUQzAoMHhjYWVmMWQ0MCksIFdUQzAoMHhjYWMxMGJjMCksIFdUQzAoMHhjYTkzNjQ0MCksIAorICBXVEMwKDB4Y2E2NjJkMDApLCBXVEMwKDB4Y2EzOTZkNDApLCBXVEMwKDB4Y2EwZDJiODApLCBXVEMwKDB4YzllMTZmODApLCBXVEMwKDB4YzliNjNmODApLCBXVEMwKDB4Yzk4YmEyYzApLCBXVEMwKDB4Yzk2MWEwMDApLCBXVEMwKDB4YzkzODNlYzApLCAKKyAgV1RDMCgweGM5MGEwNDQwKSwgV1RDMCgweGM4ZTBkMjgwKSwgV1RDMCgweGM4YjczYjgwKSwgV1RDMCgweGM4OGQ0OTAwKSwgV1RDMCgweGM4NjMwNGMwKSwgV1RDMCgweGM4Mzg3OGMwKSwgV1RDMCgweGM4MGRhZTgwKSwgV1RDMCgweGM3ZTJhZmMwKSwgCisgIFdUQzAoMHhjN2I3ODY0MCksIFdUQzAoMHhjNzhjM2M0MCksIFdUQzAoMHhjNzYwZGE4MCksIFdUQzAoMHhjNzM1NjY0MCksIFdUQzAoMHhjNzA5ZGU0MCksIFdUQzAoMHhjNmRlNDFjMCksIFdUQzAoMHhjNmIyOGZjMCksIFdUQzAoMHhjNjg2YmQ0MCksIAorICBXVEMwKDB4YzY1YWI2MDApLCBXVEMwKDB4YzYyZTY1ODApLCBXVEMwKDB4YzYwMWI4ODApLCBXVEMwKDB4YzVkNGJhYzApLCBXVEMwKDB4YzVhNzk2NDApLCBXVEMwKDB4YzU3YTc2YzApLCBXVEMwKDB4YzU0ZDg3ODApLCBXVEMwKDB4YzUyMGU4NDApLCAKKyAgV1RDMCgweGM0ZjRhY2MwKSwgV1RDMCgweGM0YzhlODgwKSwgV1RDMCgweGM0OWRhZDgwKSwgV1RDMCgweGM0NzJlNjQwKSwgV1RDMCgweGM0NDg1NmMwKSwgV1RDMCgweGM0MWRjMTQwKSwgV1RDMCgweGMzZjJlOTQwKSwgV1RDMCgweGMzYzdiYzAwKSwgCisgIFdUQzAoMHhjMzljNGYwMCksIFdUQzAoMHhjMzcwYjljMCksIFdUQzAoMHhjMzQ1MTNjMCksIFdUQzAoMHhjMzE5Nzk0MCksIFdUQzAoMHhjMmVlMGEwMCksIFdUQzAoMHhjMmMyZTY0MCksIFdUQzAoMHhjMjk4MmQ4MCksIFdUQzAoMHhjMjZkZjVjMCksIAorICBXVEMwKDB4YzI0NDRiMDApLCBXVEMwKDB4YzIxYjM5NDApLCBXVEMwKDB4YzFmMmNiYzApLCBXVEMwKDB4YzFjYjA1YzApLCBXVEMwKDB4YzFhM2UzNDApLCBXVEMwKDB4YzE3ZDVmMDApLCBXVEMwKDB4YzE1NzczYzApLCBXVEMwKDB4YzEzMjA5NDApLCAKKyAgV1RDMCgweGMxMGNmNDgwKSwgV1RDMCgweGMwZTgwYTAwKSwgV1RDMCgweGMwYzMxZjAwKSwgV1RDMCgweGMwOWUyNjQwKSwgV1RDMCgweGMwNzkyZWMwKSwgV1RDMCgweGMwNTQ0OTQwKSwgV1RDMCgweGMwMmY4NmMwKSwgV1RDMCgweGMwMGIwNGMwKSwgCisgIFdUQzAoMHhiZmU2ZWQwMSksIFdUQzAoMHhiZmMzNmEwMSksIFdUQzAoMHhiZmEwYTU4MSksIFdUQzAoMHhiZjdlYjU4MSksIFdUQzAoMHhiZjVkOWE4MSksIFdUQzAoMHhiZjNkNTUwMSksIFdUQzAoMHhiZjFkZTYwMSksIFdUQzAoMHhiZWZmNDgwMSksIAorICBXVEMwKDB4YmVlMTcyMDEpLCBXVEMwKDB4YmVjNDU4ODEpLCBXVEMwKDB4YmVhN2YzMDEpLCBXVEMwKDB4YmU4YzM3ODEpLCBXVEMwKDB4YmU3MTIwMDEpLCBXVEMwKDB4YmU1NmEzODEpLCBXVEMwKDB4YmUzY2JjMDEpLCBXVEMwKDB4YmUyMzYwMDEpLCAKKyAgV1RDMCgweGJlMGE4NTgxKSwgV1RDMCgweGJkZjIyMTgxKSwgV1RDMCgweGJkZGEyYTAxKSwgV1RDMCgweGJkYzI5YTgxKSwgV1RDMCgweGJkYWI3MTgxKSwgV1RDMCgweGJkOTRiMDAxKSwgV1RDMCgweGJkN2U1NTgxKSwgV1RDMCgweGJkNjg2NjgxKSwgCisgIFdUQzAoMHhiZDUyZWIwMSksIFdUQzAoMHhiZDNkZWI4MSksIFdUQzAoMHhiZDI5NzE4MSksIFdUQzAoMHhiZDE1ODgwMSksIFdUQzAoMHhiZDAyM2YwMSksIFdUQzAoMHhiY2VmYTYwMSksIFdUQzAoMHhiY2RkY2M4MSksIFdUQzAoMHhiY2NjYmQwMSksIAorICBXVEMwKDB4YmNiYzdlMDEpLCBXVEMwKDB4YmNhZDE1MDEpLCBXVEMwKDB4YmM5ZTg4MDEpLCBXVEMwKDB4YmM5MGQ0ODEpLCBXVEMwKDB4YmM4M2YyMDEpLCBXVEMwKDB4YmM3N2Q2MDEpLCBXVEMwKDB4YmM2Yzc3ODEpLCBXVEMwKDB4YmM2MWM0MDEpLCAKKyAgV1RDMCgweGJjNTdhMzAxKSwgV1RDMCgweGJjNGRmYjgxKSwgV1RDMCgweGJjNDRiNDgxKSwgV1RDMCgweGJjM2JiYzAxKSwgV1RDMCgweGJjMzMwNzgxKSwgV1RDMCgweGJjMmE4YzgxKSwgV1RDMCgweGJjMjI0MTgxKSwgV1RDMCgweGJjMWEyNDAxKSwgCisgIFdUQzAoMHhiYzEyM2I4MSksIFdUQzAoMHhiYzBhOGYwMSksIFdUQzAoMHhiYzAzMjYwMSksIFdUQzAoMHhiYmZjMGY4MSksIFdUQzAoMHhiYmY1NjE4MSksIFdUQzAoMHhiYmVmMzMwMSksIFdUQzAoMHhiYmU5OTk4MSksIFdUQzAoMHhiYmU0OWQwMSksIAorICBXVEMwKDB4YmJlMDM4MDEpLCBXVEMwKDB4YmJkYzY0ODEpLCBXVEMwKDB4YmJkOTFiODEpLCBXVEMwKDB4YmJkNjRkMDEpLCBXVEMwKDB4YmJkM2UxMDEpLCBXVEMwKDB4YmJkMWJkODEpLCBXVEMwKDB4YmJjZmNhODEpLCBXVEMwKDB4YmJjZTA2MDEpLCAKKyAgV1RDMCgweGJiY2M4MjAxKSwgV1RDMCgweGJiY2I1MzAxKSwgV1RDMCgweGJiY2E4ZDAxKSwgV1RDMCgweGJiY2E1MDgxKSwgV1RDMCgweGJiY2FjYTAxKSwgV1RDMCgweGJiY2MyNjgxKSwgV1RDMCgweGJiY2U5MTgxKSwgV1RDMCgweGJiZDIxMjgxKSwgCisgIFdUQzAoMHhiYmQ2OGM4MSksIFdUQzAoMHhiYmRiZTIwMSksIFdUQzAoMHhiYmUxZjQwMSksIFdUQzAoMHhiYmU4OTkwMSksIFdUQzAoMHhiYmVmOWI4MSksIFdUQzAoMHhiYmY2YzYwMSksIFdUQzAoMHhiYmZkZTQ4MSksIFdUQzAoMHhiYzA0ZTM4MSksIAorICBXVEMwKDB4YmMwYmNmODEpLCBXVEMwKDB4YmMxMmI4MDEpLCBXVEMwKDB4YmMxOWFiMDEpLCBXVEMwKDB4YmMyMGFlMDEpLCBXVEMwKDB4YmMyN2JkODEpLCBXVEMwKDB4YmMyZWQ2ODEpLCBXVEMwKDB4YmMzNWY1MDEpLCBXVEMwKDB4YmMzZDE4MDEpLCAKKyAgV1RDMCgweGJjNDQ0MDgxKSwgV1RDMCgweGJjNGI2ZTgxKSwgV1RDMCgweGJjNTJhMzgxKSwgV1RDMCgweGJjNTlkZjgxKSwgV1RDMCgweGJjNjEyMzAxKSwgV1RDMCgweGJjNjg2ZTAxKSwgV1RDMCgweGJjNmZjMTAxKSwgV1RDMCgweGJjNzcxYzAxKSwgCisgIFdUQzAoMHhiYzdlN2UwMSksIFdUQzAoMHhiYzg1ZTgwMSksIFdUQzAoMHhiYzhkNTkwMSksIFdUQzAoMHhiYzk0ZDIwMSksIFdUQzAoMHhiYzljNTI4MSksIFdUQzAoMHhiY2EzZGIwMSksIFdUQzAoMHhiY2FiNmMwMSksIFdUQzAoMHhiY2IzMDYwMSksIAorICBXVEMwKDB4YmNiYWE4MDEpLCBXVEMwKDB4YmNjMjUxODEpLCBXVEMwKDB4YmNjYTAzMDEpLCBXVEMwKDB4YmNkMWJiODEpLCBXVEMwKDB4YmNkOTdjODEpLCBXVEMwKDB4YmNlMTQ2MDEpLCBXVEMwKDB4YmNlOTE4MDEpLCBXVEMwKDB4YmNmMGYzODEpLCAKKyAgV1RDMCgweGJjZjhkNzgxKSwgV1RDMCgweGJkMDBjMzgxKSwgV1RDMCgweGJkMDhiNzgxKSwgV1RDMCgweGJkMTBiMzgxKSwgV1RDMCgweGJkMThiNzgxKSwgV1RDMCgweGJkMjBjNDAxKSwgV1RDMCgweGJkMjhkOTgxKSwgV1RDMCgweGJkMzBmODgxKSwgCisgIFdUQzAoMHhiZDM5MWY4MSksIFdUQzAoMHhiZDQxNGYwMSksIFdUQzAoMHhiZDQ5ODYwMSksIFdUQzAoMHhiZDUxYzQ4MSksIFdUQzAoMHhiZDVhMGIwMSksIFdUQzAoMHhiZDYyNTk4MSksIFdUQzAoMHhiZDZhYjEwMSksIFdUQzAoMHhiZDczMTA4MSksIAorICBXVEMwKDB4YmQ3Yjc3ODEpLCBXVEMwKDB4YmQ4M2U2ODEpLCBXVEMwKDB4YmQ4YzVjMDEpLCBXVEMwKDB4YmQ5NGQ4MDEpLCBXVEMwKDB4YmQ5ZDViODEpLCBXVEMwKDB4YmRhNWU2MDEpLCBXVEMwKDB4YmRhZTc4ODEpLCBXVEMwKDB4YmRiNzEyMDEpLCAKKyAgV1RDMCgweGJkYmZiMjgxKSwgV1RDMCgweGJkYzg1OTgxKSwgV1RDMCgweGJkZDEwNjgxKSwgV1RDMCgweGJkZDliOTgxKSwgV1RDMCgweGJkZTI3MjAxKSwgV1RDMCgweGJkZWIzMTAxKSwgV1RDMCgweGJkZjNmNzAxKSwgV1RDMCgweGJkZmNjMzAxKSwgCisgIFdUQzAoMHhiZTA1OTQ4MSksIFdUQzAoMHhiZTBlNmMwMSksIFdUQzAoMHhiZTE3NDc4MSksIFdUQzAoMHhiZTIwMjgwMSksIFdUQzAoMHhiZTI5MGQwMSksIFdUQzAoMHhiZTMxZjcwMSksIFdUQzAoMHhiZTNhZTYwMSksIFdUQzAoMHhiZTQzZGE4MSksIAorICBXVEMwKDB4YmU0Y2QzODEpLCBXVEMwKDB4YmU1NWQwMDEpLCBXVEMwKDB4YmU1ZWQwODEpLCBXVEMwKDB4YmU2N2QzODEpLCBXVEMwKDB4YmU3MGRhMDEpLCBXVEMwKDB4YmU3OWU0ODEpLCBXVEMwKDB4YmU4MmYzMDEpLCBXVEMwKDB4YmU4YzA1MDEpLCAKKyAgV1RDMCgweGJlOTUxYTgxKSwgV1RDMCgweGJlOWUzMjgxKSwgV1RDMCgweGJlYTc0YzgxKSwgV1RDMCgweGJlYjA2ODgxKSwgV1RDMCgweGJlYjk4NjgxKSwgV1RDMCgweGJlYzJhNzgxKSwgV1RDMCgweGJlY2JjYTgxKSwgV1RDMCgweGJlZDRmMDgxKSwgCisgIFdUQzAoMHhiZWRlMTkwMSksIFdUQzAoMHhiZWU3NDI4MSksIFdUQzAoMHhiZWYwNmQwMSksIFdUQzAoMHhiZWY5OTkwMSksIFdUQzAoMHhiZjAyYzU4MSksIFdUQzAoMHhiZjBiZjM4MSksIFdUQzAoMHhiZjE1MjM4MSksIFdUQzAoMHhiZjFlNTUwMSksIAorICBXVEMwKDB4YmYyNzg4MDEpLCBXVEMwKDB4YmYzMGJiMDEpLCBXVEMwKDB4YmYzOWVlODEpLCBXVEMwKDB4YmY0MzIyODEpLCBXVEMwKDB4YmY0YzU2ODEpLCBXVEMwKDB4YmY1NThiMDEpLCBXVEMwKDB4YmY1ZWMxMDEpLCBXVEMwKDB4YmY2N2Y4MDEpLCAKKyAgV1RDMCgweGJmNzEyZjAxKSwgV1RDMCgweGJmN2E2NjgxKSwgV1RDMCgweGJmODM5ZDgxKSwgV1RDMCgweGJmOGNkNDgxKSwgV1RDMCgweGJmOTYwYjAxKSwgV1RDMCgweGJmOWY0MTgxKSwgV1RDMCgweGJmYTg3OTAxKSwgV1RDMCgweGJmYjFiMTAxKSwgCisgIFdUQzAoMHhiZmJhZTk4MSksIFdUQzAoMHhiZmM0MjIwMSksIFdUQzAoMHhiZmNkNWEwMSksIFdUQzAoMHhiZmQ2OTEwMSksIFdUQzAoMHhiZmRmYzc4MSksIFdUQzAoMHhiZmU4ZmMwMSksIFdUQzAoMHhiZmYyMmY4MSksIFdUQzAoMHhiZmZiNjA4MSksIAorICAvKiBwYXJ0IDEgKi8KKyAgV1RDMSgweDgwMDkzZTAxKSwgV1RDMSgweDgwMWI5YjAxKSwgV1RDMSgweDgwMmRmNzAxKSwgV1RDMSgweDgwNDA1MTAxKSwgV1RDMSgweDgwNTJhODgxKSwgV1RDMSgweDgwNjRmYzgxKSwgV1RDMSgweDgwNzc0YzgxKSwgV1RDMSgweDgwODk5ODgxKSwgCisgIFdUQzEoMHg4MDliZGYwMSksIFdUQzEoMHg4MGFlMWY4MSksIFdUQzEoMHg4MGMwNWEwMSksIFdUQzEoMHg4MGQyOGQ4MSksIFdUQzEoMHg4MGU0YmI4MSksIFdUQzEoMHg4MGY2ZTQ4MSksIFdUQzEoMHg4MTA5MDk4MSksIFdUQzEoMHg4MTFiMjk4MSksIAorICBXVEMxKDB4ODEyZDQ0ODEpLCBXVEMxKDB4ODEzZjU5ODEpLCBXVEMxKDB4ODE1MTY3MDEpLCBXVEMxKDB4ODE2MzZkODEpLCBXVEMxKDB4ODE3NTZkODEpLCBXVEMxKDB4ODE4NzY3ODEpLCBXVEMxKDB4ODE5OTVjMDEpLCBXVEMxKDB4ODFhYjRiMDEpLCAKKyAgV1RDMSgweDgxYmQzNDAxKSwgV1RDMSgweDgxY2YxNTgxKSwgV1RDMSgweDgxZTBlZTgxKSwgV1RDMSgweDgxZjJiZjgxKSwgV1RDMSgweDgyMDQ4ODgxKSwgV1RDMSgweDgyMTY0YTgxKSwgV1RDMSgweDgyMjgwNTgxKSwgV1RDMSgweDgyMzliOTgxKSwgCisgIFdUQzEoMHg4MjRiNjYwMSksIFdUQzEoMHg4MjVkMDkwMSksIFdUQzEoMHg4MjZlYTIwMSksIFdUQzEoMHg4MjgwMzEwMSksIFdUQzEoMHg4MjkxYjYwMSksIFdUQzEoMHg4MmEzMzI4MSksIFdUQzEoMHg4MmI0YTYwMSksIFdUQzEoMHg4MmM2MTEwMSksIAorICBXVEMxKDB4ODJkNzcyMDEpLCBXVEMxKDB4ODJlOGM4MDEpLCBXVEMxKDB4ODJmYTExODEpLCBXVEMxKDB4ODMwYjRmODEpLCBXVEMxKDB4ODMxYzgxMDEpLCBXVEMxKDB4ODMyZGE3ODEpLCBXVEMxKDB4ODMzZWMzODEpLCBXVEMxKDB4ODM0ZmQ0ODEpLCAKKyAgV1RDMSgweDgzNjBkOTAxKSwgV1RDMSgweDgzNzFkMDgxKSwgV1RDMSgweDgzODJiYTAxKSwgV1RDMSgweDgzOTM5NTAxKSwgV1RDMSgweDgzYTQ2MTgxKSwgV1RDMSgweDgzYjUyMTAxKSwgV1RDMSgweDgzYzVkMzgxKSwgV1RDMSgweDgzZDY3ODgxKSwgCisgIFdUQzEoMHg4M2U3MGYwMSksIFdUQzEoMHg4M2Y3OTY4MSksIFdUQzEoMHg4NDA4MGQ4MSksIFdUQzEoMHg4NDE4NzQwMSksIFdUQzEoMHg4NDI4Y2EwMSksIFdUQzEoMHg4NDM5MTA4MSksIFdUQzEoMHg4NDQ5NDg4MSksIFdUQzEoMHg4NDU5NzA4MSksIAorICBXVEMxKDB4ODQ2OTg4ODEpLCBXVEMxKDB4ODQ3OThmODEpLCBXVEMxKDB4ODQ4OTg0ODEpLCBXVEMxKDB4ODQ5OTY3MDEpLCBXVEMxKDB4ODRhOTM4MDEpLCBXVEMxKDB4ODRiOGY4MDEpLCBXVEMxKDB4ODRjOGE3MDEpLCBXVEMxKDB4ODRkODQ2MDEpLCAKKyAgV1RDMSgweDg0ZTdkMzgxKSwgV1RDMSgweDg0Zjc0ZTAxKSwgV1RDMSgweDg1MDZiNTgxKSwgV1RDMSgweDg1MTYwOTgxKSwgV1RDMSgweDg1MjU0YTgxKSwgV1RDMSgweDg1MzQ3OTAxKSwgV1RDMSgweDg1NDM5NjAxKSwgV1RDMSgweDg1NTJhMTgxKSwgCisgIFdUQzEoMHg4NTYxOWEwMSksIFdUQzEoMHg4NTcwN2Y4MSksIFdUQzEoMHg4NTdmNTEwMSksIFdUQzEoMHg4NThlMGUwMSksIFdUQzEoMHg4NTljYjc4MSksIFdUQzEoMHg4NWFiNGYwMSksIFdUQzEoMHg4NWI5ZDQ4MSksIFdUQzEoMHg4NWM4NDgwMSksIAorICBXVEMxKDB4ODVkNmE5ODEpLCBXVEMxKDB4ODVlNGY4MDEpLCBXVEMxKDB4ODVmMzMyODEpLCBXVEMxKDB4ODYwMTU5ODEpLCBXVEMxKDB4ODYwZjZlMDEpLCBXVEMxKDB4ODYxZDcwODEpLCBXVEMxKDB4ODYyYjYyMDEpLCBXVEMxKDB4ODYzOTQzMDEpLCAKKyAgV1RDMSgweDg2NDcxMjgxKSwgV1RDMSgweDg2NTRkMDAxKSwgV1RDMSgweDg2NjI3YjAxKSwgV1RDMSgweDg2NzAxMzgxKSwgV1RDMSgweDg2N2Q5YTgxKSwgV1RDMSgweDg2OGIxMDAxKSwgV1RDMSgweDg2OTg3NTgxKSwgV1RDMSgweDg2YTVjYTgxKSwgCisgIFdUQzEoMHg4NmIzMGYwMSksIFdUQzEoMHg4NmMwNDM4MSksIFdUQzEoMHg4NmNkNjY4MSksIFdUQzEoMHg4NmRhNzkwMSksIFdUQzEoMHg4NmU3N2I4MSksIFdUQzEoMHg4NmY0NmQ4MSksIFdUQzEoMHg4NzAxNGY4MSksIFdUQzEoMHg4NzBlMjMwMSksIAorICBXVEMxKDB4ODcxYWU5ODEpLCBXVEMxKDB4ODcyN2EzODEpLCBXVEMxKDB4ODczNDUzODEpLCBXVEMxKDB4ODc0MGY2ODEpLCBXVEMxKDB4ODc0ZDg2ODEpLCBXVEMxKDB4ODc1OWZkMDEpLCBXVEMxKDB4ODc2NjU0ODEpLCBXVEMxKDB4ODc3Mjk3MDEpLCAKKyAgV1RDMSgweDg3N2VkZTAxKSwgV1RDMSgweDg3OGI0MzAxKSwgV1RDMSgweDg3OTdkZDgxKSwgV1RDMSgweDg3YTQ4YjAxKSwgV1RDMSgweDg3YjBlZjAxKSwgV1RDMSgweDg3YmNhYjgxKSwgV1RDMSgweDg3Yzc2MjAxKSwgV1RDMSgweDg3ZDBjYTgxKSwgCisgIFdUQzEoMHg4N2ZkZDc4MSksIFdUQzEoMHg4ODFkZDMwMSksIFdUQzEoMHg4ODQyMzMwMSksIFdUQzEoMHg4ODZhOGE4MSksIFdUQzEoMHg4ODk2Mjk4MSksIFdUQzEoMHg4OGM0NWU4MSksIFdUQzEoMHg4OGY0NzkwMSksIFdUQzEoMHg4OTI1ZjEwMSksIAorICBXVEMxKDB4ODk1ODY5MDEpLCBXVEMxKDB4ODk4YjgzMDEpLCBXVEMxKDB4ODliZWU1ODEpLCBXVEMxKDB4ODlmMjYxMDEpLCBXVEMxKDB4OGEyNWYzMDEpLCBXVEMxKDB4OGE1OTlhODEpLCBXVEMxKDB4OGE4ZDU4MDEpLCBXVEMxKDB4OGFjMTMzODEpLCAKKyAgV1RDMSgweDhhZjUzZTgxKSwgV1RDMSgweDhiMjk4YjgxKSwgV1RDMSgweDhiNWUyYzgxKSwgV1RDMSgweDhiOTMzMDAxKSwgV1RDMSgweDhiYzhhNDAxKSwgV1RDMSgweDhiZmU5NDAxKSwgV1RDMSgweDhjMzUwZDAxKSwgV1RDMSgweDhjNmMxYjAxKSwgCisgIFdUQzEoMHg4Y2EzY2IwMSksIFdUQzEoMHg4Y2RjMjkwMSksIFdUQzEoMHg4ZDE1NDA4MSksIFdUQzEoMHg4ZDRmMWIwMSksIFdUQzEoMHg4ZDg5YmU4MSksIFdUQzEoMHg4ZGM1MzAwMSksIFdUQzEoMHg4ZTAxNzU4MSksIFdUQzEoMHg4ZTNlOTQ4MSksIAorICBXVEMxKDB4OGU3YzkzMDEpLCBXVEMxKDB4OGViYjc1ODEpLCBXVEMxKDB4OGVmYjQxODEpLCBXVEMxKDB4OGYzYmZiMDEpLCBXVEMxKDB4OGY3ZGE0MDEpLCBXVEMxKDB4OGZjMDNmMDEpLCBXVEMxKDB4OTAwM2NlODEpLCBXVEMxKDB4OTA0ODU0MDEpLCAKKyAgV1RDMSgweDkwOGRkMTAxKSwgV1RDMSgweDkwZDQ0NzgxKSwgV1RDMSgweDkxMWJiOTgxKSwgV1RDMSgweDkxNjQyNzgxKSwgV1RDMSgweDkxYWQ5MjgxKSwgV1RDMSgweDkxZjdmOTgxKSwgV1RDMSgweDkyNDM1ZDAxKSwgV1RDMSgweDkyOGZiZTAxKSwgCisgIFdUQzEoMHg5MmRkMWIwMSksIFdUQzEoMHg5MzJiNzUwMSksIFdUQzEoMHg5MzdhY2IwMSksIFdUQzEoMHg5M2NiMWM4MSksIFdUQzEoMHg5NDFjNjkwMSksIFdUQzEoMHg5NDZlYWY4MSksIFdUQzEoMHg5NGMxZWUwMSksIFdUQzEoMHg5NTE2MjM4MSksIAorICBXVEMxKDB4OTU2YjRmODEpLCBXVEMxKDB4OTVjMTcwODEpLCBXVEMxKDB4OTYxODg1MDEpLCBXVEMxKDB4OTY3MDhiODEpLCBXVEMxKDB4OTZjOTgzODEpLCBXVEMxKDB4OTcyMzZiMDEpLCBXVEMxKDB4OTc3ZTQxODEpLCBXVEMxKDB4OTdkYTA0ODEpLCAKKyAgV1RDMSgweDk4MzZiMjAxKSwgV1RDMSgweDk4OTQ0OTAxKSwgV1RDMSgweDk4ZjJjNjAxKSwgV1RDMSgweDk5NTIyODAxKSwgV1RDMSgweDk5YjI2YzgxKSwgV1RDMSgweDlhMTM5MTAxKSwgV1RDMSgweDlhNzU5MzAxKSwgV1RDMSgweDlhZDg3MDgxKSwgCisgIFdUQzEoMHg5YjNjMjgwMSksIFdUQzEoMHg5YmEwYjcwMSksIFdUQzEoMHg5YzA2MWI4MSksIFdUQzEoMHg5YzZjNTQ4MSksIFdUQzEoMHg5Y2QzNWY4MSksIFdUQzEoMHg5ZDNiM2I4MSksIFdUQzEoMHg5ZGEzZTYwMSksIFdUQzEoMHg5ZTBkNWUwMSksIAorICBXVEMxKDB4OWU3NzlmODEpLCBXVEMxKDB4OWVlMmE5MDEpLCBXVEMxKDB4OWY0ZTc4MDEpLCBXVEMxKDB4OWZiYjA5ODEpLCBXVEMxKDB4YTAyODVkODEpLCBXVEMxKDB4YTA5NjcyMDEpLCBXVEMxKDB4YTEwNTQ3MDEpLCBXVEMxKDB4YTE3NGRhODEpLCAKKyAgV1RDMSgweGExZTUyYTgxKSwgV1RDMSgweGEyNTYzNTAxKSwgV1RDMSgweGEyYzdmODAxKSwgV1RDMSgweGEzM2E3MjAxKSwgV1RDMSgweGEzYWRhMjgxKSwgV1RDMSgweGE0MjE4ODAxKSwgV1RDMSgweGE0OTYyMTgxKSwgV1RDMSgweGE1MGI2ZTgxKSwgCisgIFdUQzEoMHhhNTgxNmU4MSksIFdUQzEoMHhhNWY4MWY4MSksIFdUQzEoMHhhNjZmODIwMSksIFdUQzEoMHhhNmU3OTQwMSksIFdUQzEoMHhhNzYwNTYwMSksIFdUQzEoMHhhN2Q5YzY4MSksIFdUQzEoMHhhODUzZTUwMSksIFdUQzEoMHhhOGNlYjIwMSksIAorICBXVEMxKDB4YTk0YTJjMDEpLCBXVEMxKDB4YTljNjU0MDEpLCBXVEMxKDB4YWE0MzI5ODEpLCBXVEMxKDB4YWFjMGFkMDEpLCBXVEMxKDB4YWIzZWRmMDEpLCBXVEMxKDB4YWJiZGMwMDEpLCBXVEMxKDB4YWMzZDUwMDEpLCBXVEMxKDB4YWNiZDkwODEpLCAKKyAgV1RDMSgweGFkM2U4MTAxKSwgV1RDMSgweGFkYzAyMjgxKSwgV1RDMSgweGFlNDI3NDgxKSwgV1RDMSgweGFlYzU3ODAxKSwgV1RDMSgweGFmNDkyZjAxKSwgV1RDMSgweGFmY2Q5YTgxKSwgV1RDMSgweGIwNTJiYzAxKSwgV1RDMSgweGIwZDg5NDAxKSwgCisgIFdUQzEoMHhiMTVmMjM4MSksIFdUQzEoMHhiMWU2NmEwMSksIFdUQzEoMHhiMjZlNjg4MSksIFdUQzEoMHhiMmY3MWYwMSksIFdUQzEoMHhiMzgwOGQ4MSksIFdUQzEoMHhiNDBhYjUwMSksIFdUQzEoMHhiNDk1OTUwMSksIFdUQzEoMHhiNTIxMmU4MSksIAorICBXVEMxKDB4NGE2Y2Y2N2YpLCBXVEMxKDB4NDlkZmZlZmYpLCBXVEMxKDB4NDk1MjY1ZmYpLCBXVEMxKDB4NDhjNDI3N2YpLCBXVEMxKDB4NDgzNTQwN2YpLCBXVEMxKDB4NDdhNWFlZmYpLCBXVEMxKDB4NDcxNTcwZmYpLCBXVEMxKDB4NDY4NDg0ZmYpLCAKKyAgV1RDMSgweDQ1ZjJlYWZmKSwgV1RDMSgweDQ1NjBhMmZmKSwgV1RDMSgweDQ0Y2RhZDdmKSwgV1RDMSgweDQ0M2EwYzdmKSwgV1RDMSgweDQzYTVjMDdmKSwgV1RDMSgweDQzMTBjYWZmKSwgV1RDMSgweDQyN2IyYmZmKSwgV1RDMSgweDQxZTRlM2ZmKSwgCisgIFdUQzEoMHg0MTRkZjJmZiksIFdUQzEoMHg0MGI2NTU3ZiksIFdUQzEoMHg0MDFlMDZmZiksIFdUQzEoMHgzZjg1MDNjMCksIFdUQzEoMHgzZWViNGUwMCksIFdUQzEoMHgzZTUwZWJjMCksIFdUQzEoMHgzZGI1ZTY4MCksIFdUQzEoMHgzZDFhNDY4MCksIAorICBXVEMxKDB4M2M3ZTEwYzApLCBXVEMxKDB4M2JlMTRjYzApLCBXVEMxKDB4M2I0NDAyYzApLCBXVEMxKDB4M2FhNjM4MDApLCBXVEMxKDB4M2EwN2U4NDApLCBXVEMxKDB4Mzk2OTA4ODApLCBXVEMxKDB4MzhjOTg3MDApLCBXVEMxKDB4MzgyOTViNDApLCAKKyAgV1RDMSgweDM3ODg4YTgwKSwgV1RDMSgweDM2ZTcxZDQwKSwgV1RDMSgweDM2NDUxZDgwKSwgV1RDMSgweDM1YTI5NDAwKSwgV1RDMSgweDM0ZmY4ODAwKSwgV1RDMSgweDM0NWMwNGMwKSwgV1RDMSgweDMzYjgxOTQwKSwgV1RDMSgweDMzMTNkMjAwKSwgCisgIFdUQzEoMHgzMjZmMzgwMCksIFdUQzEoMHgzMWNhNTYwMCksIFdUQzEoMHgzMTI1Mzg0MCksIFdUQzEoMHgzMDdmZThjMCksIFdUQzEoMHgyZmRhNmU0MCksIFdUQzEoMHgyZjM0Y2U0MCksIFdUQzEoMHgyZThmMGU0MCksIFdUQzEoMHgyZGU5MmVjMCksIAorICBXVEMxKDB4MmQ0MzI3ODApLCBXVEMxKDB4MmM5Y2VhNDApLCBXVEMxKDB4MmJmNjYzMDApLCBXVEMxKDB4MmI0Zjg4YzApLCBXVEMxKDB4MmFhODY0YzApLCBXVEMxKDB4MmEwMTAyNDApLCBXVEMxKDB4Mjk1OTZlNDApLCBXVEMxKDB4MjhiMWJhODApLCAKKyAgV1RDMSgweDI4MDlmZjQwKSwgV1RDMSgweDI3NjI1YjgwKSwgV1RDMSgweDI2YmFmNTgwKSwgV1RDMSgweDI2MTNlN2MwKSwgV1RDMSgweDI1NmQzZGMwKSwgV1RDMSgweDI0YzcwMzAwKSwgV1RDMSgweDI0MjE0MzgwKSwgV1RDMSgweDIzN2MwODAwKSwgCisgIFdUQzEoMHgyMmQ3NTQwMCksIFdUQzEoMHgyMjMzMmE4MCksIFdUQzEoMHgyMThmOGNjMCksIFdUQzEoMHgyMGVjN2U0MCksIFdUQzEoMHgyMDRhMDRjMCksIFdUQzEoMHgxZmE4MjU0MCksIFdUQzEoMHgxZjA2ZTMwMCksIFdUQzEoMHgxZTY2NDAwMCksIAorICBXVEMxKDB4MWRjNjNiYzApLCBXVEMxKDB4MWQyNmQzYzApLCBXVEMxKDB4MWM4ODAzYTApLCBXVEMxKDB4MWJlOWNjNDApLCBXVEMxKDB4MWI0YzM0YzApLCBXVEMxKDB4MWFhZjQ0ODApLCBXVEMxKDB4MWExMzAyNjApLCBXVEMxKDB4MTk3Nzc0YTApLCAKKyAgV1RDMSgweDE4ZGNhMjYwKSwgV1RDMSgweDE4NDI5NGUwKSwgV1RDMSgweDE3YTk1ODQwKSwgV1RDMSgweDE3MTBmZDgwKSwgV1RDMSgweDE2Nzk5Y2UwKSwgV1RDMSgweDE1ZTM1MzQwKSwgV1RDMSgweDE1NGU0MWEwKSwgV1RDMSgweDE0YmE4MzYwKSwgCisgIFdUQzEoMHgxNDI4MmJlMCksIFdUQzEoMHgxMzk3NTEwMCksIFdUQzEoMHgxMzA4MGFhMCksIFdUQzEoMHgxMjdhNjI0MCksIFdUQzEoMHgxMWVlNTBhMCksIFdUQzEoMHgxMTYzY2M4MCksIFdUQzEoMHgxMGRhY2IyMCksIFdUQzEoMHgxMDUzMzNhMCksIAorICBXVEMxKDB4MGZjY2RiMzApLCBXVEMxKDB4MGY0NzhmNDApLCBXVEMxKDB4MGVjMzE3MDApLCBXVEMxKDB4MGUzZjRlODApLCBXVEMxKDB4MGRiYzI3ZjApLCBXVEMxKDB4MGQzOTkwMDApLCBXVEMxKDB4MGNiNzZkMDApLCBXVEMxKDB4MGMzNTlkNTApLCAKKyAgV1RDMSgweDBiYjNmZDUwKSwgV1RDMSgweDBiMzI2YmQwKSwgV1RDMSgweDBhYjBjYTgwKSwgV1RDMSgweDBhMmYwZGMwKSwgV1RDMSgweDA5YWQ0MGMwKSwgV1RDMSgweDA5MmI3YTkwKSwgV1RDMSgweDA4YTlkYjgwKSwgV1RDMSgweDA4Mjg1YzgwKSwgCisgIFdUQzEoMHgwN2E2YzdiOCksIFdUQzEoMHgwNzI0ZTRlMCksIFdUQzEoMHgwNmEyN2I4MCksIFdUQzEoMHgwNjFmNTJmOCksIFdUQzEoMHgwNTliMmFkMCksIFdUQzEoMHgwNTE1YjU2OCksIFdUQzEoMHgwNDhlYTA1OCksIFdUQzEoMHgwNDA2NjQwOCksIAorICBXVEMxKDB4MDM3ZTUyZDgpLCBXVEMxKDB4MDJmN2QzYzgpLCBXVEMxKDB4MDI3NDYxNGMpLCBXVEMxKDB4MDFmNjMwMDgpLCBXVEMxKDB4MDE4MDQwM2EpLCBXVEMxKDB4MDExNWM0NDIpLCBXVEMxKDB4MDBiYTA5ZTIpLCBXVEMxKDB4MDA2ZjA3N2MpLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIC8qIHBhcnQgMiAqLworICBXVEMyKDB4ZmZmMzZiZTEpLCBXVEMyKDB4ZmZkYWZiYzEpLCBXVEMyKDB4ZmZjMjgwMzUpLCBXVEMyKDB4ZmZhOWZlOGEpLCBXVEMyKDB4ZmY5MTdjMDgpLCBXVEMyKDB4ZmY3OGZkZmMpLCBXVEMyKDB4ZmY2MDg5YWYpLCBXVEMyKDB4ZmY0ODI0NmMpLCAKKyAgV1RDMigweGZmMmZkMzdmKSwgV1RDMigweGZmMTc5YzMxKSwgV1RDMigweGZlZmY4M2I2KSwgV1RDMigweGZlZTc4ZDE4KSwgV1RDMigweGZlY2ZiOTNlKSwgV1RDMigweGZlYjgwOGYyKSwgV1RDMigweGZlYTA3ZDA2KSwgV1RDMigweGZlODkxNmI0KSwgCisgIFdUQzIoMHhmZTcxZDdhMCksIFdUQzIoMHhmZTVhYzE3NCksIFdUQzIoMHhmZTQzZDVkNiksIFdUQzIoMHhmZTJkMTY3ZSksIFdUQzIoMHhmZTE2ODUyZSksIFdUQzIoMHhmZTAwMjNhNiksIFdUQzIoMHhmZGU5ZjNmOCksIFdUQzIoMHhmZGQzZmY3YyksIAorICBXVEMyKDB4ZmRiZTU2YzApLCBXVEMyKDB4ZmRhOTBhYTgpLCBXVEMyKDB4ZmQ5NDJiNzgpLCBXVEMyKDB4ZmQ3ZmJiMjApLCBXVEMyKDB4ZmQ2YmFkNTApLCBXVEMyKDB4ZmQ1N2Y1MTApLCBXVEMyKDB4ZmQ0NDg1N2MpLCBXVEMyKDB4ZmQzMTUzZmMpLCAKKyAgV1RDMigweGZkMWU1ODQwKSwgV1RDMigweGZkMGI4YTBjKSwgV1RDMigweGZjZjhlMTgwKSwgV1RDMigweGZjZTY1ZWVjKSwgV1RDMigweGZjZDQwYWQwKSwgV1RDMigweGZjYzFlZTBjKSwgV1RDMigweGZjYjAxMWU4KSwgV1RDMigweGZjOWU4OTZjKSwgCisgIFdUQzIoMHhmYzhkNzE2YyksIFdUQzIoMHhmYzdjZTcyMCksIFdUQzIoMHhmYzZkMDcyYyksIFdUQzIoMHhmYzVkZTA5YyksIFdUQzIoMHhmYzRmNzRlOCksIFdUQzIoMHhmYzQxYzRlOCksIFdUQzIoMHhmYzM0ZDBkYyksIFdUQzIoMHhmYzI4OGE2OCksIAorICBXVEMyKDB4ZmMxY2Q0OWMpLCBXVEMyKDB4ZmMxMTkxZTApLCBXVEMyKDB4ZmMwNmE0ZDApLCBXVEMyKDB4ZmJmYmYzZTgpLCBXVEMyKDB4ZmJmMTY5OTApLCBXVEMyKDB4ZmJlNmYwNjgpLCBXVEMyKDB4ZmJkYzc0MjgpLCBXVEMyKDB4ZmJkMWZjNjgpLCAKKyAgV1RDMigweGZiYzdhYzUwKSwgV1RDMigweGZiYmRhODY4KSwgV1RDMigweGZiYjQxNTAwKSwgV1RDMigweGZiYWIxNDM4KSwgV1RDMigweGZiYTJjNWY4KSwgV1RDMigweGZiOWI0YTAwKSwgV1RDMigweGZiOTRiZmE4KSwgV1RDMigweGZiOGYzYjQ4KSwgCisgIFdUQzIoMHhmYjhhYzYzOCksIFdUQzIoMHhmYjg3Njk3MCksIFdUQzIoMHhmYjg1MmQyMCksIFdUQzIoMHhmYjg0MGFlMCksIFdUQzIoMHhmYjgzZWQ2MCksIFdUQzIoMHhmYjg0YmVjMCksIFdUQzIoMHhmYjg2NjkxOCksIFdUQzIoMHhmYjg4ZDRhOCksIAorICBXVEMyKDB4ZmI4YmU4MTApLCBXVEMyKDB4ZmI4Zjg5ZDApLCBXVEMyKDB4ZmI5M2EwODApLCBXVEMyKDB4ZmI5ODE0MTgpLCBXVEMyKDB4ZmI5Y2NkZjApLCBXVEMyKDB4ZmJhMWI3NzApLCBXVEMyKDB4ZmJhNmJhZTApLCBXVEMyKDB4ZmJhYmQ1YzApLCAKKyAgV1RDMigweGZiYjExOGQ4KSwgV1RDMigweGZiYjY5NWMwKSwgV1RDMigweGZiYmM1ZTkwKSwgV1RDMigweGZiYzI5MDMwKSwgV1RDMigweGZiYzk1MjY4KSwgV1RDMigweGZiZDBjZDc4KSwgV1RDMigweGZiZDkyOWM4KSwgV1RDMigweGZiZTI5NGQwKSwgCisgIFdUQzIoMHhmYmVkNDEwOCksIFdUQzIoMHhmYmY5NjExOCksIFdUQzIoMHhmYzA3MjZjOCksIFdUQzIoMHhmYzE2YjA2NCksIFdUQzIoMHhmYzI4MDg5MCksIFdUQzIoMHhmYzNiMzkyMCksIFdUQzIoMHhmYzUwNGE5OCksIFdUQzIoMHhmYzY3MjcxYyksIAorICBXVEMyKDB4ZmM3ZjlhNzQpLCBXVEMyKDB4ZmM5OTZmMTgpLCBXVEMyKDB4ZmNiNDZlYjgpLCBXVEMyKDB4ZmNkMDUwYjApLCBXVEMyKDB4ZmNlY2JhMjQpLCBXVEMyKDB4ZmQwOTRmNjQpLCBXVEMyKDB4ZmQyNWI3MjApLCBXVEMyKDB4ZmQ0MWNlNDApLCAKKyAgV1RDMigweGZkNWRhN2Y4KSwgV1RDMigweGZkNzk1OWQ4KSwgV1RDMigweGZkOTRmYjc0KSwgV1RDMigweGZkYjBkM2ZjKSwgV1RDMigweGZkY2Q1YTM0KSwgV1RDMigweGZkZWIwNmU0KSwgV1RDMigweGZlMGE1MTg0KSwgV1RDMigweGZlMmI5MmM0KSwgCisgIFdUQzIoMHhmZTRmMDQ4NiksIFdUQzIoMHhmZTc0ZGY1NCksIFdUQzIoMHhmZTlkNTg4NiksIFdUQzIoMHhmZWM4NWI5MiksIFdUQzIoMHhmZWY1OGExNiksIFdUQzIoMHhmZjI0ODI3NSksIFdUQzIoMHhmZjU0ZTQwMSksIFdUQzIoMHhmZjg2NjMzMCksIAorICBXVEMyKDB4ZmZiOGM5OWIpLCBXVEMyKDB4ZmZlYmUxYzkpLCBXVEMyKDB4MDAxZjc4NmEpLCBXVEMyKDB4MDA1MzhiZjkpLCBXVEMyKDB4MDA4ODRjYmMpLCBXVEMyKDB4MDBiZGVkMjMpLCBXVEMyKDB4MDBmNDlmNTQpLCBXVEMyKDB4MDEyYzhlZTQpLCAKKyAgV1RDMigweDAxNjVlMGQyKSwgV1RDMigweDAxYTBiOWQ2KSwgV1RDMigweDAxZGQzZDgwKSwgV1RDMigweDAyMWI3NGQ0KSwgV1RDMigweDAyNWI0ZTQ4KSwgV1RDMigweDAyOWNiNzMwKSwgV1RDMigweDAyZGY5ZDBjKSwgV1RDMigweDAzMjNmMWE0KSwgCisgIFdUQzIoMHgwMzY5YWIwMCksIFdUQzIoMHgwM2IwYmY1YyksIFdUQzIoMHgwM2Y5MjVhMCksIFdUQzIoMHgwNDQyZTNkOCksIFdUQzIoMHgwNDhlMGY0MCksIFdUQzIoMHgwNGRhYmRiMCksIFdUQzIoMHgwNTI5MDQzMCksIFdUQzIoMHgwNTc4ZTQyOCksIAorICBXVEMyKDB4MDVjYTRiNjApLCBXVEMyKDB4MDYxZDI2YzApLCBXVEMyKDB4MDY3MTYzZDgpLCBXVEMyKDB4MDZjNmZmMTApLCBXVEMyKDB4MDcxZTAzYjApLCBXVEMyKDB4MDc3NjdkYTApLCBXVEMyKDB4MDdkMDc5MTgpLCBXVEMyKDB4MDgyYzA4ZTApLCAKKyAgV1RDMigweDA4ODk0NjYwKSwgV1RDMigweDA4ZTg0YjcwKSwgV1RDMigweDA5NDkzMGIwKSwgV1RDMigweDA5YWJmOGQwKSwgV1RDMigweDBhMTA5MDIwKSwgV1RDMigweDBhNzZlMjEwKSwgV1RDMigweDBhZGVkYTUwKSwgV1RDMigweDBiNDg2YjgwKSwgCisgIFdUQzIoMHgwYmIzOGYwMCksIFdUQzIoMHgwYzIwM2U4MCksIFdUQzIoMHgwYzhlNzNlMCksIFdUQzIoMHgwY2ZlMmMzMCksIFdUQzIoMHgwZDZmNjgyMCksIFdUQzIoMHgwZGUyMjg1MCksIFdUQzIoMHgwZTU2NmQ5MCksIFdUQzIoMHgwZWNjM2RkMCksIAorICBXVEMyKDB4MGY0M2EzYTApLCBXVEMyKDB4MGZiY2E5ZjApLCBXVEMyKDB4MTAzNzViODApLCBXVEMyKDB4MTBiM2JlMjApLCBXVEMyKDB4MTEzMWQyODApLCBXVEMyKDB4MTFiMTk5NjApLCBXVEMyKDB4MTIzMzEzYTApLCBXVEMyKDB4MTJiNjQzODApLCAKKyAgV1RDMigweDEzM2IyZDAwKSwgV1RDMigweDEzYzFkNDQwKSwgV1RDMigweDE0NGEzZDYwKSwgV1RDMigweDE0ZDQ2OTAwKSwgV1RDMigweDE1NjA1NDgwKSwgV1RDMigweDE1ZWRmZDIwKSwgV1RDMigweDE2N2Q2MDQwKSwgV1RDMigweDE3MGU3ZTgwKSwgCisgIFdUQzIoMHgxN2ExNWI4MCksIFdUQzIoMHgxODM1ZmIwMCksIFdUQzIoMHgxOGNjNjBhMCksIFdUQzIoMHgxOTY0OGRjMCksIFdUQzIoMHgxOWZlODBlMCksIFdUQzIoMHgxYTlhMzhhMCksIFdUQzIoMHgxYjM3YjNlMCksIFdUQzIoMHgxYmQ2ZjQwMCksIAorICBXVEMyKDB4MWM3N2ZkMjApLCBXVEMyKDB4MWQxYWQ0MDApLCBXVEMyKDB4MWRiZjdjODApLCBXVEMyKDB4MWU2NWY4MjApLCBXVEMyKDB4MWYwZTQ1NDApLCBXVEMyKDB4MWZiODYxZTApLCBXVEMyKDB4MjA2NDRjYzApLCBXVEMyKDB4MjExMjA2NDApLCAKKyAgV1RDMigweDIxYzE5MjQwKSwgV1RDMigweDIyNzJmNDgwKSwgV1RDMigweDIzMjYzMDAwKSwgV1RDMigweDIzZGI0NTgwKSwgV1RDMigweDI0OTIzMzQwKSwgV1RDMigweDI1NGFmNzAwKSwgV1RDMigweDI2MDU4ZTgwKSwgV1RDMigweDI2YzFmYTAwKSwgCisgIFdUQzIoMHgyNzgwM2QwMCksIFdUQzIoMHgyODQwNWE0MCksIFdUQzIoMHgyOTAyNTUwMCksIFdUQzIoMHgyOWM2MmQ0MCksIFdUQzIoMHgyYThiZTBjMCksIFdUQzIoMHgyYjUzNmNjMCksIFdUQzIoMHgyYzFjY2Y4MCksIFdUQzIoMHgyY2U4MDg0MCksIAorICBXVEMyKDB4MmRiNTE5YzApLCBXVEMyKDB4MmU4NDA2MDApLCBXVEMyKDB4MmY1NGNmODApLCBXVEMyKDB4MzAyNzc1YzApLCBXVEMyKDB4MzBmYmY2NDApLCBXVEMyKDB4MzFkMjRlMDApLCBXVEMyKDB4MzJhYTdhMDApLCBXVEMyKDB4MzM4NDc5YzApLCAKKyAgV1RDMigweDM0NjA0ZTQwKSwgV1RDMigweDM1M2RmOTAwKSwgV1RDMigweDM2MWQ3YWMwKSwgV1RDMigweDM2ZmVkMjAwKSwgV1RDMigweDM3ZTFmYjQwKSwgV1RDMigweDM4YzZmMjQwKSwgV1RDMigweDM5YWRiMmMwKSwgV1RDMigweDNhOTYzYTAwKSwgCisgIFdUQzIoMHgzYjgwODc0MCksIFdUQzIoMHgzYzZjOTg4MCksIFdUQzIoMHgzZDVhNmNjMCksIFdUQzIoMHgzZTRhMDA0MCksIFdUQzIoMHgzZjNiNGJjMCksIFdUQzIoMHg0MDJlNDhmZiksIFdUQzIoMHg0MTIyZjE3ZiksIFdUQzIoMHg0MjE5M2Y3ZiksIAorICBXVEMyKDB4NDMxMTJlZmYpLCBXVEMyKDB4NDQwYWJiZmYpLCBXVEMyKDB4NDUwNWUyZmYpLCBXVEMyKDB4NDYwMjllN2YpLCBXVEMyKDB4NDcwMGU5ZmYpLCBXVEMyKDB4NDgwMGJmZmYpLCBXVEMyKDB4NDkwMjFiZmYpLCBXVEMyKDB4NGEwNTBlZmYpLCAKKyAgV1RDMigweDRiMDliYzdmKSwgV1RDMigweDRjMTA0YWZmKSwgV1RDMigweDRkMThkZjdmKSwgV1RDMigweDRlMjNhMDdmKSwgV1RDMigweDRmMzBiMmZmKSwgV1RDMigweDUwNDAzYzdmKSwgV1RDMigweDUxNTI2MmZmKSwgV1RDMigweDUyNjc0YjdmKSwgCisgIFdUQzIoMHgwMDE2NzhiMiksIFdUQzIoMHgwMDA2MWEzYiksIFdUQzIoMHhmZmZiNDYyMiksIFdUQzIoMHhmZmY1ZWE5NCksIFdUQzIoMHhmZmY1ZjViOSksIFdUQzIoMHhmZmZiNTViZCksIFdUQzIoMHgwMDA1ZjhjYiksIFdUQzIoMHgwMDE1Y2QwYyksIAorICBXVEMyKDB4MDAyYWMwYWMpLCBXVEMyKDB4MDA0NGMxZDUpLCBXVEMyKDB4MDA2M2JlYjIpLCBXVEMyKDB4MDA4N2E1NmQpLCBXVEMyKDB4MDBiMDY0MzEpLCBXVEMyKDB4MDBkZGU5MjkpLCBXVEMyKDB4MDExMDIyODApLCBXVEMyKDB4MDE0NmZlNWUpLCAKKyAgV1RDMigweDAxODI2YWYyKSwgV1RDMigweDAxYzI1NjYyKSwgV1RDMigweDAyMDZhZWRjKSwgV1RDMigweDAyNGY2Mjg4KSwgV1RDMigweDAyOWM1Zjk0KSwgV1RDMigweDAyZWQ5NDI0KSwgV1RDMigweDAzNDJlZTZjKSwgV1RDMigweDAzOWM1YzkwKSwgCisgIFdUQzIoMHgwM2Y5Y2NiYyksIFdUQzIoMHgwNDViMmQxOCksIFdUQzIoMHgwNGMwNmJkOCksIFdUQzIoMHgwNTI5NzcxOCksIFdUQzIoMHgwNTk2M2QxMCksIFdUQzIoMHgwNjA2YWJlOCksIFdUQzIoMHgwNjdhYjFjMCksIFdUQzIoMHgwNmYyM2NkMCksIAorICBXVEMyKDB4MDc2ZDNiNDApLCBXVEMyKDB4MDdlYjliMzgpLCBXVEMyKDB4MDg2ZDRhZTApLCBXVEMyKDB4MDhmMjM4NjApLCBXVEMyKDB4MDk3YTUxZjApLCBXVEMyKDB4MGEwNTg1YjApLCBXVEMyKDB4MGE5M2MxZDApLCBXVEMyKDB4MGIyNGY0NzApLCAKKyAgV1RDMigweDBiYjkwYmMwKSwgV1RDMigweDBjNGZmNWYwKSwgV1RDMigweDBjZTlhMTMwKSwgV1RDMigweDBkODVmYjkwKSwgV1RDMigweDBlMjRmMzYwKSwgV1RDMigweDBlYzY3NmIwKSwgV1RDMigweDBmNmE3M2IwKSwgV1RDMigweDEwMTBkODgwKSwgCisgIFdUQzIoMHgxMGI5OTM2MCksIFdUQzIoMHgxMTY0OTI4MCksIFdUQzIoMHgxMjExYzQwMCksIFdUQzIoMHgxMmMxMTVlMCksIFdUQzIoMHgxMzcyNzZhMCksIFdUQzIoMHgxNDI1ZDQyMCksIFdUQzIoMHgxNGRiMWNhMCksIFdUQzIoMHgxNTkyM2U2MCksIAorICBXVEMyKDB4MTY0YjI3ODApLCBXVEMyKDB4MTcwNWM2MjApLCBXVEMyKDB4MTdjMjA4NjApLCBXVEMyKDB4MTg3ZmRjYTApLCBXVEMyKDB4MTkzZjMwZTApLCBXVEMyKDB4MTlmZmYzNDApLCBXVEMyKDB4MWFjMjEyMDApLCBXVEMyKDB4MWI4NTdiNDApLCAKKyAgV1RDMigweDFjNGExZDQwKSwgV1RDMigweDFkMGZlNjAwKSwgV1RDMigweDFkZDZjM2UwKSwgV1RDMigweDFlOWVhNGUwKSwgV1RDMigweDFmNjc3NzQwKSwgV1RDMigweDIwMzEyOTQwKSwgV1RDMigweDIwZmJhOGMwKSwgV1RDMigweDIxYzZlNDQwKSwgCisgIFdUQzIoMHgyMjkyYzljMCksIFdUQzIoMHgyMzVmNDc4MCksIFdUQzIoMHgyNDJjNGI4MCksIFdUQzIoMHgyNGY5YzQwMCksIFdUQzIoMHgyNWM3OWY0MCksIFdUQzIoMHgyNjk1Y2I0MCksIFdUQzIoMHgyNzY0MzY4MCksIFdUQzIoMHgyODMyY2VjMCksIAorICBXVEMyKDB4MjkwMTgyNDApLCBXVEMyKDB4MjlkMDNmODApLCBXVEMyKDB4MmE5ZWY0ODApLCBXVEMyKDB4MmI2ZDhmMDApLCBXVEMyKDB4MmMzYmZkYzApLCBXVEMyKDB4MmQwYTJlYzApLCBXVEMyKDB4MmRkODEwMDApLCBXVEMyKDB4MmVhNThmYzApLCAKKyAgV1RDMigweDJmNzI5YzQwKSwgV1RDMigweDMwM2YyMzgwKSwgV1RDMigweDMxMGIxNDAwKSwgV1RDMigweDMxZDY1YjgwKSwgV1RDMigweDMyYTBlODQwKSwgV1RDMigweDMzNmFhOGMwKSwgV1RDMigweDM0MzM4YWMwKSwgV1RDMigweDM0ZmI3Y2MwKSwgCisgIFdUQzIoMHgzNWMyNmNjMCksIFdUQzIoMHgzNjg4NDkwMCksIFdUQzIoMHgzNzRjZmY4MCksIFdUQzIoMHgzODEwN2U4MCksIFdUQzIoMHgzOGQyYjQ0MCksIFdUQzIoMHgzOTkzOGVjMCksIFdUQzIoMHgzYTUyZmM0MCksIFdUQzIoMHgzYjEwZWIwMCksIAorICBXVEMyKDB4M2JjZDQ5MDApLCBXVEMyKDB4M2M4ODA0ODApLCBXVEMyKDB4M2Q0MTBiYzApLCBXVEMyKDB4M2RmODRkMDApLCBXVEMyKDB4M2VhZGI2MDApLCBXVEMyKDB4M2Y2MTM1NDApLCBXVEMyKDB4NDAxMmI4ZmYpLCBXVEMyKDB4NDBjMjJlZmYpLCAKKyAgV1RDMigweDQxNmY4NWZmKSwgV1RDMigweDQyMWFhYjdmKSwgV1RDMigweDQyYzM4ZTdmKSwgV1RDMigweDQzNmExYzdmKSwgV1RDMigweDQ0MGU0MzdmKSwgV1RDMigweDQ0YWZmMjdmKSwgV1RDMigweDQ1NGYxNjdmKSwgV1RDMigweDQ1ZWI5ZWZmKSwgCisgIFdUQzIoMHg0Njg1NzhmZiksIFdUQzIoMHg0NzFjOTM3ZiksIFdUQzIoMHg0N2IwZGM3ZiksIFdUQzIoMHg0ODQyNDFmZiksIFdUQzIoMHg0OGQwYjFmZiksIFdUQzIoMHg0OTVjMWE3ZiksIFdUQzIoMHg0OWU0NmE3ZiksIFdUQzIoMHg0YTY5OGY3ZiksIAorICBXVEMyKDB4NGFlYjc3ZmYpLCBXVEMyKDB4NGI2YTExZmYpLCBXVEMyKDB4NGJlNTRiN2YpLCBXVEMyKDB4NGM1ZDEyZmYpLCBXVEMyKDB4NGNkMTU1ZmYpLCBXVEMyKDB4NGQ0MjAzZmYpLCBXVEMyKDB4NGRhZjA5ZmYpLCBXVEMyKDB4NGUxODU2N2YpLCAKKyAgV1RDMigweDRlN2RkNzdmKSwgV1RDMigweDRlZGY3YjdmKSwgV1RDMigweDRmM2QzMDdmKSwgV1RDMigweDRmOTZlNDdmKSwgV1RDMigweDRmZWM4NWZmKSwgV1RDMigweDUwM2UwMmZmKSwgV1RDMigweDUwOGI0OTdmKSwgV1RDMigweDUwZDQ0N2ZmKSwgCisgIFdUQzIoMHg1MTE4ZWM3ZiksIFdUQzIoMHg1MTU5MjRmZiksIFdUQzIoMHg1MTk0ZGZmZiksIFdUQzIoMHg1MWNjMGI3ZiksIFdUQzIoMHg1MWZlOTVmZiksIFdUQzIoMHg1MjJjNmNmZiksIFdUQzIoMHg1MjU1N2VmZiksIFdUQzIoMHg1Mjc5YjlmZiksIAorICBXVEMyKDB4NTI5OTBjN2YpLCBXVEMyKDB4NTJiMzY0ZmYpLCBXVEMyKDB4NTJjOGIwN2YpLCBXVEMyKDB4NTJkOGRkZmYpLCBXVEMyKDB4NTJlM2RiN2YpLCBXVEMyKDB4NTJlOTk2ZmYpLCBXVEMyKDB4NTJlOWZmN2YpLCBXVEMyKDB4NTJlNTAxZmYpLCAKKyAgV1RDMigweDUyZGE4Y2ZmKSwgV1RDMigweDUyY2E4ZjdmKSwgV1RDMigweDUyYjRmNjdmKSwgV1RDMigweDUyOTliMDdmKSwgV1RDMigweDUyNzhhYzdmKSwgV1RDMigweDUyNTFkNzdmKSwgV1RDMigweDUyMjUxZmZmKSwgV1RDMigweDUxZjI3NGZmKSwgCisgIFdUQzIoMHg1MWI5YzM3ZiksIFdUQzIoMHg1MTdhZjlmZiksIFdUQzIoMHg1MTM2MDc3ZiksIFdUQzIoMHg1MGVhZDhmZiksIFdUQzIoMHg1MDk5NWNmZiksIFdUQzIoMHg1MDQxODFmZiksIFdUQzIoMHg0ZmUzMzVmZiksIFdUQzIoMHg0ZjdlNjc3ZiksIAorICBXVEMyKDB4NGYxMzAzZmYpLCBXVEMyKDB4NGVhMGY5ZmYpLCBXVEMyKDB4NGUyODM3ZmYpLCBXVEMyKDB4NGRhOGFiN2YpLCBXVEMyKDB4NGQyMjQyZmYpLCBXVEMyKDB4NGM5NGVjZmYpLCBXVEMyKDB4NGMwMDk2ZmYpLCBXVEMyKDB4NGI2NTJmN2YpLCAKKyAgV1RDMigweDRhYzJhNGZmKSwgV1RDMigweDRhMThlNGZmKSwgV1RDMigweDQ5NjdkZGZmKSwgV1RDMigweDQ4YWY3ZTdmKSwgV1RDMigweDQ3ZWZiM2ZmKSwgV1RDMigweDQ3Mjg2Y2ZmKSwgV1RDMigweDQ2NTlhZDdmKSwgV1RDMigweDQ1ODU2ZjdmKSwgCisgIFdUQzIoMHg0NGFmYTNmZiksIFdUQzIoMHg0M2RjNTA3ZiksIFdUQzIoMHg0MzBmNjU3ZiksIFdUQzIoMHg0MjRhZDQ3ZiksIFdUQzIoMHg0MThlOTI3ZiksIFdUQzIoMHg0MGRhN2JmZiksIFdUQzIoMHg0MDJlNmY3ZiksIFdUQzIoMHgzZjhhMzEwMCksIAorICBXVEMyKDB4M2VlZDZmNDApLCBXVEMyKDB4M2U1N2Q3MDApLCBXVEMyKDB4M2RjOTE0YzApLCBXVEMyKDB4M2Q0MGNjNDApLCBXVEMyKDB4M2NiZTk4YzApLCBXVEMyKDB4M2M0MjE1NDApLCBXVEMyKDB4M2JjYWRiYzApLCBXVEMyKDB4M2I1ODg4ODApLCAKKyAgV1RDMigweDNhZWFiNzgwKSwgV1RDMigweDNhODEwNTQwKSwgV1RDMigweDNhMWIwZTAwKSwgV1RDMigweDM5Yjg2ZDAwKSwgV1RDMigweDM5NThiY2MwKSwgV1RDMigweDM4ZmI5NzAwKSwgV1RDMigweDM4YTA5NWMwKSwgV1RDMigweDM4NDczZDgwKSwgCisgIFdUQzIoMHgzN2VlZmY0MCksIFdUQzIoMHgzNzk3NGI0MCksIFdUQzIoMHgzNzNmOTUwMCksIFdUQzIoMHgzNmU3YWUwMCksIFdUQzIoMHgzNjhmYzRjMCksIFdUQzIoMHgzNjM4MGI4MCksIFdUQzIoMHgzNWUwYjMwMCksIFdUQzIoMHgzNTg5YzE0MCksIAorICBXVEMyKDB4MzUzMzExODApLCBXVEMyKDB4MzRkYzdjODApLCBXVEMyKDB4MzQ4NWRjODApLCBXVEMyKDB4MzQyZjE2MDApLCBXVEMyKDB4MzNkODE3ODApLCBXVEMyKDB4MzM4MGQwYzApLCBXVEMyKDB4MzMyOTMxMDApLCBXVEMyKDB4MzJkMTE4MDApLCAKKyAgV1RDMigweDMyNzg1NzgwKSwgV1RDMigweDMyMWVjMGMwKSwgV1RDMigweDMxYzQyNjgwKSwgV1RDMigweDMxNjg4NWMwKSwgV1RDMigweDMxMGMwNTgwKSwgV1RDMigweDMwYWVjZWMwKSwgV1RDMigweDMwNTEwOTQwKSwgV1RDMigweDJmZjJiOGMwKSwgCisgIFdUQzIoMHgyZjkzYmY0MCksIFdUQzIoMHgyZjMzZmMwMCksIFdUQzIoMHgyZWQzNTBjMCksIFdUQzIoMHgyZTcxYmE4MCksIFdUQzIoMHgyZTBmNTM0MCksIFdUQzIoMHgyZGFjMzVjMCksIFdUQzIoMHgyZDQ4N2M4MCksIFdUQzIoMHgyY2U0MzFjMCksIAorICBXVEMyKDB4MmM3ZjRmYzApLCBXVEMyKDB4MmMxOWQwODApLCBXVEMyKDB4MmJiM2FkODApLCBXVEMyKDB4MmI0Y2UwODApLCBXVEMyKDB4MmFlNTYzNDApLCBXVEMyKDB4MmE3ZDJmODApLCBXVEMyKDB4MmExNDNmMDApLCBXVEMyKDB4MjlhYThiNDApIAorfTsKKworY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXM0ODBbMTQ0MF0gPSB7CisgIFdUQzAoMHhmYWNmYmVmMCksIFdUQzAoMHhmYWI4OGMxOCksIFdUQzAoMHhmYWEwZTUyMCksIFdUQzAoMHhmYTg4ZDExMCksIFdUQzAoMHhmYTcwNTZlOCksIFdUQzAoMHhmYTU3N2RiMCksIFdUQzAoMHhmYTNlNGM3MCksIFdUQzAoMHhmYTI0Y2EyOCksIAorICBXVEMwKDB4ZmEwYWZkZTApLCBXVEMwKDB4ZjlmMGVlYTApLCBXVEMwKDB4ZjlkNmEyYzgpLCBXVEMwKDB4ZjliYzFhYjgpLCBXVEMwKDB4ZjlhMTUyMzApLCBXVEMwKDB4Zjk4NjQ1MTApLCBXVEMwKDB4Zjk2YWYwNTgpLCBXVEMwKDB4Zjk0ZjU1YzApLCAKKyAgV1RDMCgweGY5MzM3OGUwKSwgV1RDMCgweGY5MTc1ZDgwKSwgV1RDMCgweGY4ZmIwNDY4KSwgV1RDMCgweGY4ZGU2OGI4KSwgV1RDMCgweGY4YzE4NDM4KSwgV1RDMCgweGY4YTQ1MGQ4KSwgV1RDMCgweGY4ODZjZGU4KSwgV1RDMCgweGY4NjkwMTQ4KSwgCisgIFdUQzAoMHhmODRhZjE0OCksIFdUQzAoMHhmODJjYTQxMCksIFdUQzAoMHhmODBlMWUxOCksIFdUQzAoMHhmN2VmNjJhMCksIFdUQzAoMHhmN2QwNzRlMCksIFdUQzAoMHhmN2IxNTg3MCksIFdUQzAoMHhmNzkyMTI0MCksIFdUQzAoMHhmNzcyYTdhMCksIAorICBXVEMwKDB4Zjc1MzFlNTApLCBXVEMwKDB4ZjczMzc4MjApLCBXVEMwKDB4ZjcxM2FmZDApLCBXVEMwKDB4ZjZmM2JlYTApLCBXVEMwKDB4ZjZkMzlkYzApLCBXVEMwKDB4ZjZiMzUyZTApLCBXVEMwKDB4ZjY5MmYyODApLCBXVEMwKDB4ZjY3MjkyNTApLCAKKyAgV1RDMCgweGY2NTI0N2EwKSwgV1RDMCgweGY2MzIyNGMwKSwgV1RDMCgweGY2MTIzYTAwKSwgV1RDMCgweGY1ZjI5N2MwKSwgV1RDMCgweGY1ZDM0ZGQwKSwgV1RDMCgweGY1YjQ2YjEwKSwgV1RDMCgweGY1OTVmZDkwKSwgV1RDMCgweGY1NzgxMzkwKSwgCisgIFdUQzAoMHhmNTVhYmJhMCksIFdUQzAoMHhmNTNlMDUxMCksIFdUQzAoMHhmNTIxZmY3MCksIFdUQzAoMHhmNTA2YmEzMCksIFdUQzAoMHhmNGVjNDMzMCksIFdUQzAoMHhmNGQyYTY4MCksIFdUQzAoMHhmNGI5ZWZlMCksIFdUQzAoMHhmNGEyMmFjMCksIAorICBXVEMwKDB4ZjQ4YjVmNzApLCBXVEMwKDB4ZjQ3NTkzMTApLCBXVEMwKDB4ZjQ2MGNkZTApLCBXVEMwKDB4ZjQ0Y2ZjYzApLCBXVEMwKDB4ZjQzOWFmZjApLCBXVEMwKDB4ZjQyNjRlMDApLCBXVEMwKDB4ZjQxMjNkOTApLCBXVEMwKDB4ZjNmZDEzNzApLCAKKyAgV1RDMCgweGYzZTZiZTAwKSwgV1RDMCgweGYzY2Y0MWEwKSwgV1RDMCgweGYzYjZhMDMwKSwgV1RDMCgweGYzOWNkZDYwKSwgV1RDMCgweGYzODFmZTAwKSwgV1RDMCgweGYzNjYwNzYwKSwgV1RDMCgweGYzNDhmZTcwKSwgV1RDMCgweGYzMmFlODIwKSwgCisgIFdUQzAoMHhmMzBiYzk0MCksIFdUQzAoMHhmMmViYTY5MCksIFdUQzAoMHhmMmNhODQ4MCksIFdUQzAoMHhmMmE4NjY3MCksIFdUQzAoMHhmMjg1NGY0MCksIFdUQzAoMHhmMjYxNDE5MCksIFdUQzAoMHhmMjNjNDFlMCksIFdUQzAoMHhmMjE2NTdhMCksIAorICBXVEMwKDB4ZjFlZjhhZTApLCBXVEMwKDB4ZjFjN2UzZTApLCBXVEMwKDB4ZjE5ZjYzZDApLCBXVEMwKDB4ZjE3NjA0NTApLCBXVEMwKDB4ZjE0YmJkZjApLCBXVEMwKDB4ZjEyMDg5NjApLCBXVEMwKDB4ZjBmNDVjZDApLCBXVEMwKDB4ZjBjNzJjZTApLCAKKyAgV1RDMCgweGYwOThlZTAwKSwgV1RDMCgweGYwNjk5NmYwKSwgV1RDMCgweGYwMzkyNjIwKSwgV1RDMCgweGYwMDc5ZTEwKSwgV1RDMCgweGVmZDRmZmMwKSwgV1RDMCgweGVmYTE1Y2EwKSwgV1RDMCgweGVmNmNlNjAwKSwgV1RDMCgweGVmMzdkNDYwKSwgCisgIFdUQzAoMHhlZjAyNWY4MCksIFdUQzAoMHhlZWNjYTJjMCksIFdUQzAoMHhlZTk2OTc2MCksIFdUQzAoMHhlZTYwMzQ0MCksIFdUQzAoMHhlZTI5NmQyMCksIFdUQzAoMHhlZGYyMWMwMCksIFdUQzAoMHhlZGJhMDdlMCksIFdUQzAoMHhlZDgwZjY0MCksIAorICBXVEMwKDB4ZWQ0NmJmNDApLCBXVEMwKDB4ZWQwYjdiMDApLCBXVEMwKDB4ZWNjZjVmYzApLCBXVEMwKDB4ZWM5MmExMjApLCBXVEMwKDB4ZWM1NTZkNjApLCBXVEMwKDB4ZWMxN2U3MDApLCBXVEMwKDB4ZWJkYTJkNDApLCBXVEMwKDB4ZWI5YzVmYTApLCAKKyAgV1RDMCgweGViNWU3MDQwKSwgV1RDMCgweGViMjAxYjIwKSwgV1RDMCgweGVhZTExN2MwKSwgV1RDMCgweGVhYTEyMDAwKSwgV1RDMCgweGVhNjAwMTgwKSwgV1RDMCgweGVhMWQ5OTQwKSwgV1RDMCgweGU5ZDljMTYwKSwgV1RDMCgweGU5OTQ2OGEwKSwgCisgIFdUQzAoMHhlOTRkYzA0MCksIFdUQzAoMHhlOTA2MTk0MCksIFdUQzAoMHhlOGJkYzE0MCksIFdUQzAoMHhlODc1MGFlMCksIFdUQzAoMHhlODJjNGZhMCksIFdUQzAoMHhlN2UzZWE0MCksIFdUQzAoMHhlNzljMzVlMCksIFdUQzAoMHhlNzU1NGNhMCksIAorICBXVEMwKDB4ZTcwZWZjMDApLCBXVEMwKDB4ZTZjOTBjMjApLCBXVEMwKDB4ZTY4MzNmMDApLCBXVEMwKDB4ZTYzZDIzMDApLCBXVEMwKDB4ZTVmNjIwYTApLCBXVEMwKDB4ZTVhZDlkYzApLCBXVEMwKDB4ZTU2MzIwODApLCBXVEMwKDB4ZTUxNjlkYTApLCAKKyAgV1RDMCgweGU0YzgzZTYwKSwgV1RDMCgweGU0NzgyNDAwKSwgV1RDMCgweGU0MjY5ODQwKSwgV1RDMCgweGUzZDQyZGMwKSwgV1RDMCgweGUzODE4OGMwKSwgV1RDMCgweGUzMmY0YmUwKSwgV1RDMCgweGUyZGRlZWEwKSwgV1RDMCgweGUyOGRiNTIwKSwgCisgIFdUQzAoMHhlMjNlZTAwMCksIFdUQzAoMHhlMWYxYTU4MCksIFdUQzAoMHhlMWE1ZTNhMCksIFdUQzAoMHhlMTViMzVhMCksIFdUQzAoMHhlMTExMzg2MCksIFdUQzAoMHhlMGM3OGEwMCksIFdUQzAoMHhlMDdkZDBlMCksIFdUQzAoMHhlMDMzYjdjMCksIAorICBXVEMwKDB4ZGZlOGU2ODApLCBXVEMwKDB4ZGY5ZDFmYzApLCBXVEMwKDB4ZGY1MDU1YzApLCBXVEMwKDB4ZGYwMjg3YzApLCBXVEMwKDB4ZGViM2IzNDApLCBXVEMwKDB4ZGU2M2U3YzApLCBXVEMwKDB4ZGUxMzRhMDApLCBXVEMwKDB4ZGRjMjAwMDApLCAKKyAgV1RDMCgweGRkNzAzMTgwKSwgV1RDMCgweGRkMWUxMjgwKSwgV1RDMCgweGRjY2JlMDgwKSwgV1RDMCgweGRjNzlkOTgwKSwgV1RDMCgweGRjMjgzNjAwKSwgV1RDMCgweGRiZDcxZTAwKSwgV1RDMCgweGRiODZiMTQwKSwgV1RDMCgweGRiMzcxMGMwKSwgCisgIFdUQzAoMHhkYWU4NTBjMCksIFdUQzAoMHhkYTlhNmJjMCksIFdUQzAoMHhkYTRkNTY0MCksIFdUQzAoMHhkYTAxMDY0MCksIFdUQzAoMHhkOWI1NjY0MCksIFdUQzAoMHhkOTZhNTcwMCksIFdUQzAoMHhkOTFmYjcwMCksIFdUQzAoMHhkOGQ1NjYwMCksIAorICBXVEMwKDB4ZDg4YjRhNDApLCBXVEMwKDB4ZDg0MTRmMDApLCBXVEMwKDB4ZDdmNzVmODApLCBXVEMwKDB4ZDdhZDY3NDApLCBXVEMwKDB4ZDc2MzUyYzApLCBXVEMwKDB4ZDcxOTEwNDApLCBXVEMwKDB4ZDZjZThjODApLCBXVEMwKDB4ZDY4M2JkMDApLCAKKyAgV1RDMCgweGQ2MzhhNWMwKSwgV1RDMCgweGQ1ZWQ0ZjgwKSwgV1RDMCgweGQ1YTFjMjQwKSwgV1RDMCgweGQ1NTYyYjgwKSwgV1RDMCgweGQ1MGFlNTAwKSwgV1RDMCgweGQ0YzA0YzgwKSwgV1RDMCgweGQ0NzZiYjQwKSwgV1RDMCgweGQ0MmU2MmMwKSwgCisgIFdUQzAoMHhkM2U3NTY4MCksIFdUQzAoMHhkM2ExYWQwMCksIFdUQzAoMHhkMzVkNjc4MCksIFdUQzAoMHhkMzFhNDMwMCksIFdUQzAoMHhkMmQ3ZGMwMCksIFdUQzAoMHhkMjk1ZDA4MCksIFdUQzAoMHhkMjUzZDhjMCksIFdUQzAoMHhkMjExZGY0MCksIAorICBXVEMwKDB4ZDFjZmRiYzApLCBXVEMwKDB4ZDE4ZGM0ODApLCBXVEMwKDB4ZDE0YjlkYzApLCBXVEMwKDB4ZDEwOTdjODApLCBXVEMwKDB4ZDBjNzc3MDApLCBXVEMwKDB4ZDA4NWE1MDApLCBXVEMwKDB4ZDA0NDJmNDApLCBXVEMwKDB4ZDAwMzRhODApLCAKKyAgV1RDMCgweGNmYzMyYzAwKSwgV1RDMCgweGNmODQwNDAwKSwgV1RDMCgweGNmNDVmNDAwKSwgV1RDMCgweGNmMDkxM2MwKSwgV1RDMCgweGNlY2Q4MDAwKSwgV1RDMCgweGNlOTMyYzgwKSwgV1RDMCgweGNlNTliZjQwKSwgV1RDMCgweGNlMjBjZDQwKSwgCisgIFdUQzAoMHhjZGU3ZWM0MCksIFdUQzAoMHhjZGFlZWRjMCksIFdUQzAoMHhjZDc1ZWEwMCksIFdUQzAoMHhjZDNjZmVjMCksIFdUQzAoMHhjZDA0NGI0MCksIFdUQzAoMHhjY2NiZmYwMCksIFdUQzAoMHhjYzk0NTQ4MCksIFdUQzAoMHhjYzVkODc4MCksIAorICBXVEMwKDB4Y2MyN2MzYzApLCBXVEMwKDB4Y2JmMmZjNDApLCBXVEMwKDB4Y2JiZjBhMDApLCBXVEMwKDB4Y2I4YmM3YzApLCBXVEMwKDB4Y2I1OTE4ODApLCBXVEMwKDB4Y2IyNmYwYzApLCBXVEMwKDB4Y2FmNTQ5ODApLCBXVEMwKDB4Y2FjNDFhYzApLCAKKyAgV1RDMCgweGNhOTM2NDQwKSwgV1RDMCgweGNhNjMyZDgwKSwgV1RDMCgweGNhMzM3ZjAwKSwgV1RDMCgweGNhMDQ2MTgwKSwgV1RDMCgweGM5ZDVkZDQwKSwgV1RDMCgweGM5YTdmYTgwKSwgV1RDMCgweGM5N2FjMjAwKSwgV1RDMCgweGM5NGUzYzAwKSwgCisgIFdUQzAoMHhjOTFkMTg0MCksIFdUQzAoMHhjOGYxNTk4MCksIFdUQzAoMHhjOGM1MjM0MCksIFdUQzAoMHhjODk4ODEwMCksIFdUQzAoMHhjODZiN2YwMCksIFdUQzAoMHhjODNlMjhjMCksIFdUQzAoMHhjODEwOGE4MCksIFdUQzAoMHhjN2UyYWZjMCksIAorICBXVEMwKDB4YzdiNGE0ODApLCBXVEMwKDB4Yzc4Njc0ODApLCBXVEMwKDB4Yzc1ODJiNDApLCBXVEMwKDB4YzcyOWNjODApLCBXVEMwKDB4YzZmYjU3MDApLCBXVEMwKDB4YzZjY2NhNDApLCBXVEMwKDB4YzY5ZTIxODApLCBXVEMwKDB4YzY2ZjQ5YzApLCAKKyAgV1RDMCgweGM2NDAyOWMwKSwgV1RDMCgweGM2MTBhNzQwKSwgV1RDMCgweGM1ZTBiZmMwKSwgV1RDMCgweGM1YjA5ZTgwKSwgV1RDMCgweGM1ODA3OTAwKSwgV1RDMCgweGM1NTA4NDQwKSwgV1RDMCgweGM1MjBlODQwKSwgV1RDMCgweGM0ZjFiZGMwKSwgCisgIFdUQzAoMHhjNGMzMWQwMCksIFdUQzAoMHhjNDk1MTc4MCksIFdUQzAoMHhjNDY3OGEwMCksIFdUQzAoMHhjNDNhMjhjMCksIFdUQzAoMHhjNDBjYTgwMCksIFdUQzAoMHhjM2RlY2NjMCksIFdUQzAoMHhjM2IwOTk0MCksIFdUQzAoMHhjMzgyMmMwMCksIAorICBXVEMwKDB4YzM1M2EwYzApLCBXVEMwKDB4YzMyNTE3NDApLCBXVEMwKDB4YzJmNmI1MDApLCBXVEMwKDB4YzJjOGExNDApLCBXVEMwKDB4YzI5YjAyYzApLCBXVEMwKDB4YzI2ZGY1YzApLCBXVEMwKDB4YzI0MTg5NDApLCBXVEMwKDB4YzIxNWNiYzApLCAKKyAgV1RDMCgweGMxZWFjYTAwKSwgV1RDMCgweGMxYzA4NjgwKSwgV1RDMCgweGMxOTZmYjAwKSwgV1RDMCgweGMxNmUyMmMwKSwgV1RDMCgweGMxNDVmMDQwKSwgV1RDMCgweGMxMWUzYTgwKSwgV1RDMCgweGMwZjZjYzAwKSwgV1RDMCgweGMwY2Y2ZWMwKSwgCisgIFdUQzAoMHhjMGE4MDJjMCksIFdUQzAoMHhjMDgwOTI4MCksIFdUQzAoMHhjMDU5MzM0MCksIFdUQzAoMHhjMDMxZjg4MCksIFdUQzAoMHhjMDBiMDRjMCksIFdUQzAoMHhiZmU0ODk4MSksIFdUQzAoMHhiZmJlYmI4MSksIFdUQzAoMHhiZjk5Y2IwMSksIAorICBXVEMwKDB4YmY3NWNjODEpLCBXVEMwKDB4YmY1MmMxMDEpLCBXVEMwKDB4YmYzMGE5MDEpLCBXVEMwKDB4YmYwZjgzMDEpLCBXVEMwKDB4YmVlZjQ2MDEpLCBXVEMwKDB4YmVjZmU2MDEpLCBXVEMwKDB4YmViMTU3MDEpLCBXVEMwKDB4YmU5MzhjODEpLCAKKyAgV1RDMCgweGJlNzY3ZTgxKSwgV1RDMCgweGJlNWEyMzAxKSwgV1RDMCgweGJlM2U3MjAxKSwgV1RDMCgweGJlMjM2MDAxKSwgV1RDMCgweGJlMDhlMTgxKSwgV1RDMCgweGJkZWVlOTgxKSwgV1RDMCgweGJkZDU2YjgxKSwgV1RDMCgweGJkYmM2MzgxKSwgCisgIFdUQzAoMHhiZGEzZDA4MSksIFdUQzAoMHhiZDhiYjI4MSksIFdUQzAoMHhiZDc0MGI4MSksIFdUQzAoMHhiZDVjZTI4MSksIFdUQzAoMHhiZDQ2NDI4MSksIFdUQzAoMHhiZDMwMzU4MSksIFdUQzAoMHhiZDFhYzgwMSksIFdUQzAoMHhiZDA2MGM4MSksIAorICBXVEMwKDB4YmNmMjE2MDEpLCBXVEMwKDB4YmNkZWY3MDEpLCBXVEMwKDB4YmNjY2JkMDEpLCBXVEMwKDB4YmNiYjcwMDEpLCBXVEMwKDB4YmNhYjE3ODEpLCBXVEMwKDB4YmM5YmI5MDEpLCBXVEMwKDB4YmM4ZDUxMDEpLCBXVEMwKDB4YmM3ZmQzMDEpLCAKKyAgV1RDMCgweGJjNzMzNDAxKSwgV1RDMCgweGJjNjc2NTAxKSwgV1RDMCgweGJjNWM0YzgxKSwgV1RDMCgweGJjNTFjYjAxKSwgV1RDMCgweGJjNDdjMjgxKSwgV1RDMCgweGJjM2UxOTgxKSwgV1RDMCgweGJjMzRjMDgxKSwgV1RDMCgweGJjMmJhYjAxKSwgCisgIFdUQzAoMHhiYzIyY2Q4MSksIFdUQzAoMHhiYzFhMjQwMSksIFdUQzAoMHhiYzExYjY4MSksIFdUQzAoMHhiYzA5OGQ4MSksIFdUQzAoMHhiYzAxYjM4MSksIFdUQzAoMHhiYmZhM2MwMSksIFdUQzAoMHhiYmYzNDI4MSksIFdUQzAoMHhiYmVjZTI4MSksIAorICBXVEMwKDB4YmJlNzMyMDEpLCBXVEMwKDB4YmJlMjMyODEpLCBXVEMwKDB4YmJkZGRiMDEpLCBXVEMwKDB4YmJkYTI1MDEpLCBXVEMwKDB4YmJkNzAyMDEpLCBXVEMwKDB4YmJkNDU2MDEpLCBXVEMwKDB4YmJkMjAzMDEpLCBXVEMwKDB4YmJjZmVhODEpLCAKKyAgV1RDMCgweGJiY2UwNjAxKSwgV1RDMCgweGJiY2M2YjAxKSwgV1RDMCgweGJiY2IzMjAxKSwgV1RDMCgweGJiY2E3NDgxKSwgV1RDMCgweGJiY2E1ZDAxKSwgV1RDMCgweGJiY2IyMjgxKSwgV1RDMCgweGJiY2NmYzgxKSwgV1RDMCgweGJiZDAxMzAxKSwgCisgIFdUQzAoMHhiYmQ0NTg4MSksIFdUQzAoMHhiYmQ5YTc4MSksIFdUQzAoMHhiYmRmZGI4MSksIFdUQzAoMHhiYmU2YzgwMSksIFdUQzAoMHhiYmVlMmY4MSksIFdUQzAoMHhiYmY1ZDE4MSksIFdUQzAoMHhiYmZkNmMwMSksIFdUQzAoMHhiYzA0ZTM4MSksIAorICBXVEMwKDB4YmMwYzQ1ODEpLCBXVEMwKDB4YmMxM2E0ODEpLCBXVEMwKDB4YmMxYjEwODEpLCBXVEMwKDB4YmMyMjhmMDEpLCBXVEMwKDB4YmMyYTFhODEpLCBXVEMwKDB4YmMzMWFmMDEpLCBXVEMwKDB4YmMzOTQ5MDEpLCBXVEMwKDB4YmM0MGU4ODEpLCAKKyAgV1RDMCgweGJjNDg4ZTgxKSwgV1RDMCgweGJjNTAzYjgxKSwgV1RDMCgweGJjNTdmMTAxKSwgV1RDMCgweGJjNWZhZTgxKSwgV1RDMCgweGJjNjc3NTAxKSwgV1RDMCgweGJjNmY0NDAxKSwgV1RDMCgweGJjNzcxYzAxKSwgV1RDMCgweGJjN2VmYzgxKSwgCisgIFdUQzAoMHhiYzg2ZTU4MSksIFdUQzAoMHhiYzhlZDcwMSksIFdUQzAoMHhiYzk2ZDEwMSksIFdUQzAoMHhiYzllZDQ4MSksIFdUQzAoMHhiY2E2ZTEwMSksIFdUQzAoMHhiY2FlZjcwMSksIFdUQzAoMHhiY2I3MTcwMSksIFdUQzAoMHhiY2JmNDAwMSksIAorICBXVEMwKDB4YmNjNzcxODEpLCBXVEMwKDB4YmNjZmFjMDEpLCBXVEMwKDB4YmNkN2VmMDEpLCBXVEMwKDB4YmNlMDNiODEpLCBXVEMwKDB4YmNlODkyODEpLCBXVEMwKDB4YmNmMGYzODEpLCBXVEMwKDB4YmNmOTVlODEpLCBXVEMwKDB4YmQwMWQyODEpLCAKKyAgV1RDMCgweGJkMGE0ZjgxKSwgV1RDMCgweGJkMTJkNTgxKSwgV1RDMCgweGJkMWI2NTAxKSwgV1RDMCgweGJkMjNmZjAxKSwgV1RDMCgweGJkMmNhMjgxKSwgV1RDMCgweGJkMzU1MDgxKSwgV1RDMCgweGJkM2UwODAxKSwgV1RDMCgweGJkNDZjODAxKSwgCisgIFdUQzAoMHhiZDRmOTEwMSksIFdUQzAoMHhiZDU4NjI4MSksIFdUQzAoMHhiZDYxM2Q4MSksIFdUQzAoMHhiZDZhMjIwMSksIFdUQzAoMHhiZDczMTA4MSksIFdUQzAoMHhiZDdjMDc4MSksIFdUQzAoMHhiZDg1MDcwMSksIFdUQzAoMHhiZDhlMGUwMSksIAorICBXVEMwKDB4YmQ5NzFjODEpLCBXVEMwKDB4YmRhMDMzODEpLCBXVEMwKDB4YmRhOTUzMDEpLCBXVEMwKDB4YmRiMjdiMDEpLCBXVEMwKDB4YmRiYmFiMDEpLCBXVEMwKDB4YmRjNGUzMDEpLCBXVEMwKDB4YmRjZTIxODEpLCBXVEMwKDB4YmRkNzY3MDEpLCAKKyAgV1RDMCgweGJkZTBiMzAxKSwgV1RDMCgweGJkZWEwNjgxKSwgV1RDMCgweGJkZjM2MTAxKSwgV1RDMCgweGJkZmNjMzAxKSwgV1RDMCgweGJlMDYyYjgxKSwgV1RDMCgweGJlMGY5YTAxKSwgV1RDMCgweGJlMTkwZDgxKSwgV1RDMCgweGJlMjI4NjgxKSwgCisgIFdUQzAoMHhiZTJjMDUwMSksIFdUQzAoMHhiZTM1ODkwMSksIFdUQzAoMHhiZTNmMTM4MSksIFdUQzAoMHhiZTQ4YTMwMSksIFdUQzAoMHhiZTUyMzc4MSksIFdUQzAoMHhiZTViZDAwMSksIFdUQzAoMHhiZTY1NmMwMSksIFdUQzAoMHhiZTZmMGMwMSksIAorICBXVEMwKDB4YmU3OGIwMDEpLCBXVEMwKDB4YmU4MjU4MDEpLCBXVEMwKDB4YmU4YzA1MDEpLCBXVEMwKDB4YmU5NWI1ODEpLCBXVEMwKDB4YmU5ZjY5MDEpLCBXVEMwKDB4YmVhOTFmMDEpLCBXVEMwKDB4YmViMmQ2ODEpLCBXVEMwKDB4YmViYzkxODEpLCAKKyAgV1RDMCgweGJlYzY0ZTgxKSwgV1RDMCgweGJlZDAwZjgxKSwgV1RDMCgweGJlZDlkMjgxKSwgV1RDMCgweGJlZTM5ODAxKSwgV1RDMCgweGJlZWQ1ZjAxKSwgV1RDMCgweGJlZjcyNjgxKSwgV1RDMCgweGJmMDBlZjgxKSwgV1RDMCgweGJmMGFiYTAxKSwgCisgIFdUQzAoMHhiZjE0ODY4MSksIFdUQzAoMHhiZjFlNTUwMSksIFdUQzAoMHhiZjI4MjUwMSksIFdUQzAoMHhiZjMxZjUwMSksIFdUQzAoMHhiZjNiYzYwMSksIFdUQzAoMHhiZjQ1OTY4MSksIFdUQzAoMHhiZjRmNjgwMSksIFdUQzAoMHhiZjU5M2EwMSksIAorICBXVEMwKDB4YmY2MzBkODEpLCBXVEMwKDB4YmY2Y2UyMDEpLCBXVEMwKDB4YmY3NmI3MDEpLCBXVEMwKDB4YmY4MDhiODEpLCBXVEMwKDB4YmY4YTVmODEpLCBXVEMwKDB4YmY5NDMzMDEpLCBXVEMwKDB4YmY5ZTA3MDEpLCBXVEMwKDB4YmZhN2RjMDEpLCAKKyAgV1RDMCgweGJmYjFiMTAxKSwgV1RDMCgweGJmYmI4NzAxKSwgV1RDMCgweGJmYzU1YzgxKSwgV1RDMCgweGJmY2YzMTgxKSwgV1RDMCgweGJmZDkwNjAxKSwgV1RDMCgweGJmZTJkOTAxKSwgV1RDMCgweGJmZWNhYTgxKSwgV1RDMCgweGJmZjY3YTAxKSwgCisgIC8qIHBhcnQgMSAqLworICBXVEMxKDB4ODAxMzA5ODEpLCBXVEMxKDB4ODAyNjlmODEpLCBXVEMxKDB4ODAzYTMzODEpLCBXVEMxKDB4ODA0ZGM0ODEpLCBXVEMxKDB4ODA2MTUyODEpLCBXVEMxKDB4ODA3NGRjMDEpLCBXVEMxKDB4ODA4ODYwODEpLCBXVEMxKDB4ODA5YmRmMDEpLCAKKyAgV1RDMSgweDgwYWY1NzAxKSwgV1RDMSgweDgwYzJjNzgxKSwgV1RDMSgweDgwZDYzMTAxKSwgV1RDMSgweDgwZTk5NDAxKSwgV1RDMSgweDgwZmNmMTgxKSwgV1RDMSgweDgxMTA0YTAxKSwgV1RDMSgweDgxMjM5ZDgxKSwgV1RDMSgweDgxMzZlYTAxKSwgCisgIFdUQzEoMHg4MTRhMmY4MSksIFdUQzEoMHg4MTVkNmMwMSksIFdUQzEoMHg4MTcwYTE4MSksIFdUQzEoMHg4MTgzY2Y4MSksIFdUQzEoMHg4MTk2Zjc4MSksIFdUQzEoMHg4MWFhMTk4MSksIFdUQzEoMHg4MWJkMzQwMSksIFdUQzEoMHg4MWQwNDY4MSksIAorICBXVEMxKDB4ODFlMzRmODEpLCBXVEMxKDB4ODFmNjRmMDEpLCBXVEMxKDB4ODIwOTQ1ODEpLCBXVEMxKDB4ODIxYzM0MDEpLCBXVEMxKDB4ODIyZjFiMDEpLCBXVEMxKDB4ODI0MWZhMDEpLCBXVEMxKDB4ODI1NGNmMDEpLCBXVEMxKDB4ODI2Nzk5MDEpLCAKKyAgV1RDMSgweDgyN2E1ODAxKSwgV1RDMSgweDgyOGQwYjAxKSwgV1RDMSgweDgyOWZiNDAxKSwgV1RDMSgweDgyYjI1MzAxKSwgV1RDMSgweDgyYzRlODAxKSwgV1RDMSgweDgyZDc3MjAxKSwgV1RDMSgweDgyZTllZjAxKSwgV1RDMSgweDgyZmM1ZjAxKSwgCisgIFdUQzEoMHg4MzBlYzA4MSksIFdUQzEoMHg4MzIxMTUwMSksIFdUQzEoMHg4MzMzNWM4MSksIFdUQzEoMHg4MzQ1OTg4MSksIFdUQzEoMHg4MzU3YzcwMSksIFdUQzEoMHg4MzY5ZTc4MSksIFdUQzEoMHg4MzdiZjgwMSksIFdUQzEoMHg4MzhkZjgwMSksIAorICBXVEMxKDB4ODM5ZmU4MDEpLCBXVEMxKDB4ODNiMWM4ODEpLCBXVEMxKDB4ODNjMzlhODEpLCBXVEMxKDB4ODNkNTVkMDEpLCBXVEMxKDB4ODNlNzBmMDEpLCBXVEMxKDB4ODNmOGIwMDEpLCBXVEMxKDB4ODQwYTNlODEpLCBXVEMxKDB4ODQxYmI5ODEpLCAKKyAgV1RDMSgweDg0MmQyMjgxKSwgV1RDMSgweDg0M2U3YTgxKSwgV1RDMSgweDg0NGZjMDgxKSwgV1RDMSgweDg0NjBmNTgxKSwgV1RDMSgweDg0NzIxNzAxKSwgV1RDMSgweDg0ODMyNDgxKSwgV1RDMSgweDg0OTQxZDgxKSwgV1RDMSgweDg0YTUwMjAxKSwgCisgIFdUQzEoMHg4NGI1ZDMwMSksIFdUQzEoMHg4NGM2OTEwMSksIFdUQzEoMHg4NGQ3M2MwMSksIFdUQzEoMHg4NGU3ZDM4MSksIFdUQzEoMHg4NGY4NTU4MSksIFdUQzEoMHg4NTA4YzE4MSksIFdUQzEoMHg4NTE5MTgwMSksIFdUQzEoMHg4NTI5NTg4MSksIAorICBXVEMxKDB4ODUzOTg0ODEpLCBXVEMxKDB4ODU0OTlkMDEpLCBXVEMxKDB4ODU1OWEwODEpLCBXVEMxKDB4ODU2OThlODEpLCBXVEMxKDB4ODU3OTY2MDEpLCBXVEMxKDB4ODU4OTI2ODEpLCBXVEMxKDB4ODU5OGQwODEpLCBXVEMxKDB4ODVhODY1ODEpLCAKKyAgV1RDMSgweDg1YjdlNjAxKSwgV1RDMSgweDg1Yzc1MjAxKSwgV1RDMSgweDg1ZDZhOTgxKSwgV1RDMSgweDg1ZTVlYjgxKSwgV1RDMSgweDg1ZjUxNjgxKSwgV1RDMSgweDg2MDQyYzAxKSwgV1RDMSgweDg2MTMyYzAxKSwgV1RDMSgweDg2MjIxODAxKSwgCisgIFdUQzEoMHg4NjMwZjE4MSksIFdUQzEoMHg4NjNmYjcwMSksIFdUQzEoMHg4NjRlNjkwMSksIFdUQzEoMHg4NjVkMDU4MSksIFdUQzEoMHg4NjZiOGQ4MSksIFdUQzEoMHg4NjdhMDA4MSksIFdUQzEoMHg4Njg4NjAwMSksIFdUQzEoMHg4Njk2YWQwMSksIAorICBXVEMxKDB4ODZhNGU3ODEpLCBXVEMxKDB4ODZiMzBmMDEpLCBXVEMxKDB4ODZjMTI0MDEpLCBXVEMxKDB4ODZjZjI2MDEpLCBXVEMxKDB4ODZkZDE0ODEpLCBXVEMxKDB4ODZlYWYwODEpLCBXVEMxKDB4ODZmOGJhODEpLCBXVEMxKDB4ODcwNjcyODEpLCAKKyAgV1RDMSgweDg3MTQxYjAxKSwgV1RDMSgweDg3MjFiNDgxKSwgV1RDMSgweDg3MmY0MjAxKSwgV1RDMSgweDg3M2NjMjAxKSwgV1RDMSgweDg3NGEyZjAxKSwgV1RDMSgweDg3NTc4MTgxKSwgV1RDMSgweDg3NjRiMTAxKSwgV1RDMSgweDg3NzFjNjAxKSwgCisgIFdUQzEoMHg4NzdlZGUwMSksIFdUQzEoMHg4NzhjMTg4MSksIFdUQzEoMHg4Nzk5OGYwMSksIFdUQzEoMHg4N2E3MGU4MSksIFdUQzEoMHg4N2I0MjQ4MSksIFdUQzEoMHg4N2MwNWU4MSksIFdUQzEoMHg4N2NiNTEwMSksIFdUQzEoMHg4N2Q0YWM4MSksIAorICBXVEMxKDB4ODdlNzNkODEpLCBXVEMxKDB4ODgxMjQyODEpLCBXVEMxKDB4ODgzNTM1MDEpLCBXVEMxKDB4ODg1Zjg0ODEpLCBXVEMxKDB4ODg4ZDMxODEpLCBXVEMxKDB4ODhiZTE2ODEpLCBXVEMxKDB4ODhmMTM4MDEpLCBXVEMxKDB4ODkyNWYxMDEpLCAKKyAgV1RDMSgweDg5NWJjZDAxKSwgV1RDMSgweDg5OTI1YTgxKSwgV1RDMSgweDg5YzkyZjgxKSwgV1RDMSgweDhhMDAxZjAxKSwgV1RDMSgweDhhMzcyODgxKSwgV1RDMSgweDhhNmU0YTAxKSwgV1RDMSgweDhhYTU4NjgxKSwgV1RDMSgweDhhZGNlZTAxKSwgCisgIFdUQzEoMHg4YjE0OTcwMSksIFdUQzEoMHg4YjRjOTcwMSksIFdUQzEoMHg4Yjg1MDI4MSksIFdUQzEoMHg4YmJkZTk4MSksIFdUQzEoMHg4YmY3NWIwMSksIFdUQzEoMHg4YzMxNjY4MSksIFdUQzEoMHg4YzZjMWIwMSksIFdUQzEoMHg4Y2E3ODc4MSksIAorICBXVEMxKDB4OGNlM2JhODEpLCBXVEMxKDB4OGQyMGMzMDEpLCBXVEMxKDB4OGQ1ZWFhMDEpLCBXVEMxKDB4OGQ5ZDc3ODEpLCBXVEMxKDB4OGRkZDMyMDEpLCBXVEMxKDB4OGUxZGUwMDEpLCBXVEMxKDB4OGU1Zjg4ODEpLCBXVEMxKDB4OGVhMjMyMDEpLCAKKyAgV1RDMSgweDhlZTVlMzAxKSwgV1RDMSgweDhmMmFhMTAxKSwgV1RDMSgweDhmNzA2ZjAxKSwgV1RDMSgweDhmYjc0ZjgxKSwgV1RDMSgweDhmZmY0NjAxKSwgV1RDMSgweDkwNDg1NDAxKSwgV1RDMSgweDkwOTI3YjgxKSwgV1RDMSgweDkwZGRjMDAxKSwgCisgIFdUQzEoMHg5MTJhMjIwMSksIFdUQzEoMHg5MTc3YTMwMSksIFdUQzEoMHg5MWM2NDMwMSksIFdUQzEoMHg5MjE2MDMwMSksIFdUQzEoMHg5MjY2ZTI4MSksIFdUQzEoMHg5MmI4ZTEwMSksIFdUQzEoMHg5MzBiZmY4MSksIFdUQzEoMHg5MzYwM2QwMSksIAorICBXVEMxKDB4OTNiNTk5MDEpLCBXVEMxKDB4OTQwYzEyODEpLCBXVEMxKDB4OTQ2M2E4ODEpLCBXVEMxKDB4OTRiYzU5ODEpLCBXVEMxKDB4OTUxNjIzODEpLCBXVEMxKDB4OTU3MTA2MDEpLCBXVEMxKDB4OTVjY2ZmMDEpLCBXVEMxKDB4OTYyYTBjODEpLCAKKyAgV1RDMSgweDk2ODgyZTAxKSwgV1RDMSgweDk2ZTc2MTAxKSwgV1RDMSgweDk3NDdhNDgxKSwgV1RDMSgweDk3YThmNjgxKSwgV1RDMSgweDk4MGI1NTAxKSwgV1RDMSgweDk4NmViZDgxKSwgV1RDMSgweDk4ZDMyZDgxKSwgV1RDMSgweDk5MzhhMjgxKSwgCisgIFdUQzEoMHg5OTlmMTk4MSksIFdUQzEoMHg5YTA2OTAwMSksIFdUQzEoMHg5YTZmMDM4MSksIFdUQzEoMHg5YWQ4NzA4MSksIFdUQzEoMHg5YjQyZDU4MSksIFdUQzEoMHg5YmFlMmY4MSksIFdUQzEoMHg5YzFhN2M4MSksIFdUQzEoMHg5Yzg3YmE4MSksIAorICBXVEMxKDB4OWNmNWU3MDEpLCBXVEMxKDB4OWQ2NTAwODEpLCBXVEMxKDB4OWRkNTA0ODEpLCBXVEMxKDB4OWU0NWYwODEpLCBXVEMxKDB4OWViN2MxMDEpLCBXVEMxKDB4OWYyYTcyODEpLCBXVEMxKDB4OWY5ZTAzMDEpLCBXVEMxKDB4YTAxMjcwODEpLCAKKyAgV1RDMSgweGEwODdiOTgxKSwgV1RDMSgweGEwZmRkZDgxKSwgV1RDMSgweGExNzRkYTgxKSwgV1RDMSgweGExZWNhZTAxKSwgV1RDMSgweGEyNjU1NTgxKSwgV1RDMSgweGEyZGVjZTgxKSwgV1RDMSgweGEzNTkxODAxKSwgV1RDMSgweGEzZDQzMDAxKSwgCisgIFdUQzEoMHhhNDUwMTYwMSksIFdUQzEoMHhhNGNjYzkwMSksIFdUQzEoMHhhNTRhNDcwMSksIFdUQzEoMHhhNWM4OTAwMSksIFdUQzEoMHhhNjQ3YTMwMSksIFdUQzEoMHhhNmM3N2UwMSksIFdUQzEoMHhhNzQ4MjEwMSksIFdUQzEoMHhhN2M5OGIwMSksIAorICBXVEMxKDB4YTg0YmJiODEpLCBXVEMxKDB4YThjZWIyMDEpLCBXVEMxKDB4YTk1MjZkODEpLCBXVEMxKDB4YTlkNmVmMDEpLCBXVEMxKDB4YWE1YzM2MDEpLCBXVEMxKDB4YWFlMjQzMDEpLCBXVEMxKDB4YWI2OTE2ODEpLCBXVEMxKDB4YWJmMGIxODEpLCAKKyAgV1RDMSgweGFjNzkxNDAxKSwgV1RDMSgweGFkMDIzZjAxKSwgV1RDMSgweGFkOGMzMzAxKSwgV1RDMSgweGFlMTZmMDAxKSwgV1RDMSgweGFlYTI3NjgxKSwgV1RDMSgweGFmMmVjOTAxKSwgV1RDMSgweGFmYmJlODAxKSwgV1RDMSgweGIwNDlkNjAxKSwgCisgIFdUQzEoMHhiMGQ4OTQwMSksIFdUQzEoMHhiMTY4MjI4MSksIFdUQzEoMHhiMWY4ODE4MSksIFdUQzEoMHhiMjg5YjE4MSksIFdUQzEoMHhiMzFiYjMwMSksIFdUQzEoMHhiM2FlODYwMSksIFdUQzEoMHhiNDQyMmI4MSksIFdUQzEoMHhiNGQ2YTM4MSksIAorICBXVEMxKDB4NGE1YTMyN2YpLCBXVEMxKDB4NDljNGFkZmYpLCBXVEMxKDB4NDkyZTYzN2YpLCBXVEMxKDB4NDg5NzRmN2YpLCBXVEMxKDB4NDdmZjZkN2YpLCBXVEMxKDB4NDc2NmJhZmYpLCBXVEMxKDB4NDZjZDM1ZmYpLCBXVEMxKDB4NDYzMmRkN2YpLCAKKyAgV1RDMSgweDQ1OTdiMGZmKSwgV1RDMSgweDQ0ZmJiMWZmKSwgV1RDMSgweDQ0NWVlYWZmKSwgV1RDMSgweDQzYzE2NWZmKSwgV1RDMSgweDQzMjMyMjdmKSwgV1RDMSgweDQyODQyNzdmKSwgV1RDMSgweDQxZTQ4YWZmKSwgV1RDMSgweDQxNDQ1NTdmKSwgCisgIFdUQzEoMHg0MGEzODY3ZiksIFdUQzEoMHg0MDAxZjVmZiksIFdUQzEoMHgzZjVmNWQ4MCksIFdUQzEoMHgzZWJiYWQwMCksIFdUQzEoMHgzZTE2ZWU0MCksIFdUQzEoMHgzZDcxM2QwMCksIFdUQzEoMHgzY2NhYjcwMCksIFdUQzEoMHgzYzIzNjUwMCksIAorICBXVEMxKDB4M2I3YjU4MDApLCBXVEMxKDB4M2FkMmVjYzApLCBXVEMxKDB4M2EyYTY1NDApLCBXVEMxKDB4Mzk4MWI3YzApLCBXVEMxKDB4MzhkOGJhMDApLCBXVEMxKDB4MzgyZjAxYzApLCBXVEMxKDB4Mzc4NDYyNDApLCBXVEMxKDB4MzZkOGViMDApLCAKKyAgV1RDMSgweDM2MmM5ZWMwKSwgV1RDMSgweDM1N2Y3YTAwKSwgV1RDMSgweDM0ZDE4MzQwKSwgV1RDMSgweDM0MjJjOTAwKSwgV1RDMSgweDMzNzM2YzQwKSwgV1RDMSgweDMyYzM5MDQwKSwgV1RDMSgweDMyMTM0MjgwKSwgV1RDMSgweDMxNjI5MjgwKSwgCisgIFdUQzEoMHgzMGIxYTAwMCksIFdUQzEoMHgzMDAwODM4MCksIFdUQzEoMHgyZjRmNDI0MCksIFdUQzEoMHgyZTlkZjE4MCksIFdUQzEoMHgyZGVjYzc4MCksIFdUQzEoMHgyZDNiZDY0MCksIFdUQzEoMHgyYzhiMGNjMCksIFdUQzEoMHgyYmRhMzA4MCksIAorICBXVEMxKDB4MmIyOGVjODApLCBXVEMxKDB4MmE3NzM1MDApLCBXVEMxKDB4MjljNTFiNDApLCBXVEMxKDB4MjkxMjkzYzApLCBXVEMxKDB4Mjg1ZjkyODApLCBXVEMxKDB4MjdhYzM1YzApLCBXVEMxKDB4MjZmOGFiNDApLCBXVEMxKDB4MjY0NTRjMDApLCAKKyAgV1RDMSgweDI1OTI1NjAwKSwgV1RDMSgweDI0ZGZkNTgwKSwgV1RDMSgweDI0MmRkZDQwKSwgV1RDMSgweDIzN2M4N2MwKSwgV1RDMSgweDIyY2JlMjQwKSwgV1RDMSgweDIyMWJlZjQwKSwgV1RDMSgweDIxNmNiMDQwKSwgV1RDMSgweDIwYmUyODAwKSwgCisgIFdUQzEoMHgyMDEwNWM4MCksIFdUQzEoMHgxZjYzNTJhMCksIFdUQzEoMHgxZWI3MTI0MCksIFdUQzEoMHgxZTBiYTE0MCksIFdUQzEoMHgxZDYwZmU0MCksIFdUQzEoMHgxY2I3MjNlMCksIFdUQzEoMHgxYzBlMDMwMCksIFdUQzEoMHgxYjY1OTZjMCksIAorICBXVEMxKDB4MWFiZGU4YTApLCBXVEMxKDB4MWExNmZiZTApLCBXVEMxKDB4MTk3MGM2ODApLCBXVEMxKDB4MThjYjQ4NDApLCBXVEMxKDB4MTgyNjhlMjApLCBXVEMxKDB4MTc4MmEwYzApLCBXVEMxKDB4MTZkZjg5NjApLCBXVEMxKDB4MTYzZDYzMDApLCAKKyAgV1RDMSgweDE1OWM1MmMwKSwgV1RDMSgweDE0ZmM4N2UwKSwgV1RDMSgweDE0NWUyYzgwKSwgV1RDMSgweDEzYzE1YjYwKSwgV1RDMSgweDEzMjYzMjQwKSwgV1RDMSgweDEyOGNkOWEwKSwgV1RDMSgweDExZjU2MmEwKSwgV1RDMSgweDExNWZjMWMwKSwgCisgIFdUQzEoMHgxMGNiZjE2MCksIFdUQzEoMHgxMDM5ZjIwMCksIFdUQzEoMHgwZmE5YTA4MCksIFdUQzEoMHgwZjFhYmQ5MCksIFdUQzEoMHgwZThkMDFkMCksIFdUQzEoMHgwZTAwMzMzMCksIFdUQzEoMHgwZDc0MzU5MCksIFdUQzEoMHgwY2U4ZWY0MCksIAorICBXVEMxKDB4MGM1ZTE5MDApLCBXVEMxKDB4MGJkMzVkNzApLCBXVEMxKDB4MGI0ODhlYjApLCBXVEMxKDB4MGFiZDg0MTApLCBXVEMxKDB4MGEzMjBhMDApLCBXVEMxKDB4MDlhNjBlNzApLCBXVEMxKDB4MDkxOWFiMDApLCBXVEMxKDB4MDg4ZDBkZTApLCAKKyAgV1RDMSgweDA4MDA2NWUwKSwgV1RDMSgweDA3NzM5NzEwKSwgV1RDMSgweDA2ZTY1ODA4KSwgV1RDMSgweDA2NTg4MzQ4KSwgV1RDMSgweDA1Y2EwYWUwKSwgV1RDMSgweDA1M2FhYWY4KSwgV1RDMSgweDA0YTlmYWYwKSwgV1RDMSgweDA0MTdmNjk4KSwgCisgIFdUQzEoMHgwMzg1OWZmNCksIFdUQzEoMHgwMmY0OWJlNCksIFdUQzEoMHgwMjY2YjY2OCksIFdUQzEoMHgwMWRlNTU0ZSksIFdUQzEoMHgwMTVmNTBjYSksIFdUQzEoMHgwMGViN2U1ZCksIFdUQzEoMHgwMDkwNGYyNCksIFdUQzEoMHgwMDIxMjg4OSksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKKyAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCisgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAorICAvKiBwYXJ0IDIgKi8KKyAgV1RDMigweGZmZmVjZTAyKSwgV1RDMigweGZmZTRjM2RmKSwgV1RDMigweGZmY2FhYTU1KSwgV1RDMigweGZmYjA4N2QxKSwgV1RDMigweGZmOTY2MmJmKSwgV1RDMigweGZmN2M0MThiKSwgV1RDMigweGZmNjIyYWEwKSwgV1RDMigweGZmNDgyNDZjKSwgCisgIFdUQzIoMHhmZjJlMzU1YSksIFdUQzIoMHhmZjE0NjNkYiksIFdUQzIoMHhmZWZhYjYwOCksIFdUQzIoMHhmZWUxMmYwYSksIFdUQzIoMHhmZWM3Y2ZkMiksIFdUQzIoMHhmZWFlOTk1YSksIFdUQzIoMHhmZTk1OGNjNCksIFdUQzIoMHhmZTdjYWJjZSksIAorICBXVEMyKDB4ZmU2M2Y4ODIpLCBXVEMyKDB4ZmU0Yjc0ZTApLCBXVEMyKDB4ZmUzMzIyZjYpLCBXVEMyKDB4ZmUxYjA0ZGMpLCBXVEMyKDB4ZmUwMzFjY2MpLCBXVEMyKDB4ZmRlYjZjZjApLCBXVEMyKDB4ZmRkM2ZmN2MpLCBXVEMyKDB4ZmRiY2U4MzQpLCAKKyAgV1RDMigweGZkYTYzYmI4KSwgV1RDMigweGZkOTAwYzY4KSwgV1RDMigweGZkN2E1OTBjKSwgV1RDMigweGZkNjUxMWI0KSwgV1RDMigweGZkNTAyNmMwKSwgV1RDMigweGZkM2I4OTU0KSwgV1RDMigweGZkMjcyZGYwKSwgV1RDMigweGZkMTMwYWRjKSwgCisgIFdUQzIoMHhmY2ZmMTVhYyksIFdUQzIoMHhmY2ViNGE2OCksIFdUQzIoMHhmY2Q3YjExMCksIFdUQzIoMHhmY2M0NTRkMCksIFdUQzIoMHhmY2IxNDA2NCksIFdUQzIoMHhmYzllODk2YyksIFdUQzIoMHhmYzhjNTI2NCksIFdUQzIoMHhmYzdhYmVmMCksIAorICBXVEMyKDB4ZmM2OWYwNzgpLCBXVEMyKDB4ZmM1OWY1ZTgpLCBXVEMyKDB4ZmM0YWNmZWMpLCBXVEMyKDB4ZmMzYzgwNjApLCBXVEMyKDB4ZmMyZjAyNjQpLCBXVEMyKDB4ZmMyMjNiN2MpLCBXVEMyKDB4ZmMxNjA3MTQpLCBXVEMyKDB4ZmMwYTQxNTApLCAKKyAgV1RDMigweGZiZmVjOTIwKSwgV1RDMigweGZiZjM4MzIwKSwgV1RDMigweGZiZTg1NWQwKSwgV1RDMigweGZiZGQyNzQwKSwgV1RDMigweGZiZDFmYzY4KSwgV1RDMigweGZiYzZmZWEwKSwgV1RDMigweGZiYmM1YTQ4KSwgV1RDMigweGZiYjIzYjQ4KSwgCisgIFdUQzIoMHhmYmE4Y2E3OCksIFdUQzIoMHhmYmEwMmU1MCksIFdUQzIoMHhmYjk4OGRlMCksIFdUQzIoMHhmYjkyMGI0MCksIFdUQzIoMHhmYjhjYjg3MCksIFdUQzIoMHhmYjg4OWY2OCksIFdUQzIoMHhmYjg1Y2JlOCksIFdUQzIoMHhmYjg0M2RkMCksIAorICBXVEMyKDB4ZmI4M2RmNzgpLCBXVEMyKDB4ZmI4NDk1ZDApLCBXVEMyKDB4ZmI4NjQ2NjApLCBXVEMyKDB4ZmI4OGQ0YTgpLCBXVEMyKDB4ZmI4YzIxZTgpLCBXVEMyKDB4ZmI5MDBmMjgpLCBXVEMyKDB4ZmI5NDdkYzApLCBXVEMyKDB4ZmI5OTUwYzApLCAKKyAgV1RDMigweGZiOWU2ZDA4KSwgV1RDMigweGZiYTNiNjU4KSwgV1RDMigweGZiYTkxOTA4KSwgV1RDMigweGZiYWU5ZTA4KSwgV1RDMigweGZiYjQ1YmQwKSwgV1RDMigweGZiYmE2NmY4KSwgV1RDMigweGZiYzBkY2YwKSwgV1RDMigweGZiYzdlYWQ4KSwgCisgIFdUQzIoMHhmYmNmYzIwMCksIFdUQzIoMHhmYmQ4OTMzMCksIFdUQzIoMHhmYmUyOTRkMCksIFdUQzIoMHhmYmVlMDNkMCksIFdUQzIoMHhmYmZiMWRlOCksIFdUQzIoMHhmYzBhMWRhNCksIFdUQzIoMHhmYzFiMjJlMCksIFdUQzIoMHhmYzJlMzhmMCksIAorICBXVEMyKDB4ZmM0MzZkNDgpLCBXVEMyKDB4ZmM1YWJmN2MpLCBXVEMyKDB4ZmM3NDAyNGMpLCBXVEMyKDB4ZmM4ZWYyZTgpLCBXVEMyKDB4ZmNhYjUxYWMpLCBXVEMyKDB4ZmNjOGQwMjQpLCBXVEMyKDB4ZmNlNzA0ZjApLCBXVEMyKDB4ZmQwNTgwY2MpLCAKKyAgV1RDMigweGZkMjNkNGQwKSwgV1RDMigweGZkNDFjZTQwKSwgV1RDMigweGZkNWY4MWIwKSwgV1RDMigweGZkN2QwOGYwKSwgV1RDMigweGZkOWE4NTYwKSwgV1RDMigweGZkYjg1OTM4KSwgV1RDMigweGZkZDcxNzk4KSwgV1RDMigweGZkZjc1M2I4KSwgCisgIFdUQzIoMHhmZTE5OTNlZSksIFdUQzIoMHhmZTNlMzBmOCksIFdUQzIoMHhmZTY1NmNiYSksIFdUQzIoMHhmZThmOGZkYyksIFdUQzIoMHhmZWJjYThhNCksIFdUQzIoMHhmZWVjNTkwZSksIFdUQzIoMHhmZjFlMjg1YyksIFdUQzIoMHhmZjUxYTBiNyksIAorICBXVEMyKDB4ZmY4NjYzMzApLCBXVEMyKDB4ZmZiYzJjYmIpLCBXVEMyKDB4ZmZmMmJiZmYpLCBXVEMyKDB4MDAyOWQ3OWQpLCBXVEMyKDB4MDA2MThhMjIpLCBXVEMyKDB4MDA5YTExODUpLCBXVEMyKDB4MDBkM2FhOGMpLCBXVEMyKDB4MDEwZThmZjYpLCAKKyAgV1RDMigweDAxNGFmMjllKSwgV1RDMigweDAxODhmZTU2KSwgV1RDMigweDAxYzhlMTA4KSwgV1RDMigweDAyMGFiM2M0KSwgV1RDMigweDAyNGU2OGE4KSwgV1RDMigweDAyOTNlODI0KSwgV1RDMigweDAyZGIxYmM4KSwgV1RDMigweDAzMjNmMWE0KSwgCisgIFdUQzIoMHgwMzZlNWQ2YyksIFdUQzIoMHgwM2JhNTMyMCksIFdUQzIoMHgwNDA3YzkzOCksIFdUQzIoMHgwNDU2Y2FkMCksIFdUQzIoMHgwNGE3NzI4OCksIFdUQzIoMHgwNGY5ZGI4OCksIFdUQzIoMHgwNTRlMTg4OCksIFdUQzIoMHgwNWE0MWVmMCksIAorICBXVEMyKDB4MDVmYmQ2ZTApLCBXVEMyKDB4MDY1NTI4YzApLCBXVEMyKDB4MDZiMDA4MzgpLCBXVEMyKDB4MDcwYzdlZTApLCBXVEMyKDB4MDc2YTliYjApLCBXVEMyKDB4MDdjYTZkMTApLCBXVEMyKDB4MDgyYzA4ZTApLCBXVEMyKDB4MDg4ZjhkYTApLCAKKyAgV1RDMigweDA4ZjUxYWMwKSwgV1RDMigweDA5NWNjYzIwKSwgV1RDMigweDA5YzY5ZjcwKSwgV1RDMigweDBhMzI3YjQwKSwgV1RDMigweDBhYTA0NmQwKSwgV1RDMigweDBiMGZlYmIwKSwgV1RDMigweDBiODE1ZGQwKSwgV1RDMigweDBiZjQ5NjAwKSwgCisgIFdUQzIoMHgwYzY5OGM1MCksIFdUQzIoMHgwY2UwM2JhMCksIFdUQzIoMHgwZDU4YTM4MCksIFdUQzIoMHgwZGQyYzUxMCksIFdUQzIoMHgwZTRlYTExMCksIFdUQzIoMHgwZWNjM2RkMCksIFdUQzIoMHgwZjRiYTgwMCksIFdUQzIoMHgwZmNjZWQxMCksIAorICBXVEMyKDB4MTA1MDE5NjApLCBXVEMyKDB4MTBkNTMyYTApLCBXVEMyKDB4MTE1YzM5YzApLCBXVEMyKDB4MTFlNTJmYTApLCBXVEMyKDB4MTI3MDE1NjApLCBXVEMyKDB4MTJmY2VmMjApLCBXVEMyKDB4MTM4YmMyMDApLCBXVEMyKDB4MTQxYzkzMDApLCAKKyAgV1RDMigweDE0YWY2NGEwKSwgV1RDMigweDE1NDQzNGUwKSwgV1RDMigweDE1ZGIwMDIwKSwgV1RDMigweDE2NzNjMzYwKSwgV1RDMigweDE3MGU3ZTgwKSwgV1RDMigweDE3YWIzNWUwKSwgV1RDMigweDE4NDllZTQwKSwgV1RDMigweDE4ZWFhYmEwKSwgCisgIFdUQzIoMHgxOThkNmYwMCksIFdUQzIoMHgxYTMyMzZhMCksIFdUQzIoMHgxYWQ5MDA4MCksIFdUQzIoMHgxYjgxY2M2MCksIFdUQzIoMHgxYzJjOWRhMCksIFdUQzIoMHgxY2Q5Nzk4MCksIFdUQzIoMHgxZDg4NjVjMCksIFdUQzIoMHgxZTM5NjU0MCksIAorICBXVEMyKDB4MWVlYzc3MDApLCBXVEMyKDB4MWZhMTk4YzApLCBXVEMyKDB4MjA1OGM4NDApLCBXVEMyKDB4MjExMjA2NDApLCBXVEMyKDB4MjFjZDU3MDApLCBXVEMyKDB4MjI4YWJlYzApLCBXVEMyKDB4MjM0YTQxODApLCBXVEMyKDB4MjQwYmRmODApLCAKKyAgV1RDMigweDI0Y2Y5NWMwKSwgV1RDMigweDI1OTU2MWMwKSwgV1RDMigweDI2NWQ0MjAwKSwgV1RDMigweDI3MjczODQwKSwgV1RDMigweDI3ZjM0OGMwKSwgV1RDMigweDI4YzE3NzAwKSwgV1RDMigweDI5OTFjNTAwKSwgV1RDMigweDJhNjQzMDgwKSwgCisgIFdUQzIoMHgyYjM4YjY4MCksIFdUQzIoMHgyYzBmNTNjMCksIFdUQzIoMHgyY2U4MDg0MCksIFdUQzIoMHgyZGMyZDY4MCksIFdUQzIoMHgyZTlmYzEwMCksIFdUQzIoMHgyZjdlY2FjMCksIFdUQzIoMHgzMDVmZjI4MCksIFdUQzIoMHgzMTQzMzRjMCksIAorICBXVEMyKDB4MzIyODhlMDApLCBXVEMyKDB4MzMwZmZiODApLCBXVEMyKDB4MzNmOTdkODApLCBXVEMyKDB4MzRlNTE1YzApLCBXVEMyKDB4MzVkMmM1YzApLCBXVEMyKDB4MzZjMjhkMDApLCBXVEMyKDB4MzdiNDY3YzApLCBXVEMyKDB4MzhhODUwODApLCAKKyAgV1RDMigweDM5OWU0MjQwKSwgV1RDMigweDNhOTYzYTAwKSwgV1RDMigweDNiOTAzNjAwKSwgV1RDMigweDNjOGMzNDgwKSwgV1RDMigweDNkOGEzMzgwKSwgV1RDMigweDNlOGEyZGMwKSwgV1RDMigweDNmOGMxYjQwKSwgV1RDMigweDQwOGZmMmZmKSwgCisgIFdUQzIoMHg0MTk1YWU3ZiksIFdUQzIoMHg0MjlkNDc3ZiksIFdUQzIoMHg0M2E2Yjg3ZiksIFdUQzIoMHg0NGIxZmRmZiksIFdUQzIoMHg0NWJmMTFmZiksIFdUQzIoMHg0NmNkZWU3ZiksIFdUQzIoMHg0N2RlOGNmZiksIFdUQzIoMHg0OGYwZTc3ZiksIAorICBXVEMyKDB4NGEwNTBlZmYpLCBXVEMyKDB4NGIxYjJkZmYpLCBXVEMyKDB4NGMzMzcyZmYpLCBXVEMyKDB4NGQ0ZTBiZmYpLCBXVEMyKDB4NGU2YjI1N2YpLCBXVEMyKDB4NGY4YWVkZmYpLCBXVEMyKDB4NTBhZDkyZmYpLCBXVEMyKDB4NTFkMzQxZmYpLCAKKyAgV1RDMigweDAwMjAwNmE5KSwgV1RDMigweDAwMGJmYjM2KSwgV1RDMigweGZmZmU0NWFjKSwgV1RDMigweGZmZjZkMDY0KSwgV1RDMigweGZmZjU4NWJjKSwgV1RDMigweGZmZmE1MDBkKSwgV1RDMigweDAwMDUxOWI0KSwgV1RDMigweDAwMTVjZDBjKSwgCisgIFdUQzIoMHgwMDJjNTQ3MCksIFdUQzIoMHgwMDQ4OWEzYiksIFdUQzIoMHgwMDZhODhjOCksIFdUQzIoMHgwMDkyMGE3NCksIFdUQzIoMHgwMGJmMDk5OSksIFdUQzIoMHgwMGYxNzA5MiksIFdUQzIoMHgwMTI5MjliYyksIFdUQzIoMHgwMTY2MWY3MCksIAorICBXVEMyKDB4MDFhODNjMGMpLCBXVEMyKDB4MDFlZjY5ZTgpLCBXVEMyKDB4MDIzYjkzNjQpLCBXVEMyKDB4MDI4Y2EyZDQpLCBXVEMyKDB4MDJlMjgyOWMpLCBXVEMyKDB4MDMzZDFkMTApLCBXVEMyKDB4MDM5YzVjOTApLCBXVEMyKDB4MDQwMDJiNzgpLCAKKyAgV1RDMigweDA0Njg3NDE4KSwgV1RDMigweDA0ZDUyMGUwKSwgV1RDMigweDA1NDYxYzE4KSwgV1RDMigweDA1YmI1MDIwKSwgV1RDMigweDA2MzRhNzU4KSwgV1RDMigweDA2YjIwYzIwKSwgV1RDMigweDA3MzM2OGM4KSwgV1RDMigweDA3YjhhN2IwKSwgCisgIFdUQzIoMHgwODQxYjM0MCksIFdUQzIoMHgwOGNlNzViMCksIFdUQzIoMHgwOTVlZDk4MCksIFdUQzIoMHgwOWYyYzkwMCksIFdUQzIoMHgwYThhMmU4MCksIFdUQzIoMHgwYjI0ZjQ3MCksIFdUQzIoMHgwYmMzMDUxMCksIFdUQzIoMHgwYzY0NGFkMCksIAorICBXVEMyKDB4MGQwOGIwMTApLCBXVEMyKDB4MGRiMDFmMTApLCBXVEMyKDB4MGU1YTgyNTApLCBXVEMyKDB4MGYwN2M0MDApLCBXVEMyKDB4MGZiN2NlYTApLCBXVEMyKDB4MTA2YThjODApLCBXVEMyKDB4MTExZmU4MDApLCBXVEMyKDB4MTFkN2NiNjApLCAKKyAgV1RDMigweDEyOTIyMTIwKSwgV1RDMigweDEzNGVkM2EwKSwgV1RDMigweDE0MGRjZDAwKSwgV1RDMigweDE0Y2VmN2UwKSwgV1RDMigweDE1OTIzZTYwKSwgV1RDMigweDE2NTc4YjAwKSwgV1RDMigweDE3MWVjODIwKSwgV1RDMigweDE3ZTdlMDIwKSwgCisgIFdUQzIoMHgxOGIyYmQyMCksIFdUQzIoMHgxOTdmNDljMCksIFdUQzIoMHgxYTRkNzA0MCksIFdUQzIoMHgxYjFkMWIwMCksIFdUQzIoMHgxYmVlMzQ2MCksIFdUQzIoMHgxY2MwYTZhMCksIFdUQzIoMHgxZDk0NWM0MCksIFdUQzIoMHgxZTY5M2Y4MCksIAorICBXVEMyKDB4MWYzZjNhYzApLCBXVEMyKDB4MjAxNjM4ODApLCBXVEMyKDB4MjBlZTIyYzApLCBXVEMyKDB4MjFjNmU0NDApLCBXVEMyKDB4MjJhMDY3NDApLCBXVEMyKDB4MjM3YTk2MDApLCBXVEMyKDB4MjQ1NTVhYzApLCBXVEMyKDB4MjUzMGEwNDApLCAKKyAgV1RDMigweDI2MGM1MDgwKSwgV1RDMigweDI2ZTg1NjAwKSwgV1RDMigweDI3YzQ5YjAwKSwgV1RDMigweDI4YTEwYTAwKSwgV1RDMigweDI5N2Q4ZDgwKSwgV1RDMigweDJhNWEwZjgwKSwgV1RDMigweDJiMzY3YTgwKSwgV1RDMigweDJjMTJiOGMwKSwgCisgIFdUQzIoMHgyY2VlYjUwMCksIFdUQzIoMHgyZGNhNTk0MCksIFdUQzIoMHgyZWE1OGZjMCksIFdUQzIoMHgyZjgwNDM0MCksIFdUQzIoMHgzMDVhNWRjMCksIFdUQzIoMHgzMTMzY2EwMCksIFdUQzIoMHgzMjBjNzIwMCksIFdUQzIoMHgzMmU0NDAwMCksIAorICBXVEMyKDB4MzNiYjFlYzApLCBXVEMyKDB4MzQ5MGY4ODApLCBXVEMyKDB4MzU2NWI3YzApLCBXVEMyKDB4MzYzOTQ2NDApLCBXVEMyKDB4MzcwYjhmMDApLCBXVEMyKDB4MzdkYzdjMDApLCBXVEMyKDB4MzhhYmY3YzApLCBXVEMyKDB4Mzk3OWVjYzApLCAKKyAgV1RDMigweDNhNDY0NTAwKSwgV1RDMigweDNiMTBlYjAwKSwgV1RDMigweDNiZDljOTQwKSwgV1RDMigweDNjYTBjOWMwKSwgV1RDMigweDNkNjVkNzQwKSwgV1RDMigweDNlMjhkYzAwKSwgV1RDMigweDNlZTljMjQwKSwgV1RDMigweDNmYTg3NDgwKSwgCisgIFdUQzIoMHg0MDY0ZGNmZiksIFdUQzIoMHg0MTFlZTY3ZiksIFdUQzIoMHg0MWQ2N2E3ZiksIFdUQzIoMHg0MjhiODQ3ZiksIFdUQzIoMHg0MzNkZWQ3ZiksIFdUQzIoMHg0M2VkYTBmZiksIFdUQzIoMHg0NDlhODg3ZiksIFdUQzIoMHg0NTQ0OGY3ZiksIAorICBXVEMyKDB4NDVlYjllZmYpLCBXVEMyKDB4NDY4ZmExZmYpLCBXVEMyKDB4NDczMDgyZmYpLCBXVEMyKDB4NDdjZTJjN2YpLCBXVEMyKDB4NDg2ODg4N2YpLCBXVEMyKDB4NDhmZjgwZmYpLCBXVEMyKDB4NDk5MzAwZmYpLCBXVEMyKDB4NGEyMmYyZmYpLCAKKyAgV1RDMigweDRhYWY0MDdmKSwgV1RDMigweDRiMzdkNDdmKSwgV1RDMigweDRiYmM5OTdmKSwgV1RDMigweDRjM2Q3OGZmKSwgV1RDMigweDRjYmE1ZTdmKSwgV1RDMigweDRkMzMzMzdmKSwgV1RDMigweDRkYTdlMjdmKSwgV1RDMigweDRlMTg1NjdmKSwgCisgIFdUQzIoMHg0ZTg0NzhmZiksIFdUQzIoMHg0ZWVjMzQ3ZiksIFdUQzIoMHg0ZjRmNzM3ZiksIFdUQzIoMHg0ZmFlMjBmZiksIFdUQzIoMHg1MDA4MjVmZiksIFdUQzIoMHg1MDVkNmRmZiksIFdUQzIoMHg1MGFkZTM3ZiksIFdUQzIoMHg1MGY5NmY3ZiksIAorICBXVEMyKDB4NTEzZmZkZmYpLCBXVEMyKDB4NTE4MTc3ZmYpLCBXVEMyKDB4NTFiZGM4N2YpLCBXVEMyKDB4NTFmNGQ5ZmYpLCBXVEMyKDB4NTIyNjk2N2YpLCBXVEMyKDB4NTI1MmU4N2YpLCBXVEMyKDB4NTI3OWI5ZmYpLCBXVEMyKDB4NTI5YWY1ZmYpLCAKKyAgV1RDMigweDUyYjY4NjdmKSwgV1RDMigweDUyY2M1NWZmKSwgV1RDMigweDUyZGM0ZWZmKSwgV1RDMigweDUyZTY1YWZmKSwgV1RDMigweDUyZWE2NTdmKSwgV1RDMigweDUyZTg1N2ZmKSwgV1RDMigweDUyZTAxZDdmKSwgV1RDMigweDUyZDE5ZmZmKSwgCisgIFdUQzIoMHg1MmJjYzlmZiksIFdUQzIoMHg1MmExODU3ZiksIFdUQzIoMHg1MjdmYmQ3ZiksIFdUQzIoMHg1MjU3NWI3ZiksIFdUQzIoMHg1MjI4NGE3ZiksIFdUQzIoMHg1MWYyNzRmZiksIFdUQzIoMHg1MWI1YzQ3ZiksIFdUQzIoMHg1MTcyMjQ3ZiksIAorICBXVEMyKDB4NTEyNzdkZmYpLCBXVEMyKDB4NTBkNWJjN2YpLCBXVEMyKDB4NTA3Y2M5ZmYpLCBXVEMyKDB4NTAxYzkwZmYpLCBXVEMyKDB4NGZiNGZiN2YpLCBXVEMyKDB4NGY0NWYzZmYpLCBXVEMyKDB4NGVjZjY0ZmYpLCBXVEMyKDB4NGU1MTM4ZmYpLCAKKyAgV1RDMigweDRkY2I1OTdmKSwgV1RDMigweDRkM2RiMWZmKSwgV1RDMigweDRjYTgyYmZmKSwgV1RDMigweDRjMGFiMjdmKSwgV1RDMigweDRiNjUyZjdmKSwgV1RDMigweDRhYjc4ZDdmKSwgV1RDMigweDRhMDFiNjdmKSwgV1RDMigweDQ5NDM5NTdmKSwgCisgIFdUQzIoMHg0ODdkMTJmZiksIFdUQzIoMHg0N2FlMWY3ZiksIFdUQzIoMHg0NmQ2OGY3ZiksIFdUQzIoMHg0NWY3MTg3ZiksIFdUQzIoMHg0NTEzNTk3ZiksIFdUQzIoMHg0NDMwNDY3ZiksIFdUQzIoMHg0MzUyZDJmZiksIFdUQzIoMHg0MjdlNmJmZiksIAorICBXVEMyKDB4NDFiMzkwZmYpLCBXVEMyKDB4NDBmMjA3N2YpLCBXVEMyKDB4NDAzOWE4N2YpLCBXVEMyKDB4M2Y4YTMxMDApLCBXVEMyKDB4M2VlMzNlMDApLCBXVEMyKDB4M2U0NDZhYzApLCBXVEMyKDB4M2RhZDUxODApLCBXVEMyKDB4M2QxZDdmYzApLCAKKyAgV1RDMigweDNjOTQ3YjAwKSwgV1RDMigweDNjMTFjN2MwKSwgV1RDMigweDNiOTRlYmMwKSwgV1RDMigweDNiMWQ2ZGMwKSwgV1RDMigweDNhYWFkNDgwKSwgV1RDMigweDNhM2NhNzQwKSwgV1RDMigweDM5ZDI2YzQwKSwgV1RDMigweDM5NmJhOGMwKSwgCisgIFdUQzIoMHgzOTA3ZTA4MCksIFdUQzIoMHgzOGE2OTgwMCksIFdUQzIoMHgzODQ3M2Q4MCksIFdUQzIoMHgzN2U5MjNjMCksIFdUQzIoMHgzNzhiOWI4MCksIFdUQzIoMHgzNzJlMDM4MCksIFdUQzIoMHgzNmQwM2E4MCksIFdUQzIoMHgzNjcyN2YwMCksIAorICBXVEMyKDB4MzYxNTBlNDApLCBXVEMyKDB4MzViODE1NDApLCBXVEMyKDB4MzU1YjgwMDApLCBXVEMyKDB4MzRmZjFkYzApLCBXVEMyKDB4MzRhMmJmYzApLCBXVEMyKDB4MzQ0NjNlODApLCBXVEMyKDB4MzNlOTgyYzApLCBXVEMyKDB4MzM4Yzc4ODApLCAKKyAgV1RDMigweDMzMmYwYmMwKSwgV1RDMigweDMyZDExODAwKSwgV1RDMigweDMyNzI2NWMwKSwgV1RDMigweDMyMTJiYmMwKSwgV1RDMigweDMxYjFlNzQwKSwgV1RDMigweDMxNGZlZjAwKSwgV1RDMigweDMwZWQwNTQwKSwgV1RDMigweDMwODk1YzgwKSwgCisgIFdUQzIoMHgzMDI1MTg4MCksIFdUQzIoMHgyZmMwMjg4MCksIFdUQzIoMHgyZjVhNjQ4MCksIFdUQzIoMHgyZWYzYTQ4MCksIFdUQzIoMHgyZThiZDY0MCksIFdUQzIoMHgyZTIzMTEwMCksIFdUQzIoMHgyZGI5NzY4MCksIFdUQzIoMHgyZDRmMjcwMCksIAorICBXVEMyKDB4MmNlNDMxYzApLCBXVEMyKDB4MmM3ODkwODApLCBXVEMyKDB4MmMwYzNiYzApLCBXVEMyKDB4MmI5ZjJiYzApLCBXVEMyKDB4MmIzMTU5NDApLCBXVEMyKDB4MmFjMmJjMDApLCBXVEMyKDB4MmE1MzRjYzApLCBXVEMyKDB4MjllMzAzYzApCit9OworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uaCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U1MDEyCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5oCkBAIC0wLDAgKzEsMjAzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcnM6ICAgICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorICAgQ29udGVudHMvZGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcZmlsZQorICBcYnJpZWYgIE1lbW9yeSBsYXlvdXQgICAKKyAgXGF1dGhvciBNYXJrdXMgTG9od2Fzc2VyCisqLworCisjaWZuZGVmIEFBQ19FTkNfUk9NX0gKKyNkZWZpbmUgQUFDX0VOQ19ST01fSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisKKy8qCisgIEh1ZmZtYW4gVGFibGVzCisqLworZXh0ZXJuIGNvbnN0IElOVCAgICBGREthYWNFbmNfaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IElOVCAgICBGREthYWNFbmNfaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IElOVCAgICBGREthYWNFbmNfaHVmZl9sdGFiNV82WzldWzldOworZXh0ZXJuIGNvbnN0IElOVCAgICBGREthYWNFbmNfaHVmZl9sdGFiN184WzhdWzhdOworZXh0ZXJuIGNvbnN0IElOVCAgICBGREthYWNFbmNfaHVmZl9sdGFiOV8xMFsxM11bMTNdOworZXh0ZXJuIGNvbnN0IFVDSEFSICBGREthYWNFbmNfaHVmZl9sdGFiMTFbMTddWzE3XTsKK2V4dGVybiBjb25zdCBVQ0hBUiAgRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlsxMjFdOworZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMVszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjJbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIzWzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNFszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjVbOV1bOV07CitleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI2WzldWzldOworZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiN1s4XVs4XTsKK2V4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjhbOF1bOF07CitleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI5WzEzXVsxM107CitleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMFsxM11bMTNdOworZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMTFbMjFdWzE3XTsKK2V4dGVybiBjb25zdCBJTlQgICAgRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZlsxMjFdOworCisvKgorICBxdWFudGl6ZXIKKyovCisjZGVmaW5lIE1BTlRfRElHSVRTIDkKKyNkZWZpbmUgTUFOVF9TSVpFICAgKDE8PE1BTlRfRElHSVRTKQorCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQorI2RlZmluZSBGSVhQX1FURCBGSVhQX1NHTAorI2RlZmluZSBRVEMgRlhfREJMMkZYQ09OU1RfU0dMCisjZWxzZQorI2RlZmluZSBGSVhQX1FURCBGSVhQX0RCTAorI2RlZmluZSBRVEMKKyNlbmRpZgorCitleHRlcm4gY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX21UYWJfM180W01BTlRfU0laRV07CitleHRlcm4gY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX3F1YW50VGFibGVRWzRdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVREIEZES2FhY0VuY19xdWFudFRhYmxlRVs0XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY19tVGFiXzRfM0VsY1s1MTJdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1s0XVsxNF07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbNF1bMTRdOworCisKKy8qCisgIHRhYmxlIHRvIGNvdW50IHVzZWQgbnVtYmVyIG9mIGJpdHMKKyovCitleHRlcm4gY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXTsKK2V4dGVybiBjb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFtNQVhfU0ZCX1NIT1JUICsgMV07CisKKworLyoKKyAgUHN5IENvbmZpZ3VyYXRpb24gY29uc3RhbnRzCisqLworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY184MDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfODAwMF9zaG9ydF8xMjg7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzExMDI1X2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMTEwMjVfc2hvcnRfMTI4OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18xMjAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzEyMDAwX3Nob3J0XzEyODsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMTYwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18xNjAwMF9zaG9ydF8xMjg7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzIyMDUwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMjIwNTBfc2hvcnRfMTI4OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18yNDAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzI0MDAwX3Nob3J0XzEyODsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMzIwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18zMjAwMF9zaG9ydF8xMjg7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzQ0MTAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNDQxMDBfc2hvcnRfMTI4OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY180ODAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzQ4MDAwX3Nob3J0XzEyODsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfNjQwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY182NDAwMF9zaG9ydF8xMjg7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzg4MjAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfODgyMDBfc2hvcnRfMTI4OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY185NjAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzk2MDAwX3Nob3J0XzEyODsKKworCisvKgorICBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cworKi8KK2V4dGVybiBjb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zRW5jQ29lZmYzWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzWzE2XTsKKworI2RlZmluZSBXVEMwIFdUQworI2RlZmluZSBXVEMxIFdUQworI2RlZmluZSBXVEMyIFdUQworCitleHRlcm4gY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXM1MTJbMTUzNl07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXM0ODBbMTQ0MF07CisKKworI2VuZGlmIC8qICNpZm5kZWYgQUFDX0VOQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5NjYyYgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuYy5jcHAKQEAgLTAsMCArMSwxMDM3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAorICAgY29udGVudHMvZGVzY3JpcHRpb246IGZhc3QgYWFjIGNvZGVyIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNlbmMuaCIKKworI2luY2x1ZGUgImJpdGVuYy5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAicHN5X21haW4uaCIKKyNpbmNsdWRlICJxY19tYWluLmgiCisjaW5jbHVkZSAiYmFuZHdpZHRoLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKKyNpbmNsdWRlICJ0bnNfZnVuYy5oIgorI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKworCisKKyNkZWZpbmUgTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOIDYxNDQKKworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5jaWxsYXJ5UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUpOworCitJTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKKyAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgIElOVCBjb3JlU2FtcGxpbmdSYXRlLAorICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgIElOVCBuQ2hhbm5lbHMsCisgICAgICAgIElOVCBuQ2hhbm5lbHNFZmYsCisgICAgICAgIElOVCBiaXRSYXRlLAorICAgICAgICBJTlQgYXZlcmFnZUJpdHMsCisgICAgICAgIElOVCAqcEF2ZXJhZ2VCaXRzUGVyRnJhbWUsCisgICAgICAgIElOVCBiaXRyYXRlTW9kZSwKKyAgICAgICAgSU5UIG5TdWJGcmFtZXMKKyAgICAgICAgKQoreworICBJTlQgdHJhbnNwb3J0Qml0cywgcHJldkJpdFJhdGUsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUsIHNoaWZ0ID0gMCwgaXRlcj0wOworCisgIHdoaWxlICggKGZyYW1lTGVuZ3RoICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gZnJhbWVMZW5ndGgKKyAgICAmJiAoY29yZVNhbXBsaW5nUmF0ZSAmIH4oKDE8PChzaGlmdCsxKSktMSkpID09IGNvcmVTYW1wbGluZ1JhdGUgKQorICB7CisgICAgc2hpZnQgKys7CisgIH0KKworICBkbyB7CisgICAgcHJldkJpdFJhdGUgPSBiaXRSYXRlOworICAgICBhdmVyYWdlQml0c1BlckZyYW1lID0gKGJpdFJhdGUqKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIC8gKGNvcmVTYW1wbGluZ1JhdGU+PnNoaWZ0KSAvIG5TdWJGcmFtZXM7CisKKyAgICBpZiAocEF2ZXJhZ2VCaXRzUGVyRnJhbWUgIT0gTlVMTCkgeworICAgICAgKnBBdmVyYWdlQml0c1BlckZyYW1lID0gYXZlcmFnZUJpdHNQZXJGcmFtZTsKKyAgICB9CisKKyAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgIHRyYW5zcG9ydEJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBBc3N1bWUgc29tZSB3b3JzdCBjYXNlICovCisgICAgICB0cmFuc3BvcnRCaXRzID0gMjA4OworICAgIH0KKworICAgIGJpdFJhdGUgPSBGREttYXgoYml0UmF0ZSwgKCgoKDQwICogbkNoYW5uZWxzKSArIHRyYW5zcG9ydEJpdHMpICogKGNvcmVTYW1wbGluZ1JhdGUpKSAvIGZyYW1lTGVuZ3RoKSApOworICAgIEZES19BU1NFUlQoYml0UmF0ZSA+PSAwKTsKKworICAgIGJpdFJhdGUgPSBGREttaW4oYml0UmF0ZSwgKChuQ2hhbm5lbHNFZmYgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pKihjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkpIC8gKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIDsKKyAgICBGREtfQVNTRVJUKGJpdFJhdGUgPj0gMCk7CisKKyAgfSB3aGlsZSAocHJldkJpdFJhdGUgIT0gYml0UmF0ZSAmJiBpdGVyKysgPCAzKSA7CisKKyAgcmV0dXJuIGJpdFJhdGU7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZTsKKyAgaW50IGNoYW5CaXRyYXRlWzJdOyAvKiBtb25vL3N0ZXJlbyBzZXR0aW5ncyAqLworfSBDT05GSUdfVEFCX0VOVFJZX1ZCUjsKKworc3RhdGljIGNvbnN0IENPTkZJR19UQUJfRU5UUllfVkJSIGNvbmZpZ1RhYlZCUltdID0geworICB7QUFDRU5DX0JSX01PREVfQ0JSLCAgIHsgICAgIDAsICAgICAwfX0gLAorICB7QUFDRU5DX0JSX01PREVfVkJSXzEsIHsgMzIwMDAsIDIwMDAwfX0gLAorICB7QUFDRU5DX0JSX01PREVfVkJSXzIsIHsgNDAwMDAsIDMyMDAwfX0gLAorICB7QUFDRU5DX0JSX01PREVfVkJSXzMsIHsgNTYwMDAsIDQ4MDAwfX0gLAorICB7QUFDRU5DX0JSX01PREVfVkJSXzQsIHsgNzIwMDAsIDY0MDAwfX0gLAorICB7QUFDRU5DX0JSX01PREVfVkJSXzUsIHsxMTIwMDAsIDk2MDAwfX0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19HZXRWQlJCaXRyYXRlCisgICAgIGRlc2NyaXB0aW9uOiAgR2V0IFZCUiBiaXRyYXRlIGZyb20gdmJyIHF1YWxpdHkKKyAgICAgaW5wdXQgcGFyYW1zOiBpbnQgdmJyUXVhbGl0eSAoVkJSMCwgVkJSMSwgVkJSMikKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsTW9kZQorICAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKElOVCBiaXRyYXRlTW9kZSwgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKQoreworICBJTlQgYml0cmF0ZSA9IDA7CisgIElOVCBtb25vU3RlcmVvTW9kZSA9IDA7IC8qIGRlZmF1bHQgbW9ubyAqLworCisgIGlmIChGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY2hhbm5lbE1vZGUpPT1FTF9NT0RFX1NURVJFTykgeworICAgICAgbW9ub1N0ZXJlb01vZGUgPSAxOworICB9CisKKyAgc3dpdGNoKChBQUNFTkNfQklUUkFURV9NT0RFKWJpdHJhdGVNb2RlKXsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICBiaXRyYXRlID0gY29uZmlnVGFiVkJSW2JpdHJhdGVNb2RlXS5jaGFuQml0cmF0ZVttb25vU3RlcmVvTW9kZV07CisgICAgYnJlYWs7CisgIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgorICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgorICBkZWZhdWx0OgorICAgIGJpdHJhdGUgPSAwOworICAgIGJyZWFrOworICB9CisKKyAgLyogY29udmVydCBjaGFubmVsIGJpdHJhdGUgdG8gb3ZlcmFsbCBiaXRyYXRlKi8KKyAgYml0cmF0ZSAqPSBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmOworCisgIHJldHVybiBiaXRyYXRlOworfQorCisvKioKKyAqIFxicmllZiAgQ29udmVydCBlbmNvZGVyIGJpdHJlc2Vydm9pciB2YWx1ZSBmb3IgdHJhbnNwb3J0IGxpYnJhcnkuCisgKgorICogXHBhcmFtIGJpdHJhdGVNb2RlICAgICAgICAgICBCaXRyYXRlbW9kZSB1c2VkIGluIGN1cnJlbnQgZW5jb2RlciBpbnN0YW5jZS4gU2UgOjpBQUNFTkNfQklUUkFURV9NT0RFCisgKiBccGFyYW0gYml0cmVzVG90YWwgICAgICAgICAgIEVuY29kZXIgYml0cmVzZXJ2b2lyIGxldmVsIGluIGJpdHMuCisgKgorICogXHJldHVybiAgQ29ycmVjdGVkIGJpdHJlc2Vydm9pciBsZXZlbCB1c2VkIGluIHRyYW5zcG9ydCBsaWJyYXJ5LgorICovCitzdGF0aWMgSU5UIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKAorICAgICAgICBjb25zdCBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHJlc1RvdGFsCisgICAgICAgICkKK3sKKyAgSU5UIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gMDsKKworICBzd2l0Y2ggKGJpdHJhdGVNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IGJpdHJlc1RvdGFsOyAvKiBlbmNvZGVyIGJpdHJlc2Vydm9pciBsZXZlbCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl81OgorICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSBGREtfSU5UX01BWDsgLyogc2lnbmFsIHZhcmlhYmxlIGJpdHJhdGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CisgICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7ICAgICAgICAgICAvKiBzdXBlciBmcmFtaW5nIGFuZCBmaXhlZCBmcmFtaW5nICovCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRob3V0IGJpdHJlc2Vydm9pciBzaWduYWxpbmcgKi8KKyAgICBkZWZhdWx0OgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKKyAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gMDsgICAgICAgICAgIC8qIGludmFsaWQgY29uZmlndXJhdGlvbiovCisgICAgICBGREtfQVNTRVJUKDApOworICB9CisKKyAgcmV0dXJuIHRyYW5zcG9yQml0cmVzZXJ2b2lyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcKKyAgICAgZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICByZXR1cm5zOiAgICAgIC0tLQorCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRkRLYWFjRW5jX0FhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZykKK3sKKyAgICAvKiBtYWtlIHRoZXByZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3RydWN0cyBmbGV4aWJsZSAqLworICAgIEZES21lbWNsZWFyKGNvbmZpZywgc2l6ZW9mKEFBQ0VOQ19DT05GSUcpKTsKKworICAgIC8qIGRlZmF1bHQgYW5jaWxsYXJ5ICovCisgICAgY29uZmlnLT5hbmNfUmF0ZSA9IDA7ICAgICAgICAgLyogbm8gYW5jaWxsYXJ5IGRhdGEgKi8KKyAgICBjb25maWctPmFuY0RhdGFCaXRSYXRlID0gMDsgICAvKiBubyBhZGRpdGlvbmFsIGNvbnN1bWVkIGJpdHJhdGUgKi8KKworICAgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBjb25maWctPmJpdFJhdGUgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBiaXRyYXRlIG11c3QgYmUgc2V0Ki8KKyAgICBjb25maWctPmF2ZXJhZ2VCaXRzICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBpbnN0ZWFkIG9mIGJpdHJhdGUvcyB3ZSBjYW4gY29uZmlndXJlIGJpdHMvc3VwZXJmcmFtZSAqLworICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gMDsKKyAgICBjb25maWctPmJhbmRXaWR0aCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYmFuZHdpZHRoIGZyb20gdGFibGUgKi8KKyAgICBjb25maWctPnVzZVRucyAgICAgICAgICA9IFROU19FTkFCTEVfTUFTSzsgICAgICAvKiB0bnMgZW5hYmxlZCBjb21wbGV0bHkgKi8KKyAgICBjb25maWctPnVzZVBucyAgICAgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRpbmcgb24gY2hhbm5lbEJpdHJhdGUgdGhpcyBtaWdodCBiZSBzZXQgdG8gMCBsYXRlciAqLworICAgIGNvbmZpZy0+dXNlSVMgICAgICAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIEludGVuc2l0eSBTdGVyZW8gQ29uZmlndXJhdGlvbiAqLworICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGggICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lc2l6ZSBub3QgY29uZmlndXJlZCAqLworICAgIGNvbmZpZy0+c3ludGF4RmxhZ3MgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3ludGF4IHdpdGggbm8gc3BlY2lhbGl0aWVzICovCisgICAgY29uZmlnLT5lcENvbmZpZyAgICAgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogbm8gRVIgc3ludGF4IC0+IG5vIGFkZGl0aW9uYWwgZXJyb3IgcHJvdGVjdGlvbiAqLworICAgIGNvbmZpZy0+blN1YkZyYW1lcyAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQsIG5vIHN1YiBmcmFtZXMgKi8KKyAgICBjb25maWctPmNoYW5uZWxPcmRlciAgICA9IENIX09SREVSX01QRUc7ICAgICAgICAvKiBVc2UgTVBFRyBjaGFubmVsIG9yZGVyaW5nLiAqLworICAgIGNvbmZpZy0+Y2hhbm5lbE1vZGUgICAgID0gTU9ERV9VTktOT1dOOworICAgIGNvbmZpZy0+bWluQml0c1BlckZyYW1lID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIG1pbnVtIG51bWJlciBvZiBiaXRzIGluIGVhY2ggQVUgKi8KKyAgICBjb25maWctPm1heEJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCisgICAgY29uZmlnLT5iaXRyZXNlcnZvaXIgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCwgdW5pbml0aWFsaXplZCB2YWx1ZSAqLworCisgICAgLyogaW5pdCB0YWJzIGluIGZpeHBvaW50X21hdGggKi8KKyAgICBJbml0TGRJbnQoKTsKKyAgICBJbml0SW52U3FydFRhYigpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19PcGVuCisgICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCisgICAgcmV0dXJuczogICAgICBlcnJvciBjb2RlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19PcGVuKEhBTkRMRV9BQUNfRU5DICAqcGhBYWNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgQUFDX0VOQyAgICAgICAgICAgKmhBYWNFbmMgPSBOVUxMOworICBVQ0hBUiAgICAgICAgICAgICAqZHluYW1pY1JBTSA9IE5VTEw7CisKKyAgaWYgKHBoQWFjRW5jPT1OVUxMKSB7CisgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICAvKiBhbGxvY2F0ZSBlbmNvZGVyIHN0cnVjdHVyZSAqLworICBoQWFjRW5jID0gR2V0UmFtX2FhY0VuY19BYWNFbmNvZGVyKCk7CisgIGlmIChoQWFjRW5jID09IE5VTEwpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBGREttZW1jbGVhcihoQWFjRW5jLCBzaXplb2YoQUFDX0VOQykpOworCisgIGhBYWNFbmMtPmR5bmFtaWNfUkFNID0gR2V0QUFDZHluYW1pY19SQU0oKTsKKyAgZHluYW1pY1JBTSA9IChVQ0hBUiopaEFhY0VuYy0+ZHluYW1pY19SQU07CisKKyAgLyogYWxsb2NhdGUgdGhlIFBzeSBhdWQgUHN5IE91dCBzdHJ1Y3R1cmUgKi8KKyAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1BzeU5ldygmaEFhY0VuYy0+cHN5S2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgIGdvdG8gYmFpbDsKKworICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUHN5T3V0TmV3KGhBYWNFbmMtPnBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgIGdvdG8gYmFpbDsKKworICAvKiBhbGxvY2F0ZSB0aGUgUSZDIE91dCBzdHJ1Y3R1cmUgKi8KKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNPdXROZXcoaEFhY0VuYy0+cWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgZ290byBiYWlsOworCisgIC8qIGFsbG9jYXRlIHRoZSBRJkMga2VybmVsICovCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKKyAgICBnb3RvIGJhaWw7CisKKyAgaEFhY0VuYy0+bWF4Q2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgIGhBYWNFbmMtPm1heEVsZW1lbnRzID0gbkVsZW1lbnRzOworICBoQWFjRW5jLT5tYXhGcmFtZXMgICA9IG5TdWJGcmFtZXM7CisKK2JhaWw6CisgICpwaEFhY0VuYyA9IGhBYWNFbmM7CisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdGlhbGl6ZShIQU5ETEVfQUFDX0VOQyAgICAgIGhBYWNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQ09ORklHICAgICAgKmNvbmZpZywgICAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgICAgICAgICAgICAgaW5pdEZsYWdzKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgSU5UIHBzeUJpdHJhdGUsIHRuc01hc2s7IC8vSU5UIHByb2ZpbGUgPSAxOworICBDSEFOTkVMX01BUFBJTkcgICAqY20gPSBOVUxMOworCisgIElOVCBxbWJmYWMsIHFidzsKKyAgRklYUF9EQkwgbWJmYWMsIGJ3X3JhdGlvOworICBRQ19JTklUIHFjSW5pdDsKKyAgSU5UIGF2ZXJhZ2VCaXRzUGVyRnJhbWUgPSAwOworCisgIGlmIChjb25maWc9PU5VTEwpCisgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEU7CisKKyAgLyoqKioqKioqKioqKioqKioqKiogc2FuaXR5IGNoZWNrcyAqKioqKioqKioqKioqKioqKioqLworCisgIC8qIGNoZWNrIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgaWYgKGNvbmZpZy0+bkNoYW5uZWxzICA8IDEgfHwgY29uZmlnLT5uQ2hhbm5lbHMgPiAoOCkpIHsKKyAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9CisKKyAgLyogY2hlY2sgc2FtcGxlIHJhdGUgKi8KKyAgc3dpdGNoIChjb25maWctPnNhbXBsZVJhdGUpCisgIHsKKyAgICBjYXNlIDgwMDA6CisgICAgY2FzZSAxMTAyNToKKyAgICBjYXNlIDEyMDAwOgorICAgIGNhc2UgMTYwMDA6CisgICAgY2FzZSAyMjA1MDoKKyAgICBjYXNlIDI0MDAwOgorICAgIGNhc2UgMzIwMDA6CisgICAgY2FzZSA0NDEwMDoKKyAgICBjYXNlIDQ4MDAwOgorICAgIGNhc2UgNjQwMDA6CisgICAgY2FzZSA4ODIwMDoKKyAgICBjYXNlIDk2MDAwOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURTsKKyAgfQorCisgIC8qIGJpdHJhdGUgaGFzIHRvIGJlIHNldCAqLworICBpZiAoY29uZmlnLT5iaXRSYXRlPT0tMSkgeworICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKKyAgfQorCisgIC8qIGNoZWNrIGJpdCByYXRlICovCisKKyAgaWYgKEZES2FhY0VuY19MaW1pdEJpdHJhdGUoCisgICAgICAgICAgaFRwRW5jLAorICAgICAgICAgIGNvbmZpZy0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLAorICAgICAgICAgIGNvbmZpZy0+bkNoYW5uZWxzLAorICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY29uZmlnLT5jaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZiwKKyAgICAgICAgICBjb25maWctPmJpdFJhdGUsCisgICAgICAgICAgY29uZmlnLT5hdmVyYWdlQml0cywKKyAgICAgICAgICZhdmVyYWdlQml0c1BlckZyYW1lLAorICAgICAgICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUsCisgICAgICAgICAgY29uZmlnLT5uU3ViRnJhbWVzCisgICAgICAgICAgKSAhPSBjb25maWctPmJpdFJhdGUgKQorICB7CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKKyAgfQorCisgIGlmIChjb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpIHsKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKKyAgfQorICBpZiAoY29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX0hDUikgeworICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUOworICB9CisKKyAgLyogY2hlY2sgZnJhbWUgbGVuZ3RoICovCisgIHN3aXRjaCAoY29uZmlnLT5mcmFtZWxlbmd0aCkKKyAgeworICAgIGNhc2UgMTAyNDoKKyAgICAgIGlmICggY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRAorICAgICAgICB8fCBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCApCisgICAgICB7CisgICAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6CisgICAgY2FzZSA0ODA6CisgICAgICBpZiAoIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlICE9IEFPVF9FUl9BQUNfTEQKKyAgICAgICAgJiYgY29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19FTEQgKQorICAgICAgeworICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSDsKKyAgfQorCisgIGlmIChjb25maWctPmFuY19SYXRlICE9IDApIHsKKworICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoY29uZmlnLT5iaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YW5jX1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUpOworICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKKyAgICAgICBnb3RvIGJhaWw7CisKKworICAgICAvKiB1cGRhdGUgZXN0aW1hdGVkIGNvbnN1bWVkIGJpdHJhdGUgKi8KKyAgICAgY29uZmlnLT5hbmNEYXRhQml0UmF0ZSArPSAoIChoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUgKiBjb25maWctPnNhbXBsZVJhdGUpIC8gY29uZmlnLT5mcmFtZWxlbmd0aCApOworCisgIH0KKworICAvKiBtYXhpbWFsIGFsbG93ZWQgRFNFIGJ5dGVzIGluIGZyYW1lICovCisgIHsKKyAgLyogZml4cG9pbnQgY2FsY3VsYXRpb24qLworICBJTlQgcV9yZXMsIGVuY0JpdHJhdGUsIHNjOworICBGSVhQX0RCTCB0bXAgPSBmRGl2Tm9ybShjb25maWctPmZyYW1lbGVuZ3RoLCBjb25maWctPnNhbXBsZVJhdGUsICZxX3Jlcyk7CisgIGVuY0JpdHJhdGUgPSAoY29uZmlnLT5iaXRSYXRlLyotY29uZmlnLT5hbmNEYXRhQml0UmF0ZSovKS0gKElOVCkoY29uZmlnLT5uQ2hhbm5lbHMqODAwMCk7CisgIHNjID0gQ291bnRMZWFkaW5nQml0cyhlbmNCaXRyYXRlKTsKKyAgY29uZmlnLT5tYXhBbmNCeXRlc1BlckFVID0gRkRLbWluKCAoMjU2KSwgRkRLbWF4KDAsKElOVCkoZk11bHREaXYyKHRtcCwgKEZJWFBfREJMKShlbmNCaXRyYXRlPDxzYykpPj4oLXFfcmVzK3NjLTErMykpKSApOworICB9CisKKyAgLyogYmluZCBjb25maWcgdG8gaEFhY0VuYy0+Y29uZmlnICovCisgIGhBYWNFbmMtPmNvbmZpZyA9IGNvbmZpZzsKKworICAvKiBzZXQgaEFhY0VuYy0+Yml0cmF0ZU1vZGUgKi8KKyAgaEFhY0VuYy0+Yml0cmF0ZU1vZGUgPSAoQUFDRU5DX0JJVFJBVEVfTU9ERSljb25maWctPmJpdHJhdGVNb2RlOworCisgIGhBYWNFbmMtPmVuY29kZXJNb2RlID0gY29uZmlnLT5jaGFubmVsTW9kZTsKKworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoaEFhY0VuYy0+ZW5jb2Rlck1vZGUsIGNvbmZpZy0+Y2hhbm5lbE9yZGVyLCAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmcpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKKyAgICBnb3RvIGJhaWw7CisKKyAgY20gPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CisKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRGV0ZXJtaW5lQmFuZFdpZHRoKCZoQWFjRW5jLT5jb25maWctPmJhbmRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YmFuZFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5iaXRSYXRlIC0gY29uZmlnLT5hbmNEYXRhQml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmJpdHJhdGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+ZW5jb2Rlck1vZGUpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKKyAgICBnb3RvIGJhaWw7CisKKyAgaEFhY0VuYy0+YmFuZHdpZHRoOTBkQiA9IChJTlQpaEFhY0VuYy0+Y29uZmlnLT5iYW5kV2lkdGg7CisKKyAgdG5zTWFzayA9IGNvbmZpZy0+dXNlVG5zID8gVE5TX0VOQUJMRV9NQVNLIDogMHgwOworICBwc3lCaXRyYXRlID0gY29uZmlnLT5iaXRSYXRlIC0gY29uZmlnLT5hbmNEYXRhQml0UmF0ZTsKKworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wc3lJbml0KGhBYWNFbmMtPnBzeUtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+bWF4RnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPm1heENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgZ290byBiYWlsOworCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3BzeU1haW5Jbml0KGhBYWNFbmMtPnBzeUtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5hdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZUlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmxhZ3MpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKKyAgICBnb3RvIGJhaWw7CisKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNPdXRJbml0KGhBYWNFbmMtPnFjT3V0LCBoQWFjRW5jLT5tYXhGcmFtZXMsIGNtKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgZ290byBiYWlsOworCisKKworICBxY0luaXQuY2hhbm5lbE1hcHBpbmcgICAgICA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsKKyAgcWNJbml0LnNjZUNwZSAgICAgICAgICAgICAgPSAwOworCisgIGlmICgoY29uZmlnLT5iaXRyYXRlTW9kZT49MSkgJiYgKGNvbmZpZy0+Yml0cmF0ZU1vZGU8PTUpKSB7CisgICAgICBxY0luaXQuYXZlcmFnZUJpdHMgICAgID0gKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjc7CisgICAgICBxY0luaXQuYml0UmVzICAgICAgICAgID0gTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmY7CisgICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmY7CisgICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gMDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIGludCBtYXhCaXRyZXM7CisgICAgICBxY0luaXQuYXZlcmFnZUJpdHMgICAgID0gKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjc7CisgICAgICBtYXhCaXRyZXMgICAgICAgICAgICAgID0gKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmKSAtIHFjSW5pdC5hdmVyYWdlQml0czsKKyAgICAgIHFjSW5pdC5iaXRSZXMgICAgICAgICAgPSAoY29uZmlnLT5iaXRyZXNlcnZvaXIhPS0xKSA/IEZES21pbihjb25maWctPmJpdHJlc2Vydm9pciwgbWF4Qml0cmVzKSA6IG1heEJpdHJlczsKKworICAgICAgcWNJbml0Lm1heEJpdHMgICAgICAgICA9IGZpeE1pbihNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZiwgKChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43KStxY0luaXQuYml0UmVzKTsKKyAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUhPS0xKSA/IGZpeE1pbihxY0luaXQubWF4Qml0cywgY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUpIDogcWNJbml0Lm1heEJpdHM7CisKKyAgICAgIHFjSW5pdC5taW5CaXRzICAgICAgICAgPSBmaXhNYXgoMCwgKChhdmVyYWdlQml0c1BlckZyYW1lLTEpJn43KS1xY0luaXQuYml0UmVzLXRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgKChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43KStxY0luaXQuYml0UmVzKSk7CisgICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gKGNvbmZpZy0+bWluQml0c1BlckZyYW1lIT0tMSkgPyBmaXhNYXgocWNJbml0Lm1pbkJpdHMsIGNvbmZpZy0+bWluQml0c1BlckZyYW1lKSA6IHFjSW5pdC5taW5CaXRzOworICB9CisKKyAgcWNJbml0LnNhbXBsZVJhdGUgICAgICAgICAgPSBjb25maWctPnNhbXBsZVJhdGU7CisgIHFjSW5pdC5hZHZhbmNlZEJpdHNUb1BlICAgID0gaXNMb3dEZWxheShjb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgPyAxIDogMCA7CisgIHFjSW5pdC5uU3ViRnJhbWVzICAgICAgICAgID0gY29uZmlnLT5uU3ViRnJhbWVzOworICBxY0luaXQucGFkZGluZy5wYWRkaW5nUmVzdCA9IGNvbmZpZy0+c2FtcGxlUmF0ZTsKKworICAvKiBDYWxjIG1lYW5QZSAqLworICBid19yYXRpbyA9IGZEaXZOb3JtKChGSVhQX0RCTCloQWFjRW5jLT5iYW5kd2lkdGg5MGRCLCAoRklYUF9EQkwpKGNvbmZpZy0+c2FtcGxlUmF0ZT4+MSksICZxYncpOworICBxYncgPSBERlJBQ1RfQklUUy0xLXFidzsKKyAgLyogcWNJbml0Lm1lYW5QZSA9IDEwLjBmICogRlJBTUVfTEVOX0xPTkcgKiBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLyhjb25maWctPnNhbXBsZVJhdGUvMi4wZik7ICovCisgIHFjSW5pdC5tZWFuUGUgPSBmTXVsdChid19yYXRpbywgKEZJWFBfREJMKSgoMTAqY29uZmlnLT5mcmFtZWxlbmd0aCk8PDE2KSkgPj4gKHFidy0xNSk7CisKKyAgLyogQ2FsYyBtYXhCaXRGYWMgKi8KKyAgbWJmYWMgPSBmRGl2Tm9ybSgoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOLTc0NCkqY20tPm5DaGFubmVsc0VmZiwgcWNJbml0LmF2ZXJhZ2VCaXRzL3FjSW5pdC5uU3ViRnJhbWVzLCAmcW1iZmFjKTsKKyAgcW1iZmFjID0gREZSQUNUX0JJVFMtMS1xbWJmYWM7CisgIHFjSW5pdC5tYXhCaXRGYWMgPSAocW1iZmFjID4gMjQpID8gKG1iZmFjID4+IChxbWJmYWMgLSAyNCkpOihtYmZhYyA8PCAoMjQgLSBxbWJmYWMpKTsKKworICBzd2l0Y2goY29uZmlnLT5iaXRyYXRlTW9kZSl7CisgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0NCUjsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMTsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNTsKKyAgICBicmVhazsKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CisgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfU0ZSOworICAgIGJyZWFrOworICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgorICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0ZGOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgcWNJbml0LmludlF1YW50ID0gKGNvbmZpZy0+dXNlUmVxdWFudCk/MjowOworCisgIC8qIG1heEl0ZXJhdGlvbnMgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWFudGl6YXRpb24gaXRlcmF0aW9ucyB0aGF0IGFyZQorICAgKiBhbGxvd2VkIGJlZm9yZSB0aGUgY3Jhc2ggcmVjb3ZlcnkgZnVuY3Rpb25hbGl0eSBpcyBhY3RpdmF0ZWQuIFRoaXMgc2V0dGluZyBzaG91bGQgYmUgYWRqdXN0ZWQKKyAgICogdG8gdGhlIHByb2Nlc3NpbmcgcG93ZXIgYXZhaWxhYmxlLCBpLmUuIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyIGhlYWRyb29tIGluIG9uZSBmcmFtZSB0aGF0IGlzCisgICAqIHN0aWxsIGxlZnQgYWZ0ZXIgbm9ybWFsIGVuY29kaW5nIHdpdGhvdXQgcmVxdWFudGl6YXRpb24uIFBsZWFzZSBub3RlIHRoYXQgaWYgYWN0aXZhdGVkIHRoaXMKKyAgICogZnVuY3Rpb25hbGl0eSBpcyB1c2VkIG1vc3QgbGlrZWx5IG9ubHkgaW4gY2FzZXMgd2hlcmUgdGhlIGVuY29kZXIgaXMgb3BlcmF0aW5nIGJleW9uZAorICAgKiByZWNvbW1lbmRlZCBzZXR0aW5ncywgaS5lLiB0aGUgYXVkaW8gcXVhbGl0eSBpcyBzdWJvcHRpbWFsIGFueXdheS4gQWN0aXZhdGluZyB0aGUgY3Jhc2gKKyAgICogcmVjb3ZlcnkgZG9lcyBub3QgZnVydGhlciByZWR1Y2UgYXVkaW8gcXVhbGl0eSBzaWduaWZpY2FudGx5IGluIHRoZXNlIGNhc2VzLiAqLworICBpZiAoIChjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xEKSB8fCAoY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpICkgeworICAgIHFjSW5pdC5tYXhJdGVyYXRpb25zID0gMjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBxY0luaXQubWF4SXRlcmF0aW9ucyA9IDU7CisgIH0KKworICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGU7CisKKyAgcWNJbml0LnN0YXRpY0JpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjSW5pdC5hdmVyYWdlQml0cy9xY0luaXQublN1YkZyYW1lcyk7CisKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNJbml0KGhBYWNFbmMtPnFjS2VybmVsLCAmcWNJbml0KTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgZ290byBiYWlsOworCisgIC8qIE1hcCB2aXJ0dWFsIGFvdCdzIHRvIGludGVybiBhb3QgdXNlZCBpbiBiaXRzdHJlYW0gd3JpdGVyLiAqLworICBzd2l0Y2ggKGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CisgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9EQUJQTFVTX0FBQ19MQzoKKyAgICAgIGhBYWNFbmMtPmFvdCA9IEFPVF9BQUNfTEM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgIGNhc2UgQU9UX0RBQlBMVVNfU0JSOgorICAgICAgaEFhY0VuYy0+YW90ID0gQU9UX1NCUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX01QMl9QUzoKKyAgICBjYXNlIEFPVF9EQUJQTFVTX1BTOgorICAgICAgaEFhY0VuYy0+YW90ID0gQU9UX1BTOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGhBYWNFbmMtPmFvdCA9IGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICB9CisKKyAgLyogY29tbW9uIHRoaW5ncyAqLworCisgIHJldHVybiBBQUNfRU5DX09LOworCitiYWlsOgorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRW5jb2RlRnJhbWUKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgb25lIGZyYW1lCisgICAgcmV0dXJuczogICAgICBlcnJvciBjb2RlCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSggSEFORExFX0FBQ19FTkMgICAgICAgaEFhY0VuYywgICAgICAgICAgLyogZW5jb2RlciBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNKiBSRVNUUklDVCAgICBpbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiAgICAgICAgICAgICAgICAgbk91dEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICBleHRQYXlsb2FkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisgICAgaW50ICAgIGVsLCBuLCBjPTA7CisgICAgVUNIQVIgIGV4dFBheWxvYWRVc2VkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdOworCisgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOworCisKKworICAgIFBTWV9PVVQgKnBzeU91dCA9IGhBYWNFbmMtPnBzeU91dFtjXTsKKyAgICBRQ19PVVQgICpxY091dCAgPSBoQWFjRW5jLT5xY091dFtjXTsKKworICAgIEZES21lbWNsZWFyKGV4dFBheWxvYWRVc2VkLCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTICogc2l6ZW9mKFVDSEFSKSk7CisKKyAgICBxY091dC0+ZWxlbWVudEV4dEJpdHMgPSAwOyAvKiBzdW0gdXAgYWxsIGV4dGVuZGVkIGJpdCBvZiBlYWNoIGVsZW1lbnQgKi8KKyAgICBxY091dC0+c3RhdGljQml0cyAgICAgPSAwOyAvKiBzdW0gdXAgc2lkZSBpbmZvIGJpdHMgb2YgZWFjaCBlbGVtZW50ICovCisgICAgcWNPdXQtPnRvdGFsTm9SZWRQZSAgID0gMDsgLyogc3VtIHVwIFBFICovCisKKyAgICAvKiBhZHZhbmNlIHBzeWNob2Fjb3VzdGljcyAqLworICAgIGZvciAoZWw9MDsgZWw8Y20tPm5FbGVtZW50czsgZWwrKykgeworICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tlbF07CisKKyAgICAgICAgaWYgKCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpCisgICAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKQorICAgICAgICAgIHx8IChlbEluZm8uZWxUeXBlID09IElEX0xGRSkgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2g7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyISovCisgICAgICAgICAgICBmb3IoY2g9MDtjaDxlbEluZm8ubkNoYW5uZWxzSW5FbDtjaCsrKSB7CisgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50W2VsXS0+cHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gPSBxY091dC0+cWNFbGVtZW50W2VsXS0+cWNPdXRDaGFubmVsW2NoXTsKKworICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSAgICAgICA9IHFjT3V0Q2hhbi0+bWRjdFNwZWN0cnVtOworICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlNwcmVhZEVuZXJneSAgPSBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneTsKKyAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3kgICAgICAgICAgPSBxY091dENoYW4tPnNmYkVuZXJneTsKKyAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEgICAgPSBxY091dENoYW4tPnNmYkVuZXJneUxkRGF0YTsKKyAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGEgICAgPSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YTsKKyAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGREthYWNFbmNfcHN5TWFpbihlbEluZm8ubkNoYW5uZWxzSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5RWxlbWVudFtlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUR5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvW2VsXS5DaGFubmVsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzCisKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgLyogRm9ybUZhY3RvciwgUGUgYW5kIHN0YXRpY0JpdERlbWFuZCBjYWxjdWxhdGlvbiAqLworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNNYWluUHJlcGFyZSgmZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisKKyAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisKKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkID0gMDsKKyAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5uRXh0ZW5zaW9ucyA9IDA7CisgICAgICAgICAgICAvKiByZXNldCBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgICAgICAgRkRLbWVtY2xlYXIoJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb24sICgxKSpzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOworCisgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFM7IG4rKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQorICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSBlbCkKKyAgICAgICAgICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLmRhdGFTaXplID4gMCkKKyAgICAgICAgICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLnBEYXRhICE9IE5VTEwpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBxY091dC0+cWNFbGVtZW50W2VsXS0+bkV4dGVuc2lvbnMrKzsKKworICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0udHlwZSAgICAgICAgID0gZXh0UGF5bG9hZFtuXS5kYXRhVHlwZTsgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLworICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0ublBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCisgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZCArPQorICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyApOworICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdW0gdXAgZXh0ZW5zaW9uIGFuZCBzdGF0aWMgYml0cyBmb3IgYWxsIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgICAgICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQ7CisgICAgICAgICAgICBxY091dC0+c3RhdGljQml0cyAgICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5zdGF0aWNCaXRzVXNlZDsKKworICAgICAgICAgICAgLyogc3VtIHVwIHBlICovCisgICAgICAgICAgICBxY091dC0+dG90YWxOb1JlZFBlICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5wZURhdGEucGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBxY091dC0+bkV4dGVuc2lvbnMgICA9IDA7CisgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgPSAwOworCisgICAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgICBGREttZW1jbGVhcigmcWNPdXQtPmV4dGVuc2lvbiwgKDIrMikqc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKKworICAgIC8qIEFkZCBleHRlbnNpb24gcGF5bG9hZCBub3QgYXNzaWduZWQgdG8gYW4gY2hhbm5lbCBlbGVtZW50CisgICAgICAoQW5jaWxsYXJ5IGRhdGEgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIHR5cGUgdXAgdG8gbm93KSAqLworICAgIGZvciAoIG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrICkgeworICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQorICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLmFzc29jaWF0ZWRDaEVsZW1lbnQgPT0gLTEpCisgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0ucERhdGEgIT0gTlVMTCkgKQorICAgICAgICB7CisgICAgICAgICAgICBVSU5UIHBheWxvYWRCaXRzID0gMDsKKworICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgeworICAgICAgICAgICAgICAgIGlmIChoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZ3JhbnRlZCBmcmFtZSBkc2UgYml0cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGFuYyBkYXRhIGlmIGJpdHJhdGUgY29uc3RyYWludCBmdWxmaWxsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKChleHRQYXlsb2FkW25dLmRhdGFTaXplPj4zKSA8PSBoQWFjRW5jLT5jb25maWctPm1heEFuY0J5dGVzUGVyQVUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGZpeE1pbiggZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSwgcGF5bG9hZEJpdHMgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBxY091dC0+bkV4dGVuc2lvbnMrKzsKKworICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS50eXBlICAgICAgICAgPSBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCisgICAgICAgICAgICAgICAgcWNPdXQtPmV4dGVuc2lvbltpZHhdLm5QYXlsb2FkQml0cyA9IHBheWxvYWRCaXRzOworICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS5wUGF5bG9hZCA9IGV4dFBheWxvYWRbbl0ucERhdGE7CisgICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCisgICAgICAgICAgICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+ZXh0ZW5zaW9uW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnICk7CisgICAgICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgeworICAgICAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgdGhlIHByb2Nlc3NlZCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVNpemUgLT0gcGF5bG9hZEJpdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4dFBheWxvYWRVc2VkW25dID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRVIpKSkgeworICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRUxfSURfQklUUzsgIC8qIGFkZCBiaXRzIGZvciBJRF9FTkQgKi8KKyAgICB9CisKKyAgICAvKiBidWlsZCBiaXRzdHJlYW0gYWxsIG5TdWJGcmFtZXMgKi8KKyAgICB7CisgICAgICAgIElOVCB0b3RhbEJpdHMgICAgPSAwOyAgIC8qIFRvdGFsIEFVIGJpdHMgKi87CisgICAgICAgIElOVCBhdmdUb3RhbEJpdHMgPSAwOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgLyogR2V0IGF2ZXJhZ2UgdG90YWwgYml0cyAqLworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZyYW1lIHdpc2UgYml0cmF0ZSBhZGFwdGlvbiAqLworICAgICAgICAgICAgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoaEFhY0VuYy0+cWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Z1RvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZnJhbWVsZW5ndGgpOworCisgICAgICAgICAgICAvKiBhZGp1c3Qgc3VwZXIgZnJhbWUgYml0cmF0ZSAqLworICAgICAgICAgICAgYXZnVG90YWxCaXRzICo9IGhBYWNFbmMtPmNvbmZpZy0+blN1YkZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1ha2UgZmlyc3QgZXN0aW1hdGUgb2YgdHJhbnNwb3J0IGhlYWRlciBvdmVyaGVhZC4KKyAgICAgICAgICAgVGFrZSBtYXhpbXVtIHBvc3NpYmxlIGZyYW1lIHNpemUgaW50byBhY2NvdW50IHRvIHByZXZlbnQgYml0cmVzZXJ2b2lyIHVuZGVycnVuLiAqLworICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbC0+Z2xvYkhkckJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIGF2Z1RvdGFsQml0cyArIGhBYWNFbmMtPnFjS2VybmVsLT5iaXRSZXNUb3QpOworCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ01haW4oaEFhY0VuYy0+cWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoQWFjRW5jLT5hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisKKyAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmVsZW1lbnRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCk7CisgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKyAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgIHRvdGFsQml0cyArPSBxY091dC0+dG90YWxCaXRzOworCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICBGREthYWNFbmNfdXBkYXRlQml0cmVzKGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjT3V0KTsKKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAgICAgICAgICAgLyogd3JpdGUgYml0c3RyZWFtIGhlYWRlciAqLworICAgICAgICAgICAgICB0cmFuc3BvcnRFbmNfV3JpdGVBY2Nlc3NVbml0KAorICAgICAgICAgICAgICAgICAgICBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgIHRvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0VuY0JpdHJlc1RvVHBCaXRyZXMoaEFhY0VuYy0+Yml0cmF0ZU1vZGUsIGhBYWNFbmMtPnFjS2VybmVsLT5iaXRSZXNUb3QpLAorICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzRWZmKTsKKworICAgICAgICAgICAgICAvKiB3cml0ZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgY20sCisgICAgICAgICAgICAgICAgICAgIHFjT3V0LAorICAgICAgICAgICAgICAgICAgICBwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCisgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOworCisgICAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKworICAgICAgICAgICAgICAvKiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCgpIGlzIGJlaW5nIGNhbGxlZCBpbnNpZGUgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKCkgKi8KKyAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX0dldEZyYW1lKGhUcEVuYywgbk91dEJ5dGVzKTsKKworICAgIH0gLyogLWVuZC0gaWYgKGN1ckZyYW1lPT1oQWFjRW5jLT5xY0tlcm5lbC0+blN1YkZyYW1lcykgKi8KKworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIHJldHVybiBBQUNfRU5DX09LOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19DbG9zZQorICAgIGRlc2NyaXB0aW9uOiBkZWxldGUgZW5jb2RlciBpbnN0YW5jZQorICAgIHJldHVybnM6CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBGREthYWNFbmNfQ2xvc2UoIEhBTkRMRV9BQUNfRU5DKiAgcGhBYWNFbmMpICAgLyogZW5jb2RlciBoYW5kbGUgKi8KK3sKKyAgICBpZiAoKnBoQWFjRW5jID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUFDX0VOQyAqaEFhY0VuYyA9IChBQUNfRU5DKikqcGhBYWNFbmM7CisKKyAgIGlmIChoQWFjRW5jLT5keW5hbWljX1JBTSAhPSBOVUxMKQorICAgICAgIEZyZWVBQUNkeW5hbWljX1JBTSgmaEFhY0VuYy0+ZHluYW1pY19SQU0pOworCisgICAgRkRLYWFjRW5jX1BzeUNsb3NlKCZoQWFjRW5jLT5wc3lLZXJuZWwsaEFhY0VuYy0+cHN5T3V0KTsKKworICAgIEZES2FhY0VuY19RQ0Nsb3NlKCZoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+cWNPdXQpOworCisgICAgRnJlZVJhbV9hYWNFbmNfQWFjRW5jb2RlcihwaEFhY0VuYyk7Cit9CisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluIHRoaXMgc291cmNlIGZpbGUgb25seSBmb3IgY29udmVuaWVuY2UgYW5kICovCisvKiBuZWVkIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgYSBwb3NzaWJsZSBlbmNvZGVyIGxpYnJhcnkuICovCisKKy8qIGJhc2ljIGRlZmluZXMgZm9yIGFuY2lsbGFyeSBkYXRhICovCisjZGVmaW5lIE1BWF9BTkNSQVRFIDE5MjAwICAgICAgICAgICAgLyogYW5jaWxsYXJ5IHJhdGUgPj0gMTkyMDAgaXNuJ3QgdmFsaWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGZ1bmN0aW9ubmFtZTogIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkKKyAgICBkZXNjcmlwdGlvbjogICBpbml0aWFsaXplIGFuZCBjaGVjayBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3QKKyAgICByZXR1cm46ICAgICAgICBpZiBzdWNjZXNzIG9yIE5VTEwgaWYgZXJyb3IKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5jaWxsYXJ5UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUpCit7CisgIElOVCBkaWZmVG9CeXRlQWxpZ247CisKKyAgLyogZG9uJ3QgdXNlIG5lZ2F0aXZlIGFuY2lsbGFyeSByYXRlcyAqLworICBpZiAoIGFuY2lsbGFyeVJhdGUgPCAtMSApCisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEU7CisKKyAgLyogY2hlY2sgaWYgYW5jaWxsYXJ5IHJhdGUgaXMgb2sgKi8KKyAgaWYgKCAoYW5jaWxsYXJ5UmF0ZSAhPSAoLTEpKSAmJiAoYW5jaWxsYXJ5UmF0ZSAhPSAwKSApIHsKKyAgICAvKiBhbmNSYXRlIDw9IDE1JSBvZiBiaXRyYXRlICYmIGFuY1JhdGUgPCAxOTIwMCAqLworICAgIGlmICggKCBhbmNpbGxhcnlSYXRlID49IE1BWF9BTkNSQVRFICkgfHwKKyAgICAgICAgICggKGFuY2lsbGFyeVJhdGUgKiAyMCkgPiAoYml0UmF0ZSAqIDMpICkgKSB7CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoYW5jaWxsYXJ5UmF0ZSA9PSAtMSkgeworICAgIC8qIGlmIG5vIHNwZWNpYWwgYW5jUmF0ZSBpcyByZXF1ZXN0ZWQgYnV0IGEgYW5jaWxsYXJ5IGZpbGUgaXMKKyAgICAgICBzdGF0ZWQsIHRoZW4gZ2VuZXJhdGUgYSBhbmNpbGxhcnkgcmF0ZSBtYXRjaGluZyB0byB0aGUgYml0cmF0ZSAqLworICAgIGlmIChiaXRSYXRlID49IChNQVhfQU5DUkFURSAqIDEwKSkgeworICAgICAgLyogYW5jaWxsYXJ5IHJhdGUgaXMgMTkxOTkgKi8KKyAgICAgIGFuY2lsbGFyeVJhdGUgPSAoTUFYX0FOQ1JBVEUgLSAxKTsKKyAgICB9CisgICAgZWxzZSB7IC8qIDEwJSBvZiBiaXRyYXRlICovCisgICAgICBhbmNpbGxhcnlSYXRlID0gYml0UmF0ZSAvIDEwOworICAgIH0KKyAgfQorCisgIC8qIG1ha2UgYW5jaWxsYXJ5Qml0c1BlckZyYW1lIGJ5dGUgYWxpZ24gKi8KKyAgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSA9IChhbmNpbGxhcnlSYXRlICogZnJhbWVsZW5ndGggKSAvIHNhbXBsZVJhdGU7CisgIGRpZmZUb0J5dGVBbGlnbiA9ICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgJSA4OworICAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lID0gKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSAtIGRpZmZUb0J5dGVBbGlnbjsKKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuYy5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYzNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuYy5oCkBAIC0wLDAgKzEsMzIyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogIEZhc3QgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gU2NodWcgLyBBLiBHcm9lc2NoZWwKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBmYXN0IGFhYyBjb2RlciBpbnRlcmZhY2UgbGlicmFyeSBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9hYWNlbmNfaF8KKyNkZWZpbmUgX2FhY2VuY19oXworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjaW5jbHVkZSAidHBlbmNfbGliLmgiCisKKyNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBBQUMtTEMgZXJyb3IgY29kZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEFBQ19FTkNfT0sgICAgICAgPSAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAqLworCisgIEFBQ19FTkNfVU5LTk9XTiAgPSAweDAwMDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yIGNvbmRpdGlvbiBpcyBvZiB1bmtub3duIHJlYXNvbiwgb3IgZnJvbSBhbm90aGVyIG1vZHVsZS4gICAgICAgICAgICAgICovCisKKyAgLyogaW5pdGlhbGl6YXRpb24gZXJyb3JzICovCisgIGFhY19lbmNfaW5pdF9lcnJvcl9zdGFydCAgICAgID0gMHgyMDAwLAorICBBQUNfRU5DX0lOVkFMSURfSEFORExFICAgICAgICA9IDB4MjAyMCwgICAgICAgICAgICAgLyohPCBUaGUgaGFuZGxlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZCAocHJvYmFibHkgTlVMTCkuICAgICAgICAqLworICBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIICA9IDB4MjA4MCwgICAgICAgICAgICAgLyohPCBJbnZhbGlkIGZyYW1lIGxlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNfRU5DX0lOVkFMSURfTl9DSEFOTkVMUyAgICA9IDB4MjBlMCwgICAgICAgICAgICAgLyohPCBJbnZhbGlkIGFtb3VudCBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNfRU5DX0lOVkFMSURfU0ZCX1RBQkxFICAgICA9IDB4MjE0MCwgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBlbmNvZGVyIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQU9UICAgICAgICAgICAgPSAweDMwMDAsICAgICAgICAvKiE8IFRoZSBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKSBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURSAgICAgICAgPSAweDMwMjAsICAgICAgICAvKiE8IFRoZSBjaG9zZW4gYml0cmF0ZSBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFICAgPSAweDMwMjgsICAgICAgICAvKiE8IFVuc3VwcG9ydGVkIGJpdCByYXRlIG1vZGUgKENCUiBvciBWQlIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEUgICAgPSAweDMwNDAsICAgICAgICAvKiE8IFVuc3VwcG9ydGVkIGFuY2lsbGF5IGJpdHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX01PREUgICAgICAgPSAweDMwNjAsCisgIEFBQ19FTkNfVU5TVVBQT1JURURfVFJBTlNQT1JUX1RZUEUgPSAweDMwODAsICAgICAgICAvKiE8IFRoZSBiaXRzdHJlYW0gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgPSAweDMwYTAsICAgICAgICAvKiE8IFRoZSBlcnJvciByZXNpbGllbmNlIHRvb2wgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfRVBDT05GSUcgICAgICAgPSAweDMwYzAsICAgICAgICAvKiE8IFRoZSBlcnJvciBwcm90ZWN0aW9uIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRyAgPSAweDMwZTAsICAgICAgICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFICAgPSAweDMxMDAsICAgICAgICAvKiE8IFNhbXBsZSByYXRlIG9mIGF1ZGlvIGlucHV0IGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfTk9fTUVNT1JZICAgICAgICAgICAgICAgICAgPSAweDMxMjAsICAgICAgICAvKiE8IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuICovCisgIEFBQ19FTkNfUEVfSU5JVF9UQUJMRV9OT1RfRk9VTkQgICAgPSAweDMxNDAsICAgICAgICAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICAgICovCisKKyAgYWFjX2VuY19pbml0X2Vycm9yX2VuZCwKKworICAvKiBlbmNvZGUgZXJyb3JzICovCisgIGFhY19lbmNfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwLAorICBBQUNfRU5DX1FVQU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAyMCwgICAgICAgLyohPCBUb28gbWFueSBiaXRzIHVzZWQgaW4gcXVhbnRpemF0aW9uLiAgICAgICAgICAgICAqLworICBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUiAgICAgICAgICAgICAgICA9IDB4NDA0MCwgICAgICAgLyohPCBVbmV4cGVjdGVkIG51bWJlciBvZiB3cml0dGVuIGJpdHMsIGRpZmZlcnMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZCBudW1iZXIgb2YgYml0cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19QTlNfVEFCTEVfRVJST1IgICAgICAgICAgICAgICAgICAgPSAweDQwNjAsICAgICAgIC8qITwgUE5TIGxldmVsIG91dCBvZiByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19HTE9CQUxfR0FJTl9UT09fSElHSCAgICAgICAgICAgICAgPSAweDQwODAsICAgICAgIC8qITwgSW50ZXJuYWwgcXVhbnRpemVyIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19CSVRSRVNfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgPSAweDQwYTAsICAgICAgIC8qITwgVG9vIGZldyAgYml0cyBpbiBiaXQgcmVzZXJ2b2lyLiAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19CSVRSRVNfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgPSAweDQwYTEsICAgICAgIC8qITwgVG9vIG1hbnkgYml0cyBpbiBiaXQgcmVzZXJ2b2lyLiAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19JTlZBTElEX0NIQU5ORUxfQklUUkFURSAgICAgICAgICAgPSAweDQxMDAsCisgIEFBQ19FTkNfSU5WQUxJRF9FTEVNRU5USU5GT19UWVBFICAgICAgICAgID0gMHg0MTIwLCAgICAgICAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgQUFDX0VOQ19XUklURV9TQ0FMX0VSUk9SICAgICAgICAgICAgICAgICAgPSAweDQxZTAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzY2FsZWZhY0RhdGEuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19XUklURV9TRUNfRVJST1IgICAgICAgICAgICAgICAgICAgPSAweDQyMDAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzZWN0aW9uRGF0YS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19XUklURV9TUEVDX0VSUk9SICAgICAgICAgICAgICAgICAgPSAweDQyMjAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzcGVjdHJhbERhdGEuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgYWFjX2VuY19lcnJvcl9lbmQKKworfSBBQUNfRU5DT0RFUl9FUlJPUjsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQU5DX0RBVEFfQlVGRkVSU0laRSAxMDI0ICAgICAgLyogYW5jQnVmZmVyIHNpemUgKi8KKworI2RlZmluZSBNQVhfVE9UQUxfRVhUX1BBWUxPQURTICAoKCg4KSAqICgxKSkgKyAoMisyKSkKKworCit0eXBlZGVmIGVudW0geworICBBQUNFTkNfQlJfTU9ERV9JTlZBTElEID0gLTEsICAvKiE8IEludmFsaWQgYml0cmF0ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9DQlIgICAgID0gIDAsICAvKiE8IENvbnN0YW50IGJpdHJhdGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfMSAgID0gIDEsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgMzIga2Jwcy9jaGFubmVsLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfMiAgID0gIDIsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNDAga2Jwcy9jaGFubmVsLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfMyAgID0gIDMsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNDgtNTYga2Jwcy9jaGFubmVsLiAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfNCAgID0gIDQsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNjQga2Jwcy9jaGFubmVsLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfNSAgID0gIDUsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgODAtOTYga2Jwcy9jaGFubmVsLiAqLworICBBQUNFTkNfQlJfTU9ERV9GRiAgICAgID0gIDYsICAvKiE8IEZpeGVkIGZyYW1lIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9TRlIgICAgID0gIDcgICAvKiE8IFN1cGVyZnJhbWUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IEFBQ0VOQ19CSVRSQVRFX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisKKyAgQ0hfT1JERVJfTVBFRyA9IDAsICAvKiE8IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkgICAgICAgICAgICovCisgIENIX09SREVSX1dBViAgICAgICAgLyohPCBXQVYgZmlsZWZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwgU0wsIFNSKSAqLworCit9IENIQU5ORUxfT1JERVI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBBQUNFTkNfQ09ORklHIHsKKyAgSU5UICAgc2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogZW5jb2RlciBzYW1wbGUgcmF0ZSAqLworICBJTlQgICBiaXRSYXRlOyAgICAgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovCisgIElOVCAgIGFuY0RhdGFCaXRSYXRlOyAgICAgICAgIC8qIGFkZGl0aW9uYWwgYml0cyBjb25zdW1lZCBieSBhbmMgZGF0YSBvciBzYnIgaGF2ZSB0byBiZSBjb25zaWVkZXJlZCB3aGlsZSBjb25maWd1cmF0aW9uICovCisKKyAgSU5UICAgblN1YkZyYW1lczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZyYW1lcyBpbiBzdXBlciBmcmFtZSAobm90IEFEVFMvTEFUTSBzdWJmcmFtZXMgISkgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlOyAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlICAqLworCisgIElOVCAgIGF2ZXJhZ2VCaXRzOyAgICAgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zdXBlcmZyYW1lICovCisgIElOVCAgIGJpdHJhdGVNb2RlOyAgICAgICAgICAgIC8qIGVuY29kZXIgYml0cmF0ZSBtb2RlIChDQlIvVkJSKSAqLworICBJTlQgICBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLworICBDSEFOTkVMX09SREVSIGNoYW5uZWxPcmRlcjsgICAvKiBJbnB1dCBDaGFubmVsIG9yZGVyaW5nIHNjaGVtZS4gKi8KKyAgSU5UICAgYmFuZFdpZHRoOyAgICAgICAgICAgICAgLyogdGFyZ2V0ZWQgYXVkaW8gYmFuZHdpZHRoIGluIEh6ICovCisgIENIQU5ORUxfTU9ERSAgY2hhbm5lbE1vZGU7ICAgIC8qIGVuY29kZXIgY2hhbm5lbCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgSU5UICAgZnJhbWVsZW5ndGg7ICAgICAgICAgICAgLyogdXNlZCBmcmFtZSBzaXplICovCisKKyAgVUlOVCAgc3ludGF4RmxhZ3M7ICAgICAgICAgICAgLyogYml0c3RyZWFtcyBzeW50YXggY29uZmlndXJhdGlvbiAqLworICBTQ0hBUiBlcENvbmZpZzsgICAgICAgICAgICAgICAvKiBlcnJvciBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKworICBJTlQgICBhbmNfUmF0ZTsgICAgICAgICAgICAgICAvKiBhbmNpbGxhcnkgcmF0ZSwgMCAoZGlzYWJsZWQpLCAtMSAoZGVmYXVsdCkgZWxzZSBkZXNpcmVkIHJhdGUgKi8KKyAgVUlOVCAgbWF4QW5jQnl0ZXNQZXJBVTsKKyAgSU5UICAgbWluQml0c1BlckZyYW1lOyAgICAgICAgLyogbWluaW11bSBudW1iZXIgb2YgYml0cyBpbiBBVSAqLworICBJTlQgICBtYXhCaXRzUGVyRnJhbWU7ICAgICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIEFVICovCisgIElOVCAgIGJpdHJlc2Vydm9pcjsgICAgICAgICAgIC8qIHNpemUgb2YgYml0cmVzZXJ2b2lyICovCisKKyAgVUlOVCAgc2JyUmF0aW87ICAgICAgICAgICAgICAgLyogc2JyIHNhbXBsaW5nIHJhdGUgcmF0aW86IGR1YWwtIG9yIHNpbmdsZS1yYXRlICovCisKKyAgVUNIQVIgdXNlVG5zOyAgICAgICAgICAgICAgICAgLyogZmxhZzogdXNlIHRlbXBvcmFsIG5vaXNlIHNoYXBpbmcgKi8KKyAgVUNIQVIgdXNlUG5zOyAgICAgICAgICAgICAgICAgLyogZmxhZzogdXNlIHBlcmNlcHR1YWwgbm9pc2Ugc3Vic3RpdHV0aW9uICovCisgIFVDSEFSIHVzZUlTOyAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IHVzZSBpbnRlbnNpdHkgY29kaW5nICovCisKKyAgVUNIQVIgdXNlUmVxdWFudDsgICAgICAgICAgICAgLyogZmxhZzogdXNlIGFmdGVyYnVybmVyICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSICAgICAgICAgICAgKnBEYXRhOyAgICAgIC8qIHBvaW50ZXIgdG8gZXh0ZW5zaW9uIHBheWxvYWQgZGF0YSAqLworICBVSU5UICAgICAgICAgICAgICBkYXRhU2l6ZTsgICAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHNpemUgaW4gYml0cyAqLworICBFWFRfUEFZTE9BRF9UWVBFICBkYXRhVHlwZTsgICAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHR5cGUgKi8KKyAgSU5UICAgICAgICAgICAgICAgYXNzb2NpYXRlZENoRWxlbWVudDsgIC8qIG51bWJlciBvZiB0aGUgY2hhbm5lbCBlbGVtZW50IHRoZSBkYXRhIGlzIGFzc2lnbmVkIHRvICovCit9IEFBQ0VOQ19FWFRfUEFZTE9BRDsKKwordHlwZWRlZiBzdHJ1Y3QgQUFDX0VOQyAqSEFORExFX0FBQ19FTkM7CisKKy8qKgorICogXGJyaWVmIExpbWl0IGdpdmVuIGJpdCByYXRlIHRvIGEgdmFsaWQgdmFsdWUKKyAqIFxwYXJhbSBoVHBFbmMgdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlCisgKiBccGFyYW0gY29yZVNhbXBsaW5nUmF0ZSB0aGUgc2FtcGxlIHJhdGUgdG8gYmUgdXNlZCBmb3IgdGhlIEFBQyBlbmNvZGVyCisgKiBccGFyYW0gZnJhbWVMZW5ndGggdGhlIGZyYW1lTGVuZ3RoIHRvIGJlIHVzZWQgZm9yIHRoZSBBQUMgZW5jb2RlcgorICogXHBhcmFtIG5DaGFubmVscyBudW1iZXIgb2YgdG90YWwgY2hhbm5lbHMKKyAqIFxwYXJhbSBuQ2hhbm5lbHNFZmYgbnVtYmVyIG9mIGVmZmVjdGl2ZSBjaGFubmVscworICogXHBhcmFtIGJpdFJhdGUgdGhlIGluaXRpYWwgYml0IHJhdGUgdmFsdWUgZm9yIHdoaWNoIHRoZSBjbG9zZXN0IHZhbGlkIGJpdCByYXRlIHZhbHVlIGlzIHNlYXJjaGVkIGZvcgorICogXHBhcmFtIGF2ZXJhZ2VCaXRzIGF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUgZm9yIGZpeGVkIGZyYW1pbmcuIFNldCB0byAtMSBpZiBub3QgYXZhaWxhYmxlLgorICogXHBhcmFtIG9wdGlvbmFsIHBvaW50ZXIgd2hlcmUgdGhlIGN1cnJlbnQgYml0cyBwZXIgZnJhbWUgYXJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGJpdHJhdGVNb2RlIHRoZSBjdXJyZW50IGJpdCByYXRlIG1vZGUKKyAqIFxwYXJhbSBuU3ViRnJhbWVzIG51bWJlciBvZiBzdWIgZnJhbWVzIGZvciBzdXBlciBmcmFtaW5nIChub3QgdHJhbnNwb3J0IGZyYW1lcykuCisgKiBccmV0dXJuIGEgdmFsaWQgYml0IHJhdGUgdmFsdWUgYXMgY2xvc2UgYXMgcG9zc2libGUgb3IgaWRlbnRpY2FsIHRvIGJpdFJhdGUKKyAqLworSU5UIEZES2FhY0VuY19MaW1pdEJpdHJhdGUoCisgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICBJTlQgY29yZVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICBJTlQgbkNoYW5uZWxzLAorICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAorICAgICAgICBJTlQgYml0UmF0ZSwKKyAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzLAorICAgICAgICBJTlQgKnBBdmVyYWdlQml0c1BlckZyYW1lLAorICAgICAgICBJTlQgYml0cmF0ZU1vZGUsCisgICAgICAgIElOVCBuU3ViRnJhbWVzCisgICAgICAgICk7CisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfR2V0VkJSQml0cmF0ZQorICAgICBkZXNjcmlwdGlvbjogIEdldCBWQlIgYml0cmF0ZSBmcm9tIHZiciBxdWFsaXR5CisgICAgIGlucHV0IHBhcmFtczogaW50IHZiclF1YWxpdHkgKFZCUjAsIFZCUjEsIFZCUjIpCisgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUKKyAgICAgcmV0dXJuczogICAgICB2YnIgYml0cmF0ZQorCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyBJTlQgRkRLYWFjRW5jX0dldFZCUkJpdHJhdGUoSU5UIGJpdHJhdGVNb2RlLCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZworICAgICBkZXNjcmlwdGlvbjogIGdpdmVzIHJlYXNvbmFibGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgIHJldHVybnM6ICAgICAgLS0tCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAgICAgKmNvbmZpZyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19PcGVuCisgICAgZGVzY3JpcHRpb246IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGVuY29kZXIgaW5zdGFuY2UKKyAgICByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19PcGVuKEhBTkRMRV9BQUNfRU5DICAqcGhBYWNFbmMsICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkVsZW1lbnRzLCAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbWF4aW1hbCBlbGVtZW50cyBpbiBpbnN0YW5jZSB0byBzdXBwb3J0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5DaGFubmVscywgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1heGltYWwgY2hhbm5lbHMgaW4gaW5zdGFuY2UgdG8gc3VwcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzKTsgICAgICAgICAgIC8qIHN1cHBvcnQgc3VwZXJmcmFtaW5nIGluIGluc3RhbmNlICovCisKKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRpYWxpemUoSEFORExFX0FBQ19FTkMgICAgIGhBYWNFbmNvZGVyLCAgIC8qIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUsIGluaXRpYWxpemVkIG9uIHJldHVybiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0NPTkZJRyAgICAqY29uZmlnLCAgICAgICAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgICAgICAgICAgICAgaW5pdEZsYWdzKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRW5jb2RlRnJhbWUKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZSBvbmUgZnJhbWUKKyAgICByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSggSEFORExFX0FBQ19FTkMgICAgICAgaEFhY0VuYywgICAgICAgICAvKiBlbmNvZGVyIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00qICAgICAgICAgICAgIGlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqICAgICAgICAgICAgICAgICBudW1PdXRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICAgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfQ2xvc2UKKyAgICBkZXNjcmlwdGlvbjogZGVsZXRlIGVuY29kZXIgaW5zdGFuY2UKKyAgICByZXR1cm5zOgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRkRLYWFjRW5jX0Nsb3NlKCBIQU5ETEVfQUFDX0VOQyogIHBoQWFjRW5jKTsgICAvKiBlbmNvZGVyIGhhbmRsZSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX2FhY2VuY19oXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfaGNyLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19oY3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjYyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfaGNyLmNwcApAQCAtMCwwICsxLDkzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgUi4gQm9laG0KKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBodWZmbWFuIGNvZGV3b3JkIHJlb3JkZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzb3VyY2UgZnJvbSBhYWNFcnJSb2JUcmFucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNlbmNfaGNyLmgiCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19oY3IuaCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19oY3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQyNDdhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2hjci5oCkBAIC0wLDAgKzEsOTYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBSLiBCb2VobQorICAgY29udGVudHMvZGVzY3JpcHRpb246IGh1ZmZtYW4gY29kZXdvcmQgcmVvcmRlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHNvdXJjZSBmcm9tIGFhY0VyclJvYlRyYW5zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQUFDRU5DX0hDUgorI2RlZmluZSBfQUFDRU5DX0hDUl9ICisKKworI2VuZGlmICAvKiBpZm5kZWYgX0FBQ0VOQ19IQ1IgKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19saWIuY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZGY2NQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19saWIuY3BwCkBAIC0wLDAgKzEsMjEyNSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctNCBIRS1BQUMgRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgorICBjb250ZW50cy9kZXNjcmlwdGlvbjogRkRLIEhFLUFBQyBFbmNvZGVyIGludGVyZmFjZSBsaWJyYXJ5IGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjZW5jX2xpYi5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgImFhY2VuYy5oIgorCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorI2luY2x1ZGUgIkZES19jb3JlLmgiIC8qIEZES190b29scyB2ZXJzaW9uaW5nIGluZm8gKi8KKworLyogRW5jb2RlciBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwwIDMKKyNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwxIDQKKyNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwyIDEyCisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1RJVExFICJBQUMgRW5jb2RlciIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKKworI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisjaW5jbHVkZSAiLi4vc3JjL3Nicl9yYW0uaCIKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiYml0ZW5jLmgiCisKKyNpbmNsdWRlICJ0cGVuY19saWIuaCIKKworI2luY2x1ZGUgIm1ldGFkYXRhX21haW4uaCIKKworI2RlZmluZSBTQkwoZmwpICAgICAgICAgICAgKGZsLzgpICAgICAgICAgICAgICAgICAvKiE8IFNob3J0IGJsb2NrIGxlbmd0aCAoaGFyZGNvZGVkIHRvIDggc2hvcnQgYmxvY2tzIHBlciBsb25nIGJsb2NrKSAqLworI2RlZmluZSBCU0xBKGZsKSAgICAgICAgICAgKDQqU0JMKGZsKStTQkwoZmwpLzIpICAvKiE8IEFBQyBibG9jayBzd2l0Y2hpbmcgbG9vay1haGVhZCAqLworI2RlZmluZSBERUxBWV9BQUMoZmwpICAgICAgKGZsK0JTTEEoZmwpKSAgICAgICAgICAvKiE8IE1EQ1QgKyBibG9ja3N3aXRjaGluZyAqLworI2RlZmluZSBERUxBWV9BQUNFTEQoZmwpICAgKChmbCkvMikgICAgICAgICAgICAgICAvKiE8IEVMRCBGQiBkZWxheSAobm8gZnJhbWluZyBkZWxheSBpbmNsdWRlZCkgKi8KKworI2RlZmluZSBJTlBVVEJVRkZFUl9TSVpFICgxNTM3KzEwMCsyMDQ4KQorCisjZGVmaW5lIERFRkFVTFRfSEVBREVSX1BFUklPRF9SRVBFVElUSU9OX1JBVEUgIDEwIC8qITwgRGVmYXVsdCBoZWFkZXIgcmVwZXRpdGlvbiByYXRlIHVzZWQgaW4gdHJhbnNwb3J0IGxpYnJhcnkgYW5kIGZvciBTQlIgaGVhZGVyLiAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKgorICogRmxhZ3MgdG8gY2hhcmFjdGVyaXplIGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gcHJlc2VudCBpbnN0YW5jZS4KKyAqLworZW51bSB7CisgICAgRU5DX01PREVfRkxBR19BQUMgID0gMHgwMDAxLAorICAgIEVOQ19NT0RFX0ZMQUdfU0JSICA9IDB4MDAwMiwKKyAgICBFTkNfTU9ERV9GTEFHX1BTICAgPSAweDAwMDQsCisgICAgRU5DX01PREVfRkxBR19TQUMgID0gMHgwMDA4LAorICAgIEVOQ19NT0RFX0ZMQUdfTUVUQSA9IDB4MDAxMAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVVESU9fT0JKRUNUX1RZUEUgdXNlckFPVDsgICAgICAgICAgICAgICAvKiE8IEF1ZGlvIE9iamVjdCBUeXBlLiAgICAgICAgICAgICAqLworICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJTYW1wbGVyYXRlOyAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kuICAgICAgICAgICAgKi8KKyAgICBVSU5UICAgICAgICAgICAgICBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qITwgd2lsbCBiZSBzZXQgdmlhIGNoYW5uZWxNb2RlLiAgICovCisgICAgQ0hBTk5FTF9NT0RFICAgICAgdXNlckNoYW5uZWxNb2RlOworICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJCaXRyYXRlOworICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJCaXRyYXRlTW9kZTsKKyAgICBVSU5UICAgICAgICAgICAgICB1c2VyQmFuZHdpZHRoOworICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJBZnRlcmJ1cm5lcjsKKyAgICBVSU5UICAgICAgICAgICAgICB1c2VyRnJhbWVsZW5ndGg7CisgICAgVUlOVCAgICAgICAgICAgICAgdXNlckFuY0RhdGFSYXRlOworCisgICAgVUNIQVIgICAgICAgICAgICAgdXNlclRuczsgICAgICAgICAgICAgICAvKiE8IFVzZSBUTlMgY29kaW5nLiAqLworICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJQbnM7ICAgICAgICAgICAgICAgLyohPCBVc2UgUE5TIGNvZGluZy4gKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICB1c2VySW50ZW5zaXR5OyAgICAgICAgIC8qITwgVXNlIEludGVuc2l0eSBjb2RpbmcuICovCisKKyAgICBUUkFOU1BPUlRfVFlQRSAgICB1c2VyVHBUeXBlOyAgICAgICAgICAgIC8qITwgVHJhbnNwb3J0IHR5cGUgKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBTaWduYWxpbmc7ICAgICAgIC8qITwgRXh0ZW5zaW9uIEFPVCBzaWduYWxpbmcgbW9kZS4gKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBOc3ViRnJhbWVzOyAgICAgIC8qITwgTnVtYmVyIG9mIHN1YiBmcmFtZXMgaW4gYSB0cmFuc3BvcnQgZnJhbWUgZm9yIExPQVMvTEFUTSBvciBBRFRTIChkZWZhdWx0IDEpLiAqLworICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcEFteHY7ICAgICAgICAgICAgLyohPCBBdWRpb011eFZlcnNpb24gdG8gYmUgdXNlZCBmb3IgTEFUTSAoZGVmYXVsdCAwKS4gKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBQcm90ZWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcEhlYWRlclBlcmlvZDsgICAgLyohPCBQYXJhbWV0ZXIgdXNlZCB0byBjb25maWd1cmUgTEFUTS9MT0FTIFNNQyByYXRlLiBNb3Jlb3ZlciB0aGlzIHBhcmFtZXRlcnMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25maWd1cmUgcmVwZXRpdGlvbiByYXRlIG9mIFBDRSBpbiByYXdfZGF0YV9ibG9jay4gKi8KKworICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJFclRvb2xzOyAgICAgICAgICAgLyohPCBVc2UgVkNCMTEsIEhDUiBhbmQvb3IgUlZMQyBFUiB0b29sLiAqLworICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJQY2VBZGRpdGlvbnM7ICAgICAgLyohPCBDb25maWd1cmUgYWRkaXRpb25hbCBiaXRzIGluIFBDRS4gKi8KKworICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJNZXRhRGF0YU1vZGU7ICAgICAgLyohPCBNZXRhIGRhdGEgbGlicmFyeSBjb25maWd1cmF0aW9uLiAqLworCisgICAgVUNIQVIgICAgICAgICAgICAgdXNlclNickVuYWJsZWQ7ICAgICAgICAvKiE8IEVuYWJsZSBTQlIgZm9yIEVMRC4gKi8KKyAgICBVSU5UICAgICAgICAgICAgICB1c2VyU2JyUmF0aW87ICAgICAgICAgIC8qITwgU0JSIHNhbXBsaW5nIHJhdGUgcmF0aW8uIER1YWwtIG9yIHNpbmdsZS1yYXRlLiAqLworCit9IFVTRVJfUEFSQU07CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIERlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAgQUFDRU5DX0NPTkZJRyAgICAgKkhBTkRMRV9BQUNFTkNfQ09ORklHOworCisKK3N0cnVjdCBBQUNFTkNPREVSCit7CisgICAgVVNFUl9QQVJBTSAgICAgICAgICAgICAgIGV4dFBhcmFtOworICAgIENPREVSX0NPTkZJRyAgICAgICAgICAgICBjb2RlckNvbmZpZzsKKworICAgIC8qIEFBQyAqLworICAgIEFBQ0VOQ19DT05GSUcgICAgICAgICAgICBhYWNDb25maWc7CisgICAgSEFORExFX0FBQ19FTkMgICAgICAgICAgIGhBYWNFbmM7CisKKyAgICAvKiBTQlIgKi8KKyAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICAgICAgaEVudkVuYzsKKworICAgIC8qIE1ldGEgRGF0YSAqLworICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgaE1ldGFkYXRhRW5jOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFBbGxvd2VkOyAvKiBTaWduYWwgd2hldGhlciBjaG9zZW4gY29uZmlndXJhdGlvbiBhbGxvd3MgbWV0YWRhdGEuIE5lY2Vzc2FyeSBmb3IgZGVsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uLiBNZXRhZGF0YSBtb2RlIGlzIGEgc2VwYXJhdGUgcGFyYW1ldGVyLiAqLworCisgICAgLyogVHJhbnNwb3J0ICovCisgICAgSEFORExFX1RSQU5TUE9SVEVOQyAgICAgIGhUcEVuYzsKKworICAgIC8qIE91dHB1dCAqLworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICpvdXRCdWZmZXI7ICAgICAgICAgLyogSW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciAqLworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXJJbkJ5dGVzOyAgIC8qIFNpemUgb2YgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciovCisKKyAgICAvKiBJbnB1dCAqLworICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlcjsgICAgICAgIC8qIEludGVybmFsIGlucHV0IGJ1ZmZlci4gSW5wdXQgc291cmNlIGZvciBBQUMgZW5jb2RlciAqLworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldDsgIC8qIFdoZXJlIHRvIHdyaXRlIG5ldyBpbnB1dCBzYW1wbGVzLiAqLworCisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5TYW1wbGVzVG9SZWFkOyAgICAvKiBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyBuZWVlZGVkIGZvciBlbmNvZGluZyBvbmUgZnJhbWUgKi8KKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXNSZWFkOyAgICAgIC8qIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIGFscmVhZHkgaW4gaW5wdXQgYnVmZmVyICovCisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5aZXJvc0FwcGVuZGVkOyAgICAvKiBhcHBlbmRlZCB6ZXJvcyBhdCBlbmQgb2YgZmlsZSovCisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5EZWxheTsgICAgICAgICAgICAvKiBlbmNvZGVyIGRlbGF5ICovCisKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICAgICAgZXh0UGF5bG9hZCBbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU107CisgICAgLyogRXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZERhdGEgWygxKV1bKDgpXVtNQVhfUEFZTE9BRF9TSVpFXTsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZFNpemUgWygxKV1bKDgpXTsgLyogcGF5bG9hZCBzaXplcyBpbiBiaXRzICovCisKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgSW5pdEZsYWdzOyAgICAgICAgIC8qIGludGVybmFsIHN0YXR1cyB0byB0cmVnZ2llciByZS1pbml0aWFsaXphdGlvbiAqLworCisKKyAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGluZm8uICovCisgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5NYXhBYWNFbGVtZW50czsKKyAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbk1heEFhY0NoYW5uZWxzOworICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBuTWF4U2JyRWxlbWVudHM7CisgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5NYXhTYnJDaGFubmVsczsKKyAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgbk1heFN1YkZyYW1lczsKKworICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX21vZGlzOworCisgICAvKiBDYXBhYmlsaXR5IGZsYWdzICovCisgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIENBUEZfdHBFbmM7CisKK30gOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVMT05HICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlOyAgIC8qITwgRW5jb2RlciBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBVTE9ORyAgICAgICAgICAgICAgIGJpdHJhdGVSYW5nZTsgICAvKiE8IExvd2VyIGJpdHJhdGUgcmFuZ2UgZm9yIGNvbmZpZyBlbnRyeS4gKi8KKworICAgIFVDSEFSICAgICAgICAgICAgICAgbG93RGVsYXlTYnI7ICAgIC8qITwgMDogRUxEIHNiciBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFTEQgc2JyIG9uICovCisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIGRvd25zYW1wbGVkU2JyOyAvKiE8IDA6IEVMRCB3aXRoIGR1YWxyYXRlIHNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEVMRCB3aXRoIGRvd25zYW1wbGVkIHNiciAqLworCit9IEVMRF9TQlJfQ09ORklHVVJBVE9SOworCisvKioKKyAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIEVMRC9TQlIgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KKyAqLworc3RhdGljIGNvbnN0IEVMRF9TQlJfQ09ORklHVVJBVE9SIGVsZFNickF1dG9Db25maWdUYWJbXSA9Cit7CisgIHsgNDgwMDAsICAgICAwLCAxLCAwIH0sCisgIHsgNDgwMDAsIDY0MDAxLCAwLCAwIH0sCisKKyAgeyA0NDEwMCwgICAgIDAsIDEsIDAgfSwKKyAgeyA0NDEwMCwgNjQwMDEsIDAsIDAgfSwKKworICB7IDMyMDAwLCAgICAgMCwgMSwgMCB9LAorICB7IDMyMDAwLCAyODAwMCwgMSwgMSB9LAorICB7IDMyMDAwLCA1NjAwMCwgMCwgMCB9LAorCisgIHsgMjQwMDAsICAgICAwLCAxLCAxIH0sCisgIHsgMjQwMDAsIDQwMDAwLCAwLCAwIH0sCisKKyAgeyAxNjAwMCwgICAgIDAsIDEsIDEgfSwKKyAgeyAxNjAwMCwgMjgwMDAsIDAsIDAgfQorCit9OworCisvKgorICogXGJyaWVmICBDb25maWd1cmUgU0JSIGZvciBFTEQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGRlZmF1bHQgU0JSIGNvbmZpZ3VyYXRpb24gZm9yIEVMRCBiYXNlZCBvbiBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIGJpdHJhdGUuCisgKiBPdXRwdXRwYXJhbWV0ZXJzIGFyZSBTQlIgb24vb2ZmLCBhbmQgU0JSIHJhdGlvLgorICoKKyAqIFxwYXJhbSBzYW1wbGluZ1JhdGUgICAgICAgICAgQXVkaW8gc2lnbmFsIHNhbXBsaW5nIHJhdGUuCisgKiBccGFyYW0gY2hhbm5lbE1vZGUgICAgICAgICAgIENoYW5uZWwgY29uZmlndXJhdGlvbiB0byBiZSB1c2VkLgorICogXHBhcmFtIHRvdGFsQml0cmF0ZSAgICAgICAgICBPdmVyYWxsIGJpdHJhdGUuCisgKiBccGFyYW0gZWxkU2JyICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZWxkU2JyIHBhcmFtZXRlciwgZmlsbGVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBlbGRTYnJSYXRpbyAgICAgICAgICAgUG9pbnRlciB0byBlbGRTYnJSYXRpbyBwYXJhbWV0ZXIsIGZpbGxlZCBvbiByZXR1cm4uCisgKgorICogXHJldHVybiAtIEFBQ0VOQ19PSywgYWxsIGZpbmUuCisgKiAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgQUFDRU5DX0VSUk9SIGVsZFNickNvbmZpZ3VyYXRvcigKKyAgICAgICAgY29uc3QgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKKyAgICAgICAgY29uc3QgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdG90YWxCaXRyYXRlLAorICAgICAgICBVSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBlbGRTYnIsCisgICAgICAgIFVJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIGVsZFNiclJhdGlvCisgICAgICAgICkKK3sKKyAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOworICAgIGludCBpLCBjZmdJZHggPSAtMTsKKyAgICBjb25zdCBVTE9ORyBjaGFubmVsQml0cmF0ZSA9IHRvdGFsQml0cmF0ZSAvIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY2hhbm5lbE1vZGUpLT5uQ2hhbm5lbHNFZmY7CisKKyAgICBmb3IgKGk9MDsgaTwoc2l6ZW9mKGVsZFNickF1dG9Db25maWdUYWIpL3NpemVvZihFTERfU0JSX0NPTkZJR1VSQVRPUikpOyBpKyspIHsKKyAgICAgIGlmICggKHNhbXBsaW5nUmF0ZSA8PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLnNhbXBsaW5nUmF0ZSkKKyAgICAgICAgJiYgKGNoYW5uZWxCaXRyYXRlID49IGVsZFNickF1dG9Db25maWdUYWJbaV0uYml0cmF0ZVJhbmdlKSApCisgICAgICB7CisgICAgICAgIGNmZ0lkeCA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNmZ0lkeCAhPSAtMSkgeworICAgICAgKmVsZFNiciAgICAgID0gKGVsZFNickF1dG9Db25maWdUYWJbY2ZnSWR4XS5sb3dEZWxheVNicj09MCkgPyAwIDogMTsKKyAgICAgICplbGRTYnJSYXRpbyA9IChlbGRTYnJBdXRvQ29uZmlnVGFiW2NmZ0lkeF0uZG93bnNhbXBsZWRTYnI9PTApID8gMiA6IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBubyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGVsZC1zYnIgYXZhaWxhYmxlLiAqLworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgSU5UIGlzU2JyQWN0aXZlKGNvbnN0IEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcpCit7CisgICAgSU5UIHNiclVzZWQgPSAwOworCisgICAgaWYgKCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSKSAgICAgICAgIHx8IChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9QUykKKyAgICAgIHx8IChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9NUDJfU0JSKSAgICAgfHwgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX01QMl9QUykKKyAgICAgIHx8IChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9EQUJQTFVTX1NCUikgfHwgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0RBQlBMVVNfUFMpCisgICAgICB8fCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfRFJNX1NCUikgICAgIHx8IChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9EUk1fTVBFR19QUykgKQorICAgIHsKKyAgICAgICAgc2JyVXNlZCA9IDE7CisgICAgfQorICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQgJiYgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfU0JSX1BSRVNFTlQpKQorICAgIHsKKyAgICAgICAgc2JyVXNlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuICggc2JyVXNlZCApOworfQorCitzdGF0aWMgaW5saW5lIElOVCBpc1BzQWN0aXZlKGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSkKK3sKKyAgICBJTlQgcHNVc2VkID0gMDsKKworICAgIGlmICggKGF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKQorICAgICAgfHwgKGF1ZGlvT2JqZWN0VHlwZT09QU9UX01QMl9QUykKKyAgICAgIHx8IChhdWRpb09iamVjdFR5cGU9PUFPVF9EQUJQTFVTX1BTKQorICAgICAgfHwgKGF1ZGlvT2JqZWN0VHlwZT09QU9UX0RSTV9NUEVHX1BTKSApCisgICAgeworICAgICAgICBwc1VzZWQgPSAxOworICAgIH0KKworICAgIHJldHVybiAoIHBzVXNlZCApOworfQorCitzdGF0aWMgU0JSX1BTX1NJR05BTElORyBnZXRTYnJTaWduYWxpbmdNb2RlKAorICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhdWRpb09iamVjdFR5cGUsCisgICAgICAgIGNvbnN0IFRSQU5TUE9SVF9UWVBFICAgICAgICAgICAgIHRyYW5zcG9ydFR5cGUsCisgICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydFNpZ25hbGluZywKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc2JyUmF0aW8KKyAgICAgICAgKQorCit7CisgIFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nOworCisgIGlmICh0cmFuc3BvcnRUeXBlPT1UVF9VTktOT1dOIHx8IHNiclJhdGlvPT0wKSB7CisgICAgc2JyU2lnbmFsaW5nID0gU0lHX1VOS05PV047IC8qIE5lZWRlZCBwYXJhbWV0ZXJzIGhhdmUgbm90IGJlZW4gc2V0ICovCisgICAgcmV0dXJuIHNiclNpZ25hbGluZzsKKyAgfSBlbHNlIHsKKyAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIGRlZmF1bHQ6IGltcGxpY2l0IHNpZ25hbGluZyAqLworICB9CisKKyAgaWYgKChhdWRpb09iamVjdFR5cGU9PUFPVF9BQUNfTEMpICAgICB8fCAoYXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSKSAgICAgfHwgKGF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKSAgICB8fAorICAgICAgKGF1ZGlvT2JqZWN0VHlwZT09QU9UX01QMl9BQUNfTEMpIHx8IChhdWRpb09iamVjdFR5cGU9PUFPVF9NUDJfU0JSKSB8fCAoYXVkaW9PYmplY3RUeXBlPT1BT1RfTVAyX1BTKSApIHsKKyAgICBzd2l0Y2ggKHRyYW5zcG9ydFR5cGUpIHsKKyAgICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIEZvciBNUEVHLTIgdHJhbnNwb3J0IHR5cGVzLCBvbmx5IGltcGxpY2l0IHNpZ25hbGluZyBpcyBwb3NzaWJsZSAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgorICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICggdHJhbnNwb3J0U2lnbmFsaW5nPT0weEZGICkgeworICAgICAgICAgIC8qIERlZmF1bHRzICovCisgICAgICAgICAgaWYgKCBzYnJSYXRpbz09MSApIHsKKyAgICAgICAgICAgIHNiclNpZ25hbGluZyA9IFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUw7IC8qIEZvciBkb3duc2FtcGxlZCBTQlIsIGV4cGxpY2l0IHNpZ25hbGluZyBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2JyU2lnbmFsaW5nID0gU0lHX0lNUExJQ0lUOyAvKiBGb3IgZHVhbC1yYXRlIFNCUiwgaW1wbGljaXQgc2lnbmFsaW5nIGlzIGRlZmF1bHQgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogVXNlciBzZXQgcGFyYW1ldGVycyAqLworICAgICAgICAgIC8qIEF0dGVudGlvbjogQmFja3dhcmQgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcgZG9lcyBvbmx5IHdvcmsgd2l0aCBBTVYxIGZvciBMQVRNL0xPQVMgKi8KKyAgICAgICAgICBzYnJTaWduYWxpbmcgPSAoU0JSX1BTX1NJR05BTElORyl0cmFuc3BvcnRTaWduYWxpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNiclNpZ25hbGluZzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZSBFbmNvZGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitIX0FMTE9DX01FTSAoX0FhY0VuY29kZXIsIEFBQ0VOQ09ERVIpCitDX0FMTE9DX01FTSAoX0FhY0VuY29kZXIsIEFBQ0VOQ09ERVIsIDEpCisKKworCisKKy8qCisgKiBNYXAgRW5jb2RlciBzcGVjaWZpYyBjb25maWcgc3RydWN0dXJlcyB0byBDT0RFUl9DT05GSUcuCisgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19NYXBDb25maWcoCisgICAgICAgIENPREVSX0NPTkZJRyAqY29uc3QgICAgICAgICAgICAgIGNjLAorICAgICAgICBjb25zdCBVU0VSX1BBUkFNICpjb25zdCAgICAgICAgICBleHRDZmcsCisgICAgICAgIGNvbnN0IFNCUl9QU19TSUdOQUxJTkcgICAgICAgICAgIHNiclNpZ25hbGluZywKKyAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ19DT05GSUcgICAgICAgaEFhY0NvbmZpZworICAgICAgICApCit7CisgIEFVRElPX09CSkVDVF9UWVBFIHRyYW5zcG9ydF9BT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7CisgIEZES21lbWNsZWFyKGNjLCBzaXplb2YoQ09ERVJfQ09ORklHKSk7CisKKyAgY2MtPmZsYWdzID0gMDsKKworICAvKiBNYXAgdmlydHVhbCBhb3QgdG8gdHJhbnNwb3J0IGFvdC4gKi8KKyAgc3dpdGNoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgICAgdHJhbnNwb3J0X0FPVCA9IEFPVF9BQUNfTEM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgdHJhbnNwb3J0X0FPVCA9IEFPVF9TQlI7CisgICAgICBjYy0+ZmxhZ3MgfD0gQ0NfU0JSOworICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9NUDJfUFM6CisgICAgICB0cmFuc3BvcnRfQU9UID0gQU9UX1BTOworICAgICAgY2MtPmZsYWdzIHw9IENDX1NCUjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0cmFuc3BvcnRfQU9UID0gaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICB9CisKKyAgaWYgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIGNjLT5mbGFncyB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyBDQ19TQlIgOiAwOworICB9CisKKyAgLyogdHJhbnNwb3J0IHR5cGUgaXMgdXN1YWxseSBBQUMtTEMuICovCisgIGlmICggKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1NCUikgfHwgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSApIHsKKyAgICBjYy0+YW90ICAgICAgICAgICA9IEFPVF9BQUNfTEM7CisgIH0KKyAgZWxzZSB7CisgICAgY2MtPmFvdCAgICAgICAgICAgPSB0cmFuc3BvcnRfQU9UOworICB9CisKKyAgLyogQ29uZmlndXJlIGV4dGVuc2lvbiBhb3QuICovCisgIGlmIChzYnJTaWduYWxpbmc9PVNJR19JTVBMSUNJVCkgeworICAgIGNjLT5leHRBT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7ICAvKiBpbXBsaWNpdCAqLworICB9CisgIGVsc2UgeworICAgIGlmICggKHNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpICYmICggKHRyYW5zcG9ydF9BT1Q9PUFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UPT1BT1RfUFMpICkgKSB7CisgICAgICBjYy0+ZXh0QU9UID0gQU9UX1NCUjsgICAgICAgIC8qIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjYy0+ZXh0QU9UID0gdHJhbnNwb3J0X0FPVDsgIC8qIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCAqLworICAgIH0KKyAgfQorCisgIGlmICggKHRyYW5zcG9ydF9BT1Q9PUFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UPT1BT1RfUFMpICkgeworICAgIGNjLT5zYnJQcmVzZW50PTE7CisgICAgaWYgKHRyYW5zcG9ydF9BT1Q9PUFPVF9QUykgeworICAgICAgY2MtPnBzUHJlc2VudD0xOworICAgIH0KKyAgfQorICBjYy0+c2JyU2lnbmFsaW5nICAgID0gc2JyU2lnbmFsaW5nOworCisgIGNjLT5leHRTYW1wbGluZ1JhdGUgPSBleHRDZmctPnVzZXJTYW1wbGVyYXRlOworICBjYy0+Yml0UmF0ZSAgICAgICAgID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKKyAgY2MtPm5vQ2hhbm5lbHMgICAgICA9IGhBYWNDb25maWctPm5DaGFubmVsczsKKyAgY2MtPmZsYWdzICAgICAgICAgIHw9IENDX0lTX0JBU0VMQVlFUjsKKyAgY2MtPmNoYW5uZWxNb2RlICAgICA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworCisgIGNjLT5uU3ViRnJhbWVzID0gKGhBYWNDb25maWctPm5TdWJGcmFtZXMgPiAxICYmIGV4dENmZy0+dXNlclRwTnN1YkZyYW1lcyA9PSAxKQorICAgICAgICAgICAgICAgICA/IGhBYWNDb25maWctPm5TdWJGcmFtZXMKKyAgICAgICAgICAgICAgICAgOiBleHRDZmctPnVzZXJUcE5zdWJGcmFtZXM7CisKKyAgY2MtPmZsYWdzICAgICAgICAgIHw9IChleHRDZmctPnVzZXJUcFByb3RlY3Rpb24pID8gQ0NfUFJPVEVDVElPTiA6IDA7CisKKyAgaWYgKGV4dENmZy0+dXNlclRwSGVhZGVyUGVyaW9kIT0weEZGKSB7CisgICAgY2MtPmhlYWRlclBlcmlvZCAgICA9IGV4dENmZy0+dXNlclRwSGVhZGVyUGVyaW9kOworICB9CisgIGVsc2UgeyAvKiBhdXRvLW1vZGUgKi8KKyAgICBzd2l0Y2ggKGV4dENmZy0+dXNlclRwVHlwZSkgeworICAgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICAgIGNjLT5oZWFkZXJQZXJpb2QgPSBERUZBVUxUX0hFQURFUl9QRVJJT0RfUkVQRVRJVElPTl9SQVRFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNjLT5oZWFkZXJQZXJpb2QgPSAwOworICAgIH0KKyAgfQorCisgIGNjLT5zYW1wbGVzUGVyRnJhbWUgPSBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aDsKKyAgY2MtPnNhbXBsaW5nUmF0ZSAgICA9IGhBYWNDb25maWctPnNhbXBsZVJhdGU7CisKKyAgLyogTXBlZy00IHNpZ25hbGluZyBmb3IgdHJhbnNwb3J0IGxpYnJhcnkuICovCisgIHN3aXRjaCAoIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSApIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgY2FzZSBBT1RfTVAyX1BTOgorICAgICAgY2MtPmZsYWdzICY9IH5DQ19NUEVHX0lEOyAvKiBSZXF1aXJlZCBmb3IgQURUUy4gKi8KKyAgICAgIGNjLT5leHRBT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2MtPmZsYWdzIHw9IENDX01QRUdfSUQ7CisgIH0KKworICAvKiBFUi10b29scyBzaWduYWxpbmcuICovCisgIGNjLT5mbGFncyAgICAgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpID8gQ0NfVkNCMTEgOiAwOworICBjYy0+ZmxhZ3MgICAgIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX0hDUikgICA/IENDX0hDUiA6IDA7CisgIGNjLT5mbGFncyAgICAgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfUlZMQykgID8gQ0NfUlZMQyA6IDA7CisKKyAgLyogTWF0cml4IG1peGRvd24gY29lZmZpY2llbnQgY29uZmlndXJhdGlvbi4gKi8KKyAgaWYgKCAoZXh0Q2ZnLT51c2VyUGNlQWRkaXRpb25zJjB4MSkgJiYgKGhBYWNDb25maWctPmVwQ29uZmlnPT0tMSkKKyAgICAgICYmICgoY2MtPmNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yKXx8KGNjLT5jaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKQorICB7CisgICAgY2MtPm1hdHJpeE1peGRvd25BICAgICAgID0gKChleHRDZmctPnVzZXJQY2VBZGRpdGlvbnM+PjEpJjB4MykrMTsKKyAgICBjYy0+ZmxhZ3MgfD0gKGV4dENmZy0+dXNlclBjZUFkZGl0aW9ucz4+MykmMHgxID8gQ0NfUFNFVURPX1NVUlJPVU5EIDogMDsKKyAgfQorICBlbHNlIHsKKyAgICBjYy0+bWF0cml4TWl4ZG93bkEgPSAwOworICB9Cit9CisKKy8qCisgKiBFeGFtaW5lIGJ1ZmZlciBkZXNjcmlwdG9yIHJlZ2FyZGluZyBjaG9vc2VuIGlkZW50aWZpZXIuCisgKgorICogXHBhcmFtIHBCdWZEZXNjICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1ZmZlciBkZXNjcmlwdG9yCisgKiBccGFyYW0gaWRlbnRpZmllciAgICAgICAgICAgIEJ1ZmZlciBpZGVudGlmaWVyIHRvIGxvb2sgZm9yLgorCisgKiBccmV0dXJuIC0gQnVmZmVyIGRlc2NyaXB0b3IgaW5kZXguCisgKiAgICAgICAgIC0xLCBpZiB0aGVyZSBpcyBubyBlbnRyeSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBJTlQgZ2V0QnVmRGVzY0lkeCgKKyAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICAgICAqcEJ1ZkRlc2MsCisgICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyIGlkZW50aWZpZXIKKykKK3sKKyAgICBJTlQgaSwgaWR4ID0gLTE7CisKKyAgICBmb3IgKGk9MDsgaTxwQnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7CisgICAgICBpZiAoIChBQUNFTkNfQnVmZmVySWRlbnRpZmllcilwQnVmRGVzYy0+YnVmZmVySWRlbnRpZmllcnNbaV0gPT0gaWRlbnRpZmllciApIHsKKyAgICAgICAgaWR4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZHg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBQUNfRU5DT0RFUl9FUlJPUiBhYWNFbmNEZWZhdWx0Q29uZmlnKEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykKK3sKKyAgICAvKiBtYWtlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLworICAgIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyAoaEFhY0NvbmZpZyk7CisKKyAgICAvKiBjbGVhciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgY29weSBkZWZhdWx0IHNldHRpbmdzICovCisgICAgRkRLbWVtY2xlYXIoY29uZmlnLCBzaXplb2YoVVNFUl9QQVJBTSkpOworCisgICAgLyogY29weSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKyAgICBjb25maWctPm5DaGFubmVscyAgICAgICA9IGhBYWNDb25maWctPm5DaGFubmVsczsKKyAgICBjb25maWctPnVzZXJBT1QgPSBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPSBBT1RfQUFDX0xDOworICAgIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUgID0gaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKKyAgICBjb25maWctPnVzZXJDaGFubmVsTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworICAgIGNvbmZpZy0+dXNlckJpdHJhdGUgICAgID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKKyAgICBjb25maWctPnVzZXJCaXRyYXRlTW9kZSA9IGhBYWNDb25maWctPmJpdHJhdGVNb2RlOworICAgIGNvbmZpZy0+dXNlckJhbmR3aWR0aCAgID0gaEFhY0NvbmZpZy0+YmFuZFdpZHRoOworICAgIGNvbmZpZy0+dXNlclRucyAgICAgICAgID0gaEFhY0NvbmZpZy0+dXNlVG5zOworICAgIGNvbmZpZy0+dXNlclBucyAgICAgICAgID0gaEFhY0NvbmZpZy0+dXNlUG5zOworICAgIGNvbmZpZy0+dXNlckludGVuc2l0eSAgID0gaEFhY0NvbmZpZy0+dXNlSVM7CisgICAgY29uZmlnLT51c2VyQWZ0ZXJidXJuZXIgPSBoQWFjQ29uZmlnLT51c2VSZXF1YW50OworICAgIGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoID0gKFVJTlQpLTE7CisKKyAgICBpZiAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSkgeworICAgICAgY29uZmlnLT51c2VyRXJUb29scyAgfD0gMHgwMTsKKyAgICB9CisgICAgaWYgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfSENSKSB7CisgICAgICBjb25maWctPnVzZXJFclRvb2xzICB8PSAweDAyOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdHJhbnNwb3J0IHBhcmFtZXRlcnMgKi8KKyAgICBjb25maWctPnVzZXJUcFR5cGUgICAgICAgICA9IFRUX1VOS05PV047CisgICAgY29uZmlnLT51c2VyVHBBbXh2ICAgICAgICAgPSAwOworICAgIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nICAgID0gMHhGRjsgICAgLyogY2hvb3NlIHNpZ25hbGluZyBhdXRvbWF0aWNhbGx5ICovCisgICAgY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzICAgPSAxOworICAgIGNvbmZpZy0+dXNlclRwUHJvdGVjdGlvbiAgID0gMDsgICAgLyogbm90IGNyYyBwcm90ZWN0ZWQqLworICAgIGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kID0gMHhGRjsgLyogaGVhZGVyIHBlcmlvZCBpbiBhdXRvIG1vZGUgKi8KKyAgICBjb25maWctPnVzZXJQY2VBZGRpdGlvbnMgICA9IDA7ICAgIC8qIG5vIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50ICovCisgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlICAgPSAwOyAgICAvKiBkbyBub3QgZW1iZWQgYW55IG1ldGEgZGF0YSBpbmZvICovCisKKyAgICBjb25maWctPnVzZXJBbmNEYXRhUmF0ZSAgICA9IDA7CisKKyAgICAvKiBTQlIgcmF0ZSBpcyBzZXQgdG8gMCBoZXJlLCB3aGljaCBtZWFucyBpdCBzaG91bGQgYmUgc2V0IGF1dG9tYXRpY2FsbHkKKyAgICAgICBpbiBGREthYWNFbmNfQWRqdXN0RW5jU2V0dGluZ3MoKSBpZiB0aGUgdXNlciBkaWQgbm90IHNldCBhIHJhdGUKKyAgICAgICBleHBpbGljaXRlbHkuICovCisgICAgY29uZmlnLT51c2VyU2JyUmF0aW8gPSAwOworCisgICAgLyogU0JSIGVuYWJsZSBzZXQgdG8gLTEgbWVhbnMgdG8gaW5xdWlyZSBFTEQgYXVkaW8gY29uZmlndXJhdG9yIGZvciByZWFzb25hYmxlIGNvbmZpZ3VyYXRpb24uICovCisgICAgY29uZmlnLT51c2VyU2JyRW5hYmxlZCAgICAgPSAtMTsKKworICAgIHJldHVybiBBQUNfRU5DX09LOworfQorCitzdGF0aWMKK3ZvaWQgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywgU0JSX0VMRU1FTlRfSU5GTyAqc2JyRWxJbmZvLCBJTlQgYml0UmF0ZSkKK3sKKyAgSU5UIGNvZGViaXRzID0gYml0UmF0ZTsKKyAgaW50IGVsOworCisgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCisgIGZvciAoZWw9MDsgZWw8Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgZWwrKykgeworICAgICAgc2JyRWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMF0gPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBzYnJFbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXSA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgIHNickVsSW5mb1tlbF0uZWxUeXBlICAgICAgICAgID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uZWxUeXBlOworICAgICAgc2JyRWxJbmZvW2VsXS5iaXRSYXRlICAgICAgICAgPSAoSU5UKShmTXVsdE5vcm0oY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0ucmVsYXRpdmVCaXRzLCAoRklYUF9EQkwpYml0UmF0ZSkpOworICAgICAgc2JyRWxJbmZvW2VsXS5pbnN0YW5jZVRhZyAgICAgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5pbnN0YW5jZVRhZzsKKyAgICAgIHNickVsSW5mb1tlbF0ubkNoYW5uZWxzSW5FbCAgID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0ubkNoYW5uZWxzSW5FbDsKKworICAgICAgY29kZWJpdHMgLT0gc2JyRWxJbmZvW2VsXS5iaXRSYXRlOworICB9CisgIHNickVsSW5mb1swXS5iaXRSYXRlICs9IGNvZGViaXRzOworfQorCisKK3N0YXRpYworSU5UIGFhY0VuY29kZXJfTGltaXRCaXRyYXRlKAorICAgICAgICBjb25zdCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgIElOVCBiaXRSYXRlLAorICAgICAgICBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgY29uc3QgSU5UIHNickFjdGl2ZSwKKyAgICAgICAgY29uc3QgSU5UIHNickRvd25TYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QKKyAgICAgICAgKQoreworICBJTlQgY29yZVNhbXBsaW5nUmF0ZTsKKyAgQ0hBTk5FTF9NQVBQSU5HIGNtOworCisgIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoY2hhbm5lbE1vZGUsIENIX09SREVSX01QRUcsICZjbSk7CisKKyAgaWYgKHNickFjdGl2ZSkgeworICAgIGNvcmVTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGUgPj4gIChzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKGFvdCkgPyAoc2JyRG93blNhbXBsZVJhdGUtMSk6MSk7CisgIH0gZWxzZSB7CisgICAgY29yZVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgfQorCisgIC8qIENvbnNpZGVyIGJhbmR3aWR0aCBjaGFubmVsIGJpdCByYXRlIGxpbWl0IChzZWUgYmFuZHdpZHRoLmNwcDogR2V0QmFuZHdpZHRoRW50cnkoKSkgKi8KKyAgaWYgKGFvdCA9PSBBT1RfRVJfQUFDX0xEIHx8IGFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIGJpdFJhdGUgPSBGREttaW4oMzYwMDAwKm5DaGFubmVscywgYml0UmF0ZSk7CisgICAgYml0UmF0ZSA9IEZES21heCg4MDAwKm5DaGFubmVscywgYml0UmF0ZSk7CisgIH0KKworICBpZiAoYW90ID09IEFPVF9BQUNfTEMgfHwgYW90ID09IEFPVF9TQlIgfHwgYW90ID09IEFPVF9QUykgIHsKKyAgICBiaXRSYXRlID0gRkRLbWluKDU3NjAwMCpuQ2hhbm5lbHMsIGJpdFJhdGUpOworICAgIC8qYml0UmF0ZSA9IEZES21heCgwKm5DaGFubmVscywgYml0UmF0ZSk7Ki8KKyAgfQorCisKKyAgLyogTGltaXQgYml0IHJhdGUgaW4gcmVzcGVjdCB0byB0aGUgY29yZSBjb2RlciAqLworICBiaXRSYXRlID0gRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKKyAgICAgICAgICBoVHBFbmMsCisgICAgICAgICAgY29yZVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICBmcmFtZUxlbmd0aCwKKyAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgY20ubkNoYW5uZWxzRWZmLAorICAgICAgICAgIGJpdFJhdGUsCisgICAgICAgICAgLTEsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAtMSwKKyAgICAgICAgICBuU3ViRnJhbWVzCisgICAgICAgICAgKTsKKworICAvKiBMaW1pdCBiaXQgcmF0ZSBpbiByZXNwZWN0IHRvIGF2YWlsYWJsZSBTQlIgbW9kZXMgaWYgYWN0aXZlICovCisgIGlmIChzYnJBY3RpdmUpCisgIHsKKyAgICBpbnQgbnVtSXRlcmF0aW9ucyA9IDA7CisgICAgSU5UIGluaXRpYWxCaXRyYXRlLCBhZGp1c3RlZEJpdHJhdGU7CisgICAgaW5pdGlhbEJpdHJhdGUgPSBhZGp1c3RlZEJpdHJhdGUgPSBiaXRSYXRlOworCisgICAgLyogRmluZCB0b3RhbCBiaXRyYXRlIHdoaWNoIHByb3ZpZGVzIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggU0JSIGVsZW1lbnQuICovCisgICAgZG8geworICAgICAgaW50IGU7CisgICAgICBTQlJfRUxFTUVOVF9JTkZPIHNickVsSW5mb1soOCldOworICAgICAgRkRLX0FTU0VSVChjbS5uRWxlbWVudHMgPD0gKDgpKTsKKworICAgICAgaW5pdGlhbEJpdHJhdGUgPSBhZGp1c3RlZEJpdHJhdGU7CisKKyAgICAgIC8qIEdldCBiaXQgcmF0ZSBmb3IgZWFjaCBTQlIgZWxlbWVudCAqLworICAgICAgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoJmNtLCBzYnJFbEluZm8sIGluaXRpYWxCaXRyYXRlKTsKKworICAgICAgZm9yIChlPTA7IGU8Y20ubkVsZW1lbnRzOyBlKyspCisgICAgICB7CisgICAgICAgIElOVCBzYnJFbGVtZW50Qml0UmF0ZUluLCBzYnJCaXRSYXRlT3V0OworCisgICAgICAgIGlmIChjbS5lbEluZm9bZV0uZWxUeXBlICE9IElEX1NDRSAmJiBjbS5lbEluZm9bZV0uZWxUeXBlICE9IElEX0NQRSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNickVsZW1lbnRCaXRSYXRlSW4gPSBzYnJFbEluZm9bZV0uYml0UmF0ZTsKKyAgICAgICAgc2JyQml0UmF0ZU91dCA9IHNickVuY29kZXJfTGltaXRCaXRSYXRlKHNickVsZW1lbnRCaXRSYXRlSW4gLCBjbS5lbEluZm9bZV0ubkNoYW5uZWxzSW5FbCwgY29yZVNhbXBsaW5nUmF0ZSwgYW90KTsKKyAgICAgICAgaWYgKHNickJpdFJhdGVPdXQgPT0gMCkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgYml0cmF0ZXMgZG9uJ3QgbWF0Y2gsIGRpc3RyaWJ1dGlvbiBhbmQgbGltaXRpbmcgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhZ2Fpbi4KKyAgICAgICAgICAgQWJvcnQgZWxlbWVudCBsb29wIGFuZCByZXN0YXJ0IHdpdGggYWRhcHRlZCBiaXRyYXRlLiAqLworICAgICAgICBpZiAoc2JyRWxlbWVudEJpdFJhdGVJbiAhPSBzYnJCaXRSYXRlT3V0KSB7CisKKyAgICAgICAgICBpZiAoc2JyRWxlbWVudEJpdFJhdGVJbiA8IHNickJpdFJhdGVPdXQpIHsKKyAgICAgICAgICAgIGFkanVzdGVkQml0cmF0ZSA9IGZNYXgoaW5pdGlhbEJpdHJhdGUsIChJTlQpZkRpdk5vcm0oKEZJWFBfREJMKShzYnJCaXRSYXRlT3V0KzgpLCBjbS5lbEluZm9bZV0ucmVsYXRpdmVCaXRzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2JyRWxlbWVudEJpdFJhdGVJbiA+IHNickJpdFJhdGVPdXQpIHsKKyAgICAgICAgICAgIGFkanVzdGVkQml0cmF0ZSA9IGZNaW4oaW5pdGlhbEJpdHJhdGUsIChJTlQpZkRpdk5vcm0oKEZJWFBfREJMKShzYnJCaXRSYXRlT3V0LTgpLCBjbS5lbEluZm9bZV0ucmVsYXRpdmVCaXRzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBzYnJFbGVtZW50Qml0UmF0ZUluICE9IHNickJpdFJhdGVPdXQgKi8KKworICAgICAgfSAvKiBlbGVtZW50cyAqLworCisgICAgICBudW1JdGVyYXRpb25zKys7IC8qIHJlc3RyaWN0IGl0ZXJhdGlvbiB0byB3b3JzdCBjYXNlIG9mIG51bSBlbGVtZW50cyAqLworCisgICAgfSB3aGlsZSAoIChpbml0aWFsQml0cmF0ZSE9YWRqdXN0ZWRCaXRyYXRlKSAmJiAobnVtSXRlcmF0aW9uczw9Y20ubkVsZW1lbnRzKSApOworCisgICAgLyogVW5lcXVhbCBiaXRyYXRlcyBtZWFuIHRoYXQgbm8gcmVhc29uYWJsZSBiaXRyYXRlIGNvbmZpZ3VyYXRpb24gZm91bmQuICovCisgICAgYml0UmF0ZSA9IChpbml0aWFsQml0cmF0ZT09YWRqdXN0ZWRCaXRyYXRlKSA/IGFkanVzdGVkQml0cmF0ZSA6IDA7CisgIH0KKworICBGREtfQVNTRVJUKGJpdFJhdGUgPiAwKTsKKworICByZXR1cm4gYml0UmF0ZTsKK30KKworLyoKKyAqIFxicmllZiBDb25zaXN0ZW5jeSBjaGVjayBvZiBnaXZlbiBVU0VSX1BBUkFNIHN0cnVjdCBhbmQKKyAqICAgY29weSBiYWNrIGNvbmZpZ3VyYXRpb24gZnJvbSBwdWJsaWMgc3RydWN0IGludG8gaW50ZXJuYWwKKyAqICAgZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdC4KKyAqCisgKiBcaEFhY0VuY29kZXIgSW50ZXJuYWwgZW5jb2RlciBjb25maWcgd2hpY2ggaXMgdG8gYmUgdXBkYXRlZAorICogXHBhcmFtIGNvbmZpZyBVc2VyIHByb3ZpZGVkIGNvbmZpZyAocHVibGljIHN0cnVjdCkKKyAqIFxyZXR1cm4gtHJldHVybnMgYWx3YXlzIEFBQ19FTkNfT0sKKyAqLworc3RhdGljCitBQUNFTkNfRVJST1IgRkRLYWFjRW5jX0FkanVzdEVuY1NldHRpbmdzKEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX1BBUkFNICpjb25maWcpCit7CisgICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKworICAgIC8qIEdldCBzdHJ1Y3QgcG9pbnRlcnMuICovCisgICAgSEFORExFX0FBQ0VOQ19DT05GSUcgICAgaEFhY0NvbmZpZyA9ICZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnOworCisgICAgaEFhY0NvbmZpZy0+bkNoYW5uZWxzICAgICAgID0gY29uZmlnLT5uQ2hhbm5lbHM7CisKKyAgICAvKiBFbmNvZGVyIHNldHRpbmdzIHVwZGF0ZS4gKi8KKyAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlICAgICAgPSBjb25maWctPnVzZXJTYW1wbGVyYXRlOworICAgIGhBYWNDb25maWctPnVzZVRucyAgICAgICAgICA9IGNvbmZpZy0+dXNlclRuczsKKyAgICBoQWFjQ29uZmlnLT51c2VQbnMgICAgICAgICAgPSBjb25maWctPnVzZXJQbnM7CisgICAgaEFhY0NvbmZpZy0+dXNlSVMgICAgICAgICAgID0gY29uZmlnLT51c2VySW50ZW5zaXR5OworICAgIGhBYWNDb25maWctPmJpdFJhdGUgICAgICAgICA9IGNvbmZpZy0+dXNlckJpdHJhdGU7CisgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgICAgID0gY29uZmlnLT51c2VyQ2hhbm5lbE1vZGU7CisgICAgaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gY29uZmlnLT51c2VyQml0cmF0ZU1vZGU7CisgICAgaEFhY0NvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gY29uZmlnLT51c2VyQmFuZHdpZHRoOworICAgIGhBYWNDb25maWctPnVzZVJlcXVhbnQgICAgICA9IGNvbmZpZy0+dXNlckFmdGVyYnVybmVyOworCisgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID0gY29uZmlnLT51c2VyQU9UOworICAgIGhBYWNDb25maWctPmFuY19SYXRlICAgICAgICA9IGNvbmZpZy0+dXNlckFuY0RhdGFSYXRlOworICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzICAgICA9IDA7CisgICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgICAgICAgID0gLTE7CisKKyAgICAvKiBBZGFwdCBpbnRlcm5hbCBBT1Qgd2hlbiBuZWNlc3NhcnkuICovCisgICAgc3dpdGNoICggaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlICkgeworICAgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgICBjYXNlIEFPVF9NUDJfUFM6CisgICAgICAgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gMDsKKyAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgIGNhc2UgQU9UX1NCUjoKKyAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9IChjb25maWctPnVzZXJUcFR5cGUhPVRUX1VOS05PV04pID8gY29uZmlnLT51c2VyVHBUeXBlIDogVFRfTVA0X0FEVFM7CisgICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPSAoY29uZmlnLT51c2VyRnJhbWVsZW5ndGghPShVSU5UKS0xKSA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIDogMTAyNDsKKyAgICAgICAgICBpZiAoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gMTAyNCkgeworICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgPSAwOworICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VSfEFDX0xEOworICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MSkgPyBBQ19FUl9WQ0IxMSA6IDApOworICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MikgPyBBQ19FUl9IQ1IgOiAwKTsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDQpID8gQUNfRVJfUlZMQyA6IDApOworICAgICAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9IChjb25maWctPnVzZXJUcFR5cGUhPVRUX1VOS05PV04pID8gY29uZmlnLT51c2VyVHBUeXBlIDogVFRfTVA0X0xPQVM7CisgICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPSAoY29uZmlnLT51c2VyRnJhbWVsZW5ndGghPShVSU5UKS0xKSA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIDogNTEyOworICAgICAgICAgIGlmIChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA1MTIgJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNDgwKSB7CisgICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgPSAwOworICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VSfEFDX0VMRDsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDEpID8gQUNfRVJfVkNCMTEgOiAwKTsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDIpID8gQUNfRVJfSENSIDogMCk7CisgICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHg0KSA/IEFDX0VSX1JWTEMgOiAwKTsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlclNickVuYWJsZWQ9PTEpICA/IEFDX1NCUl9QUkVTRU5UIDogMCk7CisgICAgICAgICAgY29uZmlnLT51c2VyVHBUeXBlID0gKGNvbmZpZy0+dXNlclRwVHlwZSE9VFRfVU5LTk9XTikgPyBjb25maWctPnVzZXJUcFR5cGUgOiBUVF9NUDRfTE9BUzsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCA9IChjb25maWctPnVzZXJGcmFtZWxlbmd0aCE9KFVJTlQpLTEpID8gY29uZmlnLT51c2VyRnJhbWVsZW5ndGggOiA1MTI7CisgICAgICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDUxMiAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA0ODApIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgKSB7CisgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBpZiAoY29uZmlnLT51c2VyQml0cmF0ZU1vZGU9PTgpIHsKKyAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZy0+dXNlckJpdHJhdGVNb2RlPT0wKSB7CisgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0cmVzZXJ2b2lyID0gMTAwKmNvbmZpZy0+bkNoYW5uZWxzOyAvKiBkZWZhdWx0LCByZWR1Y2VkIGJpdHJlc2Vydm9pciAqLworICAgICAgICB9CisgICAgICAgIGlmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSE9MCkgeworICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gY29uZmlnLT51c2VyQml0cmF0ZTsKKworICAgIC8qIGdldCBiaXRyYXRlIGluIFZCUiBjb25maWd1cmF0aW9uICovCisgICAgaWYgKCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTw9NSkgKSB7CisgICAgICAgIC8qIEluIFZCUiBtb2RlOyBTQlItbW9kdWwgZGVwZW5kcyBvbiBiaXRyYXRlLCBjb3JlIGVuY29kZXIgb24gYml0cmF0ZU1vZGUuICovCisgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSwgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpOworICAgIH0KKworCisKKyAgICAvKiBTZXQgZGVmYXVsdCBiaXRyYXRlIGlmIG5vIGV4dGVybmFsIGJpdHJhdGUgZGVjbGFyZWQuICovCisgICAgaWYgKCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU9PTApICYmIChjb25maWctPnVzZXJCaXRyYXRlPT0oVUlOVCktMSkgKSB7CisgICAgICAgIElOVCBiaXRyYXRlID0gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZiAqIGhBYWNDb25maWctPnNhbXBsZVJhdGU7CisKKyAgICAgICAgaWYgKCBpc1BzQWN0aXZlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgKSB7CisgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IChiaXRyYXRlPj4xKTsgICAgICAgICAgICAgICAgICAvKiAwLjUgYml0IHBlciBzYW1wbGUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCAoY29uZmlnLT51c2VyU2JyUmF0aW89PTIpIHx8ICgoY29uZmlnLT51c2VyU2JyUmF0aW89PTApJiYoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlIT1BT1RfRVJfQUFDX0VMRCkpICkgeworICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IChiaXRyYXRlICsgKGJpdHJhdGU+PjIpKT4+MTsgLyogMC42MjUgYml0cyBwZXIgc2FtcGxlICovCisgICAgICAgICAgfQorICAgICAgICAgIGlmICggKGNvbmZpZy0+dXNlclNiclJhdGlvPT0xKSB8fCAoKGNvbmZpZy0+dXNlclNiclJhdGlvPT0wKSYmKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0VSX0FBQ19FTEQpKSApIHsKKyAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSAoYml0cmF0ZSArIChiaXRyYXRlPj4zKSk7ICAgIC8qIDEuMTI1IGJpdHMgcGVyIHNhbXBsZSAqLworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gYml0cmF0ZSArIChiaXRyYXRlPj4xKTsgICAgICAgIC8qIDEuNSBiaXRzIHBlciBzYW1wbGUgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgU0JSIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9FUl9BQUNfRUxEKQorICAgICAgJiYgKGNvbmZpZy0+dXNlclNickVuYWJsZWQgPT0gKFVDSEFSKS0xKSAmJiAoY29uZmlnLT51c2VyU2JyUmF0aW89PTApICkKKyAgICB7CisgICAgICBVSU5UIGVsZFNiciA9IDA7CisgICAgICBVSU5UIGVsZFNiclJhdGlvID0gMDsKKworICAgICAgaWYgKCBBQUNFTkNfT0shPShlcnI9ZWxkU2JyQ29uZmlndXJhdG9yKAorICAgICAgICAgICAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlLAorICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICAgJmVsZFNiciwKKyAgICAgICAgICAgJmVsZFNiclJhdGlvKSkgKQorICAgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorCisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGVsZFNicikgPyBBQ19TQlJfUFJFU0VOVCA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSBlbGRTYnJSYXRpbzsKKyAgICB9CisgICAgZWxzZQorICAgIGlmICggKGNvbmZpZy0+dXNlclNiclJhdGlvPT0wKSAmJiAoaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykpICkgeworICAgICAgLyogQXV0b21hdGljIFNCUiByYXRpbyBjb25maWd1cmF0aW9uCisgICAgICAgKiAtIGRvd25zYW1wbGVkIFNCUiBmb3IgRUxECisgICAgICAgKiAtIG90aGVyd2lzZSBhbHdheXMgZHVhbHJhdGUgU0JSCisgICAgICAgKi8KKyAgICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfRVJfQUFDX0VMRCkgPyAxIDogMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBTQlIgcmF0aW8gaGFzIGJlZW4gc2V0IGJ5IHRoZSB1c2VyLCBzbyB1c2UgaXQuICovCisgICAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbyA9IGNvbmZpZy0+dXNlclNiclJhdGlvOworICAgIH0KKworICAgIHsKKyAgICAgIFVDSEFSIHRwU2lnbmFsaW5nPWdldFNiclNpZ25hbGluZ01vZGUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBjb25maWctPnVzZXJUcFR5cGUsIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjQ29uZmlnLT5zYnJSYXRpbyk7CisKKyAgICAgIGlmICggKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0FBQ19MQyB8fCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9TQlIgfHwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfUFMpICYmCisgICAgICAgICAgIChjb25maWctPnVzZXJUcFR5cGU9PVRUX01QNF9MQVRNX01DUDEgfHwgY29uZmlnLT51c2VyVHBUeXBlPT1UVF9NUDRfTEFUTV9NQ1AwIHx8IGNvbmZpZy0+dXNlclRwVHlwZT09VFRfTVA0X0xPQVMpICYmCisgICAgICAgICAgICh0cFNpZ25hbGluZz09MSkgJiYgKGNvbmZpZy0+dXNlclRwQW14dj09MCkgKSB7CisgICAgICAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nLCBBTVYxIGhhcyB0byBiZSBhY3RpdmUgKi8KKyAgICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorCisgICAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9BQUNfTEMgfHwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSIHx8IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKSAmJgorICAgICAgICAgICAodHBTaWduYWxpbmc9PTApICYmIChoQWFjQ29uZmlnLT5zYnJSYXRpbz09MSkpIHsKKyAgICAgICAgICAgICAvKiBEb3duc2FtcGxlZCBTQlIgaGFzIHRvIGJlIHNpZ25hbGVkIGV4cGxpY2l0ZWx5IChmb3IgdHJhbnNtaXNzaW9uIG9mIFNCUiBzYW1wbGluZyBmZXF1ZW5jeSkgKi8KKyAgICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgIH0KKworCisKKyAgICAvKiBXZSBuZWVkIHRoZSBmcmFtZSBsZW5ndGggdG8gY2FsbCBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZSgpICovCisgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IGFhY0VuY29kZXJfTGltaXRCaXRyYXRlKAorICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+bkNoYW5uZWxzLAorICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+blN1YkZyYW1lcywKKyAgICAgICAgICAgICAgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZyksCisgICAgICAgICAgICAgIGhBYWNDb25maWctPnNiclJhdGlvLAorICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUKKyAgICAgICAgICAgICAgKTsKKworICAgIC8qIENvbmZpZ3VyZSBQTlMgKi8KKyAgICBpZiAoICgoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTw9NSkpIC8qIFZCUiB3aXRob3V0IFBOUy4gKi8KKyAgICAgICAgfHwgKGhBYWNDb25maWctPnVzZVRucyA9PSAwKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFROUyByZXF1aXJlZC4gKi8KKyAgICB7CisgICAgICAgIGhBYWNDb25maWctPnVzZVBucyA9IDA7CisgICAgfQorCisgICAgaWYgKGhBYWNDb25maWctPmVwQ29uZmlnID49IDApIHsKKyAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVI7CisgICAgICAgICBpZiAoKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPCAxKSB8fCAoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA+IDcpKSB7CisgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7ICAgICAgICAvKiBDYW5uZWwgY29uZmlnIDAgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZSgmaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsIGhBYWNDb25maWctPm5DaGFubmVscykgIT0gQUFDX0VOQ19PSykgeworICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAgICAgICAgLyogbkNoYW5uZWxzIGRvZXNuJ3QgbWF0Y2ggY2hNb2RlLCB0aGlzIGlzIGp1c3QgYSBjaGVjay11cCAqLworICAgIH0KKworICAgIGlmICggKGhBYWNDb25maWctPm5DaGFubmVscyA+IGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpCisgICAgICB8fCAoIChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmID4gaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscykgJiYKKyAgICAgICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICkKKyAgICAgICAgICkKKyAgICB7CisgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7ICAgICAgLyogbm90IGVub3VnaCBjaGFubmVscyBhbGxvY2F0ZWQgKi8KKyAgICB9CisKKyAgICAvKiBNZXRhIGRhdGEgcmVzdHJpY3Rpb24uICovCisgICAgc3dpdGNoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpCisgICAgeworICAgICAgLyogQWxsb3cgbWV0YWRhdGEgc3VwcG9ydCAqLworICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgY2FzZSBBT1RfUFM6CisgICAgICAgIGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPSAxOworICAgICAgICBpZiAoKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPCAxKSB8fCAoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA+IDcpKSB7CisgICAgICAgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIC8qIFByb2hpYml0IG1ldGFkYXRhIHN1cHBvcnQgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPSAwOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYworSU5UIGFhY2VuY19TYnJDYWxsYmFjaygKKyAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAorICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAorICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCAgICBlbGVtZW50SUQsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAorICAgICAgICApCit7CisgIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gKEhBTkRMRV9BQUNFTkNPREVSKXNlbGY7CisKKyAgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoaEFhY0VuY29kZXItPmhFbnZFbmMsIGhCcywgZWxlbWVudEluZGV4LCAwKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIEFBQ0VOQ19FUlJPUiBhYWNFbmNJbml0KEhBTkRMRV9BQUNFTkNPREVSICBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgSW5pdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gICAgICAgICpjb25maWcpCit7CisgICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKworICAgIElOVCBhYWNCdWZmZXJPZmZzZXQgPSAwOworICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgICAgKmhTYnJFbmNvZGVyID0gJmhBYWNFbmNvZGVyLT5oRW52RW5jOworICAgIEhBTkRMRV9BQUNFTkNfQ09ORklHICAgIGhBYWNDb25maWcgID0gJmhBYWNFbmNvZGVyLT5hYWNDb25maWc7CisKKyAgICBoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgPSAwOyAgICAgICAgICAvKiBjb3VudCBhcHBlbmRlZCB6ZXJvcyAqLworCisgICAgSU5UIGZyYW1lTGVuZ3RoID0gaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGg7CisKKyAgICBpZiAoIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpICkKKyAgICB7CisgICAgICAgIENIQU5ORUxfTU9ERSBwcmV2Q2hNb2RlID0gaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGU7CisKKyAgICAgICAgLyogVmVyaWZ5IHNldHRpbmdzIGFuZCB1cGRhdGU6IGNvbmZpZyAtPiBoZUFhY0VuY29kZXIgKi8KKyAgICAgICAgaWYgKCAoZXJyPUZES2FhY0VuY19BZGp1c3RFbmNTZXR0aW5ncyhoQWFjRW5jb2RlciwgY29uZmlnKSkgIT0gQUFDRU5DX09LICkgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZUxlbmd0aCA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOyAvKiBhZGFwdCB0ZW1wb3JhbCBmcmFtZWxlbmd0aCAqLworCisgICAgICAgIC8qIFNlYW1sZXNzIGNoYW5uZWwgcmVjb25maWd1cmF0aW9uIGluIHNiciBub3QgZnVsbHkgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgaWYgKCAocHJldkNoTW9kZSE9aEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpICYmIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICkgeworICAgICAgICAgICAgSW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1NUQVRFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIGlucHV0IGJ1ZmZlciAqLworICAgIGlmICggSW5pdEZsYWdzID09IEFBQ0VOQ19JTklUX0FMTCApIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLCBzaXplb2YoSU5UX1BDTSkqaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscypJTlBVVEJVRkZFUl9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAoIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpICkKKyAgICB7CisgICAgICAgIGFhY0J1ZmZlck9mZnNldCA9IDA7CisgICAgICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgPSBERUxBWV9BQUNFTEQoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSA9IERFTEFZX0FBQyhoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7IC8qIEFBQyBlbmNvZGVyIGRlbGF5ICovCisgICAgICAgIH0KKyAgICAgICAgaEFhY0NvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOworICAgIH0KKworICAgIGlmICggaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgJiYKKyAgICAgICAgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpKSApCisgICAgeworICAgICAgICBJTlQgc2JyRXJyb3I7CisgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gc2JyRWxJbmZvWyg4KV07CisgICAgICAgIENIQU5ORUxfTUFQUElORyBjaGFubmVsTWFwcGluZzsKKworICAgICAgICBpZiAoIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFwcGluZykgIT0gQUFDX0VOQ19PSyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIHJldHVybiB2YWx1ZSBhbmQgaWYgdGhlIFNCUiBlbmNvZGVyIGNhbiBoYW5kbGUgZW5vdWdoIGVsZW1lbnRzICovCisgICAgICAgIGlmIChjaGFubmVsTWFwcGluZy5uRWxlbWVudHMgPiAoOCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGFhY0VuY0Rpc3RyaWJ1dGVTYnJCaXRzKCZjaGFubmVsTWFwcGluZywgc2JyRWxJbmZvLCBoQWFjQ29uZmlnLT5iaXRSYXRlKTsKKworICAgICAgICBVSU5UIGluaXRGbGFnID0gMDsKKyAgICAgICAgaW5pdEZsYWcgKz0gKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykgPyAxIDogMDsKKworICAgICAgICAvKiBMZXQgdGhlIFNCUiBlbmNvZGVyIHRha2UgYSBsb29rIGF0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBjaGFuZ2UgaWYgcmVxdWlyZWQuICovCisgICAgICAgIHNickVycm9yID0gc2JyRW5jb2Rlcl9Jbml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZy5uRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjQ29uZmlnLT5iYW5kV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhYWNCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjQ29uZmlnLT5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjQ29uZmlnLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0NvbmZpZy0+c2JyUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNFbmNvZGVyLT5uRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSA/IDEgOiBUUkFOU19GQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QhPTB4RkYpID8gY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QgOiBERUZBVUxUX0hFQURFUl9QRVJJT0RfUkVQRVRJVElPTl9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAvKiBTdXBwcmVzcyBBT1QgcmVjb25maWd1cmF0aW9uIGFuZCBjaGVjayBlcnJvciBzdGF0dXMuICovCisgICAgICAgIGlmIChzYnJFcnJvcikgeworICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX1NCUl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoQWFjQ29uZmlnLT5uQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPSBNT0RFXzE7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZXZlciB1c2UgUE5TIGlmIFNCUiBpcyBhY3RpdmUgKi8KKyAgICAgICAgaWYgKCBoQWFjQ29uZmlnLT51c2VQbnMgKSB7CisgICAgICAgICAgIGhBYWNDb25maWctPnVzZVBucyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBlc3RpbWF0ZWQgYml0cmF0ZSBjb25zdW1lZCBieSBTQlIgb3IgUFMgKi8KKyAgICAgICAgaEFhY0NvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSBzYnJFbmNvZGVyX0dldEVzdGltYXRlQml0cmF0ZSgqaFNickVuY29kZXIpIDsKKworICAgIH0gLyogc2JyIGluaXRpYWxpemF0aW9uICovCisKKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBUcmFuc3BvcnQgLSBNb2R1bGUuCisgICAgICovCisgICAgaWYgKCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfVFJBTlNQT1JUKSApCisgICAgeworICAgICAgICBVSU5UIGZsYWdzID0gMDsKKworICAgICAgICBGREthYWNFbmNfTWFwQ29uZmlnKAorICAgICAgICAgICAgICAgICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsCisgICAgICAgICAgICAgICAgY29uZmlnLAorICAgICAgICAgICAgICAgIGdldFNiclNpZ25hbGluZ01vZGUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBjb25maWctPnVzZXJUcFR5cGUsIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjQ29uZmlnLT5zYnJSYXRpbyksCisgICAgICAgICAgICAgICAgaEFhY0NvbmZpZyk7CisKKyAgICAgICAgLyogY3JlYXRlIGZsYWdzIGZvciB0cmFuc3BvcnQgZW5jb2RlciAqLworICAgICAgICBpZiAoY29uZmlnLT51c2VyVHBBbXh2ID09IDEpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFRQX0ZMQUdfTEFUTV9BTVY7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xlYXIgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcypzaXplb2YoVUNIQVIpKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIEJpdHN0cmVhbSBlbmNvZGVyICovCisgICAgICAgIGlmICggdHJhbnNwb3J0RW5jX0luaXQoaEFhY0VuY29kZXItPmhUcEVuYywgaEFhY0VuY29kZXItPm91dEJ1ZmZlciwgaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXMsIGNvbmZpZy0+dXNlclRwVHlwZSwgJmhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZywgZmxhZ3MpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9UUF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgfSAvKiB0cmFuc3BvcnQgaW5pdGlhbGl6YXRpb24gKi8KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBBQUMgLSBDb3JlLgorICAgICAqLworICAgIGlmICggKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgfHwKKyAgICAgICAgIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpICkKKyAgICB7CisgICAgICAgIEFBQ19FTkNPREVSX0VSUk9SIGVycjsKKyAgICAgICAgZXJyID0gRkRLYWFjRW5jX0luaXRpYWxpemUoaEFhY0VuY29kZXItPmhBYWNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5oVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpID8gMSA6IDApOworCisgICAgICAgIGlmIChlcnIgIT0gQUFDX0VOQ19PSykgeworICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX0FBQ19FUlJPUjsKKyAgICAgICAgfQorCisgICAgfSAvKiBhYWMgaW5pdGlhbGl6YXRpb24gKi8KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBNZXRhIERhdGEgLSBFbmNvZGVyLgorICAgICAqLworICAgIGlmICggaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyAmJiAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCE9MCkgJiYKKyAgICAgICAgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8KEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykpICkKKyAgICB7CisgICAgICAgIElOVCBpbnB1dERhdGFEZWxheSA9IERFTEFZX0FBQyhoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7CisKKyAgICAgICAgaWYgKCBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSAmJiBoU2JyRW5jb2RlciE9TlVMTCkgeworICAgICAgICAgIGlucHV0RGF0YURlbGF5ID0gaEFhY0NvbmZpZy0+c2JyUmF0aW8qaW5wdXREYXRhRGVsYXkgKyBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KCpoU2JyRW5jb2Rlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIEZES19NZXRhZGF0YUVuY19Jbml0KGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEluaXRGbGFncyZBQUNFTkNfSU5JVF9TVEFURVMpID8gMSA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlck1ldGFEYXRhTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGFEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZXJTYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlckNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxPcmRlcikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX01FVEFfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ICs9IEZES19NZXRhZGF0YUVuY19HZXREZWxheShoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBwb2ludGVyIHRvIHdvcmtpbmcgYnVmZmVyLgorICAgICAqLworICAgIGlmICggKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgKQorICAgIHsKKyAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0ID0gYWFjQnVmZmVyT2Zmc2V0OworCisgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCA9IGZyYW1lTGVuZ3RoICogY29uZmlnLT5uQ2hhbm5lbHM7CisKKyAgICAgICAgLyogTWFrZSBuRGVsYXkgY29tcGFyaXNvbiBjb21wYXRpYmxlIHdpdGggY29uZmlnLT5uU2FtcGxlc1JlYWQgKi8KKyAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSAqPSBjb25maWctPm5DaGFubmVsczsKKworICAgIH0gLyogcGFyYW1ldGVyIGNoYW5nZWQgKi8KKworICAgIHJldHVybiBBQUNFTkNfT0s7Cit9CisKKworQUFDRU5DX0VSUk9SIGFhY0VuY09wZW4oCisgICAgICAgIEhBTkRMRV9BQUNFTkNPREVSICAgICAgICAqcGhBYWNFbmNvZGVyLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIGVuY01vZHVsZXMsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMKKyAgICAgICAgKQoreworICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisgICAgSEFORExFX0FBQ0VOQ09ERVIgIGhBYWNFbmNvZGVyID0gTlVMTDsKKworICAgIGlmIChwaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBoQWFjRW5jb2RlciA9IEdldF9BYWNFbmNvZGVyKCk7CisKKyAgICBpZiAoaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXIsIHNpemVvZihBQUNFTkNPREVSKSk7CisKKyAgICAvKiBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBhbGxvY2F0ZWQuICovCisgICAgaWYgKGVuY01vZHVsZXM9PTApIHsKKyAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgPSBFTkNfTU9ERV9GTEFHX0FBQzsKKyAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19TQlI7CisgICAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfUFM7CisgICAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfTUVUQTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgLyogY29uc2lkZXIgU0FDIGFuZCBQUyBtb2R1bGUgKi8KKyAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgPSBlbmNNb2R1bGVzOworICAgIH0KKworICAgIC8qIERldGVybWluZSBtYXggY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLworICAgIGlmIChtYXhDaGFubmVscz09MCkgeworICAgICAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzID0gKDgpOworICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID0gKDgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyA9IChtYXhDaGFubmVscyYweDAwRkYpOworICAgICAgICBpZiAoIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgKSB7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID0gKG1heENoYW5uZWxzJjB4RkYwMCkgPyAobWF4Q2hhbm5lbHM+PjgpIDogaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVsczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHM+KDgpKSB8fCAoaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscz4oOCkpICkgeworICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgfSAvKiBtYXhDaGFubmVscz09MCAqLworCisgICAgLyogTWF4IG51bWJlciBvZiBlbGVtZW50cyBjb3VsZCBiZSB0dW5lZCBhbnkgbW9yZS4gKi8KKyAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0VsZW1lbnRzID0gZml4TWluKCg4KSwgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyk7CisgICAgaEFhY0VuY29kZXItPm5NYXhTYnJFbGVtZW50cyA9IGZpeE1pbigoOCksIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMpOworICAgIGhBYWNFbmNvZGVyLT5uTWF4U3ViRnJhbWVzID0gKDEpOworCisKKyAgICAvKiBJbiBjYXNlIG9mIG1lbW9yeSBvdmVybGF5LCBhbGxvY2F0ZSBtZW1vcnkgb3V0IG9mIGxpYnJhcmllcyAqLworCisgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyID0gKElOVF9QQ00qKUZES2NhbGxvYyhoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKklOUFVUQlVGRkVSX1NJWkUsIHNpemVvZihJTlRfUENNKSk7CisKKyAgICAvKiBPcGVuIFNCUiBFbmNvZGVyICovCisgICAgaWYgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfU0JSKSB7CisgICAgICAgIGlmICggc2JyRW5jb2Rlcl9PcGVuKCZoQWFjRW5jb2Rlci0+aEVudkVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19QUykgPyAxIDogMCApICkKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgfSAvKiAoZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgKi8KKworCisgICAgLyogT3BlbiBBYWMgRW5jb2RlciAqLworICAgIGlmICggRkRLYWFjRW5jX09wZW4oJmhBYWNFbmNvZGVyLT5oQWFjRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSkpICE9IEFBQ19FTkNfT0sgKQorICAgIHsKKyAgICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIHsgLyogR2V0IGJpdHN0cmVhbSBvdXRwdXRidWZmZXIgc2l6ZSAqLworICAgICAgVUlOVCBsZF9NOworICAgICAgZm9yIChsZF9NPTE7IChVSU5UKSgxPDxsZF9NKSA8IChoQWFjRW5jb2Rlci0+bk1heFN1YkZyYW1lcypoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKjYxNDQpPj4zOyBsZF9NKyspIDsKKyAgICAgIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzID0gKDE8PGxkX00pOyAgLyogYnVmZmVyIGhhcyB0byBiZSAyXm4gKi8KKyAgICB9CisgICAgaEFhY0VuY29kZXItPm91dEJ1ZmZlciA9IEdldFJhbV9ic091dGJ1ZmZlcigpOworICAgIGlmIChPVVRQVVRCVUZGRVJfU0laRSA8IGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzICkgeworICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBPcGVuIE1ldGEgRGF0YSBFbmNvZGVyICovCisgICAgaWYgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfTUVUQSkgeworICAgICAgaWYgKCBGREtfTWV0YWRhdGFFbmNfT3BlbigmaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYykgKQorICAgICAgeworICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfSAvKiAoZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX01FVEEpICovCisKKyAgICAvKiBPcGVuIFRyYW5zcG9ydCBFbmNvZGVyICovCisgICAgaWYgKCB0cmFuc3BvcnRFbmNfT3BlbigmaEFhY0VuY29kZXItPmhUcEVuYykgIT0gMCApCisgICAgeworICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpOworCisgICAgICAgIEZES2luaXRMaWJJbmZvKCBwTGliSW5mbyk7CisgICAgICAgIHRyYW5zcG9ydEVuY19HZXRMaWJJbmZvKCBwTGliSW5mbyApOworCisgICAgICAgIC8qIEdldCBjYXBhYmlsdHkgZmxhZyBmb3IgdHJhbnNwb3J0IGVuY29kZXIuICovCisgICAgICAgIGhBYWNFbmNvZGVyLT5DQVBGX3RwRW5jID0gRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMoIHBMaWJJbmZvLCBGREtfVFBFTkMpOworCisgICAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpOworICAgIH0KKyAgICBpZiAoIHRyYW5zcG9ydEVuY19SZWdpc3RlclNickNhbGxiYWNrKGhBYWNFbmNvZGVyLT5oVHBFbmMsIGFhY2VuY19TYnJDYWxsYmFjaywgaEFhY0VuY29kZXIpICE9IDAgKSB7CisgICAgICBlcnIgPSBBQUNFTkNfSU5JVF9UUF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuICovCisgICAgYWFjRW5jRGVmYXVsdENvbmZpZygmaEFhY0VuY29kZXItPmFhY0NvbmZpZywgJmhBYWNFbmNvZGVyLT5leHRQYXJhbSk7CisKKyAgICAvKiBJbml0aWFsaXplIGhlYWRlclBlcmlvZCBpbiBjb2RlckNvbmZpZyBmb3IgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpLiAqLworICAgIGhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5oZWFkZXJQZXJpb2QgPSBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclRwSGVhZGVyUGVyaW9kOworCisgICAgLyogQWxsIGVuY29kZXIgbW9kdWxlcyBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCisgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IEFBQ0VOQ19JTklUX0FMTDsKKworICAgIC8qIFJldHVybiBlbmNvZGVyIGluc3RhbmNlICovCisgICAgKnBoQWFjRW5jb2RlciA9IGhBYWNFbmNvZGVyOworCisgICAgcmV0dXJuIGVycjsKKworYmFpbDoKKyAgICBhYWNFbmNDbG9zZSgmaEFhY0VuY29kZXIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworCisKK0FBQ0VOQ19FUlJPUiBhYWNFbmNDbG9zZShIQU5ETEVfQUFDRU5DT0RFUiAqcGhBYWNFbmNvZGVyKQoreworICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisKKyAgICBpZiAocGhBYWNFbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKCpwaEFhY0VuY29kZXIgIT0gTlVMTCkgeworICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciA9ICpwaEFhY0VuY29kZXI7CisKKworICAgICAgIGlmIChoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIhPU5VTEwpIHsKKyAgICAgICAgICAgRkRLZnJlZShoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIpOworICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgIH0KKworICAgICAgIGlmIChoQWFjRW5jb2Rlci0+b3V0QnVmZmVyKSB7CisgICAgICAgICBGcmVlUmFtX2JzT3V0YnVmZmVyKCZoQWFjRW5jb2Rlci0+b3V0QnVmZmVyKTsKKyAgICAgICB9CisKKyAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5oRW52RW5jKSB7CisgICAgICAgICAgICBzYnJFbmNvZGVyX0Nsb3NlICgmaEFhY0VuY29kZXItPmhFbnZFbmMpOworICAgICAgICB9CisgICAgICAgIGlmIChoQWFjRW5jb2Rlci0+aEFhY0VuYykgeworICAgICAgICAgICAgRkRLYWFjRW5jX0Nsb3NlICgmaEFhY0VuY29kZXItPmhBYWNFbmMpOworICAgICAgICB9CisKKyAgICAgICAgdHJhbnNwb3J0RW5jX0Nsb3NlKCZoQWFjRW5jb2Rlci0+aFRwRW5jKTsKKworICAgICAgICBpZiAoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYykgeworICAgICAgICAgICAgRkRLX01ldGFkYXRhRW5jX0Nsb3NlICgmaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyk7CisgICAgICAgIH0KKworICAgICAgICBGcmVlX0FhY0VuY29kZXIocGhBYWNFbmNvZGVyKTsKKyAgICB9CisKK2JhaWw6CisgICAgcmV0dXJuIGVycjsKK30KKworQUFDRU5DX0VSUk9SIGFhY0VuY0VuY29kZSgKKyAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKKyAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICppbkJ1ZkRlc2MsCisgICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqb3V0QnVmRGVzYywKKyAgICAgICAgY29uc3QgQUFDRU5DX0luQXJncyAgICAgICppbmFyZ3MsCisgICAgICAgIEFBQ0VOQ19PdXRBcmdzICAgICAgICAgICAqb3V0YXJncworICAgICAgICApCit7CisgICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKyAgICBJTlQgaSwgbkJzQnl0ZXMgPSAwOworICAgIElOVCAgb3V0Qnl0ZXNbKDEpXTsKKyAgICBpbnQgIG5FeHRlbnNpb25zID0gMDsKKyAgICBpbnQgIGFuY0RhdGFFeHRJZHggPSAtMTsKKworICAgIC8qIGRlYWwgd2l0aCB2YWxpZCBlbmNvZGVyIGhhbmRsZSAqLworICAgIGlmIChoQWFjRW5jb2Rlcj09TlVMTCkgeworICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQWRqdXN0IHVzZXIgc2V0dGluZ3MgYW5kIHRyaWdnZXIgcmVpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBpZiAoaEFhY0VuY29kZXItPkluaXRGbGFncyE9MCkgeworCisgICAgICAgIGVyciA9IGFhY0VuY0luaXQoaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW0pOworCisgICAgICAgIGlmIChlcnIhPUFBQ0VOQ19PSykgeworICAgICAgICAgICAgLyoga2VlcCBpbml0IGZsYWdzIGFsaXZlISAqLworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9OT05FOworICAgIH0KKworICAgIGlmIChvdXRhcmdzIT1OVUxMKSB7CisgICAgICAgIEZES21lbWNsZWFyKG91dGFyZ3MsIHNpemVvZihBQUNFTkNfT3V0QXJncykpOworICAgIH0KKworICAgIGlmIChvdXRCdWZEZXNjIT1OVUxMKSB7CisgICAgICBmb3IgKGk9MDsgaTxvdXRCdWZEZXNjLT5udW1CdWZzOyBpKyspIHsKKyAgICAgICAgaWYgKG91dEJ1ZkRlc2MtPmJ1ZnNbaV0hPU5VTEwpIHsKKyAgICAgICAgICBGREttZW1jbGVhcihvdXRCdWZEZXNjLT5idWZzW2ldLCBvdXRCdWZEZXNjLT5idWZTaXplc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIG9ubHkgZW5jb2RlciBoYW5kbGUgZ2l2ZW4sIGluZGVwZW5kZW50IChyZSlpbml0aWFsaXphdGlvbiBjYW4gYmUgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGlmICggKGhBYWNFbmNvZGVyIT1OVUxMKSAmIChpbkJ1ZkRlc2M9PU5VTEwpICYmIChvdXRCdWZEZXNjPT1OVUxMKSAmJiAoaW5hcmdzPT1OVUxMKSAmJiAob3V0YXJncz09TlVMTCkgKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiByZXNldCBidWZmZXIgd2ljaCBzaWduYWxzIG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBvdXRwdXQgYml0c3RyZWFtIGJ1ZmZlciAqLworICAgIEZES21lbWNsZWFyKG91dEJ5dGVzLCBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLm5TdWJGcmFtZXMqc2l6ZW9mKElOVCkpOworCisgICAgLyoKKyAgICAgKiBNYW5hZ2UgaW5jb21pbmcgYXVkaW8gc2FtcGxlcy4KKyAgICAgKi8KKyAgICBpZiAoIChpbmFyZ3MtPm51bUluU2FtcGxlcyA+IDApICYmIChnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9BVURJT19EQVRBKSAhPSAtMSkgKQorICAgIHsKKyAgICAgICAgLyogRmV0Y2ggZGF0YSB1bnRpbCBuU2FtcGxlc1RvUmVhZCByZWFjaGVkICovCisgICAgICAgIElOVCBpZHggPSBnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9BVURJT19EQVRBKTsKKyAgICAgICAgSU5UIG5ld1NhbXBsZXMgPSBmaXhNYXgoMCxmaXhNaW4oaW5hcmdzLT5udW1JblNhbXBsZXMsIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZC1oQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkKSk7CisgICAgICAgIElOVF9QQ00gKnBJbiA9IGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcitoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQraEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZDsKKworICAgICAgICAvKiBDb3B5IG5ldyBpbnB1dCBzYW1wbGVzIHRvIGludGVybmFsIGJ1ZmZlciAqLworICAgICAgICBpZiAoaW5CdWZEZXNjLT5idWZFbFNpemVzW2lkeF09PShJTlQpc2l6ZW9mKElOVF9QQ00pKSB7CisgICAgICAgICAgICBGREttZW1jcHkocEluLCAoSU5UX1BDTSopaW5CdWZEZXNjLT5idWZzW2lkeF0sIG5ld1NhbXBsZXMqc2l6ZW9mKElOVF9QQ00pKTsgIC8qIEZhc3QgY29weS4gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbkJ1ZkRlc2MtPmJ1ZkVsU2l6ZXNbaWR4XT4oSU5UKXNpemVvZihJTlRfUENNKSkgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8bmV3U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcEluW2ldID0gKElOVF9QQ00pKCgoTE9ORyopaW5CdWZEZXNjLT5idWZzW2lkeF0pW2ldPj4xNik7ICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgMzIgdG8gMTYgYml0LiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8bmV3U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcEluW2ldID0gKChJTlRfUENNKSgoKFNIT1JUKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XSlbaV0pKTw8MTY7ICAgICAgICAgICAgIC8qIENvbnZlcnQgMTYgdG8gMzIgYml0LiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgKz0gbmV3U2FtcGxlczsKKworICAgICAgICAvKiBOdW1iZXIgb2YgZmV0Y2hlZCBpbnB1dCBidWZmZXIgc2FtcGxlcy4gKi8KKyAgICAgICAgb3V0YXJncy0+bnVtSW5TYW1wbGVzID0gbmV3U2FtcGxlczsKKyAgICB9CisKKyAgICAvKiBpbnB1dCBidWZmZXIgY29tcGxldGVseSBmaWxsZWQgPyAqLworICAgIGlmIChoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkIDwgaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkKQorICAgIHsKKyAgICAgICAgLyogLSBlb2YgcmVhY2hlZCBhbmQgZmx1c2hpbmcgZW5hYmxlZCwgb3IKKyAgICAgICAgICAgLSByZXR1cm4gdG8gbWFpbiBhbmQgd2FpdCBmb3IgZnVydGhlciBpbmNvbWluZyBhdWRpbyBzYW1wbGVzICovCisgICAgICAgIGlmIChpbmFyZ3MtPm51bUluU2FtcGxlcz09LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKGhBYWNFbmNvZGVyLT5uWmVyb3NBcHBlbmRlZCA8IGhBYWNFbmNvZGVyLT5uRGVsYXkpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgblplcm9zID0gaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkIC0gaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZDsKKworICAgICAgICAgICAgICBGREtfQVNTRVJUKG5aZXJvcyA+PSAwKTsKKworICAgICAgICAgICAgICAvKiBjbGVhciBvdXQgdW50aWwgZW5kLW9mLWJ1ZmZlciAqLworICAgICAgICAgICAgICBpZiAoblplcm9zKSB7CisgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyK2hBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCtoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkLCBzaXplb2YoSU5UX1BDTSkqblplcm9zICk7CisgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5aZXJvc0FwcGVuZGVkICs9IG5aZXJvczsKKyAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLyogZmx1c2hpbmcgY29tcGxldGVkICovCisgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRU9GOyAvKiBlb2YgcmVhY2hlZCAqLworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIGluYXJncy0+bnVtSW5TYW1wbGVzIT0gLTEgKi8KKyAgICAgICAgICAgIGdvdG8gYmFpbDsgLyogbm90IGVub3VnaCBzYW1wbGVzIGluIGlucHV0IGJ1ZmZlciBhbmQgbm8gZmx1c2hpbmcgZW5hYmxlZCAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogaW5pdCBwYXlsb2FkICovCisgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmV4dFBheWxvYWQsIHNpemVvZihBQUNFTkNfRVhUX1BBWUxPQUQpICogTUFYX1RPVEFMX0VYVF9QQVlMT0FEUyk7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFM7IGkrKykgeworICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbaV0uYXNzb2NpYXRlZENoRWxlbWVudCA9IC0xOworICAgIH0KKyAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZERhdGEsIHNpemVvZihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZERhdGEpKTsKKyAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFNpemUsIHNpemVvZihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFNpemUpKTsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgTWV0YSBEYXRhIGluZm8uCisgICAgICovCisgICAgaWYgKCAoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyE9TlVMTCkgJiYgKGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQhPTApICkgeworCisgICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqcE1ldGFEYXRhID0gTlVMTDsKKyAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICpwTWV0YURhdGFFeHRQYXlsb2FkID0gTlVMTDsKKyAgICAgICAgVUlOVCBuTWV0YURhdGFFeHRlbnNpb25zID0gMDsKKyAgICAgICAgSU5UICBtYXRyaXhfbWl4ZG93bl9pZHggPSAwOworCisgICAgICAgIC8qIE5ldyBtZXRhIGRhdGEgaW5mbyBhdmFpbGFibGUgPyAqLworICAgICAgICBpZiAoIGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX01FVEFEQVRBX1NFVFVQKSAhPSAtMSApIHsKKyAgICAgICAgICBwTWV0YURhdGEgPSAoQUFDRU5DX01ldGFEYXRhKilpbkJ1ZkRlc2MtPmJ1ZnNbZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fTUVUQURBVEFfU0VUVVApXTsKKyAgICAgICAgfQorCisgICAgICAgIEZES19NZXRhZGF0YUVuY19Qcm9jZXNzKGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcitoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcE1ldGFEYXRhRXh0UGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbk1ldGFEYXRhRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF0cml4X21peGRvd25faWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8KElOVCluTWV0YURhdGFFeHRlbnNpb25zOyBpKyspIHsgIC8qIEdldCBtZXRhIGRhdGEgZXh0ZW5zaW9uIHBheWxvYWQuICovCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9ucysrXSA9IHBNZXRhRGF0YUV4dFBheWxvYWRbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIChtYXRyaXhfbWl4ZG93bl9pZHghPS0xKQorICAgICAgICAgICYmICgoaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJDaGFubmVsTW9kZT09TU9ERV8xXzJfMil8fChoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlckNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yXzEpKSApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnQuICovCisgICAgICAgICAgVUlOVCBwY2VWYWx1ZSA9IChVSU5UKSggKDE8PDMpIHwgKChtYXRyaXhfbWl4ZG93bl9pZHgmMHgzKTw8MSkgfCAxICk7CisgICAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGNlQWRkaXRpb25zICE9IHBjZVZhbHVlKSB7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclBjZUFkZGl0aW9ucyA9IHBjZVZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoIGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKSApIHsKKworICAgICAgICBJTlQgblBheWxvYWQgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIEVuY29kZSBTQlIgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzYnJFbmNvZGVyX0VuY29kZUZyYW1lKGhBYWNFbmNvZGVyLT5oRW52RW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkU2l6ZVtuUGF5bG9hZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkRGF0YVtuUGF5bG9hZF0KKyNpZiBkZWZpbmVkKEVWQUxfUEFDS0FHRV9TSUxFTkNFKSB8fCBkZWZpbmVkKEVWQUxfUEFDS0FHRV9TQlJfU0lMRU5DRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaEFhY0VuY29kZXItPmhBYWNFbmMtPmNsZWFyT3V0cHV0CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQWRkIFNCUiBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkU2l6ZVtuUGF5bG9hZF1baV0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5wRGF0YSAgICA9IGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkRGF0YVtuUGF5bG9hZF1baV07CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVNpemUgPSBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFNpemVbblBheWxvYWRdW2ldOworICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVR5cGUgPSBFWFRfU0JSX0RBVEE7ICAvKiBPbmNlIFNCUiBFbmNvZGVyIHN1cHBvcnRzIFNCUiBDUkMgc2V0IEVYVF9TQlJfREFUQV9DUkMgKi8KKyAgICAgICAgICAgICAgICAgICAgbkV4dGVuc2lvbnMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3IgRVhUX1NCUl9EQVRBIGFjY29yZGluZyB0byBjb25maWd1cmF0aW9uLiAqLworICAgICAgICAgICAgICAgICAgICBGREtfQVNTRVJUKG5FeHRlbnNpb25zPD1NQVhfVE9UQUxfRVhUX1BBWUxPQURTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuUGF5bG9hZCsrOworICAgICAgICB9CisgICAgfSAvKiBzYnJFbmFibGVkICovCisKKyAgICBpZiAoIChpbmFyZ3MtPm51bUFuY0J5dGVzID4gMCkgJiYgKCBnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9BTkNJTExSWV9EQVRBKSE9LTEgKSApIHsKKyAgICAgICAgSU5UIGlkeCA9IGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX0FOQ0lMTFJZX0RBVEEpOworICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVNpemUgPSBpbmFyZ3MtPm51bUFuY0J5dGVzICogODsKKyAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLnBEYXRhICAgID0gKFVDSEFSKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XTsKKyAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFUeXBlID0gRVhUX0RBVEFfRUxFTUVOVDsKKyAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKyAgICAgICAgYW5jRGF0YUV4dElkeCA9IG5FeHRlbnNpb25zOyAvKiBzdG9yZSBpbmRleCAqLworICAgICAgICBuRXh0ZW5zaW9ucysrOworICAgIH0KKworICAgIC8qCisgICAgICogRW5jb2RlIEFBQyAtIENvcmUuCisgICAgICovCisgICAgaWYgKCBGREthYWNFbmNfRW5jb2RlRnJhbWUoIGhBYWNFbmNvZGVyLT5oQWFjRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICE9IEFBQ19FTkNfT0sgKQorICAgIHsKKyAgICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChhbmNEYXRhRXh0SWR4ID49IDApIHsKKyAgICAgIG91dGFyZ3MtPm51bUFuY0J5dGVzID0gaW5hcmdzLT5udW1BbmNCeXRlcyAtIChoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFthbmNEYXRhRXh0SWR4XS5kYXRhU2l6ZT4+Myk7CisgICAgfQorCisgICAgLyogc2FtcGxlcyBleGhhdXN0ZWQgKi8KKyAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkIC09IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZDsKKworICAgIC8qCisgICAgICogRGVsYXkgYmFsYW5jaW5nIGJ1ZmZlciBoYW5kbGluZworICAgICAqLworICAgIGlmIChpc1NickFjdGl2ZSgmaEFhY0VuY29kZXItPmFhY0NvbmZpZykpIHsKKyAgICAgICAgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKGhBYWNFbmNvZGVyLT5oRW52RW5jLCBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIpOworICAgIH0KKworICAgIC8qCisgICAgICogTWFrZSBiaXRzdHJlYW0gcHVibGljCisgICAgICovCisgICAgaWYgKG91dEJ1ZkRlc2MtPm51bUJ1ZnM+PTEpIHsKKworICAgICAgICBJTlQgYnNJZHggPSBnZXRCdWZEZXNjSWR4KG91dEJ1ZkRlc2MsT1VUX0JJVFNUUkVBTV9EQVRBKTsKKyAgICAgICAgSU5UIGF1SWR4ID0gZ2V0QnVmRGVzY0lkeChvdXRCdWZEZXNjLE9VVF9BVV9TSVpFUyk7CisKKyAgICAgICAgZm9yIChpPTAsbkJzQnl0ZXM9MDsgaTxoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLm5TdWJGcmFtZXM7IGkrKykgeworICAgICAgICAgIG5Cc0J5dGVzICs9IG91dEJ5dGVzW2ldOworCisgICAgICAgICAgaWYgKGF1SWR4IT0tMSkgeworICAgICAgICAgICAoKElOVCopb3V0QnVmRGVzYy0+YnVmc1thdUlkeF0pW2ldID0gb3V0Qnl0ZXNbaV07CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCAoYnNJZHghPS0xKSAmJiAob3V0QnVmRGVzYy0+YnVmU2l6ZXNbYnNJZHhdPj1uQnNCeXRlcykgKSB7CisgICAgICAgICAgRkRLbWVtY3B5KG91dEJ1ZkRlc2MtPmJ1ZnNbYnNJZHhdLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLCBzaXplb2YoVUNIQVIpKm5Cc0J5dGVzKTsKKyAgICAgICAgICBvdXRhcmdzLT5udW1PdXRCeXRlcyA9IG5Cc0J5dGVzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgdG9vIHNtYWxsLCBjYW4ndCB3cml0ZSB2YWxpZCBiaXRzdHJlYW0gKi8KKyAgICAgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgIH0KKworYmFpbDoKKyAgICBpZiAoZXJyID09IEFBQ0VOQ19FTkNPREVfRVJST1IpIHsKKyAgICAgICAgLyogQWxsIGVuY29kZXIgbW9kdWxlcyBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9BTEw7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljCitBQUNfRU5DT0RFUl9FUlJPUiBhYWNFbmNHZXRDb25mKEhBTkRMRV9BQUNFTkNPREVSICBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICpjb25mQnVmZmVyKQoreworICAgIEZES19CSVRTVFJFQU0gdG1wQ29uZjsKKyAgICBVSU5UIGNvbmZUeXBlOworICAgIFVDSEFSIGJ1Zls2NF07CisgICAgaW50IGVycjsKKworICAgIC8qIEluaXQgYml0IGJ1ZmZlciAqLworICAgIEZES2luaXRCaXRTdHJlYW0oJnRtcENvbmYsIGJ1ZiwgNjQsIDAsIEJTX1dSSVRFUik7CisKKyAgICAvKiB3cml0ZSBjb25mIGluIHRtcCBidWZmZXIgKi8KKyAgICBlcnIgPSB0cmFuc3BvcnRFbmNfR2V0Q29uZihoQWFjRW5jb2Rlci0+aFRwRW5jLCAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLCAmdG1wQ29uZiwgJmNvbmZUeXBlKTsKKworICAgIC8qIGNvcHkgZGF0YSB0byBvdXRidWZmZXI6IGxlbmd0aCBpbiBieXRlcyAqLworICAgIEZES2J5dGVBbGlnbigmdG1wQ29uZiwgMCk7CisKKyAgICAvKiBDaGVjayBidWZmZXIgc2l6ZSAqLworICAgIGlmIChGREtnZXRWYWxpZEJpdHMoJnRtcENvbmYpID4gKCgqc2l6ZSk8PDMpKQorICAgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKKworICAgIEZES2ZldGNoQnVmZmVyKCZ0bXBDb25mLCBjb25mQnVmZmVyLCBzaXplKTsKKworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOS05PV047CisgICAgZWxzZQorICAgICAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKKworQUFDRU5DX0VSUk9SIGFhY0VuY0dldExpYkluZm8oTElCX0lORk8gKmluZm8pCit7CisgIGludCBpID0gMDsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIEZES190b29sc0dldExpYkluZm8oIGluZm8gKTsKKyAgdHJhbnNwb3J0RW5jX0dldExpYkluZm8oIGluZm8gKTsKKworICBzYnJFbmNvZGVyX0dldExpYkluZm8oIGluZm8gKTsKKworICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKKyAgICByZXR1cm4gQUFDRU5DX0lOSVRfRVJST1I7CisgIH0KKworICBpbmZvW2ldLm1vZHVsZV9pZCA9IEZES19BQUNFTkM7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IChjaGFyKilBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFOworICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSAoY2hhciopQUFDRU5DT0RFUl9MSUJfQlVJTERfVElNRTsKKyAgaW5mb1tpXS50aXRsZSA9IChjaGFyKilBQUNFTkNPREVSX0xJQl9USVRMRTsKKyAgaW5mb1tpXS52ZXJzaW9uID0gTElCX1ZFUlNJT04oQUFDRU5DT0RFUl9MSUJfVkwwLCBBQUNFTkNPREVSX0xJQl9WTDEsIEFBQ0VOQ09ERVJfTElCX1ZMMik7OworICBMSUJfVkVSU0lPTl9TVFJJTkcoJmluZm9baV0pOworCisgIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KKyAgaW5mb1tpXS5mbGFncyA9IDAKKyAgICB8IENBUEZfQUFDXzEwMjQgfCBDQVBGX0FBQ19MQworICAgIHwgQ0FQRl9BQUNfNTEyCisgICAgfCBDQVBGX0FBQ180ODAKKyAgICB8IENBUEZfQUFDX0RSQworICAgICAgOworICAvKiBFbmQgb2YgZmxhZ3MgKi8KKworICByZXR1cm4gQUFDRU5DX09LOworfQorCitBQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKKyAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbSwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICB2YWx1ZQorICAgICAgICApCit7CisgICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKyAgICBVU0VSX1BBUkFNICpzZXR0aW5ncyA9ICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW07CisKKyAgICAvKiBjaGVjayBlbmNvZGVyIGhhbmRsZSAqLworICAgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIGFwcGx5IHBhcmFtIHZhbHVlICovCisgICAgc3dpdGNoIChwYXJhbSkKKyAgICB7CisgICAgY2FzZSBBQUNFTkNfQU9UOgorICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBT1QgIT0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlKSB7CisgICAgICAgICAgICAvKiBjaGVjayBpZiBBT1QgbWF0Y2hlcyB0aGUgYWxsb2NhdGVkIG1vZHVsZXMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoIHZhbHVlICkgeworICAgICAgICAgICAgICBjYXNlIEFPVF9QUzoKKyAgICAgICAgICAgICAgY2FzZSBBT1RfTVAyX1BTOgorICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfUFMpKSkgeworICAgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgICAgICAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfU0JSKSkpIHsKKyAgICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgICAgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfQUFDKSkpIHsKKyAgICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0vKiBzd2l0Y2ggdmFsdWUgKi8KKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyQU9UID0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQklUUkFURToKKyAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJCaXRyYXRlID0gdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFTU9ERToKKyAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZU1vZGUgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIHZhbHVlICkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckJpdHJhdGVNb2RlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvKiBzd2l0Y2ggdmFsdWUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQU1QTEVSQVRFOgorICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJTYW1wbGVyYXRlICE9IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoICEoICh2YWx1ZT09ODAwMCkgfHwgKHZhbHVlPT0xMTAyNSkgfHwgKHZhbHVlPT0xMjAwMCkgfHwgKHZhbHVlPT0xNjAwMCkgfHwgKHZhbHVlPT0yMjA1MCkgfHwgKHZhbHVlPT0yNDAwMCkgfHwKKyAgICAgICAgICAgICAgICAgICAodmFsdWU9PTMyMDAwKSB8fCAodmFsdWU9PTQ0MTAwKSB8fCAodmFsdWU9PTQ4MDAwKSB8fCAodmFsdWU9PTY0MDAwKSB8fCAodmFsdWU9PTg4MjAwKSB8fCAodmFsdWU9PTk2MDAwKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5ncy0+dXNlclNhbXBsZXJhdGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOyAvKiByZXNldCBpbnRlcm5hbCBpbnB1dGJ1ZmZlciAqLworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE1PREU6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckNoYW5uZWxNb2RlICE9IChDSEFOTkVMX01PREUpdmFsdWUpIHsKKyAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBwQ29uZmlnID0gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbigoQ0hBTk5FTF9NT0RFKXZhbHVlKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlnPT1OVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAocENvbmZpZy0+bkVsZW1lbnRzID4gaEFhY0VuY29kZXItPm5NYXhBYWNFbGVtZW50cykKKyAgICAgICAgICAgICAgfHwgKHBDb25maWctPm5DaGFubmVsc0VmZiA+IGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpCisgICAgICAgICAgICAgIHx8ICEoKCh2YWx1ZT49MSkgJiYgKHZhbHVlPD03KSl8fCgodmFsdWU+PTMzKSAmJiAodmFsdWU8PTM0KSkpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJDaGFubmVsTW9kZSA9IChDSEFOTkVMX01PREUpdmFsdWU7CisgICAgICAgICAgICBzZXR0aW5ncy0+bkNoYW5uZWxzID0gcENvbmZpZy0+bkNoYW5uZWxzOworICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IDA7IC8qIHJlc2V0IGludGVybmFsIGlucHV0YnVmZmVyICovCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CQU5EV0lEVEg6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckJhbmR3aWR0aCAhPSB2YWx1ZSkgeworICAgICAgICAgIHNldHRpbmdzLT51c2VyQmFuZHdpZHRoID0gdmFsdWU7CisgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgorICAgICAgICBpZiAoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5jaGFubmVsT3JkZXIgIT0gKENIQU5ORUxfT1JERVIpdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICghICgodmFsdWU9PTApIHx8ICh2YWx1ZT09MSkpICkgeworICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyID0gKENIQU5ORUxfT1JERVIpdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0FGVEVSQlVSTkVSOgorICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBZnRlcmJ1cm5lciAhPSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKCEgKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSkgKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJBZnRlcmJ1cm5lciA9IHZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfR1JBTlVMRV9MRU5HVEg6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckZyYW1lbGVuZ3RoICE9IHZhbHVlKSB7CisgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgY2FzZSAxMDI0OgorICAgICAgICAgICAgY2FzZSA1MTI6CisgICAgICAgICAgICBjYXNlIDQ4MDoKKyAgICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJGcmFtZWxlbmd0aCA9IHZhbHVlOworICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQlJfUkFUSU86CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNiclJhdGlvICE9IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoISAoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpIHx8ICh2YWx1ZT09MikpICkgeworICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJTYnJSYXRpbyA9IHZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfU0JSX01PREU6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNickVuYWJsZWQgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyU2JyRW5hYmxlZCA9IHZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfVFJBTlNNVVg6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwVHlwZSAhPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWUpIHsKKworICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgIHR5cGUgID0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlOworICAgICAgICAgICAgVUlOVCAgICAgICAgICAgIGZsYWdzID0gaEFhY0VuY29kZXItPkNBUEZfdHBFbmM7CisKKyAgICAgICAgICAgIGlmICggISggKCh0eXBlPT1UVF9NUDRfQURJRikgICAgICAmJiAgKGZsYWdzJkNBUEZfQURJRikpCisgICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X0FEVFMpICAgICAgJiYgIChmbGFncyZDQVBGX0FEVFMpKQorICAgICAgICAgICAgICAgICB8fCAoKHR5cGU9PVRUX01QNF9MQVRNX01DUDApICYmICgoZmxhZ3MmQ0FQRl9MQVRNKSAmJiAoZmxhZ3MmQ0FQRl9SQVdQQUNLRVRTKSkpCisgICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X0xBVE1fTUNQMSkgJiYgKChmbGFncyZDQVBGX0xBVE0pICYmIChmbGFncyZDQVBGX1JBV1BBQ0tFVFMpKSkKKyAgICAgICAgICAgICAgICAgfHwgKCh0eXBlPT1UVF9NUDRfTE9BUykgICAgICAmJiAgKGZsYWdzJkNBUEZfTE9BUykpCisgICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X1JBVykgICAgICAgJiYgIChmbGFncyZDQVBGX1JBV1BBQ0tFVFMpKQorICAgICAgICAgICAgICAgICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBUeXBlID0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfU0lHTkFMSU5HX01PREU6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nICE9IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoICEoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpIHx8ICh2YWx1ZT09MikpICkgeworICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBTaWduYWxpbmcgPSB2YWx1ZTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1BST1RFQ1RJT046CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbiAhPSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKCAhKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSkgKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFByb3RlY3Rpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0hFQURFUl9QRVJJT0Q6CisgICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kICE9IHZhbHVlKSB7CisgICAgICAgICAgICBzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kID0gdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19UUFNVQkZSQU1FUzoKKyAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzICE9IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoISAoICh2YWx1ZT49MSkgJiYgKHZhbHVlPD00KSApICkgeworICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzID0gdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURToKKyAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19DT05UUk9MX1NUQVRFOgorICAgICAgICBpZiAoaEFhY0VuY29kZXItPkluaXRGbGFncyAhPSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKHZhbHVlJkFBQ0VOQ19SRVNFVF9JTkJVRkZFUikgeworICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX01PREU6CisgICAgICAgIGlmICgoVUlOVClzZXR0aW5ncy0+dXNlck1ldGFEYXRhTW9kZSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKCAhKCh2YWx1ZT49MCkgJiYgKHZhbHVlPD0yKSkgKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisgICAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworCitiYWlsOgorICAgIHJldHVybiBlcnI7Cit9CisKK1VJTlQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgKKyAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKKyAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbQorICAgICAgICApCit7CisgICAgVUlOVCB2YWx1ZSA9IDA7CisgICAgVVNFUl9QQVJBTSAqc2V0dGluZ3MgPSAmaEFhY0VuY29kZXItPmV4dFBhcmFtOworCisgICAgLyogY2hlY2sgZW5jb2RlciBoYW5kbGUgKi8KKyAgICBpZiAoaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogYXBwbHkgcGFyYW0gdmFsdWUgKi8KKyAgICBzd2l0Y2ggKHBhcmFtKQorICAgIHsKKyAgICBjYXNlIEFBQ0VOQ19BT1Q6CisgICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JJVFJBVEU6CisgICAgICAgIHZhbHVlID0gKFVJTlQpKChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlPT1BQUNFTkNfQlJfTU9ERV9DQlIpID8gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRSYXRlIDogLTEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFTU9ERToKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQU1QTEVSQVRFOgorICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5leHRTYW1wbGluZ1JhdGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0NIQU5ORUxNT0RFOgorICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE1vZGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JBTkRXSURUSDoKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJhbmRXaWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgorICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BRlRFUkJVUk5FUjoKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnVzZVJlcXVhbnQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0dSQU5VTEVfTEVOR1RIOgorICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuZnJhbWVsZW5ndGg7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfU0JSX1JBVElPOgorICAgICAgICB2YWx1ZSA9IGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKSA/IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc2JyUmF0aW8gOiAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQlJfTU9ERToKKyAgICAgICAgdmFsdWUgPSAoVUlOVCkgKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyAxIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfVFJBTlNNVVg6CisgICAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcFR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1NJR05BTElOR19NT0RFOgorICAgICAgICB2YWx1ZSA9IChVSU5UKWdldFNiclNpZ25hbGluZ01vZGUoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGUsIHNldHRpbmdzLT51c2VyVHBUeXBlLCBzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnNiclJhdGlvKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfUFJPVEVDVElPTjoKKyAgICAgICAgdmFsdWUgPSAoVUlOVClzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfSEVBREVSX1BFUklPRDoKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuaGVhZGVyUGVyaW9kOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19UUFNVQkZSQU1FUzoKKyAgICAgICAgdmFsdWUgPSAoVUlOVClzZXR0aW5ncy0+dXNlclRwTnN1YkZyYW1lczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQU5DSUxMQVJZX0JJVFJBVEU6CisgICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hbmNfUmF0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ09OVFJPTF9TVEFURToKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+SW5pdEZsYWdzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9NT0RFOgorICAgICAgICB2YWx1ZSA9IChoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkPT0wKSA/IDAgOiAoVUlOVClzZXR0aW5ncy0+dXNlck1ldGFEYXRhTW9kZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisgICAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworCitiYWlsOgorICAgIHJldHVybiB2YWx1ZTsKK30KKworQUFDRU5DX0VSUk9SIGFhY0VuY0luZm8oCisgICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCisgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0ICAgICAgICAqcEluZm8KKyAgICAgICAgKQoreworICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisKKyAgICBGREttZW1jbGVhcihwSW5mbywgc2l6ZW9mKEFBQ0VOQ19JbmZvU3RydWN0KSk7CisgICAgcEluZm8tPmNvbmZTaXplID0gNjQ7IC8qIHByZS1pbml0aWFsaXplICovCisKKyAgICBwSW5mby0+bWF4T3V0QnVmQnl0ZXMgICAgPSAoKGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMqNjE0NCkrNyk+PjM7CisgICAgcEluZm8tPm1heEFuY0J5dGVzICAgICAgID0gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5tYXhBbmNCeXRlc1BlckFVOworICAgIHBJbmZvLT5pbkJ1ZkZpbGxMZXZlbCAgICA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQvaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKyAgICBwSW5mby0+aW5wdXRDaGFubmVscyAgICAgPSBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzOworICAgIHBJbmZvLT5mcmFtZUxlbmd0aCAgICAgICA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZC9oQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzOworICAgIHBJbmZvLT5lbmNvZGVyRGVsYXkgICAgICA9IGhBYWNFbmNvZGVyLT5uRGVsYXkvaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKworICAgIC8qIEdldCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZiAoIGFhY0VuY0dldENvbmYoaEFhY0VuY29kZXIsICZwSW5mby0+Y29uZlNpemUsICZwSW5mby0+Y29uZkJ1ZlswXSkgIT0gQUFDX0VOQ19PSykgeworICAgICAgICBlcnIgPSBBQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KK2JhaWw6CisgICAgcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY0MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5jcHAKQEAgLTAsMCArMSw1OTEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBwbnMuYworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCisjaW5jbHVkZSAicHN5X2RhdGEuaCIKKyNpbmNsdWRlICJwbnNwYXJhbS5oIgorI2luY2x1ZGUgIm5vaXNlZGV0LmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisKKy8qIG1pbkNvcnJlbGF0aW9uRW5lcmd5ID0gKDEuMGUtMTBmKV4yIH4gMl4tNjcgPSAyXi00NyAqIDJeLTIwICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQ29ycmVsYXRpb25FbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLjApOyAvKiBGTDJGWENPTlNUX0RCTCgoZmxvYXQpRkRLcG93KDIuMCwtNDcpKTsgKi8KKy8qIG5vaXNlQ29ycmVsYXRpb25UaHJlc2ggPSAwLjZeMiAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIG5vaXNlQ29ycmVsYXRpb25UaHJlc2ggPSBGTDJGWENPTlNUX0RCTCgwLjM2KTsKKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbiggUE5TX0NPTkZJRyAgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHRuc09yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5ICk7CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjTm9pc2VOcmdzKCBjb25zdCBJTlQgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqcG5zRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbm9pc2VOcmcgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGluaXRQbnNDb25maWd1cmF0aW9uCisgICAgZGVzY3JpcHRpb246ICBmaWxsIHBuc0NvbmYgd2l0aCBwbnMgcGFyYW1ldGVycworICAgIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCisgICAgaW5wdXQ6ICAgICAgICBQTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpCisgICAgICAgICAgICAgICAgICBiaXRyYXRlLCBzYW1wbGVyYXRlLCB1c2VQbnMsCisgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2ZiJ3MsIHBvaW50ZXIgdG8gc2ZiIG9mZnNldAorICAgIG91dHB1dDogICAgICAgZXJyb3IgY29kZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKFBOU19DT05GSUcgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG51bUNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgaXNMQykKK3sKKyAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisKKyAgLyogaW5pdCBub2lzZSBkZXRlY3Rpb24gKi8KKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfR2V0UG5zUGFyYW0oJnBuc0NvbmYtPm5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMQyk7CisgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgIHJldHVybiBFcnJvclN0YXR1czsKKworICBwbnNDb25mLT5taW5Db3JyZWxhdGlvbkVuZXJneSA9IG1pbkNvcnJlbGF0aW9uRW5lcmd5OworICBwbnNDb25mLT5ub2lzZUNvcnJlbGF0aW9uVGhyZXNoID0gbm9pc2VDb3JyZWxhdGlvblRocmVzaDsKKworICBwbnNDb25mLT51c2VQbnMgPSB1c2VQbnM7CisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1Buc0RldGVjdAorICAgIGRlc2NyaXB0aW9uOiAgZG8gZGVjaXNpb24sIGlmIFBOUyBzaGFsbCB1c2VkIG9yIG5vdAorICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgICBwbnMgY29uZmlnIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgcG5zIGRhdGEgc3RydWN0dXJlIChtb2RpZmllZCksCisgICAgICAgICAgICAgICAgICBsYXN0V2luZG93U2VxdWVuY2UgKGxvbmcgb3Igc2hvcnQgYmxvY2tzKQorICAgICAgICAgICAgICAgICAgc2ZiQWN0aXZlCisgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIFNmYiBFbmVyZ3ksIFRocmVzaG9sZCwgT2Zmc2V0CisgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIG1kY3QgU3BlY3RydW0KKyAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiBlYWNoIGdyb3VwCisgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRvbmFsaXR5IGNhbGN1bGF0ZWQgaW4gY2hhb3NtZWFzdXJlCisgICAgICAgICAgICAgICAgICB0bnMgb3JkZXIgYW5kIHByZWRpY3Rpb24gZ2FpbgorICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZCBub2lzZU5yZyBhdCBhY3RpdmUgUE5TCisgICAgb3V0cHV0OiAgICAgICBwbnNGbGFnIGluIHBucyBkYXRhIHN0cnVjdHVyZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX1Buc0RldGVjdChQTlNfQ09ORklHICAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgbGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICB0bnNPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHRuc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpub2lzZU5yZyApCisKK3sKKyAgaW50IHNmYjsKKyAgaW50IHN0YXJ0Tm9pc2VTZmI7CisKKyAgaWYgKHBuc0NvbmYtPm5wLmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgSVNfTE9XX0NPTUxFWElUWSkgeworICAgIGlmICggKCFwbnNDb25mLT51c2VQbnMpIHx8ICAgICAgICAgICAgICAvKiBwbnMgZW5hYmxlZD8gKi8KKyAgICAgICAgICAgKGxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpICkgLyogY3VycmVudGx5IG9ubHkgbG9uZyBibG9ja3MgKi8KKyAgICB7CisgICAgICBGREttZW1jbGVhcihwbnNEYXRhLT5wbnNGbGFnLCBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKElOVCkpOyAvKiBjbGVhciBhbGwgcG5zRmxhZ3MgKi8KKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxNQVhfR1JPVVBFRF9TRkI7IHNmYisrKSB7CisgICAgICAgICAgbm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBucmcncyBvZiBwcmV2aW91cyBmcmFtZSAqLworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZighcG5zQ29uZi0+dXNlUG5zKQorICAgICAgcmV0dXJuOworCisgICAgLyogUE5TIG9ubHkgZm9yIGxvbmcgV2luZG93cyAqLworICAgIGlmIChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIEpVU1RfTE9OR19XSU5ET1cpIHsKKyAgICAgIGlmKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVykgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAwOyAgICAvKiBjbGVhciBhbGwgcG5zRmxhZ3MgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIC8qCisgICAgY2FsbCBub2lzZSBkZXRlY3Rpb24KKyAgKi8KKyAgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbiggcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgIHBuc0RhdGEsCisgICAgICAgICAgICAgICAgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICB0bnNPcmRlciwKKyAgICAgICAgICAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAorICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlLAorICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgc2ZidG9uYWxpdHkgKTsKKworICAvKiBzZXQgc3RhcnROb2lzZVNmYiAobG9uZykgKi8KKyAgc3RhcnROb2lzZVNmYiA9IHBuc0NvbmYtPm5wLnN0YXJ0U2ZiOworCisgIC8qIFNldCBub2lzZSBzdWJzdGl0dXRpb24gc3RhdHVzICovCisgIGZvcihzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisKKyAgICAvKiBObyBQTlMgYmVsb3cgc3RhcnROb2lzZVNmYiAqLworICAgIGlmKHNmYiA8IHN0YXJ0Tm9pc2VTZmIpeworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qCisgICAgICBkbyBub2lzZSBzdWJzdGl0dXRpb24gaWYKKyAgICAgIGZ1enp5IG1lYXN1cmUgaXMgaGlnaCBlbm91Z2gKKyAgICAgIHNmYiBmcmVxID4gbWluaW11bSBzZmIgZnJlcQorICAgICAgc2lnbmFsIGluIGNvZGVyIGJhbmQgaXMgbm90IG1hc2tlZAorICAgICovCisKKyAgICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbc2ZiXSA+IEZMMkZYQ09OU1RfU0dMKDAuNSkpICYmCisgICAgICAgKCAoc2ZiVGhyZXNob2xkTGREYXRhW3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjU4NDk2MjVmLzY0LjBmKSkgIC8qIHRociAqIDEuNSA9IHRockxkICtsZCgxLjUpLzY0ICovCisgICAgICAgICA8IHNmYkVuZXJneUxkRGF0YVtzZmJdICkgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgIG1hcmsgaW4gcHN5b3V0IGZsYWcgYXJyYXkgdGhhdCB3ZSB3aWxsIGNvZGUKKyAgICAgICAgdGhpcyBiYW5kIHdpdGggUE5TCisgICAgICAqLworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMTsgLyogUE5TX09OICovCisgICAgfQorICAgIGVsc2V7CisgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAwOyAvKiBQTlNfT0ZGICovCisgICAgfQorCisgICAgLyogbm8gUE5TIGlmIExUUCBpcyBhY3RpdmUgKi8KKyAgfQorCisgIC8qIGF2b2lkIFBOUyBob2xlcyAqLworICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbMF0+RkwyRlhDT05TVF9TR0woMC41ZikpICYmIChwbnNEYXRhLT5wbnNGbGFnWzFdKSkgeworICAgIHBuc0RhdGEtPnBuc0ZsYWdbMF0gPSAxOworICB9CisKKyAgZm9yKHNmYj0xOyBzZmI8bWF4U2ZiUGVyR3JvdXAtMTsgc2ZiKyspIHsKKyAgICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbc2ZiXT5wbnNDb25mLT5ucC5nYXBGaWxsVGhyKSAmJgorICAgICAgIChwbnNEYXRhLT5wbnNGbGFnW3NmYi0xXSkgJiYgKHBuc0RhdGEtPnBuc0ZsYWdbc2ZiKzFdKSkgeworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMTsKKyAgICB9CisgIH0KKworICBpZihtYXhTZmJQZXJHcm91cD4wKSB7CisgICAgLyogYXZvaWQgUE5TIGhvbGUgKi8KKyAgICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbbWF4U2ZiUGVyR3JvdXAtMV0+cG5zQ29uZi0+bnAuZ2FwRmlsbFRocikgJiYgKHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAtMl0pKSB7CisgICAgICBwbnNEYXRhLT5wbnNGbGFnW21heFNmYlBlckdyb3VwLTFdID0gMTsKKyAgICB9CisgICAgLyogYXZvaWQgc2luZ2xlIFBOUyBiYW5kICovCisgICAgaWYocG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cC0yXT09MCkgeworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cC0xXSA9IDA7CisgICAgfQorICB9CisKKyAgLyogYXZvaWQgc2luZ2xlIFBOUyBiYW5kcyAqLworICBpZihwbnNEYXRhLT5wbnNGbGFnWzFdPT0wKSB7CisgICAgcG5zRGF0YS0+cG5zRmxhZ1swXSA9IDA7CisgIH0KKworICBmb3Ioc2ZiPTE7IHNmYjxtYXhTZmJQZXJHcm91cC0xOyBzZmIrKykgeworICAgIGlmKChwbnNEYXRhLT5wbnNGbGFnW3NmYi0xXT09MCkmJihwbnNEYXRhLT5wbnNGbGFnW3NmYisxXT09MCkpIHsKKyAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbc2ZiXSA9IDA7CisgICAgfQorICB9CisKKworICAvKgorICAgIGNhbGN1bGF0ZSBub2lzZU5yZydzCisgICovCisgIEZES2FhY0VuY19DYWxjTm9pc2VOcmdzKCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgIHBuc0RhdGEtPnBuc0ZsYWcsCisgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgbm9pc2VOcmcgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uCisgICAgZGVzY3JpcHRpb246IHdyYXBwZXIgZm9yIG5vaXNlZGV0LmMKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICBwbnMgY29uZmlnIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICBwbnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSwKKyAgICAgICAgICAgICAgICAgc2ZiQWN0aXZlCisgICAgICAgICAgICAgICAgIHRucyBvcmRlciBhbmQgcHJlZGljdGlvbiBnYWluCisgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gbWRjdCBTcGVjdHJ1bWFuZCBTZmIgRW5lcmd5CisgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gU2ZiIHRvbmFsaXR5CisgICAgb3V0cHV0OiAgICAgIG5vaXNlRnV6enlNZWFzdXJlIGluIHN0cnVjdHVyZSBwbnNEYXRhCisgICAgICAgICAgICAgICAgIGZsYWdzIHRvbmFsIC8gbm9udG9uYWwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uKCBQTlNfQ09ORklHICAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdG5zT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqc2ZidG9uYWxpdHkgKQoreworICAgIElOVCBjb25kaXRpb24gPSBUUlVFOworICAgIGlmICggIShwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01MRVhJVFkpICkgeworICAgICAgY29uZGl0aW9uID0gKHRuc09yZGVyID4gMyk7CisgICAgfQorICAgIC8qCisgICAgbm8gUE5TIGlmIGhlYXZ5IFROUyBhY3Rpdml0eQorICAgIGNsZWFyIHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlCisgICAgKi8KKyAgICBpZigocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX0dBSU5fVEhSKSAmJgorICAgICAgKHRuc1ByZWRpY3Rpb25HYWluID49IHBuc0NvbmYtPm5wLnRuc0dhaW5UaHJlc2hvbGQpICYmIGNvbmRpdGlvbiAmJgorICAgICAgISgocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX1BOUykgJiYgKHRuc1ByZWRpY3Rpb25HYWluID49IHBuc0NvbmYtPm5wLnRuc1BOU0dhaW5UaHJlc2hvbGQpICYmICh0bnNBY3RpdmUpKSApCisgICAgeworICAgICAgICAvKiBjbGVhciBhbGwgbm9pc2VGdXp6eU1lYXN1cmUgKi8KKyAgICAgICAgRkRLbWVtY2xlYXIocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsIHNmYkFjdGl2ZSpzaXplb2YoRklYUF9TR0wpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgY2FsbCBub2lzZSBkZXRlY3Rpb24sIG91dHB1dCBpbiBwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwKKyAgICAgICAgdXNlIHJlYWwgbWRjdCBzcGVjdHJhbCBkYXRhCisgICAgICAgICovCisgICAgICAgIEZES2FhY0VuY19ub2lzZURldGVjdCggbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgcG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsCisgICAgICAgICAgICAmcG5zQ29uZi0+bnAsCisgICAgICAgICAgICBzZmJ0b25hbGl0eSk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19DYWxjTm9pc2VOcmdzCisgICAgZGVzY3JpcHRpb246IENhbGN1bGF0ZSB0aGUgTm9pc2VOcmcncworICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgIHNmYkFjdGl2ZQorICAgICAgICAgICAgICAgICBpZiBwbnNGbGFnIGNhbGN1bGF0ZSBOb2lzZU5yZworICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHNmYkVuZXJneSBhbmQgZ3JvdXBMZW4KKyAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBub2lzZU5yZyAobW9kaWZpZWQpCisgICAgb3V0cHV0OiAgICAgIG5vaXNlTnJnJ3MgaW4gcG5zRmxhZ2VkIHNmYidzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY05vaXNlTnJncyggY29uc3QgSU5UICAgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpSRVNUUklDVCBwbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpSRVNUUklDVCBub2lzZU5yZyApCit7CisgIGludCBzZmI7CisgIElOVCB0bXAgPSAoLUxPR19OT1JNX1BDTSk8PDI7CisKKyAgZm9yKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICBpZihwbnNGbGFnW3NmYl0pIHsKKyAgICAgIElOVCBucmcgPSAoLXNmYkVuZXJneUxkRGF0YVtzZmJdK0ZMMkZYQ09OU1RfREJMKDAuNWYvNjQuMGYpKT4+KERGUkFDVF9CSVRTLTEtNyk7CisgICAgICBub2lzZU5yZ1tzZmJdID0gdG1wIC0gbnJnOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19Db2RlUG5zQ2hhbm5lbAorICAgIGRlc2NyaXB0aW9uOiBFeGVjdXRlIHBucyBkZWNpc3Npb24KKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICBzZmJBY3RpdmUKKyAgICAgICAgICAgICAgICAgcG5zIGNvbmZpZyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgdXNlIFBOUyBpZiBwbnNGbGFnCisgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gU2ZiIEVuZXJneSwgbm9pc2VOcmcsIFRocmVzaG9sZAorICAgIG91dHB1dDogICAgICBzZXQgc2ZiVGhyZXNob2xkIGhpZ2ggdG8gY29kZSBwZSB3aXRoIDAsCisgICAgICAgICAgICAgICAgIG5vaXNlTnJnIG1hcmtzIGZsYWcgZm9yIHBucyBjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKGNvbnN0IElOVCAgICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0NPTkZJRyAgICAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKlJFU1RSSUNUIHBuc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBub2lzZU5yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYlRocmVzaG9sZExkRGF0YSkKK3sKKyAgSU5UIHNmYjsKKyAgSU5UIGxhc3RpTm9pc2VFbmVyZ3kgPSAwOworICBJTlQgZmlyc3RQTlNiYW5kID0gMTsgLyogVFJVRSBmb3IgZmlyc3QgUE5TLWNvZGVkIGJhbmQgKi8KKworICAvKiBubyBQTlMgKi8KKyAgaWYoIXBuc0NvbmYtPnVzZVBucykgeworICAgIGZvcihzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAvKiBubyBQTlMgY29kaW5nICovCisgICAgICBub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBjb2RlIFBOUyAqLworICBmb3Ioc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgeworICAgIGlmKHBuc0ZsYWdbc2ZiXSkgeworICAgICAgLyogaGlnaCBzZmJUaHJlc2hvbGQgY2F1c2VzIHBlID0gMCAqLworICAgICAgaWYobm9pc2VOcmdbc2ZiXSAhPSBOT19OT0lTRV9QTlMpCisgICAgICAgIHNmYlRocmVzaG9sZExkRGF0YVtzZmJdID0gc2ZiRW5lcmd5TGREYXRhW3NmYl0gKyBGTDJGWENPTlNUX0RCTCgxLjBmL0xEX0RBVEFfU0NBTElORyk7CisKKyAgICAgIC8qIHNldCBub2lzZU5yZyBpbiB2YWxpZCByZWdpb24gKi8KKyAgICAgIGlmKCFmaXJzdFBOU2JhbmQpIHsKKyAgICAgICAgSU5UIGRlbHRhaU5vaXNlRW5lcmd5ID0gbm9pc2VOcmdbc2ZiXSAtIGxhc3RpTm9pc2VFbmVyZ3k7CisKKyAgICAgICAgaWYoZGVsdGFpTm9pc2VFbmVyZ3kgPiBDT0RFX0JPT0tfUE5TX0xBVikKKyAgICAgICAgICAgIG5vaXNlTnJnW3NmYl0gLT0gZGVsdGFpTm9pc2VFbmVyZ3kgLSBDT0RFX0JPT0tfUE5TX0xBVjsKKyAgICAgICAgZWxzZSBpZihkZWx0YWlOb2lzZUVuZXJneSA8IC1DT0RFX0JPT0tfUE5TX0xBVikKKyAgICAgICAgICAgIG5vaXNlTnJnW3NmYl0gLT0gZGVsdGFpTm9pc2VFbmVyZ3kgKyBDT0RFX0JPT0tfUE5TX0xBVjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBmaXJzdFBOU2JhbmQgPSAwOworICAgICAgfQorICAgICAgbGFzdGlOb2lzZUVuZXJneSA9IG5vaXNlTnJnW3NmYl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogbm8gUE5TIGNvZGluZyAqLworICAgICAgbm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyCisgICAgZGVzY3JpcHRpb246IENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gb2Ygbm9pc2UgaW4gYSBjaGFubmVsIHBhaXIKKworICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgIHNmYkFjdGl2ZQorICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHNmYiBlbmVyZ2llcyBsZWZ0LCByaWdodCBhbmQgbWlkIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgcG5zIGNvbmZpZyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgcG5zIGRhdGEgc3RydWN0dXJlIGxlZnQgYW5kIHJpZ2h0IChtb2RpZmllZCkKKworICAgIG91dHB1dDogICAgICBub2lzZUVuZXJneUNvcnJlbGF0aW9uIGluIHBucyBkYXRhIHN0cnVjdHVyZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKGNvbnN0IElOVCAgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJFbmVyZ3lMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxlZnRMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJFbmVyZ3lSaWdodExELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICpSRVNUUklDVCBwbnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFSaWdodCkKK3sKKyAgSU5UIHNmYjsKKyAgRklYUF9EQkwgY2NmOworCisgIGlmKCFwbnNDb25mLT51c2VQbnMpCisgICAgcmV0dXJuOworCisgIEZJWFBfREJMICpSRVNUUklDVCBwTm9pc2VFbmVyZ3lDb3JyZWxhdGlvbkwgPSBwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uUiA9IHBuc0RhdGFSaWdodC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKKworICBmb3Ioc2ZiPTA7c2ZiPCBzZmJBY3RpdmU7c2ZiKyspIHsKKyAgICBGSVhQX0RCTCBxdW90ID0gKHNmYkVuZXJneUxlZnRMRFtzZmJdPj4xKSArIChzZmJFbmVyZ3lSaWdodExEW3NmYl0+PjEpOworCisgICAgaWYocXVvdCA8IEZMMkZYQ09OU1RfREJMKC0zMi4wZi8oZmxvYXQpTERfREFUQV9TQ0FMSU5HKSkKKyAgICAgIGNjZiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGVsc2UgeworICAgICAgRklYUF9EQkwgYWNjdSA9IHNmYkVuZXJneU1pZFtzZmJdLSAoKChzZmJFbmVyZ3lMZWZ0W3NmYl0+PjEpKyhzZmJFbmVyZ3lSaWdodFtzZmJdPj4xKSk+PjEpOworICAgICAgSU5UIHNpZ24gPSAoYWNjdSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/IDEgOiAwIDsKKyAgICAgIGFjY3UgPSBmaXhwX2FicyhhY2N1KTsKKworICAgICAgY2NmID0gQ2FsY0xkRGF0YShhY2N1KSArIEZMMkZYQ09OU1RfREJMKChmbG9hdCkxLjBmLyhmbG9hdClMRF9EQVRBX1NDQUxJTkcpIC0gcXVvdDsgICAvKiBsZChhY2N1KjIpID0gbGQoYWNjdSkgKyAxICovCisgICAgICBjY2YgPSAoY2NmPj1GTDJGWENPTlNUX0RCTCgwLjApKSA/ICgoRklYUF9EQkwpTUFYVkFMX0RCTCkgOiAoc2lnbikgPyAtQ2FsY0ludkxkRGF0YShjY2YpIDogQ2FsY0ludkxkRGF0YShjY2YpOworICAgIH0KKworICAgIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uTFtzZmJdID0gY2NmOworICAgIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uUltzZmJdID0gY2NmOworICB9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcgorICAgIGRlc2NyaXB0aW9uOiBpZiBQTlMgdXNlZCBhdCBsZWZ0IGFuZCByaWdodCBjaGFubmVsLAorICAgICAgICAgICAgICAgICB1c2UgbXNNYXNrIHRvIGZsYWcgY29ycmVsYXRpb24KKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICBzZmJBY3RpdmUKKyAgICAgICAgICAgICAgICAgcG5zIGNvbmZpZyBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgcG5zIGRhdGEgc3RydWN0dXJlIGxlZnQgYW5kIHJpZ2h0IChtb2RpZmllZCkKKyAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBtc01hc2ssIGZsYWdzIGNvcnJlbGF0aW9uIGJ5IHBucyBjb2RpbmcgKG1vZGlmaWVkKQorICAgICAgICAgICAgICAgICBEaWdlc3Qgb2YgTVMgY29kaW5nCisgICAgb3V0cHV0OiAgICAgIHBuc0ZsYWcgaW4gcG5zIGRhdGEgc3RydWN0dXJlLAorICAgICAgICAgICAgICAgICBtc0ZsYWcgaW4gbXNNYXNrIChmbGFncyBjb3JyZWxhdGlvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoY29uc3QgSU5UICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqUkVTVFJJQ1QgbXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbXNEaWdlc3QgKQoreworICBJTlQgc2ZiOworCisgIGlmKCFwbnNDb25mLT51c2VQbnMpCisgICAgcmV0dXJuOworCisgIGZvcihzZmI9MDtzZmI8c2ZiQWN0aXZlO3NmYisrKSB7CisgICAgLyoKKyAgICAgIE1TIHBvc3QgcHJvY2Vzc2luZworICAgICovCisgICAgaWYoIG1zTWFza1tzZmJdICkgeworICAgICAgaWYoIChwbnNEYXRhTGVmdC0+cG5zRmxhZ1tzZmJdKSAmJgorICAgICAgICAgIChwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSkgKSB7CisgICAgICAgIC8qIEFBQyBvbmx5OiBTdGFuZGFyZCAqLworICAgICAgICAvKiBkbyB0aGlzIHRvIGF2b2lkIG1zIGZsYWdzIGluIGxheWVycyB0aGF0IHNob3VsZCBub3QgaGF2ZSBpdCAqLworICAgICAgICBpZihwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbltzZmJdIDw9IHBuc0NvbmYtPm5vaXNlQ29ycmVsYXRpb25UaHJlc2gpeworICAgICAgICAgIG1zTWFza1tzZmJdID0gMDsKKyAgICAgICAgICAqbXNEaWdlc3QgPSBNU19TT01FOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICBObyBQTlMgY29kaW5nCisgICAgICAgICovCisgICAgICAgIHBuc0RhdGFMZWZ0LT5wbnNGbGFnW3NmYl0gPSAwOworICAgICAgICBwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgIFVzZSBNUyBmbGFnIHRvIHNpZ25hbCBub2lzZSBjb3JyZWxhdGlvbiBpZgorICAgICAgcG5zIGlzIGFjdGl2ZSBpbiBib3RoIGNoYW5uZWxzCisgICAgKi8KKyAgICBpZiggKHBuc0RhdGFMZWZ0LT5wbnNGbGFnW3NmYl0pICYmIChwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSkgKSB7CisgICAgICBpZihwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbltzZmJdID4gcG5zQ29uZi0+bm9pc2VDb3JyZWxhdGlvblRocmVzaCkgeworICAgICAgICBtc01hc2tbc2ZiXSA9IDE7CisgICAgICAgICptc0RpZ2VzdCA9IE1TX1NPTUU7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmggYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkYTlkZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuaApAQCAtMCwwICsxLDExMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IHBucy5oCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1BOU19ICisjZGVmaW5lIF9fUE5TX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgInBuc3BhcmFtLmgiCisKKyNkZWZpbmUgTk9fTk9JU0VfUE5TIEZES19JTlRfTUlOCisKK3R5cGVkZWYgc3RydWN0eworICBOT0lTRVBBUkFNUyBucDsKKyAgRklYUF9EQkwgbWluQ29ycmVsYXRpb25FbmVyZ3k7CisgIEZJWFBfREJMIG5vaXNlQ29ycmVsYXRpb25UaHJlc2g7CisgIElOVCAgICAgIHVzZVBuczsKK30gUE5TX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIEZJWFBfU0dMIG5vaXNlRnV6enlNZWFzdXJlW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIG5vaXNlRW5lcmd5Q29ycmVsYXRpb25bTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UICAgICAgcG5zRmxhZ1tNQVhfR1JPVVBFRF9TRkJdOworfSBQTlNfREFUQTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWVhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcApAQCAtMCwwICsxLDEzNDkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdyb2VzY2hlbCwgVG9iaWFzIENoYWx1cGthCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJ0bnNfZnVuYy5oIgorI2luY2x1ZGUgImFhY0VuY19yb20uaCIKKyNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCisKK2VudW0geworICAgIEhJRklMVCA9IDAsIC8qIGluZGV4IG9mIGhpZ2hlciBmaWx0ZXIgKi8KKyAgICBMT0ZJTFQgPSAxIC8qIGluZGV4IG9mIGxvd2VyIGZpbHRlciAqLworfTsKKworCisjZGVmaW5lIEZJTFRFUl9ESVJFQ1RJT04gMAorCitzdGF0aWMgY29uc3QgRklYUF9EQkwgYWNmV2luZG93TG9uZ1sxMiszKzFdID0geworICAweDdmZmZmZmZmLDB4N2ZiODAwMDAsMHg3ZWUwMDAwMCwweDdkNzgwMDAwLDB4N2I4MDAwMDAsMHg3OGY4MDAwMCwweDc1ZTAwMDAwLDB4NzIzODAwMDAsCisgIDB4NmUwMDAwMDAsMHg2OTM4MDAwMCwweDYzZTAwMDAwLDB4NWRmODAwMDAsMHg1NzgwMDAwMCwweDUwNzgwMDAwLDB4NDhlMDAwMDAsMHg0MGI4MDAwMAorfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd1Nob3J0WzQrMysxXSA9IHsKKyAgMHg3ZmZmZmZmZiwweDdlMDAwMDAwLDB4NzgwMDAwMDAsMHg2ZTAwMDAwMCwweDYwMDAwMDAwLDB4NGUwMDAwMDAsMHgzODAwMDAwMCwweDFlMDAwMDAwCit9OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UICAgICAgZmlsdGVyRW5hYmxlZFtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgICAgICB0aHJlc2hPbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMKi8KKyAgSU5UICAgICAgZmlsdGVyU3RhcnRGcmVxW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCisgIElOVCAgICAgIHRuc0xpbWl0T3JkZXJbTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAgIC8qIExpbWl0IGZvciBUTlMgb3JkZXIgVEFCVUwqLworICBJTlQgICAgICB0bnNGaWx0ZXJEaXJlY3Rpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAvKiBGaWx0ZXJpbmcgZGlyZWN0aW9uLCAwPXVwLCAxPWRvd24gVEFCVUwgKi8KKyAgSU5UICAgICAgYWNmU3BsaXRbTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgRklYUF9EQkwgdG5zVGltZVJlc29sdXRpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgLyogVE5TIG1heC4gdGltZSByZXNvbHV0aW9uIFRBQlVMLiBTaG91bGQgYmUgZnJhY3QgYnV0IE1TVkMgd29uJ3QgY29tcGlsZSB0aGVuICovCisgIElOVCAgICAgIHNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7CisKK30gVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQ7CisKKwordHlwZWRlZiBzdHJ1Y3R7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlRnJvbVsyXTsgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGVUb1syXTsgICAgLyogbm9uZVNicj0wLCB1c2VTYnI9MSAqLworICBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAgcGFyYW1UYWJbMl07ICAgICAvKiBtb25vPTAsIHN0ZXJlbz0xICovCisKK30gVE5TX0lORk9fVEFCOworCisjZGVmaW5lIFROU19USU1FUkVTX1NDQUxFICAgICgxKQorI2RlZmluZSBGTDJfVElNRVJFU19GSVgoYSkgICAoIEZMMkZYQ09OU1RfREJMKGEvKGZsb2F0KSgxPDxUTlNfVElNRVJFU19TQ0FMRSkpICkKKworc3RhdGljIGNvbnN0IFROU19JTkZPX1RBQiB0bnNJbmZvVGFiW10gPQoreworICB7CisgICAgeyAgMTYwMDAsICAxMzUwMH0sCisgICAgeyAgMzIwMDAsICAyODAwMH0sCisgICAgeworICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgMTJ9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMmYpfSwgMSB9LAorICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgMTJ9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMmYpfSwgMSB9CisgICAgfQorICB9LAorICB7CisgICAgeyAgMzIwMDEsICAyODAwMX0sCisgICAgeyAgNjAwMDAsICA1MjAwMH0sCisgICAgeworICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgMTB9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9LAorICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgMTB9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9CisgICAgfQorICB9LAorICB7CisgICAgeyAgNjAwMDEsICA1MjAwMX0sCisgICAgeyAzODQwMDAsIDM4NDAwMH0sCisgICAgeworICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgIDh9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9LAorICAgICAgeyB7MSwgMX0sIHsxNDM3LCAxNTAwfSwgezE0MDAsIDYwMH0sIHsxMiwgIDh9LCB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sIHszLCAxfSwge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwgMSB9CisgICAgfQorICB9Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCAgIHNhbXBsaW5nUmF0ZTsKKyAgU0NIQVIgbWF4QmFuZHNbMl07IC8qIGxvbmc9MDsgc2hvcnQ9MSAqLworCit9IFROU19NQVhfVEFCX0VOVFJZOworCitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWIxMDI0W10gPQoreworICB7IDk2MDAwLCB7IDMxLCAgOX19LAorICB7IDg4MjAwLCB7IDMxLCAgOX19LAorICB7IDY0MDAwLCB7IDM0LCAxMH19LAorICB7IDQ4MDAwLCB7IDQwLCAxNH19LAorICB7IDQ0MTAwLCB7IDQyLCAxNH19LAorICB7IDMyMDAwLCB7IDUxLCAxNH19LAorICB7IDI0MDAwLCB7IDQ2LCAxNH19LAorICB7IDIyMDUwLCB7IDQ2LCAxNH19LAorICB7IDE2MDAwLCB7IDQyLCAxNH19LAorICB7IDEyMDAwLCB7IDQyLCAxNH19LAorICB7IDExMDI1LCB7IDQyLCAxNH19LAorICB7IDgwMDAsICB7IDM5LCAxNH19Cit9OworCitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI0ODBbXSA9Cit7CisgIHsgNDgwMDAsIHsgMzEsIC0xfX0sCisgIHsgNDQxMDAsIHsgMzIsIC0xfX0sCisgIHsgMzIwMDAsIHsgMzcsIC0xfX0sCisgIHsgMjQwMDAsIHsgMzAsIC0xfX0sCisgIHsgMjIwNTAsIHsgMzAsIC0xfX0KK307CisKK3N0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjUxMltdID0KK3sKKyAgeyA0ODAwMCwgeyAzMSwgLTF9fSwKKyAgeyA0NDEwMCwgeyAzMiwgLTF9fSwKKyAgeyAzMjAwMCwgeyAzNywgLTF9fSwKKyAgeyAyNDAwMCwgeyAzMSwgLTF9fSwKKyAgeyAyMjA1MCwgeyAzMSwgLTF9fQorfTsKKworc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAorICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByZWZsQ29lZmYsCisgICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCisgICAgICAgICk7CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19QYXJjb3IySW5kZXgoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpwYXJjb3IsCisgICAgICAgIElOVCAqUkVTVFJJQ1QgaW5kZXgsCisgICAgICAgIGNvbnN0IElOVCBvcmRlciwKKyAgICAgICAgY29uc3QgSU5UIGJpdHNQZXJDb2VmZgorICAgICAgICApOworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfSW5kZXgyUGFyY29yKAorICAgICAgICBjb25zdCBJTlQgKmluZGV4LAorICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGFyY29yLAorICAgICAgICBjb25zdCBJTlQgb3JkZXIsCisgICAgICAgIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYKKyAgICAgICAgKTsKKworc3RhdGljIElOVCBGREthYWNFbmNfUGFyY29yVG9McGMoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpyZWZsQ29lZmYsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBMcGNDb2VmZiwKKyAgICAgICAgY29uc3QgSU5UIG51bU9mQ29lZmYsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCB3b3JrQnVmZmVyCisgICAgICAgICk7CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcigKKyAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNpZ25hbCwKKyAgICAgICAgY29uc3QgSU5UIG51bU9mTGluZXMsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpwcmVkaWN0b3JDb2VmZiwKKyAgICAgICAgY29uc3QgSU5UIG9yZGVyLAorICAgICAgICBjb25zdCBJTlQgbHBjR2FpbkZhY3RvcgorICAgICAgICApOworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAorICAgICAgICBGSVhQX0RCTCAqd2luLAorICAgICAgICBjb25zdCBpbnQgd2luU2l6ZSwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCisgICAgICAgIGNvbnN0IEZJWFBfREJMIHRpbWVSZXNvbHV0aW9uLAorICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZQorICAgICAgICApOworCitzdGF0aWMgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIEZES2FhY0VuY19HZXRUbnNQYXJhbSgKKyAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCisgICAgICAgIGNvbnN0IElOVCBjaGFubmVscywKKyAgICAgICAgY29uc3QgSU5UIHNickxkCisgICAgICAgICkKK3sKKyAgaW50IGk7CisgIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEICp0bnNDb25maWdUYWIgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KSAoc2l6ZW9mKHRuc0luZm9UYWIpL3NpemVvZihUTlNfSU5GT19UQUIpKTsgaSsrKSB7CisgICAgaWYgKChiaXRSYXRlID49IHRuc0luZm9UYWJbaV0uYml0UmF0ZUZyb21bc2JyTGQ/MTowXSkgJiYKKyAgICAgICAgIGJpdFJhdGUgPD0gdG5zSW5mb1RhYltpXS5iaXRSYXRlVG9bc2JyTGQ/MTowXSkKKyAgICB7CisgICAgICB0bnNDb25maWdUYWIgPSAmdG5zSW5mb1RhYltpXS5wYXJhbVRhYlsoY2hhbm5lbHM9PTEpPzA6MV07CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRuc0NvbmZpZ1RhYjsKK30KKworCitzdGF0aWMgSU5UIGdldFRuc01heEJhbmRzKAorICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgIGNvbnN0IElOVCBpc1Nob3J0QmxvY2sKKyAgICAgICAgKQoreworICBpbnQgaTsKKyAgSU5UIG51bUJhbmRzID0gLTE7CisgIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZICpwTWF4QmFuZHNUYWIgPSBOVUxMOworICBpbnQgbWF4QmFuZHNUYWJTaXplID0gMDsKKworICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKKyAgICBjYXNlIDEwMjQ6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjEwMjQ7CisgICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWIxMDI0KS9zaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODA6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjQ4MDsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjQ4MCkvc2l6ZW9mKFROU19NQVhfVEFCX0VOVFJZKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgcE1heEJhbmRzVGFiID0gdG5zTWF4QmFuZHNUYWI1MTI7CisgICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWI1MTIpL3NpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbnVtQmFuZHMgPSAtMTsKKyAgfQorCisgIGlmIChwTWF4QmFuZHNUYWIhPU5VTEwpIHsKKyAgICBmb3IgKGk9MDsgaTxtYXhCYW5kc1RhYlNpemU7IGkrKykgeworICAgICAgbnVtQmFuZHMgPSBwTWF4QmFuZHNUYWJbaV0ubWF4QmFuZHNbKCFpc1Nob3J0QmxvY2spPzA6MV07CisgICAgICBpZiAoc2FtcGxlUmF0ZSA+PSBwTWF4QmFuZHNUYWJbaV0uc2FtcGxpbmdSYXRlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBudW1CYW5kczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nCisKKyAgUmV0dXJucyBpbmRleCBvZiBuZWFyZXN0IGJhbmQgYm9yZGVyCisKKyAgXHBhcmFtIGZyZXF1ZW5jeQorICBccGFyYW0gc2FtcGxpbmcgZnJlcXVlbmN5CisgIFxwYXJhbSB0b3RhbCBudW1iZXIgb2YgYmFuZHMKKyAgXHBhcmFtIHBvaW50ZXIgdG8gdGFibGUgb2YgYmFuZCBib3JkZXJzCisKKyAgXHJldHVybiBiYW5kIGJvcmRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSU5UIEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKAorICAgICAgICBjb25zdCBJTlQgZnJlcSwKKyAgICAgICAgY29uc3QgSU5UIGZzLAorICAgICAgICBjb25zdCBJTlQgbnVtT2ZCYW5kcywKKyAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQKKyAgICAgICAgKQoreworICBJTlQgbGluZU51bWJlciwgYmFuZDsKKworICAvKiAgYXNzZXJ0KGZyZXEgPj0gMCk7ICAqLworICBsaW5lTnVtYmVyID0gKGZyZXEqYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdKjQvZnMrMSkvMjsKKworICAvKiBmcmVxID4gZnMvMiAqLworICBpZiAobGluZU51bWJlciA+PSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10pCisgICAgcmV0dXJuIG51bU9mQmFuZHM7CisKKyAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCisgIGZvciAoYmFuZD0wOyBiYW5kPG51bU9mQmFuZHM7IGJhbmQrKykgeworICAgIGlmIChiYW5kU3RhcnRPZmZzZXRbYmFuZCsxXT5saW5lTnVtYmVyKSBicmVhazsKKyAgfQorCisgIC8qIHJvdW5kIHRvIG5lYXJlc3QgYmFuZCBib3JkZXIgKi8KKyAgaWYgKGxpbmVOdW1iZXIgLSBiYW5kU3RhcnRPZmZzZXRbYmFuZF0gPgorICAgICAgYmFuZFN0YXJ0T2Zmc2V0W2JhbmQrMV0gLSBsaW5lTnVtYmVyICkKKyAgICB7CisgICAgICBiYW5kKys7CisgICAgfQorCisgIHJldHVybihiYW5kKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uCisgICAgZGVzY3JpcHRpb246ICBmaWxsIFROU19DT05GSUcgc3RydWN0dXJlIHdpdGggc2Vuc2libGUgY29udGVudAorICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgICBiaXRyYXRlLCBzYW1wbGVyYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICBibG9ja3R5cGUgKGxvbmcgb3Igc2hvcnQpLAorICAgICAgICAgICAgICAgICAgVE5TIENvbmZpZyBzdHJ1Y3QgKG1vZGlmaWVkKSwKKyAgICAgICAgICAgICAgICAgIHBzeSBjb25maWcgc3RydWN0LAorICAgICAgICAgICAgICAgICAgdG5zIGFjdGl2ZSBmbGFnCisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbihJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGRTYnJQcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VUbnNQZWFrKQoreworICBpbnQgaTsKKyAgLy9mbG9hdCBhY2ZUaW1lUmVzICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyAwLjEyNWYgOiAwLjA0Njg3NWY7CisKKyAgaWYgKGNoYW5uZWxzIDw9IDApCisgICAgcmV0dXJuIChBQUNfRU5DT0RFUl9FUlJPUikxOworCisgIC8qIGluaXRpYWxpemUgVE5TIGZpbHRlciBmbGFnLCBvcmRlciwgYW5kIGNvZWZmaWNpZW50IHJlc29sdXRpb24gKGluIGJpdHMgcGVyIGNvZWZmKSAqLworICB0Qy0+dG5zQWN0aXZlICAgICAgPSAoYWN0aXZlKSA/IFRSVUUgOiBGQUxTRTsKKyAgdEMtPm1heE9yZGVyICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gNSA6IDEyOyAgLyogbWF4aW11bTogNywgMjAgKi8KKyAgaWYgKGJpdFJhdGUgPCAxNjAwMCkKKyAgICB0Qy0+bWF4T3JkZXIgLT0gMjsKKyAgdEMtPmNvZWZSZXMgICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMyA6IDQ7CisKKyAgLyogTFBDIHN0b3AgbGluZTogaGlnaGVzdCBNRENUIGxpbmUgdG8gYmUgY29kZWQsIGJ1dCBkbyBub3QgZ28gYmV5b25kIFROU19NQVhfQkFORFMhICovCisgIHRDLT5scGNTdG9wQmFuZCA9IGdldFRuc01heEJhbmRzKHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDEgOiAwKTsKKworICBpZiAodEMtPmxwY1N0b3BCYW5kIDwgMCkgeworICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKKyAgfQorCisgIHRDLT5scGNTdG9wQmFuZCA9IEZES21pbih0Qy0+bHBjU3RvcEJhbmQsIHBDLT5zZmJBY3RpdmUpOworICB0Qy0+bHBjU3RvcExpbmUgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07CisKKyAgc3dpdGNoIChncmFudWxlTGVuZ3RoKSB7CisgICAgY2FzZSAxMDI0OgorICAgICAgLyogVE5TIHN0YXJ0IGxpbmU6IHNraXAgbG93ZXIgTURDVCBsaW5lcyB0byBwcmV2ZW50IGFydGlmYWN0cyBkdWUgdG8gZmlsdGVyIG1pc21hdGNoICovCisgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gICA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDAgOiAoKHNhbXBsZVJhdGUgPCAxODc4MykgPyA0IDogOCk7CisgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdXTsKKworICAgICAgaSA9IHRDLT5scGNTdG9wQmFuZDsKKyAgICAgIHdoaWxlIChwQy0+c2ZiT2Zmc2V0W2ldID4gKHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSArICh0Qy0+bHBjU3RvcExpbmUgLSB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0pIC8gNCkpIGktLTsKKyAgICAgIHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSAgID0gaTsKKyAgICAgIHRDLT5scGNTdGFydExpbmVbSElGSUxUXSAgID0gcEMtPnNmYk9mZnNldFtpXTsKKworICAgICAgdEMtPmNvbmZUYWIudGhyZXNoT25bSElGSUxUXSA9IDE0Mzc7CisgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gMTUwMDsKKworICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdID0gdEMtPm1heE9yZGVyOworICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdID0gdEMtPm1heE9yZGVyIC0gNzsKKworICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0hJRklMVF0gPSBGSUxURVJfRElSRUNUSU9OOworICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF0gPSBGSUxURVJfRElSRUNUSU9OOworCisgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtISUZJTFRdID0gLTE7ICAvKiBzaWduYWwgTWVyZ2VkNHRvMlF1YXJ0ZXJzQXV0b0NvcnJlbGF0aW9uIGluIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24qLworICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbTE9GSUxUXSA9IC0xOyAgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbiBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uICovCisKKyAgICAgIHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbSElGSUxUXSA9IDE7CisgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSAxOworICAgICAgdEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCA9IDE7CisKKyAgICAgIC8qIGNvbXB1dGUgYXV0b2NvcnJlbGF0aW9uIHdpbmRvdyBiYXNlZCBvbiBtYXhpbXVtIGZpbHRlciBvcmRlciBmb3IgZ2l2ZW4gYmxvY2sgdHlwZSAqLworICAgICAgLyogZm9yIChpID0gMDsgaSA8PSB0Qy0+bWF4T3JkZXIgKyAzOyBpKyspIHsKKyAgICAgICAgICAgZmxvYXQgYWNmV2luVGVtcCA9IGFjZlRpbWVSZXMgKiBpOworICAgICAgICAgICBhY2ZXaW5kb3dbaV0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC0gYWNmV2luVGVtcCAqIGFjZldpblRlbXApOworICAgICAgICAgfQorICAgICAgKi8KKyAgICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd1Nob3J0LCBGREttaW4oc2l6ZW9mKGFjZldpbmRvd1Nob3J0KSwgc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKKyAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgYWNmV2luZG93U2hvcnQsIEZES21pbihzaXplb2YoYWNmV2luZG93U2hvcnQpLCBzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd0xvbmcsIEZES21pbihzaXplb2YoYWNmV2luZG93TG9uZyksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0xPRklMVF0sIGFjZldpbmRvd0xvbmcsIEZES21pbihzaXplb2YoYWNmV2luZG93TG9uZyksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICBjYXNlIDUxMjoKKyAgICAgIHsKKyAgICAgICAgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIHBDZmcgPSBGREthYWNFbmNfR2V0VG5zUGFyYW0oYml0UmF0ZSwgY2hhbm5lbHMsIGxkU2JyUHJlc2VudCk7CisKKyAgICAgICAgaWYgKCBwQ2ZnICE9IE5VTEwgKSB7CisgICAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdICAgICAgICAgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbSElGSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwgcEMtPnNmYk9mZnNldCk7CisgICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdICAgICAgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbSElGSUxUXV07CisgICAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdICAgICAgICAgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbTE9GSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwgcEMtPnNmYk9mZnNldCk7CisgICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICAgICAgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbTE9GSUxUXV07CisKKyAgICAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdID0gcENmZy0+dGhyZXNoT25bSElGSUxUXTsKKyAgICAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gcENmZy0+dGhyZXNoT25bTE9GSUxUXTsKKworICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSA9IHBDZmctPnRuc0xpbWl0T3JkZXJbSElGSUxUXTsKKyAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0gPSBwQ2ZnLT50bnNMaW1pdE9yZGVyW0xPRklMVF07CisKKyAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXSA9IHBDZmctPnRuc0ZpbHRlckRpcmVjdGlvbltISUZJTFRdOworICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdID0gcENmZy0+dG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF07CisKKyAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtISUZJTFRdID0gcENmZy0+YWNmU3BsaXRbSElGSUxUXTsKKyAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtMT0ZJTFRdID0gcENmZy0+YWNmU3BsaXRbTE9GSUxUXTsKKworICAgICAgICAgIHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbSElGSUxUXSA9IHBDZmctPmZpbHRlckVuYWJsZWRbSElGSUxUXTsKKyAgICAgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSBwQ2ZnLT5maWx0ZXJFbmFibGVkW0xPRklMVF07CisgICAgICAgICAgdEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCA9IHBDZmctPnNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7CisKKyAgICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgdEMtPm1heE9yZGVyKzEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIHBDZmctPnRuc1RpbWVSZXNvbHV0aW9uW0hJRklMVF0sIFROU19USU1FUkVTX1NDQUxFKTsKKyAgICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgdEMtPm1heE9yZGVyKzEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIHBDZmctPnRuc1RpbWVSZXNvbHV0aW9uW0xPRklMVF0sIFROU19USU1FUkVTX1NDQUxFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0Qy0+dG5zQWN0aXZlID0gRkFMU0U7IC8qIG5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLCBkaXNhYmxlIHRucyB0b29sICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0Qy0+dG5zQWN0aXZlID0gRkFMU0U7IC8qIG5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLCBkaXNhYmxlIHRucyB0b29sICovCisgIH0KKworICByZXR1cm4gQUFDX0VOQ19PSzsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bQorCisgIFNjYWxlcyB1cCBzcGVjdHJ1bSBsaW5lcyBpbiBhIGdpdmVuIGZyZXF1ZW5jeSBzZWN0aW9uCisKKyAgXHBhcmFtIHNjYWxlZCBzcGVjdHJ1bQorICBccGFyYW0gb3JpZ2luYWwgc3BlY3RydW0KKyAgXHBhcmFtIGZyZXF1ZW5jeSBsaW5lIHRvIHN0YXJ0IHNjYWxpbmcKKyAgXHBhcmFtIGZyZXF1ZW5jeSBsaW5lIHRvIGVuYyBzY2FsaW5nCisKKyAgXHJldHVybiBzY2FsZSBmYWN0b3IKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0oCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqZGVzdCwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcmMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHN0b3BMaW5lCisgICAgICAgICkKK3sKKyAgICBJTlQgaSwgc2NhbGU7CisKKyAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgLyogR2V0IGhpZ2hlc3QgdmFsdWUgaW4gZ2l2ZW4gc3BlY3RydW0gKi8KKyAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKKyAgICAgIG1heFZhbCA9IGZpeE1heChtYXhWYWwsZml4cF9hYnMoc3JjW2ldKSk7CisgICAgfQorICAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhWYWwpOworCisgICAgLyogU2NhbGUgc3BlY3RydW0gYWNjb3JkaW5nIHRvIGhpZ2hlc3QgdmFsdWUgKi8KKyAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKKyAgICAgIGRlc3RbaV0gPSBzcmNbaV08PHNjYWxlOworICAgIH0KKworICAgIHJldHVybiBzY2FsZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZQorCisgIENhbGN1bGF0ZSBhdXRvY29yZWxsYXRpb24gdmFsdWUgZm9yIG9uZSBsYWcKKworICBccGFyYW0gcG9pbnRlciB0byBzcGVjdHJ1bQorICBccGFyYW0gc3RhcnQgbGluZQorICBccGFyYW0gc3RvcCBsaW5lCisgIFxwYXJhbSBsYWcgdG8gYmUgY2FsY3VsYXRlZAorICBccGFyYW0gc2NhbGluZyBvZiB0aGUgbGFnCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIEZJWFBfREJMIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZSgKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcGVjdHJ1bSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzdGFydExpbmUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RvcExpbmUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbGFnLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNjYWxlCisgICAgICAgICkKK3sKKyAgICBpbnQgaTsKKyAgICBGSVhQX0RCTCByZXN1bHQgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgaWYgKGxhZz09MCkgeworICAgICAgZm9yIChpPXN0YXJ0TGluZTsgaTxzdG9wTGluZTsgaSsrKSB7CisgICAgICAgIHJlc3VsdCArPSAoZlBvdzIoc3BlY3RydW1baV0pPj5zY2FsZSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yIChpPXN0YXJ0TGluZTsgaTwoc3RvcExpbmUtbGFnKTsgaSsrKSB7CisgICAgICAgIHJlc3VsdCArPSAoZk11bHQoc3BlY3RydW1baV0sIHNwZWN0cnVtW2krbGFnXSk+PnNjYWxlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYworCisgIEF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbiBmb3IgMXN0IGFuZCAybmQgaGFsZiBvZiB0aGUgc3BlY3RydW0KKworICBccGFyYW0gcG9pbnRlciB0byBzcGVjdHJ1bQorICBccGFyYW0gcG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gd2luZG93CisgIFxwYXJhbSBmaWx0ZXIgc3RhcnQgbGluZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSBGSVhQX0RCTCBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKAorICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIHZhbHVlLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNjYWxlLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgKnNjCisgICAgICAgICkKK3sKKyAgICAjZGVmaW5lIEhMTV9NSU5fTlJHIDAuMDAwMDAwMDAzNzI1MjkwMjk4NDYxOTE0MDYyNWYgLyogMl4tMjggKi8KKyAgICAjZGVmaW5lIE1BWF9JTlZfTlJHRkFDICgxLmYvSExNX01JTl9OUkcpCisKKyAgICBGSVhQX0RCTCByZXRWYWx1ZTsKKyAgICBGSVhQX0RCTCBBLCBCOworCisgICAgaWYgKHNjYWxlPj0wKSB7CisgICAgICBBID0gdmFsdWU7CisgICAgICBCID0gRkwyRlhDT05TVF9EQkwoSExNX01JTl9OUkcpPj5maXhNaW4oREZSQUNUX0JJVFMtMSxzY2FsZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQSA9IHZhbHVlPj5maXhNaW4oREZSQUNUX0JJVFMtMSwoLXNjYWxlKSk7CisgICAgICBCID0gRkwyRlhDT05TVF9EQkwoSExNX01JTl9OUkcpOworICAgIH0KKworICAgIGlmIChBID4gQikgeworICAgICAgaW50IHNoaWZ0ID0gMDsKKyAgICAgIEZJWFBfREJMIHRtcCA9IGludlNxcnROb3JtMih2YWx1ZSwmc2hpZnQpOworCisgICAgICByZXRWYWx1ZSA9IGZNdWx0KHRtcCx0bXApOworICAgICAgKnNjICs9ICgyKnNoaWZ0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBNQVhfSU5WX05SR0ZBQypGREtwb3coMiwtMjgpID0gMS8yXi0yOCAqIDJeLTI4ID0gMS4wICovCisgICAgICByZXRWYWx1ZSA9IC8qRkwyRlhDT05TVF9EQkwoTUFYX0lOVl9OUkdGQUMqRkRLcG93KDIsLTI4KSkqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICpzYyArPSBzY2FsZSsyODsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24oCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAqc3BlY3RydW0sCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYWNmV2luZG93W01BWF9OVU1fT0ZfRklMVEVSU11bVE5TX01BWF9PUkRFUiszKzFdLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGxwY1N0YXJ0TGluZVtNQVhfTlVNX09GX0ZJTFRFUlNdLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGxwY1N0b3BMaW5lLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG1heE9yZGVyLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU10sCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqX3J4eDEsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqX3J4eDIKKyAgICAgICAgKQoreworICAgIGludCBpLCBpZHgwLCBpZHgxLCBpZHgyLCBpZHgzLCBpZHg0LCBsYWc7CisgICAgRklYUF9EQkwgcnh4MV8wLCByeHgyXzAsIHJ4eDNfMCwgcnh4NF8wOworCisgICAgLyogYnVmZmVyIGZvciB0ZW1wb3JhbCBzcGVjdHJ1bSAqLworICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOworCisgICAgLyogcHJlLWluaXRpYWxpemF0aW9uIG91dHB1dCAqLworICAgIEZES21lbWNsZWFyKCZfcnh4MVswXSwgc2l6ZW9mKEZJWFBfREJMKSoobWF4T3JkZXIrMSkpOworICAgIEZES21lbWNsZWFyKCZfcnh4MlswXSwgc2l6ZW9mKEZJWFBfREJMKSoobWF4T3JkZXIrMSkpOworCisgICAgLyogTURDVCBsaW5lIGluZGljZXMgc2VwYXJhdGluZyB0aGUgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBhbmFseXNpcyBxdWFydGVycyAqLworICAgIGlmICggKGFjZlNwbGl0W0xPRklMVF09PS0xKSB8fCAoYWNmU3BsaXRbSElGSUxUXT09LTEpICkgeworICAgICAgLyogYXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uIGZvciAxc3QsIDJuZCwgM3JkLCBhbmQgNHRoIHF1YXJ0ZXIgb2YgdGhlIHNwZWN0cnVtICovCisgICAgICBpZHgwID0gbHBjU3RhcnRMaW5lW0xPRklMVF07CisgICAgICBpICAgID0gbHBjU3RvcExpbmUgLSBscGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICAgIGlkeDEgPSBpZHgwICsgaSAvIDQ7CisgICAgICBpZHgyID0gaWR4MCArIGkgLyAyOworICAgICAgaWR4MyA9IGlkeDAgKyBpICogMyAvIDQ7CisgICAgICBpZHg0ID0gbHBjU3RvcExpbmU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgRkRLX0FTU0VSVChhY2ZTcGxpdFtMT0ZJTFRdPT0xKTsKKyAgICAgIEZES19BU1NFUlQoYWNmU3BsaXRbSElGSUxUXT09Myk7CisgICAgICBpICAgID0gKGxwY1N0b3BMaW5lIC0gbHBjU3RhcnRMaW5lW0hJRklMVF0pIC8gMzsKKyAgICAgIGlkeDAgPSBscGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICAgIGlkeDEgPSBscGNTdGFydExpbmVbSElGSUxUXTsKKyAgICAgIGlkeDIgPSBpZHgxICsgaTsKKyAgICAgIGlkeDMgPSBpZHgyICsgaTsKKyAgICAgIGlkeDQgPSBscGNTdG9wTGluZTsKKyAgICB9CisKKyAgICAvKiBjb3B5IHNwZWN0cnVtIHRvIHRlbXBvcmFsIGJ1ZmZlciBhbmQgc2NhbGUgdXAgYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworICAgIElOVCBzYzEgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDAsIGlkeDEpOworICAgIElOVCBzYzIgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDEsIGlkeDIpOworICAgIElOVCBzYzMgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDIsIGlkeDMpOworICAgIElOVCBzYzQgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDMsIGlkeDQpOworCisgICAgLyogZ2V0IHNjYWxpbmcgdmFsdWVzIGZvciBzdW1tYXRpb24gKi8KKyAgICBJTlQgbnNjMSwgbnNjMiwgbnNjMywgbnNjNDsKKyAgICBmb3IgKG5zYzE9MTsgKDE8PG5zYzEpPChpZHgxLWlkeDApOyBuc2MxKyspOworICAgIGZvciAobnNjMj0xOyAoMTw8bnNjMik8KGlkeDItaWR4MSk7IG5zYzIrKyk7CisgICAgZm9yIChuc2MzPTE7ICgxPDxuc2MzKTwoaWR4My1pZHgyKTsgbnNjMysrKTsKKyAgICBmb3IgKG5zYzQ9MTsgKDE8PG5zYzQpPChpZHg0LWlkeDMpOyBuc2M0KyspOworCisgICAgLyogY29tcHV0ZSBhdXRvY29ycmVsYXRpb24gdmFsdWUgYXQgbGFnIHplcm8sIGkuIGUuIGVuZXJneSwgZm9yIGVhY2ggcXVhcnRlciAqLworICAgIHJ4eDFfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIDAsIG5zYzEpOworICAgIHJ4eDJfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIDAsIG5zYzIpOworICAgIHJ4eDNfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDIsIGlkeDMsIDAsIG5zYzMpOworICAgIHJ4eDRfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDMsIGlkeDQsIDAsIG5zYzQpOworCisgICAgLyogY29tcHV0ZSBlbmVyZ3kgbm9ybWFsaXphdGlvbiBmYWN0b3JzLCBpLiBlLiAxL2VuZXJneSAoc2F2ZXMgc29tZSBkaXZpc2lvbnMpICovCisgICAgaWYgKHJ4eDFfMCAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKQorICAgIHsKKyAgICAgICAgSU5UIHNjX2ZhYzEgPSAtMTsKKyAgICAgICAgRklYUF9EQkwgZmFjMSA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4MV8wLCAoKC0yKnNjMSkrbnNjMSksICZzY19mYWMxKTsKKyAgICAgICAgX3J4eDFbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDFfMCxmYWMxKSxzY19mYWMxKTsKKworICAgICAgICBmb3IgKGxhZyA9IDE7IGxhZyA8PSBtYXhPcmRlcjsgbGFnKyspIHsKKyAgICAgICAgICAvKiBjb21wdXRlIGVuZXJneS1ub3JtYWxpemVkIGFuZCB3aW5kb3dlZCBhdXRvY29ycmVsYXRpb24gdmFsdWVzIGF0IHRoaXMgbGFnICovCisgICAgICAgICAgaWYgKCgzICogbGFnKSA8PSBtYXhPcmRlciArIDMpIHsKKyAgICAgICAgICAgICAgRklYUF9EQkwgeDEgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgwLCBpZHgxLCBsYWcsIG5zYzEpOworICAgICAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bMypsYWddKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhdXRvIGNvcnIgb3ZlciB1cHBlciAzLzQgb2Ygc3BlY3RydW0gKi8KKyAgICBpZiAoICEoKHJ4eDJfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSAmJiAocnh4M18wID09IEZMMkZYQ09OU1RfREJMKDAuZikpICYmIChyeHg0XzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkpICkKKyAgICB7CisgICAgICAgIEZJWFBfREJMIGZhYzIsIGZhYzMsIGZhYzQ7CisgICAgICAgIGZhYzIgPSBmYWMzID0gZmFjNCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgIElOVCBzY19mYWMyLCBzY19mYWMzLCBzY19mYWM0OworICAgICAgICBzY19mYWMyID0gc2NfZmFjMyA9IHNjX2ZhYzQgPSAwOworCisgICAgICAgIGlmIChyeHgyXzAhPUZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgICBmYWMyID0gRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHgyXzAsICgoLTIqc2MyKStuc2MyKSwgJnNjX2ZhYzIpOworICAgICAgICAgIHNjX2ZhYzIgLT0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAocnh4M18wIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgICAgZmFjMyA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4M18wLCAoKC0yKnNjMykrbnNjMyksICZzY19mYWMzKTsKKyAgICAgICAgICBzY19mYWMzIC09IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ4eDRfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICAgIGZhYzQgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDRfMCwgKCgtMipzYzQpK25zYzQpLCAmc2NfZmFjNCk7CisgICAgICAgICAgc2NfZmFjNCAtPSAyOworICAgICAgICB9CisKKyAgICAgICAgX3J4eDJbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDJfMCxmYWMyKSxzY19mYWMyKSArCisgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChyeHgzXzAsZmFjMyksc2NfZmFjMykgKworICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQocnh4NF8wLGZhYzQpLHNjX2ZhYzQpOworCisgICAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgeworICAgICAgICAgIC8qIG1lcmdlIHF1YXJ0ZXJzIDIsIDMsIDQgaW50byBvbmUgYXV0b2NvcnJlbGF0aW9uOyBxdWFydGVyIDEgc3RheXMgc2VwYXJhdGUgKi8KKyAgICAgICAgICBGSVhQX0RCTCB4MiA9IHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MSwgaWR4MiwgbGFnLCBuc2MyKSwgZmFjMiksc2NfZmFjMikgKworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgyLCBpZHgzLCBsYWcsIG5zYzMpLCBmYWMzKSxzY19mYWMzKSArCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDMsIGlkeDQsIGxhZywgbnNjNCksIGZhYzQpLHNjX2ZhYzQpOworCisgICAgICAgICAgX3J4eDJbbGFnXSA9IGZNdWx0KHgyLCBhY2ZXaW5kb3dbSElGSUxUXVtsYWddKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19UbnNEZXRlY3QKKyAgICBkZXNjcmlwdGlvbjogIGRvIGRlY2lzaW9uLCBpZiBUTlMgc2hhbGwgYmUgdXNlZCBvciBub3QKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICAgdG5zIGRhdGEgc3RydWN0dXJlIChtb2RpZmllZCksCisgICAgICAgICAgICAgICAgICB0bnMgY29uZmlnIHN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9yIHNpemUgYW5kIHRhYmxlLAorICAgICAgICAgICAgICAgICAgc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICBzdWJibG9jayBudW0sIGJsb2NrdHlwZSwKKyAgICAgICAgICAgICAgICAgIHNmYi13aXNlIGVuZXJneS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgRkRLYWFjRW5jX1Ruc0RldGVjdCgKKyAgICAgICAgICAgICAgVE5TX0RBVEEgKnRuc0RhdGEsCisgICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICBUTlNfSU5GTyogdG5zSW5mbywKKyAgICAgICAgICAgICAgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICBJTlQgc3ViQmxvY2tOdW1iZXIsCisgICAgICAgICAgICAgIElOVCBibG9ja1R5cGUKKyAgICAgICAgICAgICAgKQoreworICAvKiBhdXRvY29ycmVsYXRpb24gZnVuY3Rpb24gZm9yIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggcXVhcnRlciBvZiB0aGUgc3BlY3RydW0uICovCisgIEZJWFBfREJMIHJ4eDFbVE5TX01BWF9PUkRFUisxXTsgLyogaGlnaGVyIHBhcnQgKi8KKyAgRklYUF9EQkwgcnh4MltUTlNfTUFYX09SREVSKzFdOyAvKiBsb3dlciBwYXJ0ICovCisgIEZJWFBfREJMIHBhcmNvcl90bXBbVE5TX01BWF9PUkRFUl07CisKKyAgaW50IGk7CisKKyAgVE5TX1NVQkJMT0NLX0lORk8gKnRzYmkgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykKKyAgICA/ICZ0bnNEYXRhLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0KKyAgICA6ICZ0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvOworCisgIHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQgID0gRkFMU0U7CisgIHRzYmktPnRuc0FjdGl2ZSAgICAgICAgID0gRkFMU0U7CisgIHRzYmktPnByZWRpY3Rpb25HYWluICAgID0gMTAwMDsKKyAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSA9IDA7CisgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdICAgICAgPSB0Qy0+Y29lZlJlczsKKyAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7CisgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSA9IHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV0gPSAwOworICB9CisKKyAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gMDsKKyAgdG5zSW5mby0+b3JkZXIgW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gdG5zSW5mby0+b3JkZXIgW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gMDsKKworICBpZiAoICh0Qy0+dG5zQWN0aXZlKSAmJiAodEMtPm1heE9yZGVyPjApICkKKyAgeworICAgIGludCBzdW1TcXJDb2VmOworCisgICAgRkRLYWFjRW5jX01lcmdlZEF1dG9Db3JyZWxhdGlvbigKKyAgICAgICAgICBzcGVjdHJ1bSwKKyAgICAgICAgICB0Qy0+YWNmV2luZG93LAorICAgICAgICAgIHRDLT5scGNTdGFydExpbmUsCisgICAgICAgICAgdEMtPmxwY1N0b3BMaW5lLAorICAgICAgICAgIHRDLT5tYXhPcmRlciwKKyAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdCwKKyAgICAgICAgICByeHgxLAorICAgICAgICAgIHJ4eDIpOworCisgICAgLyogY29tcHV0ZSBoaWdoZXIgVE5TIGZpbHRlciBpbiBsYXR0aWNlIChQYXJDb3IpIGZvcm0gd2l0aCBMZVJvdXgtR3VlZ3VlbiBhbGdvcml0aG0gKi8KKyAgICB0c2JpLT5wcmVkaWN0aW9uR2FpbiA9IEZES2FhY0VuY19BdXRvVG9QYXJjb3Iocnh4MiwgcGFyY29yX3RtcCwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdKTsKKworICAgIC8qIG5vbi1saW5lYXIgcXVhbnRpemF0aW9uIG9mIFROUyBsYXR0aWNlIGNvZWZmaWNpZW50cyB3aXRoIGdpdmVuIHJlc29sdXRpb24gKi8KKyAgICBGREthYWNFbmNfUGFyY29yMkluZGV4KAorICAgICAgICAgICAgcGFyY29yX3RtcCwKKyAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0sCisgICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0sCisgICAgICAgICAgICB0Qy0+Y29lZlJlcyk7CisKKyAgICAvKiByZWR1Y2UgZmlsdGVyIG9yZGVyIGJ5IHRydW5jYXRpbmcgdHJhaWxpbmcgemVyb3MsIGNvbXB1dGUgc3VtKGFicyhjb2VmcykpICovCisgICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmICh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldICE9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBpICsgMTsKKworICAgIHN1bVNxckNvZWYgPSAwOworICAgIGZvciAoOyBpID49IDA7IGktLSkgeworICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldICogdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXTsKKyAgICB9CisKKyAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXTsKKyAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBzZmJDbnQgLSB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF07CisKKyAgICAvKiBkaXNhYmxlIFROUyBpZiBwcmVkaWN0aW9uR2FpbiBpcyBsZXNzIHRoYW4gM2RCIG9yIHN1bVNxckNvZWYgaXMgdG9vIHNtYWxsICovCisgICAgaWYgKCh0c2JpLT5wcmVkaWN0aW9uR2FpbiA+IHRDLT5jb25mVGFiLnRocmVzaE9uW0hJRklMVF0pIHx8IChzdW1TcXJDb2VmID4gKHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXS8yICsgMikpKQorICAgIHsKKyAgICAgIHRzYmktPnRuc0FjdGl2ZSA9IFRSVUU7CisgICAgICB0bnNJbmZvLT5udW1PZkZpbHRlcnNbc3ViQmxvY2tOdW1iZXJdKys7CisKKyAgICAgIC8qIGNvbXB1dGUgc2Vjb25kIGZpbHRlciBmb3IgbG93ZXIgcXVhcnRlcjsgb25seSBhbGxvd2VkIGZvciBsb25nIHdpbmRvd3MhICovCisgICAgICBpZiAoIChibG9ja1R5cGUgIT0gU0hPUlRfV0lORE9XKSAmJgorICAgICAgICAgICAodEMtPmNvbmZUYWIuZmlsdGVyRW5hYmxlZFtMT0ZJTFRdKSAmJiAodEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCkgKQorICAgICAgeworICAgICAgICAvKiBjb21wdXRlIHNlY29uZCBmaWx0ZXIgZm9yIGxvd2VyIGZyZXF1ZW5jaWVzICovCisKKyAgICAgICAgLyogY29tcHV0ZSBUTlMgZmlsdGVyIGluIGxhdHRpY2UgKFBhckNvcikgZm9ybSB3aXRoIExlUm91eC1HdWVndWVuIGFsZ29yaXRobSAqLworICAgICAgICBJTlQgcHJlZEdhaW4gPSBGREthYWNFbmNfQXV0b1RvUGFyY29yKHJ4eDEsIHBhcmNvcl90bXAsIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSk7CisKKyAgICAgICAgLyogbm9uLWxpbmVhciBxdWFudGl6YXRpb24gb2YgVE5TIGxhdHRpY2UgY29lZmZpY2llbnRzIHdpdGggZ2l2ZW4gcmVzb2x1dGlvbiAqLworICAgICAgICBGREthYWNFbmNfUGFyY29yMkluZGV4KAorICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCisgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSwKKyAgICAgICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0sCisgICAgICAgICAgICAgICAgdEMtPmNvZWZSZXMpOworCisgICAgICAgIC8qIHJlZHVjZSBmaWx0ZXIgb3JkZXIgYnkgdHJ1bmNhdGluZyB0cmFpbGluZyB6ZXJvcywgY29tcHV0ZSBzdW0oYWJzKGNvZWZzKSkgKi8KKyAgICAgICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSAhPSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSBpICsgMTsKKworICAgICAgICBzdW1TcXJDb2VmID0gMDsKKyAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICogdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdOworICAgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gLSB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF07CisKKyAgICAgICAgLyogZmlsdGVyIGxvd2VyIHF1YXJ0ZXIgaWYgZ2FpbiBpcyBoaWdoIGVub3VnaCwgYnV0IG5vdCBpZiBpdCdzIHRvbyBoaWdoICovCisgICAgICAgIGlmICggKCAocHJlZEdhaW4gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdKSAmJiAocHJlZEdhaW4gPCAoMTYwMDAgKiB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pKSApCisgICAgICAgICAgfHwgKCAoc3VtU3FyQ29lZiA+IDkpICAmJiAoc3VtU3FyQ29lZiA8IDIyICogdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdKSApICkKKyAgICAgICAgeworICAgICAgICAgIC8qIGNvbXBhcmUgbG93ZXIgdG8gdXBwZXIgZmlsdGVyOyBpZiB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIsIG1lcmdlIHRoZW0gKi8KKyAgICAgICAgICBzdW1TcXJDb2VmID0gMDsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdOyBpKyspIHsKKyAgICAgICAgICAgIHN1bVNxckNvZWYgKz0gRkRLYWJzKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gLSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCAoc3VtU3FyQ29lZiA8IDIpICYmCisgICAgICAgICAgICAgICAodG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID09IHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bSElGSUxUXSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQgPSBUUlVFOworICAgICAgICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gc2ZiQ250IC0gdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdOworICAgICAgICAgICAgZm9yICg7IGkgPCB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXTsgaSsrKSB7CisgICAgICAgICAgICAgIGlmIChGREthYnModG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSkgPiAxKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaS0tOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0pIHsKKyAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0bnNJbmZvLT5udW1PZkZpbHRlcnNbc3ViQmxvY2tOdW1iZXJdKys7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGZpbHRlciBsb3dlciBwYXJ0ICovCisgICAgICB9IC8qIHNlY29uZCBmaWx0ZXIgYWxsb3dlZCAgKi8KKyAgICB9IC8qIGlmIHByZWRpY3Rpb25HYWluID4gMTQzNyAuLi4gKi8KKyAgfSAvKiBtYXhPcmRlciA+IDAgJiYgdG5zQWN0aXZlICovCisKKyAgcmV0dXJuIDA7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRkRLYWFjTGRFbmNfVG5zU3luYworCisgIHN5bmNocm9uaXplIFROUyBwYXJhbWV0ZXJzIHdoZW4gVE5TIGdhaW4gZGlmZmVyZW5jZSBzbWFsbCAocmVsYXRpdmUpCisKKyAgXHBhcmFtIHBvaW50ZXIgdG8gVE5TIGRhdGEgc3RydWN0dXJlIChkZXN0aW5hdGlvbikKKyAgXHBhcmFtIHBvaW50ZXIgdG8gVE5TIGRhdGEgc3RydWN0dXJlIChzb3VyY2UpCisgIFxwYXJhbSBwb2ludGVyIHRvIFROUyBjb25maWcgc3RydWN0dXJlCisgIFxwYXJhbSBudW1iZXIgb2Ygc3ViLWJsb2NrCisgIFxwYXJhbSBibG9jayB0eXBlCisKKyAgXHJldHVybiB2b2lkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfVG5zU3luYygKKyAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YURlc3QsCisgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCisgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LAorICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvU3JjLAorICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LAorICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCisgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMKKyAgICAgICAgICAgICApCit7CisgIGludCBpLCB3LCBhYnNEaWZmLCBuV2luZG93czsKKyAgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb0Rlc3Q7CisgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7CisKKyAgLyogaWYgb25lIGNoYW5uZWwgY29udGFpbnMgc2hvcnQgYmxvY2tzIGFuZCB0aGUgb3RoZXIgbm90LCBkbyBub3Qgc3luY2hyb25pemUgKi8KKyAgaWYgKCAoYmxvY2tUeXBlU3JjID09IFNIT1JUX1dJTkRPVyAmJiBibG9ja1R5cGVEZXN0ICE9IFNIT1JUX1dJTkRPVykgfHwKKyAgICAgICAoYmxvY2tUeXBlRGVzdCA9PSBTSE9SVF9XSU5ET1cgJiYgYmxvY2tUeXBlU3JjICE9IFNIT1JUX1dJTkRPVykgKQorICB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGJsb2NrVHlwZURlc3QgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKKyAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87CisgICAgbldpbmRvd3MgICA9IDE7CisgIH0gZWxzZSB7CisgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bMF07CisgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1swXTsKKyAgICBuV2luZG93cyAgID0gODsKKyAgfQorCisgIGZvciAodz0wOyB3PG5XaW5kb3dzOyB3KyspIHsKKyAgICAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpwU2JJbmZvU3JjVyAgPSBzYkluZm9TcmMgICsgdzsKKyAgICAgIFROU19TVUJCTE9DS19JTkZPICAgICAgICpwU2JJbmZvRGVzdFcgPSBzYkluZm9EZXN0ICsgdzsKKyAgICAgIElOVCBkb1N5bmMgPSAxLCBhYnNEaWZmU3VtID0gMDsKKworICAgICAgLyogaWYgVE5TIGlzIGFjdGl2ZSBpbiBhdCBsZWFzdCBvbmUgY2hhbm5lbCwgY2hlY2sgaWYgUGFyQ29yIGNvZWZmaWNpZW50cyBvZiBoaWdoZXIgZmlsdGVyIGFyZSBzaW1pbGFyICovCisgICAgICBpZiAocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUgfHwgcFNiSW5mb1NyY1ctPnRuc0FjdGl2ZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKKyAgICAgICAgICBhYnNEaWZmID0gRkRLYWJzKHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gLSB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV0pOworICAgICAgICAgIGFic0RpZmZTdW0gKz0gYWJzRGlmZjsKKyAgICAgICAgICAvKiBpZiBjb2VmZmljaWVudHMgZGl2ZXJnZSB0b28gbXVjaCBiZXR3ZWVuIGNoYW5uZWxzLCBkbyBub3Qgc3luY2hyb25pemUgKi8KKyAgICAgICAgICBpZiAoKGFic0RpZmYgPiAxKSB8fCAoYWJzRGlmZlN1bSA+IDIpKSB7CisgICAgICAgICAgICBkb1N5bmMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvU3luYykgeworICAgICAgICAgICAgLyogaWYgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSB3YXMgZGV0ZWN0ZWQsIHN5bmNocm9uaXplIGNvZWZmaWNpZW50IHNldHMgKi8KKyAgICAgICAgICAgIGlmIChwU2JJbmZvU3JjVy0+dG5zQWN0aXZlKSB7CisgICAgICAgICAgICAgIC8qIG5vIGRlc3QgZmlsdGVyLCBvciBtb3JlIGRlc3QgdGhhbiBzb3VyY2UgZmlsdGVyczogdXNlIG9uZSBkZXN0IGZpbHRlciAqLworICAgICAgICAgICAgICBpZiAoKCFwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSkgfHwKKyAgICAgICAgICAgICAgICAgICgocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUpICYmICh0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID4gdG5zSW5mb1NyYy0+bnVtT2ZGaWx0ZXJzW3ddKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHRuc0RhdGFEZXN0LT5maWx0ZXJzTWVyZ2VkID0gdG5zRGF0YVNyYy0+ZmlsdGVyc01lcmdlZDsKKyAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPm9yZGVyICAgICAgIFt3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+b3JkZXIgICAgICAgW3ddW0hJRklMVF07CisgICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5sZW5ndGggICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmxlbmd0aCAgICAgIFt3XVtISUZJTFRdOworICAgICAgICAgICAgICB0bnNJbmZvRGVzdC0+ZGlyZWN0aW9uICAgW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5kaXJlY3Rpb24gICBbd11bSElGSUxUXTsKKyAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmNvZWZDb21wcmVzc1t3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+Y29lZkNvbXByZXNzW3ddW0hJRklMVF07CisKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSA9IHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBGREthYWNFbmNfVG5zRW5jb2RlCisKKyAgcGVyZm9ybSBUTlMgZW5jb2RpbmcKKworICBccGFyYW0gcG9pbnRlciB0byBUTlMgaW5mbyBzdHJ1Y3R1cmUKKyAgXHBhcmFtIHBvaW50ZXIgdG8gVE5TIGRhdGEgc3RydWN0dXJlCisgIFxwYXJhbSBudW1iZXIgb2Ygc2ZicworICBccGFyYW0gcG9pbnRlciB0byBUTlMgY29uZmlnIHN0cnVjdHVyZQorICBccGFyYW0gbG93LXBhc3MgbGluZQorICBccGFyYW0gcG9pbnRlciB0byBzcGVjdHJ1bQorICBccGFyYW0gbnVtYmVyIG9mIHN1Yi1ibG9jaworICBccGFyYW0gYmxvY2sgdHlwZQorCisgIFxyZXR1cm4gRVJST1IgU1RBVFVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UIEZES2FhY0VuY19UbnNFbmNvZGUoCisgICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAorICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgY29uc3QgSU5UIG51bU9mU2ZiLAorICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QywKKyAgICAgICAgY29uc3QgSU5UIGxvd1Bhc3NMaW5lLAorICAgICAgICBGSVhQX0RCTCogc3BlY3RydW0sCisgICAgICAgIGNvbnN0IElOVCBzdWJCbG9ja051bWJlciwKKyAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZQorICAgICAgICApCit7CisgICAgSU5UIGksIHN0YXJ0TGluZSwgc3RvcExpbmU7CisKKyAgICBpZiAoICggKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpICYmICghdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSkgKQorICAgICAgfHwgKCAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYgKCF0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSkgKSApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhcnRMaW5lID0gKHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQpID8gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdIDogdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOworICAgIHN0b3BMaW5lICA9IHRDLT5scGNTdG9wTGluZTsKKworICAgIGZvciAoaT0wOyBpPHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl07IGkrKykgeworCisgICAgICAgIElOVCBscGNHYWluRmFjdG9yOworICAgICAgICBGSVhQX0RCTCBMcGNDb2VmZltUTlNfTUFYX09SREVSXTsKKyAgICAgICAgRklYUF9EQkwgd29ya0J1ZmZlcltUTlNfTUFYX09SREVSXTsKKyAgICAgICAgRklYUF9EQkwgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKKworICAgICAgICBGREthYWNFbmNfSW5kZXgyUGFyY29yKAorICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW2ldLAorICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCisgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLAorICAgICAgICAgICAgICAgIHRDLT5jb2VmUmVzKTsKKworICAgICAgICBscGNHYWluRmFjdG9yID0gRkRLYWFjRW5jX1BhcmNvclRvTHBjKAorICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCisgICAgICAgICAgICAgICAgTHBjQ29lZmYsCisgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLAorICAgICAgICAgICAgICAgIHdvcmtCdWZmZXIpOworCisgICAgICAgIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcigKKyAgICAgICAgICAgICAgICAmc3BlY3RydW1bc3RhcnRMaW5lXSwKKyAgICAgICAgICAgICAgICBzdG9wTGluZSAtIHN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICBMcGNDb2VmZiwKKyAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sCisgICAgICAgICAgICAgICAgbHBjR2FpbkZhY3Rvcik7CisKKyAgICAgICAgLyogdXBkYXRlIGZvciBzZWNvbmQgZmlsdGVyICovCisgICAgICAgIHN0YXJ0TGluZSA9IHRDLT5scGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICAgICAgc3RvcExpbmUgID0gdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOworICAgIH0KKworICAgIHJldHVybigwKTsKKworfQorCitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAorICAgICAgICBGSVhQX0RCTCAqd2luLAorICAgICAgICBjb25zdCBpbnQgd2luU2l6ZSwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCisgICAgICAgIGNvbnN0IEZJWFBfREJMIHRpbWVSZXNvbHV0aW9uLAorICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZQorICAgICAgICApCit7CisgICNkZWZpbmUgUElfRSAgICAgICAgICAgKDIpCisgICNkZWZpbmUgUElfTSAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMy4xNDE2Zi8oZmxvYXQpKDE8PFBJX0UpKQorCisgICNkZWZpbmUgRVVMRVJfRSAgICAgICAgKDIpCisgICNkZWZpbmUgRVVMRVJfTSAgICAgICAgRkwyRlhDT05TVF9EQkwoMi43MTgzLyhmbG9hdCkoMTw8RVVMRVJfRSkpCisKKyAgI2RlZmluZSBDT0VGRl9MT09QX1NDQUxFICg0KQorCisgIElOVCBpLCBlMSwgZTIsIGdhdXNzRXhwX2U7CisgIEZJWFBfREJMIGdhdXNzRXhwX207CisKKyAgLyogY2FsYy4gd2luZG93IGV4cG9uZW50IGZyb20gdGltZSByZXNvbHV0aW9uOgorICAgKgorICAgKiAgIGdhdXNzRXhwID0gUEkgKiBzYW1wbGluZ1JhdGUgKiAwLjAwMWYgKiB0aW1lUmVzb2x1dGlvbiAvIHRyYW5zZm9ybVJlc29sdXRpb247CisgICAqICAgZ2F1c3NFeHAgPSAtMC41ZiAqIGdhdXNzRXhwICogZ2F1c3NFeHA7CisgICAqLworICBnYXVzc0V4cF9tID0gZk11bHROb3JtKHRpbWVSZXNvbHV0aW9uLCBmTXVsdChQSV9NLCBmRGl2Tm9ybSggKEZJWFBfREJMKShzYW1wbGluZ1JhdGUpLCAoRklYUF9EQkwpKExPTkcpKHRyYW5zZm9ybVJlc29sdXRpb24qMTAwMC5mKSwgJmUxKSksICZlMik7CisgIGdhdXNzRXhwX20gPSAtZlBvdzJEaXYyKGdhdXNzRXhwX20pOworICBnYXVzc0V4cF9lID0gMiooZTErZTIrdGltZVJlc29sdXRpb25fZStQSV9FKTsKKworICBGREtfQVNTRVJUKCB3aW5TaXplIDwgKDE8PENPRUZGX0xPT1BfU0NBTEUpICk7CisKKyAgLyogY2FsYy4gd2luZG93IGNvZWZmaWNpZW50cworICAgKiAgIHdpbltpXSA9IChmbG9hdClleHAoIGdhdXNzRXhwICogKGkrMC41KSAqIChpKzAuNSkgKTsKKyAgICovCisgIGZvciggaT0wOyBpPHdpblNpemU7IGkrKykgeworCisgICAgd2luW2ldID0gZlBvdygKKyAgICAgICAgICAgIEVVTEVSX00sCisgICAgICAgICAgICBFVUxFUl9FLAorICAgICAgICAgICAgZk11bHQoZ2F1c3NFeHBfbSwgZlBvdzIoKGkqRkwyRlhDT05TVF9EQkwoMS5mLyhmbG9hdCkoMTw8Q09FRkZfTE9PUF9TQ0FMRSkpICsgRkwyRlhDT05TVF9EQkwoLjVmLyhmbG9hdCkoMTw8Q09FRkZfTE9PUF9TQ0FMRSkpKSkpLAorICAgICAgICAgICAgZ2F1c3NFeHBfZSArIDIqQ09FRkZfTE9PUF9TQ0FMRSwKKyAgICAgICAgICAgJmUxKTsKKworICAgIHdpbltpXSA9IHNjYWxlVmFsdWVTYXR1cmF0ZSh3aW5baV0sIGUxKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBGREthYWNFbmNfQXV0b1RvUGFyY29yCisKKyAgY29udmVyc2lvbiBhdXRvY29ycmVsYXRpb24gdG8gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKworICBccGFyYW0gcG9pbnRlciB0byBpbnB1dCAoYWNmKQorICBccGFyYW0gcG9pbnRlciB0byBvdXRwdXQgKHJlZmxlY3Rpb24gY29lZmZpY2llbnRzKQorICBccGFyYW0gbnVtYmVyIG9mIGNvZWZmaWNpZW50cworCisgIFxyZXR1cm4gcHJlZGljdGlvbiBnYWluCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAorICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByZWZsQ29lZmYsCisgICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCisgICAgICAgICkKK3sKKyAgSU5UICAgICAgIGksIGosIHNjYWxlPTA7CisgIEZJWFBfREJMICB0bXAsIHBhcmNvcldvcmtCdWZmZXJbVE5TX01BWF9PUkRFUl07CisgIElOVCAgICAgICBwcmVkaWN0aW9uR2FpbiA9IChJTlQpKFROU19QUkVER0FJTl9TQ0FMRSk7CisKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHdvcmtCdWZmZXIgPSBwYXJjb3JXb3JrQnVmZmVyOworICBjb25zdCBGSVhQX0RCTCAgYXV0b0NvcnJfMCA9IGlucHV0WzBdOworCisgIGlmKChGSVhQX0RCTClpbnB1dFswXSA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7CisgICAgRkRLbWVtY2xlYXIocmVmbENvZWZmLG51bU9mQ29lZmYqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKKyAgfQorCisgIEZES21lbWNweSh3b3JrQnVmZmVyLCZpbnB1dFsxXSxudW1PZkNvZWZmKnNpemVvZihGSVhQX0RCTCkpOworICBmb3IoaT0wOyBpPG51bU9mQ29lZmY7IGkrKykgeworICAgIExPTkcgc2lnbiA9ICgoTE9ORyl3b3JrQnVmZmVyWzBdID4+IChERlJBQ1RfQklUUy0xKSk7CisgICAgdG1wID0gKEZJWFBfREJMKSgoTE9ORyl3b3JrQnVmZmVyWzBdXnNpZ24pOworCisgICAgaWYoaW5wdXRbMF08dG1wKQorICAgICAgYnJlYWs7CisKKyAgICB0bXAgPSAoRklYUF9EQkwpKChMT05HKXNjaHVyX2Rpdih0bXAsIGlucHV0WzBdLCBGUkFDVF9CSVRTKV4ofnNpZ24pKTsKKyAgICByZWZsQ29lZmZbaV0gPSB0bXA7CisKKyAgICBmb3Ioaj1udW1PZkNvZWZmLWktMTsgaj49MDsgai0tKSB7CisgICAgICBGSVhQX0RCTCBhY2N1MSA9IGZNdWx0KHRtcCwgaW5wdXRbal0pOworICAgICAgRklYUF9EQkwgYWNjdTIgPSBmTXVsdCh0bXAsIHdvcmtCdWZmZXJbal0pOworICAgICAgd29ya0J1ZmZlcltqXSArPSBhY2N1MTsKKyAgICAgIGlucHV0W2pdICs9IGFjY3UyOworICAgIH0KKworICAgIHdvcmtCdWZmZXIrKzsKKyAgfQorCisgIHRtcCA9IGZNdWx0KChGSVhQX0RCTCkoKExPTkcpVE5TX1BSRURHQUlOX1NDQUxFPDwyMSksIGZEaXZOb3JtKGZBYnMoYXV0b0NvcnJfMCksIGZBYnMoaW5wdXRbMF0pLCAmc2NhbGUpKTsKKyAgaWYgKCBmTXVsdERpdjIoYXV0b0NvcnJfMCwgaW5wdXRbMF0pPEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeworICAgIHRtcCA9IC10bXA7CisgIH0KKyAgcHJlZGljdGlvbkdhaW4gPSAoTE9ORylzY2FsZVZhbHVlKHRtcCxzY2FsZS0yMSk7CisKKyAgcmV0dXJuIChwcmVkaWN0aW9uR2Fpbik7Cit9CisKKworc3RhdGljIElOVCBGREthYWNFbmNfU2VhcmNoMyhGSVhQX0RCTCBwYXJjb3IpCit7CisgIElOVCBpLCBpbmRleD0wOworCisgIGZvcihpPTA7aTw4O2krKyl7CisgICAgaWYocGFyY29yID4gRkRLYWFjRW5jX3Ruc0NvZWZmM0JvcmRlcnNbaV0pCisgICAgICBpbmRleD1pOworICB9CisgIHJldHVybihpbmRleC00KTsKK30KKworc3RhdGljIElOVCBGREthYWNFbmNfU2VhcmNoNChGSVhQX0RCTCBwYXJjb3IpCit7CisgIElOVCBpLCBpbmRleD0wOworCisgIGZvcihpPTA7aTwxNjtpKyspeworICAgIGlmKHBhcmNvciA+IEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzW2ldKQorICAgICAgaW5kZXg9aTsKKyAgfQorICByZXR1cm4oaW5kZXgtOCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19QYXJjb3IySW5kZXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfUGFyY29yMkluZGV4KAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqcGFyY29yLAorICAgICAgICBJTlQgKlJFU1RSSUNUIGluZGV4LAorICAgICAgICBjb25zdCBJTlQgb3JkZXIsCisgICAgICAgIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYKKyAgICAgICAgKQoreworICBJTlQgaTsKKyAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7CisgICAgaWYoYml0c1BlckNvZWZmID09IDMpCisgICAgICBpbmRleFtpXSA9IEZES2FhY0VuY19TZWFyY2gzKHBhcmNvcltpXSk7CisgICAgZWxzZQorICAgICAgaW5kZXhbaV0gPSBGREthYWNFbmNfU2VhcmNoNChwYXJjb3JbaV0pOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbmRleDJQYXJjb3IKKyAgICBkZXNjcmlwdGlvbjogIGludmVyc2UgcXVhbnRpemF0aW9uIGZvciByZWZsZWN0aW9uIGNvZWZmaWNpZW50cworICAgIHJldHVybnM6ICAgICAgLQorICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHZhbHVlcywgcHRyLiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgIG5vLiBvZiBjb2VmZmljaWVudHMsIHJlc29sdXRpb24KKyAgICBvdXRwdXQ6ICAgICAgIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luZGV4MlBhcmNvcigKKyAgICAgICAgY29uc3QgSU5UICppbmRleCwKKyAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBhcmNvciwKKyAgICAgICAgY29uc3QgSU5UIG9yZGVyLAorICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCisgICAgICAgICkKK3sKKyAgSU5UIGk7CisgIGZvcihpPTA7IGk8b3JkZXI7IGkrKykKKyAgICBwYXJjb3JbaV0gPSBiaXRzUGVyQ29lZmYgPT0gNCA/IEZES2FhY0VuY190bnNFbmNDb2VmZjRbaW5kZXhbaV0rOF0gOiBGREthYWNFbmNfdG5zRW5jQ29lZmYzW2luZGV4W2ldKzRdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUGFyY29yVG9McGMKKyAgICBkZXNjcmlwdGlvbjogIGNvbnZlcnNpb24gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMgdG8gTFBDIGNvZWZmaWNpZW50cworICAgIHJldHVybnM6ICAgICAgR2FpbiBmYWN0b3IKKyAgICBpbnB1dDogICAgICAgIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzLCBuby4gb2YgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMgPG9yZGVyPiwKKyAgICAgICAgICAgICAgICAgIHB0ci4gdG8gd29yayBidWZmZXIgKHJlcXVpcmVkIHNpemU6IG9yZGVyKQorICAgIG91dHB1dDogICAgICAgPG9yZGVyPiBMUEMgY29lZmZpY2llbnRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBGREthYWNFbmNfUGFyY29yVG9McGMoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpyZWZsQ29lZmYsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBMcGNDb2VmZiwKKyAgICAgICAgY29uc3QgSU5UIG51bU9mQ29lZmYsCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCB3b3JrQnVmZmVyCisgICAgICAgICkKK3sKKyAgSU5UIGksIGo7CisgIElOVCBzaGlmdHZhbCwgcGFyMkxwY1NoaWZ0VmFsID0gNjsgIC8qIDYgc2hvdWxkIGJlIGVub3VnaCwgYmVjLiBtYXgobnVtT2ZDb2VmZikgPSAyMCAqLworICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICBMcGNDb2VmZlswXSA9IHJlZmxDb2VmZlswXSA+PiBwYXIyTHBjU2hpZnRWYWw7CisgIGZvcihpPTE7IGk8bnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgZm9yKGo9MDsgajxpOyBqKyspIHsKKyAgICAgICAgd29ya0J1ZmZlcltqXSA9IExwY0NvZWZmW2ktMS1qXTsKKyAgICB9CisKKyAgICBmb3Ioaj0wOyBqPGk7IGorKykgeworICAgICAgICBMcGNDb2VmZltqXSArPSBmTXVsdChyZWZsQ29lZmZbaV0sd29ya0J1ZmZlcltqXSk7CisgICAgfQorCisgICAgTHBjQ29lZmZbaV0gPSByZWZsQ29lZmZbaV0gPj4gcGFyMkxwY1NoaWZ0VmFsOworICB9CisKKyAgLyogbm9ybWFsaXplIExwY0NvZWZmIGFuZCBjYWxjIHNoaWZ0ZmFjdG9yICovCisgIGZvcihpPTA7IGk8bnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLChGSVhQX0RCTClmaXhwX2FicyhMcGNDb2VmZltpXSkpOworICB9CisKKyAgc2hpZnR2YWwgPSBDb3VudExlYWRpbmdCaXRzKG1heFZhbCk7CisgIHNoaWZ0dmFsID0gKHNoaWZ0dmFsPj1wYXIyTHBjU2hpZnRWYWwpID8gcGFyMkxwY1NoaWZ0VmFsIDogc2hpZnR2YWw7CisKKyAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspCisgICAgICBMcGNDb2VmZltpXSA9IExwY0NvZWZmW2ldPDxzaGlmdHZhbDsKKworICByZXR1cm4gKHBhcjJMcGNTaGlmdFZhbCAtIHNoaWZ0dmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcgorCisgIFROUyBhbmFseXNpcyBmaWx0ZXIgKGFsbC16ZXJvIGZpbHRlcikKKworICBccGFyYW0gcG9pbnRlciB0byBzaWduYWwgc3BlY3RydW0KKyAgXHBhcmFtIG51bWJlciBvZiBsaW5lcworICBccGFyYW0gcG9pbnRlciB0byBscGMgY29lZmZpY2llbnRzCisgIFxwYXJhbSBmaWx0ZXIgb3JkZXIKKyAgXHBhcmFtIGxwYyBnYWluIGZhY3RvcgorCisgIFxyZXR1cm4gdm9pZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGU6IGluLXBsYWNlIGNvbXB1dGF0aW9uIHBvc3NpYmxlICovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIoCisgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzaWduYWwsCisgICAgICAgIGNvbnN0IElOVCBudW1PZkxpbmVzLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqcHJlZGljdG9yQ29lZmYsCisgICAgICAgIGNvbnN0IElOVCBvcmRlciwKKyAgICAgICAgY29uc3QgSU5UIGxwY0dhaW5GYWN0b3IKKyAgICAgICAgKQoreworICBGSVhQX0RCTCBzdGF0dXNWYXJbVE5TX01BWF9PUkRFUl07CisgIElOVCBpLCBqOworICBjb25zdCBJTlQgc2hpZnQgPSBscGNHYWluRmFjdG9yICsgMTsgICAgICAvKiArMSwgYmVjYXVzZSBmTXVsdERpdjIgKi8KKyAgRklYUF9EQkwgdG1wOworCisgIGlmIChvcmRlcj4wKSB7CisKKyAgICBJTlQgaWR4ID0gMDsKKworICAgIC8qIGtlZXAgZmlsdGVyIGNvZWZmaWNpZW50cyB0d2ljZSBhbmQgc2F2ZSBtZW1vcnkgY29weSBvcGVyYXRpb24gaW4KKyAgICAgICBtb2R1bG8gc3RhdGUgYnVmZmVyICovCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQorICAgIEZJWFBfU0dMICBjb2VmZlsyKlROU19NQVhfT1JERVJdOworICAgIGNvbnN0IEZJWFBfU0dMICpwQ29lZmY7CisgICAgZm9yKGk9MDtpPG9yZGVyO2krKykgeworICAgICAgY29lZmZbaV0gICAgICAgPSBGWF9EQkwyRlhfU0dMKHByZWRpY3RvckNvZWZmW2ldKTsKKyAgICB9CisgICAgRkRLbWVtY3B5KCZjb2VmZltvcmRlcl0sIGNvZWZmLCBvcmRlcipzaXplb2YoRklYUF9TR0wpKTsKKyNlbHNlCisgICAgRklYUF9EQkwgIGNvZWZmWzIqVE5TX01BWF9PUkRFUl07CisgICAgY29uc3QgRklYUF9EQkwgKnBDb2VmZjsKKyAgICBGREttZW1jcHkoJmNvZWZmWzBdLCAgICAgcHJlZGljdG9yQ29lZmYsIG9yZGVyKnNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBwcmVkaWN0b3JDb2VmZiwgb3JkZXIqc2l6ZW9mKEZJWFBfREJMKSk7CisjZW5kaWYKKyAgICBGREttZW1jbGVhcihzdGF0dXNWYXIsIG9yZGVyKnNpemVvZihGSVhQX0RCTCkpOworCisgICAgZm9yKGo9MDsgajxudW1PZkxpbmVzOyBqKyspIHsKKyAgICAgIHBDb2VmZiA9ICZjb2VmZlsob3JkZXItaWR4KV07CisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgIGZvcihpPTA7IGk8b3JkZXI7IGkrKykgeworICAgICAgICAgIHRtcCA9IGZNdWx0QWRkRGl2Mih0bXAsIHBDb2VmZltpXSwgc3RhdHVzVmFyW2ldKSA7CisgICAgICB9CisKKyAgICAgIGlmKC0taWR4PDApIHsgaWR4ID0gb3JkZXItMTsgfQorICAgICAgc3RhdHVzVmFyW2lkeF0gPSBzaWduYWxbal07CisKKyAgICAgIEZES19BU1NFUlQobHBjR2FpbkZhY3Rvcj49MCk7CisgICAgICBzaWduYWxbal0gPSAodG1wPDxzaGlmdCkgKyBzaWduYWxbal07CisgICAgfQorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjczMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKQEAgLTAsMCArMSwxOTggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdyb2VzY2hlbAorICAgY29udGVudHMvZGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9UTlNfSAorI2RlZmluZSBfVE5TX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorCisKKyNpZm5kZWYgUEkKKyNkZWZpbmUgUEkgICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzFmCisjZW5kaWYKKworLyoqCisgKiBUTlNfRU5BQkxFX01BU0sKKyAqIFRoaXMgYml0ZmllbGQgZGVmaW5lcyB3aGljaCBUTlMgZmVhdHVyZXMgYXJlIGVuYWJsZWQKKyAqICAgVGhlIFROUyBtYXNrIGlzIGNvbXBvc2VkIG9mIDQgYml0cy4KKyAqICAgdG5zTWFzayB8PSAweDE7IGFjdGl2YXRlIFROUyBzaG9ydCBibG9ja3MKKyAqICAgdG5zTWFzayB8PSAweDI7IGFjdGl2YXRlIFROUyBmb3IgbG9uZyBibG9ja3MKKyAqICAgdG5zTWFzayB8PSAweDQ7IGFjdGl2YXRlIFROUyBQRUFLIHRvb2wgZm9yIHNob3J0IGJsb2NrcworICogICB0bnNNYXNrIHw9IDB4ODsgYWN0aXZhdGUgVE5TIFBFQUsgdG9vbCBmb3IgbG9uZyBibG9ja3MKKyAqLworI2RlZmluZSBUTlNfRU5BQkxFX01BU0sgMHhmCisKKy8qIFROUyBtYXggZmlsdGVyIG9yZGVyIGZvciBMb3cgQ29tcGxleGl0eSBNUEVHNCBwcm9maWxlICovCisjZGVmaW5lIFROU19NQVhfT1JERVIgMTIKKworCisjZGVmaW5lIE1BWF9OVU1fT0ZfRklMVEVSUyAyCisKKwordHlwZWRlZiBzdHJ1Y3R7IC8qc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLworICBJTlQgICAgIGZpbHRlckVuYWJsZWRbTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgSU5UICAgICB0aHJlc2hPbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMKi8KKyAgSU5UICAgICB0bnNMaW1pdE9yZGVyW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAvKiBMaW1pdCBmb3IgVE5TIG9yZGVyIFRBQlVMKi8KKyAgSU5UICAgICB0bnNGaWx0ZXJEaXJlY3Rpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAvKiBGaWx0ZXJpbmcgZGlyZWN0aW9uLCAwPXVwLCAxPWRvd24gVEFCVUwgKi8KKyAgSU5UICAgICBhY2ZTcGxpdFtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgICAgIHNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7CisKK31UTlNfQ09ORklHX1RBQlVMQVRFRDsKKworCisKK3R5cGVkZWYgc3RydWN0IHsgICAvKmFzc2lnbmVkIGF0IEluaXRUaW1lKi8KKyAgVE5TX0NPTkZJR19UQUJVTEFURUQgY29uZlRhYjsKKyAgSU5UIHRuc0FjdGl2ZTsKKyAgSU5UIG1heE9yZGVyOyAgICAgICAgICAgICAgICAvKiBtYXguIG9yZGVyIG9mIHRucyBmaWx0ZXIgKi8KKyAgSU5UIGNvZWZSZXM7CisgIEZJWFBfREJMIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIrMysxXTsKKyAgLyogbm93IHNvbWUgdGhpbmdzIHRoYXQgb25seSBwcm9iYWJseSBjYW4gYmUgZG9uZSBhdCBJbml0IHRpbWU7CisgICAgIGNvdWxkIGJlIHRoZXkgaGF2ZSB0byBiZSBzcGxpdCB1cCBmb3IgZWFjaCBpbmRpdmlkdWFsIChzaG9ydCkgd2luZG93IG9yCisgICAgIGV2ZW4gZmlsdGVyLiAgKi8KKyAgSU5UIGxwY1N0YXJ0QmFuZFtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgbHBjU3RhcnRMaW5lW01BWF9OVU1fT0ZfRklMVEVSU107CisgIElOVCBscGNTdG9wQmFuZDsKKyAgSU5UIGxwY1N0b3BMaW5lOworCit9VE5TX0NPTkZJRzsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCAgIHRuc0FjdGl2ZTsKKyAgSU5UICAgcHJlZGljdGlvbkdhaW47Cit9IFROU19TVUJCTE9DS19JTkZPOworCit0eXBlZGVmIHN0cnVjdHsgICAvKmNoYW5nZWQgYXQgcnVuVGltZSovCisgIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mb1tUUkFOU19GQUNdOworICBGSVhQX0RCTCByYXRpb011bHRUYWJsZVtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfSBUTlNfREFUQV9TSE9SVDsKKwordHlwZWRlZiBzdHJ1Y3R7ICAgLypjaGFuZ2VkIGF0IHJ1blRpbWUqLworICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm87CisgIEZJWFBfREJMIHJhdGlvTXVsdFRhYmxlW01BWF9TRkJfTE9OR107Cit9IFROU19EQVRBX0xPTkc7CisKKy8qIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyB1bmlvbiAqLwordHlwZWRlZiBzaG91bGRCZVVuaW9ueworICBUTlNfREFUQV9MT05HIExvbmc7CisgIFROU19EQVRBX1NIT1JUIFNob3J0OworfVROU19EQVRBX1JBVzsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIElOVCBudW1PZlN1YmJsb2NrczsKKyAgVE5TX0RBVEFfUkFXIGRhdGFSYXc7CisgIElOVCB0bnNNYXhTY2FsZVNwZWM7CisgIElOVCBmaWx0ZXJzTWVyZ2VkOworfVROU19EQVRBOworCit0eXBlZGVmIHN0cnVjdHsKKyAgSU5UIG51bU9mRmlsdGVyc1tUUkFOU19GQUNdOworICBJTlQgY29lZlJlc1tUUkFOU19GQUNdOworICBJTlQgbGVuZ3RoW1RSQU5TX0ZBQ11bTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgSU5UIG9yZGVyW1RSQU5TX0ZBQ11bTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgSU5UIGRpcmVjdGlvbltUUkFOU19GQUNdW01BWF9OVU1fT0ZfRklMVEVSU107CisgIElOVCBjb2VmQ29tcHJlc3NbVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdOworICAgIC8qIGZvciBMb25nOiBsZW5ndGggVE5TX01BWF9PUkRFUiAoMTIgZm9yIExDKSBpcyByZXF1aXJlZCAtPiAxMiAqLworICAgIC8qIGZvciBTaG9ydDogbGVuZ3RoIFRSQU5TX0ZBQypUTlNfTUFYX09SREVSIChvbmx5IDUgZm9yIHNob3J0IExDKSBpcyByZXF1aXJlZCAtPiA4KjU9NDAgKi8KKyAgICAvKiBDdXJyZW50bHkgVFJBTlNfRkFDKlROU19NQVhfT1JERVIgPSA4KjEyID0gOTYgKGZvciBMQykgaXMgdXNlZCAocGVyIGNoYW5uZWwpISBNZW1vcnkgY291bGQgYmUgc2F2ZWQgaGVyZSEgKi8KKyAgSU5UIGNvZWZbVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVJdOworfVROU19JTkZPOworCitJTlQgRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcoCisgICAgICAgIGNvbnN0IElOVCBmcmVxLAorICAgICAgICBjb25zdCBJTlQgZnMsCisgICAgICAgIGNvbnN0IElOVCBudW1PZkJhbmRzLAorICAgICAgICBjb25zdCBJTlQgKmJhbmRTdGFydE9mZnNldAorICAgICAgICApOworCisjZW5kaWYgLyogX1ROU19IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2Fkal90aHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcApAQCAtMCwwICsxLDI2MzEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCisgICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCisjaW5jbHVkZSAiYWRqX3Roci5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJzZl9lc3RpbS5oIgorI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKKworCisKKworI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICAoOCkKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZJbnRbSU5WX0lOVF9UQUJfU0laRV0gPQoreworICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLCAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyCit9OworCisKKyNkZWZpbmUgSU5WX1NRUlQ0X1RBQl9TSVpFICAoOCkKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0NFtJTlZfU1FSVDRfVEFCX1NJWkVdID0KK3sKKyAgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg2YmEyN2U2NSwgMHg2MTQyNGJiNSwgMHg1YTgyNzk5OSwgMHg1NTk5NDg0NSwgMHg1MWM4ZTMzYywgMHg0ZWIxNjBkMQorfTsKKworCisvKnN0YXRpYyBjb25zdCBJTlQgICAgICBpbnZSZWRFeHAgPSA0OyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMSA9IChGSVhQX0RCTCkweGZjYWQwZGRmOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjMxNikvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjIgPSAoRklYUF9EQkwpMHgwMzUxZTFhMjsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMy4xNikgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRGYWMgID0gKEZJWFBfREJMKTB4ZmY1YjJjM2U7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuOCkgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRNaW4zID0gKEZJWFBfREJMKTB4ZmUwMDAwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuNSkgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluNCA9IChGSVhQX0RCTCkweDAyMDAwMDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygyLjApICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjUgPSAoRklYUF9EQkwpMHhmYzAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4yNSkgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KKworCisvKgorVGhlIGJpdHMyUGUgZmFjdG9ycyBhcmUgY2hvb3NlbiBmb3IgdGhlIGNhc2UgdGhhdCBzb21lIHRpbWVzCit0aGUgY3Jhc2ggcmVjb3Zlcnkgc3RyYXRlZ3kgd2lsbCBiZSBhY3RpdmF0ZWQgb25jZS4KKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UICAgICAgICAgICAgICAgICBiaXRyYXRlOworICBMT05HICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ubzsKKyAgTE9ORyAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2xvcGU7CisgIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW87CisgIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2xvcGU7CisgIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdDsKKyAgTE9ORyAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOworICBMT05HICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKKyAgTE9ORyAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHRfc2xvcGU7CisKK30gQklUX1BFX1NGQUM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSU5UICAgICAgICAgICBzYW1wbGVSYXRlOworICBjb25zdCBCSVRfUEVfU0ZBQyAqIHBQZVRhYjsKKyAgY29uc3QgSU5UICAgICAgICAgICBuRW50cmllczsKKworfSBCSVRTMlBFX0NGR19UQUI7CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIxNjAwMFtdID0geworICB7IDEwMDAwLCAweDIyOEY1QzI5LCAweDAyRkVGNTVELCAweDFENzBBM0Q3LCAweDA5QkM5RDZELCAweDIyOEY1QzI5LCAweDAyRkVGNTVELCAweDFDMjhGNUMzLCAweDBDQkI5MkNBfSwKKyAgeyAyNDAwMCwgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxMywgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxM30sCisgIHsgMzIwMDAsIDB4MjQ3QUUxNDgsIDB4MTFCMUQ5MkIsIDB4MjM4NTFFQjgsIDB4MDFGNzUxMDUsIDB4MjQ3QUUxNDgsIDB4MTEwQTEzN0YsIDB4MjM4NTFFQjgsIDB4MDFGNzUxMDV9LAorICB7IDQ4MDAwLCAweDJEMUVCODUyLCAweDY4MzNDNjAwLCAweDI0N0FFMTQ4LCAweDAxNEY4QjU5LCAweDJDQ0NDQ0NELCAweDY4REI4QkFDLCAweDI0N0FFMTQ4LCAweDAxRjc1MTA1fSwKKyAgeyA2NDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgxNTRDOTg1RiwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgxNTRDOTg1Rn0sCisgIHsgOTYwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MzlFQjg1MUYsIDB4MDg4NTA5QzAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M0EzRDcwQTQsIDB4MDg4NTA5QzB9LAorICB7MTI4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyM0Q3MEE0LCAweDE4QTQzQkI0LCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyOEY1QzI5LCAweDE4MUUwM0Y3fSwKKyAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0geworICB7IDE2MDAwLCAweDFhOGY1YzI5LCAweDE3OTdjYzNhLCAweDEyOGY1YzI5LCAweDE4ZTc1NzkzLCAweDE3NWMyOGY2LCAweDIyMTQyNmZlLCAweDAwMDAwMDAwLCAweDVhNzA4ZWRlfSwKKyAgeyAyNDAwMCwgMHgyMDUxZWI4NSwgMHgwOTJjY2Y2YywgMHgxOGEzZDcwYSwgMHgxM2E5MmEzMCwgMHgxZmFlMTQ3YiwgMHhiY2JlNjFkLCAgMHgxNjE0N2FlMSwgMHgxOGU3NTc5M30sCisgIHsgMzIwMDAsIDB4MjI4ZjVjMjksIDB4MDI5ZjE2YjEsIDB4MWQ3MGEzZDcsIDB4MDg4NTA5YzAsIDB4MjI4ZjVjMjksIDB4MjlmMTZiMSwgIDB4MWMyOGY1YzMsIDB4MGIyNDIwNzF9LAorICB7IDQ4MDAwLCAweDIzZDcwYTNkLCAweDAxNGY4YjU5LCAweDIxOTk5OTlhLCAweDAzZWVhMjBhLCAweDIzZDcwYTNkLCAweDE0ZjhiNTksICAweDIxOTk5OTlhLCAweDAzZWVhMjBhfSwKKyAgeyA2NDAwMCwgMHgyNDdhZTE0OCwgMHgwOGQ4ZWM5NiwgMHgyMzg1MWViOCwgMHgwMGZiYTg4MiwgMHgyNDdhZTE0OCwgMHg4ODUwOWMwLCAgMHgyMzg1MWViOCwgMHgwMGZiYTg4Mn0sCisgIHsgOTYwMDAsIDB4MmQxZWI4NTIsIDB4MzQxOWUzMDAsIDB4MjQ3YWUxNDgsIDB4MDBhN2M1YWMsIDB4MmNjY2NjY2QsIDB4MzQ2ZGM1ZDYsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAorICB7MTI4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDAyOWYxNmIxLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1NzBhM2Q3LCAweDAwOWYxNmIxfSwKKyAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNmI4NTFlYywgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNzBhM2Q3MSwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyNDAwMFtdID0geworICB7IDE2MDAwLCAweDE5ZWI4NTFmLCAweDEzYTkyYTMwLCAweDExNDdhZTE0LCAweDE2NDg0MGUxLCAweDE5OTk5OTlhLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDQ2Yzc2NGFlfSwKKyAgeyAyNDAwMCwgMHgxZWI4NTFlYywgMHgwZDFiNzE3NiwgMHgxNmI4NTFlYywgMHgxOGU3NTc5MywgMHgxZTE0N2FlMSwgMHgwZmJhODgyNywgMHgxMTQ3YWUxNCwgMHgyYzkwODFjM30sCisgIHsgMzIwMDAsIDB4MjFlYjg1MWYsIDB4MDQ5NjY3YjYsIDB4MWNjY2NjY2QsIDB4MDczNTdlNjcsIDB4MjFlYjg1MWYsIDB4MDNlZWEyMGEsIDB4MWMyOGY1YzMsIDB4MDczNTdlNjd9LAorICB7IDQ4MDAwLCAweDI0MjhmNWMzLCAweDAxNGY4YjU5LCAweDIwNTFlYjg1LCAweDA1M2UyZDYyLCAweDIzZDcwYTNkLCAweDAxZjc1MTA1LCAweDFmYWUxNDdiLCAweDA3MzU3ZTY3fSwKKyAgeyA2NDAwMCwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMmUxNDdhZSwgMHgwMWEzNmUyZiwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMzMzMzMzMywgMHgwMTRmOGI1OX0sCisgIHsgOTYwMDAsIDB4MmE4ZjVjMjksIDB4MjRiMzNkYjAsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODIsIDB4MmE4ZjVjMjksIDB4MjZmZTcxOGIsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAorICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKKyAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIzMjAwMFtdID0geworICB7IDE2MDAwLCAweDExOTk5OTlhLCAweDIwYzQ5YmE2LCAweDAwMDAwMDAwLCAweDQ1NzdkOTU1LCAweDAwMDAwMDAwLCAweDYwZmU0Nzk5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKyAgeyAyNDAwMCwgMHgxOTk5OTk5YSwgMHgwZmJhODgyNywgMHgxMGY1YzI4ZiwgMHgxYjg2NmU0NCwgMHgxN2FlMTQ3YiwgMHgwZmJhODgyNywgMHgwMDAwMDAwMCwgMHg0ZDU1MWQ2OX0sCisgIHsgMzIwMDAsIDB4MWQ3MGEzZDcsIDB4MDczNTdlNjcsIDB4MTdhZTE0N2IsIDB4MDlkNDk1MTgsIDB4MWI4NTFlYjgsIDB4MGE3YzVhYzQsIDB4MTJlMTQ3YWUsIDB4MTEwYTEzN2Z9LAorICB7IDQ4MDAwLCAweDIwZjVjMjhmLCAweDA0OTY2N2I2LCAweDFjN2FlMTQ4LCAweDA1M2UyZDYyLCAweDIwYTNkNzBhLCAweDA1M2UyZDYyLCAweDFiMzMzMzMzLCAweDA1ZTVmMzBlfSwKKyAgeyA2NDAwMCwgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZjBhM2Q3MSwgMHgwMmYyZjk4NywgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZTE0N2FlMSwgMHgwM2VlYTIwYX0sCisgIHsgOTYwMDAsIDB4MjVjMjhmNWMsIDB4MmMzYzllZWQsIDB4MjFlYjg1MWYsIDB4MDFmNzUxMDUsIDB4MjVjMjhmNWMsIDB4MGE3YzVhYzQsIDB4MjFlYjg1MWYsIDB4MDFhMzZlMmZ9LAorICB7MTI4MDAwLCAweDUwZjVjMjhmLCAweDE4YTQzYmI0LCAweDIzZDcwYTNkLCAweDAxMGM2ZjdhLCAweDMwMDAwMDAwLCAweDE2OGI1Y2MwLCAweDIzODUxZWI4LCAweDAxOTJhNzM3fSwKKyAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNDdhZTE0OCwgMHgwMGRmYjIzYiwgMHgzZGMyOGY1YywgMHgzMDBmNGFhZiwgMHgyNDdhZTE0OCwgMHgwMWJmNjQ3Nn0sCisgIHsxNjAwMDAsIDB4NjAwMDAwMDAsIDB4YjE1YjU3NDAsIDB4MjRjY2NjY2QsIDB4MDUzZTJkNjIsIDB4NGY1YzI4ZjYsIDB4YmVmZDAwNzIsIDB4MjUxZWI4NTIsIDB4MDRmYjExODR9LAorICB7MjAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDJiMzMzMzMzLCAweDA4MzZiZTkxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDJiMzMzMzMzLCAweDA4OTAzOTBmfSwKKyAgezMyMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0OTQ3YWUxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0YThmNWMyOSwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0NDEwMFtdID0geworICB7IDE2MDAwLCAweDEwYTNkNzBhLCAweDE3OTdjYzNhLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU5MjEwMzg2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKyAgeyAyNDAwMCwgMHgxNjY2NjY2NiwgMHgxNzk3Y2MzYSwgMHgwMDAwMDAwMCwgMHg2MzlkNWU0YSwgMHgxNWMyOGY1YywgMHgxMjU5OWVkOCwgMHgwMDAwMDAwMCwgMHg1YmMwMWEzN30sCisgIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDQ5NjY3YjYsIDB4MTg1MWViODUsIDB4MDQ5NjY3YjYsIDB4MWEzZDcwYTQsIDB4MDg4NTA5YzAsIDB4MTY2NjY2NjYsIDB4MDUzZTJkNjJ9LAorICB7IDQ4MDAwLCAweDFlNjY2NjY2LCAweDA1ZTVmMzBlLCAweDFhOGY1YzI5LCAweDA0OTY2N2I2LCAweDFlNjY2NjY2LCAweDA1ZTVmMzBlLCAweDE4ZjVjMjhmLCAweDA1ZTVmMzBlfSwKKyAgeyA2NDAwMCwgMHgyMTQ3YWUxNCwgMHgwMzQ2ZGM1ZCwgMHgxY2NjY2NjZCwgMHgwMmYyZjk4NywgMHgyMTQ3YWUxNCwgMHgwMmYyZjk4NywgMHgxYmQ3MGEzZCwgMHgwMzlhYmYzNH0sCisgIHsgOTYwMDAsIDB4MjQ3YWUxNDgsIDB4MDY4ZGI4YmIsIDB4MWZhZTE0N2IsIDB4MDI5ZjE2YjEsIDB4MjQyOGY1YzMsIDB4MDYzOWQ1ZTUsIDB4MWY1YzI4ZjYsIDB4MDI5ZjE2YjF9LAorICB7MTI4MDAwLCAweDJhZTE0N2FlLCAweDFiNDM1MjY1LCAweDIyM2Q3MGE0LCAweDAxOTJhNzM3LCAweDJhM2Q3MGE0LCAweDEwNDBiZmU0LCAweDIxZWI4NTFmLCAweDAxOTJhNzM3fSwKKyAgezE0ODAwMCwgMHgzYjg1MWViOCwgMHgyODMyMDY5YywgMHgyMzMzMzMzMywgMHgwMGRmYjIzYiwgMHgzNDI4ZjVjMywgMHgyMDU0YzI4OCwgMHgyMmUxNDdhZSwgMHgwMGRmYjIzYn0sCisgIHsxNjAwMDAsIDB4NGEzZDcwYTQsIDB4YzMyZWJlNWEsIDB4MjM4NTFlYjgsIDB4MDFkNWMzMTYsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDFkNWMzMTZ9LAorICB7MjAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1YzI4ZjVjLCAweDA3MTNmMDc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1NzBhM2Q3LCAweDA3MmE0ZjE3fSwKKyAgezMyMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmFlMTQ3YiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmFlMTQ3YiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0ODAwMFtdID0geworICB7IDE2MDAwLCAweDBmNWMyOGY2LCAweDMxY2VhZjI1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDc0YTc3MWM5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKyAgeyAyNDAwMCwgMHgxYjg1MWViOCwgMHgwMjlmMTZiMSwgMHgwMDAwMDAwMCwgMHg2NjNjNzRmYiwgMHgxYzdhZTE0OCwgMHhlNDc5OTFiZCwgMHgwMDAwMDAwMCwgMHg0OTY2N2I1Zn0sCisgIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDI5ZjE2YjEsIDB4MThmNWMyOGYsIDB4MDczNTdlNjcsIDB4MTVjMjhmNWMsIDB4MGYxMmMyN2EsIDB4MTFlYjg1MWYsIDB4MTMwMTY0ODR9LAorICB7IDQ4MDAwLCAweDFkNzBhM2Q3LCAweDA1M2UyZDYyLCAweDFjN2FlMTQ4LCAweGZlMDhhZWZjLCAweDFkMWViODUyLCAweDA2OGRiOGJiLCAweDFiMzMzMzMzLCAweGZlYjA3NGE4fSwKKyAgeyA2NDAwMCwgMHgyMDAwMDAwMCwgMHgwM2VlYTIwYSwgMHgxYjg1MWViOCwgMHgwMzQ2ZGM1ZCwgMHgyMDUxZWI4NSwgMHgwMzQ2ZGM1ZCwgMHgxYThmNWMyOSwgMHgwMzlhYmYzNH0sCisgIHsgOTYwMDAsIDB4MjNkNzBhM2QsIDB4MDUzZTJkNjIsIDB4MWViODUxZWMsIDB4MDI5ZjE2YjEsIDB4MjM4NTFlYjgsIDB4MDRlYTRhOGMsIDB4MWUxNDdhZTEsIDB4MDJmMmY5ODd9LAorICB7MTI4MDAwLCAweDI4ZjVjMjhmLCAweDE0NzI3ZGNjLCAweDIxNDdhZTE0LCAweDAyMThkZWY0LCAweDI4NTFlYjg1LCAweDBlMjdlMGYwLCAweDIwZjVjMjhmLCAweDAyMThkZWY0fSwKKyAgezE0ODAwMCwgMHgzNTcwYTNkNywgMHgxY2Q1Zjk5YywgMHgyMjhmNWMyOSwgMHgwMWJmNjQ3NiwgMHgzMGY1YzI4ZiwgMHgxODc3N2U3NSwgMHgyMjNkNzBhNCwgMHgwMWJmNjQ3Nn0sCisgIHsxNjAwMDAsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDE5MmE3MzcsIDB4MzllYjg1MWYsIDB4ZDA4ZDRiYWUsIDB4MjJlMTQ3YWUsIDB4MDE5MmE3Mzd9LAorICB7MjAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDA2Nzc1YTFiLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0Y2NjY2NkLCAweDA2YTQxNzVhfSwKKyAgezMyMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzY2NjY2NjZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZDFlYjg1MiwgMHgwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCSVRTMlBFX0NGR19UQUIgYml0czJQZUNvbmZpZ1RhYltdID0geworICB7IDE2MDAwLCBTX0JpdHMyUGVUYWIxNjAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjE2MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCisgIHsgMjIwNTAsIFNfQml0czJQZVRhYjIyMDUwLCBzaXplb2YoU19CaXRzMlBlVGFiMjIwNTApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKKyAgeyAyNDAwMCwgU19CaXRzMlBlVGFiMjQwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIyNDAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAorICB7IDMyMDAwLCBTX0JpdHMyUGVUYWIzMjAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjMyMDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCisgIHsgNDQxMDAsIFNfQml0czJQZVRhYjQ0MTAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDQxMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKKyAgeyA0ODAwMCwgU19CaXRzMlBlVGFiNDgwMDAsIHNpemVvZihTX0JpdHMyUGVUYWI0ODAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9Cit9OworCisKKworLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KK2VudW0gX2F2b2lkX2hvbGVfc3RhdGUgeworICAgIE5PX0FIICAgICAgICAgICAgICA9MCwKKyAgICBBSF9JTkFDVElWRSAgICAgICAgPTEsCisgICAgQUhfQUNUSVZFICAgICAgICAgID0yCit9OworCisKKy8qICBRIGZvcm1hdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBRX0JJVEZBQyAgICAoMjQpICAgLyogUSBzY2FsaW5nIHVzZWQgaW4gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoKSBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBRX0FWR0JJVFMgICAoMTcpICAgLyogc2NhbGUgYml0IHZhbHVlcyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yCisgICAgZGVzY3JpcHRpb246ICByZXRyaWV2ZSBiaXRzMlBlRmFjdG9yIGZyb20gdGFibGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yKAorICAgICAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLAorICAgICAgICBJTlQgKmJpdHMyUGVGYWN0b3JfZSwKKyAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCisgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBJTlQgYWR2YW5jZWRCaXRzVG9QZSwKKyAgICAgICAgY29uc3QgSU5UIGludlF1YW50CisgICAgICAgICkKK3sKKyAgLyogZGVmYXVsdCBiaXRzMnBlIGZhY3RvciAqLworICBGSVhQX0RCTCBiaXQyUEVfbSA9IEZMMkZYQ09OU1RfREJMKDEuMThmLygxPDwoMSkpKTsKKyAgSU5UICAgICAgYml0MlBFX2UgPSAxOworCisgIC8qIG1ha2UgdXNlIG9mIGFkdmFuY2VkIGJpdHMgdG8gcGUgZmFjdG9yIHRhYmxlICovCisgIGlmIChhZHZhbmNlZEJpdHNUb1BlKSB7CisKKyAgICBpbnQgaTsKKyAgICBjb25zdCBCSVRfUEVfU0ZBQyAqcGVUYWIgPSBOVUxMOworICAgIElOVCBzaXplID0gMDsKKworCisgICAgLyogR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKi8KKyAgICBmb3IgKGk9MDsgaTwoSU5UKShzaXplb2YoYml0czJQZUNvbmZpZ1RhYikvc2l6ZW9mKEJJVFMyUEVfQ0ZHX1RBQikpOyBpKyspIHsKKyAgICAgIGlmIChzYW1wbGVSYXRlID49IGJpdHMyUGVDb25maWdUYWJbaV0uc2FtcGxlUmF0ZSkgeworICAgICAgICBwZVRhYiA9IGJpdHMyUGVDb25maWdUYWJbaV0ucFBlVGFiOworICAgICAgICBzaXplICA9IGJpdHMyUGVDb25maWdUYWJbaV0ubkVudHJpZXM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCAocGVUYWIhPU5VTEwpICYmIChzaXplIT0wKSApIHsKKworICAgICAgSU5UIHN0YXJ0QiAgICAgID0gLTE7CisgICAgICBMT05HIHN0YXJ0UEYgICAgPSAwOworICAgICAgTE9ORyBwZVNsb3BlICAgID0gMDsKKworICAgICAgLyogc3RlcmVvIG9yIG1vbm8gbW9kZSBhbmQgaW52UXVhbnQgdXNlZCBvciBub3QgKi8KKyAgICAgIGZvciAoaT0wOyBpPHNpemUtMTsgaSsrKQorICAgICAgeworICAgICAgICBpZiAoKHBlVGFiW2ldLmJpdHJhdGU8PWJpdFJhdGUpICYmICgocGVUYWJbaSsxXS5iaXRyYXRlPmJpdFJhdGUpIHx8ICgoaT09c2l6ZS0yKSkgKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChuQ2hhbm5lbHM9PTEpCisgICAgICAgICAgeworICAgICAgICAgICAgc3RhcnRQRiA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OworICAgICAgICAgICAgcGVTbG9wZSA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdF9zbG9wZTsKKyAgICAgICAgICAgIC8qZW5kUEYgICA9ICghaW52UXVhbnQpID8gcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7CisgICAgICAgICAgICBlbmRCPXBlVGFiW2krMV0uYml0cmF0ZTsqLworICAgICAgICAgICAgc3RhcnRCPXBlVGFiW2ldLmJpdHJhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7CisgICAgICAgICAgICBwZVNsb3BlID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zbG9wZSA6IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdF9zbG9wZTsKKyAgICAgICAgICAgIC8qZW5kUEYgICA9ICghaW52UXVhbnQpID8gcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX3N0ZXJlbyA6IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OworICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KKyAgICAgICAgICAgIHN0YXJ0Qj1wZVRhYltpXS5iaXRyYXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIGZvciBpICovCisKKyAgICAgIC8qIGlmIGEgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUgKi8KKyAgICAgIGlmIChzdGFydEIhPS0xKSB7CisgICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKi8KKyAgICAgICAgRklYUF9EQkwgcGVGYWMgPSBmTXVsdCgoRklYUF9EQkwpKGJpdFJhdGUtc3RhcnRCKTw8MTQsIChGSVhQX0RCTClwZVNsb3BlKSA8PCAyOworICAgICAgICBGSVhQX0RCTCBiaXQyUEUgPSBwZUZhYyArIChGSVhQX0RCTClzdGFydFBGOyAvKiBzdGFydFBGX2Zsb2F0ID0gc3RhcnRQRiA8PCAyICovCisKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrIGlmIGJpdHMycGUgdmFsdWUgaXMgaGlnaCBlbm91Z2ggKi8KKyAgICAgICAgaWYgKCBiaXQyUEUgPj0gKEZMMkZYQ09OU1RfREJMKDAuMzVmKSA+PiAyKSApIHsKKyAgICAgICAgICBiaXQyUEVfbSA9IGJpdDJQRTsKKyAgICAgICAgICBiaXQyUEVfZSA9IDI7IC8qICB0YWJsZSBpcyBmaXhlZCBzY2FsZWQgKi8KKyAgICAgICAgfQorICAgICAgfSAvKiBiciAqLworICAgIH0gLyogc3IgKi8KKyAgfSAvKiBhZHZhbmNlZEJpdHNUb1BlICovCisKKworICAvKiByZXR1cm4gYml0czJwZSBmYWN0b3IgKi8KKyAgKmJpdHMyUGVGYWN0b3JfbSA9IGJpdDJQRV9tOworICAqYml0czJQZUZhY3Rvcl9lID0gYml0MlBFX2U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19iaXRzMnBlMgorZGVzY3JpcHRpb246ICBjb252ZXJ0IGZyb20gYml0cyB0byBwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY19iaXRzMnBlMigKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGZhY3Rvcl9tLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGZhY3Rvcl9lCisgICAgICAgICkKK3sKKyAgIHJldHVybiAoSU5UKShmTXVsdChmYWN0b3JfbSwgKEZJWFBfREJMKShiaXRzPDxRX0FWR0JJVFMpKSA+PiAoUV9BVkdCSVRTLWZhY3Rvcl9lKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY1RocmVzaEV4cAorZGVzY3JpcHRpb246ICBsb3VkbmVzcyBjYWxjdWxhdGlvbiAodGhyZXNob2xkIHRvIHRoZSBwb3dlciBvZiByZWRFeHApCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogIHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKK3sKKyAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgICBGSVhQX0RCTCB0aHJFeHBMZERhdGE7CisKKyAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgIHRockV4cExkRGF0YSA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0+PjIgOworICAgICAgICAgdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSA9IENhbGNJbnZMZERhdGEodGhyRXhwTGREYXRhKTsKKyAgICAgICB9CisgICAgIH0KKyAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdE1pblNucgorICAgIGRlc2NyaXB0aW9uOiAgcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93IGVuZXJnaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdE1pblNucihRQ19PVVRfQ0hBTk5FTCAgICAgKnFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAqcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQ2hhbm5lbHMpCit7CisgIElOVCBjaCwgc2ZiLCBzZmJHcnAsIG5TZmI7CisgIEZJWFBfREJMIGF2Z0VuTEQ2NCwgZGJSYXRpbywgbWluU25yUmVkOworICBGSVhQX0RCTCBtaW5TbnJMaW1pdExENjQgPSBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY0ODI2MmYpOyAvKiBsZDY0KDAuOGYpICovCisgIEZJWFBfREJMIG5TZmJMRDY0OworICBGSVhQX0RCTCBhY2N1OworCisgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLworICAgIG5TZmIgPSAwOworICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBhY2N1ICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PjY7CisJCQkJIG5TZmIrKzsKKwkJCSB9CisgICAgfQorCisgICAgaWYgKChhY2N1ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoblNmYiA9PSAwKSkgeworICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG5TZmJMRDY0ICA9IENhbGNMZEludChuU2ZiKTsKKyAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYWNjdSk7CisgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLSBuU2ZiTEQ2NDsgIC8qIDAuMDkzNzVmOiBjb21wZW5zYXRlIHNoaWZ0IHdpdGggNiAqLworICAgIH0KKworICAgIC8qIHJlZHVjZSBtaW5TbnIgcmVxdWlyZW1lbnQgYnkgbWluU25yXm1pblNuclJlZCBkZXBlbmRlbnQgb24gYXZnRW4vc2ZiRW4gKi8KKyAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKCAobXNhUGFyYW0tPnN0YXJ0UmF0aW8gKyBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pIDwgYXZnRW5MRDY0ICkgeworICAgICAgICAgIGRiUmF0aW8gPSBmTXVsdCgoYXZnRW5MRDY0IC0gcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSxGTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTZmKSk7IC8qIHNjYWxlZCBieSAoMS4wZi8oMTAuMGYqNjQuMGYpKSAqLworICAgICAgICAgIG1pblNuclJlZCA9IG1zYVBhcmFtLT5yZWRPZmZzICsgZk11bHQobXNhUGFyYW0tPnJlZFJhdGlvRmFjLGRiUmF0aW8pOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCisgICAgICAgICAgbWluU25yUmVkID0gZml4TWF4KG1pblNuclJlZCwgbXNhUGFyYW0tPm1heFJlZCk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KKyAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSAoZk11bHQocWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLG1pblNuclJlZCkpIDw8IDY7CisgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKG1pblNuckxpbWl0TEQ2NCwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcKK2Rlc2NyaXB0aW9uOiAgZGV0ZXJtaW5lIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgbm90IG5lY2Vzc2FyeSByZXNwLiBwb3NzaWJsZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcoUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSF9QQVJBTSAqYWhQYXJhbSkKK3sKKyAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgICBGSVhQX0RCTCBzZmJFbiwgc2ZiRW5tMTsKKyAgIEZJWFBfREJMIHNmYkVuTGREYXRhOworICAgRklYUF9EQkwgYXZnRW5MZERhdGE7CisKKyAgIC8qIGRlY3JlYXNlIHNwcmVhZCBlbmVyZ3kgYnkgM2RCIGZvciBsb25nIGJsb2NrcywgcmVzcC4gMmRCIGZvciBzaG9ydHMKKyAgICAgIChhdm9pZCBtb3JlIGhvbGVzIGluIGxvbmcgYmxvY2tzKSAqLworICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIElOVCBzZmJHcnAsIHNmYjsKKyAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CisKKyAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQorICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykKKyAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPj49IDEgOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApCisgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQorICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC42M2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdKSA7CisgICAgICB9CisgICB9CisKKyAgIC8qIGluY3JlYXNlIG1pblNuciBmb3IgbG9jYWwgcGVha3MsIGRlY3JlYXNlIGl0IGZvciB2YWxsZXlzICovCisgICBpZiAoYWhQYXJhbS0+bW9kaWZ5TWluU25yKSB7CisgICAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOworICAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApeworICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgIEZJWFBfREJMIHNmYkVucDEsIGF2Z0VuOworICAgICAgICAgICAgICAgaWYgKHNmYiA+IDApCisgICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYi0xXTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHNmYkVubTEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKKworICAgICAgICAgICAgICAgaWYgKHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xKQorICAgICAgICAgICAgICAgICAgc2ZiRW5wMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmIrMV07CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisKKyAgICAgICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTE+PjEpICsgKHNmYkVucDE+PjEpOworICAgICAgICAgICAgICAgYXZnRW5MZERhdGEgPSBDYWxjTGREYXRhKGF2Z0VuKTsKKyAgICAgICAgICAgICAgIHNmYkVuID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisgICAgICAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworICAgICAgICAgICAgICAgLyogcGVhayA/ICovCisgICAgICAgICAgICAgICBpZiAoc2ZiRW4gPiBhdmdFbikgeworICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhOworICAgICAgICAgICAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2U9PUxPTkdfV0lORE9XKQorICAgICAgICAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0gZml4TWF4KCBTbnJMZEZhYyArIChGSVhQX0RCTCkoYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSksIChGSVhQX0RCTClTbnJMZE1pbjEgKSA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNYXgoIFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwgKEZJWFBfREJMKVNuckxkTWluMyApIDsKKworICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPQorICAgICAgICAgICAgICAgICAgICAgZml4TWluKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLCB0bXBNaW5TbnJMZERhdGEpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgLyogdmFsbGV5ID8gKi8KKyAgICAgICAgICAgICAgIGlmICggKChzZmJFbkxkRGF0YSsoRklYUF9EQkwpU25yTGRNaW40KSA8IChGSVhQX0RCTClhdmdFbkxkRGF0YSkgJiYgKHNmYkVuID4gRkwyRlhDT05TVF9EQkwoMC4wKSkgKSB7CisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXBNaW5TbnJMZERhdGEgPSBhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhIC0oRklYUF9EQkwpU25yTGRNaW40ICsgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl07CisgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNaW4oKEZJWFBfREJMKVNuckxkRmFjLCB0bXBNaW5TbnJMZERhdGEpOworICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4odG1wTWluU25yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIFNuckxkTWluMiApKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworICAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKKyAgICAgIHNpZGUgY2hhbm5lbHMgdG8gYXZvaWQgc3BlbmRpbmcgdW5ub3RpY2FibGUgYml0cyAqLworICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbk0gID0gcWNPdXRDaGFubmVsWzBdOworICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5TICA9IHFjT3V0Q2hhbm5lbFsxXTsKKyAgICAgIFBTWV9PVVRfQ0hBTk5FTCogIHBzeU91dENoYW5NICA9IHBzeU91dENoYW5uZWxbMF07CisgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuTS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5NLT5zZmJQZXJHcm91cCl7CisgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuTS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgaWYgKHRvb2xzSW5mby0+bXNNYXNrW3NmYkdycCtzZmJdKSB7CisgICAgICAgICAgICAgRklYUF9EQkwgbWF4U2ZiRW5MZCA9IGZpeE1heChxY091dENoYW5NLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0scWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKTsKKyAgICAgICAgICAgICBGSVhQX0RCTCBtYXhUaHJMZCwgc2ZiTWluU25yVG1wTGQ7CisKKyAgICAgICAgICAgICBpZiAoICgoU25yTGRNaW41Pj4xKSArIChtYXhTZmJFbkxkPj4xKSArIChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpCisgICAgICAgICAgICAgICBtYXhUaHJMZCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSA7CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgbWF4VGhyTGQgPSBTbnJMZE1pbjUgKyBtYXhTZmJFbkxkICsgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOworCisgICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBtYXhUaHJMZCAtIHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWF4KHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxzZmJNaW5TbnJUbXBMZCk7CisKKyAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sIChGSVhQX0RCTClTbnJMZEZhYyk7CisKKyAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IG1heFRockxkIC0gcWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNYXgocWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLHNmYk1pblNuclRtcExkKTsKKworICAgICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSwoRklYUF9EQkwpU25yTGRGYWMpOworCisgICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5xY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0pCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID0KKyAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKKworICAgICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+cWNPdXRDaGFuUy0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdKQorICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgZk11bHQocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgwLjlmKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KKyAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CisgICAgICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOworICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKyAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgIGlmICgocWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSkKKyAgICAgICAgICAgICAgfHwgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IE5PX0FIOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfSU5BQ1RJVkU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICB9Cit9CisKKworCisvKioKKyAqIFxicmllZiAgQ2FsY3VsYXRlIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zLgorICoKKyAqIFxwYXJhbSBwZURhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBQRSBkYXRhIG9mIGN1cnJlbnQgZWxlbWVudC4KKyAqIFxwYXJhbSBwc3lPdXRDaGFubmVsICAgICAgICAgUG9pbnRlciB0byBQU1lfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgorICogXHBhcmFtIHFjT3V0Q2hhbm5lbCAgICAgICAgICBQb2ludGVyIHRvIFFDX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KKyAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVsZW1lbnQuCisgKiBccGFyYW0gcGVPZmZzZXQgICAgICAgICAgICAgIEZpeGVkIFBFIG9mZnNldCBkZWZpbmVkIHdoaWxlIEZES2FhY0VuY19BZGpUaHJJbml0KCkgZGVwZW5kaW5nIG9uIGJpdHJhdGUuCisgKgorICogXHJldHVybiAgdm9pZAorICovCitzdGF0aWMKK3ZvaWQgRkRLYWFjRW5jX3ByZXBhcmVQZShQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgcGVPZmZzZXQpCit7CisgICAgSU5UIGNoOworCisgICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSgmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXSwKKyAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzLAorICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiQ250LAorICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsCisgICAgICAgICAgICBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cCk7CisgICAgfQorICAgIHBlRGF0YS0+b2Zmc2V0ID0gcGVPZmZzZXQ7Cit9CisKKy8qKgorICogXGJyaWVmICBDYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgdGhyZXNob2xkIGFkanVzdG1lbnQuCisgKgorICogQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgdG8gYmUgYXBwbGllZCBhdCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBpbiBsZDY0IGZvcm1hdC4KKyAqCisgKiBccGFyYW0gcGVEYXRhLCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUEUgZGF0YSBpbiBjdXJyZW50IGVsZW1lbnQuCisgKiBccGFyYW0gcHN5T3V0Q2hhbm5lbCAgICAgICAgIFBvaW50ZXIgdG8gUFNZX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KKyAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCisgKiBccGFyYW0gdG9vbHNJbmZvICAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9vbHMgaW5mbyBzdHJ1Y3Qgb2YgY3VycmVudCBlbGVtZW50LgorICogXHBhcmFtIGFkalRoclN0YXRlRWxlbWVudCAgICBQb2ludGVyIHRvIEFUU19FTEVNRU5UIGhvbGRpbmcgZW5GYWNQYXRjaCBzdGF0ZXMuCisgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyBpbiBlbGVtZW50LgorICogXHBhcmFtIHVzZVBhdGNoVG9vbCAgICAgICAgICBBcHBseSB0aGUgd2VpZ2h0aW5nIHRvb2wgMCAobm8pIGVsc2UgKHllcykuCisgKgorICogXHJldHVybiAgdm9pZAorICovCitzdGF0aWMKK3ZvaWQgRkRLYWFjRW5jX2NhbGNXZWlnaHRpbmcoUEVfREFUQSAqcGVEYXRhLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCisgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCB1c2VQYXRjaFRvb2wpCit7CisgICAgaW50IGNoLCBub1Nob3J0V2luZG93SW5GcmFtZSA9IFRSVUU7CisgICAgSU5UIGV4ZVBhdGNoTSA9IDA7CisKKyAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgICAgICAgIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgRkRLbWVtY2xlYXIocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZCwgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKworICAgIGlmICh1c2VQYXRjaFRvb2w9PTApIHsKKyAgICAgICAgcmV0dXJuOyAvKiB0b29sIGlzIGRpc2FibGVkICovCisgICAgfQorCisgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKworICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKKworICAgICAgICBpZiAobm9TaG9ydFdpbmRvd0luRnJhbWUpIHsgLyogcmV0YWluIGVuZXJneSByYXRpbyBiZXR3ZWVuIGJsb2NrcyBvZiBkaWZmZXJlbnQgbGVuZ3RoICovCisKKyAgICAgICAgICAgIEZJWFBfREJMIG5yZ1N1bTE0LCBucmdTdW0xMiwgbnJnU3VtMzQsIG5yZ1RvdGFsOworICAgICAgICAgICAgRklYUF9EQkwgbnJnRmFjTGRfMTQsIG5yZ0ZhY0xkXzEyLCBucmdGYWNMZF8zNDsKKyAgICAgICAgICAgIElOVCB1c2VQYXRjaCwgZXhlUGF0Y2g7CisgICAgICAgICAgICBpbnQgc2ZiLCBzZmJHcnAsIG5MaW5lc1N1bSA9IDA7CisKKyAgICAgICAgICAgIG5yZ1N1bTE0ID0gbnJnU3VtMTIgPSBucmdTdW0zNCA9IG5yZ1RvdGFsID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgICAgICAgLyogY2FsY3VsYXRlIGZsYXRuZXNzIG9mIGF1ZGlibGUgc3BlY3RydW0sIGkuZS4gc3BlY3RydW0gYWJvdmUgbWFza2luZyB0aHJlc2hvbGQuICovCisgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxMiA9IENhbGNJbnZMZERhdGEocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKTsgLyogbnJnXigxLzIpICovCisgICAgICAgICAgICAgICAgRklYUF9EQkwgbnJnRmFjMTQgPSBDYWxjSW52TGREYXRhKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+Mik7IC8qIG5yZ14oMS80KSAqLworCisgICAgICAgICAgICAgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgYmFuZHMgaXMgNjQsIHJlc3VsdHMgc2NhbGluZyBmYWN0b3IgNiAqLworICAgICAgICAgICAgICAgIG5MaW5lc1N1bSArPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYk5MaW5lc1tzZmJHcnArc2ZiXTsgICAgICAgICAgICAgLyogcmVsZXZhbnQgbGluZXMgKi8KKyAgICAgICAgICAgICAgICBucmdUb3RhbCAgKz0gKCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPj4gNiApOyAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmcgKi8KKyAgICAgICAgICAgICAgICBucmdTdW0xMiAgKz0gKCBucmdGYWMxMiA+PiA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDIvNCkgKi8KKyAgICAgICAgICAgICAgICBucmdTdW0xNCAgKz0gKCBucmdGYWMxNCA+PiA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDEvNCkgKi8KKyAgICAgICAgICAgICAgICBucmdTdW0zNCAgKz0gKCBmTXVsdChucmdGYWMxNCwgbnJnRmFjMTIpID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDMvNCkgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBucmdUb3RhbCA9IENhbGNMZERhdGEobnJnVG90YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbGQ2NCBvZiB0b3RhbCBucmcgKi8KKworICAgICAgICAgICAgbnJnRmFjTGRfMTQgPSBDYWxjTGREYXRhKG5yZ1N1bTE0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xNC9ucmdUb3RhbCkgKi8KKyAgICAgICAgICAgIG5yZ0ZhY0xkXzEyID0gQ2FsY0xkRGF0YShucmdTdW0xMikgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMTIvbnJnVG90YWwpICovCisgICAgICAgICAgICBucmdGYWNMZF8zNCA9IENhbGNMZERhdGEobnJnU3VtMzQpIC0gbnJnVG90YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZDY0KG5yZ1N1bTM0L25yZ1RvdGFsKSAqLworCisgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZES21heCggRkwyRlhDT05TVF9EQkwoMC4xODc1ZiksIGZEaXZOb3JtKG5MaW5lc1N1bSxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3BzeU91dENoYW4tPnNmYkNudF0pICk7CisKKyAgICAgICAgICAgIHVzZVBhdGNoID0gKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpKTsKKyAgICAgICAgICAgIGV4ZVBhdGNoID0gKCh1c2VQYXRjaCkgJiYgKGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdKSk7CisKKyAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCisgICAgICAgICAgICAgICAgSU5UIHNmYkV4ZVBhdGNoOworCisgICAgICAgICAgICAgICAgLyogZm9yIE1TIGNvdXBsZWQgU0ZCcywgYWxzbyBleGVjdXRlIHBhdGNoIGluIHNpZGUgY2hhbm5lbCBpZiBkb25lIGluIG1pZCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pKSB7CisgICAgICAgICAgICAgICAgICAgIHNmYkV4ZVBhdGNoID0gZXhlUGF0Y2hNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIChzZmJFeGVQYXRjaCkgJiYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5GTDJGWENPTlNUX0RCTCgwLmYpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHBhdGNoIGJhc2VkIG9uIHNwZWN0cmFsIGZsYXRuZXNzIGNhbGN1bGF0ZWQgYWJvdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC44MTI1ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8xNCArIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0rKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpKT4+MSApOyAvKiBzZmJFbmVyZ3leKDMvNCkgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+IEZMMkZYQ09OU1RfREJMKDAuNzk2ODc1ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8xMiArIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk+PjEgKTsgICAgICAgICAgLyogc2ZiRW5lcmd5XigyLzQpICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMzQgKyAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSk+PjEgKTsgICAgIC8qIHNmYkVuZXJneV4oMS80KSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSwoRklYUF9EQkwpMCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogc2ZiIGxvb3AgKi8KKworICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSB1c2VQYXRjaDsKKyAgICAgICAgICAgIGV4ZVBhdGNoTSA9IGV4ZVBhdGNoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogIW5vU2hvcnRXaW5kb3dJbkZyYW1lICovCisgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNzVmKTsKKyAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdID0gVFJVRTsgLyogYWxsb3cgdXNlIG9mIHNmYkVuRmFjIHBhdGNoIGluIHVwY29taW5nIGZyYW1lICovCisgICAgICAgIH0KKworICAgIH0gLyogY2ggbG9vcCAqLworCit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY1BlCitkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBwZSBmb3IgYm90aCBjaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK3ZvaWQgRkRLYWFjRW5jX2NhbGNQZShQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCit7CisgICBJTlQgY2g7CisKKyAgIHBlRGF0YS0+cGUgPSBwZURhdGEtPm9mZnNldDsKKyAgIHBlRGF0YS0+Y29uc3RQYXJ0ID0gMDsKKyAgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gMDsKKyAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOworICAgICAgRkRLYWFjRW5jX2NhbGNTZmJQZSgmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXSwKKyAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCwKKyAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssCisgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUpOworCisgICAgICBwZURhdGEtPnBlICs9IHBlQ2hhbkRhdGEtPnBlOworICAgICAgcGVEYXRhLT5jb25zdFBhcnQgKz0gcGVDaGFuRGF0YS0+Y29uc3RQYXJ0OworICAgICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgKz0gcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzOworICAgfQorfQorCit2b2lkIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKFBFX0RBVEEgKnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQoreworICAvKiBjb25zdGFudHMgdGhhdCB3aWxsIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zICovCisgIEZES2FhY0VuY19wcmVwYXJlUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIG5DaGFubmVscywgYWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CisKKyAgLyogY2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgZm9yIHRocmVzaG9sZCBhZGp1c3RtZW50ICovCisgIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCB0b29sc0luZm8sIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzLCAxKTsKK3sKKyAgICAvKiBubyB3ZWlnaHRpbmcgb2YgdGhyZWhvbGRzIGFuZCBlbmVyZ2llcyBmb3IgbWxvdXQgKi8KKyAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KKyAgICBpbnQgY2g7CisgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKworICAgICAgICBpbnQgc2ZiLCBzZmJHcnA7CisgICAgICAgIFFDX09VVF9DSEFOTkVMKiBwUWNPdXRDaCA9IHFjT3V0Q2hhbm5lbFtjaF07CisKKyAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgIHBRY091dENoLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmIrc2ZiR3JwXSA9IHBRY091dENoLT5zZmJFbmVyZ3lMZERhdGFbc2ZiK3NmYkdycF0gLSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKKyAgICAgICAgICAgIHBRY091dENoLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiK3NmYkdycF0gICAgIC09IHBRY091dENoLT5zZmJFbkZhY0xkW3NmYitzZmJHcnBdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworICAvKiBwZSB3aXRob3V0IHJlZHVjdGlvbiAqLworICBGREthYWNFbmNfY2FsY1BlKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSAorZGVzY3JpcHRpb246ICBzdW0gdGhlIHBlIGRhdGEgb25seSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgoSU5UICpwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAqbkFjdGl2ZUxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQoreworICAgIElOVCBjaCwgc2ZiLHNmYkdycDsKKworICAgIElOVCBwZV90bXAgPSBwZURhdGEtPm9mZnNldDsKKyAgICBJTlQgY29uc3RQYXJ0X3RtcCA9IDA7CisgICAgSU5UIG5BY3RpdmVMaW5lc190bXAgPSAwOworICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CisgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKKyAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICAgICAgaWYoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICBwZV90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0UGFydF90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOworICAgICAgICAgICAgICAgICAgICBuQWN0aXZlTGluZXNfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KKyAgICAqcGUgPSBwZV90bXAgPj4gUEVfQ09OU1RQQVJUX1NISUZUOworICAgICpjb25zdFBhcnQgPSBjb25zdFBhcnRfdG1wID4+IFBFX0NPTlNUUEFSVF9TSElGVDsKKworCSpuQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXNfdG1wOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUgorZGVzY3JpcHRpb246ICBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbGltaXRUaHJSZWR1Y2VkTGREYXRhID0gKEZJWFBfREJMKTB4MDAwMDgwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLcG93KDIuMCwtTERfREFUQV9TQ0FMSU5HLzQuMCkpOyovCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJFeHBbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCByZWRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIHJlZFZhbFNjYWxpbmcpCit7CisgICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworICAgRklYUF9EQkwgc2ZiRW5MZERhdGEsIHNmYlRockxkRGF0YSwgc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgIEZJWFBfREJMIHNmYlRockV4cDsKKworICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOworICAgICAgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7CisgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICBzZmJFbkxkRGF0YSAgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl07CisgICAgICAgICBzZmJUaHJFeHAgICAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdOworICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gQUhfQUNUSVZFKSkgeworCisgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGE6CisgICAgICAgICAgICAgZmxvYXQgdG1wID0gdGhyRXhwW2NoXVtzZmJdK3JlZFZhbDsKKyAgICAgICAgICAgICB0bXAgKj0gdG1wOworICAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSB0bXAqdG1wOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHNmYlRockV4cCksIENvdW50TGVhZGluZ0JpdHMocmVkVmFsKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpICktMTsKKworICAgICAgICAgICAgLyogNCpsb2coIHNmYlRockV4cCArIHJlZFZhbCApICovCisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShmQWJzKHNjYWxlVmFsdWUoc2ZiVGhyRXhwLCBtaW5TY2FsZSkgKyBzY2FsZVZhbHVlKHJlZFZhbCwoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nKSttaW5TY2FsZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoRklYUF9EQkwpKG1pblNjYWxlPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk7CisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOworCisgICAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLworICAgICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCisgICAgICAgICAgICAgICAgICAgICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7CisgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YSksIHNmYlRockxkRGF0YSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOworICAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfQUNUSVZFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBtaW5pbXVtIG9mIDI5IGRCIFJhdGlvIGZvciBUaHJlc2hvbGRzICovCisgICAgICAgICAgICBpZiAoKHNmYkVuTGREYXRhKyhGSVhQX0RCTClNQVhWQUxfREJMKSA+IEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKXsKKyAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KHNmYlRoclJlZHVjZWRMZERhdGEsIChzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisvKiBzaW1pbGFyIHRvIHByZXBhcmVTZmJQZTEoKSAqLworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRm9ybUZhY3RvckxkRGF0YSkKK3sKKyAgI2RlZmluZSBTQ0FMRV9GT1JNX0ZBQyAgICAgKDQpICAgIC8qIChTQ0FMRV9GT1JNX0ZBQytGT1JNX0ZBQ19TSElGVCkgPj0gbGQoRlJBTUVfTEVOR1RIKSovCisgICNkZWZpbmUgU0NBTEVfTlJHUyAgICAgICAgICg4KQorICAjZGVmaW5lIFNDQUxFX05MSU5FUyAgICAgICgxNikKKyAgI2RlZmluZSBTQ0FMRV9OUkdTX1NRUlQ0ICAgKDIpICAgIC8qIDAuMjUgKiBTQ0FMRV9OUkdTICovCisgICNkZWZpbmUgU0NBTEVfTkxJTkVTX1AzNCAgKDEyKSAgICAvKiAwLjc1ICogU0NBTEVfTkxJTkVTICovCisKKyAgSU5UICAgc2ZiR3JwLCBzZmI7CisgIEZJWFBfREJMIGNoYW9zTWVhc3VyZTsKKyAgSU5UIGZyYW1lTkxpbmVzID0gMDsKKyAgRklYUF9EQkwgZnJhbWVGb3JtRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgRklYUF9EQkwgZnJhbWVFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKKyAgICAgIGlmIChwc3lPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pIHsKKyAgICAgICAgZnJhbWVGb3JtRmFjdG9yICs9IChDYWxjSW52TGREYXRhKHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwK3NmYl0pPj5TQ0FMRV9GT1JNX0ZBQyk7CisgICAgICAgIGZyYW1lTkxpbmVzICAgICArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiKzFdIC0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiXSk7CisgICAgICAgIGZyYW1lRW5lcmd5ICAgICArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPj5TQ0FMRV9OUkdTKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihmcmFtZU5MaW5lcyA+IDApeworCisgICAgLyogIGZyYW1lTkFjdGl2ZUxpbmVzID0gZnJhbWVGb3JtRmFjdG9yKjJeRk9STV9GQUNfU0hJRlQgKiAoKGZyYW1lRW5lcmd5ICoyXlNDQUxFX05SR1MpL2ZyYW1lTkxpbmVzKV4tMC4yNQorICAgICAgICBjaGFvc01lYXN1cmUgICAgICA9IGZyYW1lTkFjdGl2ZUxpbmVzIC8gZnJhbWVOTGluZXMgKi8KKyAgICBjaGFvc01lYXN1cmUgPQorICAgICAgICAgICBDYWxjSW52TGREYXRhKCAoKChDYWxjTGREYXRhKGZyYW1lRm9ybUZhY3Rvcik+PjEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YShmcmFtZUVuZXJneSk+PigyKzEpKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksQ2FsY0xkRGF0YSgoRklYUF9EQkwpZnJhbWVOTGluZXM8PChERlJBQ1RfQklUUy0xLVNDQUxFX05MSU5FUykpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoRklYUF9EQkwpKFNDQUxFX0ZPUk1fRkFDLVNDQUxFX05SR1NfU1FSVDQrRk9STV9GQUNfU0hJRlQtKFNDQUxFX05MSU5FU19QMzQpKTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpPj4xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTw8MSApOworICB9IGVsc2UgeworCisgICAgLyogYXNzdW1pbmcgdG90YWwgY2hhb3MsIGlmIG5vIHNmYiBpcyBhYm92ZSB0aHJlc2hvbGRzICovCisgICAgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMS5mKTsKKyAgfQorCisgIHJldHVybiBjaGFvc01lYXN1cmU7Cit9CisKKy8qIGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhIGZvciBWQlItbW9kZSAqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIoUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIHZiclF1YWxGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBjaGFvc01lYXN1cmVPbGQpCit7CisgIElOVCBjaCwgc2ZiR3JwLCBzZmI7CisgIEZJWFBfREJMIGNoR3JvdXBFbmVyZ3lbVFJBTlNfRkFDXVsyXTsvKmVuZXJneSBmb3IgZWFjaCBncm91cCBhbmQgY2hhbm5lbCovCisgIEZJWFBfREJMIGNoQ2hhb3NNZWFzdXJlWzJdOworICBGSVhQX0RCTCBmcmFtZUVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDFlLTEwZik7CisgIEZJWFBfREJMIGNoYW9zTWVhc3VyZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRockV4cDsKKyAgRklYUF9EQkwgc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgRklYUF9EQkwgY2hhb3NNZWFzdXJlQXZnOworICBJTlQgZ3JvdXBDbnQ7IC8qIGxvb3AgY291bnRlciAqLworICBGSVhQX0RCTCByZWRWYWxbVFJBTlNfRkFDXTsgLyogcmVkdWN0aW9uIHZhbHVlczsgaW4gc2hvcnQtYmxvY2sgY2FzZSBvbmUgcmVkVmFsIGZvciBlYWNoIGdyb3VwICovCisgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuICA9IE5VTEw7CisgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gTlVMTDsKKworI2RlZmluZSBTQ0FMRV9HUk9VUF9FTkVSR1kgICAoOCkKKworI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMCAgKEZMMkZYQ09OU1RfREJMKDAuMjVmKSkKKyNkZWZpbmUgQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzEgIChGTDJGWENPTlNUX0RCTCgxLmYtMC4yNWYpKQorCisjZGVmaW5lIE1JTl9MRFRIUkVTSCAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpCisKKworICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKXsKKyAgICBxY091dENoYW4gID0gcWNPdXRDaGFubmVsW2NoXTsKKyAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOworCisgICAgLyogYWRkaW5nIHVwIGVuZXJneSBmb3IgZWFjaCBjaGFubmVsIGFuZCBlYWNoIGdyb3VwIHNlcGFyYXRlbHkgKi8KKyAgICBGSVhQX0RCTCBjaEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgZ3JvdXBDbnQ9MDsKKworICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKKyAgICAgIGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKKyAgICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdICs9IChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX0dST1VQX0VORVJHWSk7CisgICAgICB9CisgICAgICBjaEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07CisgICAgfQorICAgIGZyYW1lRW5lcmd5ICs9IGNoRW5lcmd5OworCisgICAgLyogY2hhb3NNZWFzdXJlICovCisgICAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOyAvKiBhc3N1bWUgYSBjb25zdGFudCBjaGFvcyBtZWFzdXJlIG9mIDAuNWYgZm9yIHNob3J0IGJsb2NrcyAqLworICAgIH0gZWxzZSB7CisgICAgICBjaENoYW9zTWVhc3VyZVtjaF0gPSBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZShwc3lPdXRDaGFubmVsW2NoXSwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSk7CisgICAgfQorICAgIGNoYW9zTWVhc3VyZSArPSBmTXVsdChjaENoYW9zTWVhc3VyZVtjaF0sIGNoRW5lcmd5KTsKKyAgfQorCisgIGlmKGZyYW1lRW5lcmd5ID4gY2hhb3NNZWFzdXJlKSB7CisgICAgSU5UIHNjYWxlID0gQ250TGVhZGluZ1plcm9zKGZyYW1lRW5lcmd5KSAtIDE7CisgICAgRklYUF9EQkwgbnVtICAgPSBjaGFvc01lYXN1cmU8PHNjYWxlOworICAgIEZJWFBfREJMIGRlbnVtID0gZnJhbWVFbmVyZ3k8PHNjYWxlOworICAgIGNoYW9zTWVhc3VyZSAgID0gc2NodXJfZGl2KG51bSxkZW51bSwxNik7CisgIH0KKyAgZWxzZSB7CisgICAgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMS5mKTsKKyAgfQorCisgIGNoYW9zTWVhc3VyZUF2ZyA9IGZNdWx0KENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18wLCBjaGFvc01lYXN1cmUpICsKKyAgICAgICAgICAgICAgICAgICAgZk11bHQoQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzEsICpjaGFvc01lYXN1cmVPbGQpOyAgICAgIC8qIGF2ZXJhZ2luZyBjaGFvcyBtZWFzdXJlICovCisgICpjaGFvc01lYXN1cmVPbGQgPSBjaGFvc01lYXN1cmUgPSAoZml4TWluKGNoYW9zTWVhc3VyZSwgY2hhb3NNZWFzdXJlQXZnKSk7ICAvKiB1c2UgbWluLXZhbHVlLCBzYWZlIGZvciBuZXh0IGZyYW1lICovCisKKyAgLyogY2hhcmFjdGVyaXN0aWMgY3VydmUKKyAgICAgY2hhb3NNZWFzdXJlID0gMC4yZiArIDAuN2YvMC4zZiAqIChjaGFvc01lYXN1cmUgLSAwLjJmKTsKKyAgICAgY2hhb3NNZWFzdXJlID0gZml4TWluKDEuMGYsIGZpeE1heCgwLjFmLCBjaGFvc01lYXN1cmUpKTsKKyAgICAgY29uc3RhbnRzIHNjYWxlZCBieSA0LmYKKyAgKi8KKyAgY2hhb3NNZWFzdXJlID0gKChGTDJGWENPTlNUX0RCTCgwLjJmKT4+MikgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmLyg0LmYqMC4zZikpLCAoY2hhb3NNZWFzdXJlIC0gRkwyRlhDT05TVF9EQkwoMC4yZikpKSk7CisgIGNoYW9zTWVhc3VyZSA9IChmaXhNaW4oKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgxLjBmKT4+MiksIGZpeE1heCgoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuMWYpPj4yKSwgY2hhb3NNZWFzdXJlKSkpPDwyOworCisgIC8qIGNhbGN1bGF0aW9uIG9mIHJlZHVjdGlvbiB2YWx1ZSAqLworICBpZiAocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVyl7IC8qIHNob3J0LWJsb2NrcyAqLworICAgIEZES19BU1NFUlQoVFJBTlNfRkFDPT04KTsKKyAgICAjZGVmaW5lICAgV0lOX1RZUEVfU0NBTEUgICAoMykKKworICAgIElOVCBzZmJHcnAsIGdyb3VwQ250PTA7CisgICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCxncm91cENudCsrKSB7CisKKyAgICAgIEZJWFBfREJMIGdyb3VwRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgZm9yKGNoPTA7Y2g8bkNoYW5uZWxzO2NoKyspeworICAgICAgICBncm91cEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07ICAgLyogYWRkaW5nIHVwIHRoZSBjaGFubmVscyBncm91cEVuZXJneSAqLworICAgICAgfQorCisgICAgICBGREtfQVNTRVJUKHBzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XTw9SU5WX0lOVF9UQUJfU0laRSk7CisgICAgICBncm91cEVuZXJneSA9IGZNdWx0KGdyb3VwRW5lcmd5LGludkludFtwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF1dKTsgIC8qIGNvcnJlY3Rpb24gb2YgZ3JvdXAgZW5lcmd5ICovCisgICAgICBncm91cEVuZXJneSA9IGZpeE1pbihncm91cEVuZXJneSwgZnJhbWVFbmVyZ3k+PldJTl9UWVBFX1NDQUxFKTsgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBhbGxvdyBhbiBoaWdoZXIgcmVkVmFsIGFzIGNhbGN1bGF0ZWQgZnJhbWV3aXNlICovCisKKyAgICAgIGdyb3VwRW5lcmd5Pj49MjsgLyogMipXSU5fVFlQRV9TQ0FMRSA9IDYgPT4gNisyID0gOCA9PT4gOC80ID0gaW50IG51bWJlciAqLworCisgICAgICByZWRWYWxbZ3JvdXBDbnRdID0gZk11bHQoZk11bHQodmJyUXVhbEZhY3RvcixjaGFvc01lYXN1cmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEoQ2FsY0xkRGF0YShncm91cEVuZXJneSk+PjIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoaW50KSggKCAyICsgKDIqV0lOX1RZUEVfU0NBTEUpICsgU0NBTEVfR1JPVVBfRU5FUkdZICk+PjIgKSA7CisKKyAgICB9CisgIH0gZWxzZSB7IC8qIGxvbmctYmxvY2sgKi8KKworICAgIHJlZFZhbFswXSA9IGZNdWx0KCBmTXVsdCh2YnJRdWFsRmFjdG9yLGNoYW9zTWVhc3VyZSksCisgICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEoQ2FsY0xkRGF0YShmcmFtZUVuZXJneSk+PjIpICkKKyAgICAgICAgICAgICAgICA8PCAoaW50KSggU0NBTEVfR1JPVVBfRU5FUkdZPj4yICkgOworICB9CisKKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOworICAgIHBzeU91dENoYW4gID0gcHN5T3V0Q2hhbm5lbFtjaF07CisKKyAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKKworICAgICAgICBzZmJFbkxkRGF0YSAgPSAocWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CisgICAgICAgIHNmYlRockxkRGF0YSA9IChxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSk7CisgICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07CisKKyAgICAgICAgaWYgKCAoc2ZiVGhyTGREYXRhPj1NSU5fTERUSFJFU0gpICYmIChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gQUhfQUNUSVZFKSkgeworCisgICAgICAgICAgLyogU2hvcnQtV2luZG93ICovCisgICAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBOdW1iZXIgPSAoaW50KSBzZmIvcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7CisKKyAgICAgICAgICAgIEZES19BU1NFUlQoSU5WX1NRUlQ0X1RBQl9TSVpFPnBzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXSk7CisKKyAgICAgICAgICAgIHNmYlRockV4cCA9IGZNdWx0KHNmYlRockV4cCwgZk11bHQoIEZMMkZYQ09OU1RfREJMKDIuODJmLzQuZiksIGludlNxcnQ0W3BzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXV0pKTw8MiA7CisKKyAgICAgICAgICAgIGlmICggc2ZiVGhyRXhwIDw9IChsaW1pdFRoclJlZHVjZWRMZERhdGEtcmVkVmFsW2dyb3VwTnVtYmVyXSkgKSB7CisgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoRklYUF9EQkwpcmVkVmFsW2dyb3VwTnVtYmVyXSA+PSBGTDJGWENPTlNUX0RCTCgxLjBmKS1zZmJUaHJFeHApCisgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhICovCisgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKHNmYlRockV4cCArIHJlZFZhbFtncm91cE51bWJlcl0pOworICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgKz0gKCBDYWxjTGRJbnQocHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSVhQX0RCTCk2PDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBMb25nLVdpbmRvdyAqLworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbMF0gPj0gRkwyRlhDT05TVF9EQkwoMS4wZiktc2ZiVGhyRXhwKSB7CisgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KKyAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IENhbGNMZERhdGEoc2ZiVGhyRXhwICsgcmVkVmFsWzBdKTsKKyAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLworICAgICAgICAgIGlmICggKChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEpID4gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKQorICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gID4gKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIHNmYkVuTGREYXRhKSApeworICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2Ugc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YTsKKyAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNmYlRoclJlZHVjZWRMZERhdGE8RkwyRlhDT05TVF9EQkwoLTAuNWYpKQorICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOworCisgICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLworICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGErRkwyRlhDT05TVF9EQkwoMS4wZikpID4gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpeworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChzZmJUaHJSZWR1Y2VkTGREYXRhLCBzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KE1JTl9MRFRIUkVTSCxzZmJUaHJSZWR1Y2VkTGREYXRhKTsKKworICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2gKK2Rlc2NyaXB0aW9uOiAgaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbCBlbm91Z2gsCit0aGUgZGlmZmVyZW5jZSBjYW4gYmUgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIHNjYWxlIGZhY3RvciBiYW5kcy4KK05ldyB0aHJlc2hvbGRzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcyBwZS1kaWZmZXJlbmNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgIGFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICB0aHJFeHBbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgRklYUF9EQkwgcmVkVmFsWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgU0NIQVIgcmVkVmFsU2NhbGluZ1soOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBkZWx0YVBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBwcm9jZXNzRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCit7CisgICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbjsKKyAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKKyAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKKyAgIEZJWFBfREJMIHRockZhY3RvckxkRGF0YTsKKyAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CisgICBGSVhQX0RCTCAqc2ZiUGVGYWN0b3JzTGREYXRhWyg4KV1bKDIpXTsKKyAgIEZJWFBfREJMIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVsoOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKKyAgIElOVCAgICAgIG5vcm1GYWN0b3JJbnQ7CisgICBGSVhQX0RCTCBub3JtRmFjdG9yTGREYXRhOworCisgICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisgICBJTlQgZWxlbWVudElkOworCisgICAvKiBzY3JhdGNoIGlzIGVtcHR5OyB1c2UgdGVtcG9yYWwgbWVtb3J5IGZyb20gcXVhbnRTcGVjIGluIFFDX09VVF9DSEFOTkVMICovCisgICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICBTSE9SVCogcHRyID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYzsKKyAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF0gPSAoRklYUF9EQkwqKXB0cjsKKyAgICAgfQorICAgfQorCisgICAvKiBmb3IgZWFjaCBzZmIgY2FsYyByZWxhdGl2ZSBmYWN0b3JzIGZvciBwZSBjaGFuZ2VzICovCisgICBub3JtRmFjdG9ySW50ID0gMDsKKworICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKKyAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisKKyAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKworICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOworICAgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKKworICAgICAgICAgIGZvcihzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKyAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKworICAgICAgICAgICAgIGlmICggcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID09IDAgKSB7CisgICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBCb3RoIENhbGNMZEludCBhbmQgQ2FsY0xkRGF0YSBjYW4gYmUgdXNlZCEKKyAgICAgICAgICAgICAgICAgKiBObyBvZmZzZXQgaGFzIHRvIGJlIHN1YnRyYWN0ZWQsIGJlY2F1c2Ugc2ZiTkFjdGl2ZUxpbmVzTGREYXRhCisgICAgICAgICAgICAgICAgICogaXMgc2hvcnRlZCB3aGlsZSB0aHJGYWN0b3IgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBDYWxjTGRJbnQocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKCAoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgfHwgKGRlbHRhUGUgPiAwKSkgJiYKKyAgICAgICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gIT0gMCApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPiAtcmVkVmFsW2VsZW1lbnRJZF0pIHsKKworICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlRmFjdG9yc1tjaF1bc2ZiR3JwK3NmYl0gPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gKyByZWRWYWxbZWxlbWVudElkXSk7ICovCisKKyAgICAgICAgICAgICAgICAgICBpbnQgbWluU2NhbGUgPSBmaXhNaW4oQ291bnRMZWFkaW5nQml0cyh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0pLCBDb3VudExlYWRpbmdCaXRzKHJlZFZhbFtlbGVtZW50SWRdKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSkgKSAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAvKiBzdW1sZCA9IGxkNjQoIHNmYlRockV4cCArIHJlZFZhbCApICovCisgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc3VtTGQgPSBDYWxjTGREYXRhKHNjYWxlVmFsdWUodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdLCBtaW5TY2FsZSkgKyBzY2FsZVZhbHVlKHJlZFZhbFtlbGVtZW50SWRdLCAoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pK21pblNjYWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoRklYUF9EQkwpKG1pblNjYWxlPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk7CisKKyAgICAgICAgICAgICAgICAgICBpZiAoc3VtTGQgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIC0gc3VtTGQ7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPiAoRkwyRlhDT05TVF9EQkwoLTEuZikgKyBzdW1MZCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgIG5vcm1GYWN0b3JJbnQgKz0gKElOVClDYWxjSW52TGREYXRhKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMS4wZik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgIH0KKworICAgLyogbm9ybUZhY3RvckxkRGF0YSA9IGxkNjQoZGVsdGFQZS9ub3JtRmFjdG9ySW50KSAqLworICAgbm9ybUZhY3RvckxkRGF0YSA9IENhbGNMZERhdGEoKEZJWFBfREJMKSgoZGVsdGFQZTwwKSA/ICgtZGVsdGFQZSkgOiAoZGVsdGFQZSkpKSAtIENhbGNMZERhdGEoKEZJWFBfREJMKW5vcm1GYWN0b3JJbnQpOworCisgICAvKiBkaXN0cmlidXRlIHRoZSBwZSBkaWZmZXJlbmNlIHRvIHRoZSBzY2FsZWZhY3RvcnMKKyAgICAgIGFuZCBjYWxjdWxhdGUgdGhlIGFjY29yZGluZyB0aHJlc2hvbGRzICovCisgICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKworICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOworICAgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKKworICAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisKKyAgICAgICAgICAgICAgaWYgKHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA+IDApIHsKKworICAgICAgICAgICAgICAgICAvKiBwZSBkaWZmZXJlbmNlIGZvciB0aGlzIHNmYiAqLworICAgICAgICAgICAgICAgICBpZiAoIChzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl09PUZMMkZYQ09OU1RfREJMKC0xLjBmKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoZGVsdGFQZT09MCkgKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCisgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wID0gQ2FsY0ludkxkRGF0YShzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gKyBub3JtRmFjdG9yTGREYXRhIC0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIC0gRkwyRlhDT05TVF9EQkwoKGZsb2F0KUxEX0RBVEFfU0hJRlQvTERfREFUQV9TQ0FMSU5HKSk7CisKKyAgICAgICAgICAgICAgICAgICAvKiBsaW1pdCB0aHJGYWN0b3IgdG8gNjBkQiAqLworICAgICAgICAgICAgICAgICAgIHRtcCA9IChkZWx0YVBlPDApID8gdG1wIDogKC10bXApOworICAgICAgICAgICAgICAgICAgIHRockZhY3RvckxkRGF0YSA9IEZES21pbih0bXAsIEZMMkZYQ09OU1RfREJMKDIwLmYvTERfREFUQV9TQ0FMSU5HKSk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCisgICAgICAgICAgICAgICAgIHNmYlRockxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdOworICAgICAgICAgICAgICAgICBzZmJFbkxkRGF0YSAgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworCisgICAgICAgICAgICAgICAgIGlmICh0aHJGYWN0b3JMZERhdGEgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgICAgICAgICAgICAgaWYoIHNmYlRockxkRGF0YSA+IChGTDJGWENPTlNUX0RCTCgtMS5mKS10aHJGYWN0b3JMZERhdGEpICkgeworICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGEgKyB0aHJGYWN0b3JMZERhdGE7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvKiBhdm9pZCBob2xlICovCisgICAgICAgICAgICAgICAgIGlmICggKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSA+IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPT0gQUhfSU5BQ1RJVkUpICkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBzZmJUaHJSZWR1Y2VkID0gbWF4KHBzeU91dENoYW5bY2hdLT5zZmJNaW5TbnJbaV0gKiBzZmJFbiwgc2ZiVGhyKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJFbkxkRGF0YSA+IChzZmJUaHJMZERhdGEtcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgc2ZiRW5MZERhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlTWluU25yCisgICAgZGVzY3JpcHRpb246ICBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHJlZHVjZSBwZSBieQorICAgICAgICAgICAgICAgICAgcmVkdWNpbmcgbWluU25yCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX3JlZHVjZU1pblNucihDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVzaXJlZFBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgcmVkUGVHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgcHJvY2Vzc0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCisKK3sKKyAgIElOVCBlbGVtZW50SWQ7CisgICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisKKyAgIElOVCBuZXdHbG9iYWxQZSA9ICpyZWRQZUdsb2JhbDsKKworICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKKyAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgSU5UIGNoOworICAgICAgIElOVCBtYXhTZmJQZXJHcm91cFsyXTsKKyAgICAgICBJTlQgc2ZiQ250WzJdOworICAgICAgIElOVCBzZmJQZXJHcm91cFsyXTsKKworICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKKyAgICAgICAgIHNmYkNudFtjaF0gICAgICAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOworICAgICAgIH0KKworICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworCisgICAgICAgZG8KKyAgICAgICB7CisgICAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKworICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOworICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7CisKKyAgICAgICAgICAgIGlmIChtYXhTZmJQZXJHcm91cFtjaF0+PTApIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgSU5UIGRlbHRhUGUgPSAwOworICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKKyAgICAgICAgICAgICAgbm9SZWR1Y3Rpb24gPSAwOworCisgICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoXTsgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoXSkgeworCisgICAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCAmJgorICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8IFNuckxkRmFjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIGluY3JlYXNlIHRocmVzaG9sZCB0byBuZXcgbWluU25yIG9mIDFkQiAqLworICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBTbnJMZEZhYzsKKworICAgICAgICAgICAgICAgICAgLyogc2ZiVGhyUmVkdWNlZCA9IG1heChwc3lPdXRDaGFuW2NoXS0+c2ZiTWluU25yW2ldICogc2ZiRW4sIHNmYlRocik7ICovCisgICAgICAgICAgICAgICAgICBpZiAoIHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPj0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gLSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApIHsKKworICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdICsgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl07CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCisgICAgICAgICAgICAgICAgICAgICAvKiBDMiArIEMzKmxkKDEvMC44KSA9IDEuNSAqLworICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSAtPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKKworICAgICAgICAgICAgICAgICAgICAgLyogc2ZiUGUgPSAxLjUgKiBzZmJOTGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0gPSAoMypwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYk5MaW5lc1tzZmJHcnArc2ZiXSkgPDwgKFBFX0NPTlNUUEFSVF9TSElGVC0xKTsKKyAgICAgICAgICAgICAgICAgICAgIGRlbHRhUGUgKz0gKHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB9IC8qIHNmYkdycCBsb29wICovCisKKyAgICAgICAgICAgICAgcGVEYXRhLT5wZSArPSBkZWx0YVBlOworICAgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnBlICs9IGRlbHRhUGU7CisgICAgICAgICAgICAgIG5ld0dsb2JhbFBlICs9IGRlbHRhUGU7CisKKyAgICAgICAgICAgICAgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KKyAgICAgICAgICAgICAgaWYgKHBlRGF0YS0+cGUgPD0gZGVzaXJlZFBlKSB7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLyogc2ZiID4gMCAqLworCisgICAgICAgICAgICBpZiAoIChjaD09KGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLTEpKSAmJiBub1JlZHVjdGlvbiApIHsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICB9IC8qIGNoIGxvb3AgKi8KKworICAgICAgIH0gd2hpbGUgKCBwZURhdGEtPnBlID4gZGVzaXJlZFBlKTsKKworICAgICB9IC8qICE9IElEX0RTRSAqLworICAgfSAvKiBlbGVtZW50IGxvb3AgKi8KKworCitiYWlsOgorICAgLyogdXBkYXRlIGdsb2JhbCBQRSAqLworICAgKnJlZFBlR2xvYmFsID0gbmV3R2xvYmFsUGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMKKyAgICBkZXNjcmlwdGlvbjogIGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgc29tZSBtb3JlIHNjYWxlZmFjdG9yCisgICAgICAgICAgICAgICAgICBiYW5kcyBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hbGxvd01vcmVIb2xlcyhDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBkZXNpcmVkUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIGN1cnJlbnRQZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBlbGVtZW50T2Zmc2V0KQoreworICBJTlQgZWxlbWVudElkOworICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisgIElOVCBhY3RQZSA9IGN1cnJlbnRQZTsKKworICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CisgICAgcmV0dXJuOyAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworCisgICAgICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworCisgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKworICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKKyAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildID0ge05VTEx9OworCisgICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworCisgICAgICAgIC8qIGluaXQgcG9pbnRlcnMgKi8KKyAgICAgICAgcWNPdXRDaGFubmVsW2NoXSA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICBwc3lPdXRDaGFubmVsW2NoXSA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CisKKyAgICAgICAgZm9yKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICBmb3IgKHNmYj1wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogZm9yIE1TIGFsbG93IGhvbGUgaW4gdGhlIGNoYW5uZWwgd2l0aCBsZXNzIGVuZXJneSAqLworICAgICAgaWYgKCBuQ2hhbm5lbHM9PTIgJiYgcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlPT1wc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UgKSB7CisKKyAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbMF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbMF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgICBpZiAocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8ubXNNYXNrW3NmYkdycCtzZmJdKSB7CisgICAgICAgICAgICAgIEZJWFBfREJMIEVuZXJneUxkX0wgPSBxY091dENoYW5uZWxbMF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9SID0gcWNPdXRDaGFubmVsWzFdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKKworICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlIGluIHNpZGUgY2hhbm5lbCA/ICovCisgICAgICAgICAgICAgIGlmICggKGFoRmxhZ1tlbGVtZW50SWRdWzFdW3NmYkdycCtzZmJdICE9IE5PX0FIKSAmJgorICAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4Zik+PjEpICsgKHFjT3V0Q2hhbm5lbFswXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID4gKChFbmVyZ3lMZF9SPj4xKSAtIChFbmVyZ3lMZF9MPj4xKSkpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bMV1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKKyAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKSArIEVuZXJneUxkX1I7CisgICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMV0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlIGluIG1pZCBjaGFubmVsID8gKi8KKyAgICAgICAgICAgICAgZWxzZSBpZiAoIChhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4Zik+PjEpICsgKHFjT3V0Q2hhbm5lbFsxXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAoKEVuZXJneUxkX0w+PjEpIC0gKEVuZXJneUxkX1I+PjEpKSkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSA9IE5PX0FIOworICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfTDsKKyAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVswXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICAgICAgICB9IC8qIGlmIChhaEZsYWcpICovCisgICAgICAgICAgICB9IC8qIGlmIE1TICovCisgICAgICAgICAgfSAvKiBzZmJHcnAgKi8KKyAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CisgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCisgICAgICAgICAgfQorICAgICAgICB9IC8qIHNmYiAqLworICAgICAgfSAvKiBNUyBwb3NzaWJsZSA/ICovCisKKyAgICAgIC8qIG1vcmUgaG9sZXMgbmVjZXNzYXJ5PyBzdWJzZXF1ZW50bHkgZXJhc2UgYmFuZHMKKyAgICAgICAgIHN0YXJ0aW5nIHdpdGggbG93IGVuZXJnaWVzICovCisgICAgICBJTlQgc3RhcnRTZmJbMl07CisgICAgICBGSVhQX0RCTCBhdmdFbkxENjQsbWluRW5MRDY0OworICAgICAgSU5UIGFoQ250OworICAgICAgRklYUF9EQkwgYWhDbnRMRDY0OworICAgICAgSU5UIGVuSWR4OworICAgICAgRklYUF9EQkwgZW5MRDY0WzRdOworICAgICAgRklYUF9EQkwgYXZnRW47CisKKyAgICAgIC8qIGRvIG5vdCBnbyBiZWxvdyBzdGFydFNmYiAqLworICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQorICAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiUzsKKyAgICAgIH0KKworICAgICAgLyogY2FsYyBhdmcgYW5kIG1pbiBlbmVyZ2llcyBvZiBiYW5kcyB0aGF0IGF2b2lkIGhvbGVzICovCisgICAgICBhdmdFbiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgbWluRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBhaENudCA9IDA7CisKKyAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisKKyAgICAgICAgc2ZiR3JwPTA7CisgICAgICAgIHNmYj1zdGFydFNmYltjaF07CisKKyAgICAgICAgZG8geworICAgICAgICAgIGZvciAoOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgICAgaWYgKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0hPU5PX0FIKSAmJgorICAgICAgICAgICAgICAgIChxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkpeworICAgICAgICAgICAgICBtaW5FbkxENjQgPSBmaXhNaW4obWluRW5MRDY0LHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CisgICAgICAgICAgICAgIGF2Z0VuICs9IHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+PiA2OworICAgICAgICAgICAgICBhaENudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CisgICAgICAgICAgc2ZiPTA7CisKKyAgICAgICAgfSB3aGlsZSAoc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCk7CisgICAgICB9CisKKyAgICAgIGlmICggKGF2Z0VuID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoYWhDbnQgPT0gMCkgKSB7CisgICAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYXZnRW4pOworICAgICAgICBhaENudExENjQgPSBDYWxjTGRJbnQoYWhDbnQpOworICAgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLSBhaENudExENjQ7IC8qIGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCisgICAgICB9CisKKyAgICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLworICAgICAgLyogZm9yIChlbklkeD0wOyBlbklkeDw0OyBlbklkeCsrKSAqLworICAgICAgICAvKiBlbltlbklkeF0gPSBtaW5FbiAqIChmbG9hdClGREtwb3coYXZnRW4vKG1pbkVuK0ZMVF9NSU4pLCAoMiplbklkeCsxKS83LjBmKTsgKi8KKyAgICAgIGVuTEQ2NFswXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjE0Mjg1NzE0Mjg1ZikpOworICAgICAgZW5MRDY0WzFdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNDI4NTcxNDI4NTdmKSk7CisgICAgICBlbkxENjRbMl0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC43MTQyODU3MTQyOGYpKTsKKyAgICAgIGVuTEQ2NFszXSA9IG1pbkVuTEQ2NCArIChhdmdFbkxENjQtbWluRW5MRDY0KTsKKworICAgICAgZm9yIChlbklkeD0wOyBlbklkeDw0OyBlbklkeCsrKSB7CisgICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7CisKKyAgICAgICAgSU5UIG1heFNmYlBlckdyb3VwWzJdOworICAgICAgICBJTlQgc2ZiQ250WzJdOworICAgICAgICBJTlQgc2ZiUGVyR3JvdXBbMl07CisKKyAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKKyAgICAgICAgICBzZmJDbnRbY2hdICAgICAgICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICAgc2ZiUGVyR3JvdXBbY2hdICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisKKyAgICAgICAgICBub1JlZHVjdGlvbiA9IDE7CisKKyAgICAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKworICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOworCisgICAgICAgICAgICAvKiBzdGFydCB3aXRoIGxvd2VzdCBlbmVyZ3kgYm9yZGVyIGF0IGhpZ2hlc3Qgc2ZiICovCisgICAgICAgICAgICBpZiAobWF4U2ZiUGVyR3JvdXBbY2hdPj1zdGFydFNmYltjaF0pIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgc2ZiID0gbWF4U2ZiUGVyR3JvdXBbY2hdLS07CisgICAgICAgICAgICAgIG5vUmVkdWN0aW9uID0gMDsKKworICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaF07IHNmYkdycCArPSBzZmJQZXJHcm91cFtjaF0pIHsKKyAgICAgICAgICAgICAgICAvKiBzZmIgZW5lcmd5IGJlbG93IGJvcmRlciA/ICovCisgICAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCAmJiBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPCBlbkxENjRbZW5JZHhdKSB7CisgICAgICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCisgICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKKyAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKKyAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gLyogc2ZiR3JwICAqLworCisgICAgICAgICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogc2ZiID4gMCAqLworICAgICAgICAgIH0gLyogY2ggbG9vcCAqLworCisgICAgICAgIH0gd2hpbGUoIChub1JlZHVjdGlvbiA9PSAwKSAmJiAoYWN0UGUgPiBkZXNpcmVkUGUpICk7CisKKyAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgeworICAgICAgICAgIHJldHVybjsgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KKyAgICAgICAgfQorCisgICAgICB9IC8qIGVuSWR4IGxvb3AgKi8KKworICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLworICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisKK30KKworLyogcmVzZXQgYXZvaWQgaG9sZSBmbGFncyBmcm9tIEFIX0FDVElWRSB0byBBSF9JTkFDVElWRSAgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19yZXNldEFIRmxhZ3MoIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSkKK3sKKyAgaW50IGNoLCBzZmIsIHNmYkdycDsKKworICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGlmICggYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9PSBBSF9BQ1RJVkUpIHsKKyAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfSU5BQ1RJVkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgRklYUF9EQkwgQ2FsY1JlZFZhbFBvd2VyKEZJWFBfREJMIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZGVudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgIHNjYWxpbmcgKQoreworICAgIEZJWFBfREJMIHZhbHVlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgIGlmIChudW0+PUZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIHZhbHVlID0gZkRpdk5vcm0oIG51bSwgZGVudW0sIHNjYWxpbmcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHZhbHVlID0gLWZEaXZOb3JtKCAtbnVtLCBkZW51bSwgc2NhbGluZyk7CisgICAgfQorICAgIHZhbHVlID0gZjJQb3codmFsdWUsICpzY2FsaW5nLCBzY2FsaW5nKTsKKyAgICAqc2NhbGluZyA9IERGUkFDVF9CSVRTLTEtKnNjYWxpbmc7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlCitkZXNjcmlwdGlvbjogIHR3byBndWVzc2VzIGZvciB0aGUgcmVkdWN0aW9uIHZhbHVlIGFuZCBvbmUgZmluYWwgY29ycmVjdGlvbiBvZiB0aGUgdGhyZXNob2xkcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShDSEFOTkVMX01BUFBJTkcqICBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50Wyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIGRlc2lyZWRQZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBlbGVtZW50T2Zmc2V0KQoreworICAgRklYUF9EQkwgcmVkVmFsdWVbKDgpXTsKKyAgIFNDSEFSICAgIHJlZFZhbFNjYWxpbmdbKDgpXTsKKyAgIFVDSEFSICAgIHBBaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl07CisgICBGSVhQX0RCTCBwVGhyRXhwWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdOworICAgaW50IGl0ZXI7CisKKyAgIElOVCBjb25zdFBhcnRHbG9iYWwsIG5vUmVkUGVHbG9iYWwsIG5BY3RpdmVMaW5lc0dsb2JhbCwgcmVkUGVHbG9iYWw7CisgICBjb25zdFBhcnRHbG9iYWwgPSBub1JlZFBlR2xvYmFsID0gbkFjdGl2ZUxpbmVzR2xvYmFsID0gcmVkUGVHbG9iYWwgPSAwOworCisgICBpbnQgZWxlbWVudElkOworCisgICBpbnQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisgICBpZihuRWxlbWVudHMgPiBjbS0+bkVsZW1lbnRzKSB7CisgICAgIG5FbGVtZW50cyA9IGNtLT5uRWxlbWVudHM7CisgICB9CisKKyAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgIC8qIFBhcnQgSTogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHZhcmlhYmxlcy4uLiAqLworICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKKyAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisKKyAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CisgICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CisKKyAgICAgICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KKyAgICAgICBGREthYWNFbmNfY2FsY1RocmVzaEV4cChwVGhyRXhwW2VsZW1lbnRJZF0sIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICAgICAgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKKyAgICAgICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLworICAgICAgIEZES2FhY0VuY19hZGFwdE1pblNucihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+bWluU25yQWRhcHRQYXJhbSwgbkNoYW5uZWxzKTsKKworICAgICAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KKyAgICAgICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sICZwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mbywgbkNoYW5uZWxzLCBwZURhdGEsICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbSk7CisKKyAgICAgICAvKiBzdW0gdXAgKi8KKyAgICAgICBjb25zdFBhcnRHbG9iYWwgICAgKz0gcGVEYXRhLT5jb25zdFBhcnQ7CisgICAgICAgbm9SZWRQZUdsb2JhbCAgICAgICs9IHBlRGF0YS0+cGU7CisgICAgICAgbkFjdGl2ZUxpbmVzR2xvYmFsICs9IGZpeE1heCgoSU5UKXBlRGF0YS0+bkFjdGl2ZUxpbmVzLCAxKTsKKworICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKworICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgIC8qIFBhcnQgSUk6IENhbGN1bGF0ZSBiaXQgY29uc3VtcHRpb24gb2YgaW5pdGlhbCBiaXQgY29uc3RyYWludHMgc2V0dXAgKi8KKyAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAvKgorICAgICAgIHJlZFZhbCA9ICggMiBeICggKGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNHbG9iYWwpICkKKyAgICAgICAgICAgICAgICAtIDIgXiAoIChjb25zdFBhcnRHbG9iYWwtbm9SZWRQZUdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc0dsb2JhbCkgKSApCisgICAgICAgKi8KKworCisgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOworICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworCisgICAgICAgLyogZmlyc3QgZ3Vlc3Mgb2YgcmVkdWN0aW9uIHZhbHVlICovCisgICAgICAgaW50IHNjYWxlMD0wLCBzY2FsZTE9MDsKKyAgICAgICBGSVhQX0RCTCB0bXAwID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnRHbG9iYWwtZGVzaXJlZFBlLCA0Km5BY3RpdmVMaW5lc0dsb2JhbCwgJnNjYWxlMCApOworICAgICAgIEZJWFBfREJMIHRtcDEgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydEdsb2JhbC1ub1JlZFBlR2xvYmFsLCA0Km5BY3RpdmVMaW5lc0dsb2JhbCwgJnNjYWxlMSApOworCisgICAgICAgaW50IHNjYWxNaW4gPSBGREttaW4oc2NhbGUwLCBzY2FsZTEpLTE7CisKKyAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdICA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKKyAgICAgICByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0gPSBzY2FsTWluOworCisgICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KKyAgICAgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZFZhbHVlW2VsZW1lbnRJZF0sIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSk7CisKKyAgICAgICAvKiBwZSBhZnRlciBmaXJzdCBndWVzcyAqLworICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CisKKyAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOworICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKworICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgIC8qIFBhcnQgSUlJOiBJdGVyYXRlIHVudGlsIGJpdCBjb25zdHJhaW50cyBhcmUgbWV0ICovCisgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgaXRlciA9IDA7CisgICB3aGlsZSAoKGZpeHBfYWJzKHJlZFBlR2xvYmFsIC0gZGVzaXJlZFBlKSA+IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjA1ZiksZGVzaXJlZFBlKSkgJiYgKGl0ZXIgPCAxKSkgeworCisgICAgIElOVCBkZXNpcmVkUGVOb0FIR2xvYmFsOworICAgICBJTlQgcmVkUGVOb0FIR2xvYmFsID0gMDsKKyAgICAgSU5UIGNvbnN0UGFydE5vQUhHbG9iYWwgPSAwOworICAgICBJTlQgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA9IDA7CisKKyAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKKyAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKworICAgICAgICAgSU5UIHJlZFBlTm9BSCwgY29uc3RQYXJ0Tm9BSCwgbkFjdGl2ZUxpbmVzTm9BSDsKKyAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworCisgICAgICAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLworICAgICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKCZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwKKyAgICAgICAgICAgICAgICAgICAgcGVEYXRhLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICAgICAgICAgcmVkUGVOb0FIR2xvYmFsICs9IHJlZFBlTm9BSDsKKyAgICAgICAgIGNvbnN0UGFydE5vQUhHbG9iYWwgKz0gY29uc3RQYXJ0Tm9BSDsKKyAgICAgICAgIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgKz0gbkFjdGl2ZUxpbmVzTm9BSDsKKyAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLworCisgICAgIC8qIENhbGN1bGF0ZSBuZXcgcmVkVmFsIC4uLiAqLworICAgICBpZihkZXNpcmVkUGUgPCByZWRQZUdsb2JhbCkgeworCisgICAgICAgLyogbmV3IGRlc2lyZWQgcGUgd2l0aG91dCBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGFjdGl2ZSAqLworICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBkZXNpcmVkUGUgLSAocmVkUGVHbG9iYWwgLSByZWRQZU5vQUhHbG9iYWwpOworCisgICAgICAgLyogbGltaXQgZGVzaXJlZFBlTm9BSCB0byBwb3NpdGl2ZSB2YWx1ZXMsIGFzIHRoZSBQRSBjYW4gbm90IGJlY29tZSBuZWdhdGl2ZSAqLworICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBGREttYXgoMCxkZXNpcmVkUGVOb0FIR2xvYmFsKTsKKworICAgICAgIC8qIHNlY29uZCBndWVzcyAob25seSBpZiB0aGVyZSBhcmUgYmFuZHMgbGVmdCB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlKSovCisgICAgICAgaWYgKG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwKSB7CisgICAgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgIHJlZFZhbCArPSAoIDIgXiAoIChjb25zdFBhcnROb0FIR2xvYmFsLWRlc2lyZWRQZU5vQUhHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSApCisgICAgICAgICAgICAgICAgICAgICAgIC0gMiBeICggKGNvbnN0UGFydE5vQUhHbG9iYWwtcmVkUGVOb0FIR2xvYmFsKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCkgKSApCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpbnQgc2NhbGUwID0gMDsKKyAgICAgICAgICAgICBpbnQgc2NhbGUxID0gMDsKKworICAgICAgICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCwgNCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmc2NhbGUwICk7CisgICAgICAgICAgICAgRklYUF9EQkwgdG1wMSA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0Tm9BSEdsb2JhbC1yZWRQZU5vQUhHbG9iYWwsIDQqbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCwgJnNjYWxlMSApOworCisgICAgICAgICAgICAgaW50IHNjYWxNaW4gPSBGREttaW4oc2NhbGUwLCBzY2FsZTEpLTE7CisKKyAgICAgICAgICAgICB0bXAwID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpIC0gc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOworICAgICAgICAgICAgIHNjYWxlMCA9IHNjYWxNaW47CisKKyAgICAgICAgICAgICAvKiBvbGQgcmVkdWN0aW9uIHZhbHVlICovCisgICAgICAgICAgICAgdG1wMSA9IHJlZFZhbHVlW2VsZW1lbnRJZF07CisgICAgICAgICAgICAgc2NhbGUxID0gcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdOworCisgICAgICAgICAgICAgc2NhbE1pbiA9IGZpeE1pbihzY2FsZTAsc2NhbGUxKS0xOworCisgICAgICAgICAgICAgLyogc3VtIHVwIG9sZCBhbmQgbmV3IHJlZHVjdGlvbiB2YWx1ZSAqLworICAgICAgICAgICAgIHJlZFZhbHVlW2VsZW1lbnRJZF0gPSBzY2FsZVZhbHVlKHRtcDAsKHNjYWxNaW4tc2NhbGUwKSkgKyBzY2FsZVZhbHVlKHRtcDEsKHNjYWxNaW4tc2NhbGUxKSk7CisgICAgICAgICAgICAgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdID0gc2NhbE1pbjsKKworICAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgICAgICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgICAgICB9IC8qIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwICovCisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIC8qIGRlc2lyZWRQZSA+PSByZWRQZUdsb2JhbCAqLworICAgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgeworICAgICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworCisgICAgICAgICAgICBJTlQgcmVkVmFsX3NjYWxlID0gMDsKKyAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IGZEaXZOb3JtKChGSVhQX0RCTClyZWRQZUdsb2JhbCwgKEZJWFBfREJMKWRlc2lyZWRQZSwgJnJlZFZhbF9zY2FsZSk7CisKKyAgICAgICAgICAgIC8qIHJlZFZhbCAqPSByZWRQZUdsb2JhbC9kZXNpcmVkUGU7ICovCisgICAgICAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdID0gZk11bHQocmVkVmFsdWVbZWxlbWVudElkXSwgdG1wKTsKKyAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSAtPSByZWRWYWxfc2NhbGU7CisKKyAgICAgICAgICAgIEZES2FhY0VuY19yZXNldEFIRmxhZ3MocEFoRmxhZ1tlbGVtZW50SWRdLCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsKTsKKyAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgICAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLworICAgICB9CisKKyAgICAgcmVkUGVHbG9iYWwgPSAwOworICAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCdzIFBFLi4uICovCisgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CisgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisKKyAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworCisgICAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworICAgICAgICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBUaHJFeHBbZWxlbWVudElkXSwgbkNoYW5uZWxzLCByZWRWYWx1ZVtlbGVtZW50SWRdLCByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pOworCisgICAgICAgICAvKiBwZSBhZnRlciBzZWNvbmQgZ3Vlc3MgKi8KKyAgICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CisgICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOworCisgICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKworICAgICBpdGVyKys7CisgICB9IC8qIEVPRiB3aGlsZSAqLworCisKKyAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgIC8qIFBhcnQgSVY6IGlmIHN0aWxsIHJlcXVpcmVkLCBmdXJ0aGVyIHJlZHVjZSBjb25zdHJhaW50cyAgKi8KKyAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgIC8qICAgICAgICAgICAgICAgICAgMS4wKiAgICAgICAgMS4xNSogICAgICAgMS4yMCoKKyAgICAqICAgICAgICAgICAgICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlCisgICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgICAgKiAuLi5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh8ICAgICAgICAgICB8CisgICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFguLi4KKyAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHxYWFhYWFhYWFhYWHwKKyAgICAqICAgICAgICAgICAgLS0tIEEgLS0tICAgICAgICAgIHwgLS0tIEIgLS0tIHwgLS0tIEMgLS0tCisgICAgKgorICAgICogKFgpOiByZWRQZUdsb2JhbAorICAgICogKEEpOiBGREthYWNFbmNfY29ycmVjdFRocmVzaCgpCisgICAgKiAoQik6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcygpCisgICAgKiAoQyk6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoKQorICAgKi8KKworICAgLyogY29ycmVjdCB0aHJlc2hvbGRzIHRvIGdldCBjbG9zZXIgdG8gdGhlIGRlc2lyZWQgcGUgKi8KKyAgIGlmICggcmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUgKSB7CisgICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsIHBUaHJFeHAsIHJlZFZhbHVlLCByZWRWYWxTY2FsaW5nLAorICAgICAgICAgICAgICAgICAgIGRlc2lyZWRQZSAtIHJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOworCisgICAgIC8qIHVwZGF0ZSBQRSAqLworICAgICByZWRQZUdsb2JhbCA9IDA7CisgICAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CisgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisKKyAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworCisgICAgICAgICAvKiBwZSBhZnRlciBjb3JyZWN0VGhyZXNoICovCisgICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOworICAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKKworICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLworICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgICB9CisKKyAgIGlmICggcmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUgKSB7CisgICAgIC8qIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIgcmVxdWlyZW1lbnRzICovCisgICAgIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuMTVmKSxkZXNpcmVkUGUpICsgZGVzaXJlZFBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CisKKyAgICAgLyogcmVkdWNlIHBlIGJ5IGFsbG93aW5nIGFkZGl0aW9uYWwgc3BlY3RyYWwgaG9sZXMgKi8KKyAgICAgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIEFkalRoclN0YXRlRWxlbWVudCwgcEFoRmxhZywKKyAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlLCByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKKyAgIH0KKworfQorCisvKiBzaW1pbGFyIHRvIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKCksIGZvciAgVkJSLW1vZGUgKi8KK3ZvaWQgRkRLYWFjRW5jX0FkYXB0VGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIEFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCit7CisgICBVQ0hBUiAgICAoKnBBaEZsYWcpW01BWF9HUk9VUEVEX1NGQl07CisgICBGSVhQX0RCTCAoKnBUaHJFeHApW01BWF9HUk9VUEVEX1NGQl07CisKKyAgIC8qIGFsbG9jYXRlIHNjcmF0Y2ggbWVtb3J5ICovCisgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BBaEZsYWcsIFVDSEFSLCAoMikqTUFYX0dST1VQRURfU0ZCKQorICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKKyAgIHBBaEZsYWcgPSAoVUNIQVIoKilbTUFYX0dST1VQRURfU0ZCXSlfcEFoRmxhZzsKKyAgIHBUaHJFeHAgPSAoRklYUF9EQkwoKilbTUFYX0dST1VQRURfU0ZCXSlfcFRockV4cDsKKworICAgLyogdGhyZXNob2xkcyB0byB0aGUgcG93ZXIgb2YgcmVkRXhwICovCisgICBGREthYWNFbmNfY2FsY1RocmVzaEV4cChwVGhyRXhwLCBxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisKKyAgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKKyAgICAgIGVuZXJneSBpbiB0aGlzIGZyYW1lICovCisgICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5taW5TbnJBZGFwdFBhcmFtLCBuQ2hhbm5lbHMpOworCisgICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCisgICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCB0b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIHBlRGF0YSwgJkFkalRoclN0YXRlRWxlbWVudC0+YWhQYXJhbSk7CisKKyAgIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCisgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHBUaHJFeHAsIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT52YnJRdWFsRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVPbGQpOworCisgICAvKiBmcmVlIHNjcmF0Y2ggbWVtb3J5ICovCisgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKKyAgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BBaEZsYWcsIFVDSEFSLCAoMikqTUFYX0dST1VQRURfU0ZCKQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNCaXRTYXZlCisgIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBwZXJjZW50YWdlIG9mIGJpdCBzYXZlLCBzZWUgZmlndXJlIGJlbG93CisgIHJldHVybnM6CisgIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCisgIG91dHB1dDogICAgICAgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgICAgICAgIGJpdHNhdmUKKyAgICAgICAgICAgICAgICAgICAgbWF4Qml0U2F2ZSglKXwgICBjbGlwTG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS1cLS0tLS0tLS0tLS0tLS0+IGJpdHJlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgbWluQml0U2F2ZSglKXwgICAgICAgICAgXC0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEhpZ2ggICAgICBtYXhCaXRyZXMKKyovCitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNCaXRTYXZlKEZJWFBfREJMIGZpbGxMZXZlbCwKKyAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAorICAgIGNvbnN0IEZJWFBfREJMIGNsaXBIaWdoLAorICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNhdmUsCisgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U2F2ZSwKKyAgICBjb25zdCBGSVhQX0RCTCBiaXRzYXZlX3Nsb3BlKQoreworICAgIEZJWFBfREJMIGJpdHNhdmU7CisKKyAgICBmaWxsTGV2ZWwgPSBmaXhNYXgoZmlsbExldmVsLCBjbGlwTG93KTsKKyAgICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CisKKyAgICBiaXRzYXZlID0gbWF4Qml0U2F2ZSAtIGZNdWx0KChmaWxsTGV2ZWwtY2xpcExvdyksIGJpdHNhdmVfc2xvcGUpOworCisgICAgcmV0dXJuIChiaXRzYXZlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0JpdFNwZW5kCisgIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZCwgc2VlIGZpZ3VyZSBiZWxvdworICByZXR1cm5zOgorICBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcworICBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNwZW5kCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kICAgICAgY2xpcEhpZ2gKKyAgICAgICAgICAgICAgICAgICBtYXhCaXRTcGVuZCglKXwgICAgICAgICAgLy0tLS0tLS0tLS0tbWF4Qml0cmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0vLS0tLS0tLS0tLS0tLS0tLS0+IGJpdHJlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC8KKyAgICAgICAgICAgICAgICAgICBtaW5CaXRTcGVuZCglKXwtLS8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcExvdworKi8KK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0JpdFNwZW5kKEZJWFBfREJMIGZpbGxMZXZlbCwKKyAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAorICAgIGNvbnN0IEZJWFBfREJMIGNsaXBIaWdoLAorICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNwZW5kLAorICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdFNwZW5kLAorICAgIGNvbnN0IEZJWFBfREJMIGJpdHNwZW5kX3Nsb3BlKQoreworICAgIEZJWFBfREJMIGJpdHNwZW5kOworCisgICAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CisgICAgZmlsbExldmVsID0gZml4TWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOworCisgICAgYml0c3BlbmQgPSBtaW5CaXRTcGVuZCArIGZNdWx0KGZpbGxMZXZlbC1jbGlwTG93LCBiaXRzcGVuZF9zbG9wZSk7CisKKyAgICByZXR1cm4gKGJpdHNwZW5kKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGp1c3RQZU1pbk1heCgpCisgIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBwZU1pbiBhbmQgcGVNYXggcGFyYW1ldGVycyBvdmVyIHRpbWUKKyAgcmV0dXJuczoKKyAgaW5wdXQ6ICAgICAgICBjdXJyZW50IHBlLCBwZU1pbiwgcGVNYXgsIGJpdHJlcyBzaXplCisgIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoY29uc3QgSU5UIGN1cnJQZSwKKyAgICBJTlQgICAgICAqcGVNaW4sCisgICAgSU5UICAgICAgKnBlTWF4KQoreworICBGSVhQX0RCTCBtaW5GYWNIaSA9IEZMMkZYQ09OU1RfREJMKDAuM2YpLCBtYXhGYWNIaSA9IChGSVhQX0RCTClNQVhWQUxfREJMLCBtaW5GYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMTRmKSwgbWF4RmFjTG8gPSBGTDJGWENPTlNUX0RCTCgwLjA3Zik7CisgICAgSU5UIGRpZmY7CisKKyAgICBJTlQgbWluRGlmZl9maXggPSBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNjY2NjY2NjY3ZiksIGN1cnJQZSk7CisKKyAgICBpZiAoY3VyclBlID4gKnBlTWF4KQorICAgIHsKKyAgICAgICAgZGlmZiA9IChjdXJyUGUtKnBlTWF4KSA7CisgICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksZGlmZik7CisgICAgICAgICpwZU1heCArPSBmTXVsdEkobWF4RmFjSGksZGlmZik7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJQZSA8ICpwZU1pbikKKyAgICB7CisgICAgICAgIGRpZmYgPSAoKnBlTWluLWN1cnJQZSkgOworICAgICAgICAqcGVNaW4gLT0gZk11bHRJKG1pbkZhY0xvLGRpZmYpOworICAgICAgICAqcGVNYXggLT0gZk11bHRJKG1heEZhY0xvLGRpZmYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcGVNaW4gKz0gZk11bHRJKG1pbkZhY0hpLCAoY3VyclBlIC0gKnBlTWluKSk7CisgICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sICgqcGVNYXggLSBjdXJyUGUpKTsKKyAgICB9CisKKyAgICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmX2ZpeCkKKyAgICB7CisgICAgICAgIElOVCBwZU1heF9maXggPSAqcGVNYXgsIHBlTWluX2ZpeCA9ICpwZU1pbjsKKyAgICAgICAgRklYUF9EQkwgcGFydExvX2ZpeCwgcGFydEhpX2ZpeDsKKworICAgICAgICBwYXJ0TG9fZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBjdXJyUGUgLSBwZU1pbl9maXgpOworICAgICAgICBwYXJ0SGlfZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBwZU1heF9maXggLSBjdXJyUGUpOworCisgICAgICAgIHBlTWF4X2ZpeCA9IChJTlQpKGN1cnJQZSArIGZNdWx0SShmRGl2Tm9ybShwYXJ0SGlfZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7CisgICAgICAgIHBlTWluX2ZpeCA9IChJTlQpKGN1cnJQZSAtIGZNdWx0SShmRGl2Tm9ybShwYXJ0TG9fZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7CisgICAgICAgIHBlTWluX2ZpeCA9IGZpeE1heCgwLCBwZU1pbl9maXgpOworCisgICAgICAgICpwZU1heCA9IHBlTWF4X2ZpeDsKKyAgICAgICAgKnBlTWluID0gcGVNaW5fZml4OworICAgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIGZ1bmN0aW9ubmFtZTogQml0cmVzQ2FsY0JpdEZhYworICBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgZmFjdG9yIG9mIHNwZW5kaW5nIGJpdHMgZm9yIG9uZSBmcmFtZQorICAxLjAgOiB0YWtlIGFsbCBmcmFtZSBkeW5wYXJ0IGJpdHMKKyAgPjEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cyArIGJpdHJlcworICA8MS4wIDogcHV0IGJpdHMgaW4gYml0cmVzZXJ2b2lyCisgIHJldHVybnM6ICAgICAgQml0RmFjCisgIGlucHV0OiAgICAgICAgYml0cmVzLWZ1bGxuZXNzLCBwZSwgYmxvY2tUeXBlLCBwYXJhbWV0ZXItc2V0dGluZ3MKKyAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgICAgICAgICAgICAgICAgICAgICBiaXRmYWMoJSkgICAgICAgICAgICBwZW1heAorICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kKCUpICAgfCAgICAgICAgICAvLS0tLS0tLS0tLS1tYXhCaXRyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8tLS0tLS0tLS0tLS0tLS0tLT4gcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAvCisgICAgICAgICAgICAgICAgICAgYml0c2F2ZSglKSAgICB8LS0vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1pbgorKi8KKworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKGNvbnN0IElOVCAgICAgICBiaXRyZXNCaXRzLAorICAgIGNvbnN0IElOVCAgICAgICAgbWF4Qml0cmVzQml0cywKKyAgICBjb25zdCBJTlQgICAgICAgIHBlLAorICAgIGNvbnN0IElOVCAgICAgICAgbGFzdFdpbmRvd1NlcXVlbmNlLAorICAgIGNvbnN0IElOVCAgICAgICAgYXZnQml0cywKKyAgICBjb25zdCBGSVhQX0RCTCAgIG1heEJpdEZhYywKKyAgICBBREpfVEhSX1NUQVRFICAgKkFkalRociwKKyAgICBBVFNfRUxFTUVOVCAgICAgKmFkalRockNoYW4pCit7CisgICAgQlJFU19QQVJBTSAqYnJlc1BhcmFtOworICAgIElOVCBwZXg7CisKKyAgICBJTlQgcW1pbiwgcWJyLCBxYnJlcywgcW1icjsKKyAgICBGSVhQX0RCTCBiaXRTYXZlLCBiaXRTcGVuZDsKKworICAgIEZJWFBfREJMIGJpdHJlc0ZhY19maXgsIHRtcF9jc3QsIHRtcF9maXg7CisgICAgRklYUF9EQkwgcGVfcGVycywgYml0c19yYXRpbywgbWF4QnJWYWw7CisgICAgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSwgYml0c3BlbmRfc2xvcGUsIG1heEJpdEZhY190bXA7CisgICAgRklYUF9EQkwgZmlsbExldmVsX2ZpeCA9IChGSVhQX0RCTCkweDdmZmZmZmZmOworICAgIEZJWFBfREJMIFVOSVRZID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7CisgICAgRklYUF9EQkwgUE9JTlQ3ID0gKEZJWFBfREJMKTB4NTk5OTk5OUE7CisKKyAgICBpZiAobWF4Qml0cmVzQml0cyA+IGJpdHJlc0JpdHMpIHsKKyAgICAgIGZpbGxMZXZlbF9maXggPSBmRGl2Tm9ybShiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzKTsKKyAgICB9CisKKyAgICBpZiAobGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICB7CisgICAgICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1Mb25nKTsKKyAgICAgICAgYml0c2F2ZV9zbG9wZSA9IChGSVhQX0RCTCkweDNCQkJCQkJDOworICAgICAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDU1NTU1NTU1OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtU2hvcnQpOworICAgICAgICBiaXRzYXZlX3Nsb3BlID0gKEZJWFBfREJMKTB4MkU4QkEyRTk7CisgICAgICAgIGJpdHNwZW5kX3Nsb3BlID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7CisgICAgfQorCisgICAgcGV4ID0gZml4TWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7CisgICAgcGV4ID0gZml4TWluKHBleCwgYWRqVGhyQ2hhbi0+cGVNYXgpOworCisgICAgYml0U2F2ZSA9IEZES2FhY0VuY19jYWxjQml0U2F2ZShmaWxsTGV2ZWxfZml4LAorICAgICAgICBicmVzUGFyYW0tPmNsaXBTYXZlTG93LCBicmVzUGFyYW0tPmNsaXBTYXZlSGlnaCwKKyAgICAgICAgYnJlc1BhcmFtLT5taW5CaXRTYXZlLCBicmVzUGFyYW0tPm1heEJpdFNhdmUsIGJpdHNhdmVfc2xvcGUpOworCisgICAgYml0U3BlbmQgPSBGREthYWNFbmNfY2FsY0JpdFNwZW5kKGZpbGxMZXZlbF9maXgsCisgICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNwZW5kTG93LCBicmVzUGFyYW0tPmNsaXBTcGVuZEhpZ2gsCisgICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQsIGJpdHNwZW5kX3Nsb3BlKTsKKworICAgIHBlX3BlcnMgPSBmRGl2Tm9ybShwZXggLSBhZGpUaHJDaGFuLT5wZU1pbiwgYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbik7CisgICAgdG1wX2ZpeCA9IGZNdWx0KCgoRklYUF9EQkwpYml0U3BlbmQgKyAoRklYUF9EQkwpYml0U2F2ZSksIHBlX3BlcnMpOworICAgIGJpdHJlc0ZhY19maXggPSAoVU5JVFk+PjEpIC0gKChGSVhQX0RCTCliaXRTYXZlPj4xKSArICh0bXBfZml4Pj4xKTsgcWJyZXMgPSAoREZSQUNUX0JJVFMtMik7CisKKyAgICAvKiAoZmxvYXQpYml0cmVzQml0cy8oZmxvYXQpYXZnQml0cyAqLworICAgIGJpdHNfcmF0aW8gPSBmRGl2Tm9ybShiaXRyZXNCaXRzLCBhdmdCaXRzLCAmcWJyKTsKKyAgICBxYnIgPSBERlJBQ1RfQklUUy0xLXFicjsKKworICAgIC8qIEFkZCAwLjcgaW4gcTMxIHRvIGJpdHNfcmF0aW8gaW4gcWJyICovCisgICAgLyogMC43ZiArIChmbG9hdCliaXRyZXNCaXRzLyhmbG9hdClhdmdCaXRzICovCisgICAgcW1pbiA9IGZpeE1pbihxYnIsIChERlJBQ1RfQklUUy0xKSk7CisgICAgYml0c19yYXRpbyA9IGJpdHNfcmF0aW8gPj4gKHFiciAtIHFtaW4pOworICAgIHRtcF9jc3QgPSBQT0lOVDcgPj4gKChERlJBQ1RfQklUUy0xKSAtIHFtaW4pOworICAgIG1heEJyVmFsID0gKGJpdHNfcmF0aW8+PjEpICsgKHRtcF9jc3Q+PjEpOyBxbWJyID0gcW1pbiAtIDE7CisKKyAgICAvKiBiaXRyZXNGYWNfZml4ID0gZml4TWluKGJpdHJlc0ZhY19maXgsIDAuNyArIGJpdHJlc0JpdHMvYXZnQml0cyk7ICovCisgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1icik7IHFicmVzID0gcW1icjsKKyAgICBiaXRyZXNGYWNfZml4ID0gZml4TWluKGJpdHJlc0ZhY19maXgsIG1heEJyVmFsKTsKKworICAgIC8qIENvbXBhcmUgd2l0aCBtYXhCaXRGYWMgKi8KKyAgICBxbWluID0gZml4TWluKFFfQklURkFDLCBxYnJlcyk7CisgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1pbik7CisgICAgbWF4Qml0RmFjX3RtcCA9IG1heEJpdEZhYyA+PiAoUV9CSVRGQUMgLSBxbWluKTsKKyAgICBpZihtYXhCaXRGYWNfdG1wIDwgYml0cmVzRmFjX2ZpeCkKKyAgICB7CisgICAgICAgIGJpdHJlc0ZhY19maXggPSBtYXhCaXRGYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHFtaW4gPCBRX0JJVEZBQykKKyAgICAgICAgeworICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPDwgKFFfQklURkFDLXFtaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFtaW4tUV9CSVRGQUMpOworICAgICAgICB9CisgICAgfQorCisgICAgRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7CisKKyAgICByZXR1cm4gYml0cmVzRmFjX2ZpeDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRock5ldworZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBBREpfVEhSX1NUQVRFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUqKiBwaEFkalRociwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBuRWxlbWVudHMpCit7CisgICAgSU5UIGVyciA9IDA7CisgICAgSU5UIGk7CisgICAgQURKX1RIUl9TVEFURSogaEFkalRociA9IEdldFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKCk7CisgICAgaWYgKGhBZGpUaHI9PU5VTEwpIHsKKyAgICAgICAgZXJyID0gMTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CisgICAgICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9ICBHZXRSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudChpKTsKKyAgICAgICAgaWYgKGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXT09TlVMTCkgeworICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgfQorCitiYWlsOgorICAgICpwaEFkalRociA9IGhBZGpUaHI7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRockluaXQKK2Rlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZSBBREpfVEhSX1NUQVRFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX0FkalRockluaXQoCisgICAgICAgIEFESl9USFJfU1RBVEUgICAqaEFkalRociwKKyAgICAgICAgY29uc3QgSU5UICAgICAgIG1lYW5QZSwKKyAgICAgICAgRUxFTUVOVF9CSVRTICAgICplbEJpdHNbKDgpXSwKKyAgICAgICAgSU5UICAgICAgICAgICAgIGludlF1YW50LAorICAgICAgICBJTlQgICAgICAgICAgICAgbkVsZW1lbnRzLAorICAgICAgICBJTlQgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLAorICAgICAgICBJTlQgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgSU5UICAgICAgICAgICAgIGFkdmFuY2VkQml0c1RvUGUsCisgICAgICAgIEZJWFBfREJMICAgICAgICB2YnJRdWFsRmFjdG9yCisgICAgICAgICkKK3sKKyAgSU5UIGk7CisKKyAgRklYUF9EQkwgUE9JTlQ4ID0gRkwyRlhDT05TVF9EQkwoMC44Zik7CisgIEZJWFBfREJMIFBPSU5UNiA9IEZMMkZYQ09OU1RfREJMKDAuNmYpOworCisgIC8qIGNvbW1vbiBmb3IgYWxsIGVsZW1lbnRzOiAqLworICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVIaWdoICA9IChGSVhQX0RCTCkweDc5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjk1Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweGY5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgyNjY2NjY2NjsgLyogRkwyRlhDT05TVF9EQkwoMC4zZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kTG93ICA9IChGSVhQX0RCTCkweDE5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4ZjMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjEwZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U3BlbmQgICA9IChGSVhQX0RCTCkweDMzMzMzMzMzOyAvKiBGTDJGWENPTlNUX0RCTCgwLjRmKTsgKi8KKworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUhpZ2ggID0gKEZJWFBfREJMKTB4NWZmZmZmZmY7IC8qIEZMMkZYQ09OU1RfREJMKDAuNzVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDAwMDAwMDAwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjBmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kSGlnaCA9IChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5ODsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgICA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjVmKTsgKi8KKworICAvKiBzcGVjaWZpYyBmb3IgZWFjaCBlbGVtZW50OiAqLworICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgIEFUU19FTEVNRU5UKiBhdHNFbGVtID0gaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldOworICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0gPSAmYXRzRWxlbS0+bWluU25yQWRhcHRQYXJhbTsKKyAgICBJTlQgY2hCaXRyYXRlID0gZWxCaXRzW2ldLT5jaEJpdHJhdGVFbDsKKworICAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCisgICAgYXRzRWxlbS0+cGVNaW4gPSBmTXVsdEkoUE9JTlQ4LCBtZWFuUGUpID4+IDE7CisgICAgYXRzRWxlbS0+cGVNYXggPSBmTXVsdEkoUE9JTlQ2LCBtZWFuUGUpOworCisgICAgLyogZm9yIHVzZSBpbiBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUiAqLworICAgIGF0c0VsZW0tPmNoYW9zTWVhc3VyZU9sZCA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOworCisgICAgLyogYWRkaXRpb25hbCBwZSBvZmZzZXQgdG8gY29ycmVjdCBwZTJiaXRzIGZvciBsb3cgYml0cmF0ZXMgKi8KKyAgICBhdHNFbGVtLT5wZU9mZnNldCA9IDA7CisKKyAgICAvKiB2YnIgaW5pdGlhbGlzYXRpb24gKi8KKyAgICBhdHNFbGVtLT52YnJRdWFsRmFjdG9yID0gdmJyUXVhbEZhY3RvcjsKKyAgICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApCisgICAgeworICAgICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBmaXhNYXgoNTAsIDEwMC1mTXVsdEkoKEZJWFBfREJMKTB4NjY2NjY3LCBjaEJpdHJhdGUpKTsKKyAgICB9CisKKyAgICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKKyAgICAgIGF0c0VsZW0tPmFoUGFyYW0ubW9kaWZ5TWluU25yID0gVFJVRTsKKyAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMTU7CisgICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKKyAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMDsKKyAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMDsKKyAgICB9CisKKyAgICAvKiBtaW5TbnIgYWRhcHRhdGlvbiAqLworICAgIG1zYVBhcmFtLT5tYXhSZWQgPSBGTDJGWENPTlNUX0RCTCgwLjAwMzkwNjI1Zik7IC8qIDAuMjVmLzY0LjBmICovCisgICAgLyogc3RhcnQgYWRhcHRhdGlvbiBvZiBtaW5TbnIgZm9yIGF2Z0VuL3NmYkVuID4gc3RhcnRSYXRpbyAqLworICAgIG1zYVBhcmFtLT5zdGFydFJhdGlvID0gRkwyRlhDT05TVF9EQkwoMC4wNTE5MDUxMjY0OGYpOyAvKiBsZDY0KDEwLjBmKSAqLworICAgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCisgICAgICAgYXZnRW4vc2ZiRW4gPj0gbWF4UmF0aW8gKi8KKyAgICAvKiBtc2FQYXJhbS0+bWF4UmF0aW8gPSAxMDAwLjBmOyAqLworICAgIC8qbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gKChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPm1heFJlZCkgLyAoKGZsb2F0KTEwLjBmKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvL21zYVBhcmFtLT5tYXhSYXRpbykvbG9nMTAoMi4wZikqKGZsb2F0KTAuMzAxMDI5OTk1NmYpOyovCisgICAgbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gRkwyRlhDT05TVF9EQkwoLTAuMzc1Zik7IC8qIC0wLjAzNzVmICogMTAuMGYgKi8KKyAgICAvKm1zYVBhcmFtLT5yZWRPZmZzID0gKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgKiAoZmxvYXQpMTAuMGYgKiBsb2cxMChtc2FQYXJhbS0+c3RhcnRSYXRpbykvbG9nMTAoMi4wZikgKiAoZmxvYXQpMC4zMDEwMjk5OTU2ZjsqLworICAgIG1zYVBhcmFtLT5yZWRPZmZzID0gRkwyRlhDT05TVF9EQkwoMC4wMjE0ODQzNzUpOyAvKiAxLjM3NWYvNjQuMGYgKi8KKworICAgIC8qIGluaXQgcGUgY29ycmVjdGlvbiAqLworICAgIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3Rvcl9tID0gRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIDEuMCAqLworICAgIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3Rvcl9lID0gMTsKKworICAgIGF0c0VsZW0tPmR5bkJpdHNMYXN0ID0gLTE7CisgICAgYXRzRWxlbS0+cGVMYXN0ID0gMDsKKworICAgIC8qIGluaXQgYml0cyB0byBwZSBmYWN0b3IgKi8KKworICAgIC8qIGluaXQgYml0czJQZUZhY3RvciAqLworICAgIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKKyAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfZSwKKyAgICAgICAgICAgICAgY2hCaXRyYXRlLCAgICAgICAvKiBiaXRyYXRlL2NoYW5uZWwqLworICAgICAgICAgICAgICBuQ2hhbm5lbHNFZmYsICAgIC8qIG51bWJlciBvZiBjaGFubmVscyAqLworICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICBhZHZhbmNlZEJpdHNUb1BlLAorICAgICAgICAgICAgICBpbnZRdWFudAorICAgICAgICAgICAgICApOworCisgIH0gLyogZm9yIG5FbGVtZW50cyAqLworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24KKyAgICBkZXNjcmlwdGlvbjogIGNhbGMgZGVzaXJlZCBwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24oCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgY29ycmVjdGlvbkZhY19tLAorICAgICAgICBJTlQgKmNvbnN0ICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUFjdCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUxhc3QsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0c0xhc3QsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZQorICAgICAgICApCit7CisgIGlmICggKGJpdHNMYXN0ID4gMCkgJiYgKHBlQWN0IDwgMS41ZipwZUxhc3QpICYmIChwZUFjdCA+IDAuN2YqcGVMYXN0KSAmJgorICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMmYvMi5mKSwgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lKzEpID4gcGVMYXN0KSAmJgorICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjVmKSwgICAgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lICApIDwgcGVMYXN0KSApCisgIHsKKyAgICBGSVhQX0RCTCBjb3JyRmFjID0gKmNvcnJlY3Rpb25GYWNfbTsKKworICAgIGludCBzY2FsaW5nID0gMDsKKyAgICBGSVhQX0RCTCBkZW51bSA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKTsKKyAgICBGSVhQX0RCTCBuZXdGYWMgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcGVMYXN0LCBkZW51bSwgJnNjYWxpbmcpOworCisgICAgLyogZGVhZCB6b25lLCBuZXdGYWMgYW5kIGNvcnJGYWMgYXJlIHNjYWxlZCBieSAwLjUgKi8KKyAgICBpZiAoKEZJWFBfREJMKXBlTGFzdCA8PSBkZW51bSkgeyAvKiByYXRpbyA8PSAxLmYgKi8KKyAgICAgIG5ld0ZhYyA9IGZpeE1heChzY2FsZVZhbHVlKGZpeE1pbiggZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZi8yLmYpLCBuZXdGYWMpLCBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKCAgMS5mLzIuZiksIC1zY2FsaW5nKSksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgwLjg1Zi8yLmYpICk7CisgICAgfQorICAgIGVsc2UgeyAvKiByYXRpbyA8IDEuZiAqLworICAgICBuZXdGYWMgPSBmaXhNYXgoIGZpeE1pbiggc2NhbGVWYWx1ZShmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmLzIuZiksIG5ld0ZhYyksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgxLjE1Zi8yLmYpICksIEZMMkZYQ09OU1RfREJMKCAgIDEuZi8yLmYpICk7CisgICAgfQorCisgICAgaWYgKCAgICgobmV3RmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpICYmIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpKQorICAgICAgICB8fCAoKG5ld0ZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSAmJiAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSkpCisgICAgeworICAgICAgY29yckZhYyA9IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpOworICAgIH0KKworICAgIC8qIGZhc3RlciBhZGFwdGF0aW9uIHRvd2FyZHMgMS4wLCBzbG93ZXIgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLworICAgIGlmICggKGNvcnJGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSAmJiBuZXdGYWMgPCBjb3JyRmFjKQorICAgICAgfHwgKGNvcnJGYWMgPiBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSAmJiBuZXdGYWMgPiBjb3JyRmFjKSApCisgICAgeworICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuODVmKSwgY29yckZhYykgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjE1ZiksIG5ld0ZhYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCBjb3JyRmFjKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuM2YpLCBuZXdGYWMpOworICAgIH0KKworICAgIGNvcnJGYWMgPSBmaXhNYXgoIGZpeE1pbiggY29yckZhYywgRkwyRlhDT05TVF9EQkwoMS4xNWYvMi5mKSApLCBGTDJGWENPTlNUX0RCTCgwLjg1LzIuZikgKTsKKworICAgICpjb3JyZWN0aW9uRmFjX20gPSBjb3JyRmFjOworICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOworICB9CisgIGVsc2UgeworICAgICpjb3JyZWN0aW9uRmFjX20gPSBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKTsKKyAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uTG93Qml0UmVzKAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfbSwKKyAgICAgICAgSU5UICpjb25zdCAgICAgICAgICAgICAgICBjb3JyZWN0aW9uRmFjX2UsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgcGVMYXN0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHNMYXN0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHJlc0xldmVsLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lCisgICAgICAgICkKK3sKKyAgLyogdHVuaW5nIHBhcmFtcyAqLworICBjb25zdCBGSVhQX0RCTCBhbXAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wMDUpOworICBjb25zdCBGSVhQX0RCTCBtYXhEaWZmID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOworCisgIGlmIChiaXRzTGFzdCA+IDApIHsKKworICAgIC8qIEVzdGltYXRlIGRldmlhdGlvbiBvZiBncmFudGVkIGFuZCB1c2VkIGR5bmFtaWMgYml0cyBpbiBwcmV2aW91cyBmcmFtZSwgaW4gUEUgdW5pdHMgKi8KKyAgICBjb25zdCBpbnQgYml0c0JhbExhc3QgPSBwZUxhc3QgLSBGREthYWNFbmNfYml0czJwZTIoCisgICAgICAgICAgYml0c0xhc3QsCisgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAorICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CisKKyAgICAvKiByZXNlcnZlIG4gYml0cyBwZXIgY2hhbm5lbCAqLworICAgIGludCBoZWFkcm9vbSA9IChiaXRyZXNMZXZlbD49NTAqbkNoYW5uZWxzKSA/IDAgOiAoMTAwKm5DaGFubmVscyk7CisKKyAgICAvKiBpbiBQRSB1bml0cyAqLworICAgIGhlYWRyb29tID0gRkRLYWFjRW5jX2JpdHMycGUyKAorICAgICAgICAgIGhlYWRyb29tLAorICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UpOworCisgICAgLyoKKyAgICAgKiBkaWZmID0gYW1wICogKChiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSAvIChiaXRyZXNMZXZlbCArIGhlYWRyb29tKQorICAgICAqIGRpZmYgPSBtYXggKCBtaW4gKCBkaWZmLCBtYXhEaWZmLCAtbWF4RGlmZikpIC8gMgorICAgICAqLworICAgIEZJWFBfREJMIGRlbm9taW5hdG9yID0gKEZJWFBfREJMKUZES2FhY0VuY19iaXRzMnBlMihiaXRyZXNMZXZlbCwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpICsgKEZJWFBfREJMKWhlYWRyb29tOworCisgICAgaW50IHNjYWxpbmcgPSAwOworICAgIEZJWFBfREJMIGRpZmYgPSAoYml0c0JhbExhc3Q+PWhlYWRyb29tKQorICAgICAgICAgPyAgZk11bHQoYW1wLCBmRGl2Tm9ybSggKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwgZGVub21pbmF0b3IsICZzY2FsaW5nKSkKKyAgICAgICAgIDogLWZNdWx0KGFtcCwgZkRpdk5vcm0oLShGSVhQX0RCTCkoYml0c0JhbExhc3QgLSBoZWFkcm9vbSksIGRlbm9taW5hdG9yLCAmc2NhbGluZykpIDsKKworICAgIHNjYWxpbmcgLT0gMTsgLyogZGl2aWRlIGJ5IDIgKi8KKworICAgIGRpZmYgPSAoc2NhbGluZzw9MCkgPyBGREttYXgoIEZES21pbiAoZGlmZj4+KC1zY2FsaW5nKSwgbWF4RGlmZj4+MSksIC1tYXhEaWZmPj4xKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBGREttYXgoIEZES21pbiAoZGlmZiwgbWF4RGlmZj4+KDErc2NhbGluZykpLCAtbWF4RGlmZj4+KDErc2NhbGluZykpIDw8IHNjYWxpbmc7CisKKyAgICAvKgorICAgICAqIGNvcnJGYWMgKz0gZGlmZgorICAgICAqIGNvcnJGYWMgPSBtYXggKCBtaW4gKCBjb3JyRmFjLzIuZiwgMS5mLzIuZiwgMC43NWYvMi5mICkgKQorICAgICAqLworICAgICpjb3JyZWN0aW9uRmFjX20gPSBGREttYXgoRkRLbWluKCgqY29ycmVjdGlvbkZhY19tKStkaWZmLCBGTDJGWENPTlNUX0RCTCgxLjBmLzIuZikpLCBGTDJGWENPTlNUX0RCTCgwLjc1Zi8yLmYpKSA7CisgICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDAuNzUvMi5mKTsKKyAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKKyAgfQorfQorCit2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKKyAgICBBVFNfRUxFTUVOVCAgICAgICAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgIFBTWV9PVVRfQ0hBTk5FTCAgICpwc3lPdXRDaGFubmVsWygyKV0sCisgICAgUEVfREFUQSAgICAgICAgICAgKnBlRGF0YSwKKyAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlLAorICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGVDb3JyLAorICAgIGNvbnN0IElOVCAgICAgICAgIG5DaGFubmVscywKKyAgICBjb25zdCBJTlQgICAgICAgICBjb21tb25XaW5kb3csCisgICAgY29uc3QgSU5UICAgICAgICAgZ3JhbnRlZER5bkJpdHMsCisgICAgY29uc3QgSU5UICAgICAgICAgYml0cmVzQml0cywKKyAgICBjb25zdCBJTlQgICAgICAgICBtYXhCaXRyZXNCaXRzLAorICAgIGNvbnN0IEZJWFBfREJMICAgIG1heEJpdEZhYywKKyAgICBjb25zdCBJTlQgICAgICAgICBiaXREaXN0cmlidXRpb25Nb2RlKQoreworICBGSVhQX0RCTCBiaXRGYWN0b3I7CisgIElOVCBub1JlZFBlID0gcGVEYXRhLT5wZTsKKworICAvKiBwcmVmZXIgc2hvcnQgd2luZG93cyBmb3IgY2FsY3VsYXRpb24gb2YgYml0RmFjdG9yICovCisgIElOVCBjdXJXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOworICBpZiAobkNoYW5uZWxzPT0yKSB7CisgICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB8fAorICAgICAgICAocHN5T3V0Q2hhbm5lbFsxXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKKyAgICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGN1cldpbmRvd1NlcXVlbmNlID0gcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlOworICB9CisKKyAgaWYgKGdyYW50ZWREeW5CaXRzID49IDEpIHsKKyAgICBpZiAoYml0RGlzdHJpYnV0aW9uTW9kZSE9MCkgeworICAgICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMihncmFudGVkRHluQml0cywgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAvKiBmYWN0b3IgZGVwZW5kZW5kIG9uIGN1cnJlbnQgZmlsbCBsZXZlbCBhbmQgcGUgKi8KKyAgICBiaXRGYWN0b3IgPSBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYyhiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyV2luZG93U2VxdWVuY2UsIGdyYW50ZWREeW5CaXRzLCBtYXhCaXRGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIC8qIGRlc2lyZWQgcGUgZm9yIGFjdHVhbCBmcmFtZSAqLworICAgIC8qIFdvcnN0IGNhc2UgbWF4IG9mIGdyYW50ZWREeW5CaXRzIGlzID0gMTAyNCAqIDUuMjcgKiAyICovCisgICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMihncmFudGVkRHluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGJpdEZhY3RvciwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20pLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSsoREZSQUNUX0JJVFMtMS1RX0JJVEZBQykKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgICpncmFudGVkUGUgPSAwOyAvKiBwcmV2ZW50IGRpdnNpb24gYnkgMCAqLworICB9CisKKyAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLworICBzd2l0Y2ggKGJpdERpc3RyaWJ1dGlvbk1vZGUpIHsKKyAgY2FzZSAyOgorICBjYXNlIDE6CisgICAgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCisgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tLAorICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKKyAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAorICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwKKyAgICAgICAgICAgIGJpdHJlc0JpdHMsCisgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lCisgICAgICAgICk7CisgICAgYnJlYWs7CisgIGNhc2UgMDoKKyAgZGVmYXVsdDoKKyAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbigKKyAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCisgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9lLAorICAgICAgICAgICAgZml4TWluKCpncmFudGVkUGUsIG5vUmVkUGUpLAorICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsCisgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0LAorICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCisgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZQorICAgICAgICAgICAgKTsKKyAgICBicmVhazsKKyAgfQorCisgICpncmFudGVkUGVDb3JyID0gKElOVCkoZk11bHQoKEZJWFBfREJMKSgqZ3JhbnRlZFBlPDxRX0FWR0JJVFMpLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tKSA+PiAoUV9BVkdCSVRTLUFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UpKTsKKworICAvKiB1cGRhdGUgbGFzdCBwZSAqLworICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCA9ICpncmFudGVkUGU7CisgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QgPSAtMTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMKK2Rlc2NyaXB0aW9uOiAgYWRqdXN0IHRocmVzaG9sZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhBVFNfRUxFTUVOVCogICAgICAgIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgIHFjRWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICAgIHFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICAgIHBzeU91dEVsZW1lbnRbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBDQlJiaXRyYXRlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICBjbSkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoQ0JSYml0cmF0ZU1vZGUpCisgICAgeworICAgICAgICAvKiBJbiBjYXNlLCBubyBiaXRzIG11c3QgYmUgc2hpZnRlZCBiZXR3ZWVuIGRpZmZlcmVudCBlbGVtZW50cywgKi8KKyAgICAgICAgLyogYW4gZWxlbWVudC13aXNlIGV4ZWN1dGlvbiBvZiB0aGUgcGUtZGVwZW5kZW50IHRocmVzaG9sZC0gKi8KKyAgICAgICAgLyogYWRhcHRpb24gYmVjb21lcyBuZWNlc3NhcnkuLi4gKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKworICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlID0gMjAwMDsgKi8gIC8qIFVzZSB0aGlzIG9ubHkgZm9yIGRlYnVnZ2luZyAqLworICAgICAgICAgICAgICAgICAgICAvL2lmICh0b3RhbEdyYW50ZWRQZUNvcnIgPCB0b3RhbE5vUmVkUGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlIDwgcWNFbGVtZW50W2ldLT5wZURhdGEucGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGMgdGhyZXNob2xkIG5lY2Vzc2FyeSBmb3IgZGVzaXJlZCBwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZUNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgLyogUHJvY2VzcyBvbmx5IDEgZWxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsgICAgICAgIC8qIFByb2Nlc3MgZXhhY3RseSBUSElTIGVsZW1lbnQgKi8KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisKKyAgICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKworICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBmb3IgVkJSLW1vZGUgKi8KKyAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIocWNFbGVtZW50W2ldLT5xY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnRbaV0tPnRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFtpXS0+cGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWwpOworICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLworCisgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLworCisgICAgfQorICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgICBpbnQgY2gsc2ZiLHNmYkdycDsKKyAgICAgICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCisgICAgICAgIC8qIHdlaWdodCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyAqLworICAgICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHBRY091dENoID0gcWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSArPSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRkRLYWFjRW5jX0FkalRockNsb3NlKEFESl9USFJfU1RBVEUqKiBwaEFkalRocikKK3sKKyAgICBJTlQgaTsKKyAgICBBREpfVEhSX1NUQVRFKiBoQWRqVGhyID0gKnBoQWRqVGhyOworCisgICAgaWYgKGhBZGpUaHIhPU5VTEwpIHsKKyAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CisgICAgICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0hPU5VTEwpIHsKKyAgICAgICAgICBGcmVlUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQoJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZyZWVSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZChwaEFkalRocik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmggYi9hYWMvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliMWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2Fkal90aHIuaApAQCAtMCwwICsxLDE0NyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQURKX1RIUl9ICisjZGVmaW5lIF9fQURKX1RIUl9ICisKKworI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJsaW5lX3BlLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKKwordm9pZCBGREthYWNFbmNfcGVDYWxjdWxhdGlvbigKKyAgICAgICAgUEVfREFUQSAqcGVEYXRhLAorICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCisgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMKKyAgICAgICAgKTsKKworSU5UICBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUqKiBwaEFkalRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbkVsZW1lbnRzKTsKKwordm9pZCBGREthYWNFbmNfQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCBwZU1lYW4sCisgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHNbKDgpXSwKKyAgICAgICAgICAgICAgICBJTlQgaW52UXVhbnQsCisgICAgICAgICAgICAgICAgSU5UIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAorICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIElOVCBhZHZhbmNlZEJpdHNUb1BlLAorICAgICAgICAgICAgICAgIEZJWFBfREJMIHZiclF1YWxGYWN0b3IpOworIAorCit2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKKyAgICBBVFNfRUxFTUVOVCAgICAgICAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgIFBTWV9PVVRfQ0hBTk5FTCAgICpwc3lPdXRDaGFubmVsWygyKV0sCisgICAgUEVfREFUQSAgICAgICAgICAgKnBlRGF0YSwKKyAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlLAorICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGVDb3JyLAorICAgIGNvbnN0IElOVCAgICAgICAgIG5DaGFubmVscywKKyAgICBjb25zdCBJTlQgICAgICAgICBjb21tb25XaW5kb3csCisgICAgY29uc3QgSU5UICAgICAgICAgYXZnQml0cywKKyAgICBjb25zdCBJTlQgICAgICAgICBiaXRyZXNCaXRzLAorICAgIGNvbnN0IElOVCAgICAgICAgIG1heEJpdHJlc0JpdHMsCisgICAgY29uc3QgRklYUF9EQkwgICAgbWF4Qml0RmFjLAorICAgIGNvbnN0IElOVCAgICAgICAgIGJpdERpc3RyaWJ1dGlvbk1vZGUpOworCit2b2lkIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKEFUU19FTEVNRU5UKiBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKKyAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKKyAgICBRQ19PVVQqICAgICAgICAgICBxY091dCwKKyAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50Wyg4KV0sCisgICAgSU5UICAgICAgICAgICAgICAgQ0JSYml0cmF0ZU1vZGUsCisgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20pOworCit2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFKiogaEFkalRocik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmggYi9hYWMvbGliQUFDZW5jL3NyYy9hZGpfdGhyX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI3Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmgKQEAgLTAsMCArMSwxNTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAorICAgY29udGVudHMvZGVzY3JpcHRpb246IHRocmVzaG9sZCBjYWxjdWxhdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQURKX1RIUl9EQVRBX0gKKyNkZWZpbmUgX19BREpfVEhSX0RBVEFfSAorCisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgRklYUF9EQkwgY2xpcFNhdmVMb3csIGNsaXBTYXZlSGlnaDsKKyAgIEZJWFBfREJMIG1pbkJpdFNhdmUsIG1heEJpdFNhdmU7CisgICBGSVhQX0RCTCBjbGlwU3BlbmRMb3csIGNsaXBTcGVuZEhpZ2g7CisgICBGSVhQX0RCTCBtaW5CaXRTcGVuZCwgbWF4Qml0U3BlbmQ7Cit9IEJSRVNfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIElOVCBtb2RpZnlNaW5TbnI7CisgICBJTlQgc3RhcnRTZmJMLCBzdGFydFNmYlM7Cit9IEFIX1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIG1heFJlZDsKKyAgRklYUF9EQkwgc3RhcnRSYXRpbzsKKyAgRklYUF9EQkwgbWF4UmF0aW87CisgIEZJWFBfREJMIHJlZFJhdGlvRmFjOworICBGSVhQX0RCTCByZWRPZmZzOworfSBNSU5TTlJfQURBUFRfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzZXJ2b2lyIGNvbnRyb2wgKi8KKyAgSU5UIHBlTWluLCBwZU1heDsKKyAgLyogY29uc3RhbnQgb2Zmc2V0IHRvIHBlICAgICAgICAgICAgICAgKi8KKyAgSU5UICAgIHBlT2Zmc2V0OworICAvKiBjb25zdGFudCBQZUZhY3RvciAqLworICBGSVhQX0RCTCBiaXRzMlBlRmFjdG9yX207CisgIElOVCAgICAgIGJpdHMyUGVGYWN0b3JfZTsKKyAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KKyAgQUhfUEFSQU0gYWhQYXJhbTsKKyAgLyogdmFsdWVzIGZvciBjb3JyZWN0aW9uIG9mIHBlICovCisgIC8qIHBhcmFtdGVycyBmb3IgYWRhcHRhdGlvbiBvZiBtaW5TbnIgKi8KKyAgTUlOU05SX0FEQVBUX1BBUkFNIG1pblNuckFkYXB0UGFyYW07CisgIElOVCBwZUxhc3Q7CisgIElOVCBkeW5CaXRzTGFzdDsKKyAgRklYUF9EQkwgcGVDb3JyZWN0aW9uRmFjdG9yX207CisgIElOVCAgICAgIHBlQ29ycmVjdGlvbkZhY3Rvcl9lOworCisgIC8qIHZiciBlbmNvZGluZyAqLworICBGSVhQX0RCTCB2YnJRdWFsRmFjdG9yOworICBGSVhQX0RCTCBjaGFvc01lYXN1cmVPbGQ7CisKKyAgLyogdGhyZXNob2xkIHdlaWdodGluZyAqLworICBGSVhQX0RCTCBjaGFvc01lYXN1cmVFbkZhY1soMildOworICBJTlQgICAgICBsYXN0RW5GYWNQYXRjaFsoMildOworCit9IEFUU19FTEVNRU5UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEJSRVNfUEFSQU0gYnJlc1BhcmFtTG9uZywgYnJlc1BhcmFtU2hvcnQ7CisgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1bKDgpXTsKK30gQURKX1RIUl9TVEFURTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxZjdhOAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2JhbmRfbnJnLmNwcApAQCAtMCwwICsxLDM1OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFuZF9ucmcuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYworICBkZXNjcmlwdGlvbjoKKyAgaW5wdXQ6CisgIG91dHB1dDoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBudW1CYW5kcykKK3sKKyAgSU5UIGksajsKKyAgRklYUF9EQkwgbWF4U3BjLCB0bXA7CisKKyAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7CisgICAgbWF4U3BjID0gKEZJWFBfREJMKTA7CisgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspIHsKKyAgICAgIHRtcCA9IGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtqXSk7CisgICAgICBtYXhTcGMgPSBmaXhNYXgobWF4U3BjLCB0bXApOworICAgIH0KKyAgICBzZmJNYXhTY2FsZVNwZWNbaV0gPSAobWF4U3BjPT0oRklYUF9EQkwpMCkgPyAoREZSQUNUX0JJVFMtMikgOiBDbnRMZWFkaW5nWmVyb3MobWF4U3BjKS0xOworICAgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltCisgIGRlc2NyaXB0aW9uOgorICBpbnB1dDoKKyAgb3V0cHV0OgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGSVhQX0RCTAorRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG1pblNwZWNTaGlmdCkKK3sKKyAgSU5UIGksIGosIHNjYWxlLCBuciA9IDA7CisgIEZJWFBfREJMIG1heE5yZ0xkID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICBGSVhQX0RCTCBtYXhOcmcgPSAwOworICBGSVhQX0RCTCBzcGVjOworCisgIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykgeworICAgIHNjYWxlID0gZml4TWF4KDAsIHNmYk1heFNjYWxlU3BlY1tpXS00KTsKKyAgICBGSVhQX0RCTCB0bXAgPSAwOworICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKXsKKyAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdPDxzY2FsZTsKKyAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKKyAgICB9CisgICAgYmFuZEVuZXJneVtpXSA9IHRtcDw8MTsKKworICAgIC8qIGNhbGN1bGF0ZSBsZCBvZiBiYW5kTnJnLCBzdWJ0cmFjdCBzY2FsaW5nICovCisgICAgYmFuZEVuZXJneUxkRGF0YVtpXSA9IENhbGNMZERhdGEoYmFuZEVuZXJneVtpXSk7CisgICAgaWYgKGJhbmRFbmVyZ3lMZERhdGFbaV0gIT0gRkwyRlhDT05TVF9EQkwoLTEuMGYpKSB7CisgICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNjYWxlKkZMMkZYQ09OU1RfREJMKDIuMC82NCk7CisgICAgfQorICAgIC8qIGZpbmQgaW5kZXggb2YgbWF4TnJnICovCisgICAgaWYgKGJhbmRFbmVyZ3lMZERhdGFbaV0gPiBtYXhOcmdMZCkgeworICAgICAgICBtYXhOcmdMZCA9IGJhbmRFbmVyZ3lMZERhdGFbaV07CisgICAgICAgIG5yID0gaTsKKyAgICB9CisgIH0KKworICAvKiByZXR1cm4gdW5zY2FsZWQgbWF4TnJnKi8KKyAgc2NhbGUgPSBmaXhNYXgoMCxzZmJNYXhTY2FsZVNwZWNbbnJdLTQpOworICBzY2FsZSA9IGZpeE1heCgyKihtaW5TcGVjU2hpZnQtc2NhbGUpLC0oREZSQUNUX0JJVFMtMSkpOworCisgIG1heE5yZyA9IHNjYWxlVmFsdWUoYmFuZEVuZXJneVtucl0sIHNjYWxlKTsKKworICByZXR1cm4gbWF4TnJnOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcKKyAgZGVzY3JpcHRpb246CisgIGlucHV0OgorICBvdXRwdXQ6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1Mb25nKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEpCit7CisgIElOVCBpLCBqLCBzaGlmdEJpdHMgPSAwOworICBGSVhQX0RCTCBtYXhOcmdMZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIEZJWFBfREJMIHNwZWM7CisKKyAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7CisgICAgIElOVCBsZWFkaW5nQml0cyA9IHNmYk1heFNjYWxlU3BlY1tpXS00OyAgICAgICAgICAgIC8qIG1heCBzZmJXaWR0aCA9IDk2IDsgMl43PTEyOCA9PiA3LzIgPSA0IChzcGMqc3BjKSAqLworICAgICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjApOworICAgICAvKiBkb24ndCB1c2Ugc2NhbGVWYWx1ZSgpIGhlcmUsIGl0IGluY3JlYXNlcyB3b3JrbG9hZCBxdWl0ZSBzdWZmaWNpZW50bHkuLi4gKi8KKyAgICAgaWYgKGxlYWRpbmdCaXRzPj0wKSB7CisgICAgICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykgeworICAgICAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdPDxsZWFkaW5nQml0czsKKyAgICAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgfSBlbHNlIHsKKyAgICAgICAgSU5UIHNoaWZ0ID0gLWxlYWRpbmdCaXRzOworICAgICAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTtqPGJhbmRPZmZzZXRbaSsxXTtqKyspeworICAgICAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdPj5zaGlmdDsKKyAgICAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgfQorICAgICBiYW5kRW5lcmd5W2ldID0gdG1wPDwxOworICB9CisKKyAgLyogY2FsY3VsYXRlIGxkIG9mIGJhbmROcmcsIHN1YnRyYWN0IHNjYWxpbmcgKi8KKyAgTGREYXRhVmVjdG9yKGJhbmRFbmVyZ3ksIGJhbmRFbmVyZ3lMZERhdGEsIG51bUJhbmRzKTsKKyAgZm9yKGk9bnVtQmFuZHM7IGktLSE9MDsgKSB7CisgICAgICBGSVhQX0RCTCBzY2FsZURpZmYgPSAoc2ZiTWF4U2NhbGVTcGVjW2ldLTQpKkZMMkZYQ09OU1RfREJMKDIuMC82NCk7CisKKyAgICAgIGJhbmRFbmVyZ3lMZERhdGFbaV0gPSAoYmFuZEVuZXJneUxkRGF0YVtpXSA+PSAoKEZMMkZYQ09OU1RfREJMKC0xLmYpPj4xKSArIChzY2FsZURpZmY+PjEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBiYW5kRW5lcmd5TGREYXRhW2ldLXNjYWxlRGlmZiA6IEZMMkZYQ09OU1RfREJMKC0xLmYpOworICAgICAgLyogZmluZCBtYXhOcmdMZCAqLworICAgICAgbWF4TnJnTGQgPSBmaXhNYXgobWF4TnJnTGQsIGJhbmRFbmVyZ3lMZERhdGFbaV0pOworICB9CisKKyAgaWYgKG1heE5yZ0xkPD0oRklYUF9EQkwpMCkKKyAgeworICAgICBmb3IoaT1udW1CYW5kczsgaS0tIT0wOyApCisgICAgIHsKKyAgICAgICAgIElOVCBzY2FsZSA9IGZpeE1pbigoc2ZiTWF4U2NhbGVTcGVjW2ldLTQpPDwxLChERlJBQ1RfQklUUy0xKSk7CisgICAgICAgICBiYW5kRW5lcmd5W2ldID0gc2NhbGVWYWx1ZShiYW5kRW5lcmd5W2ldLCAtc2NhbGUpOworICAgICB9CisgICAgIHJldHVybiAwOworICB9CisgIGVsc2UKKyAgeyAgLyogc2NhbGUgZG93biBOUkdzICovCisgICAgIHdoaWxlIChtYXhOcmdMZD5GTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgeworICAgICAgICBtYXhOcmdMZCAtPSAgRkwyRlhDT05TVF9EQkwoMi4wLzY0KTsKKyAgICAgICAgc2hpZnRCaXRzKys7CisgICAgIH0KKyAgICAgZm9yKGk9bnVtQmFuZHM7IGktLSE9MDsgKQorICAgICB7CisgICAgICAgICBJTlQgc2NhbGUgPSBmaXhNaW4oICgoc2ZiTWF4U2NhbGVTcGVjW2ldLTQpK3NoaWZ0Qml0cyk8PDEsIChERlJBQ1RfQklUUy0xKSk7CisgICAgICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNoaWZ0Qml0cypGTDJGWENPTlNUX0RCTCgyLjAvNjQpOworICAgICAgICAgYmFuZEVuZXJneVtpXSA9IHNjYWxlVmFsdWUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKKyAgICAgfQorICAgICByZXR1cm4gc2hpZnRCaXRzOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydAorICBkZXNjcmlwdGlvbjoKKyAgaW5wdXQ6CisgIG91dHB1dDoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydChjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneSkKK3sKKyAgSU5UIGksIGo7CisKKyAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKQorICB7CisgICAgaW50IGxlYWRpbmdCaXRzID0gc2ZiTWF4U2NhbGVTcGVjW2ldLTM7ICAgICAgICAgICAgLyogbWF4IHNmYldpZHRoID0gMzYgOyAyXjY9NjQgPT4gNi8yID0gMyAoc3BjKnNwYykgKi8KKyAgICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjApOworICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykKKyAgICB7CisgICAgICAgRklYUF9EQkwgc3BlYyA9IHNjYWxlVmFsdWUobWRjdFNwZWN0cnVtW2pdLGxlYWRpbmdCaXRzKTsKKyAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKKyAgICB9CisgICAgYmFuZEVuZXJneVtpXSA9IHRtcDsKKyAgfQorCisgIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykKKyAgeworICAgICAgSU5UIHNjYWxlID0gKDIqKHNmYk1heFNjYWxlU3BlY1tpXS0zKSktMTsgICAgICAgICAvKiBtYXggc2ZiV2lkdGggPSAzNiA7IDJeNj02NCA9PiA2LzIgPSAzIChzcGMqc3BjKSAqLworICAgICAgc2NhbGUgPSBmaXhNYXgoZml4TWluKHNjYWxlLChERlJBQ1RfQklUUy0xKSksLShERlJBQ1RfQklUUy0xKSk7CisgICAgICBiYW5kRW5lcmd5W2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKGJhbmRFbmVyZ3lbaV0sIC1zY2FsZSk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdAorICBkZXNjcmlwdGlvbjoKKyAgaW5wdXQ6CisgIG91dHB1dDoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdChjb25zdCBGSVhQX0RCTCAgICpSRVNUUklDVCBtZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICpSRVNUUklDVCBtZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5U2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgY2FsY0xkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGVMZERhdGEpCit7CisgIElOVCBpLCBqLCBtaW5TY2FsZTsKKyAgRklYUF9EQkwgTnJnTWlkLCBOcmdTaWRlLCBzcGVjbSwgc3BlY3M7CisKKyAgZm9yIChpPTA7IGk8bnVtQmFuZHM7IGkrKykgeworCisgICAgTnJnTWlkID0gTnJnU2lkZSA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgICAgbWluU2NhbGUgPSBmaXhNaW4oc2ZiTWF4U2NhbGVTcGVjTGVmdFtpXSwgc2ZiTWF4U2NhbGVTcGVjUmlnaHRbaV0pLTQ7CisgICAgbWluU2NhbGUgPSBmaXhNYXgoMCwgbWluU2NhbGUpOworCisgICAgaWYgKG1pblNjYWxlID4gMCkgeworICAgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07ajxiYW5kT2Zmc2V0W2krMV07aisrKSB7CisgICAgICAgICAgRklYUF9EQkwgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdPDwobWluU2NhbGUtMSk7CisgICAgICAgICAgRklYUF9EQkwgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXTw8KG1pblNjYWxlLTEpOworICAgICAgICAgIHNwZWNtID0gc3BlY0wgKyBzcGVjUjsKKyAgICAgICAgICBzcGVjcyA9IHNwZWNMIC0gc3BlY1I7CisgICAgICAgICAgTnJnTWlkID0gZlBvdzJBZGREaXYyKE5yZ01pZCwgc3BlY20pOworICAgICAgICAgIE5yZ1NpZGUgPSBmUG93MkFkZERpdjIoTnJnU2lkZSwgc3BlY3MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTtqPGJhbmRPZmZzZXRbaSsxXTtqKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCBzcGVjTCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0+PjE7CisgICAgICAgICAgRklYUF9EQkwgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXT4+MTsKKyAgICAgICAgICBzcGVjbSA9IHNwZWNMICsgc3BlY1I7CisgICAgICAgICAgc3BlY3MgPSBzcGVjTCAtIHNwZWNSOworICAgICAgICAgIE5yZ01pZCA9IGZQb3cyQWRkRGl2MihOcmdNaWQsIHNwZWNtKTsKKyAgICAgICAgICBOcmdTaWRlID0gZlBvdzJBZGREaXYyKE5yZ1NpZGUsIHNwZWNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgYmFuZEVuZXJneU1pZFtpXSA9IE5yZ01pZDw8MTsKKyAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IE5yZ1NpZGU8PDE7CisgIH0KKworICBpZihjYWxjTGREYXRhKSB7CisgICAgTGREYXRhVmVjdG9yKGJhbmRFbmVyZ3lNaWQsIGJhbmRFbmVyZ3lNaWRMZERhdGEsIG51bUJhbmRzKTsKKyAgICBMZERhdGFWZWN0b3IoYmFuZEVuZXJneVNpZGUsIGJhbmRFbmVyZ3lTaWRlTGREYXRhLCBudW1CYW5kcyk7CisgIH0KKworICBmb3IgKGk9MDsgaTxudW1CYW5kczsgaSsrKQorICB7CisgICAgSU5UIG1pblNjYWxlID0gZml4TWluKHNmYk1heFNjYWxlU3BlY0xlZnRbaV0sIHNmYk1heFNjYWxlU3BlY1JpZ2h0W2ldKTsKKyAgICBJTlQgc2NhbGUgPSBmaXhNYXgoMCwgMioobWluU2NhbGUtNCkpOworCisgICAgaWYgKGNhbGNMZERhdGEpCisgICAgeworICAgICAgIC8qIHVzaW5nIHRoZSBtaW5pbWFsIHNjYWxpbmcgb2YgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBjYW4gY2F1c2UgdmVyeSBzbWFsbCBlbmVyZ2llczsKKyAgICAgICBjaGVjayBsZE5yZyBiZWZvcmUgc3VidHJhY3Qgc2NhbGluZyBtdWx0aXBsaWNhdGlvbjogZnJhY3QqSU5UIHdlIGRvbid0IG5lZWQgZk11bHQgKi8KKworICAgICAgIGludCBtaW51cyA9IHNjYWxlKkZMMkZYQ09OU1RfREJMKDEuMC82NCk7CisKKyAgICAgICBpZiAoYmFuZEVuZXJneU1pZExkRGF0YVtpXSAhPSBGTDJGWENPTlNUX0RCTCgtMS4wZikpCisgICAgICAgICBiYW5kRW5lcmd5TWlkTGREYXRhW2ldIC09IG1pbnVzOworCisgICAgICAgaWYgKGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldICE9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkKKyAgICAgICAgIGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldIC09IG1pbnVzOworICAgIH0KKyAgICBzY2FsZSA9IGZpeE1pbihzY2FsZSwgKERGUkFDVF9CSVRTLTEpKTsKKyAgICBiYW5kRW5lcmd5TWlkW2ldICA+Pj0gc2NhbGU7CisgICAgYmFuZEVuZXJneVNpZGVbaV0gPj49IHNjYWxlOworICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDBhOGVmCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuaApAQCAtMCwwICsxLDE0OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgorICAgRGVzY3JpcHRpb246IEJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9CQU5EX05SR19ICisjZGVmaW5lIF9CQU5EX05SR19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKwordm9pZAorRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKmJhbmRPZmZzZXQsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG51bUJhbmRzCisgICAgICAgICk7CisKK0ZJWFBfREJMCitGREthYWNFbmNfQ2hlY2tCYW5kRW5lcmd5T3B0aW0oCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICpiYW5kT2Zmc2V0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG51bUJhbmRzLAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgKmJhbmRFbmVyZ3ksCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneUxkRGF0YSwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaW5TcGVjU2hpZnQKKyAgICAgICAgKTsKKworSU5UCitGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICpiYW5kT2Zmc2V0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG51bUJhbmRzLAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgKmJhbmRFbmVyZ3ksCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneUxkRGF0YQorICAgICAgICApOworCit2b2lkCitGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0KAorICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqYmFuZE9mZnNldCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBudW1CYW5kcywKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICpiYW5kRW5lcmd5CisgICAgICAgICk7CisKKwordm9pZCBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdCgKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtTGVmdCwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY0xlZnQsCisgICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY1JpZ2h0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICBudW1CYW5kcywKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGUsCisgICAgICAgIElOVCAgICAgICAgICAgICAgIGNhbGNMZERhdGEsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lNaWRMZERhdGEsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlTGREYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM3ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcApAQCAtMCwwICsxLDM3OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorI2luY2x1ZGUgImJhbmR3aWR0aC5oIgorI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKKwordHlwZWRlZiBzdHJ1Y3R7CisgIElOVCBjaGFuQml0UmF0ZTsKKyAgSU5UIGJhbmRXaWR0aE1vbm87CisgIElOVCBiYW5kV2lkdGgyQW5kTW9yZUNoYW47CisKK30gQkFORFdJRFRIX1RBQjsKKworc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVbXSA9IHsKKyAgezAsICAgICAgMzcwMCwgIDUwMDB9LAorICB7MTIwMDAsICA1MDAwLCAgNjQwMH0sCisgIHsyMDAwMCwgIDY5MDAsICA5NjQwfSwKKyAgezI4MDAwLCAgOTYwMCwgMTMwNTB9LAorICB7NDAwMDAsIDEyMDYwLCAxNDI2MH0sCisgIHs1NjAwMCwgMTM5NTAsIDE1NTAwfSwKKyAgezcyMDAwLCAxNDIwMCwgMTYxMjB9LAorICB7OTYwMDAsIDE3MDAwLCAxNzAwMH0sCisgIHs1NzYwMDEsMTcwMDAsIDE3MDAwfQorfTsKKworCitzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF8yMjA1MFtdID0geworICB7IDgwMDAsICAyMDAwLCAgMjQwMH0sCisgIHsxMjAwMCwgIDI1MDAsICAyNzAwfSwKKyAgezE2MDAwLCAgMzMwMCwgIDMxMDB9LAorICB7MjQwMDAsICA2MjUwLCAgNzIwMH0sCisgIHszMjAwMCwgIDkyMDAsICAxMDUwMH0sCisgIHs0MDAwMCwgIDE2MDAwLCAxNjAwMH0sCisgIHs0ODAwMCwgIDE2MDAwLCAxNjAwMH0sCisgIHszNjAwMDEsIDE2MDAwLCAxNjAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlX0xEXzI0MDAwW10gPSB7CisgIHsgODAwMCwgIDIwMDAsICAyMDAwfSwKKyAgezEyMDAwLCAgMjAwMCwgIDIzMDB9LAorICB7MTYwMDAsICAyMjAwLCAgMjUwMH0sCisgIHsyNDAwMCwgIDU2NTAsICA2NDAwfSwKKyAgezMyMDAwLCAgMTE2MDAsIDEyMDAwfSwKKyAgezQwMDAwLCAgMTIwMDAsIDE2MDAwfSwKKyAgezQ4MDAwLCAgMTYwMDAsIDE2MDAwfSwKKyAgezY0MDAwLCAgMTYwMDAsIDE2MDAwfSwKKyAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQorfTsKKworc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVfTERfMzIwMDBbXSA9IHsKKyAgeyA4MDAwLCAgMjAwMCwgIDIwMDB9LAorICB7MTIwMDAsICAyMDAwLCAgMjAwMH0sCisgIHsyNDAwMCwgIDQyNTAsICA1MjAwfSwKKyAgezMyMDAwLCAgODQwMCwgIDkwMDB9LAorICB7NDAwMDAsICA5NDAwLCAgMTEzMDB9LAorICB7NDgwMDAsICAxMTkwMCwgMTM3MDB9LAorICB7NjQwMDAsICAxNDgwMCwgMTYwMDB9LAorICB7NzYwMDAsICAxNjAwMCwgMTYwMDB9LAorICB7MzYwMDAxLCAxNjAwMCwgMTYwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF80NDEwMFtdID0geworICB7IDgwMDAsICAyMDAwLCAgMjAwMH0sCisgIHsyNDAwMCwgIDIwMDAsICAyMDAwfSwKKyAgezMyMDAwLCAgNDQwMCwgIDU3MDB9LAorICB7NDAwMDAsICA3NDAwLCAgODgwMH0sCisgIHs0ODAwMCwgIDkwMDAsICAxMDcwMH0sCisgIHs1NjAwMCwgIDExMDAwLCAxMjkwMH0sCisgIHs2NDAwMCwgIDE0NDAwLCAxNTUwMH0sCisgIHs4MDAwMCwgIDE2MDAwLCAxNjIwMH0sCisgIHs5NjAwMCwgIDE2NTAwLCAxNjAwMH0sCisgIHsxMjgwMDAsIDE2MDAwLCAxNjAwMH0sCisgIHszNjAwMDEsIDE2MDAwLCAxNjAwMH0KK307CisKK3N0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlX0xEXzQ4MDAwW10gPSB7CisgIHsgODAwMCwgIDIwMDAsICAyMDAwfSwKKyAgezI0MDAwLCAgMjAwMCwgIDIwMDB9LAorICB7MzIwMDAsICA0NDAwLCAgNTcwMH0sCisgIHs0MDAwMCwgIDc0MDAsICA4ODAwfSwKKyAgezQ4MDAwLCAgOTAwMCwgIDEwNzAwfSwKKyAgezU2MDAwLCAgMTEwMDAsIDEyODAwfSwKKyAgezY0MDAwLCAgMTQzMDAsIDE1NDAwfSwKKyAgezgwMDAwLCAgMTYwMDAsIDE2MjAwfSwKKyAgezk2MDAwLCAgMTY1MDAsIDE2MDAwfSwKKyAgezEyODAwMCwgMTYwMDAsIDE2MDAwfSwKKyAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQorfTsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CisgIGludCBiYW5kV2lkdGhNb25vOworICBpbnQgYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworfSBCQU5EV0lEVEhfVEFCX1ZCUjsKKworc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUJfVkJSIGJhbmRXaWR0aFRhYmxlVkJSW109IHsKKyAge0FBQ0VOQ19CUl9NT0RFX0NCUiwgICAgICAgIDAsICAgICAwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCAgMTMwNTAsIDEzMDUwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8yLCAgMTMwNTAsIDEzMDUwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8zLCAgMTQyNjAsIDE0MjYwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCAgMTU1MDAsIDE1NTAwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1ZCUl81LCAgNDgwMDAsIDQ4MDAwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX1NGUiwgICAgICAgIDAsICAgICAwfSwKKyAge0FBQ0VOQ19CUl9NT0RFX0ZGLCAgICAgICAgIDAsICAgICAwfQorCit9OworCitzdGF0aWMgSU5UIEdldEJhbmR3aWR0aEVudHJ5KAorICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICBjb25zdCBJTlQgY2hhbkJpdFJhdGUsCisgICAgICAgICAgICBjb25zdCBJTlQgZW50cnlObykKK3sKKyAgSU5UIGJhbmR3aWR0aCA9IC0xOworICBjb25zdCBCQU5EV0lEVEhfVEFCICpwQndUYWIgPSBOVUxMOworICBJTlQgYndUYWJTaXplID0gMDsKKworICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgY2FzZSAxMDI0OgorICAgICAgcEJ3VGFiID0gYmFuZFdpZHRoVGFibGU7CisgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGUpL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwOgorICAgIGNhc2UgNTEyOgorICAgICAgc3dpdGNoIChzYW1wbGVSYXRlKSB7CisgICAgICAgIGNhc2UgODAwMDoKKyAgICAgICAgY2FzZSAxMTAyNToKKyAgICAgICAgY2FzZSAxMjAwMDoKKyAgICAgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF8yMjA1MDsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMjIwNTApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDAwMDoKKyAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF8yNDAwMDsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMjQwMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMDsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMzIwMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoNDQxMDApOgorICAgICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlX0xEXzQ0MTAwOworICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF80NDEwMCkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ4MDAwOgorICAgICAgICBjYXNlIDY0MDAwOgorICAgICAgICBjYXNlIDg4MjAwOgorICAgICAgICBjYXNlIDk2MDAwOgorICAgICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlX0xEXzQ4MDAwOworICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF80ODAwMCkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHBCd1RhYiA9IE5VTEw7CisgICAgICBid1RhYlNpemUgPSAwOworICB9CisKKyAgaWYgKHBCd1RhYiE9TlVMTCkgeworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPGJ3VGFiU2l6ZS0xOyBpKyspIHsKKyAgICAgIGlmIChjaGFuQml0UmF0ZSA+PSBwQndUYWJbaV0uY2hhbkJpdFJhdGUgJiYKKyAgICAgICAgICBjaGFuQml0UmF0ZSA8IHBCd1RhYltpKzFdLmNoYW5CaXRSYXRlKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICAgICAgY2FzZSAxMDI0OgorICAgICAgICAgICAgYmFuZHdpZHRoID0gKGVudHJ5Tm89PTApCisgICAgICAgICAgICAgID8gcEJ3VGFiW2ldLmJhbmRXaWR0aE1vbm8KKyAgICAgICAgICAgICAgOiBwQndUYWJbaV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0ODA6CisgICAgICAgICAgY2FzZSA1MTI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIElOVCBxX3JlcyA9IDA7CisgICAgICAgICAgICAgIElOVCBzdGFydEJ3ID0gKGVudHJ5Tm89PTApID8gIHBCd1RhYltpICBdLmJhbmRXaWR0aE1vbm8gOiBwQndUYWJbaSAgXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CisgICAgICAgICAgICAgIElOVCBlbmRCdyA9ICAgKGVudHJ5Tm89PTApID8gIHBCd1RhYltpKzFdLmJhbmRXaWR0aE1vbm8gOiBwQndUYWJbaSsxXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CisgICAgICAgICAgICAgIElOVCBzdGFydEJyID0gcEJ3VGFiW2ldLmNoYW5CaXRSYXRlOworICAgICAgICAgICAgICBJTlQgZW5kQnIgPSBwQndUYWJbaSsxXS5jaGFuQml0UmF0ZTsKKworICAgICAgICAgICAgICBGSVhQX0RCTCBid0ZhY19maXggPSBmRGl2Tm9ybShjaGFuQml0UmF0ZS1zdGFydEJyLCBlbmRCci1zdGFydEJyLCAmcV9yZXMpOworICAgICAgICAgICAgICBiYW5kd2lkdGggPSAoSU5UKXNjYWxlVmFsdWUoZk11bHQoYndGYWNfZml4LCAoRklYUF9EQkwpKGVuZEJ3LXN0YXJ0QncpKSxxX3JlcykgKyBzdGFydEJ3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJhbmR3aWR0aCA9IC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfSAvKiB3aXRoaW4gYml0cmF0ZSByYW5nZSAqLworICAgIH0KKyAgfSAvKiBwQndUYWIhPU5VTEwgKi8KKworICByZXR1cm4gYmFuZHdpZHRoOworfQorCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoSU5UKiBiYW5kV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcm9wb3NlZEJhbmRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBlbmNvZGVyTW9kZSkKK3sKKyAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX09LOworICBJTlQgY2hhbkJpdFJhdGUgPSBiaXRyYXRlL2NtLT5uQ2hhbm5lbHM7CisKKyAgLyogdmJyICovCisgIHN3aXRjaChiaXRyYXRlTW9kZSl7CisgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CisgICAgaWYgKHByb3Bvc2VkQmFuZFdpZHRoICE9IDApeworICAgICAgLyogdXNlIGdpdmVuIGJ3ICovCisgICAgICAqYmFuZFdpZHRoID0gcHJvcG9zZWRCYW5kV2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHRha2UgYncgZnJvbSB0YWJsZSAqLworICAgICAgc3dpdGNoKGVuY29kZXJNb2RlKXsKKyAgICAgIGNhc2UgTU9ERV8xOgorICAgICAgICAqYmFuZFdpZHRoID0gYmFuZFdpZHRoVGFibGVWQlJbYml0cmF0ZU1vZGVdLmJhbmRXaWR0aE1vbm87CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzI6CisgICAgICBjYXNlIE1PREVfMV8yOgorICAgICAgY2FzZSBNT0RFXzFfMl8xOgorICAgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6CisgICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICpiYW5kV2lkdGggPSBiYW5kV2lkdGhUYWJsZVZCUltiaXRyYXRlTW9kZV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKKyAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CisgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CisKKyAgICAvKiBiYW5kd2lkdGggbGltaXRpbmcgKi8KKyAgICBpZiAocHJvcG9zZWRCYW5kV2lkdGggIT0gMCkgeworICAgICAgKmJhbmRXaWR0aCA9IEZES21pbihwcm9wb3NlZEJhbmRXaWR0aCwgRkRLbWluKDIwMDAwLCBzYW1wbGVSYXRlPj4xKSk7CisgICAgfQorICAgIGVsc2UgeyAvKiBzZWFyY2ggcmVhc29uYWJsZSBiYW5kd2lkdGggKi8KKworICAgICAgaW50IGVudHJ5Tm8gPSAwOworCisgICAgICBzd2l0Y2goZW5jb2Rlck1vZGUpeworICAgICAgY2FzZSBNT0RFXzE6ICAgICAgICAvKiBtb25vICAgICAgKi8KKyAgICAgICAgZW50cnlObyA9IDA7ICAgICAgLyogdXNlIG1vbm8gYmFuZHdpdGggc2V0dGluZ3MgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTU9ERV8yOiAgICAgICAgLyogc3RlcmVvICAgICovCisgICAgICBjYXNlIE1PREVfMV8yOiAgICAgIC8qIHNjZSArIGNwZSAqLworICAgICAgY2FzZSBNT0RFXzFfMl8xOiAgICAvKiBzY2UgKyBjcGUgKyBzY2UgKi8KKyAgICAgIGNhc2UgTU9ERV8xXzJfMjogICAgLyogc2NlICsgY3BlICsgY3BlICovCisgICAgICBjYXNlIE1PREVfMV8yXzJfMTogIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLworICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogLyogKDcuMSkgc2NlICsgY3BlICsgY3BlICsgY3BlICsgbGZlICovCisgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICAgICAgZW50cnlObyA9IDE7ICAgICAgLyogdXNlIHN0ZXJlbyBiYW5kd2l0aCBzZXR0aW5ncyAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgIH0KKworICAgICAgKmJhbmRXaWR0aCA9IEdldEJhbmR3aWR0aEVudHJ5KAorICAgICAgICAgICAgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgY2hhbkJpdFJhdGUsCisgICAgICAgICAgICBlbnRyeU5vKTsKKworICAgICAgaWYgKCpiYW5kV2lkdGg9PS0xKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19JTlZBTElEX0NIQU5ORUxfQklUUkFURTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgKmJhbmRXaWR0aCA9IDA7CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFOworICB9CisKKyAgKmJhbmRXaWR0aCA9IEZES21pbigqYmFuZFdpZHRoLCBzYW1wbGVSYXRlLzIpOworCisgIHJldHVybiBFcnJvclN0YXR1czs7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguaCBiL2FhYy9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTI0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguaApAQCAtMCwwICsxLDEwNiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JBTkRXSURUSF9ICisjZGVmaW5lIF9CQU5EV0lEVEhfSAorCisKKyNpbmNsdWRlICJxY19kYXRhLmgiCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoSU5UKiBiYW5kV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcm9wb3NlZEJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBlbmNvZGVyTW9kZSk7CisKKyNlbmRpZiAvKiBCQU5EV0lEVEhfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9iaXRfY250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZlZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5jcHAKQEAgLTAsMCArMSwxMTIyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaXRfY250LmgiCisKKyNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCisKKyNkZWZpbmUgSElfTFRBQihhKSAoYT4+MTYpCisjZGVmaW5lIExPX0xUQUIoYSkgKGEgJiAweGZmZmYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExCisgICAgZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDEtMTEKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisgICAgb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDEtMTEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCit7CisKKyAgSU5UIGk7CisgIElOVCBiYzFfMixiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKKyAgSU5UIHQwLHQxLHQyLHQzOworICBiYzFfMj0wOworICBiYzNfND0wOworICBiYzVfNj0wOworICBiYzdfOD0wOworICBiYzlfMTA9MDsKKyAgYmMxMT0wOworICBzYz0wOworCisgIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKKworICAgIHQwPSB2YWx1ZXNbaSswXTsKKyAgICB0MT0gdmFsdWVzW2krMV07CisgICAgdDI9IHZhbHVlc1tpKzJdOworICAgIHQzPSB2YWx1ZXNbaSszXTsKKworICAgIC8qIDEsMiAqLworCisgICAgYmMxXzIrPUZES2FhY0VuY19odWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07CisKKyAgICAvKiA1LDYgKi8KKyAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKKyAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XTsKKworICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICB0MT1maXhwX2Ficyh0MSk7CisgICAgdDI9Zml4cF9hYnModDIpOworICAgIHQzPWZpeHBfYWJzKHQzKTsKKworCisgICAgYmMzXzQrPSBGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXTsKKworICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV07CisgICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKKworICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKKyAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107CisKKyAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CisgICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOworCisgICAgc2MrPSh0MD4wKSsodDE+MCkrKHQyPjApKyh0Mz4wKTsKKyAgfQorCisgIGJpdENvdW50WzFdPUhJX0xUQUIoYmMxXzIpOworICBiaXRDb3VudFsyXT1MT19MVEFCKGJjMV8yKTsKKyAgYml0Q291bnRbM109SElfTFRBQihiYzNfNCkrc2M7CisgIGJpdENvdW50WzRdPUxPX0xUQUIoYmMzXzQpK3NjOworICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKKyAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOworICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKKyAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMV09YmMxMStzYzsKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExCisgICAgZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDMtMTEKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisgICAgb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDMtMTEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCit7CisKKyAgSU5UIGk7CisgIElOVCBiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKKyAgSU5UIHQwLHQxLHQyLHQzOworCisgIGJjM180PTA7CisgIGJjNV82PTA7CisgIGJjN184PTA7CisgIGJjOV8xMD0wOworICBiYzExPTA7CisgIHNjPTA7CisKKyAgZm9yKGk9MDtpPHdpZHRoO2krPTQpeworCisgICAgdDA9IHZhbHVlc1tpKzBdOworICAgIHQxPSB2YWx1ZXNbaSsxXTsKKyAgICB0Mj0gdmFsdWVzW2krMl07CisgICAgdDM9IHZhbHVlc1tpKzNdOworCisgICAgYmM1XzYrPUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF07CisgICAgYmM1XzYrPUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIrNF1bdDMrNF07CisKKyAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgdDE9Zml4cF9hYnModDEpOworICAgIHQyPWZpeHBfYWJzKHQyKTsKKyAgICB0Mz1maXhwX2Ficyh0Myk7CisKKyAgICBiYzNfNCs9IEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdOworCisgICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKKyAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdOworCisgICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdOworICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXTsKKworICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKKyAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107CisKKyAgICBzYys9KHQwPjApKyh0MT4wKSsodDI+MCkrKHQzPjApOworICB9CisKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM109SElfTFRBQihiYzNfNCkrc2M7CisgIGJpdENvdW50WzRdPUxPX0xUQUIoYmMzXzQpK3NjOworICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKKyAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOworICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKKyAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMV09YmMxMStzYzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEKKyAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMQorICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNS0xMQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQoreworCisgIElOVCBpOworICBJTlQgYmM1XzYsYmM3XzgsYmM5XzEwLGJjMTEsc2M7CisgIElOVCB0MCx0MTsKKyAgYmM1XzY9MDsKKyAgYmM3Xzg9MDsKKyAgYmM5XzEwPTA7CisgIGJjMTE9MDsKKyAgc2M9MDsKKworICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisKKyAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgIHQxID0gdmFsdWVzW2krMV07CisKKyAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKKworICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICB0MT1maXhwX2Ficyh0MSk7CisKKyAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdOworICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKKyAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CisKKyAgICBzYys9KHQwPjApKyh0MT4wKTsKKyAgfQorICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKKyAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOworICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKKyAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMV09YmMxMStzYzsKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMQorICAgIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA3LTExCisgICAgcmV0dXJuczoKKyAgICBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorICAgIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyA3LTExCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQoreworCisgIElOVCBpOworICBJTlQgYmM3XzgsYmM5XzEwLGJjMTEsc2M7CisgIElOVCB0MCx0MTsKKworICBiYzdfOD0wOworICBiYzlfMTA9MDsKKyAgYmMxMT0wOworICBzYz0wOworCisgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKKyAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7CisgICAgdDE9Zml4cF9hYnModmFsdWVzW2krMV0pOworCisgICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKKyAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07CisgICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOworICAgIHNjKz0odDA+MCkrKHQxPjApOworICB9CisKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbN109SElfTFRBQihiYzdfOCkrc2M7CisgIGJpdENvdW50WzhdPUxPX0xUQUIoYmM3XzgpK3NjOworICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7CisgIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7CisgIGJpdENvdW50WzExXT1iYzExK3NjOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQ5XzEwXzExCisgICAgZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDktMTEKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisgICAgb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDktMTEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ5XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQoreworCisgIElOVCBpOworICBJTlQgYmM5XzEwLGJjMTEsc2M7CisgIElOVCB0MCx0MTsKKworICBiYzlfMTA9MDsKKyAgYmMxMT0wOworICBzYz0wOworCisgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKKyAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7CisgICAgdDE9Zml4cF9hYnModmFsdWVzW2krMV0pOworCisgICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdOworICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKKworICAgIHNjKz0odDA+MCkrKHQxPjApOworICB9CisKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOworICBiaXRDb3VudFsxMV09YmMxMStzYzsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvdW50MTEKKyAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMQorICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyAgICBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZSAxMQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50MTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnQpCit7CisKKyAgSU5UIGk7CisgIElOVCBiYzExLHNjOworICBJTlQgdDAsdDE7CisKKyAgYmMxMT0wOworICBzYz0wOworICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisgICAgdDA9Zml4cF9hYnModmFsdWVzW2krMF0pOworICAgIHQxPWZpeHBfYWJzKHZhbHVlc1tpKzFdKTsKKyAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CisgICAgc2MrPSh0MD4wKSsodDE+MCk7CisgIH0KKworICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMTFdPWJjMTErc2M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnRFc2MKKyAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMSAod2l0aCBFc2MpCisgICAgcmV0dXJuczoKKyAgICBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorICAgIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAxMSAod2l0aCBFc2MpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnRFc2MoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKlJFU1RSSUNUIGJpdENvdW50KQoreworCisgIElOVCBpOworICBJTlQgYmMxMSxlYyxzYzsKKyAgSU5UIHQwLHQxLHQwMCx0MDE7CisKKyAgYmMxMT0wOworICBzYz0wOworICBlYz0wOworICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisgICAgdDA9Zml4cF9hYnModmFsdWVzW2krMF0pOworICAgIHQxPWZpeHBfYWJzKHZhbHVlc1tpKzFdKTsKKworICAgIHNjKz0odDA+MCkrKHQxPjApOworCisgICAgdDAwID0gZml4TWluKHQwLDE2KTsKKyAgICB0MDEgPSBmaXhNaW4odDEsMTYpOworICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDAwXVt0MDFdOworCisgICAgaWYodDA+PTE2KXsKKyAgICAgIGVjKz01OworICAgICAgd2hpbGUoKHQwPj49MSkgPj0gMTYpCisgICAgICAgIGVjKz0yOworICAgIH0KKworICAgIGlmKHQxPj0xNil7CisgICAgICBlYys9NTsKKyAgICAgIHdoaWxlKCh0MT4+PTEpID49IDE2KQorICAgICAgICBlYys9MjsKKyAgICB9CisgIH0KKworICBmb3IgKGk9MDsgaTwxMTsgaSsrKQorICAgIGJpdENvdW50W2ldPUlOVkFMSURfQklUQ09VTlQ7CisKKyAgYml0Q291bnRbMTFdPWJjMTErc2MrZWM7Cit9CisKKwordHlwZWRlZiB2b2lkICgqQ09VTlRfRlVOQ1RJT04pKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKlJFU1RSSUNUIGJpdENvdW50KTsKKworc3RhdGljIGNvbnN0IENPVU5UX0ZVTkNUSU9OIGNvdW50RnVuY1RhYmxlW0NPREVfQk9PS19FU0NfTEFWKzFdID0KK3sKKworIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMCAgKi8KKyBGREthYWNFbmNfY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgIC8qIDEgICovCisgRkRLYWFjRW5jX2NvdW50M180XzVfNl83XzhfOV8xMF8xMSwgICAgICAvKiAyICAqLworIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogMyAgKi8KKyBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgIC8qIDQgICovCisgRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA1ICAqLworIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNiAgKi8KKyBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDcgICovCisgRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA4ICAqLworIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOSAgKi8KKyBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDEwICovCisgRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMSAqLworIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTIgKi8KKyBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzICovCisgRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCAqLworIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgKi8KKyBGREthYWNFbmNfY291bnRFc2MgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2ICovCit9OworCisKKworSU5UICAgIEZES2FhY0VuY19iaXRDb3VudChjb25zdCBTSE9SVCAqdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICpiaXRDb3VudCkKK3sKKworICAvKgorICAgIGNoZWNrIGlmIHdlIGNhbiB1c2UgY29kZWJvb2sgMAorICAqLworCisgIGlmKG1heFZhbCA9PSAwKQorICAgIGJpdENvdW50WzBdID0gMDsKKyAgZWxzZQorICAgIGJpdENvdW50WzBdID0gSU5WQUxJRF9CSVRDT1VOVDsKKworICBtYXhWYWwgPSBmaXhNaW4obWF4VmFsLChJTlQpQ09ERV9CT09LX0VTQ19MQVYpOworICBjb3VudEZ1bmNUYWJsZVttYXhWYWxdKHZhbHVlcyx3aWR0aCxiaXRDb3VudCk7CisgIHJldHVybigwKTsKK30KKworCisKKworLyoKKyAgY291bnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgemVyb2VkIGxpbmVzCisqLworSU5UIEZES2FhY0VuY19jb3VudFZhbHVlcyhTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vaykKK3sKKworICBJTlQgaSx0MCx0MSx0Mix0Myx0MDAsdDAxOworICBJTlQgY29kZUxlbmd0aDsKKyAgSU5UIHNpZ25MZW5ndGg7CisgIElOVCBiaXRDbnQ9MDsKKworICBzd2l0Y2goY29kZUJvb2speworICBjYXNlIENPREVfQk9PS19aRVJPX05POgorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzFfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgeworICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOworICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOworICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdOworICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOworICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7CisgICAgICBiaXRDbnQrPSBjb2RlTGVuZ3RoOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIENPREVfQk9PS18yX05POgorICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKKyAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKKyAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsKKyAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKKyAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOworICAgICAgYml0Q250Kz0gY29kZUxlbmd0aDsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfM19OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIGlmKHQxICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgIH0KKyAgICAgIHQyID0gdmFsdWVzW2krMl07CisgICAgICBpZih0MiAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICB0Mj1maXhwX2Ficyh0Mik7CisgICAgICB9CisgICAgICB0MyA9IHZhbHVlc1tpKzNdOworICAgICAgaWYodDMgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDM9Zml4cF9hYnModDMpOworICAgICAgfQorCisgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICBiaXRDbnQrPWNvZGVMZW5ndGgrc2lnbkxlbmd0aDsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIGlmKHQxICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgIH0KKyAgICAgIHQyID0gdmFsdWVzW2krMl07CisgICAgICBpZih0MiAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICB0Mj1maXhwX2Ficyh0Mik7CisgICAgICB9CisgICAgICB0MyA9IHZhbHVlc1tpKzNdOworICAgICAgaWYodDMgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDM9Zml4cF9hYnModDMpOworICAgICAgfQorICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOworICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoK3NpZ25MZW5ndGg7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzVfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeworICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOworICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOworICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7CisgICAgICBiaXRDbnQrPWNvZGVMZW5ndGg7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzZfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeworICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOworICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOworICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7CisgICAgICBiaXRDbnQrPWNvZGVMZW5ndGg7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzdfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mil7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorCisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgICAgfQorICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorCisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgICAgfQorICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIGlmKHQxICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgIH0KKyAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOworICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoICtzaWduTGVuZ3RoOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIENPREVfQk9PS18xMF9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorCisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgICAgfQorICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CisgICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgfQorICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIGlmKHQxICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgIH0KKyAgICAgIHQwMCA9IGZpeE1pbih0MCwxNik7CisgICAgICB0MDEgPSBmaXhNaW4odDEsMTYpOworCisgICAgICBjb2RlTGVuZ3RoID0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKKyAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKKyAgICAgIGlmKHQwID49MTYpeworICAgICAgICBJTlQgbixwOworICAgICAgICBuPTA7CisgICAgICAgIHA9dDA7CisgICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7CisgICAgICAgICAgYml0Q250Kys7CisgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIGJpdENudCs9KG4rNSk7CisgICAgICB9CisgICAgICBpZih0MSA+PTE2KXsKKyAgICAgICAgSU5UIG4scDsKKyAgICAgICAgbj0wOworICAgICAgICBwPXQxOworICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpeworICAgICAgICAgIGJpdENudCsrOworICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBiaXRDbnQrPShuKzUpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuKGJpdENudCk7Cit9CisKKworCitJTlQgRkRLYWFjRW5jX2NvZGVWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2ssICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKQoreworCisgIElOVCBpLHQwLHQxLHQyLHQzLHQwMCx0MDE7CisgIElOVCBjb2RlV29yZCxjb2RlTGVuZ3RoOworICBJTlQgc2lnbixzaWduTGVuZ3RoOworCisgIHN3aXRjaChjb2RlQm9vayl7CisgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfMV9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF0rMTsKKyAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSsxOworICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdKzE7CisgICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM10rMTsKKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiMVt0MF1bdDFdW3QyXVt0M107CisgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfMl9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF0rMTsKKyAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSsxOworICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdKzE7CisgICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM10rMTsKKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiMlt0MF1bdDFdW3QyXVt0M107CisgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfM19OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICBzaWduPTA7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQwIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHQxID0gdmFsdWVzW2krMV07CisgICAgICBpZih0MSAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICBzaWduPDw9MTsKKyAgICAgICAgaWYodDEgPCAwKXsKKyAgICAgICAgICBzaWdufD0xOworICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKKyAgICAgIGlmKHQyICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHNpZ248PD0xOworICAgICAgICBpZih0MiA8IDApeworICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgdDI9Zml4cF9hYnModDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0MyA9IHZhbHVlc1tpKzNdOworICAgICAgaWYodDMgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQzIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0Mz1maXhwX2Ficyh0Myk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIzW3QwXVt0MV1bdDJdW3QzXTsKKyAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7CisgICAgICBzaWduPTA7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQwIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHQxID0gdmFsdWVzW2krMV07CisgICAgICBpZih0MSAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICBzaWduPDw9MTsKKyAgICAgICAgaWYodDEgPCAwKXsKKyAgICAgICAgICBzaWdufD0xOworICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKKyAgICAgIGlmKHQyICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHNpZ248PD0xOworICAgICAgICBpZih0MiA8IDApeworICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgdDI9Zml4cF9hYnModDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0MyA9IHZhbHVlc1tpKzNdOworICAgICAgaWYodDMgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQzIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0Mz1maXhwX2Ficyh0Myk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiNFt0MF1bdDFdW3QyXVt0M107CisgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzVfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeworICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzQ7CisgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rNDsKKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiNVt0MF1bdDFdOworICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIENPREVfQk9PS182X05POgorICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKKyAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSs0OworICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdKzQ7CisgICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjZbdDBdW3QxXTsKKyAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDBdW3QxXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfN19OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKXsKKyAgICAgIHNpZ249MDsKKyAgICAgIHNpZ25MZW5ndGg9MDsKKyAgICAgIHQwID0gdmFsdWVzW2krMF07CisgICAgICBpZih0MCAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICBzaWduPDw9MTsKKyAgICAgICAgaWYodDAgPCAwKXsKKyAgICAgICAgICBzaWdufD0xOworICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQxIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiN1t0MF1bdDFdOworICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKKyAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7CisgICAgICBzaWduPTA7CisgICAgICBzaWduTGVuZ3RoPTA7CisgICAgICB0MCA9IHZhbHVlc1tpKzBdOworICAgICAgaWYodDAgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQwIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgICAgIGlmKHQxICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHNpZ248PD0xOworICAgICAgICBpZih0MSA8IDApeworICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjhbdDBdW3QxXTsKKyAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzlfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeworICAgICAgc2lnbj0wOworICAgICAgc2lnbkxlbmd0aD0wOworICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKKyAgICAgIGlmKHQwICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHNpZ248PD0xOworICAgICAgICBpZih0MCA8IDApeworICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgICB9CisgICAgICB9CisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQxIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiOVt0MF1bdDFdOworICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgQ09ERV9CT09LXzEwX05POgorICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKKyAgICAgIHNpZ249MDsKKyAgICAgIHNpZ25MZW5ndGg9MDsKKyAgICAgIHQwID0gdmFsdWVzW2krMF07CisgICAgICBpZih0MCAhPSAwKXsKKyAgICAgICAgc2lnbkxlbmd0aCsrOworICAgICAgICBzaWduPDw9MTsKKyAgICAgICAgaWYodDAgPCAwKXsKKyAgICAgICAgICBzaWdufD0xOworICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQxIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiMTBbdDBdW3QxXTsKKyAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIENPREVfQk9PS19FU0NfTk86CisgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeworICAgICAgc2lnbj0wOworICAgICAgc2lnbkxlbmd0aD0wOworICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKKyAgICAgIGlmKHQwICE9IDApeworICAgICAgICBzaWduTGVuZ3RoKys7CisgICAgICAgIHNpZ248PD0xOworICAgICAgICBpZih0MCA8IDApeworICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgICAgICB9CisgICAgICB9CisgICAgICB0MSA9IHZhbHVlc1tpKzFdOworICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIHNpZ25MZW5ndGgrKzsKKyAgICAgICAgc2lnbjw8PTE7CisgICAgICAgIGlmKHQxIDwgMCl7CisgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHQwMCA9IGZpeE1pbih0MCwxNik7CisgICAgICB0MDEgPSBmaXhNaW4odDEsMTYpOworCisgICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjExW3QwMF1bdDAxXTsKKyAgICAgIGNvZGVMZW5ndGggPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDAwXVt0MDFdOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOworICAgICAgaWYodDAgPj0xNil7CisgICAgICAgIElOVCBuLHA7CisgICAgICAgIG49MDsKKyAgICAgICAgcD10MDsKKyAgICAgICAgd2hpbGUoKHA+Pj0xKSA+PTE2KXsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOworICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSx0MC0oMTw8KG4rNCkpLG4rNCk7CisgICAgICB9CisgICAgICBpZih0MSA+PTE2KXsKKyAgICAgICAgSU5UIG4scDsKKyAgICAgICAgbj0wOworICAgICAgICBwPXQxOworICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpeworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLDEsMSk7CisgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLDAsMSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHQxLSgxPDwobis0KSksbis0KTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4oMCk7Cit9CisKK0lOVCBGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoSU5UIGRlbHRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKQoreworICBJTlQgY29kZVdvcmQsY29kZUxlbmd0aDsKKworICBpZihmaXhwX2FicyhkZWx0YSkgPkNPREVfQk9PS19TQ0ZfTEFWKQorICAgIHJldHVybigxKTsKKworICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl07CisgIGNvZGVMZW5ndGggPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWJzY2ZbZGVsdGErQ09ERV9CT09LX1NDRl9MQVZdOworICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgcmV0dXJuKDApOworfQorCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGI1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9iaXRfY250LmgKQEAgLTAsMCArMSwxODcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IEh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0JJVENPVU5UX0gKKyNkZWZpbmUgX19CSVRDT1VOVF9ICisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYWFjRW5jX3JvbS5oIgorCisjZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKEZES19JTlRfTUFYLzQpCisKKy8qCisgIGNvZGUgYm9vayBudW1iZXIgdGFibGUKKyovCisKK2VudW0gY29kZUJvb2tOb3sKKyBDT0RFX0JPT0tfWkVST19OTz0gICAgICAgICAgICAgICAwLAorIENPREVfQk9PS18xX05PPSAgICAgICAgICAgICAgICAgIDEsCisgQ09ERV9CT09LXzJfTk89ICAgICAgICAgICAgICAgICAgMiwKKyBDT0RFX0JPT0tfM19OTz0gICAgICAgICAgICAgICAgICAzLAorIENPREVfQk9PS180X05PPSAgICAgICAgICAgICAgICAgIDQsCisgQ09ERV9CT09LXzVfTk89ICAgICAgICAgICAgICAgICAgNSwKKyBDT0RFX0JPT0tfNl9OTz0gICAgICAgICAgICAgICAgICA2LAorIENPREVfQk9PS183X05PPSAgICAgICAgICAgICAgICAgIDcsCisgQ09ERV9CT09LXzhfTk89ICAgICAgICAgICAgICAgICAgOCwKKyBDT0RFX0JPT0tfOV9OTz0gICAgICAgICAgICAgICAgICA5LAorIENPREVfQk9PS18xMF9OTz0gICAgICAgICAgICAgICAgMTAsCisgQ09ERV9CT09LX0VTQ19OTz0gICAgICAgICAgICAgICAxMSwKKyBDT0RFX0JPT0tfUkVTX05PPSAgICAgICAgICAgICAgIDEyLAorIENPREVfQk9PS19QTlNfTk89ICAgICAgICAgICAgICAgMTMsCisgQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTz0gICAxNCwKKyBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk89ICAgICAgIDE1CisKK307CisKKy8qCisgIGNvZGUgYm9vayBpbmRleCB0YWJsZQorKi8KKworZW51bSBjb2RlQm9va05keHsKKyBDT0RFX0JPT0tfWkVST19ORFgsCisgQ09ERV9CT09LXzFfTkRYLAorIENPREVfQk9PS18yX05EWCwKKyBDT0RFX0JPT0tfM19ORFgsCisgQ09ERV9CT09LXzRfTkRYLAorIENPREVfQk9PS181X05EWCwKKyBDT0RFX0JPT0tfNl9ORFgsCisgQ09ERV9CT09LXzdfTkRYLAorIENPREVfQk9PS184X05EWCwKKyBDT0RFX0JPT0tfOV9ORFgsCisgQ09ERV9CT09LXzEwX05EWCwKKyBDT0RFX0JPT0tfRVNDX05EWCwKKyBDT0RFX0JPT0tfUkVTX05EWCwKKyBDT0RFX0JPT0tfUE5TX05EWCwKKyBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05EWCwKKyBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTkRYLAorIE5VTUJFUl9PRl9DT0RFX0JPT0tTCit9OworCisvKgorICBjb2RlIGJvb2sgbGF2IHRhYmxlCisqLworCitlbnVtIGNvZGVCb29rTGF2eworIENPREVfQk9PS19aRVJPX0xBVj0wLAorIENPREVfQk9PS18xX0xBVj0xLAorIENPREVfQk9PS18yX0xBVj0xLAorIENPREVfQk9PS18zX0xBVj0yLAorIENPREVfQk9PS180X0xBVj0yLAorIENPREVfQk9PS181X0xBVj00LAorIENPREVfQk9PS182X0xBVj00LAorIENPREVfQk9PS183X0xBVj03LAorIENPREVfQk9PS184X0xBVj03LAorIENPREVfQk9PS185X0xBVj0xMiwKKyBDT0RFX0JPT0tfMTBfTEFWPTEyLAorIENPREVfQk9PS19FU0NfTEFWPTE2LAorIENPREVfQk9PS19TQ0ZfTEFWPTYwLAorIENPREVfQk9PS19QTlNfTEFWPTYwCisgfTsKKworSU5UICAgIEZES2FhY0VuY19iaXRDb3VudChjb25zdCBTSE9SVCAqYVF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5vT2ZTcGVjTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1heFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnRMdXQpOworCitJTlQgICAgRkRLYWFjRW5jX2NvdW50VmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rKTsKKworSU5UICAgIEZES2FhY0VuY19jb2RlVmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworSU5UICAgIEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShJTlQgc2NhbGVmYWN0b3IsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCitpbmxpbmUgSU5UIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoY29uc3QgSU5UIGRlbHRhKQoreworICBGREtfQVNTRVJUKCAoMCA8PSAoZGVsdGErQ09ERV9CT09LX1NDRl9MQVYpKSAmJiAgKChkZWx0YStDT0RFX0JPT0tfU0NGX0xBVik8KGludCkoc2l6ZW9mKEZES2FhY0VuY19odWZmX2x0YWJzY2YpL3NpemVvZigoRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlswXSkpKSkgKTsKKyAgcmV0dXJuKChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl0pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2JpdGVuYy5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9iaXRlbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDc3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9iaXRlbmMuY3BwCkBAIC0wLDAgKzEsMTQ3NCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaXRlbmMuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAiZHluX2JpdHMuaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorCisKKyNpbmNsdWRlICJ0cGVuY19saWIuaCIKKworI2luY2x1ZGUgIkZES190b29sc19yb20uaCIgIC8qIG5lZWRlZCBmb3IgdGhlIGJpdHN0cmVhbSBzeW50YXggdGFibGVzICovCisKK3N0YXRpYyBjb25zdCBpbnQgZ2xvYmFsR2Fpbk9mZnNldCA9IDEwMDsKK3N0YXRpYyBjb25zdCBpbnQgaWNzUmVzZXJ2ZWRCaXQgICA9IDA7CitzdGF0aWMgY29uc3QgaW50IG5vaXNlT2Zmc2V0ICAgICAgPSA5MDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZSBzcGVjdHJhbCBkYXRhCisgICAgcmV0dXJuczogICAgICB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYml0cworICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEoSU5UICAgICAgICAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICAgICAgICAgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgICAgICAgICAgICAgICAgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJpdFN0cmVhbSkKK3sKKyAgSU5UIGksc2ZiOworICBJTlQgZGJnVmFsID0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOworCisgIGZvcihpPTA7aTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zO2krKykKKyAgeworICAgIGlmKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKQorICAgIHsKKyAgICAgIC8qIGh1ZmZlbmNvZGUgc3BlY3RyYWwgZGF0YSBmb3IgdGhpcyBodWZmc2VjdGlvbiAqLworICAgICAgSU5UIHRtcCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydCtzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OworICAgICAgZm9yKHNmYj1zZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IHNmYjx0bXA7IHNmYisrKQorICAgICAgeworICAgICAgICBGREthYWNFbmNfY29kZVZhbHVlcyhxdWFudFNwZWN0cnVtK3NmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiKzFdLXNmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4oRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19lbmNvZGVHbG9iYWxHYWluCisgICAgZGVzY3JpcHRpb246IGVuY29kZXMgR2xvYmFsIEdhaW4gKGNvbW1vbiBzY2FsZSBmYWN0b3IpCisgICAgcmV0dXJuczogICAgIHRoZSBudW1iZXIgb2Ygc3RhdGljIGJpdHMKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbihJTlQgZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWRjdFNjYWxlKQoreworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sZ2xvYmFsR2FpbiAtIHNjYWxlZmFjICsgZ2xvYmFsR2Fpbk9mZnNldC00KihMT0dfTk9STV9QQ00tbWRjdFNjYWxlKSw4KTsKKyAgfQorICByZXR1cm4gKDgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19lbmNvZGVJY3NJbmZvCisgICAgZGVzY3JpcHRpb246IGVuY29kZXMgSWNzIEluZm8KKyAgICByZXR1cm5zOiAgICAgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cworICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZUljc0luZm8oSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzKQoreworICBJTlQgc3RhdEJpdHM7CisKKyAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICBzdGF0Qml0cyA9IDggKyBUUkFOU19GQUMgLSAxOworICB9IGVsc2UgeworICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VMRCkgeworICAgICAgc3RhdEJpdHMgPSA2OworICAgIH0gZWxzZQorICAgIHsKKyAgICAgIHN0YXRCaXRzID0gKCEoc3ludGF4RmxhZ3MgJiBBQ19TQ0FMQUJMRSkpID8gMTEgOiAxMDsKKyAgICB9CisgIH0KKworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisKKyAgICBpZiAoIShzeW50YXhGbGFncyAmIEFDX0VMRCkpeworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0saWNzUmVzZXJ2ZWRCaXQsMSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxibG9ja1R5cGUsMik7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKHdpbmRvd1NoYXBlID09IExPTF9XSU5ET1cpID8gS0JEX1dJTkRPVyA6IHdpbmRvd1NoYXBlLDEpOworICAgIH0KKworICAgIHN3aXRjaChibG9ja1R5cGUpeworICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLG1heFNmYlBlckdyb3VwLDYpOworCisgICAgICBpZiAoIShzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FTEQpKSApIHsgLyogSWYgbm90IHNjYWxhYmxlIHN5bnRheCB0aGVuIC4uLiAqLworICAgICAgICAvKiBObyBwcmVkaWN0b3IgZGF0YSBwcmVzZW50ICovCisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxtYXhTZmJQZXJHcm91cCw0KTsKKworICAgICAgLyogV3JpdGUgZ3JvdXBpbmcgYml0cyAqLworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sZ3JvdXBpbmdNYXNrLFRSQU5TX0ZBQy0xKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoc3RhdEJpdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2VuY29kZVNlY3Rpb25EYXRhCisgICAgZGVzY3JpcHRpb246ICBlbmNvZGUgc2VjdGlvbiBkYXRhIChjb21tb24gSHVmZm1hbiBjb2RlYm9va3MgZm9yIGFkamFjZW50CisgICAgICAgICAgICAgICAgICBTRkIncykKKyAgICByZXR1cm5zOiAgICAgIG5vbmUKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlU2VjdGlvbkRhdGEoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVZDQjExKQoreworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgSU5UIHNlY3RFc2NhcGVWYWw9MCxzZWN0TGVuQml0cz0wOworICAgIElOVCBzZWN0TGVuOworICAgIElOVCBpOworICAgIElOVCBkYmdWYWw9RkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOworICAgIElOVCBzZWN0Q2JCaXRzID0gNDsKKworICAgIHN3aXRjaChzZWN0aW9uRGF0YS0+YmxvY2tUeXBlKQorICAgIHsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX0xPTkc7CisgICAgICBzZWN0TGVuQml0cyAgID0gU0VDVF9CSVRTX0xPTkc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9TSE9SVDsKKyAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfU0hPUlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspCisgICAgeworICAgICAgSU5UIGNvZGVCb29rID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rOworCisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxjb2RlQm9vayxzZWN0Q2JCaXRzKTsKKworICAgICAgeworICAgICAgICBzZWN0TGVuID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKworICAgICAgICB3aGlsZShzZWN0TGVuID49IHNlY3RFc2NhcGVWYWwpCisgICAgICAgIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0RXNjYXBlVmFsLHNlY3RMZW5CaXRzKTsKKyAgICAgICAgICBzZWN0TGVuLT1zZWN0RXNjYXBlVmFsOworICAgICAgICB9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RMZW4sc2VjdExlbkJpdHMpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7CisgIH0KKyAgcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZSBEUENNIGNvZGVkIHNjYWxlIGZhY3RvcnMKKyAgICByZXR1cm5zOiAgICAgIG5vbmUKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlU2NhbGVGYWN0b3JEYXRhKFVJTlQgICAgICAgICAgICAgICAgICAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICAgICAgICAgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAqc2NhbGVmYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAqUkVTVFJJQ1Qgbm9pc2VOcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICppc1NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgZ2xvYmFsR2FpbikKK3sKKyAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgIElOVCBpLGosbGFzdFZhbFNjZixkZWx0YVNjZjsKKyAgICBJTlQgZGVsdGFQbnM7CisgICAgSU5UIGxhc3RWYWxQbnMgPSAwOworICAgIElOVCBub2lzZVBDTUZsYWcgPSBUUlVFOworICAgIElOVCBsYXN0VmFsSXM7CisKKyAgICBJTlQgZGJnVmFsID0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOworCisgICAgbGFzdFZhbFNjZj1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOworICAgIGxhc3RWYWxQbnMgPSBnbG9iYWxHYWluLXNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl0rZ2xvYmFsR2Fpbk9mZnNldC00KkxPR19OT1JNX1BDTS1ub2lzZU9mZnNldDsKKyAgICBsYXN0VmFsSXMgID0gMDsKKworICAgIGZvcihpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKXsKKyAgICAgIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pIHsKKworICAgICAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgICAgICAgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKQorICAgICAgICB7CisgICAgICAgICAgSU5UIHNmYlN0YXJ0ID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OworICAgICAgICAgIElOVCB0bXAgPSBzZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICAgICAgZm9yKGo9c2ZiU3RhcnQ7IGo8dG1wOyBqKyspIHsKKyAgICAgICAgICAgIElOVCBkZWx0YUlzICAgPSBpc1NjYWxlW2pdLWxhc3RWYWxJczsKKyAgICAgICAgICAgIGxhc3RWYWxJcyA9IGlzU2NhbGVbal07CisgICAgICAgICAgICBpZihGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcyxoQml0U3RyZWFtKSkgeworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IC8qIHNmYiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHsKKyAgICAgICAgICBJTlQgc2ZiU3RhcnQgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CisgICAgICAgICAgSU5UIHRtcCA9IHNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKyAgICAgICAgICBmb3Ioaj1zZmJTdGFydDsgajx0bXA7IGorKykgeworICAgICAgICAgICAgZGVsdGFQbnMgICA9IG5vaXNlTnJnW2pdLWxhc3RWYWxQbnM7CisgICAgICAgICAgICBsYXN0VmFsUG5zID0gbm9pc2VOcmdbal07CisKKyAgICAgICAgICAgIGlmKG5vaXNlUENNRmxhZyl7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGRlbHRhUG5zKygxPDwoUE5TX1BDTV9CSVRTLTEpKSxQTlNfUENNX0JJVFMpOworICAgICAgICAgICAgICBub2lzZVBDTUZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZihGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFQbnMsaEJpdFN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IC8qIHNmYiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQrc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKyAgICAgICAgICBmb3Ioaj1zZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGo8dG1wOyBqKyspeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgY2hlY2sgaWYgd2UgY2FuIHJlcGVhdCB0aGUgbGFzdCB2YWx1ZSB0byBzYXZlIGJpdHMKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihtYXhWYWx1ZUluU2ZiW2pdID09IDApCisgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgIGRlbHRhU2NmID0gLShzY2FsZWZhY1tqXS1sYXN0VmFsU2NmKTsKKyAgICAgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmLGhCaXRTdHJlYW0pKXsKKyAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gLyogc2ZiICovCisgICAgICAgIH0gLyogY29kZSBzY2FsZWZhY3RvciAqLworICAgICAgfSAvKiBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8gKi8KKyAgICB9IC8qIHNlY3Rpb24gbG9vcCAqLworCisgICAgcmV0dXJuKEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKS1kYmdWYWwpOworICB9IC8qIGlmIChoQml0U3RyZWFtICE9IE5VTEwpICovCisKKyAgcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6ZW5jb2RlTXNJbmZvCisgICAgZGVzY3JpcHRpb246IGVuY29kZXMgTVMtU3RlcmVvIEluZm8KKyAgICByZXR1cm5zOiAgICAgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cworICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVNU0luZm8oSU5UICAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIGdycFNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBtYXhTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqanNGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICBJTlQgc2ZiLCBzZmJPZmYsIG1zQml0cyA9IDA7CisKKyAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkKKyAgeworICAgIHN3aXRjaChtc0RpZ2VzdCkKKyAgICB7CisgICAgY2FzZSBNU19OT05FOgorICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19OT05FLDIpOworICAgICAgbXNCaXRzICs9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVNfQUxMOgorICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19BTEwsMik7CisgICAgICBtc0JpdHMgKz0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNU19TT01FOgorICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19TT01FLDIpOworICAgICAgbXNCaXRzICs9IDI7CisgICAgICBmb3Ioc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYrPWdycFNmYikKKyAgICAgIHsKKyAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykKKyAgICAgICAgeworICAgICAgICAgIGlmKGpzRmxhZ3Nbc2ZiT2ZmK3NmYl0gJiBNU19PTil7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNleworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbXNCaXRzICs9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBtc0JpdHMgKz0gMjsKKyAgICBpZiAobXNEaWdlc3QgPT0gTVNfU09NRSkgeworICAgICAgZm9yKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmKz1ncnBTZmIpIHsKKyAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykgeworICAgICAgICAgIG1zQml0cyArPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAobXNCaXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19lbmNvZGVUbnNEYXRhUHJlc2VudAorICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlIFROUyBkYXRhIChmaWx0ZXIgb3JkZXIsIGNvZWZmcywgLi4pCisgICAgcmV0dXJuczogICAgICB0aGUgbnVtYmVyIG9mIHN0YXRpYyBiaXRzCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVRuc0RhdGFQcmVzZW50KFROU19JTkZPICp0bnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIGlmICggKGhCaXRTdHJlYW0hPU5VTEwpICYmICh0bnNJbmZvIT1OVUxMKSApCisgIHsKKyAgICBJTlQgaSwgdG5zUHJlc2VudCA9IDA7CisgICAgSU5UIG51bU9mV2luZG93cyA9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz9UUkFOU19GQUM6MSk7CisKKyAgICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgeworICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSE9MCkgeworICAgICAgICB0bnNQcmVzZW50PTE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0bnNQcmVzZW50PT0wKSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOworICAgIH0gZWxzZSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOworICAgIH0KKyAgfQorICByZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2VuY29kZVRuc0RhdGEKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZSBUTlMgZGF0YSAoZmlsdGVyIG9yZGVyLCBjb2VmZnMsIC4uKQorICAgIHJldHVybnM6ICAgICAgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cworICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVUbnNEYXRhKFROU19JTkZPICp0bnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICBJTlQgdG5zQml0cyA9IDA7CisKKyAgaWYgKHRuc0luZm8hPU5VTEwpIHsKKworICAgIElOVCBpLGosazsKKyAgICBJTlQgdG5zUHJlc2VudCA9IDA7CisgICAgSU5UIGNvZWZCaXRzOworICAgIElOVCBudW1PZldpbmRvd3M9KGJsb2NrVHlwZT09U0hPUlRfV0lORE9XP1RSQU5TX0ZBQzoxKTsKKworICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICBpZiAodG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldIT0wKSB7CisgICAgICAgIHRuc1ByZXNlbnQ9MTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICh0bnNQcmVzZW50PT0xKSB7IC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCisgICAgICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldLChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8xOjIpKTsKKyAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8xOjIpOworICAgICAgICAgIGlmICh0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0pIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCh0bnNJbmZvLT5jb2VmUmVzW2ldPT00PzE6MCksMSk7CisgICAgICAgICAgICB0bnNCaXRzICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoaj0wOyBqPHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXTsgaisrKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLT5sZW5ndGhbaV1bal0sKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzQ6NikpOworICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/NDo2KTsKKyAgICAgICAgICAgIEZES19BU1NFUlQodG5zSW5mby0+b3JkZXJbaV1bal0gPD0gMTIpOworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby0+b3JkZXJbaV1bal0sKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzM6NSkpOworICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/Mzo1KTsKKyAgICAgICAgICAgIGlmICh0bnNJbmZvLT5vcmRlcltpXVtqXSl7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPmRpcmVjdGlvbltpXVtqXSwxKTsKKyAgICAgICAgICAgICAgdG5zQml0cyArPTE7IC8qZGlyZWN0aW9uKi8KKyAgICAgICAgICAgICAgaWYodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOworICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10+IDMgfHwKKyAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltpXVtqXVtrXTwgLTQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAyOworICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgaWYgKCB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPiAxCisgICAgICAgICAgICAgICAgICAgIHx8IHRuc0luZm8tPmNvZWZbaV1bal1ba108IC0yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLC0oY29lZkJpdHMgLSB0bnNJbmZvLT5jb2VmUmVzW2ldKSwxKTsgLypjb2VmX2NvbXByZXMqLworICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypjb2VmX2NvbXByZXNzaW9uICovCisgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKysgKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IElOVCBybWFza1tdID0gezAsMSwzLDcsMTV9OworICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPmNvZWZbaV1bal1ba10gJiBybWFza1tjb2VmQml0c10sY29lZkJpdHMpOworICAgICAgICAgICAgICAgIHRuc0JpdHMgKz0gY29lZkJpdHM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAodG5zUHJlc2VudCAhPSAwKSB7CisgICAgICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/MToyKTsKKyAgICAgICAgICBpZiAodG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldKSB7CisgICAgICAgICAgICB0bnNCaXRzICs9IDE7CisgICAgICAgICAgICBmb3IgKGo9MDsgajx0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV07IGorKykgeworICAgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz80OjYpOworICAgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8zOjUpOworICAgICAgICAgICAgICBpZiAodG5zSW5mby0+b3JkZXJbaV1bal0pIHsKKyAgICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypkaXJlY3Rpb24qLworICAgICAgICAgICAgICAgIHRuc0JpdHMgKz0xOyAvKmNvZWZfY29tcHJlc3Npb24gKi8KKyAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7CisgICAgICAgICAgICAgICAgICBjb2VmQml0cz0zOworICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXT4gMyB8fCB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPCAtNCkgeworICAgICAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMjsKKyAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10+IDEgfHwgdG5zSW5mby0+Y29lZltpXVtqXVtrXTwgLTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgdG5zQml0cyArPSBjb2VmQml0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gLyogKHRuc0luZm8hPU5VTEwpICovCisKKyAgcmV0dXJuICh0bnNCaXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19lbmNvZGVHYWluQ29udHJvbERhdGEKKyAgICBkZXNjcmlwdGlvbjogIHVuc3VwcG9ydGVkCisgICAgcmV0dXJuczogICAgICBub25lCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZUdhaW5Db250cm9sRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgfQorICByZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2VuY29kZVB1bHNlRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgbm90IHN1cHBvcnRlZCB5ZXQgKGR1bW15KQorICAgIHJldHVybnM6ICAgICAgbm9uZQorICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVQdWxzZURhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKK3sKKyAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7CisgIH0KKyAgcmV0dXJuICgxKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZAorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGUgZXh0ZW5zaW9uIHBheWxvYWQgdG8gYml0c3RyZWFtCisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2Ygd3JpdHRlbiBiaXRzCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZCggSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVF9QQVlMT0FEX1RZUEUgICAgICBleHRQYXlsb2FkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgKmV4dFBheWxvYWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgI2RlZmluZSBFWFRfVFlQRV9CSVRTICAgICAgICAgKCA0ICkKKyAgI2RlZmluZSBEQVRBX0VMX1ZFUlNJT05fQklUUyAgKCA0ICkKKyAgI2RlZmluZSBGSUxMX05JQkJMRV9CSVRTICAgICAgKCA0ICkKKworICBJTlQgIGV4dEJpdHNVc2VkID0gMDsKKworICBpZiAoZXh0UGF5bG9hZEJpdHMgPj0gRVhUX1RZUEVfQklUUykKKyAgeworICAgIFVDSEFSICBmaWxsQnl0ZSA9IDB4MDA7ICAvKiBmb3IgRVhUX0ZJTCBhbmQgRVhUX0ZJTExfREFUQSAqLworCisgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWRUeXBlLCBFWFRfVFlQRV9CSVRTKTsKKyAgICB9CisgICAgZXh0Qml0c1VzZWQgKz0gRVhUX1RZUEVfQklUUzsKKworICAgIHN3aXRjaCAoZXh0UGF5bG9hZFR5cGUpIHsKKyAgICAgIGNhc2UgRVhUX0RZTkFNSUNfUkFOR0U6CisgICAgICAvKiBjYXNlIEVYVF9TQUNfREFUQTogKi8KKyAgICAgIGNhc2UgRVhUX1NCUl9EQVRBOgorICAgICAgY2FzZSBFWFRfU0JSX0RBVEFfQ1JDOgorICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgaW50IGksIHdyaXRlQml0cyA9IGV4dFBheWxvYWRCaXRzOworICAgICAgICAgIGZvciAoaT0wOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOworICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh3cml0ZUJpdHMgPiAwKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0+Pig4LXdyaXRlQml0cyksIHdyaXRlQml0cyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGV4dEJpdHNVc2VkICs9IGV4dFBheWxvYWRCaXRzOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFWFRfREFUQV9FTEVNRU5UOgorICAgICAgICB7CisgICAgICAgICAgSU5UIGRhdGFFbGVtZW50TGVuZ3RoID0gKGV4dFBheWxvYWRCaXRzKzcpPj4zOworICAgICAgICAgIElOVCBjbnQgPSBkYXRhRWxlbWVudExlbmd0aDsKKyAgICAgICAgICBpbnQgbG9vcENvdW50ZXIgPSAxOworCisgICAgICAgICAgd2hpbGUgKGRhdGFFbGVtZW50TGVuZ3RoID49IDI1NSkgeworICAgICAgICAgICAgbG9vcENvdW50ZXIrKzsKKyAgICAgICAgICAgIGRhdGFFbGVtZW50TGVuZ3RoIC09IDI1NTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAweDAwLCBEQVRBX0VMX1ZFUlNJT05fQklUUyk7ICAvKiBkYXRhX2VsZW1lbnRfdmVyc2lvbiA9IEFOQ19EQVRBICovCisKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPGxvb3BDb3VudGVyOyBpKyspIHsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDI1NSwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZGF0YUVsZW1lbnRMZW5ndGgsIDgpOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykgeworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBleHRCaXRzVXNlZCArPSBEQVRBX0VMX1ZFUlNJT05fQklUUyArIChsb29wQ291bnRlcio4KSArIChjbnQqOCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRVhUX0ZJTExfREFUQToKKyAgICAgICAgZmlsbEJ5dGUgPSAweEE1OworICAgICAgY2FzZSBFWFRfRklMOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIGludCB3cml0ZUJpdHMgPSBleHRQYXlsb2FkQml0czsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMHgwMCwgRklMTF9OSUJCTEVfQklUUyk7CisgICAgICAgICAgd3JpdGVCaXRzIC09IDg7ICAvKiBhY291bnQgZm9yIHRoZSBleHRlbnNpb24gdHlwZSBhbmQgdGhlIGZpbGwgbmliYmxlICovCisgICAgICAgICAgd2hpbGUgKHdyaXRlQml0cyA+PSA4KSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZmlsbEJ5dGUsIDgpOworICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGV4dEJpdHNVc2VkICs9IEZJTExfTklCQkxFX0JJVFMgKyAoZXh0UGF5bG9hZEJpdHMgJiB+MHg3KSAtIDg7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoZXh0Qml0c1VzZWQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfd3JpdGVEYXRhU3RyZWFtRWxlbWVudAorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGUgZGF0YSBzdHJlYW0gZWxlbWVudHMgbGlrZSBhbmNpbGxhcnkgZGF0YSAuLi4KKyAgICByZXR1cm5zOiAgICAgIHRoZSBhbW91bnQgb2YgdXNlZCBiaXRzCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES2FhY0VuY193cml0ZURhdGFTdHJlYW1FbGVtZW50KCBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgZWxlbWVudEluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgIGRhdGFQYXlsb2FkQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICBhbGlnbkFuY2hvciApCit7CisgICNkZWZpbmUgREFUQV9CWVRFX0FMSUdOX0ZMQUcgICAgICAoIDAgKQorCisgICNkZWZpbmUgRUxfSU5TVEFOQ0VfVEFHX0JJVFMgICAgICAoIDQgKQorICAjZGVmaW5lIERBVEFfQllURV9BTElHTl9GTEFHX0JJVFMgKCAxICkKKyAgI2RlZmluZSBEQVRBX0xFTl9DT1VOVF9CSVRTICAgICAgICggOCApCisgICNkZWZpbmUgREFUQV9MRU5fRVNDX0NPVU5UX0JJVFMgICAoIDggKQorCisgICNkZWZpbmUgTUFYX0RBVEFfQUxJR05fQklUUyAgICAgICAoIDcgKQorICAjZGVmaW5lIE1BWF9EU0VfREFUQV9CWVRFUyAgICAgICAgKCA1MTAgKQorCisgIElOVCAgZHNlQml0c1VzZWQgPSAwOworCisgIHdoaWxlIChkYXRhUGF5bG9hZEJ5dGVzID4gMCkKKyAgeworICAgIGludCBlc2NfY291bnQgPSAtMTsKKyAgICBpbnQgY250ID0gMDsKKyAgICBJTlQgY3JjUmVnID0gLTE7CisKKyAgICBkc2VCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRUxfSU5TVEFOQ0VfVEFHX0JJVFMKKyAgICAgICAgICAgICAgICArICBEQVRBX0JZVEVfQUxJR05fRkxBR19CSVRTICsgREFUQV9MRU5fQ09VTlRfQklUUzsKKworICAgIGlmIChEQVRBX0JZVEVfQUxJR05fRkxBRykgeworICAgICAgZHNlQml0c1VzZWQgKz0gTUFYX0RBVEFfQUxJR05fQklUUzsKKyAgICB9CisKKyAgICBjbnQgPSBmaXhNaW4oTUFYX0RTRV9EQVRBX0JZVEVTLCBkYXRhUGF5bG9hZEJ5dGVzKTsKKyAgICBpZiAoIGNudCA+PSAyNTUgKSB7CisgICAgICBlc2NfY291bnQgPSBjbnQgLSAyNTU7CisgICAgICBkc2VCaXRzVXNlZCArPSBEQVRBX0xFTl9FU0NfQ09VTlRfQklUUzsKKyAgICB9CisKKyAgICBkYXRhUGF5bG9hZEJ5dGVzIC09IGNudDsKKyAgICBkc2VCaXRzVXNlZCArPSBjbnQgKiA4OworCisgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CisgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtID0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShoVHBFbmMpOworICAgICAgaW50IGk7CisKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBJRF9EU0UsIEVMX0lEX0JJVFMpOworCisgICAgICBjcmNSZWcgPSB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoaFRwRW5jLCAwKTsKKworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGVsZW1lbnRJbnN0YW5jZVRhZywgRUxfSU5TVEFOQ0VfVEFHX0JJVFMpOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIERBVEFfQllURV9BTElHTl9GTEFHLCBEQVRBX0JZVEVfQUxJR05fRkxBR19CSVRTKTsKKworICAgICAgLyogd3JpdGUgbGVuZ3RoIGZpZWxkKHMpICovCisgICAgICBpZiAoIGVzY19jb3VudCA+PSAwICkgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMjU1LCBEQVRBX0xFTl9DT1VOVF9CSVRTKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGVzY19jb3VudCwgREFUQV9MRU5fRVNDX0NPVU5UX0JJVFMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGNudCwgREFUQV9MRU5fQ09VTlRfQklUUyk7CisgICAgICB9CisKKyAgICAgIGlmIChEQVRBX0JZVEVfQUxJR05fRkxBRykgeworICAgICAgICBJTlQgdG1wID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSk7CisgICAgICAgIEZES2J5dGVBbGlnbihoQml0U3RyZWFtLCBhbGlnbkFuY2hvcik7CisgICAgICAgIC8qIGNvdW50IGFjdHVhbCBiaXRzICovCisgICAgICAgIGRzZUJpdHNVc2VkICs9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pIC0gdG1wIC0gTUFYX0RBVEFfQUxJR05fQklUUzsKKyAgICAgIH0KKworICAgICAgLyogd3JpdGUgcGF5bG9hZCAqLworICAgICAgZm9yIChpPTA7IGk8Y250OyBpKyspIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGRhdGFCdWZmZXJbaV0sIDgpOworICAgICAgfQorICAgICAgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhoVHBFbmMsIGNyY1JlZyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChkc2VCaXRzVXNlZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEKKyAgICBkZXNjcmlwdGlvbjogIHdyaXRlIGV4dGVuc2lvbiBwYXlsb2FkIHRvIGJpdHN0cmVhbQorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIHdyaXR0ZW4gYml0cworICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FWFRFTlNJT04gICAgKnBFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgZWxJbnN0YW5jZVRhZywgLyogZm9yIERTRSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsICAgLyogZm9yIERTRSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgIGVwQ29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgI2RlZmluZSBGSUxMX0VMX0NPVU5UX0JJVFMgICAgICAoIDQgKQorICAjZGVmaW5lIEZJTExfRUxfRVNDX0NPVU5UX0JJVFMgICggOCApCisgICNkZWZpbmUgTUFYX0ZJTExfREFUQV9CWVRFUyAgICAgKCAyNjkgKQorCisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0gPSBOVUxMOworICBJTlQgcGF5bG9hZEJpdHMgPSBwRXh0ZW5zaW9uLT5uUGF5bG9hZEJpdHM7CisgIElOVCBleHRCaXRzVXNlZCA9IDA7CisKKyAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CisgICAgaEJpdFN0cmVhbSA9IHRyYW5zcG9ydEVuY19HZXRCaXRzdHJlYW0oaFRwRW5jKTsKKyAgfQorCisgIGlmIChzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpCisgIHsKKyAgICBpZiAoIHN5bnRheEZsYWdzICYgQUNfRFJNICkKKyAgICB7IC8qIENBVVRJT046IFRoZSBjYWxsZXIgaGFzIHRvIGFzc3VyZSB0aGF0IGZpbGwKKyAgICAgICAgICAgICAgICAgIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIFNCUiBwYXlsb2FkLiAqLworICAgICAgVUNIQVIgKmV4dFBheWxvYWREYXRhID0gcEV4dGVuc2lvbi0+cFBheWxvYWQ7CisKKyAgICAgIHN3aXRjaCAocEV4dGVuc2lvbi0+dHlwZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBFWFRfU0JSX0RBVEE6CisgICAgICAgIGNhc2UgRVhUX1NCUl9EQVRBX0NSQzoKKyAgICAgICAgICAvKiBTQlIgcGF5bG9hZCBpcyB3cml0dGVuIGluIHJldmVyc2UgKi8KKyAgICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgICBpLCB3cml0ZUJpdHMgPSBwYXlsb2FkQml0czsKKworICAgICAgICAgICAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBwYXlsb2FkQml0cy0xKTsgIC8qIERvZXMgYSBjYWNoZSBzeW5jIGludGVybmFsbHkgKi8KKworICAgICAgICAgICAgZm9yIChpPTA7IHdyaXRlQml0cyA+PSA4OyBpKyspIHsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzQndkKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKKyAgICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod3JpdGVCaXRzID4gMCkgeworICAgICAgICAgICAgICBGREt3cml0ZUJpdHNCd2QoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0+Pig4LXdyaXRlQml0cyksIHdyaXRlQml0cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZES3N5bmNDYWNoZUJ3ZCAoaEJpdFN0cmVhbSk7CisgICAgICAgICAgICBGREtwdXNoRm9yIChoQml0U3RyZWFtLCBwYXlsb2FkQml0cysxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZXh0Qml0c1VzZWQgKz0gcGF5bG9hZEJpdHM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFWFRfRklMTF9EQVRBOgorICAgICAgICBjYXNlIEVYVF9GSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IHdyaXRlQml0cyA9IHBheWxvYWRCaXRzOworICAgICAgICAgICAgd2hpbGUgKHdyaXRlQml0cyA+PSA4KSB7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAweDAwLCA4KTsKKyAgICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMHgwMCwgd3JpdGVCaXRzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZXh0Qml0c1VzZWQgKz0gcGF5bG9hZEJpdHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCAoc3ludGF4RmxhZ3MgJiBBQ19FTEQpICYmICgocEV4dGVuc2lvbi0+dHlwZT09RVhUX1NCUl9EQVRBKSB8fCAocEV4dGVuc2lvbi0+dHlwZT09RVhUX1NCUl9EQVRBX0NSQykpICkgeworCisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBpbnQgaSwgd3JpdGVCaXRzID0gcGF5bG9hZEJpdHM7CisgICAgICAgICAgVUNIQVIgKmV4dFBheWxvYWREYXRhID0gcEV4dGVuc2lvbi0+cFBheWxvYWQ7CisKKyAgICAgICAgICBmb3IgKGk9MDsgd3JpdGVCaXRzID49IDg7IGkrKykgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKKyAgICAgICAgICAgIHdyaXRlQml0cyAtPSA4OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAod3JpdGVCaXRzID4gMCkgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldPj4oOC13cml0ZUJpdHMpLCB3cml0ZUJpdHMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleHRCaXRzVXNlZCArPSBwYXlsb2FkQml0czsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRVIgb3Igc2NhbGFibGUgc3ludGF4IC0+IHdyaXRlIGV4dGVuc2lvbiBlbiBibG9jICovCisgICAgICAgIGV4dEJpdHNVc2VkICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvblBheWxvYWQoIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnBQYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyApOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvKiBXZSBoYXZlIG5vcm1hbCBHQSBiaXRzdHJlYW0gcGF5bG9hZCAoQU9UIDIsNSwyOSkgc28gcGFjaworICAgICAgIHRoZSBkYXRhIGludG8gYSBmaWxsIGVsZW1lbnRzIG9yIERTRXMgKi8KKworICAgIGlmICggcEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfREFUQV9FTEVNRU5UICkKKyAgICB7CisgICAgICBleHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVEYXRhU3RyZWFtRWxlbWVudCggaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dGVuc2lvbi0+blBheWxvYWRCaXRzPj4zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnBQYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgd2hpbGUgKHBheWxvYWRCaXRzID49IChFTF9JRF9CSVRTICsgRklMTF9FTF9DT1VOVF9CSVRTKSkgeworICAgICAgICBJTlQgY250LCBlc2NfY291bnQ9LTEsIGFsaWduQml0cz03OworCisgICAgICAgIGlmICggKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0ZJTExfREFUQSkgfHwgKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0ZJTCkgKQorICAgICAgICB7CisgICAgICAgICAgcGF5bG9hZEJpdHMgLT0gRUxfSURfQklUUyArIEZJTExfRUxfQ09VTlRfQklUUzsKKyAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPj0gMTUqOCkgeworICAgICAgICAgICAgcGF5bG9hZEJpdHMgLT0gRklMTF9FTF9FU0NfQ09VTlRfQklUUzsKKyAgICAgICAgICAgIGVzY19jb3VudCA9IDA7ICAvKiB3cml0ZSBlc2NfY291bnQgZXZlbiBpZiBjbnQgYmVjb21lcyBzbWFsbGVyIDE1ICovCisgICAgICAgICAgfQorICAgICAgICAgIGFsaWduQml0cyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjbnQgPSBmaXhNaW4oTUFYX0ZJTExfREFUQV9CWVRFUywgKHBheWxvYWRCaXRzK2FsaWduQml0cyk+PjMpOworCisgICAgICAgIGlmIChjbnQgPj0gMTUpIHsKKyAgICAgICAgICBlc2NfY291bnQgPSBjbnQgLSAxNSArIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgLyogd3JpdGUgYml0c3RyZWFtICovCisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIElEX0ZJTCwgRUxfSURfQklUUyk7CisgICAgICAgICAgaWYgKGVzY19jb3VudCA+PSAwKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMTUsIEZJTExfRUxfQ09VTlRfQklUUyk7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXNjX2NvdW50LCBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGNudCwgRklMTF9FTF9DT1VOVF9CSVRTKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHRCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRklMTF9FTF9DT1VOVF9CSVRTICsgKChlc2NfY291bnQ+PTApID8gRklMTF9FTF9FU0NfQ09VTlRfQklUUyA6IDApOworCisgICAgICAgIGNudCA9IGZpeE1pbihjbnQqOCwgcGF5bG9hZEJpdHMpOyAgLyogY29udmVydCBiYWNrIHRvIGJpdHMgKi8KKyAgICAgICAgZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZCggaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dGVuc2lvbi0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dGVuc2lvbi0+cFBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudCApOworICAgICAgICBwYXlsb2FkQml0cyAtPSBjbnQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChleHRCaXRzVXNlZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19CeXRlQWxpZ25tZW50CisgICAgZGVzY3JpcHRpb246CisgICAgcmV0dXJuczoKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0J5dGVBbGlnbm1lbnQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgaW50IGFsaWduQml0cykKK3sKKyAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIGFsaWduQml0cyk7Cit9CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAqcEVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgICAgICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgKnBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqcEJpdERlbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICBtaW5DbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19FTkNfT0s7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0gPSBOVUxMOworICBJTlQgICAgYml0RGVtYW5kID0gMDsKKyAgY29uc3QgIGVsZW1lbnRfbGlzdF90ICpsaXN0OworICBpbnQgICAgaSwgY2gsIGRlY2lzaW9uX2JpdDsKKyAgSU5UICAgIGNyY1JlZzEgPSAtMSwgY3JjUmVnMiA9IC0xOworICBVQ0hBUiAgbnVtYmVyT2ZDaGFubmVsczsKKworICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAvKiBHZXQgYml0c3RyZWFtIGhhbmRsZSAqLworICAgIGhCaXRTdHJlYW0gPSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKGhUcEVuYyk7CisgIH0KKworICBpZiAoIChwRWxJbmZvLT5lbFR5cGU9PUlEX1NDRSkgfHwgKHBFbEluZm8tPmVsVHlwZT09SURfTEZFKSApIHsKKyAgICBudW1iZXJPZkNoYW5uZWxzID0gMTsKKyAgfSBlbHNlIHsKKyAgICBudW1iZXJPZkNoYW5uZWxzID0gMjsKKyAgfQorCisgIC8qIEdldCBjaGFubmVsIGVsZW1lbnQgc2VxdWVuY2UgdGFibGUgKi8KKyAgbGlzdCA9IGdldEJpdHN0cmVhbUVsZW1lbnRMaXN0KGFvdCwgZXBDb25maWcsIG51bWJlck9mQ2hhbm5lbHMsIDApOworICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoIShzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpKSB7CisgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHBFbEluZm8tPmVsVHlwZSwgRUxfSURfQklUUyk7CisgICAgfQorICAgIGJpdERlbWFuZCArPSBFTF9JRF9CSVRTOworICB9CisKKyAgLyogSXRlcmF0ZSB0aHJvdWdoIHNlcXVlbmNlIHRhYmxlICovCisgIGkgPSAwOworICBjaCA9IDA7CisgIGRlY2lzaW9uX2JpdCA9IDA7CisgIGRvIHsKKyAgICAvKiBzb21lIHRtcCB2YWx1ZXMgKi8KKyAgICBTRUNUSU9OX0RBVEEgKnBDaFNlY3Rpb25EYXRhID0gTlVMTDsKKyAgICBJTlQgICpwQ2hTY2YgICAgICAgICAgID0gTlVMTDsKKyAgICBVSU5UICpwQ2hNYXhWYWx1ZUluU2ZiID0gTlVMTDsKKyAgICBUTlNfSU5GTyAqcFRuc0luZm8gICAgID0gTlVMTDsKKyAgICBJTlQgICBjaEdsb2JhbEdhaW4gICAgID0gMDsKKyAgICBJTlQgICBjaEJsb2NrVHlwZSAgICAgID0gMDsKKyAgICBJTlQgICBjaE1heFNmYlBlckdycCAgID0gMDsKKyAgICBJTlQgICBjaFNmYlBlckdycCAgICAgID0gMDsKKyAgICBJTlQgICBjaFNmYkNudCAgICAgICAgID0gMDsKKyAgICBJTlQgICBjaEZpcnN0U2NmICAgICAgID0gMDsKKworICAgIGlmIChtaW5DbnQ9PTApIHsKKyAgICAgIGlmICggcWNPdXRDaGFubmVsIT1OVUxMICkgeworICAgICAgICBwQ2hTZWN0aW9uRGF0YSAgID0gJihxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YSk7CisgICAgICAgIHBDaFNjZiAgICAgICAgICAgPSAgcWNPdXRDaGFubmVsW2NoXS0+c2NmOworICAgICAgICBjaEdsb2JhbEdhaW4gICAgID0gIHFjT3V0Q2hhbm5lbFtjaF0tPmdsb2JhbEdhaW47CisgICAgICAgIHBDaE1heFZhbHVlSW5TZmIgPSAgcWNPdXRDaGFubmVsW2NoXS0+bWF4VmFsdWVJblNmYjsKKyAgICAgICAgY2hCbG9ja1R5cGUgICAgICA9ICBwQ2hTZWN0aW9uRGF0YS0+YmxvY2tUeXBlOworICAgICAgICBjaE1heFNmYlBlckdycCAgID0gIHBDaFNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgY2hTZmJQZXJHcnAgICAgICA9ICBwQ2hTZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXA7CisgICAgICAgIGNoU2ZiQ250ICAgICAgICAgPSAgcENoU2VjdGlvbkRhdGEtPnNmYkNudDsKKyAgICAgICAgY2hGaXJzdFNjZiAgICAgICA9ICBwQ2hTY2ZbcENoU2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBnZXQgdmFsdWVzIGZyb20gUFNZICovCisgICAgICAgIGNoU2ZiQ250ICAgICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgY2hTZmJQZXJHcnAgICAgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CisgICAgICAgIGNoTWF4U2ZiUGVyR3JwID0gcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOworICAgICAgfQorICAgICAgcFRuc0luZm8gPSAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm87CisgICAgfSAvKiBtaW5DbnQ9PTAgKi8KKworICAgIGlmICggcWNPdXRDaGFubmVsPT1OVUxMICkgeworICAgICAgY2hCbG9ja1R5cGUgICAgPSBwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlOworICAgIH0KKworICAgIHN3aXRjaCAobGlzdC0+aWRbaV0pCisgICAgeworICAgIGNhc2UgZWxlbWVudF9pbnN0YW5jZV90YWc6CisgICAgICAvKiBXcml0ZSBlbGVtZW50IGluc3RhbmNlIHRhZyAqLworICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcEVsSW5mby0+aW5zdGFuY2VUYWcsIDQpOworICAgICAgfQorICAgICAgYml0RGVtYW5kICs9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgY29tbW9uX3dpbmRvdzoKKyAgICAgIC8qIFdyaXRlIGNvbW1vbiB3aW5kb3cgZmxhZyAqLworICAgICAgZGVjaXNpb25fYml0ID0gcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93OworICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93LCAxKTsKKyAgICAgIH0KKyAgICAgIGJpdERlbWFuZCArPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGljc19pbmZvOgorICAgICAgLyogV3JpdGUgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KKyAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlSWNzSW5mbyggY2hCbG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hNYXhTZmJQZXJHcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBsdHBfZGF0YV9wcmVzZW50OgorICAgICAgLyogV3JpdGUgTFRQIGRhdGEgcHJlc2VudCBmbGFnICovCisgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIGJpdERlbWFuZCArPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGx0cF9kYXRhOgorICAgICAgLyogUHJlZGljdG9yIGRhdGEgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgIE5vdGhpbmcgdG8gZG8gaGVyZS4gKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBtczoKKyAgICAgIC8qIFdyaXRlIE1TIGluZm8gKi8KKyAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlTVNJbmZvKCBjaFNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFNmYlBlckdycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaE1heFNmYlBlckdycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWluQ250PT0wKSA/IHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA6IE1TX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBnbG9iYWxfZ2FpbjoKKyAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbiggY2hHbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEZpcnN0U2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNjYWxlICk7CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc2VjdGlvbl9kYXRhOgorICAgICAgeworICAgICAgICBJTlQgc2lCaXRzID0gRkRLYWFjRW5jX2VuY29kZVNlY3Rpb25EYXRhKHBDaFNlY3Rpb25EYXRhLCBoQml0U3RyZWFtLCAoc3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSk/MTowKTsKKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIGlmIChzaUJpdHMgIT0gcWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuc2lkZUluZm9CaXRzKSB7CisgICAgICAgICAgICBlcnJvciA9IEFBQ19FTkNfV1JJVEVfU0VDX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiaXREZW1hbmQgKz0gc2lCaXRzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNjYWxlX2ZhY3Rvcl9kYXRhOgorICAgICAgeworICAgICAgICBJTlQgc2ZEYXRhQml0cyA9IEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEoIHBDaE1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoU2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoU2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoR2xvYmFsR2FpbiApOworICAgICAgICBpZiAoIChoQml0U3RyZWFtICE9IE5VTEwpCisgICAgICAgICAgJiYgKHNmRGF0YUJpdHMgIT0gKHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLnNjYWxlZmFjQml0cyArIHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cykpICkgeworICAgICAgICAgICBlcnJvciA9IEFBQ19FTkNfV1JJVEVfU0NBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBiaXREZW1hbmQgKz0gc2ZEYXRhQml0czsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlc2MyX3J2bGM6CisgICAgICBpZiAoc3ludGF4RmxhZ3MgJiBBQ19FUl9SVkxDKSB7CisgICAgICAgIC8qIHdyaXRlIFJWTEMgZGF0YSBpbnRvIGJpdHN0cmVhbSAoZXJyb3Igc2Vucy4gY2F0LiAyKSAqLworICAgICAgICBlcnJvciA9IEFBQ19FTkNfVU5TVVBQT1JURURfQU9UOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHB1bHNlOgorICAgICAgLyogV3JpdGUgcHVsc2UgZGF0YSAqLworICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVQdWxzZURhdGEoaEJpdFN0cmVhbSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdG5zX2RhdGFfcHJlc2VudDoKKyAgICAgIC8qIFdyaXRlIFROUyBkYXRhIHByZXNlbnQgZmxhZyAqLworICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVUbnNEYXRhUHJlc2VudChwVG5zSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hCbG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0bnNfZGF0YToKKyAgICAgIC8qIFdyaXRlIFROUyBkYXRhICovCisgICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZVRuc0RhdGEocFRuc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hCbG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGE6CisgICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50OgorICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVHYWluQ29udHJvbERhdGEoaEJpdFN0cmVhbSk7CisgICAgICBicmVhazsKKworCisgICAgY2FzZSBlc2MxX2hjcjoKKyAgICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VSX0hDUikKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfRU5DX1VOS05PV047CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3BlY3RyYWxfZGF0YToKKyAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIElOVCBzcGVjdHJhbEJpdHMgPSAwOworCisgICAgICAgICAgc3BlY3RyYWxCaXRzID0gRkRLYWFjRW5jX2VuY29kZVNwZWN0cmFsRGF0YSggcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoU2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0gKTsKKworICAgICAgICBpZiAoc3BlY3RyYWxCaXRzICE9IHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZtYW5CaXRzKSB7CisgICAgICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVEVfU1BFQ19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBiaXREZW1hbmQgKz0gc3BlY3RyYWxCaXRzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIE5vbiBkYXRhIGNhc2VzICovCisgICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzE6CisgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydEVuY19DcmNTdGFydFJlZyhoVHBFbmMsIDE5Mik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGFkdHNjcmNfc3RhcnRfcmVnMjoKKyAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICBjcmNSZWcyID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMTI4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMToKKyAgICBjYXNlIGRybWNyY19lbmRfcmVnOgorICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CisgICAgICAgIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoaFRwRW5jLCBjcmNSZWcxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMjoKKyAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKGhUcEVuYywgY3JjUmVnMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGRybWNyY19zdGFydF9yZWc6CisgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydEVuY19DcmNTdGFydFJlZyhoVHBFbmMsIDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBuZXh0X2NoYW5uZWw6CisgICAgICBjaCA9IChjaCArIDEpICUgbnVtYmVyT2ZDaGFubmVsczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGlua19zZXF1ZW5jZToKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0W2RlY2lzaW9uX2JpdF07CisgICAgICBpPS0xOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBBQUNfRU5DX1VOS05PV047CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IgIT0gQUFDX0VOQ19PSykgeworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGkrKzsKKworICB9IHdoaWxlIChsaXN0LT5pZFtpXSAhPSBlbmRfb2Zfc2VxdWVuY2UpOworCitiYWlsOgorICBpZiAocEJpdERlbWFuZCAhPSBOVUxMKSB7CisgICAgKnBCaXREZW1hbmQgPSBiaXREZW1hbmQ7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqIHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgZXBDb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShoVHBFbmMpOworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CisgIGludCAgIGksIG4sIGRvQnl0ZUFsaWduID0gMTsKKyAgSU5UICAgYml0TWFya1VwOworICBJTlQgICBmcmFtZUJpdHM7CisgIC8qIEdldCBmaXJzdCBiaXQgb2YgcmF3IGRhdGEgYmxvY2suCisgICAgIEluIGNhc2Ugb2YgQURUUytQQ0UsIEFVIHdvdWxkIHN0YXJ0IGF0IFBDRS4KKyAgICAgVGhpcyBpcyBva2F5IGJlY2F1c2UgUENFIGFzc3VyZXMgYWxpZ25tZW50LiAqLworICBVSU5UIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgZnJhbWVCaXRzID0gYml0TWFya1VwID0gYWxpZ25BbmNob3I7CisKKworICAvKiBDaGFubmVsIGVsZW1lbnQgbG9vcCAqLworICBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2ldOworICAgIElOVCBlbGVtZW50VXNlZEJpdHMgPSAwOworCisgICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBJRF9TQ0U6ICAgICAgLyogc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgY2FzZSBJRF9DUEU6ICAgICAgLyogY2hhbm5lbCBwYWlyICovCisgICAgICAgIGNhc2UgSURfTEZFOiAgICAgIC8qIGxvdyBmcmVxIGVmZmVjdHMgY2hhbm5lbCAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKCBBQUNfRU5DX09LICE9IChFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLCAgIC8qIHN5bnRheEZsYWdzIChFUiB0b29scyAuLi4pICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LCAgICAgICAgICAgLyogYW90OiBBT1RfQUFDX0xDLCBBT1RfU0JSLCBBT1RfUFMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywgICAgICAvKiBlcENvbmZpZyAtMSwgMCwgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApKSApCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICggIShzeW50YXhGbGFncyAmIEFDX0VSKSApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgYXNzb2NpYXRlZCBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5xY0VsZW1lbnRbaV0tPm5FeHRlbnNpb25zOyBuKyspIHsKKyAgICAgICAgICAgICAgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKiBJbiBGREssIERTRSBzaWduYWxsaW5nIGV4cGxpY2l0IGRvbmUgaW4gZWxEU0UuIFNlZSBjaGFubmVsX21hcC5jcHAgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0VMRU1FTlRJTkZPX1RZUEU7CisKKyAgICB9ICAgLyogc3dpdGNoICovCisKKyAgICBpZihlbEluZm8uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgZWxlbWVudFVzZWRCaXRzIC09IGJpdE1hcmtVcDsKKyAgICAgIGJpdE1hcmtVcCAgICAgICAgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgICAgIGVsZW1lbnRVc2VkQml0cyArPSBiaXRNYXJrVXA7CisgICAgICBmcmFtZUJpdHMgICAgICAgKz0gZWxlbWVudFVzZWRCaXRzOworICAgIH0KKworICB9IC8qIGZvciAoaT0wOyBpPGNoYW5uZWxNYXBwaW5nLm5FbGVtZW50czsgaSsrKSAqLworCisgIGlmICggKHN5bnRheEZsYWdzICYgQUNfRVIpICYmICEoc3ludGF4RmxhZ3MgJiBBQ19EUk0pICkKKyAgeworICAgIFVDSEFSIGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlblsoOCldWygxKV07IC8qIDA6IGV4dGVuc2lvbiBub3QgdG91Y2hlZCwgMTogZXh0ZW5zaW9uIGFscmVhZHkgd3JpdHRlbiAqLworCisgICAgRkRLbWVtY2xlYXIoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuLCBzaXplb2YoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuKSk7CisKKyAgICBpZiAoIHN5bnRheEZsYWdzICYgQUNfRUxEICkgeworCisgICAgICBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5xY0VsZW1lbnRbaV0tPm5FeHRlbnNpb25zOyBuKyspIHsKKworICAgICAgICAgIGlmICggKHFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXS50eXBlPT1FWFRfU0JSX0RBVEEpCisgICAgICAgICAgICB8fCAocWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLnR5cGU9PUVYVF9TQlJfREFUQV9DUkMpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBXcml0ZSBzYnIgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKKworICAgICAgICAgICAgY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuW2ldW25dID0gMTsKKyAgICAgICAgICB9IC8qIFNCUiAqLworICAgICAgICB9IC8qIG4gKi8KKyAgICAgIH0gLyogaSAqLworICAgIH0gLyogQUNfRUxEICovCisKKyAgICBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGZvciAobiA9IDA7IG4gPCBxY091dC0+cWNFbGVtZW50W2ldLT5uRXh0ZW5zaW9uczsgbisrKSB7CisKKyAgICAgICAgaWYgKGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbltpXVtuXT09MCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdyaXRlIGFsbCByYW1haW5pbmcgZXh0ZW5zaW9uIHBheWxvYWRzIGluIGVsZW1lbnQgKi8KKyAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CisgICAgICAgIH0KKyAgICAgIH0gLyogbiAqLworICAgIH0gLyogaSAqLworICB9IC8qIGlmIEFDX0VSICovCisKKyAgLyogRXh0ZW5kIGdsb2JhbCBleHRlbnNpb24gcGF5bG9hZCB0YWJsZSB3aXRoIGZpbGwgYml0cyAqLworICBpZiAoIHN5bnRheEZsYWdzICYgQUNfRFJNICkKKyAgeworICAgIC8qIEV4Y2VwdGlvbiBmb3IgRHJtICovCisgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5uRXh0ZW5zaW9uczsgbisrKSB7CisgICAgICBpZiAoIChxY091dC0+ZXh0ZW5zaW9uW25dLnR5cGUgPT0gRVhUX1NCUl9EQVRBKQorICAgICAgICB8fCAocWNPdXQtPmV4dGVuc2lvbltuXS50eXBlID09IEVYVF9TQlJfREFUQV9DUkMpICkgeworICAgICAgICAvKiBTQlIgZGF0YSBtdXN0IGJlIHRoZSBsYXN0IGV4dGVuc2lvbiEgKi8KKyAgICAgICAgRkRLbWVtY3B5KCZxY091dC0+ZXh0ZW5zaW9uW3FjT3V0LT5uRXh0ZW5zaW9uc10sICZxY091dC0+ZXh0ZW5zaW9uW25dLCBzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLyogRG8gYnl0ZSBhbGlnbm1lbnQgYWZ0ZXIgQUFDICgrIE1QUykgcGF5bG9hZC4KKyAgICAgICBBc3N1cmUgdGhhdCBNUFMgaGFzIGJlZW4gd3JpdHRlbiBhcyBjaGFubmVsIGFzc2lnbmVkIGV4dGVuc2lvbiBwYXlsb2FkISAqLworICAgIGlmICgoKEZES2dldFZhbGlkQml0cyhoQnMpLWFsaWduQW5jaG9yKyhVSU5UKXFjT3V0LT50b3RGaWxsQml0cykmMHg3KSE9KFVJTlQpcWNPdXQtPmFsaWduQml0cykgeworICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVFRFTl9CSVRTX0VSUk9SOworICAgIH0KKyAgICBGREthYWNFbmNfQnl0ZUFsaWdubWVudChoQnMsIHFjT3V0LT5hbGlnbkJpdHMpOworICAgIGRvQnl0ZUFsaWduID0gMDsKKworICB9IC8qIEFDX0RSTSAqLworCisgIC8qIEFkZCBmaWxsIGRhdGEgLyBzdHVmZmluZyBiaXRzICovCisgIG4gPSBxY091dC0+bkV4dGVuc2lvbnM7CisgIHFjT3V0LT5leHRlbnNpb25bbl0udHlwZSA9IEVYVF9GSUxMX0RBVEE7CisgIHFjT3V0LT5leHRlbnNpb25bbl0ublBheWxvYWRCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzOworICBxY091dC0+bkV4dGVuc2lvbnMrKzsKKworICAvKiBXcml0ZSBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgYW5kIGZpbGwgZGF0YSAqLworICBmb3IgKG4gPSAwOyAobiA8IHFjT3V0LT5uRXh0ZW5zaW9ucykgJiYgKG4gPCAoMisyKSk7IG4rKykKKyAgeworICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+ZXh0ZW5zaW9uW25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CisKKyAgICAvKiBGb3IgRVhUX0ZJTCBvciBFWFRfRklMTF9EQVRBIHdlIGNvdWxkIGRvIGFuIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrIGhlcmUgKi8KKyAgfQorCisgIGlmICghKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFfEFDX0VSKSkpIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBJRF9FTkQsIEVMX0lEX0JJVFMpOworICB9CisKKyAgaWYgKGRvQnl0ZUFsaWduKSB7CisgICAgLyogQXNzdXJlIGJ5dGUgYWxpZ25tZW50Ki8KKyAgICBpZiAoKChhbGlnbkFuY2hvci1GREtnZXRWYWxpZEJpdHMoaEJzKSkmMHg3KSE9KFVJTlQpcWNPdXQtPmFsaWduQml0cykgeworICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVFRFTl9CSVRTX0VSUk9SOworICAgIH0KKworICAgIEZES2FhY0VuY19CeXRlQWxpZ25tZW50KGhCcywgcWNPdXQtPmFsaWduQml0cyk7CisgIH0KKworICBmcmFtZUJpdHMgLT0gYml0TWFya1VwOworICBmcmFtZUJpdHMgKz0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoaFRwRW5jLCAmZnJhbWVCaXRzKTsKKworICBpZiAoZnJhbWVCaXRzICE9IHFjT3V0LT50b3RhbEJpdHMgKyBxY0tlcm5lbC0+Z2xvYkhkckJpdHMpeworICAgIHJldHVybiBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUjsKKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmggYi9hYWMvbGliQUFDZW5jL3NyYy9iaXRlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThiZTdjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmgKQEAgLTAsMCArMSwxODMgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JJVEVOQ19ICisjZGVmaW5lIF9CSVRFTkNfSAorCisKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgorI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiICAgIC8qIG9ic29sZXRlLCB3aGVuIFBTWV9PVVQgaXMgdGhyb3duIG91dCBvZiB0aGUgV3JpdEJTLWNhbGwhICovCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisjaW5jbHVkZSAiYWFjZW5jLmgiCisKKyNpbmNsdWRlICJ0cGVuY19saWIuaCIKKwordHlwZWRlZiBlbnVteworICBNQVhfRU5DT0RFUl9DSEFOTkVMUyAgPSA5LAorICBNQVhfQkxPQ0tfVFlQRVMgICAgICAgPSA0LAorICBNQVhfQUFDX0xBWUVSUyAgICAgICAgPSA5LAorICBNQVhfTEFZRVJTICAgICAgICAgICAgPSBNQVhfQUFDX0xBWUVSUyAgLCAvKiBvbmx5IG9uZSBjb3JlIGxheWVyIGlmIHByZXNlbnQgKi8KKyAgRklSU1RfTEFZICAgICAgICAgICAgID0gMSAgIC8qIGRlZmF1bHQgbGF5ZXIgbnVtYmVyIGZvciBBQUMgbm9uc2NhbGFibGUgKi8KK30gX01BWF9DT05TVDsKKworI2RlZmluZSBCVUZGRVJfTVhfSFVGRkNCX1NJWkUgKDMyKnNpemVvZihJTlQpKSAgLyogb3VyIEZES19iaXRidWZmZXIgbmVlZHMgc2l6ZSBvZiBwb3dlciAyICovCisKKyNkZWZpbmUgRUxfSURfQklUUyAgKCAzICkKKworCisvKioKKyAqIFxicmllZiBBcmJpdHJhcnkgb3JkZXIgYml0c3RyZWFtIHdyaXRlci4gVGhpcyBmdW5jdGlvbiBjYW4gZWl0aGVyIGFzc2VtYmxlIGEgYml0IHN0cmVhbQorICogICAgICAgIGFuZCB3cml0ZSBpbnRvIHRoZSBiaXQgYnVmZmVyIG9mIGhUcEVuYyBvciBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cyAoc2lnbmFsIGluZGVwZW5kZW50KQorICogICAgICAgIFRwRW5jIGhhbmRsZSBtdXN0IGJlIE5VTEwgaW4gdGhpcyBjYXNlLiBPciBhbHNvIENhbGN1bGF0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBudW1iZXIgb2YKKyAqICAgICAgICBzdGF0aWMgYml0cyB3aGljaCBieSBkaXNhYmxpbmcgYWxsIHRvb2xzIGUuZy4gTVMsIFROUyBhbmQgc2JmQ250PTAuIFRoZSBtaW5DbnQgcGFyYW1ldGVyCisgKiAgICAgICAgaGFzIHRvIGJlIDEgaW4gdGhpcyBsYXR0ZXIgY2FzZS4KKyAqIFxwYXJhbSBoVHBFbmMgVHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLiBJZiBOVUxMLCB0aGUgbnVtYmVyIG9mIHN0YXRpYyBiaXRzIHdpbGwgYmUgcmV0dXJuZWQgaW50bworICogICAgICAgICpwQml0RGVtYW5kLgorICogXHBhcmFtIHBFbEluZm8KKyAqIFxwYXJhbSBxY091dENoYW5uZWwKKyAqIFxwYXJhbSBoUmVvcmRlckluZm8KKyAqIFxwYXJhbSBwc3lPdXRFbGVtZW50CisgKiBccGFyYW0gcHN5T3V0Q2hhbm5lbAorICogXHBhcmFtIHN5bnRheEZsYWdzIEJpdCBzdHJlYW0gc3ludGF4IGZsYWdzIGFzIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmggKEF1ZGlvIENvZGVjIGZsYWdzKS4KKyAqIFxwYXJhbSBhb3QKKyAqIFxwYXJhbSBlcENvbmZpZworICogXHBhcmFtIHBCaXREZW1hbmQgUG9pbnRlciB0byBhbiBpbnQgd2hlcmUgdGhlIGFtb3VudCBvZiBiaXRzIGlzIHJldHVybmVkIGludG8uIFRoZSByZXR1cm5lZCB2YWx1ZQorICogICAgICAgIGRlcGVuZHMgb24gaWYgaFRwRW5jIGlzIE5VTEwgYW5kIG1pbkNudC4KKyAqIFxwYXJhbSBtaW5DbnQgSWYgbm9uLXplcm8gdGhlIHZhbHVlIHJldHVybmVkIGludG8gKnBCaXREZW1hbmQgaXMgdGhlIGFic29sdXRlIG1pbmltdW0gcmVxdWlyZWQgYW1vdW50IG9mCisgKiAgICAgICAgc3RhdGljIGJpdHMgaW4gb3JkZXIgdG8gd3JpdGUgYSB2YWxpZCBiaXQgc3RyZWFtLgorICogXHJldHVybiBBQUNfRU5DT0RFUl9FUlJPUiBlcnJvciBjb2RlCisgKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAqcEVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgICAgICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgKnBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqcEJpdERlbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICBtaW5DbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKy8qKgorICogXGJyaWVmIFdyaXRlIGJpdCBzdHJlYW0gb3IgYWNjb3VudCBzdGF0aWMgYml0cworICogXHBhcmFtIGhUcEVuYyB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuIElmIE5VTEwsIHRoZSBmdW5jdGlvbiB3aWxsCisgKiAgICAgICAgbm90IHdyaXRlIGFueSBiaXQgc3RyZWFtIGRhdGEgYnV0IG9ubHkgY291bnQgdGhlIGFtb3VudAorICogICAgICAgIG9mIHN0YXRpYyAoc2lnbmFsIGluZGVwZW5kZW50KSBiaXRzCisgKiBccGFyYW0gY2hhbm5lbE1hcHBpbmcgQ2hhbm5lbCBtYXBwaW5nIGluZm8KKyAqIFxwYXJhbSBxY091dAorICogXHBhcmFtIHBzeU91dAorICogXHBhcmFtIHFjS2VybmVsCisgKiBccGFyYW0gaEJTRQorICogXHBhcmFtIGFvdCBBdWRpbyBPYmplY3QgVHlwZSBiZWluZyBlbmNvZGVkCisgKiBccGFyYW0gc3ludGF4RmxhZ3MgRmxhZ3MgaW5kaWNhdGluZyBmb3JtYXQgc3BlY2lmaWMgZGV0YWlsCisgKiBccGFyYW0gZXBDb25maWcgRXJyb3IgcHJvdGVjdGlvbiBjb25maWcKKyAqLworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtIChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCogcHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgZXBDb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FWFRFTlNJT04gICAgKnBFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgZWxJbnN0YW5jZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgZXBDb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworI2VuZGlmIC8qIF9CSVRFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzZTI3NQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jcHAKQEAgLTAsMCArMSw1NDUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lciwgVG9iaWFzIENoYWx1cGthCisgICBEZXNjcmlwdGlvbjogQmxvY2sgc3dpdGNoaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKworI2RlZmluZSBMT1dPVl9XSU5ET1cgX0xPV09WX1dJTkRPVworCisvKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLworCitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShjb25zdCBGSVhQX0RCTCBpbltdLCBjb25zdCBJTlQgYmxTd1duZElkeCk7CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KAorICAgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqUkVTVFJJQ1QgYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgd2luZG93TGVuLAorICAgICAgICBjb25zdCBJTlRfUENNICAgICAgICAgICAqcFRpbWVTaWduYWwKKyAgICAgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgICAgICAgICBTVEFSVCAgICAgICAgU0hPUlQgICAgICAgICBTVE9QICAgICAgICAgTE9XT1YgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGNvbnN0IElOVCBibG9ja1R5cGUyd2luZG93U2hhcGVbMl1bNV0gPSB7IHtTSU5FX1dJTkRPVywgS0JEX1dJTkRPVywgIFdST05HX1dJTkRPVywgU0lORV9XSU5ET1csIEtCRF9XSU5ET1d9LCAgICAgLyogTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0JEX1dJTkRPVywgIFNJTkVfV0lORE9XLCBTSU5FX1dJTkRPVywgIEtCRF9XSU5ET1csICBXUk9OR19XSU5ET1d9IH07IC8qIExDICovCisKKy8qIElJUiBoaWdoIHBhc3MgY29lZmZzICovCisKKyNpZm5kZWYgU0lORVRBQkxFXzE2QklUCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBoaVBhc3NDb2VmZltCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl09Cit7CisgIEZMMkZYQ09OU1RfREJMKC0wLjUwOTUpLEZMMkZYQ09OU1RfREJMKDAuNzU0OCkKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjdmKTsKKy8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZBdHRhY2tSYXRpbyA9IEZMMkZYQ09OU1RfREJMKDAuMWYpOyAgICAgICAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KKworLyogVGhlIG5leHQgY29uc3RhbnRzIGFyZSBzY2FsZWQsIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBmb3IgY29tcGFyaXNvbiB3aXRoIHNjYWxlZCB2YWx1ZXMqLworLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5BdHRhY2tOcmcgPSAoRkwyRlhDT05TVF9EQkwoMWUrNmYqTk9STV9QQ01fRU5FUkdZKT4+QkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCk7IC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBoaVBhc3NDb2VmZltCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl09Cit7CisgIEZMMkZYQ09OU1RfU0dMKC0wLjUwOTUpLEZMMkZYQ09OU1RfU0dMKDAuNzU0OCkKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCitzdGF0aWMgY29uc3QgRklYUF9TR0wgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX1NHTCgwLjdmKTsKKy8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBpbnZBdHRhY2tSYXRpbyA9IEZMMkZYQ09OU1RfU0dMKDAuMWYpOyAgICAgICAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KKy8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQXR0YWNrTnJnID0gKEZMMkZYQ09OU1RfREJMKDFlKzZmKk5PUk1fUENNX0VORVJHWSk+PkJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQpOyAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLworCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKiogaW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKiBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KQoreworICBGREttZW1jbGVhciAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBzaXplb2YoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wpKTsKKworICBpZiAoaXNMb3dEZWxheSkKKyAgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93cyA9IDQ7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzICAgID0gMDsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkICAgICAgPSAwOworICB9CisgIGVsc2UKKyAgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93cyA9IDg7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzICAgID0gMTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkICAgICAgPSAxOworICB9CisKKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICAgICAgICAgPSBNQVhfTk9fT0ZfR1JPVVBTOworCisgIC8qIEluaXRpYWxpemUgc3RhcnR2YWx1ZSBmb3IgYmxvY2t0eXBlICovCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlICAgID0gTE9OR19XSU5ET1c7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgICAgICAgICAgID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOworCit9CisKK3N0YXRpYyBjb25zdCBJTlQgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtUUkFOU19GQUNdW01BWF9OT19PRl9HUk9VUFNdID0KK3sKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDAgKi8gezEsICAzLCAgMywgIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMSAqLyB7MSwgIDEsICAzLCAgM30sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAgMSwgIDMsICAyfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDMgKi8gezMsICAxLCAgMywgIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNCAqLyB7MywgIDEsICAxLCAgM30sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAgMiwgIDEsICAyfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDYgKi8gezMsICAzLCAgMSwgIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNyAqLyB7MywgIDMsICAxLCAgMX0KK307CisKKy8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuIGF0dGFjayAqLworLyogYXNzdW1lIG5vIGxvb2stYWhlYWQgKi8KK3N0YXRpYyBjb25zdCBJTlQgY2hnV25kU3FbMl1bTl9CTE9DS1RZUEVTXSA9Cit7CisgIC8qICAgICAgICAgICAgIExPTkcgV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XLCAgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1cgKi8KKyAgLypubyBhdHRhY2sqLyB7TE9OR19XSU5ET1csICBTVE9QX1dJTkRPVywgIFdST05HX1dJTkRPVywgTE9OR19XSU5ET1csICBTVE9QX1dJTkRPVyAsIFdST05HX1dJTkRPVyB9LAorICAvKmF0dGFjayAgICovIHtTVEFSVF9XSU5ET1csIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XLCBTVEFSVF9XSU5ET1csIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XIH0KK307CisKKy8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuIGF0dGFjayAqLworLyogYXNzdW1lIGxvb2stYWhlYWQgKi8KK3N0YXRpYyBjb25zdCBJTlQgY2hnV25kU3FMa0FoZFsyXVsyXVtOX0JMT0NLVFlQRVNdID0KK3sKKyAgLyphdHRhY2sgICAgICAgICBMT05HIFdJTkRPVyAgICBTVEFSVF9XSU5ET1cgICBTSE9SVF9XSU5ET1cgICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovICAvKiBsYXN0IGF0dGFjayAqLworICAvKm5vIGF0dGFjayovIHsge0xPTkdfV0lORE9XLCAgIFNIT1JUX1dJTkRPVywgIFNUT1BfV0lORE9XLCAgIExPTkdfV0lORE9XLCAgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9LCAgIC8qIG5vIGF0dGFjayAgICovCisgIC8qYXR0YWNrICAgKi8gICB7U1RBUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30gfSwgLyogbm8gYXR0YWNrICAgKi8KKyAgLypubyBhdHRhY2sqLyB7IHtMT05HX1dJTkRPVywgICBTSE9SVF9XSU5ET1csICBTSE9SVF9XSU5ET1csICBMT05HX1dJTkRPVywgIFdST05HX1dJTkRPVywgV1JPTkdfV0lORE9XfSwgICAvKiBhdHRhY2sgICAgICAqLworICAvKmF0dGFjayAgICovICAge1NUQVJUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9IH0gIC8qIGF0dGFjayAgICAgICovCit9OworCitpbnQgRkRLYWFjRW5jX0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBpbnQgaXNMRkUsIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKQoreworICAgIFVJTlQgaTsKKyAgICBGSVhQX0RCTCBlbk0xLCBlbk1heDsKKworICAgIFVJTlQgbkJsb2NrU3dpdGNoV2luZG93cyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsKKworICAgIC8qIGZvciBMRkUgOiBvbmx5IExPTkcgd2luZG93IGFsbG93ZWQgKi8KKyAgICBpZiAoaXNMRkUpIHsKKworICAgICAgLyogY2FzZSBMRkU6ICovCisgICAgICAvKiBvbmx5IGxvbmcgYmxvY2tzLCBhbHdheXMgdXNlIHNpbmUgd2luZG93cyAoTVBFRzIgQUFDLCBNUEVHNCBBQUMpICovCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICA9IDE7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzBdICAgID0gMTsKKworICAgICAgcmV0dXJuKDApOworICAgIH07CisKKyAgICAvKiBTYXZlIGN1cnJlbnQgYXR0YWNrIGluZGV4IGFzIGxhc3QgYXR0YWNrIGluZGV4ICovCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2s7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4OworCisgICAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCisgICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXSwgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdKSk7CisgICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdKSk7CisKKyAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzKQorICAgIHsKKyAgICAgIC8qIENhbGN1bGF0ZSBzdWdnZXN0ZWQgZ3JvdXBpbmcgaW5mbyBmb3IgdGhlIGxhc3QgZnJhbWUgKi8KKworICAgICAgLyogUmVzZXQgZ3JvdXBpbmcgaW5mbyAqLworICAgICAgRkRLbWVtY2xlYXIgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuKSk7CisKKyAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOworCisgICAgICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleF0sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuKSk7CisKKyAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9PSBUUlVFKQorICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXgpOworICAgICAgZWxzZQorICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKworICAgIH0KKworCisgICAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8gc2VnbWVudHMgKi8KKyAgICBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wsIGdyYW51bGVMZW5ndGg+PihuQmxvY2tTd2l0Y2hXaW5kb3dzPT00PyAyOjMgKSwgcFRpbWVTaWduYWwpOworCisgICAgLyogbm93IGNhbGN1bGF0ZSBpZiB0aGVyZSBpcyBhbiBhdHRhY2sgKi8KKworICAgIC8qIHJlc2V0IGF0dGFjayAqLworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7CisKKyAgICAvKiBsb29rIGZvciBhdHRhY2sgKi8KKyAgICBlbk1heCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bbkJsb2NrU3dpdGNoV2luZG93cy0xXTsKKworICAgIGZvciAoaT0wOyBpPG5CbG9ja1N3aXRjaFdpbmRvd3M7IGkrKykgeworICAgICAgICBGSVhQX0RCTCB0bXAgPSBmTXVsdERpdjIob25lTWludXNBY2NXaW5kb3dOcmdGYWMsIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnKTsKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSBmTXVsdEFkZCh0bXAsIGFjY1dpbmRvd05yZ0ZhYywgZW5NMSkgOworCisgICAgICAgIGlmIChmTXVsdChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1baV0saW52QXR0YWNrUmF0aW8pID4gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgKSB7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldOworICAgICAgICBlbk1heCA9IGZpeE1heChlbk1heCwgZW5NMSk7CisgICAgfQorCisKKyAgICBpZiAoZW5NYXggPCBtaW5BdHRhY2tOcmcpIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7CisKKyAgICAvKiBDaGVjayBpZiBhdHRhY2sgc3ByZWFkcyBvdmVyIGZyYW1lIGJvcmRlciAqLworICAgIGlmKChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9PSBGQUxTRSkgJiYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9PSBUUlVFKSkgeworICAgICAgICAvKiBpZiBhdHRhY2sgaXMgaW4gbGFzdCB3aW5kb3cgcmVwZWF0IFNIT1JUX1dJTkRPVyAqLworICAgICAgICBpZiAoICgoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MtMV0+PjQpID4gZk11bHQoKEZJWFBfREJMKSgxMDw8KERGUkFDVF9CSVRTLTEtNCkpLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bMV0pKQorICAgICAgICAgICAmJiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPT0gKElOVCluQmxvY2tTd2l0Y2hXaW5kb3dzLTEpCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQpCisgICAgeworCisKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgY2hnV25kU3FMa0FoZFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2tdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBMb3cgRGVsYXkgKi8KKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgY2hnV25kU3FbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgICB9CisKKworICAgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NoYXBlID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOworCisgICAgcmV0dXJuKDApOworfQorCisKKworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koY29uc3QgRklYUF9EQkwgaW5bXSwgY29uc3QgSU5UIGJsU3dXbmRJZHgpCit7CisvKiBGb3IgY29oZXJlbmN5LCBjaGFuZ2UgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpIHRvIGNhbGNsdWF0ZSB0aGUgZW5lcmd5IGZvciBhIGJsb2NrIHN3aXRjaGluZyBhbmFseXNpcyB3aW5kb3dzLAorICAgbm90IGZvciBhIHNob3J0IGJsb2NrLiBUaGUgc2FtZSBpcyBkb25lIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KCkuIFRoZSByZXN1bHQgb2YgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpCisgICBpcyB1c2VkIGZvciBhIGNvbXBhcmlzaW9uIG9mIHRoZSBtYXggZW5lcmd5IG9mIGxlZnQvcmlnaHQgY2hhbm5lbC4gKi8KKworICByZXR1cm4gaW5bYmxTd1duZElkeF07CisKK30KKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKlJFU1RSSUNUIGJsb2NrU3dpdGNoaW5nQ29udHJvbCwgSU5UIHdpbmRvd0xlbiwgY29uc3QgSU5UX1BDTSAqcFRpbWVTaWduYWwpCit7CisgICAgSU5UICBpOworICAgIFVJTlQgdzsKKworICAgIEZJWFBfU0dMIGhpUGFzc0NvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOworICAgIEZJWFBfU0dMIGhpUGFzc0NvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOworCisgICAgLyogc3VtIHVwIHNjYWxhcnByb2R1Y3Qgb2YgdGltZXNpZ25hbCBhcyB3aW5kb3dlZCBFbmVyZ2llcyAqLworICAgIGZvciAodz0wOyB3IDwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzOyB3KyspIHsKKworICAgICAgICBGSVhQX0RCTCB0ZW1wX3dpbmRvd05yZyAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgRklYUF9EQkwgdGVtcF93aW5kb3dOcmdGID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUwICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOworICAgICAgICBGSVhQX0RCTCB0ZW1wX2lpclN0YXRlMSAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsKKworICAgICAgICAvKiB3aW5kb3dOcmcgPSBzdW0odGltZXNhbXBsZV4yKSAqLworICAgICAgICBmb3IoaT0wO2k8d2luZG93TGVuO2krKykKKyAgICAgICAgeworCisgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wVW5maWx0ZXJlZCwgdGVtcEZpbHRyZWQsIHQxLCB0MjsKKyAgICAgICAgICAgIC8qIHRlbXBVbmZpbHRlcmVkIGlzIHNjYWxlZCB3aXRoIDEgdG8gcHJldmVudCBvdmVyZmxvd3MgZHVyaW5nIGNhbGN1bGF0aW9uIG9mIHRlbXBGaWx0cmVkICovCisjaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMKKyAgICAgICAgICAgIHRlbXBVbmZpbHRlcmVkID0gKEZJWFBfREJMKSAqcFRpbWVTaWduYWwrKyA+PiAxOworI2Vsc2UKKyAgICAgICAgICAgIHRlbXBVbmZpbHRlcmVkID0gKEZJWFBfREJMKSAqcFRpbWVTaWduYWwrKyA8PCAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtMSk7CisjZW5kaWYKKyAgICAgICAgICAgIHQxID0gZk11bHREaXYyKGhpUGFzc0NvZWZmMSwgdGVtcFVuZmlsdGVyZWQtdGVtcF9paXJTdGF0ZTApOworICAgICAgICAgICAgdDIgPSBmTXVsdERpdjIoaGlQYXNzQ29lZmYwLCB0ZW1wX2lpclN0YXRlMSk7CisgICAgICAgICAgICB0ZW1wRmlsdHJlZCA9ICh0MSAtIHQyKSA8PCAxOworCisgICAgICAgICAgICB0ZW1wX2lpclN0YXRlMCA9IHRlbXBVbmZpbHRlcmVkOworICAgICAgICAgICAgdGVtcF9paXJTdGF0ZTEgPSB0ZW1wRmlsdHJlZDsKKworICAgICAgICAgICAgLyogc3VidHJhY3QgMiBmcm9tIG92ZXJhbGxzY2FsaW5nIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKQorICAgICAgICAgICAgICogYmVjYXVzZSB0ZW1wVW5maWx0ZXJlZCB3YXMgYWxyZWFkeSBzY2FsZWQgd2l0aCAxIChpcyAyIGFmdGVyIHNxdWFyaW5nKQorICAgICAgICAgICAgICogc3VidHJhY3QgMSBmcm9tIG92ZXJhbGxzY2FsaW5nIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKQorICAgICAgICAgICAgICogYmVjYXVzZSBvZiBmTXVsdERpdjIgaXMgZG9pbmcgYSBzY2FsaW5nIGJ5IG9uZSAqLworICAgICAgICAgICAgdGVtcF93aW5kb3dOcmcgKz0gZlBvdzJEaXYyKHRlbXBVbmZpbHRlcmVkKSA+PiAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAtIDEgLSAyKTsKKyAgICAgICAgICAgIHRlbXBfd2luZG93TnJnRiArPSBmUG93MkRpdjIodGVtcEZpbHRyZWQpID4+IChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUIC0gMSAtIDIpOworICAgICAgICB9CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdW3ddICA9IHRlbXBfd2luZG93TnJnOworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10gPSB0ZW1wX3dpbmRvd05yZ0Y7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdICAgICA9IHRlbXBfaWlyU3RhdGUwOworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXSAgICAgPSB0ZW1wX2lpclN0YXRlMTsKKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IFVDSEFSIHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlWzVdWzVdID0KK3sKKyAgLyogICAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVyovCisgIC8qIExPTkdfV0lORE9XICAqLyB7TE9OR19XSU5ET1csICBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAorICAvKiBTVEFSVF9XSU5ET1cgKi8ge1NUQVJUX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKKyAgLyogU0hPUlRfV0lORE9XICovIHtTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFdST05HX1dJTkRPV30sCisgIC8qIFNUT1BfV0lORE9XICAqLyB7U1RPUF9XSU5ET1csICBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAorICAvKiBMT1dPVl9XSU5ET1cgKi8ge0xPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1csIExPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKK307CisKK2ludCBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nICgKKyAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LAorICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAorICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICAgIGNvbnN0IElOVCBjb21tb25XaW5kb3cgKQoreworICBVQ0hBUiBwYXRjaFR5cGUgPSBMT05HX1dJTkRPVzsKKworICBpZiggbkNoYW5uZWxzID09IDIgJiYgY29tbW9uV2luZG93ID09IFRSVUUpCisgIHsKKyAgICAvKiBjb3VsZCBiZSBiZXR0ZXIgd2l0aCBhIGNoYW5uZWwgbG9vcCAobmVlZCBhIGhhbmRsZSB0byBwc3lfZGF0YSkgKi8KKyAgICAvKiBnZXQgc3VnZ2VzdGVkIEJsb2NrIFR5cGVzIGFuZCBzeW5jaHJvbml6ZSAqLworICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2VdOworCisgICAgLyogc2FuaXR5IGNoZWNrIChubyBjaGFuZ2UgZnJvbSBsb3cgb3ZlcmxhcCB3aW5kb3cgdG8gc2hvcnQgd2lub3cgYW5kIHZpY2UgdmVyc2EpICovCisgICAgaWYgKHBhdGNoVHlwZSA9PSBXUk9OR19XSU5ET1cpCisgICAgICByZXR1cm4gLTE7IC8qIG1peGVkIHVwIEFBQy1MQyBhbmQgQUFDLUxEICovCisKKyAgICAvKiBTZXQgc3luY2hyb25pemVkIEJsb2NrdHlwZSAqLworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAgPSBwYXRjaFR5cGU7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsKKworICAgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTaGFwZSAgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2hhcGUgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgIH0KKworICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcykKKyAgeworICAgIGludCBpOworCisgICAgaWYoIG5DaGFubmVscyA9PSAyICkKKyAgICB7CisgICAgICBpZiAoY29tbW9uV2luZG93ID09IFRSVUUpCisgICAgICB7CisgICAgICAgIC8qIFN5bmNocm9uaXplIGdyb3VwaW5nIGluZm8gKi8KKyAgICAgICAgaW50IHdpbmRvd1NlcXVlbmNlTGVmdE9sZCAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2U7CisgICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZTsKKworICAgICAgICAvKiBMb25nIEJsb2NrcyAqLworICAgICAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgICAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICAgPSAxOworICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzICA9IDE7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gID0gMTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOworCisgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSAgPSAwOworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTaG9ydCBCbG9ja3MgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogaW4gY2FzZSBhbGwgdHdvIGNoYW5uZWxzIHdlcmUgZGV0ZWN0ZWQgYXMgc2hvcnQtYmxvY2tzIGJlZm9yZSBzeW5jaW5nLCB1c2UgdGhlIGdyb3VwaW5nIG9mIGNoYW5uZWwgd2l0aCBoaWdoZXIgbWF4V2luZG93TnJnICovCisgICAgICAgICAgaWYoICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgID09IFNIT1JUX1dJTkRPVykgJiYKKwkgICAgICAgICAgICAod2luZG93U2VxdWVuY2VSaWdodE9sZCA9PSBTSE9SVF9XSU5ET1cpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZihibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bWF4V2luZG93TnJnKSB7CisJICAgICAgICAgICAgLyogTGVmdCBDaGFubmVsIHdpbnMgKi8KKwkgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7CisJICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7CisJICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKwkgICAgICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KKwkgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7CisJICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7CisJICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCAod2luZG93U2VxdWVuY2VMZWZ0T2xkICA9PSBTSE9SVF9XSU5ET1cpICYmCisgICAgICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkICE9IFNIT1JUX1dJTkRPVykgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGVsc2UgdXNlIGdyb3VwaW5nIG9mIHNob3J0LWJsb2NrIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspeworICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID09IFNIT1JUX1dJTkRPVykgJiYKKwkJICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgICE9IFNIT1JUX1dJTkRPVykgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspeworICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3luY2luZyBhIHN0YXJ0IGFuZCBzdG9wIHdpbmRvdyAuLi4gKi8KKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgID0gMjsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gNDsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzFdID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzFdID0gNDsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogU2hvcnQgQmxvY2tzICovCisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogc3RlcmVvLCBubyBjb21tb24gd2luZG93ICovCisgICAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UhPVNIT1JUX1dJTkRPVyl7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyAgPSAxOworICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKKyAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UhPVNIT1JUX1dJTkRPVyl7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgID0gMTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogY29tbW9uIHdpbmRvdyAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBNb25vICovCisgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpeworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICA9IDE7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qIGFsbG93U2hvcnRGcmFtZXMgKi8KKworCisgIC8qIFRyYW5zbGF0ZSBMT1dPVl9XSU5ET1cgYmxvY2sgdHlwZSB0byBhIG1lYW5pbmdmdWwgd2luZG93IHNoYXBlLiAqLworICBpZiAoICEgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcyApIHsKKyAgICBpZiAoIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVworICAgICAgJiYgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNUT1BfV0lORE9XICkKKyAgICB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NoYXBlID0gTE9MX1dJTkRPVzsKKyAgICB9CisgIH0KKyAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgaWYgKCAhIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5hbGxvd1Nob3J0RnJhbWVzICkgeworICAgICAgaWYgKCBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XCisgICAgICAgICYmIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU1RPUF9XSU5ET1cgKQorICAgICAgeworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTaGFwZSA9IExPTF9XSU5ET1c7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmggYi9hYWMvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRiNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmgKQEAgLTAsMCArMSwxNDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgorICAgRGVzY3JpcHRpb246IEJsb2NrIHN3aXRjaGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JMT0NLX1NXSVRDSF9ICisjZGVmaW5lIF9CTE9DS19TV0lUQ0hfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKy8qKioqKioqKioqKioqKioqKiogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV1MgICAgOCAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygd2luZG93cyBmb3IgZW5lcmd5IGNhbGN1bGF0aW9uICovCisKKyNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gICAgMiAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBIaWdoUGFzcy1JSVItRmlsdGVyIGZvciBBdHRhY2stRGV0ZWN0aW9uICovCisjZGVmaW5lIEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgIDcgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYmUgbG9nRHVhbGlzKEJMT0NLX1NXSVRDSF9XSU5ET1dfTEVOKSB0byBhdm9pZCBvdmVyZmxvdyBpbiB3aW5kb3dOcmdzLiAqLworCisjZGVmaW5lIExBU1RfV0lORE9XIDAKKyNkZWZpbmUgVEhJU19XSU5ET1cgMQorCisKKy8qKioqKioqKioqKioqKioqKiogU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdHsKKyAgSU5UICAgbGFzdFdpbmRvd1NlcXVlbmNlOworICBJTlQgICB3aW5kb3dTaGFwZTsKKyAgSU5UICAgbGFzdFdpbmRvd1NoYXBlOworICBVSU5UICBuQmxvY2tTd2l0Y2hXaW5kb3dzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHdpbmRvd3MgZm9yIGVuZXJneSBjYWxjdWxhdGlvbiAqLworICBJTlQgICBhdHRhY2s7CisgIElOVCAgIGxhc3RhdHRhY2s7CisgIElOVCAgIGF0dGFja0luZGV4OworICBJTlQgICBsYXN0QXR0YWNrSW5kZXg7CisgIElOVCAgIGFsbG93U2hvcnRGcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgTG93IERlbGF5LCBkb24ndCBhbGxvdyBzaG9ydCBmcmFtZXMgKi8KKyAgSU5UICAgYWxsb3dMb29rQWhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBMb3cgRGVsYXksIGRvbid0IGRvIGxvb2stYWhlYWQgKi8KKyAgSU5UICAgbm9PZkdyb3VwczsKKyAgSU5UICAgZ3JvdXBMZW5bTUFYX05PX09GX0dST1VQU107CisgIEZJWFBfREJMIG1heFdpbmRvd05yZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXggZW5lcmd5IGluIHN1YndpbmRvd3MgKi8KKworICBGSVhQX0RCTCB3aW5kb3dOcmdbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAgLyogdGltZSBzaWduYWwgZW5lcmd5IGluIFN1YndpbmRvd3MgKGxhc3QgYW5kIGN1cnJlbnQpICovCisgIEZJWFBfREJMIHdpbmRvd05yZ0ZbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAvKiBmaWx0ZXJlZCB0aW1lIHNpZ25hbCBlbmVyZ3kgaW4gc2VnbWVudHMgKGxhc3QgYW5kIGN1cnJlbnQpICovCisgIEZJWFBfREJMIGFjY1dpbmRvd05yZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWN1cnNpdmVseSBhY2N1bXVsYXRlZCB3aW5kb3dOcmdGICovCisKKyAgRklYUF9EQkwgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgICAgIC8qIGZpbHRlciBkZWxheS1saW5lICovCisKK30gQkxPQ0tfU1dJVENISU5HX0NPTlRST0w7CisKKworCisKKwordm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KTsKKworaW50IEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGlzTEZFLCBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCk7CisKK2ludCBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nKAorICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCisgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCisgICAgICBjb25zdCBJTlQgbm9PZkNoYW5uZWxzLAorICAgICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyk7CisKKyNlbmRpZiAgLyogI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTlhNGNlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuY3BwCkBAIC0wLDAgKzEsNTUyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogIEZhc3QgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgQS4gR3JvZXNjaGVsCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9uYWxpdHkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKKyNpbmNsdWRlICJiaXRlbmMuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorCisKKy8qIGNoYW5uZWxfYXNzaWdubWVudCB0cmVhdHMgdGhlIHJlbGF0aW9uc2hpcCBvZiBJbnB1dCBmaWxlIGNoYW5uZWxzCisgICB0byB0aGUgZW5jb2RlciBjaGFubmVscy4KKyAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzdWFsIG9yZGVyIGluIFJJRkYgZmlsZXMgKC53YXYpCisgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZWxlbWVudHMgb3JkZXIgaW4gdGhlIGNvZGVyIGdpdmVuCisgICBieSBUYWJsZSA4LjEgKGltcGxpY2l0IHNwZWFrZXIgbWFwcGluZykgb2YgdGhlIEFBQyBzdGFuZGFyZC4KKworICAgSW4gbW9ubyBhbmQgc3RlcmVvIGNhc2UsIHRoaXMgaXMgdHJpdmlhbC4KKyAgIEluIG1jIGNhc2UsIGl0IGxvb2tzIGxpa2UgdGhpczoKKworICAgQ2hhbm5lbCAgICAgICAgIElucHV0IGZpbGUgICAgICAgY29kZXIgY2hhbgorNWNoOgorICAgZnJvbnQgY2VudGVyICAgIDIgICAgICAgICAgICAgICAgMCAoU0NFIGNoYW5uZWwpCisgICBsZWZ0IGNlbnRlciAgICAgMCAgICAgICAgICAgICAgICAxICgxc3Qgb2YgMXN0IENQRSkKKyAgIHJpZ2h0IGNlbnRlciAgICAxICAgICAgICAgICAgICAgIDIgKDJuZCBvZiAxc3QgQ1BFKQorICAgbGVmdCBzdXJyb3VuZCAgIDMgICAgICAgICAgICAgICAgMyAoMXN0IG9mIDJuZCBDUEUpCisgICByaWdodCBzdXJyb3VuZCAgNCAgICAgICAgICAgICAgICA0ICgybmQgb2YgMm5kIENQRSkKKworNS4xY2g6CisgICBmcm9udCBjZW50ZXIgICAgMiAgICAgICAgICAgICAgICAwIChTQ0UgY2hhbm5lbCkKKyAgIGxlZnQgY2VudGVyICAgICAwICAgICAgICAgICAgICAgIDEgKDFzdCBvZiAxc3QgQ1BFKQorICAgcmlnaHQgY2VudGVyICAgIDEgICAgICAgICAgICAgICAgMiAoMm5kIG9mIDFzdCBDUEUpCisgICBsZWZ0IHN1cnJvdW5kICAgNCAgICAgICAgICAgICAgICAzICgxc3Qgb2YgMm5kIENQRSkKKyAgIHJpZ2h0IHN1cnJvdW5kICA1ICAgICAgICAgICAgICAgIDQgKDJuZCBvZiAybmQgQ1BFKQorICAgTEZFICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgNSAoTEZFKQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCisgIENIQU5ORUxfTU9ERSAgZW5jb2Rlck1vZGU7CisgIElOVCAgICAgICAgICAgY2hhbm5lbF9hc3NpZ25tZW50Wy8qKDgpKi8xMl07CisKK30gQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCOworCisKK3N0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJNcGVnW10gPQoreworICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KKyAgICAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICB7IDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgbW9ubyAgICAgICovCisgICAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgeyAwLCAxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIHN0ZXJlbyAgICAqLworICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KKyAgICAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICB7IDAsIDEsIDIsIDMsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNGNoICAgICAgICovCisgICAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgeyAwLCAxLCAyLCAzLCA0LC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDVjaCAgICAgICAqLworICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KKyAgICAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsLTEsLTEsLTEsLTF9IH0sICAvKiAgNy4xY2ggICAgICovCisgICAgIHsgTU9ERV83XzFfUkVBUl9TVVJST1VORCwgICAgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLworICAgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSAgIC8qICA3LjFjaCAgICAgKi8KK307CisKK3N0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJXYXZbXSA9Cit7CisgICAgIHsgTU9ERV9JTlZBTElELCAgICAgICAgICAgICAgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIGludmFsaWQgICAqLworICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KKyAgICAgeyBNT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICB7IDAsIDEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgc3RlcmVvICAgICovCisgICAgIHsgTU9ERV8xXzIsICAgICAgICAgICAgICAgICAgICAgeyAyLCAwLCAxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDNjaCAgICAgICAqLworICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KKyAgICAgeyBNT0RFXzFfMl8yLCAgICAgICAgICAgICAgICAgICB7IDIsIDAsIDEsIDMsIDQsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNWNoICAgICAgICovCisgICAgIHsgTU9ERV8xXzJfMl8xLCAgICAgICAgICAgICAgICAgeyAyLCAwLCAxLCA0LCA1LCAzLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDUuMWNoICAgICAqLworICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMiwgNiwgNywgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KKyAgICAgeyBNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCAgICAgICB7IDIsIDAsIDEsIDYsIDcsIDQsIDUsIDMsLTEsLTEsLTEsLTF9IH0sICAvKiAgNy4xY2ggICAgICovCisgICAgIHsgTU9ERV83XzFfRlJPTlRfQ0VOVEVSLCAgICAgICAgeyAyLCA2LCA3LCAwLCAxLCA0LCA1LCAzLC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLworfTsKKworLyogQ2hhbm5lbCBtb2RlIGNvbmZpZ3VyYXRpb24gdGFiIHByb3ZpZGVzLAorICAgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGVsZW1lbnRzCisqLworc3RhdGljIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCIGNoYW5uZWxNb2RlQ29uZmlnW10gPQoreworICAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgMSwgIDEsICAxIH0sICAgLyogU0NFICAgICAgICAgICAgICAgICAqLworICAgeyBNT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDIsICAxIH0sICAgLyogQ1BFICAgICAgICAgICAgICAgICAqLworICAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICAgMywgIDMsICAyIH0sICAgLyogU0NFLENQRSAgICAgICAgICAgICAqLworICAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICAgNCwgIDQsICAzIH0sICAgLyogU0NFLENQRSxTQ0UgICAgICAgICAqLworICAgeyBNT0RFXzFfMl8yLCAgICAgICAgICAgICAgICAgICAgNSwgIDUsICAzIH0sICAgLyogU0NFLENQRSxDUEUgICAgICAgICAqLworICAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICAgNiwgIDUsICA0IH0sICAgLyogU0NFLENQRSxDUEUsTEZFICAgICAqLworICAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICAgOCwgIDcsICA1IH0sICAgLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgeyBNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCAgICAgICAgOCwgIDcsICA1IH0sCisgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgICA4LCAgNywgIDUgfSwKK307CisKKyNkZWZpbmUgTUFYX01PREVTIChzaXplb2YoYXNzaWdubWVudEluZm9UYWJXYXYpL3NpemVvZihDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIpKQorCitjb25zdCBJTlQqIEZES2FhY0VuY19nZXRDaGFubmVsQXNzaWdubWVudChDSEFOTkVMX01PREUgZW5jTW9kZSwgQ0hBTk5FTF9PUkRFUiBjbykKK3sKKyAgY29uc3QgQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCICpwVGFiOworICBpbnQgaTsKKworICBpZiAoY28gPT0gQ0hfT1JERVJfTVBFRykKKyAgICBwVGFiID0gYXNzaWdubWVudEluZm9UYWJNcGVnOworICBlbHNlCisgICAgcFRhYiA9IGFzc2lnbm1lbnRJbmZvVGFiV2F2OworCisgIGZvcihpPU1BWF9NT0RFUy0xOyBpPjA7IGktLSkgeworICAgIGlmIChlbmNNb2RlPT0gcFRhYltpXS5lbmNvZGVyTW9kZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAocFRhYltpXS5jaGFubmVsX2Fzc2lnbm1lbnQpOworfQorCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRGV0ZXJtaW5lRW5jb2Rlck1vZGUoQ0hBTk5FTF9NT0RFKiBtb2RlLCBJTlQgbkNoYW5uZWxzKQoreworICBJTlQgaTsKKyAgQ0hBTk5FTF9NT0RFIGVuY01vZGUgPSBNT0RFX0lOVkFMSUQ7CisKKyAgaWYgKCptb2RlPT1NT0RFX1VOS05PV04pIHsKKyAgICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKKyAgICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHM9PW5DaGFubmVscykgeworICAgICAgICAgIGVuY01vZGUgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAqbW9kZSA9IGVuY01vZGU7CisgIH0KKyAgZWxzZSB7CisgICAgLyogY2hlY2sgaWYgdmFsaWQgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCisgICAgaWYgKEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oKm1vZGUpLT5uQ2hhbm5lbHM9PW5DaGFubmVscykgeworICAgICAgICBlbmNNb2RlID0gKm1vZGU7CisgICAgfQorICB9CisKKyAgaWYgKGVuY01vZGU9PU1PREVfSU5WQUxJRCkgeworICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIH0KKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworc3RhdGljIElOVCBGREthYWNFbmNfaW5pdEVsZW1lbnQgKEVMRU1FTlRfSU5GTyogZWxJbmZvLCBNUDRfRUxFTUVOVF9JRCBlbFR5cGUsIElOVCogY250LCBDSEFOTkVMX01PREUgbW9kZSwgQ0hBTk5FTF9PUkRFUiBjbywgSU5UKiBpdF9jbnQsIGNvbnN0IEZJWFBfREJMIHJlbEJpdHMpIHsKKworICBJTlQgZXJyb3I9MDsKKyAgSU5UIGNvdW50ZXIgPSpjbnQ7CisKKyAgY29uc3QgSU5UICphc3NpZ24gPSBGREthYWNFbmNfZ2V0Q2hhbm5lbEFzc2lnbm1lbnQobW9kZSwgY28pOworCisgIGVsSW5mby0+ZWxUeXBlPWVsVHlwZTsKKyAgZWxJbmZvLT5yZWxhdGl2ZUJpdHMgPSByZWxCaXRzOworCisgIHN3aXRjaChlbEluZm8tPmVsVHlwZSkgeworICBjYXNlIElEX1NDRTogY2FzZSBJRF9MRkU6IGNhc2UgSURfQ0NFOgorICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0xOworICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPWFzc2lnbltjb3VudGVyKytdOworICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9aXRfY250W2VsVHlwZV0rKzsKKworICAgIGJyZWFrOworICBjYXNlIElEX0NQRToKKyAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MjsKKyAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT1hc3NpZ25bY291bnRlcisrXTsKKyAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT1hc3NpZ25bY291bnRlcisrXTsKKyAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7CisgICAgYnJlYWs7CisgIGNhc2UgSURfRFNFOgorICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0wOworICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7CisgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV09MDsKKyAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6IGVycm9yPTE7CisgIH07CisgICpjbnQgPSBjb3VudGVyOworICByZXR1cm4gZXJyb3I7CisKK30KKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhDSEFOTkVMX01PREUgbW9kZSwgQ0hBTk5FTF9PUkRFUiBjbywgQ0hBTk5FTF9NQVBQSU5HKiBjbSkKK3sKKyAgSU5UIGNvdW50PTA7IC8qIGNvdW50IHRocm91Z2ggY29kZXIgY2hhbm5lbHMgKi8KKyAgSU5UIGl0X2NudFtJRF9FTkQrMV07CisgIElOVCBpOworCisgIGZvciAoaT0wOyBpPElEX0VORDsgaSsrKQorICAgIGl0X2NudFtpXT0wOworCisgIEZES21lbWNsZWFyKGNtLCBzaXplb2YoQ0hBTk5FTF9NQVBQSU5HKSk7CisKKyAgLyogaW5pdCBjaGFubmVsIG1hcHBpbmcqLworICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKKyAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZT09bW9kZSkKKyAgICB7CisgICAgICAgIGNtLT5lbmNNb2RlICAgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOworICAgICAgICBjbS0+bkNoYW5uZWxzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzOworICAgICAgICBjbS0+bkNoYW5uZWxzRWZmID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzRWZmOworICAgICAgICBjbS0+bkVsZW1lbnRzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkVsZW1lbnRzOworCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIGluaXQgZWxlbWVudCBpbmZvIHN0cnVjdCAqLworICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgTU9ERV8xOgorICAgICAgLyogKG1vbm8pIHNjZSAgKi8KKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIChGSVhQX0RCTClNQVhWQUxfREJMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV8yOgorICAgICAgLyogKHN0ZXJlbykgY3BlICovCisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCAoRklYUF9EQkwpTUFYVkFMX0RCTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV8xXzI6CisgICAgICAvKiBzY2UgKyBjcGUgKi8KKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNGYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNmYpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFXzFfMl8xOgorICAgICAgLyogc2NlICsgY3BlICsgc2NlICovCisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjRmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV8xXzJfMjoKKyAgICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzdmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1PREVfMV8yXzJfMToKKyAgICAgIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNGYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM1ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9MRkUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNmYpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMThmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bNF0sIElEX0xGRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjA0ZikpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vKmNoTWFwPTA7CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9OworCisKKyAgRkRLX0FTU0VSVChjbS0+bkVsZW1lbnRzPD0oOCkpOworCisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0RWxlbWVudEJpdHMoUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKKyAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsCisgICAgICAgICAgICAgICAgICAgIElOVCBhdmVyYWdlQml0c1RvdCwKKyAgICAgICAgICAgICAgICAgICAgSU5UIG1heENoYW5uZWxCaXRzKQoreworICBpbnQgc2NfYnJUb3QgPSBDb3VudExlYWRpbmdCaXRzKGJpdHJhdGVUb3QpOworCisgIHN3aXRjaChjbS0+ZW5jTW9kZSkgeworICBjYXNlIE1PREVfMToKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gYml0cmF0ZVRvdDsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBicmVhazsKKworICBjYXNlIE1PREVfMjoKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gYml0cmF0ZVRvdD4+MTsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOworCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgIGJyZWFrOworICBjYXNlIE1PREVfMV8yOiB7CisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgIEZJWFBfREJMIHNjZVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBjcGVSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBNT0RFXzFfMl8xOiB7CisgICAgLyogc2NlICsgY3BlICsgc2NlICovCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgRklYUF9EQkwgc2NlMVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBjcGVSYXRlICA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgIEZJWFBfREJMIHNjZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7CisKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOworICAgIGJyZWFrOworICB9CisgIGNhc2UgTU9ERV8xXzJfMjogeworICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgIEZJWFBfREJMIHNjZVJhdGUgID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgRklYUF9EQkwgY3BlMVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTU9ERV8xXzJfMl8xOiB7CisgICAgLyogKDUuMSkgc2NlICsgY3BlICsgY3BlICsgbGZlICovCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1szXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBzY2VSYXRlICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgRklYUF9EQkwgY3BlMlJhdGUgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBsZmVSYXRlICA9IGNtLT5lbEluZm9bM10ucmVsYXRpdmVCaXRzOworCisgICAgaW50IG1heEJpdHNUb3QgPSBtYXhDaGFubmVsQml0cyAqIDU7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLworICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLGF2ZXJhZ2VCaXRzVG90KSk7CisgICAgaW50IG1heExmZUJpdHMgPSAoaW50KSBGREttYXggKCAoSU5UKSgoZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKG1heENoYW5uZWxCaXRzPDxzYykpPj5zYyk8PDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSxmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3Q8PHNjKSkpPDwxKT4+c2MpICk7CisKKyAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cyk7CisgICAgc2MgPSBDb3VudExlYWRpbmdCaXRzKG1heENoYW5uZWxCaXRzKTsKKworICAgIG1heENoYW5uZWxCaXRzID0gZk11bHQoKEZJWFBfREJMKW1heENoYW5uZWxCaXRzPDxzYyxHZXRJbnZJbnQoNSkpPj5zYzsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOworICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgaFFDLT5lbGVtZW50Qml0c1szXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPm1heEJpdHNFbCAgICAgICAgPSBtYXhMZmVCaXRzOworCisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgY2FzZSBNT0RFXzFfMl8yXzJfMTogeworICAgIGludCBjcGUzSWR4ID0gMzsKKyAgICBpbnQgbGZlSWR4ICA9IDQ7CisKKyAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KKyAgICBGSVhQX0RCTCBzY2VSYXRlICA9IGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgRklYUF9EQkwgY3BlMVJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgIEZJWFBfREJMIGNwZTJSYXRlID0gaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICBGSVhQX0RCTCBjcGUzUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1tjcGUzSWR4XS5yZWxhdGl2ZUJpdHM7CisgICAgRklYUF9EQkwgbGZlUmF0ZSAgPSBoUUMtPmVsZW1lbnRCaXRzW2xmZUlkeF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1tsZmVJZHhdLnJlbGF0aXZlQml0czsKKworICAgIGludCBtYXhCaXRzVG90ID0gbWF4Q2hhbm5lbEJpdHMgKiA3OyAvKiBMRkUgZG9lcyBub3QgYWRkIHRvIGJpdCByZXNlcnZvaXIgKi8KKyAgICBpbnQgc2MgPSBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhDaGFubmVsQml0cyxhdmVyYWdlQml0c1RvdCkpOworICAgIGludCBtYXhMZmVCaXRzID0gKGludCkgRkRLbWF4ICggKElOVCkoKGZNdWx0KGxmZVJhdGUsKEZJWFBfREJMKShtYXhDaGFubmVsQml0czw8c2MpKT4+c2MpPDwxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmLzIuZiksZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKGF2ZXJhZ2VCaXRzVG90PDxzYykpKTw8MSk+PnNjKSApOworCisgICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpIC8gNzsKKworICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsID0gZk11bHQoc2NlUmF0ZSwgIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUzUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworCisgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiptYXhDaGFubmVsQml0czsKKyAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyKm1heENoYW5uZWxCaXRzOworICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPm1heEJpdHNFbCA9IDIqbWF4Q2hhbm5lbEJpdHM7CisgICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5tYXhCaXRzRWwgPSBtYXhMZmVCaXRzOworICAgIGJyZWFrOworICB9CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgfQorCisgIHJldHVybiBBQUNfRU5DX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmdW5jdGlvbjogICAgR2V0TW9ub1N0ZXJlb01PREUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBkZXNjcmlwdGlvbjogRGV0ZXJtaW5lcyBlbmNvZGVyIHNldHRpbmcgZnJvbSBjaGFubmVsIG1vZGUuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgTXVsdGljaGFubmVsIG1vZGVzIGFyZSBtYXBwZWQgdG8gbW9ubyBvciBzdGVyZW8gbW9kZXMgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgcmV0dXJucyBNT0RFX01PTk8gaW4gY2FzZSBvZiBtb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX1NURVJFTyBpbiBjYXNlIG9mIHN0ZXJlbyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lOVkFMSUQgaW4gY2FzZSBvZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBpbnB1dDogICAgICAgQ0hBTk5FTF9NT0RFIG1vZGU6IEVuY29kZXIgbW9kZSAoc2VlIHFjX2RhdGEuaCkuICAgICAgICAgICAgICAgICovCisvKiBvdXRwdXQ6ICAgICAgcmV0dXJuOiBDTV9TVEVSRU9fTU9ERSBtb25vU3RlcmVvU2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgKE1PREVfSU5WQUxJRDogZXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIE1PREVfTU9OTzogICAgbW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIE1PREVfU1RFUkVPOiAgc3RlcmVvKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBtaXNjOiAgICAgICAgTm8gbWVtb3J5IGlzIGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0VMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpeworCisgIEVMRU1FTlRfTU9ERSBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfSU5WQUxJRDsKKworICBzd2l0Y2gobW9kZSl7CisgIGNhc2UgTU9ERV8xOiAgICAgICAgLyogbW9ubyBzZXR1cHMgKi8KKyAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfTU9OTzsKKyAgICBicmVhazsKKyAgY2FzZSBNT0RFXzI6ICAgICAgICAvKiBzdGVyZW8gc2V0dXBzICovCisgIGNhc2UgTU9ERV8xXzI6CisgIGNhc2UgTU9ERV8xXzJfMToKKyAgY2FzZSBNT0RFXzFfMl8yOgorICBjYXNlIE1PREVfMV8yXzJfMToKKyAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfU1RFUkVPOworICAgIGJyZWFrOworICBkZWZhdWx0OiAgICAgICAgICAgIC8qIGVycm9yICovCisgICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX0lOVkFMSUQ7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gbW9ub1N0ZXJlb1NldHRpbmc7Cit9CisKK2NvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKQoreworICBJTlQgaTsKKyAgY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIgKmNtX2NvbmZpZyA9IE5VTEw7CisKKyAgLyogZ2V0IGNoYW5uZWwgbW9kZSBjb25maWcgKi8KKyAgZm9yIChpPTA7IGk8KElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpLyhJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsgaSsrKSB7CisgICAgaWYgKGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU9PW1vZGUpCisgICAgeworICAgICAgICBjbV9jb25maWcgPSAmY2hhbm5lbE1vZGVDb25maWdbaV07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gY21fY29uZmlnOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuaCBiL2FhYy9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmYjQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmgKQEAgLTAsMCArMSwxMzIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBHcm9lc2NoZWwKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NIQU5ORUxfTUFQX0gKKyNkZWZpbmUgX0NIQU5ORUxfTUFQX0gKKworCisjaW5jbHVkZSAiYWFjZW5jLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIENIQU5ORUxfTU9ERSBlbmNNb2RlOworICBJTlQgbkNoYW5uZWxzOworICBJTlQgbkNoYW5uZWxzRWZmOworICBJTlQgbkVsZW1lbnRzOworfSBDSEFOTkVMX01PREVfQ09ORklHX1RBQjsKKworCisvKiBFbGVtZW50IG1vZGUgKi8KK3R5cGVkZWYgZW51bSB7CisgIEVMX01PREVfSU5WQUxJRCA9IDAsCisgIEVMX01PREVfTU9OTywKKyAgRUxfTU9ERV9TVEVSRU8KK30gRUxFTUVOVF9NT0RFOworCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZShDSEFOTkVMX01PREUqIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscyk7CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoQ0hBTk5FTF9NT0RFIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfT1JERVIgY28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogY2hNYXApOworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdEVsZW1lbnRCaXRzKFFDX1NUQVRFICpoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRyYXRlVG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYXZlcmFnZUJpdHNUb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhDaGFubmVsQml0cyk7CisKK0VMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpOworCitjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiogRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihjb25zdCBDSEFOTkVMX01PREUgbW9kZSk7CisKKyNlbmRpZiAvKiBDSEFOTkVMX01BUF9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmNwcApAQCAtMCwwICsxLDE2MSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IENoYW9zIG1lYXN1cmUgY2FsY3VsYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY2hhb3NtZWFzdXJlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVQZWFrRmFzdAorICAgIGRlc2NyaXB0aW9uOiAgRWJlcmxlaW4gbWV0aG9kIG9mIGNoYW9zIG1lYXN1cmUgY2FsY3VsYXRpb24gYnkgaGlnaC1wYXNzCisgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgYW1wbGl0dWRlIHNwZWN0cnVtCisgICAgICAgICAgICAgICAgICBBIHNwZWNpYWwgY2FzZSBvZiBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlVG9uYWxHZW5lcmljIC0tCisgICAgICAgICAgICAgICAgICBoaWdobHkgb3B0aW1pemVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitGREthYWNFbmNfRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZVBlYWtGYXN0KCBGSVhQX0RCTCAgKlJFU1RSSUNUIHBhTURDVERhdGFOTTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBudW1iZXJPZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgY2hhb3NNZWFzdXJlICkKK3sKKyAgSU5UIGksIGo7CisKKyAgLyogY2FsY3VsYXRlIGNoYW9zIG1lYXN1cmUgYnkgInBlYWsgZmlsdGVyIiAqLworICBmb3IgKGk9MDsgaTwyOyBpKyspIHsKKyAgICAvKiBtYWtlIGV2ZW4gYW5kIG9kZCBwYXNzIHRocm91Z2ggZGF0YSAqLworICAgIEZJWFBfREJMIGxlZnQsY2VudGVyOyAvKiBsZWZ0LCBjZW50ZXIgdGFwIG9mIGZpbHRlciAqLworCisgICAgbGVmdCAgID0gKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wW2ldXigoTE9ORylwYU1EQ1REYXRhTk0wW2ldPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICBjZW50ZXIgPSAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbaSsyXV4oKExPTkcpcGFNRENURGF0YU5NMFtpKzJdPj4oREZSQUNUX0JJVFMtMSkpKTsKKworICAgIGZvciAoaiA9IGkrMjsgaiA8IG51bWJlck9mTGluZXMgLSAyOyBqKz0yKSB7CisgICAgICBGSVhQX0RCTCByaWdodCA9IChGSVhQX0RCTCkoKExPTkcpcGFNRENURGF0YU5NMFtqKzJdXigoTE9ORylwYU1EQ1REYXRhTk0wW2orMl0+PihERlJBQ1RfQklUUy0xKSkpOworICAgICAgRklYUF9EQkwgdG1wID0gKGxlZnQ+PjEpKyhyaWdodD4+MSk7CisKKyAgICAgIGlmICh0bXAgPCBjZW50ZXIgKSB7CisgICAgICAgICBJTlQgbGVhZGluZ0JpdHMgPSBDbnRMZWFkaW5nWmVyb3MoY2VudGVyKS0xOworICAgICAgICAgdG1wID0gc2NodXJfZGl2KHRtcDw8bGVhZGluZ0JpdHMsIGNlbnRlcjw8bGVhZGluZ0JpdHMsIDgpOworICAgICAgICAgY2hhb3NNZWFzdXJlW2pdID0gZk11bHQodG1wLHRtcCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIGNoYW9zTWVhc3VyZVtqXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgfQorCisgICAgICBsZWZ0ICAgPSBjZW50ZXI7CisgICAgICBjZW50ZXIgPSByaWdodDsKKyAgICB9CisgIH0KKworICAvKiBwcm92aWRlIGNoYW9zIG1lYXN1cmUgZm9yIGZpcnN0IGZldyBsaW5lcyAqLworICBjaGFvc01lYXN1cmVbMF0gPSBjaGFvc01lYXN1cmVbMl07CisgIGNoYW9zTWVhc3VyZVsxXSA9IGNoYW9zTWVhc3VyZVsyXTsKKworICAvKiBwcm92aWRlIGNoYW9zIG1lYXN1cmUgZm9yIGxhc3QgZmV3IGxpbmVzICovCisgIGZvciAoaSA9IChudW1iZXJPZkxpbmVzLTMpOyBpIDwgbnVtYmVyT2ZMaW5lczsgaSsrKQorICAgIGNoYW9zTWVhc3VyZVtpXSA9IEZMMkZYQ09OU1RfREJMKDAuNSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlCisgICAgZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIGEgY2hhb3NtZWFzdXJlIGZvciBldmVyeSBsaW5lLCBkaWZmZXJlbnQgbWV0aG9kcworICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZS4gMCBtZWFucyB0b25hbCwgMSBtZWFucyBub2lzZWxpa2UKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiAgICAgICAgTURDVCBkYXRhLCBudW1iZXIgb2YgbGluZXMKKyAgICBvdXRwdXQ6ICAgICAgIGNoYW9zTWVhc3VyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlKCBGSVhQX0RCTCAgICAqcGFNRENURGF0YU5NMCwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpjaGFvc01lYXN1cmUgKQorCit7CisgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVQZWFrRmFzdCggcGFNRENURGF0YU5NMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhb3NNZWFzdXJlICk7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzMDFjNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5oCkBAIC0wLDAgKzEsMTAzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ2hhb3MgbWVhc3VyZSBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DSEFPU01FQVNVUkVfSAorI2RlZmluZSBfX0NIQU9TTUVBU1VSRV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKwordm9pZAorRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZSggRklYUF9EQkwgICAgKnBhTURDVERhdGFOTTAsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpjaGFvc01lYXN1cmUgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9keW5fYml0cy5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9keW5fYml0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwNzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmNwcApAQCAtMCwwICsxLDgwNSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogTm9pc2VsZXNzIGNvZGVyIG1vZHVsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkeW5fYml0cy5oIgorI2luY2x1ZGUgImJpdF9jbnQuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorI2luY2x1ZGUgImFhY0VuY19yb20uaCIKKwordHlwZWRlZiBJTlQgKCpsb29rVXBUYWJsZSlbQ09ERV9CT09LX0VTQ19ORFggKyAxXTsKKworc3RhdGljIElOVCBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKAorICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0IGh1ZmZzZWN0aW9uLAorICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHVzZUhDUgorICAgICAgICApCit7CisgIElOVCBzaWRlSW5mb0JpdHM7CisKKyAgaWYgKCB1c2VIQ1IgJiYgKChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPT0gMTEpIHx8IChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPj0gMTYpKSApIHsKKyAgICBzaWRlSW5mb0JpdHMgPSA1OworICB9CisgIGVsc2UgeworICAgIHNpZGVJbmZvQml0cyA9IHNpZGVJbmZvVGFiW2h1ZmZzZWN0aW9uLT5zZmJDbnRdOworICB9CisKKyAgcmV0dXJuIChzaWRlSW5mb0JpdHMpOworfQorCisvKiBjb3VudCBiaXRzIHVzaW5nIGFsbCBwb3NzaWJsZSB0YWJsZXMgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19idWlsZEJpdExvb2tVcCgKKyAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICBxdWFudFNwZWN0cnVtLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG1heFNmYiwKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0ICAgICAgICAgc2ZiTWF4LAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgIFNFQ1RJT05fSU5GTyogY29uc3QgICAgICAgaHVmZnNlY3Rpb24KKyAgICAgICAgKQoreworICBJTlQgaSwgc2ZiV2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IG1heFNmYjsgaSsrKQorICB7CisgICAgaHVmZnNlY3Rpb25baV0uc2ZiQ250ID0gMTsKKyAgICBodWZmc2VjdGlvbltpXS5zZmJTdGFydCA9IGk7CisgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOworICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID0gLTE7CisgICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbaSArIDFdIC0gc2ZiT2Zmc2V0W2ldOworICAgIEZES2FhY0VuY19iaXRDb3VudChxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W2ldLCBzZmJXaWR0aCwgc2ZiTWF4W2ldLCBiaXRMb29rVXBbaV0pOworICB9Cit9CisKKy8qIGVzc2VudGlhbCBoZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgSU5UIEZES2FhY0VuY19maW5kQmVzdEJvb2soCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgYmMsCisgICAgICAgIElOVCogY29uc3QgICAgICAgICAgICAgICAgYm9vaywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICB1c2VWQ0IxMQorICAgICAgICApCit7CisgIElOVCBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVCwgajsKKworICBpbnQgZW5kID0gQ09ERV9CT09LX0VTQ19ORFg7CisKKworICBmb3IgKGogPSAwOyBqIDw9IGVuZDsgaisrKQorICB7CisgICAgaWYgKGJjW2pdIDwgbWluQml0cykKKyAgICB7CisgICAgICBtaW5CaXRzID0gYmNbal07CisgICAgICAqYm9vayA9IGo7CisgICAgfQorICB9CisgIHJldHVybiAobWluQml0cyk7Cit9CisKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2ZpbmRNaW5NZXJnZUJpdHMoCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgYmMxLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgIGJjMiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICB1c2VWQ0IxMQorICAgICAgICApCit7CisgIElOVCBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVCwgajsKKworICBpbnQgZW5kID0gQ09ERV9CT09LX0VTQ19ORFg7CisKKworICBmb3IgKGogPSAwOyBqIDw9IGVuZDsgaisrKQorICB7CisgICAgaWYgKGJjMVtqXSArIGJjMltqXSA8IG1pbkJpdHMpCisgICAgeworICAgICAgbWluQml0cyA9IGJjMVtqXSArIGJjMltqXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChtaW5CaXRzKTsKK30KKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX21lcmdlQml0TG9va1VwKAorICAgICAgICBJTlQqIGNvbnN0ICAgICAgICAgICAgICAgIGJjMSwKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBiYzIKKyAgICAgICAgKQoreworICBpbnQgajsKKworICBmb3IgKGogPSAwOyBqIDw9IENPREVfQk9PS19FU0NfTkRYOyBqKyspCisgIHsKKyAgICBiYzFbal0gPSBmaXhNaW4oYmMxW2pdICsgYmMyW2pdLCBJTlZBTElEX0JJVENPVU5UKTsKKyAgfQorfQorCitzdGF0aWMgSU5UIEZES2FhY0VuY19maW5kTWF4TWVyZ2UoCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgbWVyZ2VHYWluTG9va1VwLAorICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0ICBodWZmc2VjdGlvbiwKKyAgICAgICAgY29uc3QgSU5UIG1heFNmYiwKKyAgICAgICAgSU5UKiBjb25zdCAgICAgICAgICAgICAgICBtYXhOZHgKKyAgICAgICAgKQoreworICBJTlQgaSwgbWF4TWVyZ2VHYWluID0gMDsKKworICBmb3IgKGkgPSAwOyBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250IDwgbWF4U2ZiOyBpICs9IGh1ZmZzZWN0aW9uW2ldLnNmYkNudCkKKyAgeworICAgIGlmIChtZXJnZUdhaW5Mb29rVXBbaV0gPiBtYXhNZXJnZUdhaW4pCisgICAgeworICAgICAgbWF4TWVyZ2VHYWluID0gbWVyZ2VHYWluTG9va1VwW2ldOworICAgICAgKm1heE5keCA9IGk7CisgICAgfQorICB9CisgIHJldHVybiAobWF4TWVyZ2VHYWluKTsKK30KKworc3RhdGljIElOVCBGREthYWNFbmNfQ2FsY01lcmdlR2FpbigKKyAgICAgICAgY29uc3QgU0VDVElPTl9JTkZPKiBjb25zdCBodWZmc2VjdGlvbiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5keDEsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbmR4MiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICB1c2VWQ0IxMQorICAgICAgICApCit7CisgIElOVCBNZXJnZUdhaW4sIE1lcmdlQml0cywgU3BsaXRCaXRzOworCisgIE1lcmdlQml0cyA9IHNpZGVJbmZvVGFiW2h1ZmZzZWN0aW9uW25keDFdLnNmYkNudCArIGh1ZmZzZWN0aW9uW25keDJdLnNmYkNudF0gKyBGREthYWNFbmNfZmluZE1pbk1lcmdlQml0cyhiaXRMb29rVXBbbmR4MV0sIGJpdExvb2tVcFtuZHgyXSwgdXNlVkNCMTEpOworICBTcGxpdEJpdHMgPSBodWZmc2VjdGlvbltuZHgxXS5zZWN0aW9uQml0cyArIGh1ZmZzZWN0aW9uW25keDJdLnNlY3Rpb25CaXRzOyAvKiBCaXQgYW1vdW50IGZvciBzcGxpdHRlZCBodWZmc2VjdGlvbnMgKi8KKyAgTWVyZ2VHYWluID0gU3BsaXRCaXRzIC0gTWVyZ2VCaXRzOworCisgIGlmICggKGh1ZmZzZWN0aW9uW25keDFdLmNvZGVCb29rPT1DT0RFX0JPT0tfUE5TX05PKXx8KGh1ZmZzZWN0aW9uW25keDJdLmNvZGVCb29rPT1DT0RFX0JPT0tfUE5TX05PKQorICAgIHx8IChodWZmc2VjdGlvbltuZHgxXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTyl8fChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTykKKyAgICB8fCAoaHVmZnNlY3Rpb25bbmR4MV0uY29kZUJvb2s9PUNPREVfQk9PS19JU19JTl9QSEFTRV9OTyl8fChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX0lOX1BIQVNFX05PKQorICAgICkKKyAgeworICAgIE1lcmdlR2FpbiA9IC0xOworICB9CisKKyAgcmV0dXJuIChNZXJnZUdhaW4pOworfQorCisKKy8qIHNlY3Rpb25pbmcgU3RhZ2UgMDpmaW5kIG1pbmltdW0gY29kYm9va3MgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19nbVN0YWdlMCgKKyAgICAgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIG1heFNmYiwKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBub2lzZU5yZywKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc0Jvb2sKKyAgICAgICAgKQoreworICBJTlQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbWF4U2ZiOyBpKyspCisgIHsKKyAgICAvKiBTaWRlLUluZm8gYml0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgaW4gU3RhZ2UgMSEgKi8KKyAgICBpZiAoaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPT0gSU5WQUxJRF9CSVRDT1VOVCkKKyAgICB7CisgICAgICAvKiBpbnRlbnNpdHkgYW5kIHBucyBjb2RlYm9va3MgYXJlIGFscmVhZHkgYWxsb2NhdGVkIGluIGJpdGNvdW50LmMgKi8KKyAgICAgIGlmKG5vaXNlTnJnW2ldICE9IE5PX05PSVNFX1BOUyl7CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPUNPREVfQk9PS19QTlNfTk87CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIGlzQm9va1tpXSApIHsKKyAgICAgICAgaHVmZnNlY3Rpb25baV0uY29kZUJvb2s9aXNCb29rW2ldOworICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9IDA7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSBGREthYWNFbmNfZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihodWZmc2VjdGlvbltpXS5jb2RlQm9vayksIDApOyAvKiB1c2VWQ0IxMSBtdXN0IGJlIDAhISEgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoKKyAgIHNlY3Rpb25pbmcgU3RhZ2UgMTptZXJnZSBhbGwgY29ubmVjdGVkIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlIGJvb2sgYW5kCisgICBjYWxjdWxhdGUgc2lkZSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19nbVN0YWdlMSgKKyAgICAgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIG1heFNmYiwKKyAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBzaWRlSW5mb1RhYiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMQorICAgICAgICApCit7CisgIElOVCBtZXJnZVN0YXJ0ID0gMCwgbWVyZ2VFbmQ7CisKKyAgZG8KKyAgeworICAgIGZvciAobWVyZ2VFbmQgPSBtZXJnZVN0YXJ0ICsgMTsgbWVyZ2VFbmQgPCBtYXhTZmI7IG1lcmdlRW5kKyspCisgICAgeworICAgICAgaWYgKGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLmNvZGVCb29rICE9IGh1ZmZzZWN0aW9uW21lcmdlRW5kXS5jb2RlQm9vaykKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgLyogd2UgY2FuIG1lcmdlLiB1cGRhdGUgdGFibGVzLCBzaWRlIGluZm8gYml0cyB3aWxsIGJlIHVwZGF0ZWQgb3V0c2lkZSBvZiB0aGlzIGxvb3AgKi8KKyAgICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNmYkNudCsrOworICAgICAgaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0uc2VjdGlvbkJpdHMgKz0gaHVmZnNlY3Rpb25bbWVyZ2VFbmRdLnNlY3Rpb25CaXRzOworCisgICAgICAvKiB1cGRhdGUgYml0IGxvb2sgdXAgZm9yIGFsbCBjb2RlIGJvb2tzICovCisgICAgICBGREthYWNFbmNfbWVyZ2VCaXRMb29rVXAoYml0TG9va1VwW21lcmdlU3RhcnRdLCBiaXRMb29rVXBbbWVyZ2VFbmRdKTsKKyAgICB9CisKKyAgICAvKiBhZGQgc2lkZSBpbmZvIGluZm8gYml0cyAqLworICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNlY3Rpb25CaXRzICs9IEZES2FhY0VuY19nZXRTaWRlSW5mb0JpdHMoJmh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLCBzaWRlSW5mb1RhYiwgdXNlVkNCMTEpOworICAgIGh1ZmZzZWN0aW9uW21lcmdlRW5kIC0gMV0uc2ZiU3RhcnQgPSBodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5zZmJTdGFydDsgICAgICAvKiBzcGVlZCB1cCBwcmV2IHNlYXJjaCAqLworCisgICAgbWVyZ2VTdGFydCA9IG1lcmdlRW5kOworCisgIH0gd2hpbGUgKG1lcmdlU3RhcnQgPCBtYXhTZmIpOworfQorCisvKgorICAgc2VjdGlvbmluZyBTdGFnZSAyOmdyZWVkeSBtZXJnZSBhbGdvcml0aG0sIG1lcmdlIGNvbm5lY3RlZCBzZWN0aW9ucyB3aXRoCisgICBtYXhpbXVtIGJpdCBnYWluIHVudGlsIG5vIG1vcmUgZ2FpbiBpcyBwb3NzaWJsZQorICovCitzdGF0aWMgdm9pZAorRkRLYWFjRW5jX2dtU3RhZ2UyKAorICAgICAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAorICAgICAgICBJTlQqIGNvbnN0IFJFU1RSSUNUICAgICAgICAgIG1lcmdlR2Fpbkxvb2tVcCwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIG1heFNmYiwKKyAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBzaWRlSW5mb1RhYiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMQorICAgICAgICApCit7CisgIElOVCBpOworCisgIGZvciAoaSA9IDA7IGkgKyBodWZmc2VjdGlvbltpXS5zZmJDbnQgPCBtYXhTZmI7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KQorICB7CisgICAgbWVyZ2VHYWluTG9va1VwW2ldID0gRkRLYWFjRW5jX0NhbGNNZXJnZUdhaW4oaHVmZnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEpOworICB9CisKKyAgd2hpbGUgKFRSVUUpCisgIHsKKyAgICBJTlQgbWF4TWVyZ2VHYWluLCBtYXhOZHggPSAwLCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OworCisgICAgbWF4TWVyZ2VHYWluID0gRkRLYWFjRW5jX2ZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIGh1ZmZzZWN0aW9uLCBtYXhTZmIsICZtYXhOZHgpOworCisgICAgLyogZXhpdCB3aGlsZSBsb29wIGlmIG5vIG1vcmUgZ2FpbiBpcyBwb3NzaWJsZSAqLworICAgIGlmIChtYXhNZXJnZUdhaW4gPD0gMCkKKyAgICAgIGJyZWFrOworCisgICAgbWF4TmR4TmV4dCA9IG1heE5keCArIGh1ZmZzZWN0aW9uW21heE5keF0uc2ZiQ250OworCisgICAgLyogbWVyZ2Ugc2VjdGlvbnMgd2l0aCBtYXhpbXVtIGJpdCBnYWluICovCisgICAgaHVmZnNlY3Rpb25bbWF4TmR4XS5zZmJDbnQgKz0gaHVmZnNlY3Rpb25bbWF4TmR4TmV4dF0uc2ZiQ250OworICAgIGh1ZmZzZWN0aW9uW21heE5keF0uc2VjdGlvbkJpdHMgKz0gaHVmZnNlY3Rpb25bbWF4TmR4TmV4dF0uc2VjdGlvbkJpdHMgLSBtYXhNZXJnZUdhaW47CisKKyAgICAvKiB1cGRhdGUgYml0IGxvb2sgdXAgdGFibGUgZm9yIG1lcmdlZCBodWZmc2VjdGlvbiAgKi8KKyAgICBGREthYWNFbmNfbWVyZ2VCaXRMb29rVXAoYml0TG9va1VwW21heE5keF0sIGJpdExvb2tVcFttYXhOZHhOZXh0XSk7CisKKyAgICAvKiB1cGRhdGUgbWVyZ2VMb29rVXBUYWJsZSAqLworICAgIGlmIChtYXhOZHggIT0gMCkKKyAgICB7CisgICAgICBtYXhOZHhMYXN0ID0gaHVmZnNlY3Rpb25bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7CisgICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBGREthYWNFbmNfQ2FsY01lcmdlR2FpbihodWZmc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4TGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMSk7CisKKyAgICB9CisgICAgbWF4TmR4TmV4dCA9IG1heE5keCArIGh1ZmZzZWN0aW9uW21heE5keF0uc2ZiQ250OworCisgICAgaHVmZnNlY3Rpb25bbWF4TmR4TmV4dCAtIDFdLnNmYlN0YXJ0ID0gaHVmZnNlY3Rpb25bbWF4TmR4XS5zZmJTdGFydDsKKworICAgIGlmIChtYXhOZHhOZXh0IDwgbWF4U2ZiKQorICAgICAgbWVyZ2VHYWluTG9va1VwW21heE5keF0gPSBGREthYWNFbmNfQ2FsY01lcmdlR2FpbihodWZmc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keE5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEpOworCisgIH0KK30KKworLyogY291bnQgYml0cyB1c2VkIGJ5IHRoZSBub2lzZWxlc3MgY29kZXIgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19ub2lzZWxlc3NDb3VudGVyKAorICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgY29uc3QgVUlOVCogY29uc3QgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIHNmYk9mZnNldCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgbm9pc2VOcmcsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNCb29rLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExCisgICAgICAgICkKK3sKKyAgSU5UIGdycE5keCwgaTsKKyAgY29uc3QgU0hPUlQgKnNpZGVJbmZvVGFiID0gTlVMTDsKKyAgU0VDVElPTl9JTkZPICpodWZmc2VjdGlvbjsKKworICAvKiB1c2UgYXBwcm9wcmlhdGUgc2lkZSBpbmZvIHRhYmxlICovCisgIHN3aXRjaCAoYmxvY2tUeXBlKQorICB7CisgIGNhc2UgTE9OR19XSU5ET1c6CisgIGNhc2UgU1RBUlRfV0lORE9XOgorICBjYXNlIFNUT1BfV0lORE9XOgorICAgIHNpZGVJbmZvVGFiID0gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZzsKKyAgICBicmVhazsKKyAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgc2lkZUluZm9UYWIgPSBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydDsKKyAgICBicmVhazsKKyAgfQorCisgIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSAwOworICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAwOworICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gMDsKKworCisgIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogbG9vcCB0cm91Z2ggZ3JvdXBzICovCisgIGZvciAoZ3JwTmR4ID0gMDsgZ3JwTmR4IDwgc2VjdGlvbkRhdGEtPnNmYkNudDsgZ3JwTmR4ICs9IHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCkKKyAgeworICAgIGh1ZmZzZWN0aW9uID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uICsgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsKKworICAgIC8qIGNvdW50IGJpdHMgaW4gdGhpcyBncm91cCAqLworICAgIEZES2FhY0VuY19idWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsCisgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiArIGdycE5keCwKKyAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgaHVmZnNlY3Rpb24pOworCisgICAgLyogMC5TdGFnZSA6RmluZCBtaW5pbXVtIENvZGVib29rcyAqLworICAgIEZES2FhY0VuY19nbVN0YWdlMChodWZmc2VjdGlvbiwgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIG5vaXNlTnJnK2dycE5keCwgaXNCb29rK2dycE5keCk7CisKKyAgICAvKiAxLlN0YWdlIDpNZXJnZSBhbGwgY29ubmVjdGVkIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlIGJvb2sgKi8KKyAgICBGREthYWNFbmNfZ21TdGFnZTEoaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLCBzaWRlSW5mb1RhYiwgdXNlVkNCMTEpOworCisKKyAgICAvKgorICAgICAgIDIuU3RhZ2UKKyAgICAgICBncmVlZHkgbWVyZ2UgYWxnb3JpdGhtLCBtZXJnZSBjb25uZWN0ZWQgaHVmZnNlY3Rpb25zIHdpdGggbWF4aW11bSBiaXQKKyAgICAgICBnYWluIHVudGlsIG5vIG1vcmUgZ2FpbiBpcyBwb3NzaWJsZQorICAgICAqLworCisgICAgRkRLYWFjRW5jX2dtU3RhZ2UyKGh1ZmZzZWN0aW9uLAorICAgICAgICAgICAgIG1lcmdlR2Fpbkxvb2tVcCwKKyAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICAgICAgIHVzZVZDQjExKTsKKworCisKKyAgICAvKgorICAgICAgIGNvbXByZXNzIG91dHB1dCwgY2FsY3VsYXRlIHRvdGFsIGh1ZmYgYW5kIHNpZGUgYml0cworICAgICAgIHNpbmNlIHdlIGRpZCBub3QgdXBkYXRlIHRoZSBhY3R1YWwgY29kZWJvb2sgaW4gc3RhZ2UgMgorICAgICAgIHRvIHNhdmUgdGltZSwgd2UgbXVzdCBzZXQgaXQgaGVyZSBmb3IgbGF0ZXIgdXNlIGluIGJpdGVuYworICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsgaSArPSBodWZmc2VjdGlvbltpXS5zZmJDbnQpCisgICAgeworICAgICAgaWYgKChodWZmc2VjdGlvbltpXS5jb2RlQm9vaz09Q09ERV9CT09LX1BOU19OTykgfHwKKyAgICAgICAgICAoaHVmZnNlY3Rpb25baV0uY29kZUJvb2s9PUNPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8CisgICAgICAgICAgKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPT1DT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKQorICAgICAgeworICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cz0wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdGhlIHNlY3Rpb25zIGluIHRoZSBzZWN0aW9uRGF0YSBhcmUgbm93IG1hcmtlZCB3aXRoIHRoZSBvcHRpbWFsIGNvZGUgYm9vayAqLworCisgICAgICAgICAgRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoaHVmZnNlY3Rpb25baV0uY29kZUJvb2spLCB1c2VWQ0IxMSk7CisKKyAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICs9IGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzIC0gRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CisgICAgICB9CisKKyAgICAgIGh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICs9IGdycE5keDsKKworICAgICAgLyogc3VtIHVwIHNpZGUgaW5mbyBiaXRzIChzZWN0aW9uIGRhdGEgYml0cykgKi8KKyAgICAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKz0gRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CisgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucysrXSA9IGh1ZmZzZWN0aW9uW2ldOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfc2NmQ291bnQKKyAgICAgcmV0dXJucyAgICAgOiAtLS0KKyAgICAgZGVzY3JpcHRpb24gOiBjb3VudCBiaXRzIHVzZWQgYnkgc2NhbGVmYWN0b3JzLgorCisgICAgICAgICAgICAgICAgICAgbm90IGluIGFsbCBjYXNlcyBpZiBtYXhWYWx1ZUluU2ZiW10gPT0gMCB3ZSBzZXQgZGVsdGFTY2YKKyAgICAgICAgICAgICAgICAgICB0byB6ZXJvLiBvbmx5IGlmIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBsYXN0IGFuZCBmdXR1cmUKKyAgICAgICAgICAgICAgICAgICBzY2FsZWZhY0dhaW4gaXMgbm90IGdyZWF0ZXIgdGhlbiBDT0RFX0JPT0tfU0NGX0xBViAoNjApLgorCisgICAgIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICBeCisgICAgIHNjYWxlZmFjR2FpbiB8CisgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgIGxhc3QgNzUKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIGN1cnJlbnQgNTAKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIGZ1dHVyZSA1CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAtLS0gLi4uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLi4uIC0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmIKKworCisgICAgICAgICAgICAgICAgICBpZiBtYXhWYWx1ZUluU2ZiW10gb2YgY3VycmVudCBpcyB6ZXJvIGJlY2F1c2Ugb2YgYQorICAgICAgICAgICAgICAgICAgbm90ZmFsbHN0cmF0ZWdpZSwgd2UgZG8gbm90IHNhdmUgYml0cyBhbmQgdHJhbnNtaXQgYQorICAgICAgICAgICAgICAgICAgZGVsdGFTY2Ygb2YgMjUuIG90aGVyd2lzZSB0aGUgZGVsdGFTY2YgYmV0d2VlbiB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgc2NhbGZhY0dhaW4gKDc1KSBhbmQgdGhlIGZ1dHVyZSBzY2FsZWZhY0dhaW4gKDUpIGlzIDcwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19zY2ZDb3VudCgKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBzY2FsZWZhY0dhaW4sCisgICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0ICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc1NjYWxlCisgICAgICAgICkKK3sKKyAgSU5UIGksIGosIGssIG0sIG47CisKKyAgSU5UIGxhc3RWYWxTY2YgICAgID0gMDsKKyAgSU5UIGRlbHRhU2NmICAgICAgID0gMDsKKyAgSU5UIGZvdW5kICAgICAgICAgID0gMDsKKyAgSU5UIHNjZlNraXBDb3VudGVyID0gMDsKKyAgSU5UIGxhc3RWYWxJcyAgICAgID0gMDsKKworICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzID0gMDsKKworICBpZiAoc2NhbGVmYWNHYWluID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7CisKKyAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKQorICB7CisgICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykKKyAgICB7CisgICAgICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CisgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspCisgIHsKKyAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpCisgICAgeworICAgICAgZm9yIChqID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OworICAgICAgICAgICBqIDwgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKyAgICAgICAgICAgaisrKQorICAgICAgeworICAgICAgICBJTlQgZGVsdGFJcyA9IGlzU2NhbGVbal0tbGFzdFZhbElzOworICAgICAgICBsYXN0VmFsSXMgICA9IGlzU2NhbGVbal07CisgICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMrPUZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcyk7CisgICAgICB9CisgICAgfSAvKiBJbnRlbnNpdHkgKi8KKyAgICBlbHNlIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSAmJgorICAgICAgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpCisgICAgeworICAgICAgSU5UIHRtcCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICBmb3IgKGogPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGo8dG1wOyBqKyspCisgICAgICB7CisgICAgICAgIC8qIGNoZWNrIGlmIHdlIGNhbiByZXBlYXQgdGhlIGxhc3QgdmFsdWUgdG8gc2F2ZSBiaXRzICovCisgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmb3VuZCA9IDA7CisgICAgICAgICAgLyogYXJlIHNjYWxlZmFjdG9ycyBza2lwcGVkPyAqLworICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgICAgICAgICBpZiAoaiA9PSAodG1wIC0gMSkgKQorICAgICAgICAgICAgICBmb3VuZCA9IDA7ICAvKiBzZWFyY2ggaW4gb3RoZXIgc2VjdGlvbnMgZm9yIG1heFZhbHVlSW5TZmIgIT0gMCAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBzZWFyY2ggaW4gdGhpcyBzZWN0aW9uIGZvciB0aGUgbmV4dCBtYXhWYWx1ZUluU2ZiW10gIT0gMCAqLworICAgICAgICAgICAgICBmb3IgKGsgPSAoaisxKTsgayA8IHRtcDsgaysrKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJba10gIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICBpZiAoIChmaXhwX2FicyhzY2FsZWZhY0dhaW5ba10gLSBsYXN0VmFsU2NmKSkgPD0gQ09ERV9CT09LX1NDRl9MQVYpCisgICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7IC8qIHNhdmUgYml0cyAqLworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3Qgc2F2ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltqXTsKKyAgICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNvdW50IHNjYWxlZmFjdG9yIHNraXAgKi8KKyAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlcisrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNlYXJjaCBmb3IgdGhlIG5leHQgbWF4VmFsdWVJblNmYltdICE9IDAgaW4gYWxsIG90aGVyIHNlY3Rpb25zICovCisgICAgICAgICAgICBmb3IgKG09KGkrMSk7IChtIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucykgJiYgKGZvdW5kID09IDApOyBtKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSAmJiAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSU5UIGVuZCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5zZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5zZmJDbnQ7CisgICAgICAgICAgICAgICAgZm9yIChuID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYlN0YXJ0OyBuPGVuZDsgbisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW25dICE9IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpeHBfYWJzKHNjYWxlZmFjR2FpbltuXSAtIGxhc3RWYWxTY2YpIDw9IENPREVfQk9PS19TQ0ZfTEFWKQorICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgIC8qIHNhdmUgYml0cyAqLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3Qgc2F2ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOworICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07CisgICAgICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLworICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIG5vIG1heFZhbHVlSW5TZmJbXSAhPSAwIGZvdW5kICovCisgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOworICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogY29uc2lkZXIgc2tpcHBlZCBzY2FsZWZhY3RvcnMgKi8KKyAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKKyAgICAgICAgICAgIHNjZlNraXBDb3VudGVyLS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKKyAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOworICAgICAgICB9CisgICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0gRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZik7CisgICAgICB9CisgICAgfQorICB9IC8qIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgKi8KK30KKworI2lmZGVmIFBOU19QUkVDT1VOVF9FTkFCTEUKKy8qCisgIHByZUNvdW50IGJpdHMgdXNlZCBwbnMKKyovCisvKiBlc3RpbWF0ZSBiaXRzIHVzZWQgYnkgcG5zIGZvciBjb3JyZWN0aW9uIG9mIHN0YXRpYyBiaXRzICovCisvKiBubyBjb2RlYm9vayBzd2l0Y2ggZXN0aW1hdGlvbiwgc2VlIEFBQyBMRCBGQVNURU5DICovCitJTlQgbm9pc2VQcmVDb3VudChjb25zdCBJTlQgKm5vaXNlTnJnLCBJTlQgbWF4U2ZiKQoreworICBJTlQgICBub2lzZVBDTUZsYWcgPSBUUlVFOworICBJTlQgICBsYXN0VmFsUG5zID0gMCwgZGVsdGFQbnM7CisgIGludCAgIGksIGJpdHM9MDsKKworIGZvciAoaSA9IDA7IGkgPCBtYXhTZmI7IGkrKykgeworICAgaWYgKG5vaXNlTnJnW2ldICE9IE5PX05PSVNFX1BOUykgeworCisgICAgIGlmIChub2lzZVBDTUZsYWcpIHsKKyAgICAgICBiaXRzKz1QTlNfUENNX0JJVFM7CisgICAgICAgbGFzdFZhbFBucyAgID0gbm9pc2VOcmdbaV07CisgICAgICAgbm9pc2VQQ01GbGFnID0gRkFMU0U7CisgICAgIH1lbHNlIHsKKyAgICAgICBkZWx0YVBucyAgICAgPSBub2lzZU5yZ1tpXS1sYXN0VmFsUG5zOworICAgICAgIGxhc3RWYWxQbnMgICA9IG5vaXNlTnJnW2ldOworICAgICAgIGJpdHMrPUZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFQbnMpOworICAgICB9CisgICB9CisgfQorIHJldHVybiAoIGJpdHMgKTsKK30KKyNlbmRpZiAvKiBQTlNfUFJFQ09VTlRfRU5BQkxFICovCisKKy8qIGNvdW50IGJpdHMgdXNlZCBieSBwbnMgKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19ub2lzZUNvdW50KAorICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnCisgICAgICAgICkKK3sKKyAgSU5UIG5vaXNlUENNRmxhZyA9IFRSVUU7CisgIElOVCBsYXN0VmFsUG5zID0gMCwgZGVsdGFQbnM7CisgIGludCBpLCBqOworCisgIHNlY3Rpb25EYXRhLT5ub2lzZU5yZ0JpdHMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKKyAgICBpZiAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHsKKyAgICAgIGludCBzZmJTdGFydCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsKKyAgICAgIGludCBzZmJFbmQgPSBzZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICBmb3IgKGo9c2ZiU3RhcnQ7IGo8c2ZiRW5kOyBqKyspIHsKKworICAgICAgICBpZiAobm9pc2VQQ01GbGFnKSB7CisgICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cys9UE5TX1BDTV9CSVRTOworICAgICAgICAgIGxhc3RWYWxQbnMgICA9IG5vaXNlTnJnW2pdOworICAgICAgICAgIG5vaXNlUENNRmxhZyA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbHRhUG5zICAgICA9IG5vaXNlTnJnW2pdLWxhc3RWYWxQbnM7CisgICAgICAgICAgbGFzdFZhbFBucyAgID0gbm9pc2VOcmdbal07CisgICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cys9RkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVBucyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworSU5UIEZES2FhY0VuY19keW5CaXRDb3VudCgKKyAgICAgICAgQklUQ05UUl9TVEFURSogY29uc3QgICAgICAgICBoQkMsCisgICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgY29uc3QgVUlOVCogY29uc3QgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIHNjYWxlZmFjLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2ZiT2Zmc2V0LAorICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzQm9vaywKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc1NjYWxlLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzCisgICAgICAgICkKK3sKKyAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOworICBzZWN0aW9uRGF0YS0+c2ZiQ250ICAgICAgICAgPSBzZmJDbnQ7CisgIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCAgICA9IHNmYlBlckdyb3VwOworICBzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgICAgPSBzZmJDbnQgLyBzZmJQZXJHcm91cDsKKyAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXA7CisKKyAgRkRLYWFjRW5jX25vaXNlbGVzc0NvdW50ZXIoCisgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgaEJDLT5tZXJnZUdhaW5Mb29rVXAsCisgICAgICAgICAgICAgICAgICAgKGxvb2tVcFRhYmxlKWhCQy0+Yml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgIG5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgIGlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAoc3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSk/MTowKTsKKworICBGREthYWNFbmNfc2NmQ291bnQoCisgICAgICAgICAgIHNjYWxlZmFjLAorICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICBzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgaXNTY2FsZSk7CisKKyAgRkRLYWFjRW5jX25vaXNlQ291bnQoc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgbm9pc2VOcmcpOworCisgIHJldHVybiAoc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICsKKyAgICAgICAgICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsKKyAgICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzICsKKyAgICAgICAgICBzZWN0aW9uRGF0YS0+bm9pc2VOcmdCaXRzKTsKK30KKworSU5UIEZES2FhY0VuY19CQ05ldyhCSVRDTlRSX1NUQVRFICoqcGhCQworICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQorICAgICAgICAgKQoreworICBCSVRDTlRSX1NUQVRFICpoQkMgPSAgR2V0UmFtX2FhY0VuY19CaXRDbnRyU3RhdGUoKTsKKworICBpZiAoaEJDKQorICB7CisgICAgKnBoQkMgPSBoQkM7CisgICAgaEJDLT5iaXRMb29rVXAgICAgICAgPSBHZXRSYW1fYWFjRW5jX0JpdExvb2tVcCgwLGR5bmFtaWNfUkFNKTsKKyAgICBoQkMtPm1lcmdlR2Fpbkxvb2tVcCA9IEdldFJhbV9hYWNFbmNfTWVyZ2VHYWluTG9va1VwKDAsZHluYW1pY19SQU0pOworICAgIGlmIChoQkMtPmJpdExvb2tVcCAgICAgICA9PSAwIHx8CisgICAgICAgIGhCQy0+bWVyZ2VHYWluTG9va1VwID09IDApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAoaEJDID09IDApID8gMSA6IDA7Cit9CisKK3ZvaWQgRkRLYWFjRW5jX0JDQ2xvc2UoQklUQ05UUl9TVEFURSAqKnBoQkMpCit7CisgIGlmICgqcGhCQyE9TlVMTCkgeworCisgICAgRnJlZVJhbV9hYWNFbmNfQml0Q250clN0YXRlKHBoQkMpOworICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9keW5fYml0cy5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTc4YTRjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuaApAQCAtMCwwICsxLDE2NyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogTm9pc2VsZXNzIGNvZGVyIG1vZHVsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19EWU5fQklUU19ICisjZGVmaW5lIF9fRFlOX0JJVFNfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgorCisjZGVmaW5lIE1BWF9TRUNUSU9OUyAgICAgICAgICBNQVhfR1JPVVBFRF9TRkIKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX0xPTkcgICAgMzEKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX1NIT1JUICAgIDcKKyNkZWZpbmUgQ09ERV9CT09LX0JJVFMgICAgICAgIDQKKyNkZWZpbmUgU0VDVF9CSVRTX0xPTkcgICAgICAgIDUKKyNkZWZpbmUgU0VDVF9CSVRTX1NIT1JUICAgICAgIDMKKyNkZWZpbmUgUE5TX1BDTV9CSVRTICAgICAgICAgIDkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIGNvZGVCb29rOworICBJTlQgc2ZiU3RhcnQ7CisgIElOVCBzZmJDbnQ7CisgIElOVCBzZWN0aW9uQml0czsgICAgICAgICAgICAgIC8qIGh1ZmYgKyBzaSAhICovCit9IFNFQ1RJT05fSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQgYmxvY2tUeXBlOworICBJTlQgbm9PZkdyb3VwczsKKyAgSU5UIHNmYkNudDsKKyAgSU5UIG1heFNmYlBlckdyb3VwOworICBJTlQgc2ZiUGVyR3JvdXA7CisgIElOVCBub09mU2VjdGlvbnM7CisgIFNFQ1RJT05fSU5GTyBodWZmc2VjdGlvbltNQVhfU0VDVElPTlNdOworICBJTlQgc2lkZUluZm9CaXRzOyAgICAgICAgICAgICAvKiBzZWN0aW9uaW5nIGJpdHMgICAgICAgKi8KKyAgSU5UIGh1ZmZtYW5CaXRzOyAgICAgICAgICAgICAgLyogaHVmZm1hbiAgICBjb2RlZCBiaXRzICovCisgIElOVCBzY2FsZWZhY0JpdHM7ICAgICAgICAgICAgIC8qIHNjYWxlZmFjICAgY29kZWQgYml0cyAqLworICBJTlQgbm9pc2VOcmdCaXRzOyAgICAgICAgICAgICAvKiBub2lzZUVuZXJneSBjb2RlZCBiaXRzICovCisgIElOVCBmaXJzdFNjZjsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHNjZiB0byBiZSBjb2RlZCAqLworfSBTRUNUSU9OX0RBVEE7CisKKworc3RydWN0IEJJVENOVFJfU1RBVEUKK3sKKyAgSU5UICpiaXRMb29rVXA7CisgIElOVCAqbWVyZ2VHYWluTG9va1VwOworfTsKKworCitJTlQgIEZES2FhY0VuY19CQ05ldyhCSVRDTlRSX1NUQVRFICoqcGhCQworICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KKyAgICAgICAgICApOworCit2b2lkIEZES2FhY0VuY19CQ0Nsb3NlKEJJVENOVFJfU1RBVEUgKipwaEJDKTsKKworI2lmIGRlZmluZWQoUE5TX1BSRUNPVU5UX0VOQUJMRSkKK0lOVCAgbm9pc2VQcmVDb3VudChjb25zdCBJTlQgKm5vaXNlTnJnLCBJTlQgbWF4U2ZiKTsKKyNlbmRpZgorCitJTlQgRkRLYWFjRW5jX2R5bkJpdENvdW50KAorICAgICAgICBCSVRDTlRSX1NUQVRFKiBjb25zdCAgICAgICAgIGhCQywKKyAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBxdWFudFNwZWN0cnVtLAorICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2NhbGVmYWMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgbm9pc2VOcmcsCisgICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNCb29rLAorICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzU2NhbGUsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MKKyAgICAgICAgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ODY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcApAQCAtMCwwICsxLDI3MiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogU2hvcnQgYmxvY2sgZ3JvdXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisvKgorKiB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgd29yayBpbi1wbGFjZQorKi8KKworc3RhdGljIGlubGluZSBGSVhQX0RCTCBucmdBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiAoIChhPj0oRklYUF9EQkwpTUFYVkFMX0RCTC1iKSA/IChGSVhQX0RCTClNQVhWQUxfREJMIDogKGEgKyBiKSApOworfQorCit2b2lkCitGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoRklYUF9EQkwgICAgICAqbWRjdFNwZWN0cnVtLCAgICAgLyogaW4tb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgICAgIC8qIGluLW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3ksICAgICAgICAvKiBpbi1vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsICAgICAgLyogaW4tb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZEVuZXJneSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkNudCwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LCAgICAgICAvKiBvdXQgKi8KKyAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKm1heFNmYlBlckdyb3VwLCAgICAgICAgIC8qIG91dCAqLworICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqZ3JvdXBlZFNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIG5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpncm91cExlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIGdyYW51bGVMZW5ndGgpCit7CisgIElOVCBpLGo7CisgIElOVCBsaW5lOyAgICAgICAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAgKi8KKyAgSU5UIHNmYjsgICAgICAgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICAqLworICBJTlQgZ3JwOyAgICAgICAgLyogY291bnRzIHRocm91Z2ggZ3JvdXBzICAgICAgICAgICAgICovCisgIElOVCB3bmQ7ICAgICAgICAvKiBjb3VudHMgdGhyb3VnaCB3aW5kb3dzIGluIGEgZ3JvdXAgKi8KKyAgSU5UIG9mZnNldDsgICAgIC8qIG5lZWRlZCBpbiBzZmJPZmZzZXQgZ3JvdXBpbmcgICAgICAqLworICBJTlQgaGlnaGVzdFNmYjsKKworICBJTlQgZ3JhbnVsZUxlbmd0aF9zaG9ydCA9IGdyYW51bGVMZW5ndGgvVFJBTlNfRkFDOworCisgIC8qIGZvciBzaG9ydCBibG9ja3M6IHJlZ3JvdXAgc3BlY3RydW0gYW5kICovCisgIC8qIGdyb3VwIGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGFjY29yZGluZyB0byBncm91cGluZyAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOworCisgIC8qIGNhbGN1bGF0ZSBtYXhTZmJQZXJHcm91cCAqLworICBoaWdoZXN0U2ZiID0gMDsKKyAgZm9yICh3bmQgPSAwOyB3bmQgPCBUUkFOU19GQUM7IHduZCsrKQorICB7CisgICAgZm9yIChzZmIgPSBzZmJBY3RpdmUtMTsgc2ZiID49IGhpZ2hlc3RTZmI7IHNmYi0tKQorICAgIHsKKyAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmIrMV0tMTsgbGluZSA+PSBzZmJPZmZzZXRbc2ZiXTsgbGluZS0tKQorICAgICAgeworICAgICAgICBpZiAoIG1kY3RTcGVjdHJ1bVt3bmQqZ3JhbnVsZUxlbmd0aF9zaG9ydCtsaW5lXSAhPSBGTDJGWENPTlNUX1NQQygwLjApICkgYnJlYWs7IC8qIHRoaXMgYmFuZCBpcyBub3QgY29tcGxldGVseSB6ZXJvICovCisgICAgICB9CisgICAgICBpZiAobGluZSA+PSBzZmJPZmZzZXRbc2ZiXSkgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGJhbmQgd2FzIG5vdCBjb21wbGV0ZWx5IHplcm8gKi8KKyAgICB9CisgICAgaGlnaGVzdFNmYiA9IGZpeE1heChoaWdoZXN0U2ZiLCBzZmIpOworICB9CisgIGhpZ2hlc3RTZmIgPSBoaWdoZXN0U2ZiID4gMCA/IGhpZ2hlc3RTZmIgOiAwOworICAqbWF4U2ZiUGVyR3JvdXAgPSBoaWdoZXN0U2ZiKzE7CisKKyAgLyogY2FsY3VsYXRlIGdyb3VwZWRTZmJPZmZzZXQgKi8KKyAgaSA9IDA7CisgIG9mZnNldCA9IDA7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCisgIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlKzE7IHNmYisrKQorICAgICAgeworICAgICAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaSsrXSA9IG9mZnNldCArIHNmYk9mZnNldFtzZmJdICogZ3JvdXBMZW5bZ3JwXTsKKyAgICAgIH0KKyAgICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIGdyYW51bGVMZW5ndGhfc2hvcnQ7CisgIH0KKyAgZ3JvdXBlZFNmYk9mZnNldFtpKytdID0gZ3JhbnVsZUxlbmd0aDsKKworICAvKiBjYWxjdWxhdGUgZ3JvdXBlZFNmYk1pblNuciAqLworICBpID0gMDsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKKyAgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKKyAgICB7CisgICAgICBncm91cGVkU2ZiTWluU25yTGREYXRhW2krK10gPSBzZmJNaW5TbnJMZERhdGFbc2ZiXTsKKyAgICB9CisgICAgaSArPSAgc2ZiQ250LXNmYjsKKyAgfQorCisgIC8qIHN1bSB1cCBzZmJUaHJlc2hvbGRzICovCisgIHduZCA9IDA7CisgIGkgPSAwOworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQorICB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQorICAgIHsKKyAgICAgIEZJWFBfREJMIHRocmVzaCA9IHNmYlRocmVzaG9sZC0+U2hvcnRbd25kXVtzZmJdOworICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKQorICAgICAgeworICAgICAgICB0aHJlc2ggPSBucmdBZGRTYXR1cmF0ZSh0aHJlc2gsIHNmYlRocmVzaG9sZC0+U2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgfQorICAgICAgc2ZiVGhyZXNob2xkLT5Mb25nW2krK10gPSB0aHJlc2g7CisgICAgfQorICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbGVmdC9yaWdodCAqLworICB3bmQgPSAwOworICBpID0gMDsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKKyAgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKKyAgICB7CisgICAgICBGSVhQX0RCTCBlbmVyZ3kgPSBzZmJFbmVyZ3ktPlNob3J0W3duZF1bc2ZiXTsKKyAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykKKyAgICAgIHsKKyAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJFbmVyZ3ktPlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIH0KKyAgICAgIHNmYkVuZXJneS0+TG9uZ1tpKytdID0gZW5lcmd5OworICAgIH0KKyAgICBpICs9ICBzZmJDbnQtc2ZiOworICAgIHduZCArPSBncm91cExlbltncnBdOworICB9CisKKyAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIG1pZC9zaWRlICovCisgIHduZCA9IDA7CisgIGkgPSAwOworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQorICB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQorICAgIHsKKyAgICAgIEZJWFBfREJMIGVuZXJneSA9IHNmYkVuZXJneU1TLT5TaG9ydFt3bmRdW3NmYl07CisgICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspCisgICAgICB7CisgICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiRW5lcmd5TVMtPlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIH0KKyAgICAgIHNmYkVuZXJneU1TLT5Mb25nW2krK10gPSBlbmVyZ3k7CisgICAgfQorICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICAvKiBzdW0gdXAgc2ZiU3ByZWFkRW5lcmdpZXMgKi8KKyAgd25kID0gMDsKKyAgaSA9IDA7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCisgIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCisgICAgeworICAgICAgRklYUF9EQkwgZW5lcmd5ID0gc2ZiU3ByZWFkRW5lcmd5LT5TaG9ydFt3bmRdW3NmYl07CisgICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspCisgICAgICB7CisgICAgICAgICBlbmVyZ3kgPSBucmdBZGRTYXR1cmF0ZShlbmVyZ3ksIHNmYlNwcmVhZEVuZXJneS0+U2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgfQorICAgICAgc2ZiU3ByZWFkRW5lcmd5LT5Mb25nW2krK10gPSBlbmVyZ3k7CisgICAgfQorICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICAvKiByZS1ncm91cCBzcGVjdHJ1bSAqLworICB3bmQgPSAwOworICBpID0gMDsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKKyAgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKKyAgICB7CisgICAgICBpbnQgd2lkdGggPSBzZmJPZmZzZXRbc2ZiKzFdLXNmYk9mZnNldFtzZmJdOworICAgICAgRklYUF9EQkwgKnBNZGN0U3BlY3RydW0gPSAmbWRjdFNwZWN0cnVtW3NmYk9mZnNldFtzZmJdXSArIHduZCpncmFudWxlTGVuZ3RoX3Nob3J0OworICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykKKyAgICAgIHsKKyAgICAgICAgRklYUF9EQkwgKnBUbXAgPSBwTWRjdFNwZWN0cnVtOworICAgICAgICBmb3IgKGxpbmUgPSB3aWR0aDsgbGluZSA+IDA7IGxpbmUtLSkKKyAgICAgICAgeworICAgICAgICAgIHRtcFNwZWN0cnVtW2krK10gPSAqcFRtcCsrOworICAgICAgICB9CisgICAgICAgIHBNZGN0U3BlY3RydW0gKz0gZ3JhbnVsZUxlbmd0aF9zaG9ydDsKKyAgICAgIH0KKyAgICB9CisgICAgaSArPSAgKGdyb3VwTGVuW2dycF0qKHNmYk9mZnNldFtzZmJDbnRdLXNmYk9mZnNldFtzZmJdKSk7CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICBGREttZW1jcHkobWRjdFNwZWN0cnVtLCB0bXBTcGVjdHJ1bSwgZ3JhbnVsZUxlbmd0aCpzaXplb2YoRklYUF9EQkwpKTsKKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKQorfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuaCBiL2FhYy9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MTg1NQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmgKQEAgLTAsMCArMSwxMTUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFNob3J0IGJsb2NrIGdyb3VwaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19HUlBfREFUQV9IX18KKyNkZWZpbmUgX19HUlBfREFUQV9IX18KKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgInBzeV9kYXRhLmgiCisKKwordm9pZAorRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKEZJWFBfREJMICAgICAgKm1kY3RTcGVjdHJ1bSwgICAgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgICAgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneSwgICAgICAgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLCAgICAgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZEVuZXJneSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkNudCwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LCAgICAgLyogb3V0ICovCisgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICptYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKmdyb3VwZWRTZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBub09mR3JvdXBzLAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqZ3JvdXBMZW4sCisgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBncmFudWxlTGVuZ3RoKTsKKworI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MDdmNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5jcHAKQEAgLTAsMCArMSw3NjEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3cikgLyBKb3NlZiBIb2VwZmwgKEZESykKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBpbnRlbnNpdHkgc3RlcmVvIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaW50ZW5zaXR5LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJxY19tYWluLmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorCisvKiBvbmx5IHNldCBhbiBJUyBzZWVkIGl0IGxlZnQvcmlnaHQgY2hhbm5lbCBjb3JyZWxhdGlvbiBpcyBhYm92ZSBJU19DT1JSX1RIUkVTSCAqLworI2RlZmluZSBJU19DT1JSX1RIUkVTSCAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjk1ZikKKworLyogd2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcworICogbm90IG1vcmUgdGhhbiBJU19UT1RBTF9FUlJPUl9USFJFU0ggb3ZlcmFsbCBhbmQKKyAqIG5vdCBtb3JlIHRoYW4gSVNfTE9DQUxfRVJST1JfVEhSRVNIIGZvciB0aGUgY3VycmVudCBTRkIgKi8KKyNkZWZpbmUgSVNfVE9UQUxfRVJST1JfVEhSRVNIICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wNGYpCisjZGVmaW5lIElTX0xPQ0FMX0VSUk9SX1RIUkVTSCAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDFmKQorCisvKiB0aGUgbWF4aW11bSBhbGxvd2VkIGNoYW5nZSBvZiB0aGUgaW50ZW5zaXR5IGRpcmVjdGlvbiAodW5pdDogSVMgc2NhbGUpIC0gc2NhbGVkIHdpdGggZmFjdG9yIDAuMjUgLSAqLworI2RlZmluZSBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRiAyCisjZGVmaW5lIElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIIEZMMkZYQ09OU1RfREJMKDIuMGYvKDE8PElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIX1NGKSkKKworLyogSVMgcmVnaW9ucyBuZWVkIHRvIGhhdmUgYSBtaW5pbWFsIHBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgbG91ZG5lc3MsIGUuZy4gMC4wNiA9PSA2JSAqLworI2RlZmluZSBJU19SRUdJT05fTUlOX0xPVURORVNTICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjFmKQorCisvKiBvbmx5IHBlcmZvcm0gSVMgaWYgSVNfTUlOX1NGQlMgbmVpZ2hib3JpbmcgU0ZCcyBjYW4gYmUgcHJvY2Vzc2VkICovCisjZGVmaW5lIElTX01JTl9TRkJTICAgICAgICAgICAgICAgICAgIDYKKworLyogb25seSBkbyBJUyBpZgorICogaWYgSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0ggPCBzZmJFbmVyZ3lMZWZ0W3NmYl0vc2ZiRW5lcmd5UmlnaHRbc2ZiXSA8IDEgLyBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSAorICogLT4gbm8gSVMgaWYgdGhlIHBhbm5pbmcgYW5nbGUgaXMgbm90IGZhciBmcm9tIHRoZSBtaWRkbGUsIE1TIHdpbGwgZG8gKi8KKy8qIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIHNjYWxlIG9mICsvLTEuMDI5MTQ2MzQ1NjYgKi8KKyNkZWZpbmUgSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0ggICAgRkwyRlhDT05TVF9EQkwoMC43ZikKKworLyogc2NhbGVmYWN0b3Igb2YgcmVhbFNjYWxlICovCisjZGVmaW5lIFJFQUxfU0NBTEVfU0YgICAgICAgICAgICAgICAgICAgIDEKKworLyogc2NhbGVmYWN0b3Igb3ZlcmFsbExvdWRuZXNzICovCisjZGVmaW5lIE9WRVJBTExfTE9VRE5FU1NfU0YgICAgICAgICAgICAgIDYKKworLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvdmVyIG1heCBzYW1wbGVzIHBlciBnb3VwICovCisjZGVmaW5lIE1BWF9TRkJfUEVSX0dST1VQX1NGICAgICAgICAgICAgIDYKKworLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvZiBtZGN0IHNwZWN0cnVtICovCisjZGVmaW5lIE1EQ1RfU1BFQ19TRiAgICAgICAgICAgICAgICAgICAgIDYKKworCit0eXBlZGVmIHN0cnVjdAoreworCisgIEZJWFBfREJMIGNvcnJfdGhyZXNoOyAgICAgICAgICAgICAgICAgLyohPCBPbmx5IHNldCBhbiBJUyBzZWVkIGl0IGxlZnQvcmlnaHQgY2hhbm5lbCBjb3JyZWxhdGlvbiBpcyBhYm92ZSBjb3JyX3RocmVzaCAqLworCisgIEZJWFBfREJMIHRvdGFsX2Vycm9yX3RocmVzaDsgICAgICAgICAgLyohPCBXaGVuIGV4cGFuZGluZyB0aGUgSVMgcmVnaW9uIHRvIG1vcmUgU0ZCcyBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbW9yZSB0aGFuICd0b3RhbF9lcnJvcl90aHJlc2gnIG92ZXJhbGwuICovCisKKyAgRklYUF9EQkwgbG9jYWxfZXJyb3JfdGhyZXNoOyAgICAgICAgICAvKiE8IFdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzIG9ubHkgYWNjZXB0IGFuIGVycm9yIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtb3JlIHRoYW4gJ2xvY2FsX2Vycm9yX3RocmVzaCcgZm9yIHRoZSBjdXJyZW50IFNGQi4gKi8KKworICBGSVhQX0RCTCBkaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaDsgIC8qITwgVGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAqLworCisgIEZJWFBfREJMIGlzX3JlZ2lvbl9taW5fbG91ZG5lc3M7ICAgICAgLyohPCBJUyByZWdpb25zIG5lZWQgdG8gaGF2ZSBhIG1pbmltYWwgcGVyY2VudGFnZSBvZiB0aGUgb3ZlcmFsbCBsb3VkbmVzcywgZS5nLiAwLjA2ID09IDYlICovCisKKyAgSU5UICAgICAgbWluX2lzX3NmYnM7ICAgICAgICAgICAgICAgICAvKiE8IE9ubHkgcGVyZm9ybSBJUyBpZiAnbWluX2lzX3NmYnMnIG5laWdoYm9yaW5nIFNGQnMgY2FuIGJlIHByb2Nlc3NlZCAqLworCisgIEZJWFBfREJMIGxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkOyAgLyohPCBObyBJUyBpZiB0aGUgcGFubmluZyBhbmdsZSBpcyBub3QgZmFyIGZyb20gdGhlIG1pZGRsZSwgTVMgd2lsbCBkbyAqLworCit9IElOVEVOU0lUWV9QQVJBTUVURVJTOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBjYWxjU2ZiTWF4U2NhbGUKKworICAgIGRlc2NyaXB0aW9uOiAgQ2FsYyBtYXggdmFsdWUgaW4gc2NhbGVmYWN0b3IgYmFuZAorCisgICAgaW5wdXQ6ICAgICAgICAqbWRjdFNwZWN0cnVtCisgICAgICAgICAgICAgICAgICAgbDEKKyAgICAgICAgICAgICAgICAgICBsMgorCisgICAgb3V0cHV0OiAgICAgICBub25lCisKKyAgICByZXR1cm5zOiAgICAgIHNjYWxlZmFjdG9yCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVAorY2FsY1NmYk1heFNjYWxlKGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIGwxLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBsMikKK3sKKyAgSU5UIGk7CisgIElOVCBzZmJNYXhTY2FsZTsKKyAgRklYUF9EQkwgbWF4U3BjOworCisgIG1heFNwYyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgIGZvciAoaT1sMTsgaTxsMjsgaSsrKSB7CisgICAgRklYUF9EQkwgdG1wID0gZml4cF9hYnMoKEZJWFBfREJMKW1kY3RTcGVjdHJ1bVtpXSk7CisgICAgbWF4U3BjID0gZml4TWF4KG1heFNwYywgdG1wKTsKKyAgfQorICBzZmJNYXhTY2FsZSA9IChtYXhTcGM9PUZMMkZYQ09OU1RfREJMKDAuMCkpID8gKERGUkFDVF9CSVRTLTIpIDogQ250TGVhZGluZ1plcm9zKG1heFNwYyktMTsKKworICByZXR1cm4gc2ZiTWF4U2NhbGU7CisgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfaW5pdElzUGFyYW1zCisKKyAgICBkZXNjcmlwdGlvbjogIEluaXRpYWxpemF0aW9uIG9mIGludGVuc2l0eSBwYXJhbWV0ZXJzCisKKyAgICBpbnB1dDogICAgICAgIGlzUGFyYW1zCisKKyAgICBvdXRwdXQ6ICAgICAgIGlzUGFyYW1zCisKKyAgICByZXR1cm5zOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorRkRLYWFjRW5jX2luaXRJc1BhcmFtcyhJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMpCit7CisgIGlzUGFyYW1zLT5jb3JyX3RocmVzaCAgICAgICAgICAgICAgICA9IElTX0NPUlJfVEhSRVNIOworICBpc1BhcmFtcy0+dG90YWxfZXJyb3JfdGhyZXNoICAgICAgICAgPSBJU19UT1RBTF9FUlJPUl9USFJFU0g7CisgIGlzUGFyYW1zLT5sb2NhbF9lcnJvcl90aHJlc2ggICAgICAgICA9IElTX0xPQ0FMX0VSUk9SX1RIUkVTSDsKKyAgaXNQYXJhbXMtPmRpcmVjdGlvbl9kZXZpYXRpb25fdGhyZXNoID0gSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0g7CisgIGlzUGFyYW1zLT5pc19yZWdpb25fbWluX2xvdWRuZXNzICAgICA9IElTX1JFR0lPTl9NSU5fTE9VRE5FU1M7CisgIGlzUGFyYW1zLT5taW5faXNfc2ZicyAgICAgICAgICAgICAgICA9IElTX01JTl9TRkJTOworICBpc1BhcmFtcy0+bGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQgPSBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbgorCisgICAgZGVzY3JpcHRpb246ICBQcmVwYXJlcyBpbnRlbnNpdHkgZGVjaXNpb24KKworICAgIGlucHV0OiAgICAgICAgc2ZiRW5lcmd5TGVmdAorICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHQKKyAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YUxlZnQKKyAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0CisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0CisgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodAorICAgICAgICAgICAgICAgICAgaXNQYXJhbXMKKworICAgIG91dHB1dDogICAgICAgaHJyRXJyICAgICAgICAgICAgc2NhbGU6IG5vbmUKKyAgICAgICAgICAgICAgICAgIGlzTWFzayAgICAgICAgICAgIHNjYWxlOiBub25lCisgICAgICAgICAgICAgICAgICByZWFsU2NhbGUgICAgICAgICBzY2FsZTogTERfREFUQV9TSElGVCArIFJFQUxfU0NBTEVfU0YKKyAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzcyAgIHNjYWxlOiBub25lCisKKyAgICByZXR1cm5zOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbihjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpocnJFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICppc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpyZWFsU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpub3JtU2ZiTG91ZG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0KQoreworICBJTlQgaixzZmIsc2Zib2ZmczsKKyAgSU5UIGdycENvdW50ZXI7CisKKyAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBjb21wdXRlIGxvdWRuZXNzICovCisgIEZJWFBfREJMIG92ZXJhbGxMb3VkbmVzc1tNQVhfTk9fT0ZfR1JPVVBTXTsKKworICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGNvbXB1dGUgY29ycmVsYXRpb24gKi8KKyAgRklYUF9EQkwgY2hhbm5lbENvcnJbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgbWwsIG1yOworICBGSVhQX0RCTCBwcm9kX2xyOworICBGSVhQX0RCTCBzcXVhcmVfbCwgc3F1YXJlX3I7CisgIEZJWFBfREJMIHRtcF9sLCB0bXBfcjsKKyAgRklYUF9EQkwgaW52X247CisKKyAgRkRLbWVtY2xlYXIoY2hhbm5lbENvcnIsICAgICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKG5vcm1TZmJMb3VkbmVzcywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihvdmVyYWxsTG91ZG5lc3MsIE1BWF9OT19PRl9HUk9VUFMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHJlYWxTY2FsZSwgICAgICAgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOworCisgIGZvciAoZ3JwQ291bnRlciA9IDAsIHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OyBzZmJvZmZzICs9IHNmYlBlckdyb3VwLCBncnBDb3VudGVyKyspIHsKKyAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgSU5UIHNMLHNSLHM7CisgICAgICBGSVhQX0RCTCBpc1ZhbHVlID0gc2ZiRW5lcmd5TGREYXRhTGVmdFtzZmIrc2Zib2Zmc10tc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiK3NmYm9mZnNdOworCisgICAgICAvKiBkZWxpbWl0YXRlIGludGVuc2l0eSBzY2FsZSB2YWx1ZSB0byByZXByZXNlbnRhYmxlIHJhbmdlICovCisgICAgICByZWFsU2NhbGVbc2ZiICsgc2Zib2Zmc10gPSBmaXhNaW4oRkwyRlhDT05TVF9EQkwoNjAuZi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCkpKSwgZml4TWF4KEZMMkZYQ09OU1RfREJMKC02MC5mLygxPDwoUkVBTF9TQ0FMRV9TRitMRF9EQVRBX1NISUZUKSkpLCBpc1ZhbHVlKSk7CisKKyAgICAgIHNMID0gZml4TWF4KDAsKENudExlYWRpbmdaZXJvcyhzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKS0xKSk7CisgICAgICBzUiA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pLTEpKTsKKyAgICAgIHMgID0gKGZpeE1pbihzTCxzUik+PjIpPDwyOworICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID0gc3FydEZpeHAoc3FydEZpeHAoKChzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdPDxzKSA+PiAxKSArICgoc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc108PHMpID4+IDEpKSkgPj4gKHM+PjIpOworCisgICAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gKz0gbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID4+IE9WRVJBTExfTE9VRE5FU1NfU0Y7CisgICAgICAvKiBkb24ndCBkbyBpbnRlbnNpdHkgaWYKKyAgICAgICAqIC0gcGFubmluZyBhbmdsZSBpcyB0b28gY2xvc2UgdG8gdGhlIG1pZGRsZSBvcgorICAgICAgICogLSBvbmUgY2hhbm5lbCBpcyBub24tZXhpc3RlbnQgb3IKKyAgICAgICAqIC0gaWYgaXQgaXMgZHVhbCBtb25vICovCisgICAgICBpZiggICAoc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA+PSBmTXVsdChpc1BhcmFtcy0+bGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQsc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pKQorICAgICAgICAgJiYgKGZNdWx0KGlzUGFyYW1zLT5sZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZCxzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKSA8PSBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkgKSB7CisKKyAgICAgICAgLyogdGhpcyB3aWxsIHByZXZlbnQgcG9zdCBwcm9jZXNzaW5nIGZyb20gY29uc2lkZXJpbmcgdGhpcyBTRkIgZm9yIG1lcmdpbmcgKi8KKyAgICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChncnBDb3VudGVyID0gMCwgc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBzZmJDbnQ7IHNmYm9mZnMgKz0gc2ZiUGVyR3JvdXAsIGdycENvdW50ZXIrKykgeworICAgIElOVCBpbnZPdmVyYWxsTG91ZG5lc3NTRjsKKyAgICBGSVhQX0RCTCBpbnZPdmVyYWxsTG91ZG5lc3M7CisKKyAgICBpZiAob3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKKyAgICAgIGludk92ZXJhbGxMb3VkbmVzcyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgICAgICBpbnZPdmVyYWxsTG91ZG5lc3NTRiA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW52T3ZlcmFsbExvdWRuZXNzID0gZkRpdk5vcm0oKEZJWFBfREJMKU1BWFZBTF9EQkwsIG92ZXJhbGxMb3VkbmVzc1tncnBDb3VudGVyXSwmaW52T3ZlcmFsbExvdWRuZXNzU0YpOworICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSBpbnZPdmVyYWxsTG91ZG5lc3NTRiAtIE9WRVJBTExfTE9VRE5FU1NfU0YgKyAxOyAvKiArMTogY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AgKi8KKyAgICB9CisgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSBmaXhNaW4oZml4TWF4KGludk92ZXJhbGxMb3VkbmVzc1NGLC0oREZSQUNUX0JJVFMtMSkpLERGUkFDVF9CSVRTLTEpOworCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcDsKKworICAgICAgdG1wID0gZk11bHREaXYyKChub3JtU2ZiTG91ZG5lc3Nbc2ZiICsgc2Zib2Zmc10+Pk9WRVJBTExfTE9VRE5FU1NfU0YpPDxPVkVSQUxMX0xPVURORVNTX1NGLGludk92ZXJhbGxMb3VkbmVzcyk7CisKKyAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA9IHNjYWxlVmFsdWUodG1wLCBpbnZPdmVyYWxsTG91ZG5lc3NTRik7CisKKyAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgIEZES19BU1NFUlQoNTAgPj0gNDkpOworICAgICAgLyogbWF4IHdpZHRoIG9mIHNjYWxlZmFjdG9yYmFuZCBpcyA5Njsgd2lkdGgncyBhcmUgYWx3YXlzIGV2ZW4gKi8KKyAgICAgIC8qIGludl9uIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAyIHRvIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wcyAqLworICAgICAgaW52X24gPSBHZXRJbnZJbnQoKHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0gLSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10pPj4xKTsKKworICAgICAgaWYgKGludl9uID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgSU5UIHMsc0wsc1I7CisKKyAgICAgICAgLyogY29ycmVsYXRpb24gOj0gUGVhcnNvbidzIHByb2R1Y3QtbW9tZW50IGNvZWZmaWNpZW50ICovCisgICAgICAgIC8qIGNvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiBjaGFubmVscyBhbmQgY2hlY2sgaWYgaXQgaXMgb3ZlciB0aHJlc2hvbGQgKi8KKyAgICAgICAgbWwgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgbXIgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgcHJvZF9sciAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgc3F1YXJlX2wgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgc3F1YXJlX3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICBzTCA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1MZWZ0LHNmYk9mZnNldFtzZmIrc2Zib2Zmc10sc2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdKTsKKyAgICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOworICAgICAgICBzID0gZml4TWluKHNMLHNSKTsKKworICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOyBqKyspIHsKKyAgICAgICAgICBtbCArPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bUxlZnRbal0gIDw8IHMpLGludl9uKTsgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgICAgbXIgKz0gZk11bHREaXYyKChtZGN0U3BlY3RydW1SaWdodFtqXSA8PCBzKSxpbnZfbik7ICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorICAgICAgICB9CisgICAgICAgIG1sID0gZk11bHREaXYyKG1sLGludl9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorICAgICAgICBtciA9IGZNdWx0RGl2MihtcixpbnZfbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKworICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOyBqKyspIHsKKyAgICAgICAgICB0bXBfbCA9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtTGVmdFtqXSAgPDwgcyksaW52X24pIC0gbWw7ICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgICAgdG1wX3IgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMpLGludl9uKSAtIG1yOyAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorCisgICAgICAgICAgcHJvZF9sciAgKz0gZk11bHREaXYyKHRtcF9sLHRtcF9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCisgICAgICAgICAgc3F1YXJlX2wgKz0gZlBvdzJEaXYyKHRtcF9sKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCisgICAgICAgICAgc3F1YXJlX3IgKz0gZlBvdzJEaXYyKHRtcF9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCisgICAgICAgIH0KKyAgICAgICAgcHJvZF9sciAgPSBwcm9kX2xyICA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQorICAgICAgICBzcXVhcmVfbCA9IHNxdWFyZV9sIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCisgICAgICAgIHNxdWFyZV9yID0gc3F1YXJlX3IgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKKworICAgICAgICBpZiAoc3F1YXJlX2wgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBzcXVhcmVfciA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgSU5UIGNoYW5uZWxDb3JyU0YgPSAwOworCisgICAgICAgICAgLyogbG9jYWwgc2NhbGluZyBvZiBzcXVhcmVfbCBhbmQgc3F1YXJlX3IgaXMgY29tcGVuc2F0ZWQgYWZ0ZXIgc3FydCBjYWxjdWxhdGlvbiAqLworICAgICAgICAgIHNMICA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc3F1YXJlX2wpLTEpKTsKKyAgICAgICAgICBzUiAgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9yKS0xKSk7CisgICAgICAgICAgcyAgID0gKChzTCArIHNSKT4+MSk8PDE7CisgICAgICAgICAgc0wgID0gZml4TWluKHNMLHMpOworICAgICAgICAgIHNSICA9IHMtc0w7CisgICAgICAgICAgdG1wID0gZk11bHQoc3F1YXJlX2w8PHNMLHNxdWFyZV9yPDxzUik7CisgICAgICAgICAgdG1wID0gc3FydEZpeHAodG1wKTsKKworICAgICAgICAgIEZES19BU1NFUlQodG1wID4gRkwyRlhDT05TVF9EQkwoMC4wZikpOworCisgICAgICAgICAgLyogbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBoYXZlIHRoZSBzYW1lIHNjYWxpbmcgKi8KKyAgICAgICAgICBpZiAocHJvZF9sciA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeworICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAtKGZEaXZOb3JtKC1wcm9kX2xyLHRtcCwmY2hhbm5lbENvcnJTRikpOworCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAgKGZEaXZOb3JtKCBwcm9kX2xyLHRtcCwmY2hhbm5lbENvcnJTRikpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaGFubmVsQ29yclNGID0gZml4TWluKGZpeE1heCgoIGNoYW5uZWxDb3JyU0YgKyAoKHNMK3NSKT4+MSkpLC0oREZSQUNUX0JJVFMtMSkpLERGUkFDVF9CSVRTLTEpOworCisgICAgICAgICAgaWYgKGNoYW5uZWxDb3JyU0YgPCAwKSB7CisgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID4+ICgtY2hhbm5lbENvcnJTRik7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYXZvaWQgb3ZlcmZsb3dzIGR1ZSB0byBsaW1pdGVkIGNvbXB1dGF0aW9uYWwgYWNjdXJhY3kgKi8KKyAgICAgICAgICAgIGlmICggZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPiAoKChGSVhQX0RCTClNQVhWQUxfREJMKT4+Y2hhbm5lbENvcnJTRikgKSB7CisgICAgICAgICAgICAgIGlmIChjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gLShGSVhQX0RCTCkgTUFYVkFMX0RCTDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gIChGSVhQX0RCTCkgTUFYVkFMX0RCTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdIDw8IGNoYW5uZWxDb3JyU0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIGZvciBwb3N0IHByb2Nlc3Npbmc6IGhyckVyciBpcyB0aGUgZXJyb3IgaW4gdGVybXMgb2YgKHRvbyBsaXR0bGUpIGNvcnJlbGF0aW9uCisgICAgICAgKiB3ZWlnaHRlZCB3aXRoIHRoZSBsb3VkbmVzcyBvZiB0aGUgU0ZCOyBTRkJzIHdpdGggc21hbGwgaHJyRXJyIGNhbiBiZSBtZXJnZWQgKi8KKyAgICAgIGlmIChocnJFcnJbc2ZiICsgc2Zib2Zmc10gPT0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGhyckVycltzZmIgKyBzZmJvZmZzXSA9IGZNdWx0RGl2MigoRkwyRlhDT05TVF9EQkwoMC4yNWYpLShjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXT4+MikpLG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSk7CisKKyAgICAgIC8qIHNldCBJUyBtYXNrL3ZlY3RvciB0byAxLCBpZiBjb3JyZWxhdGlvbiBpcyBoaWdoIGVub3VnaCAqLworICAgICAgaWYgKGZBYnMoY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10pID49IGlzUGFyYW1zLT5jb3JyX3RocmVzaCkgeworICAgICAgICBpc01hc2tbc2ZiICsgc2Zib2Zmc10gPSAxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZmluYWxpemVJbnRlbnNpdHlEZWNpc2lvbgorCisgICAgZGVzY3JpcHRpb246ICBGaW5hbGl6ZXMgaW50ZW5zaXR5IGRlY2lzaW9uCisKKyAgICBpbnB1dDogICAgICAgIGlzUGFyYW1zICAgICAgICAgIHNjYWxlOiBub25lCisgICAgICAgICAgICAgICAgICBocnJFcnIgICAgICAgICAgICBzY2FsZTogbm9uZQorICAgICAgICAgICAgICAgICAgcmVhbElzU2NhbGUgICAgICAgc2NhbGU6IExEX0RBVEFfU0hJRlQgKyBSRUFMX1NDQUxFX1NGCisgICAgICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3MgICBzY2FsZTogbm9uZQorCisgICAgb3V0cHV0OiAgICAgICBpc01hc2sgICAgICAgICAgICBzY2FsZTogbm9uZQorCisgICAgcmV0dXJuczogICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK0ZES2FhY0VuY19maW5hbGl6ZUludGVuc2l0eURlY2lzaW9uKGNvbnN0IEZJWFBfREJMICpocnJFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqaXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlYWxJc1NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKm5vcm1TZmJMb3VkbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbWF4U2ZiUGVyR3JvdXApCit7CisgIElOVCBzZmIsc2Zib2ZmcywgajsKKyAgRklYUF9EQkwgaXNTY2FsZUxhc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgSU5UIGlzU3RhcnRWYWx1ZUZvdW5kID0gMDsKKworICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OyBzZmJvZmZzICs9IHNmYlBlckdyb3VwKSB7CisgICAgSU5UIHN0YXJ0SXNTZmIgPSAwOworICAgIElOVCBpbklzQmxvY2sgPSAwOworICAgIElOVCBjdXJyZW50SXNTZmJDb3VudCA9IDA7CisgICAgRklYUF9EQkwgb3ZlcmFsbEhyckVycm9yID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgRklYUF9EQkwgaXNSZWdpb25Mb3VkbmVzcyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIGlmIChpc01hc2tbc2Zib2ZmcyArIHNmYl0gPT0gMSkgeworICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPT0gMCkgeworICAgICAgICAgIHN0YXJ0SXNTZmIgPSBzZmJvZmZzICsgc2ZiOworICAgICAgICB9CisgICAgICAgIGlmIChpc1N0YXJ0VmFsdWVGb3VuZD09MCkgeworICAgICAgICAgIGlzU2NhbGVMYXN0ID0gcmVhbElzU2NhbGVbc2Zib2ZmcyArIHNmYl07CisgICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAxOworICAgICAgICB9CisgICAgICAgIGluSXNCbG9jayA9IDE7CisgICAgICAgIGN1cnJlbnRJc1NmYkNvdW50Kys7CisgICAgICAgIG92ZXJhbGxIcnJFcnJvciAgKz0gaHJyRXJyW3NmYm9mZnMgKyBzZmJdID4+IChNQVhfU0ZCX1BFUl9HUk9VUF9TRi0zKTsKKyAgICAgICAgaXNSZWdpb25Mb3VkbmVzcyArPSBub3JtU2ZiTG91ZG5lc3Nbc2Zib2ZmcyArIHNmYl0gPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0Y7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogYmFzZWQgb24gY29ycmVsYXRpb24sIElTIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgKiAtPiB1c2UgaXQgYW55d2F5LCBpZiBvdmVyYWxsIGVycm9yIGlzIGJlbG93IHRocmVzaG9sZAorICAgICAgICAgKiAgICBhbmQgaWYgbG9jYWwgZXJyb3IgZG9lcyBub3QgZXhjZWVkIHRocmVzaG9sZAorICAgICAgICAgKiBvdGhlcndpc2U6IGNoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggSVMgU0ZCcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluSXNCbG9jaykgeworICAgICAgICAgIG92ZXJhbGxIcnJFcnJvciAgKz0gaHJyRXJyW3NmYm9mZnMgKyBzZmJdID4+IChNQVhfU0ZCX1BFUl9HUk9VUF9TRi0zKTsKKyAgICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzICs9IG5vcm1TZmJMb3VkbmVzc1tzZmJvZmZzICsgc2ZiXSA+PiBNQVhfU0ZCX1BFUl9HUk9VUF9TRjsKKworICAgICAgICAgIGlmICggKGhyckVycltzZmJvZmZzICsgc2ZiXSA8IChpc1BhcmFtcy0+bG9jYWxfZXJyb3JfdGhyZXNoPj4zKSkgJiYgKG92ZXJhbGxIcnJFcnJvciA8IChpc1BhcmFtcy0+dG90YWxfZXJyb3JfdGhyZXNoPj5NQVhfU0ZCX1BFUl9HUk9VUF9TRikpICkgeworICAgICAgICAgICAgY3VycmVudElzU2ZiQ291bnQrKzsKKyAgICAgICAgICAgIC8qIG92ZXJ3cml0ZSBjb3JyZWxhdGlvbiBiYXNlZCBkZWNpc2lvbiAqLworICAgICAgICAgICAgaXNNYXNrW3NmYm9mZnMgKyBzZmJdID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5Jc0Jsb2NrID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGNoZWNrIGZvciBsYXJnZSBkaXJlY3Rpb24gZGV2aWF0aW9uICovCisgICAgICBpZiAoaW5Jc0Jsb2NrKSB7CisgICAgICAgIGlmKCBmQWJzKGlzU2NhbGVMYXN0LXJlYWxJc1NjYWxlW3NmYm9mZnMgKyBzZmJdKSA8IChpc1BhcmFtcy0+ZGlyZWN0aW9uX2RldmlhdGlvbl90aHJlc2g+PihSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQtSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKSApIHsKKyAgICAgICAgICBpc1NjYWxlTGFzdCA9IHJlYWxJc1NjYWxlW3NmYm9mZnMgKyBzZmJdOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgaXNNYXNrW3NmYm9mZnMgKyBzZmJdID0gMDsKKyAgICAgICAgICBpbklzQmxvY2sgPSAwOworICAgICAgICAgIGN1cnJlbnRJc1NmYkNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGN1cnJlbnRJc1NmYkNvdW50ID4gMCAmJiAoIWluSXNCbG9jayB8fCBzZmIgPT0gbWF4U2ZiUGVyR3JvdXAgLSAxKSkgeworICAgICAgICAvKiBub3QgZW5vdWdoIFNGQnMgLT4gZG8gbm90IHVzZSBJUyAqLworICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPCBpc1BhcmFtcy0+bWluX2lzX3NmYnMgfHwgKGlzUmVnaW9uTG91ZG5lc3MgPCBpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcz4+TUFYX1NGQl9QRVJfR1JPVVBfU0YpKSB7CisgICAgICAgICAgZm9yKGogPSBzdGFydElzU2ZiOyBqIDw9IHNmYm9mZnMgKyBzZmI7IGorKykgeworICAgICAgICAgICAgaXNNYXNrW2pdID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaXNTY2FsZUxhc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICBpc1N0YXJ0VmFsdWVGb3VuZCA9IDA7CisgICAgICAgICAgZm9yIChqPTA7IGogPCBzdGFydElzU2ZiOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChpc01hc2tbal0hPTApIHsKKyAgICAgICAgICAgICAgaXNTY2FsZUxhc3QgPSByZWFsSXNTY2FsZVtqXTsKKyAgICAgICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdXJyZW50SXNTZmJDb3VudCA9IDA7CisgICAgICAgIG92ZXJhbGxIcnJFcnJvciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nCisKKyAgICBkZXNjcmlwdGlvbjogIEludGVuc2l0eSBzdGVyZW8gcHJvY2Vzc2luZyB0b29sCisKKyAgICBpbnB1dDogICAgICAgIHNmYkVuZXJneUxlZnQKKyAgICAgICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0CisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0CisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodAorICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdAorICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHQKKyAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuTGVmdAorICAgICAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5SaWdodAorICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhTGVmdAorICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHQKKworICAgIG91dHB1dDogICAgICAgaXNCb29rCisgICAgICAgICAgICAgICAgICBpc1NjYWxlCisgICAgICAgICAgICAgICAgICBwbnNEYXRhLT5wbnNGbGFnCisgICAgICAgICAgICAgICAgICBtc0RpZ2VzdCAgICAgICAgICAgICAgICAgemVyb2VkIGZyb20gc3RhcnQgdG8gc2ZiQ250CisgICAgICAgICAgICAgICAgICBtc01hc2sgICAgICAgICAgICAgICAgICAgemVyb2VkIGZyb20gc3RhcnQgdG8gc2ZiQ250CisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodCAgICAgICAgemVyb2VkIHdoZXJlIGlzQm9vayE9MAorICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHQgICAgICAgICAgIHplcm9lZCB3aGVyZSBpc0Jvb2shPTAKKyAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHQgICAgICAgemVyb2VkIHdoZXJlIGlzQm9vayE9MAorICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHQgICAgICAgIHplcm9lZCB3aGVyZSBpc0Jvb2shPTAKKyAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0ICAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSB3aGVyZSBpc0Jvb2shPTAKKyAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZExkRGF0YVJpZ2h0ICBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSB3aGVyZSBpc0Jvb2shPTAKKworICAgIHJldHVybnM6ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxlZnQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneVJpZ2h0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExkRGF0YVJpZ2h0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJTcHJlYWRFbkxlZnQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YUxlZnQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc0RpZ2VzdCwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqbXNNYXNrLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzZmJDbnQsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBhbGxvd0lTLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc0Jvb2ssCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKmlzU2NhbGUsCisgICAgICAgIFBOU19EQVRBICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbMl0KKyAgICAgICAgKQoreworICBJTlQgc2ZiLHNmYm9mZnMsIGo7CisgIEZJWFBfREJMIHNjYWxlOworICBGSVhQX0RCTCBscjsKKyAgRklYUF9EQkwgaHJyRXJyW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIG5vcm1TZmJMb3VkbmVzc1tNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCByZWFsSXNTY2FsZVtNQVhfR1JPVVBFRF9TRkJdOworICBJTlRFTlNJVFlfUEFSQU1FVEVSUyBpc1BhcmFtczsKKyAgSU5UIGlzTWFza1tNQVhfR1JPVVBFRF9TRkJdOworCisgIEZES21lbWNsZWFyKCh2b2lkKilpc0Jvb2ssc2ZiQ250KnNpemVvZihJTlQpKTsKKyAgRkRLbWVtY2xlYXIoKHZvaWQqKWlzTWFzayxzZmJDbnQqc2l6ZW9mKElOVCkpOworICBGREttZW1jbGVhcigodm9pZCopcmVhbElzU2NhbGUsc2ZiQ250KnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcigodm9pZCopaXNTY2FsZSxzZmJDbnQqc2l6ZW9mKElOVCkpOworICBGREttZW1jbGVhcigodm9pZCopaHJyRXJyLHNmYkNudCpzaXplb2YoRklYUF9EQkwpKTsKKworICBpZiAoIWFsbG93SVMpCisgICAgcmV0dXJuOworCisgIEZES2FhY0VuY19pbml0SXNQYXJhbXMoJmlzUGFyYW1zKTsKKworICAvKiBjb21wdXRlIC8gc2V0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIHBlciBTRkI6CisgICAqIC0gbGVmdC9yaWdodCByYXRpbyBiZXR3ZWVuIGNoYW5uZWxzCisgICAqIC0gbm9ybWFsaXplZCBsb3VkbmVzcworICAgKiAgICsgbG91ZG5lc3MgPT0gYXZlcmFnZSBvZiBlbmVyZ3kgaW4gY2hhbm5lbHMgdG8gMC4yNQorICAgKiAgICsgbm9ybWFsaXphdGlvbjogZGl2aXNpb24gYnkgc3VtIG9mIGFsbCBTRkIgbG91ZG5lc3NlcworICAgKiAtIGlzTWFzayAoaXMgc2V0IHRvIDAgaWYgY2hhbm5lbHMgYXJlIHRoZSBzYW1lIG9yIG9uZSBpcyAwKQorICAgKi8KKyAgIEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oc2ZiRW5lcmd5TGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocnJFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbElzU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCk7CisKKyAgRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24oaHJyRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxJc1NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXApOworCisgIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYis9c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYm9mZnM9MDsgc2Zib2ZmczxtYXhTZmJQZXJHcm91cDsgc2Zib2ZmcysrKSB7CisgICAgICBJTlQgc0wsIHNSOworICAgICAgRklYUF9EQkwgaW52X247CisKKyAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAwOworICAgICAgaWYgKGlzTWFza1tzZmIrc2Zib2Zmc10gPT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCAgIChzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSA8IHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdKQorICAgICAgICAgICYmKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMS41Ziksc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdKSA+IHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSkgKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogTkVXOiBpZiB0aGVyZSBpcyBhIGJpZy1lbm91Z2ggSVMgcmVnaW9uLCBzd2l0Y2ggb2ZmIFBOUyAqLworICAgICAgaWYgKHBuc0RhdGFbMF0pIHsKKyAgICAgICAgaWYocG5zRGF0YVswXS0+cG5zRmxhZ1tzZmIrc2Zib2Zmc10pIHsKKyAgICAgICAgICBwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYocG5zRGF0YVsxXS0+cG5zRmxhZ1tzZmIrc2Zib2Zmc10pIHsKKyAgICAgICAgICBwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW52X24gPSBHZXRJbnZJbnQoKHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0gLSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10pPj4xKTsgIC8vIHNjYWxlZCB3aXRoIDIgdG8gY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKKyAgICAgIHNMID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bUxlZnQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOworICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOworCisgICAgICBsciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspCisgICAgICAgIGxyICs9IGZNdWx0RGl2MihmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXTw8c0wsbWRjdFNwZWN0cnVtUmlnaHRbal08PHNSKSxpbnZfbik7CisgICAgICBsciA9IGxyPDwxOworCisgICAgICBpZiAobHIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAvKiBUaGlzIG1lYW5zIE9VVCBPRiBwaGFzZSBpbnRlbnNpdHkgc3RlcmVvLCBjZi4gc3RhbmRhcmQgKi8KKyAgICAgICAgSU5UIHMwLCBzMSwgczI7CisgICAgICAgIEZJWFBfREJMIHRtcCwgZCwgZWQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICBzMCA9IGZpeE1pbihzTCxzUik7CisgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CisgICAgICAgICAgZCA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXTw8czApPj4xKSAtICgobWRjdFNwZWN0cnVtUmlnaHRbal08PHMwKT4+MSk7CisgICAgICAgICAgZWQgKz0gZk11bHREaXYyKGQsZCk+PihNRENUX1NQRUNfU0YtMSk7CisgICAgICAgIH0KKyAgICAgICAgbXNNYXNrW3NmYitzZmJvZmZzXSA9IDE7CisgICAgICAgIHRtcCA9IGZEaXZOb3JtKHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLGVkLCZzMSk7CisgICAgICAgIHMyID0gKHMxKSArICgyKnMwKSAtIDIgLSBNRENUX1NQRUNfU0Y7CisgICAgICAgIGlmIChzMiAmIDEpIHsKKyAgICAgICAgICB0bXAgPSB0bXA+PjE7CisgICAgICAgICAgczIgPSBzMisxOworICAgICAgICB9CisgICAgICAgIHMyID0gKHMyPj4xKSArIDE7ICAvLyArMSBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAorICAgICAgICBzMiA9IGZpeE1pbihmaXhNYXgoczIsLShERlJBQ1RfQklUUy0xKSksKERGUkFDVF9CSVRTLTEpKTsKKyAgICAgICAgc2NhbGUgPSBzcXJ0Rml4cCh0bXApOworICAgICAgICBpZiAoczIgPCAwKSB7CisgICAgICAgICAgczIgPSAtczI7CisgICAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sc2NhbGUpIC0gZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLHNjYWxlKSkgPj4gczI7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgeworICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgLSBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA8PCBzMjsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogVGhpcyBtZWFucyBJTiBwaGFzZSBpbnRlbnNpdHkgc3RlcmVvLCBjZi4gc3RhbmRhcmQgKi8KKyAgICAgICAgSU5UIHMwLHMxLHMyOworICAgICAgICBGSVhQX0RCTCB0bXAsIHMsIGVzID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgczAgPSBmaXhNaW4oc0wsc1IpOworICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgeworICAgICAgICAgIHMgICA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXTw8czApPj4xKSArICgobWRjdFNwZWN0cnVtUmlnaHRbal08PHMwKT4+MSk7CisgICAgICAgICAgZXMgKz0gZk11bHREaXYyKHMscyk+PihNRENUX1NQRUNfU0YtMSk7ICAgICAvLyBzY2FsZWQgMioobWRjdFNjYWxlIC0gczAgKyAxKSArIE1EQ1RfU1BFQ19TRgorICAgICAgICB9CisgICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAwOworICAgICAgICB0bXAgPSBmRGl2Tm9ybShzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSxlcywmczEpOworICAgICAgICBzMiA9IChzMSkgKyAoMipzMCkgLSAyIC0gTURDVF9TUEVDX1NGOworICAgICAgICBpZiAoczIgJiAxKSB7CisgICAgICAgICAgdG1wID0gdG1wPj4xOworICAgICAgICAgIHMyID0gczIgKyAxOworICAgICAgICB9CisgICAgICAgIHMyID0gKHMyPj4xKSArIDE7IC8vICsxIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wCisgICAgICAgIHMyID0gZml4TWluKGZpeE1heChzMiwtKERGUkFDVF9CSVRTLTEpKSwoREZSQUNUX0JJVFMtMSkpOworICAgICAgICBzY2FsZSA9IHNxcnRGaXhwKHRtcCk7CisgICAgICAgIGlmIChzMiA8IDApIHsKKyAgICAgICAgICBzMiA9IC1zMjsKKyAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgeworICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgKyBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA+PiBzMjsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLHNjYWxlKSArIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSxzY2FsZSkpIDw8IHMyOworICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaXNCb29rW3NmYitzZmJvZmZzXSA9IENPREVfQk9PS19JU19JTl9QSEFTRV9OTzsKKworICAgICAgaWYgKCByZWFsSXNTY2FsZVtzZmIrc2Zib2Zmc10gPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKKyAgICAgICAgaXNTY2FsZVtzZmIrc2Zib2Zmc10gPSAoSU5UKSgoKHJlYWxJc1NjYWxlW3NmYitzZmJvZmZzXT4+MSktRkwyRlhDT05TVF9EQkwoMC41Zi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCsxKSkpKT4+KERGUkFDVF9CSVRTLTEtUkVBTF9TQ0FMRV9TRi1MRF9EQVRBX1NISUZULTEpKSArIDE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaXNTY2FsZVtzZmIrc2Zib2Zmc10gPSAoSU5UKSgoKHJlYWxJc1NjYWxlW3NmYitzZmJvZmZzXT4+MSkrRkwyRlhDT05TVF9EQkwoMC41Zi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCsxKSkpKT4+KERGUkFDVF9CSVRTLTEtUkVBTF9TQ0FMRV9TRi1MRF9EQVRBX1NISUZULTEpKTsKKyAgICAgIH0KKworICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIHNmYlRocmVzaG9sZExkRGF0YVJpZ2h0W3NmYitzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpOworICAgICAgc2ZiU3ByZWFkRW5SaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgKm1zRGlnZXN0ID0gTVNfU09NRTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmggYi9hYWMvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNjMjkyCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmgKQEAgLTAsMCArMSwxMjIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3ciBhbmQgcnRiKSAvIEpvc2VmIEj2cGZsIChGREspCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogaW50ZW5zaXR5IHN0ZXJlbyBwcm90b3R5cGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JTlRFTlNJVFlfSAorI2RlZmluZSBfSU5URU5TSVRZX0gKKworI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKKworCit2b2lkIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZWZ0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lSaWdodCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtTGVmdCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExlZnQsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJUaHJlc2hvbGRMZERhdGFSaWdodCwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiU3ByZWFkRW5MZWZ0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJTcHJlYWRFblJpZ2h0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZERhdGFMZWZ0LAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqbXNEaWdlc3QsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKm1zTWFzaywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgc2ZiQ250LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgYWxsb3dJUywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqaXNCb29rLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc1NjYWxlLAorICAgICAgICBQTlNfREFUQSAgICAgICAgICpSRVNUUklDVCBwbnNEYXRhWzJdCisgICAgICAgICk7CisKKyNlbmRpZiAvKiBfSU5URU5TSVRZX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvaW50ZXJmYWNlLmggYi9hYWMvbGliQUFDZW5jL3NyYy9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZiNzJhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxNjkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IEludGVyZmFjZSBwc3ljaG9hY2NvdXN0aWMvcXVhbnRpemVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSU5URVJGQUNFX0gKKyNkZWZpbmUgX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKyNpbmNsdWRlICJwc3lfZGF0YS5oIgorI2luY2x1ZGUgImFhY2VuY190bnMuaCIKKworZW51bQoreworICBNU19OT05FID0gMCwKKyAgTVNfU09NRSA9IDEsCisgIE1TX0FMTCAgPSAyCit9OworCitlbnVtCit7CisgIE1TX09OID0gMQorfTsKKworc3RydWN0IFRPT0xTSU5GTyB7CisgIElOVCBtc0RpZ2VzdDsgICAgIC8qIDAgPSBubyBNUzsgMSA9IHNvbWUgTVMsIDIgPSBhbGwgTVMgKi8KKyAgSU5UIG1zTWFza1tNQVhfR1JPVVBFRF9TRkJdOworfTsKKworCit0eXBlZGVmIHN0cnVjdCAgeworICBJTlQgICAgICAgc2ZiQ250OworICBJTlQgICAgICAgc2ZiUGVyR3JvdXA7CisgIElOVCAgICAgICBtYXhTZmJQZXJHcm91cDsKKyAgSU5UICAgICAgIGxhc3RXaW5kb3dTZXF1ZW5jZTsKKyAgSU5UICAgICAgIHdpbmRvd1NoYXBlOworICBJTlQgICAgICAgZ3JvdXBpbmdNYXNrOworICBJTlQgICAgICAgc2ZiT2Zmc2V0c1tNQVhfR1JPVVBFRF9TRkIrMV07CisKKyAgSU5UICAgICAgIG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHRyYW5zZm9ybSBzaGlmdHMgKi8KKyAgSU5UICAgICAgIGdyb3VwTGVuW01BWF9OT19PRl9HUk9VUFNdOworCisgIFROU19JTkZPICB0bnNJbmZvOworICBJTlQgICAgICAgbm9pc2VOcmdbTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UICAgICAgIGlzQm9va1tNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgICAgICAgaXNTY2FsZVtNQVhfR1JPVVBFRF9TRkJdOworCisgIC8qIG1lbW9yeSBsb2NhdGVkIGluIFFDX09VVF9DSEFOTkVMICovCisgIEZJWFBfREJMICAqbWRjdFNwZWN0cnVtOworICBGSVhQX0RCTCAgKnNmYkVuZXJneTsKKyAgRklYUF9EQkwgICpzZmJTcHJlYWRFbmVyZ3k7CisgIEZJWFBfREJMICAqc2ZiVGhyZXNob2xkTGREYXRhOworICBGSVhQX0RCTCAgKnNmYk1pblNuckxkRGF0YTsKKyAgRklYUF9EQkwgICpzZmJFbmVyZ3lMZERhdGE7CisKKworIH1QU1lfT1VUX0NIQU5ORUw7CisKK3R5cGVkZWYgc3RydWN0IHsKKworICAvKiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBlYWNoIGNoYW5uZWwgKi8KKyAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV07CisKKyAgLyogaW5mb3JtYXRpb24gc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMgICovCisgIElOVCAgICAgICBjb21tb25XaW5kb3c7CisgIHN0cnVjdCBUT09MU0lORk8gdG9vbHNJbmZvOworCit9IFBTWV9PVVRfRUxFTUVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldOworICBQU1lfT1VUX0NIQU5ORUwqIHBQc3lPdXRDaGFubmVsc1soOCldOworCit9UFNZX09VVDsKKworaW5saW5lIGludCBpc0xvd0RlbGF5KCBBVURJT19PQkpFQ1RfVFlQRSBhb3QgKQoreworICByZXR1cm4gKGFvdD09QU9UX0VSX0FBQ19MRCB8fCBhb3Q9PUFPVF9FUl9BQUNfRUxEKTsKK30KKworI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9saW5lX3BlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MwZGFiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJsaW5lX3BlLmgiCisjaW5jbHVkZSAic2ZfZXN0aW0uaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCitzdGF0aWMgY29uc3QgRklYUF9EQkwgQzFMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgzLjAvTERfREFUQV9TQ0FMSU5HKTsgICAgICAgIC8qIEMxID0gMy4wID0gbG9nKDguMCkvbG9nKDIpICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgQzJMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgxLjMyMTkyODEvTERfREFUQV9TQ0FMSU5HKTsgIC8qIEMyID0gMS4zMjE5MjgxID0gbG9nKDIuNSkvbG9nKDIpICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgQzNMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjU1OTM1NzMpOyAgICAgICAgICAgICAgICAgIC8qIDEtQzIvQzEgKi8KKworCisvKiBjb25zdGFudHMgdGhhdCBkbyBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucyAqLwordm9pZCBGREthYWNFbmNfcHJlcGFyZVNmYlBlKFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICpzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbWF4U2ZiUGVyR3JvdXApCit7CisgICBJTlQgc2ZiR3JwLHNmYjsKKyAgIElOVCBzZmJXaWR0aDsKKyAgIEZJWFBfREJMIGF2Z0Zvcm1GYWN0b3JMZERhdGE7CisgICBjb25zdCBGSVhQX0RCTCBmb3JtRmFjU2NhbGluZyA9IEZMMkZYQ09OU1RfREJMKChmbG9hdClGT1JNX0ZBQ19TSElGVC9MRF9EQVRBX1NDQUxJTkcpOworCisgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgc2ZiQ250O3NmYkdycCs9c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYj0wOyBzZmI8bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBpZiAoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IChGSVhQX0RCTClzZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pIHsKKyAgICAgICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYkdycCtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiR3JwK3NmYl07CisgICAgICAgICAvKiBlc3RpbWF0ZSBudW1iZXIgb2YgYWN0aXZlIGxpbmVzICovCisgICAgICAgICBhdmdGb3JtRmFjdG9yTGREYXRhID0gKCgtc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSArIChDYWxjTGRJbnQoc2ZiV2lkdGgpPj4xKSk+PjE7CisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPQorICAgICAgICAgICAoSU5UKUNhbGNJbnZMZERhdGEoIChzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdICsgZm9ybUZhY1NjYWxpbmcpICsgYXZnRm9ybUZhY3RvckxkRGF0YSk7CisgICAgICAgICAvKiBNYWtlIHN1cmUgc2ZiTkxpbmVzIGlzIG5ldmVyIGdyZWF0ZXIgdGhhbiBzZmJXaWR0aCBkdWUgdG8gdW5hY2N1cmFjaWVzIChlLmcuIHNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA9IDB4ODAwMDAwMDApICovCisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPSBmTWluKHNmYldpZHRoLCBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPSAwOworICAgICAgfQorICAgIH0KKyAgIH0KK30KKworLyoKKyAgIGZvcm11bGEgZm9yIG9uZSBzZmI6CisgICBwZSA9IG4gKiBsZChlbi90aHIpLCAgICAgICAgICAgICAgICBpZiBsZChlbi90aHIpID49IEMxCisgICBwZSA9IG4gKiAoQzIgKyBDMyAqIGxkKGVuL3RocikpLCAgICBpZiBsZChlbi90aHIpIDwgIEMxCisgICBuOiBlc3RpbWF0ZWQgbnVtYmVyIG9mIGxpbmVzIGluIHNmYiwKKyAgIGxkKHgpID0gbG9nKHgpL2xvZygyKQorCisgICBjb25zdFBhcnQgaXMgc2ZiUGUgd2l0aG91dCB0aGUgdGhyZXNob2xkIHBhcnQgbipsZCh0aHIpIG9yIG4qQzMqbGQodGhyKQorKi8KK3ZvaWQgRkRLYWFjRW5jX2NhbGNTZmJQZShQRV9DSEFOTkVMX0RBVEEgICpSRVNUUklDVCBwZUNoYW5EYXRhLAorICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqaXNCb29rLAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICppc1NjYWxlKQoreworICAgSU5UIHNmYkdycCxzZmI7CisgICBJTlQgbkxpbmVzOworICAgRklYUF9EQkwgbG9nRGF0YVJhdGlvOworICAgSU5UIGxhc3RWYWxJcyA9IDA7CisKKyAgIHBlQ2hhbkRhdGEtPnBlID0gMDsKKyAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IDA7CisgICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSAwOworCisgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBzZmJDbnQ7c2ZiR3JwKz1zZmJQZXJHcm91cCl7CisgICAgZm9yIChzZmI9MDsgc2ZiPG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgaWYgKChGSVhQX0RCTClzZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiAoRklYUF9EQkwpc2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdKSB7CisgICAgICAgICBsb2dEYXRhUmF0aW8gPSAoRklYUF9EQkwpKHNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSAtIHNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSk7CisgICAgICAgICBuTGluZXMgPSBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl07CisgICAgICAgICBpZiAobG9nRGF0YVJhdGlvID49IEMxTGREYXRhKSB7CisgICAgICAgICAgICAvKiBzY2FsZSBzZmJQZSBhbmQgc2ZiQ29uc3RQYXJ0IHdpdGggUEVfQ09OU1RQQVJUX1NISUZUICovCisgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IGZNdWx0RGl2Mihsb2dEYXRhUmF0aW8sIChGSVhQX0RCTCkobkxpbmVzPDwoTERfREFUQV9TSElGVCtQRV9DT05TVFBBUlRfU0hJRlQrMSkpKTsKKyAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0sIChGSVhQX0RCTCkobkxpbmVzPDwoTERfREFUQV9TSElGVCtQRV9DT05TVFBBUlRfU0hJRlQrMSkpKTsgOworCisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNjYWxlIHNmYlBlIGFuZCBzZmJDb25zdFBhcnQgd2l0aCBQRV9DT05TVFBBUlRfU0hJRlQgKi8KKyAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigoKEZJWFBfREJMKUMyTGREYXRhICsgZk11bHQoQzNMZERhdGEsbG9nRGF0YVJhdGlvKSksIChGSVhQX0RCTCkobkxpbmVzPDwoTERfREFUQV9TSElGVCtQRV9DT05TVFBBUlRfU0hJRlQrMSkpKTsKKworICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigoKEZJWFBfREJMKUMyTGREYXRhICsgZk11bHQoQzNMZERhdGEsc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKG5MaW5lczw8KExEX0RBVEFfU0hJRlQrUEVfQ09OU1RQQVJUX1NISUZUKzEpKSkgOworCisgICAgICAgICAgICBuTGluZXMgPSBmTXVsdEkoQzNMZERhdGEsIG5MaW5lcyk7CisgICAgICAgICB9CisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSBuTGluZXM7CisgICAgICB9CisgICAgICBlbHNlIGlmKCBpc0Jvb2tbc2ZiR3JwK3NmYl0gKSB7CisgICAgICAgIC8qIHByb3ZpZGUgZm9yIGNvc3Qgb2Ygc2NhbGUgZmFjdG9yIGZvciBJbnRlbnNpdHkgKi8KKyAgICAgICAgSU5UIGRlbHRhID0gaXNTY2FsZVtzZmJHcnArc2ZiXSAtIGxhc3RWYWxJczsKKyAgICAgICAgbGFzdFZhbElzID0gaXNTY2FsZVtzZmJHcnArc2ZiXTsKKyAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhKTw8UEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAwOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSAwOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IDA7CisgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAwOworICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsKKyAgICAgIH0KKyAgICAgIC8qIHN1bSB1cCBwZUNoYW5EYXRhIHZhbHVlcyAqLworICAgICAgcGVDaGFuRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07CisgICAgICBwZUNoYW5EYXRhLT5jb25zdFBhcnQgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOworICAgICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKKyAgICB9CisgICB9CisgICAvKiBjb3JyZWN0IHNjYWxlZCBwZSBhbmQgY29uc3RQYXJ0IHZhbHVlcyAqLworICAgcGVDaGFuRGF0YS0+cGU+Pj1QRV9DT05TVFBBUlRfU0hJRlQ7CisgICBwZUNoYW5EYXRhLT5jb25zdFBhcnQ+Pj1QRV9DT05TVFBBUlRfU0hJRlQ7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9saW5lX3BlLmggYi9hYWMvbGliQUFDZW5jL3NyYy9saW5lX3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1Y2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL2xpbmVfcGUuaApAQCAtMCwwICsxLDEzOSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFBlcmNlcHR1YWwgZW50cm9waWUgbW9kdWxlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19MSU5FX1BFX0gKKyNkZWZpbmUgX19MSU5FX1BFX0gKKworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKyNkZWZpbmUgUEVfQ09OU1RQQVJUX1NISUZUICBGUkFDVF9CSVRTCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIC8qIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSAqLworICAgSU5UICAgICAgc2ZiTkxpbmVzW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWxldmFudCBsaW5lcyBpbiBzZmIgKi8KKyAgIC8qIHRoZSByZXN0IGlzIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX2NhbGNTZmJQZSAqLworICAgSU5UICAgICAgc2ZiUGVbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgIC8qIHBlIGZvciBlYWNoIHNmYiAqLworICAgSU5UICAgICAgc2ZiQ29uc3RQYXJ0W01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgIC8qIGNvbnN0YW50IHBhcnQgZm9yIGVhY2ggc2ZiICovCisgICBJTlQgICAgICBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KKyAgIElOVCAgICAgIHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiUGUgKi8KKyAgIElOVCAgICAgIGNvbnN0UGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiQ29uc3RQYXJ0ICovCisgICBJTlQgICAgICBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLworfSBQRV9DSEFOTkVMX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVsoMildOworICAgIElOVCAgICBwZTsKKyAgICBJTlQgICAgY29uc3RQYXJ0OworICAgIElOVCAgICBuQWN0aXZlTGluZXM7CisgICAgSU5UICAgIG9mZnNldDsKK30gUEVfREFUQTsKKworCit2b2lkIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICAgKnBlQ2hhbkRhdGEsCisgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgbWF4U2ZiUGVyR3JvdXApOworCit2b2lkIEZES2FhY0VuY19jYWxjU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICAqUkVTVFJJQ1QgcGVDaGFuRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgKmlzQm9vaywKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqaXNTY2FsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE2NGFlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5jcHAKQEAgLTAsMCArMSwxMDM4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBBQUMgRW5jb2RlciBsaWIgICoqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IE0uIE5ldXNpbmdlcgorICAgRGVzY3JpcHRpb246IENvbXByZXNzb3IgZm9yIEFBQyBNZXRhZGF0YSBHZW5lcmF0b3IKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJtZXRhZGF0YV9jb21wcmVzc29yLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKKworCisjZGVmaW5lIExPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY5MzE0NzE4MDU2ZiAgLyogbmF0dXJhbCBsb2dhcml0aG0gb2YgMiAqLworI2RlZmluZSBJTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NDI2OTUwNDFmICAgIC8qIDEvTE9HMiAqLworI2RlZmluZSBGSVhQX0lMT0cyX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKElMT0cyLzIpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX0RSQ19DSEFOTkVMUyAgICAgICAgKDgpICAgICAgICAgIC8qITwgTWF4IG51bWJlciBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4gKi8KKyNkZWZpbmUgRE9XTk1JWF9TSElGVCAgICAgICAgICAgKDMpICAgICAgICAgIC8qITwgTWF4IDggY2hhbm5lbC4gKi8KKyNkZWZpbmUgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCAgKDIpICAgICAgICAgIC8qITwgU2NhbGluZyB1c2VkIGluIHdlaWdodGluZyBmaWx0ZXIuICovCisKKyNkZWZpbmUgTUVUQURBVEFfSU5UX0JJVFMgICAgICAxMAorI2RlZmluZSBNRVRBREFUQV9MSU5UX0JJVFMgICAgIDIwCisjZGVmaW5lIE1FVEFEQVRBX0lOVF9TQ0FMRSAgICAgKElOVDY0KDEpPDwoTUVUQURBVEFfSU5UX0JJVFMpKQorI2RlZmluZSBNRVRBREFUQV9GUkFDVF9CSVRTICAgIChERlJBQ1RfQklUUy0xLU1FVEFEQVRBX0lOVF9CSVRTKQorI2RlZmluZSBNRVRBREFUQV9GUkFDVF9TQ0FMRSAgIChJTlQ2NCgxKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMpKQorCisvKioKKyAqICBFbnVtIGZvciBjaGFubmVsIGFzc2lnbm1lbnQuCisgKi8KK2VudW0geworICAgIEwgICA9IDAsCisgICAgUiAgID0gMSwKKyAgICBDICAgPSAyLAorICAgIExGRSA9IDMsCisgICAgTFMgID0gNCwKKyAgICBSUyAgPSA1LAorICAgIFMgICA9IDYsCisgICAgTFMyID0gNywKKyAgICBSUzIgPSA4Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqICBTdHJ1Y3R1cmUgaG9sZHMgd2VpZ2h0aW5nIGZpbHRlciBmaWx0ZXIgc3RhdGVzLgorICovCitzdHJ1Y3QgV0VJR0hUSU5HX1NUQVRFUyB7CisgICAgRklYUF9EQkwgeDE7CisgICAgRklYUF9EQkwgeDI7CisgICAgRklYUF9EQkwgeTE7CisgICAgRklYUF9EQkwgeTI7Cit9OworCisvKioKKyAqICBEeW5hbWljIFJhbmdlIENvbnRyb2wgY29tcHJlc3NvciBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBEUkNfQ09NUCB7CisKKyAgICBGSVhQX0RCTCAgICAgbWF4Qm9vc3RUaHJbMl07ICAgICAgICAgICAgIC8qITwgTWF4IGJvb3N0IHRocmVzaG9sZC4gKi8KKyAgICBGSVhQX0RCTCAgICAgYm9vc3RUaHJbMl07ICAgICAgICAgICAgICAgIC8qITwgQm9vc3QgdGhyZXNob2xkLiAqLworICAgIEZJWFBfREJMICAgICBlYXJseUN1dFRoclsyXTsgICAgICAgICAgICAgLyohPCBFYXJseSBjdXQgdGhyZXNob2xkLiAqLworICAgIEZJWFBfREJMICAgICBjdXRUaHJbMl07ICAgICAgICAgICAgICAgICAgLyohPCBDdXQgdGhyZXNob2xkLiAqLworICAgIEZJWFBfREJMICAgICBtYXhDdXRUaHJbMl07ICAgICAgICAgICAgICAgLyohPCBNYXggY3V0IHRocmVzaG9sZC4gKi8KKworICAgIEZJWFBfREJMICAgICBib29zdEZhY1syXTsgICAgICAgICAgICAgICAgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgYm9vc3QgY29tcHJlc3Npb24uICovCisgICAgRklYUF9EQkwgICAgIGVhcmx5Q3V0RmFjWzJdOyAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBlYXJseSBjdXQgY29tcHJlc3Npb24uICovCisgICAgRklYUF9EQkwgICAgIGN1dEZhY1syXTsgICAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBjdXQgY29tcHJlc3Npb24uICovCisKKyAgICBGSVhQX0RCTCAgICAgbWF4Qm9vc3RbMl07ICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBib29zdC4gKi8KKyAgICBGSVhQX0RCTCAgICAgbWF4Q3V0WzJdOyAgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBjdXQuICovCisgICAgRklYUF9EQkwgICAgIG1heEVhcmx5Q3V0WzJdOyAgICAgICAgICAgICAvKiE8IE1heGltdW0gZWFybHkgY3V0LiAqLworCisgICAgRklYUF9EQkwgICAgIGZhc3RBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IEZhc3QgYXR0YWNrIGNvZWZmaWNpZW50LiAqLworICAgIEZJWFBfREJMICAgICBmYXN0RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBGYXN0IHJlbGVhc2UgY29lZmZpY2llbnQuICovCisgICAgRklYUF9EQkwgICAgIHNsb3dBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IFNsb3cgYXR0YWNrIGNvZWZmaWNpZW50LiAqLworICAgIEZJWFBfREJMICAgICBzbG93RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBTbG93IHJlbGVhc2UgY29lZmZpY2llbnQuICovCisgICAgVUlOVCAgICAgICAgIGhvbGRPZmZbMl07ICAgICAgICAgICAgICAgICAvKiE8IEhvbGQgdGltZSBpbiBibG9ja3MuICovCisKKyAgICBGSVhQX0RCTCAgICAgYXR0YWNrVGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IGF0dGFjayB0aHJlc2hvbGQuICovCisgICAgRklYUF9EQkwgICAgIGRlY2F5VGhyWzJdOyAgICAgICAgICAgICAgICAvKiE8IFNsb3cvZmFzdCByZWxlYXNlIHRocmVzaG9sZC4gKi8KKworICAgIERSQ19QUk9GSUxFICBwcm9maWxlWzJdOyAgICAgICAgICAgICAgICAgLyohPCBEUkMgcHJvZmlsZS4gKi8KKyAgICBJTlQgICAgICAgICAgYmxvY2tMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgQmxvY2sgbGVuZ3RoIGluIHNhbXBsZXMuICovCisgICAgVUlOVCAgICAgICAgIHNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSByYXRlLiAqLworICAgIENIQU5ORUxfTU9ERSBjaGFuQ29uZmlnOyAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCisKKyAgICBVQ0hBUiAgICAgICAgdXNlV2VpZ2h0aW5nOyAgICAgICAgICAgICAgIC8qITwgVXNlIHdlaWdodGluZyBmaWx0ZXIuICovCisKKyAgICBVSU5UICAgICAgICAgY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzLiAqLworICAgIFVJTlQgICAgICAgICBmdWxsQ2hhbm5lbHM7ICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnVsbCByYW5nZSBjaGFubmVscy4gKi8KKyAgICBJTlQgICAgICAgICAgY2hhbm5lbElkeFs5XTsgICAgICAgICAgICAgIC8qITwgT2Zmc2V0cyBvZiBpbnRlcmxlYXZlZCBjaGFubmVsIHNhbXBsZXMgKEwsIFIsIEMsIExGRSwgTHMsIFJzLCBTLCBMczIsIFJzMikuICovCisKKyAgICBGSVhQX0RCTCAgICAgc21vb3RoTGV2ZWxbMl07ICAgICAgICAgICAgIC8qITwgbGV2ZWwgc21vb3RoaW5nIHN0YXRlcyAqLworICAgIEZJWFBfREJMICAgICBzbW9vdGhHYWluWzJdOyAgICAgICAgICAgICAgLyohPCBnYWluIHNtb290aGluZyBzdGF0ZXMgKi8KKyAgICBVSU5UICAgICAgICAgaG9sZENudFsyXTsgICAgICAgICAgICAgICAgIC8qITwgaG9sZCBjb3VudGVyICovCisKKyAgICBGSVhQX0RCTCAgICAgbGltR2FpblsyXTsgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBnYWluICovCisgICAgRklYUF9EQkwgICAgIGxpbURlY2F5OyAgICAgICAgICAgICAgICAgICAvKiE8IGxpbWl0ZXIgZGVjYXkgKGxpbmVhcikgKi8KKyAgICBGSVhQX0RCTCAgICAgcHJldlBlYWtbMl07ICAgICAgICAgICAgICAgIC8qITwgbWF4IHBlYWsgb2YgcHJldmlvdXMgYmxvY2sgKHN0ZXJlby9tb25vKSovCisKKyAgICBXRUlHSFRJTkdfU1RBVEVTIGZpbHRlcltNQVhfRFJDX0NIQU5ORUxTXTsgLyohPCBhcnJheSBob2xkcyB3ZWlnaHRpbmcgZmlsdGVyIHN0YXRlcyAqLworCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiAgUHJvZmlsZSB0YWJsZXMuCisgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhCb29zdFRocltdID0geworICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTQzPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS01Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTY1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS01MDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCit9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0VGhyW10gPSB7CisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTQxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNDE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUykKK307CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRWFybHlDdXRUaHJbXSA9IHsKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTI2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKQorfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRUaHJbXSAgICAgID0geworICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTE2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMTY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTIxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMTA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCit9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFRocltdICAgPSB7CisgICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDk8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSg5PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKK307CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiQm9vc3RSYXRpb1tdID0geworICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi81LmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi81LmYpIC0gMS5mKSApCit9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkVhcmx5Q3V0UmF0aW9bXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMS5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKQorfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRSYXRpb1tdICAgICAgPSB7CisgICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIwLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCisgICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLyAyLmYpIC0gMS5mKSApLAorICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICkKK307CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Qm9vc3RbXSA9IHsKKyAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKQorfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhDdXRbXSAgID0geworICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCit9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkZhc3RBdHRhY2tbXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQorfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJGYXN0RGVjYXlbXSAgPSB7CisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoICgyMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoICAgKDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSkKK307CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiU2xvd0F0dGFja1tdID0geworICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCggICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCit9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYlNsb3dEZWNheVtdICA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCggKDMwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoICgzMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCggKDMwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoICgxMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCAgICAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQorfTsKKworc3RhdGljIGNvbnN0IElOVCB0YWJIb2xkT2ZmW10gICAgPSB7IDEwLCAxMCwgMTAsIDEwLCAxMCwgMCB9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiQXR0YWNrVGhyW10gPSB7CisgICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSgxMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSgwPDxNRVRBREFUQV9GUkFDVF9CSVRTKQorfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJEZWNheVRocltdICA9IHsKKyAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAoRklYUF9EQkwpKCAwPDxNRVRBREFUQV9GUkFDVF9CSVRTKQorfTsKKworLyoqCisgKiAgV2VpZ2h0aW5nIGZpbHRlciBjb2VmZmljaWVudHMgKGJpcXVhZCBiYW5kcGFzcykuCisgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBiMCA9IEZMMkZYQ09OU1RfREJMKDAuNTMwNTA2NjJmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGIxID0gMCwgYjIgPSAtYjAgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhMSA9IEZMMkZYQ09OU1RfREJMKC0wLjk1MjM3OTgzZiksIGEyID0gRkwyRlhDT05TVF9EQkwoLTAuMDIyNDg4MzZmKTsgIC8qIGEwID0gMSAqLworCisKKy8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBcYnJpZWYgIENhbGN1bGF0ZSBzY2FsaW5nIGZhY3RvciBmb3IgZGVub3RlZCBwcm9jZXNzaW5nIGJsb2NrLgorICoKKyAqIFxwYXJhbSBibG9ja0xlbmd0aCAgIExlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrLgorICoKKyAqIFxyZXR1cm4gICAgc2hpZnRGYWN0b3IKKyAqLworc3RhdGljIFVJTlQgZ2V0U2hpZnRGYWN0b3IoCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbGVuZ3RoCisgICAgICAgICkKK3sKKyAgICBVSU5UIGxkTjsKKyAgICBmb3IobGROPTE7KCgoVUlOVCkxKTw8bGROKSA8IGxlbmd0aDtsZE4rKyk7CisKKyAgICByZXR1cm4gbGROOworfQorCisvKioKKyAqIFxicmllZiAgU3VtIHVwIGZpeHBvaW50IHZhbHVlcyB3aXRoIGJlc3QgcG9zc2libGUgYWNjdXJhY3kuCisgKgorICogXHBhcmFtIHZhbHVlMSAgICAgICAgRmlyc3QgaW5wdXQgdmFsdWUuCisgKiBccGFyYW0gcTEgICAgICAgICAgICBTY2FsaW5nIGZhY3RvciBvZiBmaXJzdCBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBwVmFsdWUyICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIGlucHV0IHZhbHVlLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBwUTIgICAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIHNjYWxpbmcgZmFjdG9yLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KKyAqCisgKiBccmV0dXJuICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgZml4cEFkZCgKKyAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICAgICAgICB2YWx1ZTEsCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgcTEsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgICAgICAgcFZhbHVlMiwKKyAgICAgICAgaW50ICpjb25zdCAgICAgICAgICAgICAgICAgICAgICBwUTIKKyAgICAgICAgKQoreworICBjb25zdCBpbnQgaGVhZHJvb20xID0gZk5vcm16KGZpeHBfYWJzKHZhbHVlMSkpLTE7CisgIGNvbnN0IGludCBoZWFkcm9vbTIgPSBmTm9ybXooZml4cF9hYnMoKnBWYWx1ZTIpKS0xOworICBpbnQgcmVzdWx0U2NhbGUgPSBmaXhNYXgocTEtaGVhZHJvb20xLCAoKnBRMiktaGVhZHJvb20yKTsKKworICBpZiAoICh2YWx1ZTEhPUZMMkZYQ09OU1RfREJMKDAuZikpICYmICgqcFZhbHVlMiE9RkwyRlhDT05TVF9EQkwoMC5mKSkgKSB7CisgICAgcmVzdWx0U2NhbGUrKzsKKyAgfQorCisgICpwVmFsdWUyID0gc2NhbGVWYWx1ZSh2YWx1ZTEsIHExLXJlc3VsdFNjYWxlKSArIHNjYWxlVmFsdWUoKnBWYWx1ZTIsICgqcFEyKS1yZXN1bHRTY2FsZSk7CisgICpwUTIgPSAoKnBWYWx1ZTIhPShGSVhQX0RCTCkwKSA/IHJlc3VsdFNjYWxlIDogREZSQUNUX0JJVFMtMTsKK30KKworLyoqCisgKiBcYnJpZWYgIEZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHRpbWUgY29uc3RhbnQgdG8gZmlsdGVyIGNvZWZmaWNpZW50LgorICoKKyAqIFxwYXJhbSB0ICAgICAgICAgICAgIFRpbWUgY29uc3RhbnQuCisgKiBccGFyYW0gc2FtcGxlUmF0ZSAgICBTYW1wbGluZyByYXRlIGluIEh6LgorICogXHBhcmFtIGJsb2NrTGVuZ3RoICAgTGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2sgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4KKyAqCisgKiBccmV0dXJuICAgIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKQorICovCitzdGF0aWMgRklYUF9EQkwgdGMyQ29lZmYoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgdCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoCisgICAgICAgICkKK3sKKyAgIEZJWFBfREJMIHNhbXBsZVJhdGVGcmFjdDsKKyAgIEZJWFBfREJMIGJsb2NrTGVuZ3RoRnJhY3Q7CisgICBGSVhQX0RCTCBmLCBwcm9kdWN0OworICAgRklYUF9EQkwgZXhwb25lbnQsIHJlc3VsdDsKKyAgIElOVCBlX3JlczsKKworICAgLyogZiA9IHNhbXBsZVJhdGUvYmxvY2tMZW5ndGggKi8KKyAgIHNhbXBsZVJhdGVGcmFjdCA9IChGSVhQX0RCTCkoc2FtcGxlUmF0ZTw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7CisgICBibG9ja0xlbmd0aEZyYWN0ID0gKEZJWFBfREJMKShibG9ja0xlbmd0aDw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7CisgICBmID0gZkRpdk5vcm0oc2FtcGxlUmF0ZUZyYWN0LCBibG9ja0xlbmd0aEZyYWN0LCAmZV9yZXMpOworICAgZiA9IHNjYWxlVmFsdWUoZiwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCisKKyAgIC8qIHByb2R1Y3QgPSB0KmYgKi8KKyAgIHByb2R1Y3QgPSBmTXVsdE5vcm0odCwgZiwgJmVfcmVzKTsKKyAgIHByb2R1Y3QgPSBzY2FsZVZhbHVlKHByb2R1Y3QsIGVfcmVzK01FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLworCisgICAvKiBleHBvbmVudCA9ICgtMS4wLygodCkgKiAoZikpKSAqLworICAgZXhwb25lbnQgPSBmRGl2Tm9ybShNRVRBREFUQV9GUkFDVF9TQ0FMRSwgcHJvZHVjdCwgJmVfcmVzKTsKKyAgIGV4cG9uZW50ID0gc2NhbGVWYWx1ZShleHBvbmVudCwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCisKKyAgIC8qIGV4cG9uZW50ICogbGQoZSkgKi8KKyAgIGV4cG9uZW50ID0gZk11bHQoZXhwb25lbnQsRklYUF9JTE9HMl9ESVYyKTw8MTsgLyogZV4oeCkgPSAyXih4KmxkKGUpKSAqLworCisgICAvKiBleHAoLTEuMC8oKHQpICogKGYpKSkgKi8KKyAgIHJlc3VsdCA9IGYyUG93KC1leHBvbmVudCwgREZSQUNUX0JJVFMtMS1NRVRBREFUQV9GUkFDVF9CSVRTLCAmZV9yZXMpOworCisgICAvKiByZXN1bHQgPSAxLjAgLSBleHAoLTEuMC8oKHQpICogKGYpKSkgKi8KKyAgIHJlc3VsdCA9IChGSVhQX0RCTClNQVhWQUxfREJMIC0gc2NhbGVWYWx1ZShyZXN1bHQsIGVfcmVzKTsKKworICAgcmV0dXJuIHJlc3VsdDsKK30KKworSU5UIEZES19EUkNfR2VuZXJhdG9yX09wZW4oCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCisgICAgICAgICkKK3sKKyAgICBJTlQgZXJyID0gMDsKKyAgICBIRFJDX0NPTVAgaERjQ29tcCA9IE5VTEw7CisKKyAgICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKKyAgICAgIGVyciA9IC0xOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICAgIGhEY0NvbXAgPSAoSERSQ19DT01QKUZES2NhbGxvYygxLCBzaXplb2YoRFJDX0NPTVApKTsKKworICAgIGlmIChoRGNDb21wID09IE5VTEwpIHsKKyAgICAgIGVyciA9IC0xOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIEZES21lbWNsZWFyKGhEY0NvbXAsIHNpemVvZihEUkNfQ09NUCkpOworCisgICAgLyogUmV0dXJuIGRyYyBjb21wcmVzc29yIGluc3RhbmNlICovCisgICAgKnBoRHJjQ29tcCA9IGhEY0NvbXA7CisgICAgcmV0dXJuIGVycjsKK2JhaWw6CisgICAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJmhEY0NvbXApOworICAgIHJldHVybiBlcnI7Cit9CisKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgKKyAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICpwaERyY0NvbXAKKyAgICAgICAgKQoreworICAgIGlmIChwaERyY0NvbXAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKnBoRHJjQ29tcCAhPSBOVUxMKSB7CisgICAgICBGREtmcmVlKCpwaERyY0NvbXApOworICAgICAgKnBoRHJjQ29tcCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKAorICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCisgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCisgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZVJGLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCisgICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICAgICAgY2hhbm5lbE9yZGVyLAorICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHVzZVdlaWdodGluZworICAgICAgICApCit7CisgICAgaW50IGk7CisgICAgQ0hBTk5FTF9NQVBQSU5HIGNoYW5uZWxNYXBwaW5nOworCisgICAgZHJjQ29tcC0+bGltRGVjYXkgPSBGTDJGWENPTlNUX0RCTCggKCgwLjAwNmYgLyAyNTYpICogYmxvY2tMZW5ndGgpIC8gTUVUQURBVEFfSU5UX1NDQUxFICk7CisKKyAgICAvKiBTYXZlIHBhcmFtZXRlcnMuICovCisgICAgZHJjQ29tcC0+YmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDsKKyAgICBkcmNDb21wLT5zYW1wbGVSYXRlICA9IHNhbXBsZVJhdGU7CisgICAgZHJjQ29tcC0+Y2hhbkNvbmZpZyA9IGNoYW5uZWxNb2RlOworICAgIGRyY0NvbXAtPnVzZVdlaWdodGluZyA9IHVzZVdlaWdodGluZzsKKworICAgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKGRyY0NvbXAsIHByb2ZpbGVMaW5lLCBwcm9maWxlUkYpIT0wKSB7IC8qIGV4cGVjdHMgaW5pdGlhbGl6ZWQgYmxvY2tMZW5ndGggYW5kIHNhbXBsZVJhdGUgKi8KKyAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNoYW5uZWwgb2Zmc2V0cy4gKi8KKyAgICBpZiAoRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhjaGFubmVsTW9kZSwgY2hhbm5lbE9yZGVyLCAmY2hhbm5lbE1hcHBpbmcpIT1BQUNfRU5DX09LKSB7CisgICAgICByZXR1cm4gKC0yKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSBkcmNDb21wLT5jaGFubmVsSWR4W2ldID0gLTE7CisKKyAgICBzd2l0Y2ggKGNoYW5uZWxNb2RlKSB7CisgICAgY2FzZSBNT0RFXzE6IC8qIG1vbm8gKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzI6IC8qIHN0ZXJlbyAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMV8yOiAvKiAzY2ggKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMl8xOiAvKiA0Y2ggKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMl8yOiAvKiA1Y2ggKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAvKiA1LjEgY2ggKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogLyogNy4xIGNoICovCisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBjICovCisgICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1s0XS5DaGFubmVsSW5kZXhbMF07IC8qIGxmZSAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsYyAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByYyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBjICovCisgICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1s0XS5DaGFubmVsSW5kZXhbMF07IC8qIGxmZSAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscmVhciAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycmVhciAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMV8xOgorICAgIGNhc2UgTU9ERV8xXzFfMV8xOgorICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMToKKyAgICBjYXNlIE1PREVfMV8xXzFfMV8xXzFfMV8xOgorICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMV8xXzFfMV8xXzFfMToKKyAgICBjYXNlIE1PREVfMl8yOgorICAgIGNhc2UgTU9ERV8yXzJfMjoKKyAgICBjYXNlIE1PREVfMl8yXzJfMjoKKyAgICBjYXNlIE1PREVfMl8yXzJfMl8yXzI6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgZHJjQ29tcC0+ZnVsbENoYW5uZWxzID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzRWZmOworICAgIGRyY0NvbXAtPmNoYW5uZWxzICAgICA9IGNoYW5uZWxNYXBwaW5nLm5DaGFubmVsczsKKworICAgIC8qIEluaXQgc3RhdGVzLiAqLworICAgIGRyY0NvbXAtPnNtb290aExldmVsWzBdID0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbMV0gPSAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xMzU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworCisgICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+c21vb3RoR2Fpbiwgc2l6ZW9mKGRyY0NvbXAtPnNtb290aEdhaW4pKTsKKyAgICBGREttZW1jbGVhcihkcmNDb21wLT5ob2xkQ250LCBzaXplb2YoZHJjQ29tcC0+aG9sZENudCkpOworICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPmxpbUdhaW4sIHNpemVvZihkcmNDb21wLT5saW1HYWluKSk7CisgICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+cHJldlBlYWssIHNpemVvZihkcmNDb21wLT5wcmV2UGVhaykpOworICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPmZpbHRlciwgc2l6ZW9mKGRyY0NvbXAtPmZpbHRlcikpOworCisgICAgcmV0dXJuICgwKTsKK30KKworCitJTlQgRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZSgKKyAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAorICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVMaW5lLAorICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVSRgorICAgICAgICApCit7CisgICAgaW50IHByb2ZpbGVJZHgsIGk7CisKKyAgICBkcmNDb21wLT5wcm9maWxlWzBdID0gcHJvZmlsZUxpbmU7CisgICAgZHJjQ29tcC0+cHJvZmlsZVsxXSA9IHByb2ZpbGVSRjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgLyogZ2V0IHByb2ZpbGUgaW5kZXggKi8KKyAgICAgICAgc3dpdGNoIChkcmNDb21wLT5wcm9maWxlW2ldKSB7CisgICAgICAgICAgICBjYXNlIERSQ19OT05FOgorICAgICAgICAgICAgY2FzZSBEUkNfRklMTVNUQU5EQVJEOiAgcHJvZmlsZUlkeCA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUkNfRklMTUxJR0hUOiAgICAgcHJvZmlsZUlkeCA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNTVEFOREFSRDogcHJvZmlsZUlkeCA9IDI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNMSUdIVDogICAgcHJvZmlsZUlkeCA9IDM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUkNfU1BFRUNIOiAgICAgICAgcHJvZmlsZUlkeCA9IDQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEUkNfREVMQVlfVEVTVDogICAgcHJvZmlsZUlkeCA9IDU7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICgtMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgcGFyYW1ldGVycyBmb3Igc2VsZWN0ZWQgcHJvZmlsZSAqLworICAgICAgICBpZiAocHJvZmlsZUlkeCA+PSAwKSB7CisgICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFRocltpXSA9IHRhYk1heEJvb3N0VGhyW3Byb2ZpbGVJZHhdOworICAgICAgICAgICAgZHJjQ29tcC0+Ym9vc3RUaHJbaV0gICAgPSB0YWJCb29zdFRocltwcm9maWxlSWR4XTsKKyAgICAgICAgICAgIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldID0gdGFiRWFybHlDdXRUaHJbcHJvZmlsZUlkeF07CisgICAgICAgICAgICBkcmNDb21wLT5jdXRUaHJbaV0gICAgICA9IHRhYkN1dFRocltwcm9maWxlSWR4XTsKKyAgICAgICAgICAgIGRyY0NvbXAtPm1heEN1dFRocltpXSAgID0gdGFiTWF4Q3V0VGhyW3Byb2ZpbGVJZHhdOworCisgICAgICAgICAgICBkcmNDb21wLT5ib29zdEZhY1tpXSAgICA9IHRhYkJvb3N0UmF0aW9bcHJvZmlsZUlkeF07CisgICAgICAgICAgICBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSA9IHRhYkVhcmx5Q3V0UmF0aW9bcHJvZmlsZUlkeF07CisgICAgICAgICAgICBkcmNDb21wLT5jdXRGYWNbaV0gICAgICA9IHRhYkN1dFJhdGlvW3Byb2ZpbGVJZHhdOworCisgICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFtpXSAgICA9IHRhYk1heEJvb3N0W3Byb2ZpbGVJZHhdOworICAgICAgICAgICAgZHJjQ29tcC0+bWF4Q3V0W2ldICAgICAgPSB0YWJNYXhDdXRbcHJvZmlsZUlkeF07CisgICAgICAgICAgICBkcmNDb21wLT5tYXhFYXJseUN1dFtpXSA9IC0gZk11bHQoKGRyY0NvbXAtPmN1dFRocltpXSAtIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSwgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0pOyAvKiBubyBzY2FsaW5nIGFmdGVyIG11bHQgbmVlZGVkLCBlYXJseUN1dEZhYyBpcyBpbiBGSVhQX0RCTCAqLworCisgICAgICAgICAgICBkcmNDb21wLT5mYXN0QXR0YWNrW2ldICA9IHRjMkNvZWZmKHRhYkZhc3RBdHRhY2tbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKyAgICAgICAgICAgIGRyY0NvbXAtPmZhc3REZWNheVtpXSAgID0gdGMyQ29lZmYodGFiRmFzdERlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICAgICAgICBkcmNDb21wLT5zbG93QXR0YWNrW2ldICA9IHRjMkNvZWZmKHRhYlNsb3dBdHRhY2tbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKyAgICAgICAgICAgIGRyY0NvbXAtPnNsb3dEZWNheVtpXSAgID0gdGMyQ29lZmYodGFiU2xvd0RlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICAgICAgICBkcmNDb21wLT5ob2xkT2ZmW2ldICAgICA9IHRhYkhvbGRPZmZbcHJvZmlsZUlkeF0gKiAyNTYgLyBkcmNDb21wLT5ibG9ja0xlbmd0aDsKKworICAgICAgICAgICAgZHJjQ29tcC0+YXR0YWNrVGhyW2ldICAgPSB0YWJBdHRhY2tUaHJbcHJvZmlsZUlkeF07CisgICAgICAgICAgICBkcmNDb21wLT5kZWNheVRocltpXSAgICA9IHRhYkRlY2F5VGhyW3Byb2ZpbGVJZHhdOworICAgICAgICB9CisKKyAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKworSU5UIEZES19EUkNfR2VuZXJhdG9yX0NhbGMoCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKKyAgICAgICAgY29uc3QgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICBpblNhbXBsZXMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZGlhbG5vcm0sCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZHJjX1RhcmdldFJlZkxldmVsLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWwsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICAgICAgY2xldiwKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgICAgICBzbGV2LAorICAgICAgICBJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIHBEeW5ybmcsCisgICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgcENvbXByCisgICAgICAgICkKK3sKKyAgICBpbnQgaSwgYzsKKyAgICBGSVhQX0RCTCBwZWFrWzJdOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIGNvbXByZXNzb3IKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIGlmICgoZHJjQ29tcC0+cHJvZmlsZVswXSAhPSBEUkNfTk9ORSkgfHwgKGRyY0NvbXAtPnByb2ZpbGVbMV0gIT0gRFJDX05PTkUpKSB7CisgICAgICAgIC8qIENhbGMgbG91ZG5lc3MgbGV2ZWwgKi8KKyAgICAgICAgRklYUF9EQkwgbGV2ZWxfYiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgIGludCAgICAgIGxldmVsX2UgPSBERlJBQ1RfQklUUy0xOworCisgICAgICAgIC8qIEluY3JlYXNlIGVuZXJneSB0aW1lIHJlc29sdXRpb24gd2l0aCBzaG9ydGVyIHByb2Nlc3NpbmcgYmxvY2tzLiAzMiBpcyBhbiBlbXBpcmljIHZhbHVlLiAqLworICAgICAgICBjb25zdCBpbnQgZ3JhbnVsZUxlbmd0aCA9IGZpeE1pbigzMiwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworCisgICAgICAgIGlmIChkcmNDb21wLT51c2VXZWlnaHRpbmcpIHsKKyAgICAgICAgICAgIEZJWFBfREJMIHgxLCB4MiwgeSwgeTEsIHkyOworICAgICAgICAgICAgLyogc3VtIG9mIGZpbHRlciBjb2VmZmljaWVudHMgYWJvdXQgMi41IC0+IHNxdWFyZWQgdmFsdWUgaXMgNi4yNQorICAgICAgICAgICAgICAgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCBpcyAyIC0+IHNjYWxpbmcgYWJvdXQgMTYsIHRoZXJlZm9yZSByZWR1Y2UgZ3JhbnVsZVNoaWZ0IGJ5IDEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKS0xOworCisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2NdOworCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgTEZFICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZ2V0IGZpbHRlciBzdGF0ZXMgKi8KKyAgICAgICAgICAgICAgICB4MSA9IGRyY0NvbXAtPmZpbHRlcltjXS54MTsKKyAgICAgICAgICAgICAgICB4MiA9IGRyY0NvbXAtPmZpbHRlcltjXS54MjsKKyAgICAgICAgICAgICAgICB5MSA9IGRyY0NvbXAtPmZpbHRlcltjXS55MTsKKyAgICAgICAgICAgICAgICB5MiA9IGRyY0NvbXAtPmZpbHRlcltjXS55MjsKKworICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgICAgICAgICAgZG8geworCisgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFwcGx5IHdlaWdodGluZyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgeCA9IEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2kqZHJjQ29tcC0+Y2hhbm5lbHNdKSA+PiBXRUlHSFRJTkdfRklMVEVSX1NISUZUOworCisgICAgICAgICAgICAgICAgICAgIC8qIHkgPSBiMCAqICh4IC0geDIpIC0gYTEgKiB5MSAtIGEyICogeTI7ICovCisgICAgICAgICAgICAgICAgICAgIHkgPSBmTXVsdChiMCx4LXgyKSAtIGZNdWx0KGExLHkxKSAtIGZNdWx0KGEyLHkyKTsKKworICAgICAgICAgICAgICAgICAgICB4MiA9IHgxOworICAgICAgICAgICAgICAgICAgICB4MSA9IHg7CisgICAgICAgICAgICAgICAgICAgIHkyID0geTE7CisgICAgICAgICAgICAgICAgICAgIHkxID0geTsKKworICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2Mih5KT4+KGdyYW51bGVTaGlmdC0xKTsgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCisgICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KKworICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQrMipXRUlHSFRJTkdfRklMVEVSX1NISUZULCAmbGV2ZWxfYiwgJmxldmVsX2UpOyAvKiBzdXAgdXAgcGFydGlhbCBlbmVyZ2llcyAqLworCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aCApOworCisKKyAgICAgICAgICAgICAgICAvKiBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KKyAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDEgPSB4MTsKKyAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDIgPSB4MjsKKyAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTEgPSB5MTsKKyAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTIgPSB5MjsKKyAgICAgICAgICAgIH0gLyogYyAqLworICAgICAgICB9IC8qIHdlaWdodGluZyAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKTsKKworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tjXTsKKworICAgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgTEZFICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCisgICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZlBvdzJEaXYyKChGSVhQX1BDTSlwU2FtcGxlc1tpKmRyY0NvbXAtPmNoYW5uZWxzXSk+PihncmFudWxlU2hpZnQtMSk7CisgICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KKworICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQsICZsZXZlbF9iLCAmbGV2ZWxfZSk7IC8qIHN1cCB1cCBwYXJ0aWFsIGVuZXJnaWVzICovCisKKyAgICAgICAgICAgICAgICB9IHdoaWxlICggaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogd2VpZ2h0aW5nICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQorICAgICAgICAgKi8KKyAgICAgICAgLyogbGV2ZWwgc2NhbGluZyAqLworCisgICAgICAgIC8qIGRlc2NhbGVkIGxldmVsIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KKyAgICAgICAgRklYUF9EQkwgbGRMZXZlbCA9IENhbGNMZERhdGEobGV2ZWxfYikgKyAoRklYUF9EQkwpKChsZXZlbF9lLTEyKTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpIC0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpKGRyY0NvbXAtPmJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS0xMikpKTsKKworICAgICAgICAvKiBpZiAobGV2ZWwgPCAxZS0xMCkgbGV2ZWwgPSAxZS0xMGY7ICovCisgICAgICAgIGxkTGV2ZWwgPSBGREttYXgobGRMZXZlbCwgRkwyRlhDT05TVF9EQkwoLTAuNTE5MDUxMjY0ODI2MTUwMzY2ODU0NzM3NDEwODU3NzJmKSk7CisKKyAgICAgICAgLyogbGV2ZWwgPSAxMCAqIGxvZyhsZXZlbCkvbG9nKDEwKSArIDM7CisgICAgICAgICAqICAgICAgID0gMTAqbG9nKDIpL2xvZygxMCkgKiBsZChsZXZlbCkgKyAzOworICAgICAgICAgKiAgICAgICA9IDEwICogMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKGxldmVsKSArIDMKKyAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMC4zKQorICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NAorICAgICAgICAgKgorICAgICAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgorICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NCAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMpCisgICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkKKyAgICAgICAgICogICAgICAgPSAxMCoyXihNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpICogKCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQgKQorICAgICAgICAgKiAqLworICAgICAgICBGSVhQX0RCTCBsZXZlbCA9IGZNdWx0KChGSVhQX0RCTCkoMTA8PChNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpKSwgZk11bHQoIEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDlmKSwgbGRMZXZlbCkgKyAoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuM2YpPj5MRF9EQVRBX1NISUZUKSApOworCisgICAgICAgIC8qIGxldmVsIC09IGRpYWxub3JtICsgMzEgKi8gICAvKiB0aGlzIGlzIGZpeGVkIHRvIERvbGJ5LVJlZmVyZW5jZUxldmVsIGFzIGNvbXByZXNzb3IgcHJvZmlsZXMgYXJlIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhpcyAqLworICAgICAgICBsZXZlbCAtPSAoKEZJWFBfREJMKShkaWFsbm9ybTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKSAgKyAoRklYUF9EQkwpKDMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPnByb2ZpbGVbaV0gPT0gRFJDX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvKiBubyBjb21wcmVzc2lvbiAqLworICAgICAgICAgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgZ2FpbiwgYWxwaGEsIGx2bDJzbXRobHZsOworCisgICAgICAgICAgICAgICAgLyogY2FsYyBzdGF0aWMgZ2FpbiAqLworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8PSBkcmNDb21wLT5tYXhCb29zdFRocltpXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBtYXggYm9vc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGRyY0NvbXAtPm1heEJvb3N0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPmJvb3N0VGhyW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGJvb3N0IHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5ib29zdFRocltpXSksZHJjQ29tcC0+Ym9vc3RGYWNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSBkcmNDb21wLT5lYXJseUN1dFRocltpXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBudWxsIGJhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmN1dFRocltpXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBlYXJseSBjdXQgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSwgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPm1heEN1dFRocltpXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBjdXQgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmN1dFRocltpXSksIGRyY0NvbXAtPmN1dEZhY1tpXSkgLSBkcmNDb21wLT5tYXhFYXJseUN1dFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1heCBjdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IC1kcmNDb21wLT5tYXhDdXRbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogY2hvb3NlIHRpbWUgY29uc3RhbnQgKi8KKyAgICAgICAgICAgICAgICBsdmwyc210aGx2bCA9IGxldmVsIC0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV07CisgICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGF0dGFjayAqLworICAgICAgICAgICAgICAgICAgICBpZiAobHZsMnNtdGhsdmwgPiBkcmNDb21wLT5hdHRhY2tUaHJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhc3QgYXR0YWNrICovCisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3RBdHRhY2tbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbG93IGF0dGFjayAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93QXR0YWNrW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsdmwyc210aGx2bCA8IC1kcmNDb21wLT5kZWNheVRocltpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFzdCByZWxlYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3REZWNheVtpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsb3cgcmVsZWFzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93RGVjYXlbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBzbW9vdGggZ2FpbiAmIGxldmVsICovCisgICAgICAgICAgICAgICAgaWYgKChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgfHwgKGRyY0NvbXAtPmhvbGRDbnRbaV0gPT0gMCkpIHsgLyogaG9sZCBnYWluIHVubGVzcyB3ZSBoYXZlIGFuIGF0dGFjayBvciBob2xkIHBlcmlvZCBpcyBvdmVyICovCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3U7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSAoMS1hbHBoYSkgKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSArIGFscGhhICogbGV2ZWw7ICovCisgICAgICAgICAgICAgICAgICAgIGFjY3UgPSAgZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMLWFscGhhKSwgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0pOworICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSBhY2N1OworCisgICAgICAgICAgICAgICAgICAgIC8qIGRyY0NvbXAtPnNtb290aEdhaW5baV0gID0gKDEtYWxwaGEpICogZHJjQ29tcC0+c21vb3RoR2FpbltpXSArIGFscGhhICogZ2FpbjsgKi8KKyAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwtYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmTXVsdChhbHBoYSxnYWluKTsKKyAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IGFjY3U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaG9sZCBjb3VudGVyICovCisgICAgICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmhvbGRDbnRbaV0pIHsKKyAgICAgICAgICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7CisgICAgICAgICAgICAgICAgICBkcmNDb21wLT5ob2xkQ250W2ldID0gZHJjQ29tcC0+aG9sZE9mZltpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIHByb2ZpbGUgIT0gRFJDX05PTkUgKi8KKyAgICAgICAgfSAvKiBmb3IgaT0xLi4yICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBubyBjb21wcmVzc2lvbiAqLworICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluWzBdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpblsxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIGxpbWl0ZXIKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIGZpbmQgcGVhayBsZXZlbCAqLworICAgIHBlYWtbMF0gPSBwZWFrWzFdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGg7IGkrKykgeworICAgICAgICBGSVhQX0RCTCB0bXA7CisgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tpKmRyY0NvbXAtPmNoYW5uZWxzXTsKKyAgICAgICAgSU5UX1BDTSBtYXhTYW1wbGUgPSAwOworCisgICAgICAgIC8qIHNpbmdsZSBjaGFubmVscyAqLworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBGREttYXgobWF4U2FtcGxlLCBmQWJzKHBTYW1wbGVzW2NdKSk7CisgICAgICAgIH0KKyAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBGWF9QQ00yRlhfREJMKG1heFNhbXBsZSk+PkRPV05NSVhfU0hJRlQpOworCisgICAgICAgIC8qIEx0L1J0IGRvd25taXggKi8KKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIC8qIEx0ICovCisgICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIExzICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIExzMiAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBScyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBSczIgKi8KKyAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KKyAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogUyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBDICovCisgICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTF1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEwgKi8KKworICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKworICAgICAgICAgICAgLyogUnQgKi8KKyAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIExzICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIExzMiAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBScyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBSczIgKi8KKyAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KKyAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogUyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBDICovCisgICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFIgKi8KKworICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIExvL1JvIGRvd25taXggKi8KKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIC8qIExvICovCisgICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMczIgKi8KKyAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KKyAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpPj4oRE9XTk1JWF9TSElGVC0xKTsgLyogUyAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDICovCisgICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTF1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEwgKi8KKworICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKworICAgICAgICAgICAgLyogUm8gKi8KKyAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzMiAqLworICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSk+PihET1dOTUlYX1NISUZULTEpOyAvKiBTICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KKyAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUiAqLworCisgICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOworICAgICAgICB9CisKKyAgICAgICAgcGVha1sxXSA9IGZpeE1heChwZWFrWzBdLCBwZWFrWzFdKTsKKworICAgICAgICAvKiBNb25vIERvd25taXggLSBmb3IgY29tcF92YWwgb25seSAqLworICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMSkgeworICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMgKi8KKyAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMyICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzMiAqLworICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLworICAgICAgICAgICAgLyppZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCAqPTAuNzA3ZjsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLworICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSk+PihET1dOTUlYX1NISUZULTEpOyAvKiBTICovCisgICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKDIqY2xldikgKi8KKyAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLworICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCisKKyAgICAgICAgICAgIHBlYWtbMV0gPSBmaXhNYXgocGVha1sxXSwgZml4cF9hYnModG1wKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTwyOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcCA9IGRyY0NvbXAtPnByZXZQZWFrW2ldOworICAgICAgZHJjQ29tcC0+cHJldlBlYWtbaV0gPSBwZWFrW2ldOworICAgICAgcGVha1tpXSA9IGZpeE1heChwZWFrW2ldLCB0bXApOworCisgICAgICAvKgorICAgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQorICAgICAgICovCisgICAgICAvKiBkZXNjYWxlZCBwZWFrIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KKyAgICAgIEZJWFBfREJMIGxkX3BlYWsgPSBDYWxjTGREYXRhKHBlYWtbaV0pICsgKEZJWFBfREJMKSgoTE9ORylET1dOTUlYX1NISUZUPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk7CisKKyAgICAgIC8qIGlmIChwZWFrIDwgMWUtNikgbGV2ZWwgPSAxZS02ZjsgKi8KKyAgICAgIGxkX3BlYWsgPSBGREttYXgobGRfcGVhaywgRkwyRlhDT05TVF9EQkwoLTAuMzExNDMwNzU4ODk1NjkwMjIwMTEyODQyNDQ2NTE0NjNmKSk7CisKKyAgICAgIC8qIHBlYWtbaV0gPSAyMCAqIGxvZyhwZWFrW2ldKS9sb2coMTApICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKKyAgICAgICAqIHBlYWtbaV0gPSAyMCAqIGxvZygyKS9sb2coMTApICogbGQocGVha1tpXSkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQorICAgICAgICogcGVha1tpXSA9IDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQocGVha1tpXSkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQorICAgICAgICoKKyAgICAgICAqICAgIGFkZGl0aW9uYWwgc2NhbGluZyB3aXRoIE1FVEFEQVRBX0ZSQUNUX0JJVFM6CisgICAgICAgKiBwZWFrW2ldID0gKDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKSAqIDY0ICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykpKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKQorICAgICAgICogcGVha1tpXSA9IDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KHBlYWtbaV0pCisgICAgICAgKiAgICAgICAgICsgMC4yZioyXigtTUVUQURBVEFfRlJBQ1RfQklUUykgKyBkcmNDb21wLT5zbW9vdGhHYWluW2ldCisgICAgICAgKi8KKyAgICAgIHBlYWtbaV0gPSBmTXVsdCgoRklYUF9EQkwpKDEwPDwoTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSksIGZNdWx0KCBGTDJGWF9EQkwoMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ZiksIGxkX3BlYWspKTsKKyAgICAgIHBlYWtbaV0gKz0gKEZMMkZYX0RCTCgwLjVmKT4+TUVUQURBVEFfSU5UX0JJVFMpOyAgICAgICAgICAgLyogYWRkIGEgbGl0dGxlIGJpdCBoZWFkcm9vbSAqLworICAgICAgcGVha1tpXSArPSAgZHJjQ29tcC0+c21vb3RoR2FpbltpXTsKKyAgICB9CisKKyAgICAvKiBwZWFrIC09IGRpYWxub3JtICsgMzE7ICovICAvKiB0aGlzIGlzIERvbGJ5IHN0eWxlIG9ubHkgKi8KKyAgICBwZWFrWzBdIC09IChGSVhQX0RCTCkoKGRpYWxub3JtLWRyY19UYXJnZXRSZWZMZXZlbCk8PChNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7IC8qIHBlYWtbMF0gLT0gZGlhbG5vcm0gLSBkcmNfVGFyZ2V0UmVmTGV2ZWwgKi8KKworICAgIC8qIHBlYWsgKz0gMTE7ICovICAgLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovICAgICAgLyogUkYgbW9kZSBvdXRwdXQgaXMgMTFkQiBoaWdoZXIgKi8KKyAgICAvKnBlYWsgKz0gY29tcF9UYXJnZXRSZWZMZXZlbCAtIGRyY19UYXJnZXRSZWZMZXZlbDsqLworICAgIHBlYWtbMV0gLT0gKEZJWFBfREJMKSgoZGlhbG5vcm0tY29tcF9UYXJnZXRSZWZMZXZlbCk8PChNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7IC8qIHBlYWtbMV0gLT0gZGlhbG5vcm0gLSBjb21wX1RhcmdldFJlZkxldmVsICovCisKKyAgICAvKiBsaW1pdGVyIGdhaW4gKi8KKyAgICBkcmNDb21wLT5saW1HYWluWzBdICs9IGRyY0NvbXAtPmxpbURlY2F5OyAgICAgICAgICAgICAgIC8qIGxpbmVhciBsaW1pdGVyIHJlbGVhc2UgKi8KKyAgICBkcmNDb21wLT5saW1HYWluWzBdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMF0sIC1wZWFrWzBdKTsKKworICAgIGRyY0NvbXAtPmxpbUdhaW5bMV0gKz0gMipkcmNDb21wLT5saW1EZWNheTsgICAgICAgICAgICAgLyogbGluZWFyIGxpbWl0ZXIgcmVsZWFzZSAqLworICAgIGRyY0NvbXAtPmxpbUdhaW5bMV0gPSBmaXhNaW4oZHJjQ29tcC0+bGltR2FpblsxXSwgLXBlYWtbMV0pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBhcHBseSBsaW1pdGluZywgcmV0dXJuIERSQyBnYWlucyovCisgICAgeworICAgICAgICBGSVhQX0RCTCB0bXA7CisKKyAgICAgICAgdG1wID0gZHJjQ29tcC0+c21vb3RoR2FpblswXTsKKyAgICAgICAgaWYgKGRyY0NvbXAtPmxpbUdhaW5bMF0gPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMF07CisgICAgICAgIH0KKyAgICAgICAgKnBEeW5ybmcgPSAoTE9ORykgc2NhbGVWYWx1ZSh0bXAsIC0oTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOworCisgICAgICAgIHRtcCA9IGRyY0NvbXAtPnNtb290aEdhaW5bMV07CisgICAgICAgIGlmIChkcmNDb21wLT5saW1HYWluWzFdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICAgIHRtcCArPSBkcmNDb21wLT5saW1HYWluWzFdOworICAgICAgICB9CisgICAgICAgICpwQ29tcHIgID0gKExPTkcpIHNjYWxlVmFsdWUodG1wLCAtKE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKQoreworICAgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzBdOworfQorCitEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXRDb21wUHJvZmlsZShjb25zdCBIRFJDX0NPTVAgZHJjQ29tcCkKK3sKKyAgICByZXR1cm4gZHJjQ29tcC0+cHJvZmlsZVsxXTsKK30KKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmggYi9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2MzliNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL21ldGFkYXRhX2NvbXByZXNzb3IuaApAQCAtMCwwICsxLDI1MiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgQUFDIEVuY29kZXIgbGliICAqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBNLiBOZXVzaW5nZXIKKyAgIERlc2NyaXB0aW9uOiBDb21wcmVzc29yIGZvciBBQUMgTWV0YWRhdGEgR2VuZXJhdG9yCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTUVUQURBVEFfQ09NUFJFU1NPUl9ICisjZGVmaW5lIF9NRVRBREFUQV9DT01QUkVTU09SX0gKKworCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiYWFjZW5jLmgiCisKKworLyoqCisgKiAgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGVzLgorICovCit0eXBlZGVmIGVudW0gRFJDX1BST0ZJTEUgeworICBEUkNfTk9ORSAgICAgICAgICA9IDAsCisgIERSQ19GSUxNU1RBTkRBUkQgID0gMSwKKyAgRFJDX0ZJTE1MSUdIVCAgICAgPSAyLAorICBEUkNfTVVTSUNTVEFOREFSRCA9IDMsCisgIERSQ19NVVNJQ0xJR0hUICAgID0gNCwKKyAgRFJDX1NQRUVDSCAgICAgICAgPSA1LAorICBEUkNfREVMQVlfVEVTVCAgICA9IDYKKworfSBEUkNfUFJPRklMRTsKKworCisvKioKKyAqICBEUkMgQ29tcHJlc3NvciBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IERSQ19DT01QICBEUkNfQ09NUCwgKkhEUkNfQ09NUDsKKworLyoqCisgKiBcYnJpZWYgIE9wZW4gYSBEUkMgQ29tcHJlc3NvciBpbnN0YW5jZS4KKyAqCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgY29tcHJlc3NvciBpbnN0YW5jZS4KKyAqCisgKiBccGFyYW0gcGhEcmNDb21wICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIGNvbXByZXNzb3IgaGFuZGxlLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSAwLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZS4KKyAqLworSU5UIEZES19EUkNfR2VuZXJhdG9yX09wZW4oCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIENsb3NlIHRoZSBEUkMgQ29tcHJlc3NvciBpbnN0YW5jZS4KKyAqCisgKiBEZWFsbG9jYXRlIGluc3RhbmNlIGFuZCBmcmVlIHdob2xlIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gcGhEcmNDb21wICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvbXByZXNzb3IgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzLgorICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUuCisgKi8KK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgKKyAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICpwaERyY0NvbXAKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgIENvbmZpZ3VyZSBEUkMgQ29tcHJlc3Nvci4KKyAqCisgKiBccGFyYW0gZHJjQ29tcCAgICAgICAgICAgICAgIENvbXByZXNzb3IgaGFuZGxlLgorICogXHBhcmFtIHByb2ZpbGVMaW5lICAgICAgICAgICBEUkMgcHJvZmlsZSBmb3IgbGluZSBtb2RlLgorICogXHBhcmFtIHByb2ZpbGVSRiAgICAgICAgICAgICBEUkMgcHJvZmlsZSBmb3IgUkYgbW9kZS4KKyAqIFxwYXJhbSBibG9ja0xlbmd0aCAgICAgICAgICAgTGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2sgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIei4KKyAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgQ2hhbm5lbCBjb25maWd1cmF0aW9uLgorICogXHBhcmFtIGNoYW5uZWxPcmRlciAgICAgICAgICBDaGFubmVsIG9yZGVyLCBNUEVHIG9yIFdBVi4KKyAqIFxwYXJhbSB1c2VXZWlnaHRpbmcgICAgICAgICAgVXNlIHdlaWdodGluZyBmaWx0ZXIgZm9yIGxvdWRuZXNzIGNhbGN1bGF0aW9uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSAwLCBvbiBzdWNjZXNzLAorICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUKKyAqLworSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKKyAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKKyAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tMZW5ndGgsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKKyAgICAgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiAgICAgICAgICAgICBjaGFubmVsT3JkZXIsCisgICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICAgICAgdXNlV2VpZ2h0aW5nCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICBDYWxjdWxhdGUgRFJDIENvbXByZXNzb3IgR2Fpbi4KKyAqCisgKiBccGFyYW0gZHJjQ29tcCAgICAgICAgICAgICAgIENvbXByZXNzb3IgaGFuZGxlLgorICogXHBhcmFtIGluU2FtcGxlcyAgICAgICAgICAgICBQb2ludGVyIHRvIGludGVybGVhdmVkIGlucHV0IGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gZGlhbG5vcm0gICAgICAgICAgICAgIERpYWxvZyBMZXZlbCBpbiBkQiAodHlwaWNhbGx5IC0zMS4uLi0xKS4KKyAqIFxwYXJhbSBkcmNfVGFyZ2V0UmVmTGV2ZWwKKyAqIFxwYXJhbSBjb21wX1RhcmdldFJlZkxldmVsCisgKiBccGFyYW0gY2xldiAgICAgICAgICAgICAgICAgIERvd25taXggY2VudGVyIG1peCBmYWN0b3IgKHR5cGljYWxseSAwLjcwNywgMC41OTUgb3IgMC41KQorICogXHBhcmFtIHNsZXYgICAgICAgICAgICAgICAgICBEb3dubWl4IHN1cnJvdW5kIG1peCBmYWN0b3IgKHR5cGljYWxseSAwLjcwNywgMC41LCBvciAwKQorICogXHBhcmFtIGR5bnJuZyAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2VpdmluZyBsaW5lIG1vZGUgRFJDIGdhaW4gaW4gZEIKKyAqIFxwYXJhbSBjb21wciAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgUkYgbW9kZSBEUkMgZ2FpbiBpbiBkQgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzcywKKyAqICAgICAgICAgIC0gdW5lcXVhbCAwLCBvbiBmYWlsdXJlCisgKi8KK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DYWxjKAorICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCisgICAgICAgIGNvbnN0IElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgaW5TYW1wbGVzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGRpYWxub3JtLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGRyY19UYXJnZXRSZWZMZXZlbCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBjb21wX1RhcmdldFJlZkxldmVsLAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIGNsZXYsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICAgICAgc2xldiwKKyAgICAgICAgSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBkeW5ybmcsCisgICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgY29tcHIKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgQ29uZmlndXJlIERSQyBDb21wcmVzc29yIFByb2ZpbGUuCisgKgorICogXHBhcmFtIGRyY0NvbXAgICAgICAgICAgICAgICBDb21wcmVzc29yIGhhbmRsZS4KKyAqIFxwYXJhbSBwcm9maWxlTGluZSAgICAgICAgICAgRFJDIHByb2ZpbGUgZm9yIGxpbmUgbW9kZS4KKyAqIFxwYXJhbSBwcm9maWxlUkYgICAgICAgICAgICAgRFJDIHByb2ZpbGUgZm9yIFJGIG1vZGUuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSAwLCBvbiBzdWNjZXNzLAorICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUKKyAqLworSU5UIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKKyAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKKyAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgR2V0IERSQyBwcm9maWxlIGZvciBsaW5lIG1vZGUuCisgKgorICogXHBhcmFtIGRyY0NvbXAgICAgICAgICAgICAgICBDb21wcmVzc29yIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICBDdXJyZW50IFByb2ZpbGUuCisgKi8KK0RSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoCisgICAgICAgIGNvbnN0IEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgZHJjQ29tcAorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmICBHZXQgRFJDIHByb2ZpbGUgZm9yIFJGIG1vZGUuCisgKgorICogXHBhcmFtIGRyY0NvbXAgICAgICAgICAgICAgICBDb21wcmVzc29yIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICBDdXJyZW50IFByb2ZpbGUuCisgKi8KK0RSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKAorICAgICAgICBjb25zdCBIRFJDX0NPTVAgICAgICAgICAgICAgICAgIGRyY0NvbXAKKyAgICAgICAgKTsKKworCisjZW5kaWYgLyogX01FVEFEQVRBX0NPTVBSRVNTT1JfSCAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjA3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmNwcApAQCAtMCwwICsxLDg3MSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgQUFDIEVuY29kZXIgbGliICAqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBWLiBCYWNpZ2FsdXBvCisgICBEZXNjcmlwdGlvbjogTWV0YWRhdGEgRW5jb2RlciBsaWJyYXJ5IGludGVyZmFjZSBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJtZXRhZGF0YV9tYWluLmgiCisjaW5jbHVkZSAibWV0YWRhdGFfY29tcHJlc3Nvci5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1BWF9EUkNfQkFORFMgICAgICAgICgxPDw0KQorI2RlZmluZSBNQVhfRFJDX0NIQU5ORUxTICAgICAgICAoOCkKKyNkZWZpbmUgTUFYX0RSQ19GUkFNRUxFTiAgICgyKjEwMjQpCisKKy8qLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IEFBQ19NRVRBREFUQQoreworICAvKiBNUEVHOiBEeW5hbWljIFJhbmdlIENvbnRyb2wgKi8KKyAgc3RydWN0IHsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX3JlZl9sZXZlbF9wcmVzZW50OworICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfcmVmX2xldmVsOworCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHluX3JuZ19zZ25bTUFYX0RSQ19CQU5EU107CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHluX3JuZ19jdGxbTUFYX0RSQ19CQU5EU107CisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfYmFuZHNfcHJlc2VudDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfYmFuZF9pbmNyOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19iYW5kX3RvcFtNQVhfRFJDX0JBTkRTXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWU7CisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFICAgZHJjX3Byb2ZpbGU7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX1RhcmdldFJlZkxldmVsOyAgICAvKiB1c2VkIGZvciBMaW1pdGVyICovCisKKyAgICAvKiBleGNsdWRlZCBjaGFubmVscyAqLworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkX2NobnNfcHJlc2VudDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX21hc2tbMl07ICAgICAgIC8qIE1BWF9OVU1CRVJfQ0hBTk5FTFMvOCAqLworICB9IG1wZWdEcmM7CisKKyAgLyogRVRTSTogYWRkdGwgYW5jaWxsYXJ5IGRhdGEgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBIZWF2eSBDb21wcmVzc2lvbiAqLworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX29uOyAgICAgICAgLyogZmxhZywgaWYgY29tcHJlc3Npb24gdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbl92YWx1ZTsgICAgIC8qIGNvbXByZXNzaW9uIHZhbHVlICovCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFICAgY29tcF9wcm9maWxlOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWw7ICAgLyogdXNlZCBmb3IgTGltaXRlciAqLworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb2RlX2NvYXJzZV9zdGF0dXM7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWNvZGVfZmluZV9zdGF0dXM7CisgIH0gZXRzaUFuY0RhdGE7CisKKyAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyTWl4TGV2ZWw7ICAgICAgICAgIC8qIGNlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZE1peExldmVsOyAgICAgICAgLyogc3Vycm91bmQgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVQQ0VNaXhEd25JZHg7ICAgICAgIC8qIGZsYWcgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgRG14THZsX09uOyAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KKworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkb2xieVN1cnJvdW5kTW9kZTsKKworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgbWV0YSBkYXRhIG1vZGUgaW4gY3VycmVudCBmcmFtZSAoZGVsYXkgbGluZSkgKi8KKworfSBBQUNfTUVUQURBVEE7CisKK3N0cnVjdCBGREtfTUVUQURBVEFfRU5DT0RFUgoreworICBJTlQgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlOworICBIRFJDX0NPTVAgICAgICAgICAgaERyY0NvbXA7CisgIEFBQ0VOQ19NZXRhRGF0YSAgICBzdWJtaXR0ZWRNZXRhRGF0YTsKKworICBJTlQgICAgICAgICAgICAgICAgbkF1ZGlvRGF0YURlbGF5OworICBJTlQgICAgICAgICAgICAgICAgbk1ldGFEYXRhRGVsYXk7CisgIElOVCAgICAgICAgICAgICAgICBuQ2hhbm5lbHM7CisKKyAgSU5UX1BDTSAgICAgICAgICAgIGF1ZGlvRGVsYXlCdWZmZXJbTUFYX0RSQ19DSEFOTkVMUypNQVhfRFJDX0ZSQU1FTEVOXTsKKyAgaW50ICAgICAgICAgICAgICAgIGF1ZGlvRGVsYXlJZHg7CisKKyAgQUFDX01FVEFEQVRBICAgICAgIG1ldGFEYXRhQnVmZmVyWzNdOworICBpbnQgICAgICAgICAgICAgICAgbWV0YURhdGFEZWxheUlkeDsKKworICBVQ0hBUiAgICAgICAgICAgICAgZHJjSW5mb1BheWxvYWRbMTJdOworICBVQ0hBUiAgICAgICAgICAgICAgZHJjRHNlUGF5bG9hZFs4XTsKKworICBJTlQgICAgICAgICAgICAgICAgbWF0cml4X21peGRvd25faWR4OworICBBQUNFTkNfRVhUX1BBWUxPQUQgZXhQYXlsb2FkWzJdOworICBJTlQgICAgICAgICAgICAgICAgbkV4dGVuc2lvbnM7CisKKyAgSU5UICAgICAgICAgICAgICAgIGZpbmFsaXplTWV0YURhdGE7ICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IHN3aXRjaCBvZmYgYnkgb25lIGZyYW1lIGFuZCB3cml0ZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsaXplIHRoZSBtZXRhZGF0YSBzZXR1cC4gKi8KK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgY29uc3QgQUFDRU5DX01ldGFEYXRhIGRlZmF1bHRNZXRhRGF0YVNldHVwID0geworICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9ORSwKKyAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkUsCisgICAgLSgzMTw8MTYpLAorICAgIC0oMzE8PDE2KSwKKyAgICAwLAorICAgIC0oMzE8PDE2KSwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBkbXhUYWJsZVs4XSA9IHsKKyAgICAoKEZJWFBfREJMKU1BWFZBTF9EQkwpLCBGTDJGWENPTlNUX0RCTCgwLjg0MWYpLCBGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCBGTDJGWENPTlNUX0RCTCgwLjU5NmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTAwZiksIEZMMkZYQ09OU1RfREJMKDAuNDIyZiksIEZMMkZYQ09OU1RfREJMKDAuMzU1ZiksIEZMMkZYQ09OU1RfREJMKDAuMDAwZikKK307CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdXJtaXgybWF0cml4X21peGRvd25faWR4WzhdID0geworICAgIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMKK307CisKKworLyotLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgV3JpdGVNZXRhZGF0YVBheWxvYWQoCisgICAgICAgIGNvbnN0IEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEsCisgICAgICAgIGNvbnN0IEFBQ19NRVRBREFUQSAqIGNvbnN0ICBwTWV0YWRhdGEKKyAgICAgICAgKTsKKworc3RhdGljIElOVCBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKAorICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAorICAgICAgICApOworCitzdGF0aWMgSU5UIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKAorICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAorICAgICAgICApOworCitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIENvbXBlbnNhdGVBdWRpb0RlbGF5KAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhRW5jLAorICAgICAgICBJTlRfUENNICogY29uc3QgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMKKyAgICAgICAgKTsKKworc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqICAgY29uc3QgaE1ldGFkYXRhLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCisgICAgICAgIEFBQ19NRVRBREFUQSAqIGNvbnN0ICAgICAgICAgICAgcEFhY01ldGFEYXRhCisgICAgICAgICk7CisKK3N0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgUHJvY2Vzc0NvbXByZXNzb3IoCisgICAgICAgIEFBQ19NRVRBREFUQSAgICAgICAgICAgICAgICAgICAgKnBNZXRhZGF0YSwKKyAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICAgaERyY0NvbXAsCisgICAgICAgIGNvbnN0IElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgIHBTYW1wbGVzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICBuU2FtcGxlcworICAgICAgICApOworCisvKi0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBEUkNfUFJPRklMRSBjb252ZXJ0UHJvZmlsZShBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgYWFjUHJvZmlsZSkKK3sKKyAgICBEUkNfUFJPRklMRSBkcmNQcm9maWxlID0gRFJDX05PTkU7CisKKyAgICBzd2l0Y2goYWFjUHJvZmlsZSkgeworICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkU6ICAgICAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTVNUQU5EQVJEOiAgZHJjUHJvZmlsZSA9IERSQ19GSUxNU1RBTkRBUkQ7ICBicmVhazsKKyAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQ6ICAgICBkcmNQcm9maWxlID0gRFJDX0ZJTE1MSUdIVDsgICAgIGJyZWFrOworICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDU1RBTkRBUkQ6IGRyY1Byb2ZpbGUgPSBEUkNfTVVTSUNTVEFOREFSRDsgYnJlYWs7CisgICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNMSUdIVDogICAgZHJjUHJvZmlsZSA9IERSQ19NVVNJQ0xJR0hUOyAgICBicmVhazsKKyAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19TUEVFQ0g6ICAgICAgICBkcmNQcm9maWxlID0gRFJDX1NQRUVDSDsgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkcmNQcm9maWxlOworfQorCisKKy8qIGNvbnZlcnQgZGlhbG9nIG5vcm1hbGl6YXRpb24gdG8gcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgKi8KKy8qIE5PVEU6IHRoaXMgb25seSBpcyBjb3JyZWN0LCBpZiB0aGUgZGVjb2RlciB0YXJnZXQgbGV2ZWwgaXMgc2V0IHRvIC0zMWRCIGZvciBsaW5lIG1vZGUgLyAtMjBkQiBmb3IgUkYgbW9kZSAqLworc3RhdGljIFVDSEFSIGRpYWxub3JtMnByb2dyZWZsdmwoY29uc3QgSU5UIGQpCit7CisgICAgcmV0dXJuICgoVUNIQVIpRkRLbWF4KDAsIEZES21pbigoLWQgKyAoMTw8MTMpKSA+PiAxNCwgMTI3KSkpOworfQorCisvKiBjb252ZXJ0IHByb2dyYW0gcmVmZXJlbmNlIGxldmVsIHRvIGRpYWxvZyBub3JtYWxpemF0aW9uICovCitzdGF0aWMgSU5UIHByb2dyZWZsdmwyZGlhbG5vcm0oY29uc3QgVUNIQVIgcCkKK3sKKyAgICByZXR1cm4gLSgoSU5UKShwPDwoMTYtMikpKTsKK30KKworLyogZW5jb2RlIGRvd25taXggbGV2ZWxzIHRvIERvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCitzdGF0aWMgU0NIQVIgZW5jb2RlRG14THZscyhjb25zdCBTQ0hBUiBjbWl4bGV2LCBjb25zdCBTQ0hBUiBzdXJtaXhsZXYpCit7CisgICAgU0NIQVIgZG14THZscyA9IDA7CisgICAgZG14THZscyB8PSAweDgwIHwgKGNtaXhsZXYgPDwgNCk7IC8qIGNlbnRlcl9taXhfbGV2ZWxfb24gKi8KKyAgICBkbXhMdmxzIHw9IDB4MDggfCBzdXJtaXhsZXY7ICAgICAgLyogc3Vycm91bmRfbWl4X2xldmVsX29uICovCisKKyAgICByZXR1cm4gZG14THZsczsKK30KKworLyogZW5jb2RlIEFBQyBEUkMgZ2FpbiAoSVNPL0lFQyAxNDQ5Ni0zOjIwMDUgIDQuNS4yLjcpICovCitzdGF0aWMgdm9pZCBlbmNvZGVEeW5ybmcoSU5UIGdhaW4sIFVDSEFSKiBjb25zdCBkeW5fcm5nX2N0bCwgVUNIQVIqIGNvbnN0IGR5bl9ybmdfc2duICkKK3sKKyAgICBpZihnYWluIDwgMCkKKyAgICB7CisgICAgICAqZHluX3JuZ19zZ24gPSAxOworICAgICAgZ2FpbiA9IC1nYWluOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKmR5bl9ybmdfc2duID0gMDsKKyAgICB9CisgICAgZ2FpbiA9IEZES21pbihnYWluLCgxMjc8PDE0KSk7CisKKyAgICAqZHluX3JuZ19jdGwgPSAoVUNIQVIpKChnYWluICsgKDE8PDEzKSkgPj4gMTQpOworfQorCisvKiBkZWNvZGUgQUFDIERSQyBnYWluIChJU08vSUVDIDE0NDk2LTM6MjAwNSAgNC41LjIuNykgKi8KK3N0YXRpYyBJTlQgZGVjb2RlRHlucm5nKGNvbnN0IFVDSEFSIGR5bl9ybmdfY3RsLCBjb25zdCBVQ0hBUiBkeW5fcm5nX3NnbikKK3sKKyAgICBJTlQgdG1wID0gKChJTlQpZHluX3JuZ19jdGwgPDwgKDE2LTIpKTsKKyAgICBpZiAoZHluX3JuZ19zZ24pIHRtcCA9IC10bXA7CisKKyAgICByZXR1cm4gdG1wOworfQorCisvKiBlbmNvZGUgQUFDIGNvbXByZXNzaW9uIHZhbHVlIChFVFNJIFRTIDEwMSAxNTQgcGFnZSA5OSkgKi8KK3N0YXRpYyBVQ0hBUiBlbmNvZGVDb21wcihJTlQgZ2FpbikKK3sKKyAgICBVQ0hBUiB4LCB5OworICAgIElOVCB0bXA7CisKKyAgICAvKiB0bXAgPSAoaW50KSgoNDguMTY0ZiAtIGdhaW4pIC8gNi4wMjA2ZiAqIDE1ICsgMC41Zik7ICovCisgICAgdG1wID0gKCgzMTU2NDc2IC0gZ2FpbikgKiAxNSArIDE5NzI4MykgLyAzOTQ1NjY7CisKKyAgICBpZiAodG1wID49IDI0MCkgeworICAgICAgICByZXR1cm4gMHhGRjsKKyAgICB9CisgICAgZWxzZSBpZiAodG1wIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHggPSB0bXAgLyAxNTsKKyAgICAgICAgeSA9IHRtcCAlIDE1OworICAgIH0KKworICAgIHJldHVybiAoeCA8PCA0KSB8IHk7Cit9CisKKy8qIGRlY29kZSBBQUMgY29tcHJlc3Npb24gdmFsdWUgKEVUU0kgVFMgMTAxIDE1NCBwYWdlIDk5KSAqLworc3RhdGljIElOVCBkZWNvZGVDb21wcihjb25zdCBVQ0hBUiBjb21wcikKK3sKKyAgICBJTlQgZ2FpbjsKKyAgICBTQ0hBUiB4ID0gY29tcHIgPj4gNDsgICAgIC8qIDQgTVNCIG9mIGNvbXByICovCisgICAgVUNIQVIgeSA9IChjb21wciAmIDB4MEYpOyAvKiA0IExTQiBvZiBjb21wciAqLworCisgICAgLyogZ2FpbiA9IChJTlQpKCg0OC4xNjRmIC0gNi4wMjA2ZiAqIHggLSAwLjQwMTRmICogeSkgKTsgKi8KKyAgICBnYWluID0gKElOVCkoIHNjYWxlVmFsdWUoKChMT05HKUZMMkZYQ09OU1RfREJMKDYuMDIwNmYvMTI4LmYpKig4LXgpIC0gKExPTkcpRkwyRlhDT05TVF9EQkwoMC40MDE0Zi8xMjguZikqeSksIC0oREZSQUNUX0JJVFMtMS03LTE2KSkgKTsKKworICAgIHJldHVybiBnYWluOworfQorCisKK0ZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfT3BlbigKKyAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFEYXRhCisgICAgICAgICkKK3sKKyAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSA9IE5VTEw7CisKKyAgICBpZiAocGhNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBoTWV0YURhdGEgPSAoSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSKSBGREtjYWxsb2MoMSwgc2l6ZW9mKEZES19NRVRBREFUQV9FTkNPREVSKSApOworCisgICAgaWYgKGhNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLCBzaXplb2YoRkRLX01FVEFEQVRBX0VOQ09ERVIpKTsKKworICAgIC8qIEFsbG9jYXRlIERSQyBDb21wcmVzc29yLiAqLworICAgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9PcGVuKCZoTWV0YURhdGEtPmhEcmNDb21wKSE9MCkgeworICAgICAgZXJyID0gTUVUQURBVEFfTUVNT1JZX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIFJldHVybiBtZXRhZGF0YSBpbnN0YW5jZSAqLworICAgICpwaE1ldGFEYXRhID0gaE1ldGFEYXRhOworCisgICAgcmV0dXJuIGVycjsKKworYmFpbDoKKyAgICBGREtfTWV0YWRhdGFFbmNfQ2xvc2UoJmhNZXRhRGF0YSk7CisgICAgcmV0dXJuIGVycjsKK30KKworRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19DbG9zZSgKKyAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFEYXRhCisgICAgICAgICkKK3sKKyAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisKKyAgICBpZiAocGhNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoKnBoTWV0YURhdGEgIT0gTlVMTCkgeworICAgICAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJigqcGhNZXRhRGF0YSktPmhEcmNDb21wKTsKKyAgICAgIEZES2ZyZWUoKnBoTWV0YURhdGEpOworICAgICAgKnBoTWV0YURhdGEgPSBOVUxMOworICAgIH0KK2JhaWw6CisgICAgcmV0dXJuIGVycjsKK30KKworRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19Jbml0KAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZXMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBhdWRpb0RlbGF5LAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgICAgICAgICAgY2hhbm5lbE1vZGUsCisgICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICBjaGFubmVsT3JkZXIKKyAgICAgICAgKQoreworICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKyAgICBpbnQgaSwgbkZyYW1lcywgZGVsYXk7CisKKyAgICBpZiAoaE1ldGFEYXRhPT1OVUxMKSB7CisgICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmUgdmFsdWVzIGZvciBkZWxheSBjb21wZW5zYXRpb24uICovCisgICAgZm9yIChuRnJhbWVzPTAsIGRlbGF5PWF1ZGlvRGVsYXktZnJhbWVMZW5ndGg7IGRlbGF5PjA7IGRlbGF5LT1mcmFtZUxlbmd0aCwgbkZyYW1lcysrKTsKKworICAgIGlmICggKGhNZXRhRGF0YS0+bkNoYW5uZWxzPk1BWF9EUkNfQ0hBTk5FTFMpIHx8ICgoLWRlbGF5KT5NQVhfRFJDX0ZSQU1FTEVOKSApIHsKKyAgICAgIGVyciA9IE1FVEFEQVRBX0lOSVRfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2V0dXAuICovCisgICAgRkRLbWVtY3B5KCZoTWV0YURhdGEtPnN1Ym1pdHRlZE1ldGFEYXRhLCAmZGVmYXVsdE1ldGFEYXRhU2V0dXAsICBzaXplb2YoQUFDRU5DX01ldGFEYXRhKSk7CisKKyAgICBoTWV0YURhdGEtPmZpbmFsaXplTWV0YURhdGEgPSAwOyAvKiBmaW5hbGl6ZSBtZXRhIGRhdGEgb25seSB3aGlsZSBvbi9vZmYgc3dpdGNoaW5nLCBlbHNlIGRpc2FibGVkICovCisKKyAgICAvKiBSZXNldCBkZWxheSBsaW5lcy4gKi8KKyAgICBpZiAoIHJlc2V0U3RhdGVzIHx8IChoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSE9LWRlbGF5KSB8fCAoaE1ldGFEYXRhLT5uQ2hhbm5lbHMhPShJTlQpbkNoYW5uZWxzKSApCisgICAgeworICAgICAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLT5hdWRpb0RlbGF5QnVmZmVyLCBzaXplb2YoaE1ldGFEYXRhLT5hdWRpb0RlbGF5QnVmZmVyKSk7CisgICAgICBGREttZW1jbGVhcihoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyLCBzaXplb2YoaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlcikpOworICAgICAgaE1ldGFEYXRhLT5hdWRpb0RlbGF5SWR4ID0gMDsKKyAgICAgIGhNZXRhRGF0YS0+bWV0YURhdGFEZWxheUlkeCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogRW5hYmxlIG1ldGEgZGF0YS4gKi8KKyAgICAgIGlmICggKGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlPT0wKSAmJiAobWV0YWRhdGFNb2RlIT0wKSApIHsKKyAgICAgICAgLyogZGlzYWJsZSBtZXRhIGRhdGEgaW4gYWxsIGRlbGF5IGxpbmVzICovCisgICAgICAgIGZvciAoaT0wOyBpPChpbnQpKHNpemVvZihoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyKS9zaXplb2YoQUFDX01FVEFEQVRBKSk7IGkrKykgeworICAgICAgICAgIExvYWRTdWJtaXR0ZWRNZXRhZGF0YSgmaE1ldGFEYXRhLT5zdWJtaXR0ZWRNZXRhRGF0YSwgbkNoYW5uZWxzLCAwLCAmaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlcltpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBtZXRhIGRhdGEuKi8KKyAgICAgIGlmICggKGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlIT0wKSAmJiAobWV0YWRhdGFNb2RlPT0wKSApIHsKKyAgICAgICAgaE1ldGFEYXRhLT5maW5hbGl6ZU1ldGFEYXRhID0gaE1ldGFEYXRhLT5tZXRhZGF0YU1vZGU7CisgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBkZWxheS4gKi8KKyAgICBoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSA9IC1kZWxheTsKKyAgICBoTWV0YURhdGEtPm5NZXRhRGF0YURlbGF5ICA9IG5GcmFtZXM7CisgICAgaE1ldGFEYXRhLT5uQ2hhbm5lbHMgICAgICAgPSBuQ2hhbm5lbHM7CisgICAgaE1ldGFEYXRhLT5tZXRhZGF0YU1vZGUgICAgPSBtZXRhZGF0YU1vZGU7CisKKyAgICAvKiBJbml0aWFsaXplIGNvbXByZXNzb3IuICovCisgICAgaWYgKG1ldGFkYXRhTW9kZSAhPSAwKSB7CisgICAgICAgIGlmICggRkRLX0RSQ19HZW5lcmF0b3JfSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGEtPmhEcmNDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSBNRVRBREFUQV9JTklUX0VSUk9SOworICAgICAgICB9CisgICAgfQorYmFpbDoKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFByb2Nlc3NDb21wcmVzc29yKAorICAgICAgICBBQUNfTUVUQURBVEEgICAgICAgICAgICAgICAgICAgICpwTWV0YWRhdGEsCisgICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgIGhEcmNDb21wLAorICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgICBwU2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXMKKyAgICAgICAgKQoreworICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKworICAgIElOVCBkeW5ybmcsIGNvbXByOworICAgIERSQ19QUk9GSUxFIHByb2ZpbGVEcmMgID0gY29udmVydFByb2ZpbGUocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlKTsKKyAgICBEUkNfUFJPRklMRSBwcm9maWxlQ29tcCA9IGNvbnZlcnRQcm9maWxlKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlKTsKKworICAgIGlmICggKHBNZXRhZGF0YT09TlVMTCkgfHwgKGhEcmNDb21wPT1OVUxMKSApIHsKKyAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBmaXJzdCwgY2hlY2sgaWYgcHJvZmlsZSBpcyBzYW1lIGFzIGxhc3QgZnJhbWUKKyAgICAgKiBvdGhlcndpc2UsIHVwZGF0ZSBzZXR1cCAqLworICAgIGlmICggKHByb2ZpbGVEcmMgIT0gRkRLX0RSQ19HZW5lcmF0b3JfZ2V0RHJjUHJvZmlsZShoRHJjQ29tcCkpCisgICAgICB8fCAocHJvZmlsZUNvbXAgIT0gRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoaERyY0NvbXApKSApCisgICAgeworICAgICAgRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZShoRHJjQ29tcCwgcHJvZmlsZURyYywgcHJvZmlsZUNvbXApOworICAgIH0KKworICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgIGlmIChwcm9maWxlQ29tcCA9PSBEUkNfTk9ORSkgeworICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSA9IDB4ODA7ICAvKiB0byBlbnN1cmUgbm8gZXh0ZXJuYWwgdmFsdWVzIHdpbGwgYmUgd3JpdHRlbiBpZiBub3QgY29uZmlndXJlZCAqLworICAgIH0KKworICAgIC8qIGluIGNhc2Ugb2YgZW1iZWRkaW5nIGV4dGVybmFsIHZhbHVlcywgY29weSB0aGlzIG5vdyAobGltaXRlciBtYXkgb3ZlcndyaXRlIHRoZW0pICovCisgICAgZHlucm5nID0gZGVjb2RlRHlucm5nKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFswXSwgcE1ldGFkYXRhLT5tcGVnRHJjLmR5bl9ybmdfc2duWzBdKTsKKyAgICBjb21wciAgPSBkZWNvZGVDb21wcihwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX3ZhbHVlKTsKKworICAgIC8qIENhbGwgY29tcHJlc3NvciAqLworICAgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9DYWxjKGhEcmNDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVmbHZsMmRpYWxub3JtKHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG14VGFibGVbcE1ldGFkYXRhLT5jZW50ZXJNaXhMZXZlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR5bnJuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcikgIT0gMCkKKyAgICB7CisgICAgICBlcnIgPSBNRVRBREFUQV9FTkNPREVfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogV3JpdGUgRFJDIHZhbHVlcyAqLworICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZF9pbmNyID0gMDsKKyAgICBlbmNvZGVEeW5ybmcoZHlucm5nLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGwsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3Nnbik7CisgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSA9IGVuY29kZUNvbXByKGNvbXByKTsKKworYmFpbDoKKyAgICByZXR1cm4gZXJyOworfQorCitGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX1Byb2Nlc3MoCisgICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgIGhNZXRhRGF0YUVuYywKKyAgICAgICAgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhICogY29uc3QgICAgcE1ldGFkYXRhLAorICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKiogICAgICAgICAgICBwcE1ldGFEYXRhRXh0UGF5bG9hZCwKKyAgICAgICAgVUlOVCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1ldGFEYXRhRXh0ZW5zaW9ucywKKyAgICAgICAgSU5UICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X21peGRvd25faWR4CisgICAgICAgICkKK3sKKyAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgaW50IG1ldGFEYXRhRGVsYXlXcml0ZUlkeCwgbWV0YURhdGFEZWxheVJlYWRJZHgsIG1ldGFkYXRhTW9kZTsKKworICAgIC8qIFdoZXJlIHRvIHdyaXRlIG5ldyBtZXRhIGRhdGEgaW5mbyAqLworICAgIG1ldGFEYXRhRGVsYXlXcml0ZUlkeCA9IGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeDsKKworICAgIC8qIEhvdyB0byB3cml0ZSB0aGUgZGF0YSAqLworICAgIG1ldGFkYXRhTW9kZSA9IGhNZXRhRGF0YUVuYy0+bWV0YWRhdGFNb2RlOworCisgICAgLyogQ29tcGVuc2F0ZSBtZXRhIGRhdGEgZGVsYXkuICovCisgICAgaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4Kys7CisgICAgaWYgKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCA+IGhNZXRhRGF0YUVuYy0+bk1ldGFEYXRhRGVsYXkpIGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCA9IDA7CisKKyAgICAvKiBXaGVyZSB0byByZWFkIHBlbmRpbmcgbWV0YSBkYXRhIGluZm8gZnJvbS4gKi8KKyAgICBtZXRhRGF0YURlbGF5UmVhZElkeCA9IGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeDsKKworICAgIC8qIFN1Ym1pdCBuZXcgZGF0YSBpZiBhdmFpbGFibGUuICovCisgICAgaWYgKHBNZXRhZGF0YSE9TlVMTCkgeworICAgICAgICBGREttZW1jcHkoJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsIHBNZXRhZGF0YSwgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOworICAgIH0KKworICAgIC8qIFdyaXRlIG9uZSBhZGRpdGlvbmFsIGZyYW1lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIG1ldGEgZGF0YS4gRW5zdXJlIGRlZmluZWQgYmVoYXZpb3VyIG9uIGRlY29kZXIgc2lkZS4gKi8KKyAgICBpZiAoIChoTWV0YURhdGFFbmMtPmZpbmFsaXplTWV0YURhdGEhPTApICYmIChoTWV0YURhdGFFbmMtPm1ldGFkYXRhTW9kZT09MCkpIHsKKyAgICAgIEZES21lbWNweSgmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwgJmRlZmF1bHRNZXRhRGF0YVNldHVwLCAgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOworICAgICAgbWV0YWRhdGFNb2RlID0gaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhOworICAgICAgaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhID0gMDsKKyAgICB9CisKKyAgICAvKiBHZXQgbGFzdCBzdWJtaXR0ZWQgZGF0YS4gKi8KKyAgICBpZiAoIChlcnIgPSBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKSkgIT0gTUVUQURBVEFfT0sgKQorICAgIHsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBjb21wcmVzc29yIGlmIG5lY2Vzc2FyeSBhbmQgdXBkYXRhIG1ldGEgZGF0YSBpbmZvICovCisgICAgaWYgKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XS5tZXRhZGF0YU1vZGUgIT0gMCkgeworICAgICAgaWYgKCAoZXJyID0gUHJvY2Vzc0NvbXByZXNzb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhNZXRhRGF0YUVuYy0+aERyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzKSkgIT0gTUVUQURBVEFfT0spCisgICAgICB7CisgICAgICAgIC8qIEdldCBsYXN0IHN1Ym1pdHRlZCBkYXRhIGFnYWluLiAqLworICAgICAgICBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb252ZXJ0IE1ldGEgRGF0YSBzaWRlIGluZm8gdG8gYml0c3RyZWFtIGRhdGEuICovCisgICAgaWYgKCAoZXJyID0gV3JpdGVNZXRhZGF0YVBheWxvYWQoaE1ldGFEYXRhRW5jLCAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5UmVhZElkeF0pKSAhPSBNRVRBREFUQV9PSyApIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBBc3NpZ24gbWV0YSBkYXRhIHRvIG91dHB1dCAqLworICAgICpwcE1ldGFEYXRhRXh0UGF5bG9hZCA9IGhNZXRhRGF0YUVuYy0+ZXhQYXlsb2FkOworICAgICpuTWV0YURhdGFFeHRlbnNpb25zICA9IGhNZXRhRGF0YUVuYy0+bkV4dGVuc2lvbnM7CisgICAgKm1hdHJpeF9taXhkb3duX2lkeCAgID0gaE1ldGFEYXRhRW5jLT5tYXRyaXhfbWl4ZG93bl9pZHg7CisKK2JhaWw6CisgICAgLyogQ29tcGVuc2F0ZSBhdWRpbyBkZWxheSwgcmVzZXQgZXJyIHN0YXR1cy4gKi8KKyAgICBlcnIgPSBDb21wZW5zYXRlQXVkaW9EZWxheShoTWV0YURhdGFFbmMsIHBBdWRpb1NhbXBsZXMsIG5BdWRpb1NhbXBsZXMpOworCisgICAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIENvbXBlbnNhdGVBdWRpb0RlbGF5KAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhRW5jLAorICAgICAgICBJTlRfUENNICogY29uc3QgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMKKyAgICAgICAgKQoreworICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKworICAgIGlmIChoTWV0YURhdGFFbmMtPm5BdWRpb0RhdGFEZWxheSkgeworICAgICAgaW50IGksIGRlbGF5U2FtcGxlcyA9IGhNZXRhRGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5KmhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbkF1ZGlvU2FtcGxlczsgaSsrKSB7CisgICAgICAgIElOVF9QQ00gdG1wID0gcEF1ZGlvU2FtcGxlc1tpXTsKKyAgICAgICAgcEF1ZGlvU2FtcGxlc1tpXSA9IGhNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUJ1ZmZlcltoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlJZHhdOworICAgICAgICBoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlCdWZmZXJbaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4XSA9IHRtcDsKKworICAgICAgICBoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlJZHgrKzsKKyAgICAgICAgaWYgKGhNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUlkeCA+PSBkZWxheVNhbXBsZXMpIGhNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUlkeCA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGZ1bmN0aW9ubmFtZTogV3JpdGVNZXRhZGF0YVBheWxvYWQKKyAgZGVzY3JpcHRpb246ICBmaWxscyBhbmMgZGF0YSBhbmQgZXh0ZW5zaW9uIHBheWxvYWQKKyAgcmV0dXJuczogICAgICBFcnJvciBzdGF0dXMKKworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFdyaXRlTWV0YWRhdGFQYXlsb2FkKAorICAgICAgICBjb25zdCBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhLAorICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEgKiBjb25zdCAgICAgICAgcE1ldGFkYXRhCisgICAgICAgICkKK3sKKyAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisKKyAgICBpZiAoIChoTWV0YURhdGE9PU5VTEwpIHx8IChwTWV0YWRhdGE9PU5VTEwpICkgeworICAgICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGhNZXRhRGF0YS0+bkV4dGVuc2lvbnMgPSAwOworICAgIGhNZXRhRGF0YS0+bWF0cml4X21peGRvd25faWR4ID0gLTE7CisKKyAgICAvKiBBQUMtRFJDICovCisgICAgaWYgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlICE9IDApCisgICAgeworICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSAgICAgICAgICAgICAgID0gaE1ldGFEYXRhLT5kcmNJbmZvUGF5bG9hZDsKKyAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVR5cGUgICAgICAgICAgICA9IEVYVF9EWU5BTUlDX1JBTkdFOworICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisKKyAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVNpemUgPQorICAgICAgICAgICAgICBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKHBNZXRhZGF0YSwgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10ucERhdGEpOworCisgICAgICAgIGhNZXRhRGF0YS0+bkV4dGVuc2lvbnMrKzsKKworICAgICAgICAvKiBNYXRyaXggTWl4ZG93biBDb2VmZmljaWVudCBpbiBQQ0UgKi8KKyAgICAgICAgaWYgKHBNZXRhZGF0YS0+V3JpdGVQQ0VNaXhEd25JZHgpIHsKKyAgICAgICAgICAgIGhNZXRhRGF0YS0+bWF0cml4X21peGRvd25faWR4ID0gc3VybWl4Mm1hdHJpeF9taXhkb3duX2lkeFtwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWxdOworICAgICAgICB9CisKKyAgICAgICAgLyogRVRTSSBUUyAxMDEgMTU0IChEVkIpIC0gTVBFRzQgYW5jaWxsYXJ5X2RhdGEoKSAqLworICAgICAgICBpZiAocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgPT0gMikgLyogTVA0X01FVEFEQVRBX01QRUdfRVRTSSAqLworICAgICAgICB7CisgICAgICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSAgICAgICAgICAgICAgID0gaE1ldGFEYXRhLT5kcmNEc2VQYXlsb2FkOworICAgICAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVR5cGUgICAgICAgICAgICA9IEVYVF9EQVRBX0VMRU1FTlQ7CisgICAgICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisKKyAgICAgICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFTaXplID0KKyAgICAgICAgICAgICAgICAgV3JpdGVFdHNpQW5jaWxsYXJ5RGF0YVBheWxvYWQocE1ldGFkYXRhLGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhKTsKKworICAgICAgICAgICAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucysrOworICAgICAgICB9IC8qIG1ldGFkYXRhTW9kZSA9PSAyICovCisKKyAgICB9IC8qIG1ldGFkYXRhTW9kZSAhPSAwICovCisKK2JhaWw6CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIElOVCBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKAorICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAorICAgICAgICApCit7CisgICAgY29uc3QgSU5UIHBjZV90YWdfcHJlc2VudCA9IDA7ICAgICAgICAvKiB5ZXQgZml4ZWQgc2V0dGluZyEgKi8KKyAgICBjb25zdCBJTlQgcHJvZ19yZWZfbGV2X3Jlc19iaXRzID0gMDsKKyAgICBJTlQgaSwgZHJjX251bV9iYW5kcyA9IDE7CisKKyAgICBGREtfQklUU1RSRUFNIGJzV3JpdGVyOworICAgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBwRXh0ZW5zaW9uUGF5bG9hZCwgMTYsIDAsIEJTX1dSSVRFUik7CisKKyAgICAvKiBkeW5hbWljX3JhbmdlX2luZm8oKSAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBjZV90YWdfcHJlc2VudCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwY2VfdGFnX3ByZXNlbnQgKi8KKyAgICBpZiAocGNlX3RhZ19wcmVzZW50KSB7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBjZV9pbnN0YW5jZV90YWcgKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCisgICB9CisKKyAgICAvKiBFeGNsdWRlIGNoYW5uZWxzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5leGNsdWRlZF9jaG5zX3ByZXNlbnQpID8gMSA6IDAsIDEpOyAgICAgIC8qIGV4Y2x1ZGVkX2NobnNfcHJlc2VudCovCisKKyAgICAvKiBNdWx0aWJhbmQgRFJDICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZHNfcHJlc2VudCkgPyAxIDogMCwgMSk7ICAgICAgICAgIC8qIGRyY19iYW5kc19wcmVzZW50ICovCisgICAgaWYgKHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZHNfcHJlc2VudCkKKyAgICB7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jciwgNCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRyY19iYW5kX2luY3IgKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWUsIDQpOyAgICAgICAgICAgLyogZHJjX2ludGVycG9sYXRpb25fc2NoZW1lICovCisgICAgICBkcmNfbnVtX2JhbmRzICs9IHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZF9pbmNyOworICAgICAgZm9yIChpPTA7IGk8ZHJjX251bV9iYW5kczsgaSsrKSB7CisgICAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZF90b3BbaV0sIDgpOyAgICAgICAgICAgICAgICAgIC8qIGRyY19iYW5kX3RvcCAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2dyYW0gUmVmZXJlbmNlIExldmVsICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQsIDEpOyAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQgKi8KKyAgICBpZiAocE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQpCisgICAgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsLCA3KTsgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbCAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcHJvZ19yZWZfbGV2X3Jlc19iaXRzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCisgICAgfQorCisgICAgLyogRFJDIFZhbHVlcyAqLworICAgIGZvciAoaT0wOyBpPGRyY19udW1fYmFuZHM7IGkrKykgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3NnbltpXSkgPyAxIDogMCwgMSk7ICAgICAgICAgICAvKiBkeW5fcm5nX3NnblsgKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFtpXSwgNyk7ICAgICAgICAgICAgICAgICAgICAgLyogZHluX3JuZ19jdGwgKi8KKyAgICB9CisKKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gZXh0ZW5zaW9uIHBheWxvYWQuICovCisgICAgcmV0dXJuIEZES2dldFZhbGlkQml0cygmYnNXcml0ZXIpOworfQorCitzdGF0aWMgSU5UIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKAorICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAorICAgICAgICApCit7CisgICAgRkRLX0JJVFNUUkVBTSBic1dyaXRlcjsKKyAgICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgcEV4dGVuc2lvblBheWxvYWQsIDE2LCAwLCBCU19XUklURVIpOworCisgICAgLyogYW5jaWxsYXJ5X2RhdGFfc3luYyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4QkMsIDgpOworCisgICAgLyogYnNfaW5mbyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtcGVnX2F1ZGlvX3R5cGUgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmRvbGJ5U3Vycm91bmRNb2RlLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgICAgLyogYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgYml0IFJlc2VydmVkLCBzZXQgdG8gIjAiICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+RG14THZsX09uKSA/IDEgOiAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX29uKSA/IDEgOiAwLCAxKTsgICAgICAgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfY29hcnNlX3N0YXR1cykgPyAxIDogMCwgMSk7IC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgPyAxIDogMCwgMSk7ICAgLyogZmluZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KKworICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLworICAgIGlmIChwTWV0YWRhdGEtPkRteEx2bF9PbikgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgZW5jb2RlRG14THZscyhwTWV0YWRhdGEtPmNlbnRlck1peExldmVsLCBwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWwpLCA4KTsKKyAgICB9CisKKyAgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb25fc3RhdHVzICovCisgICAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24pIHsKKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MDEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXVkaW8gY29kaW5nIG1vZGUgKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUsIDgpOyAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBncmFpbi10aW1lY29kZSBjb2Fyc2UvZmluZSAqLworICAgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMpIHsKKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IHlldCBzdXBwb3J0ZWQgKi8KKyAgICB9CisKKyAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgIH0KKworICAgIHJldHVybiBGREtnZXRWYWxpZEJpdHMoJmJzV3JpdGVyKTsKK30KKworCitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIExvYWRTdWJtaXR0ZWRNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhICogY29uc3QgICBoTWV0YWRhdGEsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTW9kZSwKKyAgICAgICAgQUFDX01FVEFEQVRBICogY29uc3QgICAgICAgICAgICBwQWFjTWV0YURhdGEKKyAgICAgICAgKQoreworICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKworICAgIGlmIChwQWFjTWV0YURhdGE9PU5VTEwpIHsKKyAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGluaXQgc3RydWN0ICovCisgICAgICBGREttZW1jbGVhcihwQWFjTWV0YURhdGEsIHNpemVvZihBQUNfTUVUQURBVEEpKTsKKworICAgICAgaWYgKGhNZXRhZGF0YSE9TlVMTCkgeworICAgICAgICAvKiBjb252ZXJ0IGRhdGEgKi8KKyAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlICAgICAgICAgICAgPSBoTWV0YWRhdGEtPmRyY19wcm9maWxlOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfcHJvZmlsZSAgICAgICA9IGhNZXRhZGF0YS0+Y29tcF9wcm9maWxlOworICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsICAgICA9IGhNZXRhZGF0YS0+ZHJjX1RhcmdldFJlZkxldmVsOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWw9IGhNZXRhZGF0YS0+Y29tcF9UYXJnZXRSZWZMZXZlbDsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQgPSBoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsX3ByZXNlbnQ7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCAgICAgICAgID0gZGlhbG5vcm0ycHJvZ3JlZmx2bChoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsKTsKKworICAgICAgICBwQWFjTWV0YURhdGEtPmNlbnRlck1peExldmVsICAgICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+Y2VudGVyTWl4TGV2ZWw7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+c3Vycm91bmRNaXhMZXZlbCAgICAgICAgICAgICAgID0gaE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsOworICAgICAgICBwQWFjTWV0YURhdGEtPldyaXRlUENFTWl4RHduSWR4ICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+UENFX21peGRvd25faWR4X3ByZXNlbnQ7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+RG14THZsX09uICAgICAgICAgICAgICAgICAgICAgID0gaE1ldGFkYXRhLT5FVFNJX0RteEx2bF9wcmVzZW50OworCisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24gPSAxOworCisKKyAgICAgICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgcEFhY01ldGFEYXRhLT5kb2xieVN1cnJvdW5kTW9kZSA9IGhNZXRhZGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGU7ICAgICAvKiBkb2xieV9zdXJyb3VuZF9tb2RlICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcEFhY01ldGFEYXRhLT5kb2xieVN1cnJvdW5kTW9kZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMgPSAwOyAvKiBub3QgeWV0IHN1cHBvcnRlZCAtIGF0dGVudGlvbjogVXBkYXRlIEdldEVzdE1ldGFkYXRhQnl0ZXNQZXJGcmFtZSgpIGlmIGVuYWJsZSB0aGlzISAqLworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2ZpbmVfc3RhdHVzICAgPSAwOyAvKiBub3QgeWV0IHN1cHBvcnRlZCAtIGF0dGVudGlvbjogVXBkYXRlIEdldEVzdE1ldGFkYXRhQnl0ZXNQZXJGcmFtZSgpIGlmIGVuYWJsZSB0aGlzISAqLworCisgICAgICAgIHBBYWNNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gbWV0YWRhdGFNb2RlOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitJTlQgRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFkYXRhRW5jCisgICAgICAgICkKK3sKKyAgICBJTlQgZGVsYXkgPSAwOworCisgICAgaWYgKGhNZXRhZGF0YUVuYyE9TlVMTCkgeworICAgICAgICBkZWxheSA9IGhNZXRhZGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5OworICAgIH0KKworICAgIHJldHVybiBkZWxheTsKK30KKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmggYi9hYWMvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjOGFlMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uaApAQCAtMCwwICsxLDIyNCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgQUFDIEVuY29kZXIgbGliICAqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBWLiBCYWNpZ2FsdXBvCisgICBEZXNjcmlwdGlvbjogTWV0YWRhdGEgRW5jb2RlciBsaWJyYXJ5IGludGVyZmFjZSBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9NRVRBREFUQV9NQUlOX0gKKyNkZWZpbmUgX01FVEFEQVRBX01BSU5fSAorCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhYWNlbmNfbGliLmgiCisjaW5jbHVkZSAiYWFjZW5jLmgiCisKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTUVUQURBVEFfT0sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICAgIE1FVEFEQVRBX0lOVkFMSURfSEFORExFICAgICAgICA9IDB4MDAyMCwgICAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KKyAgICBNRVRBREFUQV9NRU1PUllfRVJST1IgICAgICAgICAgPSAweDAwMjEsICAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCisgICAgTUVUQURBVEFfSU5JVF9FUlJPUiAgICAgICAgICAgID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgICBNRVRBREFUQV9FTkNPREVfRVJST1IgICAgICAgICAgPSAweDAwNjAgICAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KKworfSBGREtfTUVUQURBVEFfRVJST1I7CisKKy8qKgorICogIE1ldGEgRGF0YSBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZES19NRVRBREFUQV9FTkNPREVSICpIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVI7CisKKworLyoqCisgKiBcYnJpZWYgIE9wZW4gYSBNZXRhIERhdGEgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIHBoTWV0YWRhdGFFbmMgICAgICAgICBBIHBvaW50ZXIgdG8gYSBNZXRhIERhdGEgaGFuZGxlIHRvIGJlIGFsbG9jYXRlZC4gSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTUVUQURBVEFfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEUsIE1FVEFEQVRBX01FTU9SWV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19PcGVuKAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICpwaE1ldGFkYXRhRW5jCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBNZXRhIERhdGEgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIGhNZXRhZGF0YUVuYyAgICAgICAgICBNZXRhIERhdGEgaGFuZGxlLgorICogXHBhcmFtIHJlc2V0U3RhdGVzICAgICAgICAgICBJbmRpY2F0aW9uIGZvciBmdWxsIHJlc2V0IG9mIGFsbCBzdGF0ZXMuCisgKiBccGFyYW0gbWV0YWRhdGFNb2RlICAgICAgICAgIENvbmZpZ3VyZXMgbWV0YXQgZGF0YSBvdXRwdXQgZm9ybWF0ICgwLDEsMikuCisgKiBccGFyYW0gYXVkaW9EZWxheSAgICAgICAgICAgIERlbGF5IGNhdXNlIGJ5IHRoZSBhdWRpbyBlbmNvZGVyLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZXMgd2l0aGluIG9uZSBmcmFtZS4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgICAgICAgU2FtcGxpbmcgcmF0IGluIEh6IG9mIGF1ZGlvIGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLgorICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBDaGFubmVsIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgZW5jb2Rlci4KKyAqIFxwYXJhbSBjaGFubmVsT3JkZXIgICAgICAgICAgQ2hhbm5lbCBvcmRlciBvZiB0aGUgaW5wdXQgZGF0YS4gKFdBViwgTVBFRykKKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIE1FVEFEQVRBX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIE1FVEFEQVRBX0lOVkFMSURfSEFORExFLCBNRVRBREFUQV9JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX0luaXQoCisgICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgIGhNZXRhZGF0YUVuYywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZXMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTW9kZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EZWxheSwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCisgICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICAgICAgIGNoYW5uZWxPcmRlcgorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmICBDYWxjdWxhdGUgTWV0YSBEYXRhIHByb2Nlc3NpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmVhdHMgYWxsIHN0ZXAgbmVjZXNzYXJ5IGZvciBtZXRhIGRhdGEgcHJvY2Vzc2luZy4KKyAqIC0gUmVjZWl2ZSBuZXcgbWV0YSBkYXRhIGFuZCBtYWtlIHVzYWJsZS4KKyAqIC0gQ2FsY3VsYXRlIERSQyBjb21wcmVzc29yIGFuZCBleHRyYWN0IG1ldGEgZGF0YSBpbmZvLgorICogLSBNYWtlIG1ldGEgZGF0YSBhdmFpbGFibGUgZm9yIGV4dGVybiB1c2UuCisgKiAtIEFwcGx5IGF1ZGlvIGRhdGEgYW5kIG1ldGEgZGF0YSBkZWxheSBjb21wZW5zYXRpb24uCisgKgorICogXHBhcmFtIGhNZXRhZGF0YUVuYyAgICAgICAgICBNZXRhIERhdGEgaGFuZGxlLgorICogXHBhcmFtIHBBdWRpb1NhbXBsZXMgICAgICAgICBQb2ludGVyIHRvIGF1ZGlvIGlucHV0IGRhdGEuIEV4aXN0aW5nIGZ1bmN0aW9uIG92ZXJ3cml0ZXMgYXVkaW8gZGF0YSB3aXRoIGRlbGF5ZWQgYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBuQXVkaW9TYW1wbGVzICAgICAgICAgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgdG8gYmUgcHJjZXNzZWQuCisgKiBccGFyYW0gcE1ldGFkYXRhICAgICAgICAgICAgIFBvaW50ZXIgdG8gTWV0YXQgRGF0YSBpbnB1dC4KKyAqIFxwYXJhbSBwcE1ldGFEYXRhRXh0UGF5bG9hZCAgUG9pbnRlciB0byBleHRlbnNpb24gcGF5bG9hZCBhcnJheS4gRmlsbGVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBuTWV0YURhdGFFeHRlbnNpb25zICAgUG9pbnRlciB0byB2YXJpYWJsZSB0byBkZXNjcmliZSBudW1iZXIgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbiBwYXlsb2Fkcy4gRmlsbGVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBtYXRyaXhfbWl4ZG93bl9pZHggICAgUG9pbnRlciB0byB2YXJpYWJsZSBmb3IgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnQuIEZpbGxlZCBvbiByZXR1cm4uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBNRVRBREFUQV9PSywgb24gc3VjY2VzLgorICogICAgICAgICAgLSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRSwgTUVUQURBVEFfRU5DT0RFX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX1Byb2Nlc3MoCisgICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgIGhNZXRhZGF0YUVuYywKKyAgICAgICAgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcywKKyAgICAgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhICogY29uc3QgICAgcE1ldGFkYXRhLAorICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKiogICAgICAgICAgICBwcE1ldGFEYXRhRXh0UGF5bG9hZCwKKyAgICAgICAgVUlOVCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1ldGFEYXRhRXh0ZW5zaW9ucywKKyAgICAgICAgSU5UICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X21peGRvd25faWR4CisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIENsb3NlIHRoZSBNZXRhIERhdGEgaW5zdGFuY2UuCisgKgorICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCisgKgorICogXHBhcmFtIHBoTWV0YURhdGEgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBNZXRhIERhdGEgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTUVUQURBVEFfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfQ2xvc2UoCisgICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgKnBoTWV0YURhdGEKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgR2V0IE1ldGEgRGF0YSBFbmNvZGVyIGRlbGF5LgorICoKKyAqIFxwYXJhbSBoTWV0YWRhdGFFbmMgICAgICAgICAgTWV0YSBEYXRhIEVuY29kZXIgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4gIERlbGF5IGNhdXNlZCBieSBNZXRhIERhdGEgbW9kdWxlLgorICovCitJTlQgRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KAorICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICBoTWV0YWRhdGFFbmMKKyAgICAgICAgKTsKKworCisjZW5kaWYgLyogX01FVEFEQVRBX01BSU5fSCAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZkNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmNwcApAQCAtMCwwICsxLDI1MSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogTVMgc3RlcmVvIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKy8qIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZU1pblRocmVzID0gMS4wZjsgKi8gLyogMC43NWYgZm9yIDNkYiBib29zdCAqLworCit2b2lkIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoUFNZX0RBVEEgICAqUkVTVFJJQ1QgcHN5RGF0YVsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqaXNCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqbXNEaWdlc3QsICAgICAgIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqbXNNYXNrLCAgICAgICAgIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgKnNmYk9mZnNldCkKK3sKKyAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneUxlZnQgPSBwc3lEYXRhWzBdLT5zZmJFbmVyZ3kuTG9uZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5UmlnaHQgPSBwc3lEYXRhWzFdLT5zZmJFbmVyZ3kuTG9uZzsgICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgICAgY29uc3QgRklYUF9EQkwgICpzZmJFbmVyZ3lNaWQgPSBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNUy5Mb25nOworICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRW5lcmd5U2lkZSA9IHBzeURhdGFbMV0tPnNmYkVuZXJneU1TLkxvbmc7CisgICAgRklYUF9EQkwgICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0ID0gcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmc7ICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgICBGSVhQX0RCTCAgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0ID0gcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmc7ICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworCisgICAgRklYUF9EQkwgICAgICAgICpzZmJTcHJlYWRFbkxlZnQgPSBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKKyAgICBGSVhQX0RCTCAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQgPSBwc3lEYXRhWzFdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKKworICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5TGVmdExkRGF0YSA9IHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YTsgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5UmlnaHRMZERhdGEgPSBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGE7ICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5TWlkTGREYXRhID0gcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVNMZERhdGE7CisgICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lTaWRlTGREYXRhID0gcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVNMZERhdGE7CisgICAgRklYUF9EQkwgICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0TGREYXRhID0gcHN5T3V0Q2hhbm5lbFswXS0+c2ZiVGhyZXNob2xkTGREYXRhOyAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgICAgRklYUF9EQkwgICAgICAgICpzZmJUaHJlc2hvbGRSaWdodExkRGF0YSA9IHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YTsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisKKyAgICBGSVhQX0RCTCAgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQgPSBwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICAgIEZJWFBfREJMICAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQgPSBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisKKyAgICBJTlQgICAgICAgICAgICAgc2ZiLHNmYm9mZnMsIGo7ICAgICAgICAgICAvKiBsb29wIGNvdW50ZXJzICAgICAgICAgKi8KKyAgICBGSVhQX0RCTCAgICAgICAgcG5sckxkRGF0YSwgcG5tc0xkRGF0YTsKKyAgICBGSVhQX0RCTCAgICAgICAgbWluVGhyZXNob2xkTGREYXRhOworICAgIEZJWFBfREJMICAgICAgICBtaW5UaHJlc2hvbGQ7CisgICAgSU5UICAgICAgICAgICAgIHVzZU1TOworCisgICAgSU5UICAgICAgICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAwOyAgLyogdG8gZGV0ZXJtaW5lIG1zRGlnZXN0ICovCisgICAgSU5UICAgICAgICAgICAgIG51bU1zTWFza0ZhbHNlID0gMDsgICAgICAgLyogbnVtYmVyIG9mIG5vbi1pbnRlbnNpdHkgYmFuZHMgd2hlcmUgTC9SIGNvZGluZyBpcyB1c2VkICovCisKKyAgICBmb3Ioc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYis9c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvcihzZmJvZmZzPTA7c2Zib2ZmczxtYXhTZmJQZXJHcm91cDtzZmJvZmZzKyspIHsKKworICAgICAgICBpZiAoIChpc0Jvb2s9PU5VTEwpID8gMSA6IChpc0Jvb2tbc2ZiK3NmYm9mZnNdID09IDApICkgeworICAgICAgICAgIEZJWFBfREJMIHRtcDsKKworLyoKKyAgICAgICAgICBtaW5UaHJlc2hvbGQ9bWluKHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10pKnNjYWxlTWluVGhyZXM7CisgICAgICAgICAgcG5sciA9IChzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXS8KKyAgICAgICAgICAgICAgICAgbWF4KHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdKSkqCisgICAgICAgICAgICAgICAgIChzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10vCisgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10sc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKSk7CisgICAgICAgICAgcG5tcyA9IChtaW5UaHJlc2hvbGQvbWF4KHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc10sbWluVGhyZXNob2xkKSkqCisgICAgICAgICAgICAgICAgIChtaW5UaHJlc2hvbGQvbWF4KHNmYkVuZXJneVNpZGVbc2ZiK3NmYm9mZnNdLG1pblRocmVzaG9sZCkpOworICAgICAgICAgIHVzZU1TID0gKHBubXMgPiBwbmxyKTsKKyovCisKKyAgICAgICAgICAvKiB3ZSBhc3N1bWUgdGhhdCBzY2FsZU1pblRocmVzID09IDEuMGYgYW5kIHdlIGNhbiBkcm9wIGl0ICovCisgICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10pOworCisgICAgICAgICAgLyogcG5sckxkRGF0YSA9IHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10pICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSAtCisgICAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10pOyAqLworICAgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10pOworICAgICAgICAgIHBubHJMZERhdGEgPSAoc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10+PjEpIC0gKHRtcD4+MSk7CisgICAgICAgICAgcG5sckxkRGF0YSA9IHBubHJMZERhdGEgKyAoc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdPj4xKTsKKyAgICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10pOworICAgICAgICAgIHBubHJMZERhdGEgPSBwbmxyTGREYXRhIC0gKHRtcD4+MSk7CisKKyAgICAgICAgICAvKiBwbm1zTGREYXRhID0gbWluVGhyZXNob2xkTGREYXRhIC0gbWF4KHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSkgKworICAgICAgICAgICAgICAgICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhIC0gbWF4KHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOyAqLworICAgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOworICAgICAgICAgIHBubXNMZERhdGEgPSBtaW5UaHJlc2hvbGRMZERhdGEgLSAodG1wPj4xKTsKKyAgICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIrc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSk7CisgICAgICAgICAgcG5tc0xkRGF0YSA9IHBubXNMZERhdGEgLSAodG1wPj4xKTsKKyAgICAgICAgICB1c2VNUyA9IChwbm1zTGREYXRhID4gKHBubHJMZERhdGEpKTsKKworCisgICAgICAgICAgaWYgKHVzZU1TKSB7CisgICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMTsKKyAgICAgICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAxOworICAgICAgICAgICAgZm9yKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgeworICAgICAgICAgICAgICBGSVhQX0RCTCBzcGVjTCwgc3BlY1I7CisgICAgICAgICAgICAgIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXT4+MTsKKyAgICAgICAgICAgICAgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXT4+MTsKKyAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IHNwZWNMICsgc3BlY1I7CisgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gc3BlY0wgLSBzcGVjUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1pblRocmVzaG9sZCA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKTsKKyAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkOworICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGRMZERhdGE7CisgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc107CisgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10gPSBzZmJFbmVyZ3lTaWRlW3NmYitzZmJvZmZzXTsKKyAgICAgICAgICAgIHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5TWlkTGREYXRhW3NmYitzZmJvZmZzXTsKKyAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdOworCisgICAgICAgICAgICBzZmJTcHJlYWRFbkxlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiU3ByZWFkRW5SaWdodFtzZmIrc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgICAgICAgZml4TWluKCBzZmJTcHJlYWRFbkxlZnRbc2ZiK3NmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSApID4+IDE7CisKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMDsKKyAgICAgICAgICAgIG51bU1zTWFza0ZhbHNlKys7CisgICAgICAgICAgfSAvKiB1c2VNUyAqLworICAgICAgICB9IC8qIGlzQm9vayAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBrZWVwIG1EaWdlc3QgZnJvbSBJUyBtb2R1bGUgKi8KKyAgICAgICAgICBpZiAobXNNYXNrW3NmYitzZmJvZmZzXSkgeworICAgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIHByb2hpYml0IE1TX01BU0tfQUxMIGluIGNvbWJpbmF0aW9uIHdpdGggSVMgKi8KKyAgICAgICAgICBudW1Nc01hc2tGYWxzZSA9IDk7CisgICAgICAgIH0gLyogaXNCb29rICovCisgICAgICB9IC8qIHNmYm9mZnMgKi8KKyAgICB9IC8qIHNmYiAqLworCisKKyAgICBpZihtc01hc2tUcnVlU29tZXdoZXJlID09IDEpIHsKKyAgICAgIGlmICgobnVtTXNNYXNrRmFsc2UgPT0gMCkgfHwgKChudW1Nc01hc2tGYWxzZSA8IG1heFNmYlBlckdyb3VwKSAmJiAobnVtTXNNYXNrRmFsc2UgPCA5KSkpIHsKKyAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19BTEw7CisgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBNL1MgYmFuZHM7IGlmIG1zTWFzaz09MCwgc2V0IGl0IHRvIDEgYW5kIGFwcGx5IE0vUyAqLworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiICs9IHNmYlBlckdyb3VwKSB7CisgICAgICAgICAgZm9yIChzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IG1heFNmYlBlckdyb3VwOyBzZmJvZmZzKyspIHsKKyAgICAgICAgICAgIGlmICgoIChpc0Jvb2sgPT0gTlVMTCkgPyAxIDogKGlzQm9va1tzZmIrc2Zib2Zmc10gPT0gMCkgKSAmJiAobXNNYXNrW3NmYitzZmJvZmZzXSA9PSAwKSkgeworICAgICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMTsKKyAgICAgICAgICAgICAgLyogYXBwbHkgTS9TIGNvZGluZyAqLworICAgICAgICAgICAgICBmb3Ioaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgc3BlY0wsIHNwZWNSOworICAgICAgICAgICAgICAgIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXT4+MTsKKyAgICAgICAgICAgICAgICBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPj4xOworICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSBzcGVjTCArIHNwZWNSOworICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gc3BlY0wgLSBzcGVjUjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtaW5UaHJlc2hvbGQgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSk7CisgICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkOworICAgICAgICAgICAgICBtaW5UaHJlc2hvbGRMZERhdGEgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSk7CisgICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkTGREYXRhOworICAgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc107CisgICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVbc2ZiK3NmYm9mZnNdOworICAgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc107CisgICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdOworCisgICAgICAgICAgICAgIHNmYlNwcmVhZEVuTGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgICAgICAgIGZpeE1pbiggc2ZiU3ByZWFkRW5MZWZ0W3NmYitzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSApID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX1NPTUU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfTk9ORTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uaCBiL2FhYy9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2FkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uaApAQCAtMCwwICsxLDEwNyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogTVMgc3RlcmVvIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTVNfU1RFUkVPX0hfXworI2RlZmluZSBfX01TX1NURVJFT19IX18KKworCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKK3ZvaWQgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZyhQU1lfREFUQSAgICpSRVNUUklDVCBwc3lEYXRhWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICppc0Jvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICptc0RpZ2VzdCwgICAgICAgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICptc01hc2ssICAgICAgICAgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqc2ZiT2Zmc2V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjNTFkZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL25vaXNlZGV0LmNwcApAQCAtMCwwICsxLDIyOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IG5vaXNlZGV0LmMKKyAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0aW5lcyBmb3IgTm9pc2UgRGV0ZWN0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm5vaXNlZGV0LmgiCisKKyNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCisjaW5jbHVkZSAicG5zcGFyYW0uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyCisgICAgZGVzY3JpcHRpb246ICBGdXp6eSB2YWx1ZSBjYWxjdWxhdGlvbiBmb3IgInRlc3RWYWwgaXMgc21hbGxlciB0aGFuIHJlZlZhbCIKKyAgICByZXR1cm5zOiAgICAgIGZ1enp5IHZhbHVlCisgICAgaW5wdXQ6ICAgICAgICB0ZXN0IGFuZCByZWYgVmFsdWUsCisgICAgICAgICAgICAgICAgICBsb3cgYW5kIGhpZ2ggTGltCisgICAgb3V0cHV0OiAgICAgICByZXR1cm4gZnV6enkgdmFsdWUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRklYUF9TR0wgRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKCBGSVhQX0RCTCB0ZXN0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCByZWZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvTGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBoaUxpbSApCit7CisgIGlmIChyZWZWYWwgPD0gRkwyRlhDT05TVF9EQkwoMC4wKSkKKyAgICAgICAgcmV0dXJuKCBGTDJGWENPTlNUX1NHTCgwLjBmKSApOworICBlbHNlIGlmICh0ZXN0VmFsID49IGZNdWx0KChoaUxpbT4+MSkrKGxvTGltPj4xKSwgcmVmVmFsKSkKKyAgICAgICAgcmV0dXJuKCBGTDJGWENPTlNUX1NHTCgwLjBmKSApOworICBlbHNlICByZXR1cm4oIChGSVhQX1NHTClNQVhWQUxfU0dMICk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX25vaXNlRGV0ZWN0CisgICAgZGVzY3JpcHRpb246ICBkZXRlY3QgdG9uYWwgc2ZiJ3M7IHR3byB0ZXN0cworICAgICAgICAgICAgICAgICAgUG93ZXJkaXN0cmlidXRpb246CisgICAgICAgICAgICAgICAgICAgIHNmYiBzcGxpdHRldCBpbiBmb3VyIHJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgdGhlIGVuZXJneSBpbiBhbGwgc2VjdGlvbnMKKyAgICAgICAgICAgICAgICAgIFBzeWNoVG9uYWxpdHk6CisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgdG9uYWxpdHkgZnJvbSBjaGFvc21lYXN1cmUgd2l0aCByZWZ0b25hbGl0eQorICAgIHJldHVybnM6CisgICAgaW5wdXQ6ICAgICAgICBzcGVjdHJ1bSBvZiBvbmUgbGFyZ2UgbWRjdAorICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHNmYidzCisgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIG9mZnNldCBvZiBzZmIncworICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBub2lzZUZ1enp5TWVhc3VyZSAobW9kaWZpZWQpCisgICAgICAgICAgICAgICAgICBub2lzZXBhcmFtcyBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc2ZiIGVuZXJnaWVzCisgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRvbmFsaXR5IGNhbGN1bGF0ZWQgaW4gY2hhb3NtZWFzdXJlCisgICAgb3V0cHV0OiAgICAgICBub2lzZUZ1enp5IE1lYXN1cmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRkRLYWFjRW5jX25vaXNlRGV0ZWN0KEZJWFBfREJMICAgICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpSRVNUUklDVCBub2lzZUZ1enp5TWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgTk9JU0VQQVJBTVMgKm5wLAorICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqUkVTVFJJQ1Qgc2ZidG9uYWxpdHkgKQorCit7CisgIGludCAgICBpLCBrLCBzZmIsIHNmYldpZHRoOworICBGSVhQX1NHTCBmdXp6eSwgZnV6enlUb3RhbDsKKyAgRklYUF9EQkwgcmVmVmFsLCB0ZXN0VmFsOworCisgIC8qKioqKiBTdGFydCBkZXRlY3Rpb24gcGhhc2UgKioqKiovCisgIC8qIFN0YXJ0IG5vaXNlIGRldGVjdGlvbiBmb3IgZWFjaCBiYW5kIGJhc2VkIG9uIGEgbnVtYmVyIG9mIGNoZWNrcyAqLworICBmb3IgKHNmYj0wOyBzZmI8c2ZiQWN0aXZlOyBzZmIrKykgeworCisgICAgZnV6enlUb3RhbCA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdOworCisgICAgLyogUmVzZXQgb3V0cHV0IGZvciBsb3dlciBiYW5kcyBvciB0b28gc21hbGwgYmFuZHMgKi8KKyAgICBpZiAoc2ZiIDwgbnAtPnN0YXJ0U2ZiICB8fCAgc2ZiV2lkdGggPCBucC0+bWluU2ZiV2lkdGgpIHsKKyAgICAgIG5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICggKG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9QT1dFUl9ESVNUUklCVVRJT04pICYmIChmdXp6eVRvdGFsID4gRkwyRlhDT05TVF9TR0woMC41ZikpICkgeworICAgICAgRklYUF9EQkwgZmhlbHAxLCBmaGVscDIsIGZoZWxwMywgZmhlbHA0LCBtYXhWYWwsIG1pblZhbDsKKyAgICAgIElOVCBsZWFkaW5nQml0cyA9IGZpeE1heCgwLChzZmJNYXhTY2FsZVNwZWNbc2ZiXSAtIDMpKTsgICAgICAgICAvKiBtYXggc2ZiV2lkdGggPSA5Ni80IDsgMl41PTMyID0+IDUvMiA9IDMgKHNwYypzcGMpICovCisKKyAgICAgIC8qICBjaGVjayBwb3dlciBkaXN0cmlidXRpb24gaW4gZm91ciByZWdpb25zICovCisgICAgICBmaGVscDEgPSBmaGVscDIgPSBmaGVscDMgPSBmaGVscDQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGsgPSBzZmJXaWR0aCA+PjI7ICAvKiBXaWR0aCBvZiBhIHF1YXJ0ZXIgYmFuZCAqLworCisgICAgICBmb3IgKGk9c2ZiT2Zmc2V0W3NmYl07IGk8c2ZiT2Zmc2V0W3NmYl0razsgaSsrKSB7CisgICAgICAgIGZoZWxwMSA9IGZQb3cyQWRkRGl2MihmaGVscDEsIG1kY3RTcGVjdHJ1bVtpXTw8bGVhZGluZ0JpdHMpOworICAgICAgICBmaGVscDIgPSBmUG93MkFkZERpdjIoZmhlbHAyLCBtZGN0U3BlY3RydW1baStrXTw8bGVhZGluZ0JpdHMpOworICAgICAgICBmaGVscDMgPSBmUG93MkFkZERpdjIoZmhlbHAzLCBtZGN0U3BlY3RydW1baSsyKmtdPDxsZWFkaW5nQml0cyk7CisgICAgICAgIGZoZWxwNCA9IGZQb3cyQWRkRGl2MihmaGVscDQsIG1kY3RTcGVjdHJ1bVtpKzMqa108PGxlYWRpbmdCaXRzKTsKKyAgICAgIH0KKworICAgICAgLyogZ2V0IG1heCBpbnRvIGZoZWxwOiAqLworICAgICAgbWF4VmFsID0gZml4TWF4KGZoZWxwMSwgZmhlbHAyKTsKKyAgICAgIG1heFZhbCA9IGZpeE1heChtYXhWYWwsIGZoZWxwMyk7CisgICAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLCBmaGVscDQpOworCisgICAgICAvKiBnZXQgbWluIGludG8gZmhlbHAxOiAqLworICAgICAgbWluVmFsID0gZml4TWluKGZoZWxwMSwgZmhlbHAyKTsKKyAgICAgIG1pblZhbCA9IGZpeE1pbihtaW5WYWwsIGZoZWxwMyk7CisgICAgICBtaW5WYWwgPSBmaXhNaW4obWluVmFsLCBmaGVscDQpOworCisgICAgICAvKiBOb3JtYWxpemUgbWluIGFuZCBtYXggVmFsICovCisgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMobWF4VmFsKTsKKyAgICAgIHRlc3RWYWwgPSBtYXhWYWwgPDwgbGVhZGluZ0JpdHM7CisgICAgICByZWZWYWwgID0gbWluVmFsIDw8IGxlYWRpbmdCaXRzOworCisgICAgICAvKiBjYWxjdWxhdGUgZnV6enkgdmFsdWUgZm9yIHBvd2VyIGRpc3RyaWJ1dGlvbiAqLworICAgICAgdGVzdFZhbCA9IGZNdWx0RGl2Mih0ZXN0VmFsLCBucC0+cG93RGlzdFBTRGN1cnZlW3NmYl0pOworCisgICAgICBmdXp6eSA9IEZES2FhY0VuY19mdXp6eUlzU21hbGxlcih0ZXN0VmFsLCAgICAgICAgICAgLyogMS8yICogbWF4VmFsdWUgKiBQU0RjdXJ2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWwsICAgICAgICAgICAgLyogMSAgICogbWluVmFsdWUgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjQ5NSksICAvKiAxLzIgKiBsb0xpbSAgKDAuOTlmLzIpICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTA1KSk7IC8qIDEvMiAqIGhpTGltICAoMS4wMWYvMikgICAgKi8KKworICAgICAgZnV6enlUb3RhbCA9IGZpeE1pbihmdXp6eVRvdGFsLCBmdXp6eSk7CisgICAgfQorCisgICAgaWYgKCAobnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgVVNFX1BTWUNIX1RPTkFMSVRZKSAmJiAoZnV6enlUb3RhbCA+IEZMMkZYQ09OU1RfU0dMKDAuNWYpKSApIHsKKyAgICAgIC8qIERldGVjdGlvbiB3aXRoIHRvbmFsaXR5LXZhbHVlIG9mIHBzeWNoLiBhY291c3RpYyAoaGVyZTogMSBpcyB0b25hbCEpKi8KKworICAgICAgdGVzdFZhbCA9IEZYX1NHTDJGWF9EQkwoc2ZidG9uYWxpdHlbc2ZiXSk+PjE7ICAgICAgICAgIC8qIDEvMiAqIHNmYlRvbmFsaXR5ICAgICAgICAgKi8KKyAgICAgIHJlZlZhbCAgPSBucC0+cmVmVG9uYWxpdHk7CisKKyAgICAgIGZ1enp5ICAgPSBGREthYWNFbmNfZnV6enlJc1NtYWxsZXIodGVzdFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC40NWYpLCAgICAvKiAxLzIgKiBsb0xpbSAgKDAuOWYvMikgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41NWYpKTsgICAvKiAxLzIgKiBoaUxpbSAgKDEuMWYvMikgICAgICovCisKKyAgICAgIGZ1enp5VG90YWwgPSBmaXhNaW4oZnV6enlUb3RhbCwgZnV6enkpOworICAgIH0KKworCisgICAgLyogT3V0cHV0IG9mIGZpbmFsIHJlc3VsdCAqLworICAgIG5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPSBmdXp6eVRvdGFsOworICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDVlMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuaApAQCAtMCwwICsxLDEwOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IG5vaXNlZGV0LmgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTk9JU0VERVRfSAorI2RlZmluZSBfX05PSVNFREVUX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgInBuc3BhcmFtLmgiCisjaW5jbHVkZSAicHN5X2RhdGEuaCIKKworCit2b2lkIEZES2FhY0VuY19ub2lzZURldGVjdCggRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICBub2lzZUZ1enp5TWVhc3VyZVtdLAorICAgICAgICAgICAgICAgICAgTk9JU0VQQVJBTVMgKm5wLAorICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5ICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvcG5zX2Z1bmMuaCBiL2FhYy9saWJBQUNlbmMvc3JjL3Buc19mdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhNDRlZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3Buc19mdW5jLmgKQEAgLTAsMCArMSwxNTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBwbnNfZnVuYy5oCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUE5TX0ZVTkNfSAorI2RlZmluZSBfUE5TX0ZVTkNfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiYWFjZW5jX3Bucy5oIgorI2luY2x1ZGUgInBzeV9kYXRhLmgiCisKKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oUE5TX0NPTkZJRyAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgdXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIG51bUNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBpc0xDICk7CisKK3ZvaWQgRkRLYWFjRW5jX1Buc0RldGVjdCggUE5TX0NPTkZJRyAgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGEsCisgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpzZmJ0b25hbGl0eSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0bnNPcmRlciwKKyAgICAgICAgICAgICAgICBJTlQgICAgICAgICB0bnNQcmVkaWN0aW9uR2FpbiwKKyAgICAgICAgICAgICAgICBJTlQgICAgICAgICB0bnNBY3RpdmUsCisgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbm9pc2VOcmcgKTsKKwordm9pZCBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoIGNvbnN0IElOVCAgICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgUE5TX0NPTkZJRyAgICAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKnBuc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpzZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpub2lzZU5yZywKKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKnNmYlRocmVzaG9sZCApOworCit2b2lkIEZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoIGNvbnN0IElOVCAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5UmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5TGVmdExELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneVJpZ2h0TEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5TWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgKnBuc0NvbmZMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFSaWdodCApOworCit2b2lkIEZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyKCBjb25zdCBJTlQgICBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgICpwbnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgICpwbnNEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptc0RpZ2VzdCApOworCisjZW5kaWYgLyogX1BOU19GVU5DX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM1YmRkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uY3BwCkBAIC0wLDAgKzEsMzA4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5Mb2h3YXNzZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBuc3BhcmFtLmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCAgICAgc3RhcnRGcmVxOworICAvKiBQYXJhbWV0ZXJzIGZvciBkZXRlY3Rpb24gKi8KKyAgRklYUF9TR0wgIHJlZlBvd2VyOworICBGSVhQX1NHTCAgcmVmVG9uYWxpdHk7CisgIFNIT1JUICAgICB0bnNHYWluVGhyZXNob2xkOyAgICAgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCisgIFNIT1JUICAgICB0bnNQTlNHYWluVGhyZXNob2xkOyAgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCisgIEZJWFBfU0dMICBnYXBGaWxsVGhyOworICBTSE9SVCAgICAgbWluU2ZiV2lkdGg7CisgIFVTSE9SVCAgICBkZXRlY3Rpb25BbGdvcml0aG1GbGFnczsKK30gUE5TX0lORk9fVEFCOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUxPTkcgYnJGcm9tOworICBVTE9ORyBiclRvOworICBVQ0hBUiBTMjIwNTA7CisgIFVDSEFSIFMyNDAwMDsKKyAgVUNIQVIgUzMyMDAwOworICBVQ0hBUiBTNDQxMDA7CisgIFVDSEFSIFM0ODAwMDsKK30gQVVUT19QTlNfVEFCOworCitzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbW9ub1tdPSB7CisgIHswLCAgICAgIDExOTk5LCAxLCAxLCAxLCAxLCAxLH0sCisgIHsxMjAwMCwgIDE5OTk5LCAxLCAxLCAxLCAxLCAxLH0sCisgIHsyMDAwMCwgIDI4OTk5LCAyLCAxLCAxLCAxLCAxLH0sCisgIHsyOTAwMCwgIDQwOTk5LCA0LCA0LCA0LCAyLCAyLH0sCisgIHs0MTAwMCwgIDU1OTk5LCA5LCA5LCA3LCA3LCA3LH0sCisgIHs1NjAwMCwgIDc5OTk5LCAwLCAwLCAwLCA5LCA5LH0sCisgIHs4MDAwMCwgIDk5OTk5LCAwLCAwLCAwLCAwLCAwLH0sCisgIHsxMDAwMDAsOTk5OTk5LCAwLCAwLCAwLCAwLCAwLH0sCit9OworCitzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfc3RlcmVvW109IHsKKyAgezAsICAgICAgMTE5OTksIDEsIDEsIDEsIDEsIDEsfSwKKyAgezEyMDAwLCAgMTk5OTksIDMsIDEsIDEsIDEsIDEsfSwKKyAgezIwMDAwLCAgMjg5OTksIDMsIDMsIDMsIDIsIDIsfSwKKyAgezI5MDAwLCAgNDA5OTksIDcsIDYsIDYsIDUsIDUsfSwKKyAgezQxMDAwLCAgNTU5OTksIDksIDksIDcsIDcsIDcsfSwKKyAgezU2MDAwLCAgNzk5OTksIDAsIDAsIDAsIDAsIDAsfSwKKyAgezgwMDAwLCAgOTk5OTksIDAsIDAsIDAsIDAsIDAsfSwKKyAgezEwMDAwMCw5OTk5OTksIDAsIDAsIDAsIDAsIDAsfSwKK307CisKKworc3RhdGljIGNvbnN0IFBOU19JTkZPX1RBQiBwbnNJbmZvVGFiW10gPSB7CisvKjAgICBwbnMgb2ZmICovCisvKjEqLyB7IDQwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDQpLCBGTDJGWENPTlNUX1NHTCgwLjA2KSwgMTE1MCwgMTIwMCwgRkwyRlhDT05TVF9TR0woMC4wMiksIDgsCisgICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqLyB9LAorLyoyKi8geyA0MDAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNyksIDExMzAsIDEzMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIC8qfCBKVVNUX0xPTkdfV0lORE9XKi8gfSwKKy8qMyovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDcpLCAxMTAwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgOCwKKyAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovIH0sCisvKjQqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC4xNSksIDgsCisgICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqLyB9LAorLyo1Ki8geyA0MzAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMTUpLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorLyo2Ki8geyA1MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMjUpLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorLyo3Ki8geyA1NTAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMiksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMzUpLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorLyo4Ki8geyA2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMiksIDEwODAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNDApLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorLyo5Ki8geyA2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xNCksIDEwNzAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNDUpLCA4LAorICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorfTsKKworc3RhdGljIGNvbnN0IEFVVE9fUE5TX1RBQiBsZXZlbFRhYmxlX2xvd0NvbXBsZXhpdHlbXT0geworICB7MCwgICAgICAyNzk5OSwgMCwgMCwgMCwgMCwgMCx9LAorICB7MjgwMDAsICAzMTk5OSwgMiwgMiwgMiwgMiwgMix9LAorICB7MzIwMDAsICA0Nzk5OSwgMywgMywgMywgMywgMyx9LAorICB7NDgwMDAsICA0ODAwMCwgNCwgNCwgNCwgNCwgNCx9LAorICB7NDgwMDEsIDk5OTk5OSwgMCwgMCwgMCwgMCwgMCx9LAorfTsKKworLyogY29udmVyc2lvbiBvZiBvbGQgTEMgdHVuaW5nIHRhYmxlcyB0byBuZXcgKExEIGVuYykgc3RydWN0dXJlIChvbmx5IGVudHJpZXMgd2hpY2ggYXJlIGFjdHVhbGx5IHVzZWQgd2VyZSBjb252ZXJ0ZWQpICovCitzdGF0aWMgY29uc3QgUE5TX0lORk9fVEFCIHBuc0luZm9UYWJfbG93Q29tcGxleGl0eVtdID0geworLyowICAgcG5zIG9mZiAqLworICAgICAgLyogREVGQVVMVCBwYXJhbWV0ZXIgc2V0ICovCisvKjEqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjE2KSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCisvKjIqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTQxMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCisvKjMqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCisgICAgICAvKiBMT1dTVUJTVCAtPiBQTlMgaXMgdXNlZCBsZXNzIG9mdGVuIHRoYW4gd2l0aCBERUZBVUxUIHBhcmFtZXRlciBzZXQgKGZvciBicjogNDgwMDAgLSA3OTk5OSkgKi8KKy8qNCovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4yMCksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxNDEwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKKyAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1cgfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGZ1bmN0aW9uIHRvIGxvb2sgdXAgdXNlZCBwbnMgbGV2ZWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRkRLYWFjRW5jX2xvb2tVcFBuc1VzZSAoaW50IGJpdFJhdGUsIGludCBzYW1wbGVSYXRlLCBpbnQgbnVtQ2hhbiwgY29uc3QgaW50IGlzTEMpIHsKKworICBpbnQgaFVzZVBucz0wLCBzaXplLCBpOworICBjb25zdCBBVVRPX1BOU19UQUIgKmxldmVsVGFibGU7CisKKyAgaWYgKGlzTEMpIHsKKyAgICBsZXZlbFRhYmxlID0gJmxldmVsVGFibGVfbG93Q29tcGxleGl0eVswXTsKKyAgICBzaXplID0gc2l6ZW9mKGxldmVsVGFibGVfbG93Q29tcGxleGl0eSk7CisgIH0gZWxzZQorICB7IC8qIChFKUxEICovCisgICAgbGV2ZWxUYWJsZSA9IChudW1DaGFuID4gMSkgPyAmbGV2ZWxUYWJsZV9zdGVyZW9bMF0gOiAmbGV2ZWxUYWJsZV9tb25vWzBdOworICAgIHNpemUgPSAobnVtQ2hhbiA+IDEpID8gc2l6ZW9mKGxldmVsVGFibGVfc3RlcmVvKSA6IHNpemVvZihsZXZlbFRhYmxlX21vbm8pOworICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgKGludCkgKHNpemUvc2l6ZW9mKEFVVE9fUE5TX1RBQikpOyBpKyspIHsKKyAgICBpZigoKFVMT05HKWJpdFJhdGUgPj0gbGV2ZWxUYWJsZVtpXS5ickZyb20pICYmCisgICAgICAgKChVTE9ORyliaXRSYXRlIDw9IGxldmVsVGFibGVbaV0uYnJUbykgKQorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKChpbnQpKHNpemVvZihwbnNJbmZvVGFiKS9zaXplb2YoUE5TX0lORk9fVEFCKSkgPCBpICkgeworICAgIHJldHVybiAoUE5TX1RBQkxFX0VSUk9SKTsKKyAgfQorCisgIHN3aXRjaCAoc2FtcGxlUmF0ZSkgeworICBjYXNlIDIyMDUwOiBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMjIwNTA7IGJyZWFrOworICBjYXNlIDI0MDAwOiBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMjQwMDA7IGJyZWFrOworICBjYXNlIDMyMDAwOiBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMzIwMDA7IGJyZWFrOworICBjYXNlIDQ0MTAwOiBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TNDQxMDA7IGJyZWFrOworICBjYXNlIDQ4MDAwOiBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TNDgwMDA7IGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmIChpc0xDKSB7CisgICAgICBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TNDgwMDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIChoVXNlUG5zKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0dldFBuc1BhcmFtCisgICAgZGVzY3JpcHRpb246ICBHZXRzIFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKKyAgICByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cworICAgIGlucHV0OiAgICAgICAgTm9pc2VwYXJhbXMgc3RydWN0LCBiaXRyYXRlLCBzYW1wbGluZyByYXRlLAorICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHNmYidzLCBwb2ludGVyIHRvIHNmYiBvZmZzZXQKKyAgICBvdXRwdXQ6ICAgICAgIFBOUyBwYXJhbWV0ZXJzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0dldFBuc1BhcmFtKE5PSVNFUEFSQU1TICpucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1DaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIGlzTEMpCisKK3sKKyAgICBpbnQgaSwgaFVzZVBuczsKKyAgICBjb25zdCBQTlNfSU5GT19UQUIgKnBuc0luZm87CisKKyAgICBpZiAoaXNMQykgeworICAgICAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzID0gSVNfTE9XX0NPTUxFWElUWTsKKyAgICAgIHBuc0luZm8gPSBwbnNJbmZvVGFiX2xvd0NvbXBsZXhpdHk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgPSAwOworICAgICAgcG5zSW5mbyA9IHBuc0luZm9UYWI7CisgICAgfQorCisgICAgaWYgKCp1c2VQbnM8PTApCisgICAgICAgIHJldHVybiBBQUNfRU5DX09LOworCisgICAgLyogbmV3IHBucyBwYXJhbXMgKi8KKyAgICBoVXNlUG5zID0gRkRLYWFjRW5jX2xvb2tVcFBuc1VzZSAoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbiwgaXNMQyk7CisgICAgaWYgKGhVc2VQbnMgPT0gMCkgeworICAgICAgKnVzZVBucyA9IDA7CisgICAgICAgIHJldHVybiBBQUNfRU5DX09LOworICAgICAgICB9CisgICAgaWYgKGhVc2VQbnMgPT0gUE5TX1RBQkxFX0VSUk9SKQorICAgICAgcmV0dXJuIEFBQ19FTkNfUE5TX1RBQkxFX0VSUk9SOworCisgICAgLyogc2VsZWN0IGNvcnJlY3Qgcm93IG9mIHR1bmluZyB0YWJsZSAqLworICAgIHBuc0luZm8gKz0gaFVzZVBucy0xOworCisgICAgbnAtPnN0YXJ0U2ZiID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcoIHBuc0luZm8tPnN0YXJ0RnJlcSwKKyAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgc2ZiQ250LAorICAgICAgICBzZmJPZmZzZXQgKTsKKworICAgIG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyB8PSBwbnNJbmZvLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFnczsKKworICAgIG5wLT5yZWZQb3dlciAgICAgICAgICAgICA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmUG93ZXIpOworICAgIG5wLT5yZWZUb25hbGl0eSAgICAgICAgICA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmVG9uYWxpdHkpOworICAgIG5wLT50bnNHYWluVGhyZXNob2xkICAgICA9IHBuc0luZm8tPnRuc0dhaW5UaHJlc2hvbGQ7CisgICAgbnAtPnRuc1BOU0dhaW5UaHJlc2hvbGQgID0gcG5zSW5mby0+dG5zUE5TR2FpblRocmVzaG9sZDsKKyAgICBucC0+bWluU2ZiV2lkdGggICAgICAgICAgPSBwbnNJbmZvLT5taW5TZmJXaWR0aDsKKworICAgIG5wLT5nYXBGaWxsVGhyICAgICAgICAgICA9IChGSVhQX1NHTClwbnNJbmZvLT5nYXBGaWxsVGhyOworCisgICAgLyogYXNzdW1pbmcgYSBjb25zdGFudCBkQi9IeiBzbG9wZSBpbiB0aGUgc2lnbmFsJ3MgUFNEIGN1cnZlLAorICAgIHRoZSBkZXRlY3Rpb24gdGhyZXNob2xkIG5lZWRzIHRvIGJlIGNvcnJlY3RlZCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBiYW5kICovCisgICAgZm9yICggaSA9IDA7IGkgPCAoc2ZiQ250LTEpOyBpKyspCisgICAgeworICAgICAgICBJTlQgcXRtcCwgc2ZiV2lkdGg7CisgICAgICAgIEZJWFBfREJMIHRtcDsKKworICAgICAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpKzFdLXNmYk9mZnNldFtpXTsKKworICAgICAgICB0bXAgPSBmUG93KG5wLT5yZWZQb3dlciwgMCwgc2ZiV2lkdGgsIERGUkFDVF9CSVRTLTEtNSwgJnF0bXApOworICAgICAgICBucC0+cG93RGlzdFBTRGN1cnZlW2ldID0gKEZJWFBfU0dMKSgoTE9ORykoc2NhbGVWYWx1ZSh0bXAsIHF0bXApID4+IDE2KSk7CisgICAgfQorICAgIG5wLT5wb3dEaXN0UFNEY3VydmVbc2ZiQ250XSA9IG5wLT5wb3dEaXN0UFNEY3VydmVbc2ZiQ250LTFdOworCisgIHJldHVybiBBQUNfRU5DX09LOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uaCBiL2FhYy9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiYjgzZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmgKQEAgLTAsMCArMSwxNDEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1BOU1BBUkFNX0gKKyNkZWZpbmUgX19QTlNQQVJBTV9ICisKKyNpbmNsdWRlICJhYWNlbmMuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKyNkZWZpbmUgTlVNX1BOU0lORk9UQUIgICAgNAorI2RlZmluZSBQTlNfVEFCTEVfRVJST1IgICAtMQorCisvKiBkZXRlY3Rpb24gYWxnb3JpdGhtIGZsYWdzICovCisjZGVmaW5lIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gICAgICAgICAgICgxPDwwKQorI2RlZmluZSBVU0VfUFNZQ0hfVE9OQUxJVFkgICAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgVVNFX1ROU19HQUlOX1RIUiAgICAgICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFVTRV9UTlNfUE5TICAgICAgICAgICAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBKVVNUX0xPTkdfV0lORE9XICAgICAgICAgICAgICAgICAoMTw8NCkKKy8qIGFkZGl0aW9uYWwgYWxnb3JpdGhtIGZsYWdzICovCisjZGVmaW5lIElTX0xPV19DT01MRVhJVFkgICAgICAgICAgICAgICAgICgxPDw1KQorCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBQTlMgc3RhcnQgYmFuZCAqLworICBzaG9ydCBzdGFydFNmYjsKKworICAvKiBkZXRlY3Rpb24gYWxnb3JpdGhtIGZsYWdzICovCisgIFVTSE9SVCBkZXRlY3Rpb25BbGdvcml0aG1GbGFnczsKKworICAvKiBQYXJhbWV0ZXJzIGZvciBkZXRlY3Rpb24gKi8KKyAgRklYUF9EQkwgIHJlZlBvd2VyOworICBGSVhQX0RCTCAgcmVmVG9uYWxpdHk7CisgIElOVCAgICAgICB0bnNHYWluVGhyZXNob2xkOworICBJTlQgICAgICAgdG5zUE5TR2FpblRocmVzaG9sZDsKKyAgSU5UICAgICAgIG1pblNmYldpZHRoOworICBGSVhQX1NHTCAgcG93RGlzdFBTRGN1cnZlW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfU0dMICBnYXBGaWxsVGhyOworfSBOT0lTRVBBUkFNUzsKKworaW50IEZES2FhY0VuY19sb29rVXBQbnNVc2UgKGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW4sIGNvbnN0IGludCBpc0xDKTsKKworLyoqKioqKiBEZWZpbml0aW9uIG9mIHByb3RvdHlwZXMgKioqKioqLworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfR2V0UG5zUGFyYW0oTk9JU0VQQVJBTVMgKm5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqdXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bUNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgaXNMQyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZkOGVkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFByZSBlY2hvIGNvbnRyb2wKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgorI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisKK3ZvaWQgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICAqUkVTVFJJQ1QgcGJUaHJlc2hvbGRObTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKmNhbGNQcmVFY2hvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqUkVTVFJJQ1Qgc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKm1kY3RTY2FsZW5tMSkKK3sKKyAgKm1kY3RTY2FsZW5tMSA9IFBDTV9RVUFOVF9USFJfU0NBTEU+PjE7CisKKyAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBzZmJQY21RdWFudFRocmVzaG9sZCwgbnVtUGIqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgKmNhbGNQcmVFY2hvID0gMTsKK30KKworCit2b2lkIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICpSRVNUUklDVCBwYlRocmVzaG9sZE5tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIGNhbGNQcmVFY2hvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBwYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1kY3RTY2FsZW5tMSkKK3sKKyAgICBpbnQgaTsKKyAgICBGSVhQX0RCTCB0bXBUaHJlc2hvbGQxLCB0bXBUaHJlc2hvbGQyOworICAgIGludCBzY2FsaW5nOworCisJLyogSWYgbGFzdFdpbmRvd1NlcXVlbmNlIGluIHByZXZpb3VzIGZyYW1lIHdhcyBzdGFydC0gb3Igc3RvcC13aW5kb3csCisJICAgc2tpcCBwcmVlY2hvY29udHJvbCBjYWxjdWxhdGlvbiAqLworICAgIGlmIChjYWxjUHJlRWNobz09MCkgeworICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLworICAgICAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBwYlRocmVzaG9sZCwgbnVtUGIqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAqbWRjdFNjYWxlbm0xID0gbWRjdFNjYWxlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggbWRjdFNjYWxlID4gKm1kY3RTY2FsZW5tMSApIHsKKyAgICAgICAgLyogaWYgY3VycmVudCB0aHJlc2hvbGRzIGFyZSBkb3duc2NhbGVkIG1vcmUgdGhhbiB0aGUgb25lcyBmcm9tIHRoZSBsYXN0IGJsb2NrICovCisgICAgICAgIHNjYWxpbmcgPSAyKihtZGN0U2NhbGUtKm1kY3RTY2FsZW5tMSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKworICAgICAgICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludCBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgRkRLX0FTU0VSVChzY2FsaW5nPj0wKTsKKyAgICAgICAgICAgIHRtcFRocmVzaG9sZDEgPSBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgKiAocGJUaHJlc2hvbGRObTFbaV0+PnNjYWxpbmcpOworICAgICAgICAgICAgdG1wVGhyZXNob2xkMiA9IGZNdWx0KG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwgcGJUaHJlc2hvbGRbaV0pOworCisJCQlGSVhQX0RCTCB0bXAgPSBwYlRocmVzaG9sZFtpXTsKKworICAgICAgICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLworICAgICAgICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGZpeE1pbih0bXAsIHRtcFRocmVzaG9sZDEpOworICAgICAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgodG1wLCB0bXBUaHJlc2hvbGQyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogaWYgdGhyZXNob2xkcyBvZiBsYXN0IGJsb2NrIGFyZSBtb3JlIGRvd25zY2FsZWQgdGhhbiB0aGUgY3VycmVudCBvbmVzICovCisgICAgICAgIHNjYWxpbmcgPSAyKigqbWRjdFNjYWxlbm0xLW1kY3RTY2FsZSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKworICAgICAgICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludCBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgdG1wVGhyZXNob2xkMSA9IChtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I+PjEpICogcGJUaHJlc2hvbGRObTFbaV07CisgICAgICAgICAgICB0bXBUaHJlc2hvbGQyID0gZk11bHQobWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLCBwYlRocmVzaG9sZFtpXSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KKyAgICAgICAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07CisKKyAgICAgICAgICAgIEZES19BU1NFUlQoc2NhbGluZz49MCk7CisgICAgICAgICAgICBpZigocGJUaHJlc2hvbGRbaV0+PihzY2FsaW5nKzEpKSA+IHRtcFRocmVzaG9sZDEpIHsKKyAgICAgICAgICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDE8PChzY2FsaW5nKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgocGJUaHJlc2hvbGRbaV0sIHRtcFRocmVzaG9sZDIpOworICAgICAgICB9CisgICAgfQorCisgICAgKm1kY3RTY2FsZW5tMSA9IG1kY3RTY2FsZTsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaCBiL2FhYy9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI0ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5oCkBAIC0wLDAgKzEsMTE0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQcmUgZWNobyBjb250cm9sCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1BSRV9FQ0hPX0NPTlRST0xfSAorI2RlZmluZSBfX1BSRV9FQ0hPX0NPTlRST0xfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisKK3ZvaWQgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICAqcGJUaHJlc2hvbGRubTEsCisJCQkJCQlJTlQgICAgICAgICAqY2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJQY21RdWFudFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptZGN0U2NhbGVubTEpOworCisKK3ZvaWQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKEZJWFBfREJMICAgICpwYlRocmVzaG9sZE5tMSwKKwkJCQkJSU5UICAgICAgICAgY2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnBiVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptZGN0U2NhbGVubTEpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uY3BwIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTNmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jcHAKQEAgLTAsMCArMSw2NTYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiYWRqX3Roci5oIgorI2luY2x1ZGUgImFhY0VuY19yb20uaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgTE9ORyAgc2FtcGxlUmF0ZTsKKyAgICBjb25zdCBTRkJfUEFSQU1fTE9ORyAgKnBhcmFtTG9uZzsKKyAgICBjb25zdCBTRkJfUEFSQU1fU0hPUlQgKnBhcmFtU2hvcnQ7Cit9U0ZCX0lORk9fVEFCOworCisKK3N0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYltdID0geworICAgIHs4MDAwLCAgJnBfRkRLYWFjRW5jXzgwMDBfbG9uZ18xMDI0LCAgJnBfRkRLYWFjRW5jXzgwMDBfc2hvcnRfMTI4fSwKKyAgICB7MTEwMjUsICZwX0ZES2FhY0VuY18xMTAyNV9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18xMTAyNV9zaG9ydF8xMjh9LAorICAgIHsxMjAwMCwgJnBfRkRLYWFjRW5jXzEyMDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzEyMDAwX3Nob3J0XzEyOH0sCisgICAgezE2MDAwLCAmcF9GREthYWNFbmNfMTYwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMTYwMDBfc2hvcnRfMTI4fSwKKyAgICB7MjIwNTAsICZwX0ZES2FhY0VuY18yMjA1MF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18yMjA1MF9zaG9ydF8xMjh9LAorICAgIHsyNDAwMCwgJnBfRkRLYWFjRW5jXzI0MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzI0MDAwX3Nob3J0XzEyOH0sCisgICAgezMyMDAwLCAmcF9GREthYWNFbmNfMzIwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMzIwMDBfc2hvcnRfMTI4fSwKKyAgICB7NDQxMDAsICZwX0ZES2FhY0VuY180NDEwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY180NDEwMF9zaG9ydF8xMjh9LAorICAgIHs0ODAwMCwgJnBfRkRLYWFjRW5jXzQ4MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzQ4MDAwX3Nob3J0XzEyOH0sCisgICAgezY0MDAwLCAmcF9GREthYWNFbmNfNjQwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfNjQwMDBfc2hvcnRfMTI4fSwKKyAgICB7ODgyMDAsICZwX0ZES2FhY0VuY184ODIwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY184ODIwMF9zaG9ydF8xMjh9LAorICAgIHs5NjAwMCwgJnBfRkRLYWFjRW5jXzk2MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzk2MDAwX3Nob3J0XzEyOH0KKworfTsKKworLyogMjIwNTAgYW5kIDI0MDAwIEh6ICovCitzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8yMjA1MF9sb25nXzUxMiA9IHsKKyAgICAzMSwKKyAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsCisgICAgICAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgIDMyfQorfTsKKworLyogMzIwMDAgSHogKi8KK3N0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzMyMDAwX2xvbmdfNTEyID0geworICAgIDM3LAorICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKKyAgICAgIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyNCwgMjQsIDI4LAorICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9Cit9OworCisvKiA0NDEwMCBIeiAqLworc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfNDQxMDBfbG9uZ181MTIgPSB7CisgICAgMzYsCisgICAgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzIsCisgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCA1Mn0KK307CisKK3N0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYkxENTEyW10gPSB7CisgICAgeyA4MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezI0MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezMyMDAwLCAmcF8zMjAwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezY0MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezk2MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisKK307CisKKworLyogMjIwNTAgYW5kIDI0MDAwIEh6ICovCitzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8yMjA1MF9sb25nXzQ4MCA9IHsKKyAgICAzMCwKKyAgICB7IDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LAorICAgICAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn0KK307CisKKy8qIDMyMDAwIEh6ICovCitzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8zMjAwMF9sb25nXzQ4MCA9IHsKKyAgICAzNywKKyAgICB7IDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LAorICAgICAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjAsIDI0LCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9Cit9OworCisvKiA0NDEwMCBIeiAqLworc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfNDQxMDBfbG9uZ180ODAgPSB7CisgICAgMzUsCisgICAgeyA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKKyAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCA0OH0KK307CisKK3N0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYkxENDgwW10gPSB7CisgICAgeyA4MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezI0MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezMyMDAwLCAmcF8zMjAwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezY0MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezk2MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisKK307CisKKy8qIEZpeGVkIHBvaW50IHByZWNpc2lvbiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBRX0JBUkNWQUwgICAgICAgICgyNSkKKworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19pbml0U2ZiVGFibGUoTE9ORyBzYW1wbGVSYXRlLCBJTlQgYmxvY2tUeXBlLCBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UICpzZmJPZmZzZXQsIElOVCAqc2ZiQ250KQoreworICBJTlQgIGksIHNwZWNTdGFydE9mZnNldCA9IDA7CisgIGNvbnN0IFVDSEFSKiBzZmJXaWR0aCA9IE5VTEw7CisgIGNvbnN0IFNGQl9JTkZPX1RBQiAqc2ZiSW5mbyA9IE5VTEw7CisgIGludCBzaXplOworCisgIC8qCisgICAgc2VsZWN0IHRhYmxlCisgICovCisgIHN3aXRjaChncmFudWxlTGVuZ3RoKSB7CisgICAgY2FzZSAxMDI0OgorICAgIGNhc2UgIDk2MDoKKyAgICAgIHNmYkluZm8gPSBzZmJJbmZvVGFiOworICAgICAgc2l6ZSA9IChJTlQpKHNpemVvZihzZmJJbmZvVGFiKS9zaXplb2YoU0ZCX0lORk9fVEFCKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUxMjoKKyAgICAgIHNmYkluZm8gPSBzZmJJbmZvVGFiTEQ1MTI7CisgICAgICBzaXplID0gc2l6ZW9mKHNmYkluZm9UYWJMRDUxMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICAgIHNmYkluZm8gPSBzZmJJbmZvVGFiTEQ0ODA7CisgICAgICBzaXplID0gc2l6ZW9mKHNmYkluZm9UYWJMRDQ4MCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9GUkFNRV9MRU5HVEg7CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspeworICAgIGlmKHNmYkluZm9baV0uc2FtcGxlUmF0ZSA9PSBzYW1wbGVSYXRlKXsKKyAgICAgIHN3aXRjaChibG9ja1R5cGUpeworICAgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtTG9uZy0+c2ZiV2lkdGg7CisgICAgICAgICpzZmJDbnQgID0gc2ZiSW5mb1tpXS5wYXJhbUxvbmctPnNmYkNudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtU2hvcnQtPnNmYldpZHRoOworICAgICAgICAqc2ZiQ250ICA9IHNmYkluZm9baV0ucGFyYW1TaG9ydC0+c2ZiQ250OworICAgICAgICBncmFudWxlTGVuZ3RoIC89IFRSQU5TX0ZBQzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gc2l6ZSkgeworICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURTsKKyAgfQorCisgIC8qCisgICAgY2FsYyBzZmIgb2Zmc2V0cworICAqLworICBmb3IoaSA9IDA7IGkgPCAqc2ZiQ250OyBpKyspeworICAgICAgc2ZiT2Zmc2V0W2ldID0gc3BlY1N0YXJ0T2Zmc2V0OworICAgICAgc3BlY1N0YXJ0T2Zmc2V0ICs9IHNmYldpZHRoW2ldOworICAgICAgaWYgKHNwZWNTdGFydE9mZnNldCA+PSBncmFudWxlTGVuZ3RoKSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgICpzZmJDbnQgPSBmaXhNaW4oaSwqc2ZiQ250KTsKKyAgc2ZiT2Zmc2V0WypzZmJDbnRdID0gZml4TWluKHNwZWNTdGFydE9mZnNldCxncmFudWxlTGVuZ3RoKTsKKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUKKyAgICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgYmFyYyB2YWx1ZSBmb3Igb25lIGZyZXF1ZW5jeSBsaW5lCisgICAgcmV0dXJuczogICAgICBiYXJjIHZhbHVlIG9mIGxpbmUKKyAgICBpbnB1dDogICAgICAgIG51bWJlciBvZiBsaW5lcyBpbiB0cmFuc2Zvcm0sIGluZGV4IG9mIGxpbmUgdG8gY2hlY2ssIEZzCisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShJTlQgbm9PZkxpbmVzLCBJTlQgZmZ0TGluZSwgTE9ORyBzYW1wbGluZ0ZyZXEpCit7CisKKyAgICBGSVhQX0RCTCBGT1VSQlkzRU00ICAgICA9IChGSVhQX0RCTCkweDQ1ZTdiMjczOyAvKiA0LjAvMyAqIDAuMDAwMSBpbiBxNDMgKi8KKyAgICBGSVhQX0RCTCBQWlpaNzYgICAgICAgICA9IChGSVhQX0RCTCkweDYzOWQ1ZTRhOyAvKiAwLjAwMDc2IGluIHE0MSAqLworICAgIEZJWFBfREJMIE9ORTNQMyAgICAgICAgID0gKEZJWFBfREJMKTB4MzUzMzMzMzM7IC8qIDEzLjMgaW4gcTI2ICovCisgICAgRklYUF9EQkwgVEhSRUVQNSAgICAgICAgPSAoRklYUF9EQkwpMHgxYzAwMDAwMDsgLyogMy41IGluIHEyNyAqLworICAgIEZJWFBfREJMIElOVjQ4MCAgICAgICAgID0gKEZJWFBfREJMKTB4NDQ0NDQ0NDQ7IC8vIDEvNDgwIGluIHEzOQorCisgICAgRklYUF9EQkwgY2VudGVyX2ZyZXEsIHgxLCB4MjsKKyAgICBGSVhQX0RCTCBidmFsRkZUTGluZSwgYXRhbjEsIGF0YW4yOworCisgICAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiBjZW50ZXJfZnJlcSAoc2FtcF9mcmVxKjAuNSkgaXMgOTZraHogKiAwLjUgPSA0ODAwMCAgICAgICAgKi8KKyAgICAvKiBUaGVvcml0aWNhbCBtYXhpbXVtIG9mIHgxIGlzIDEuMzMzMzMzM2UtNGYgKiBjZW50ZXJfZnJlcSA9IDYuNCwgY2FuIGtlZXAgaW4gcTI4ICAqLworICAgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgeDIgaXMgMC4wMDA3NmYgKiBjZW50ZXJfZnJlcSA9IDM2LjQ4LCBjYW4ga2VlcCBpbiBxMjUgICAgICovCisKKyAgICBjZW50ZXJfZnJlcSA9IGZmdExpbmUgKiBzYW1wbGluZ0ZyZXE7ICAgICAgIC8qIHExMSBvciBxOCAqLworCisgICAgc3dpdGNoIChub09mTGluZXMpIHsKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgICAgY2VudGVyX2ZyZXEgPSBjZW50ZXJfZnJlcSA8PCAyOyAvKiBxMTMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyODoKKyAgICAgICAgY2VudGVyX2ZyZXEgPSBjZW50ZXJfZnJlcSA8PCA1OyAvKiBxMTMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUxMjoKKyAgICAgICAgY2VudGVyX2ZyZXEgPSAoZmZ0TGluZSAqIHNhbXBsaW5nRnJlcSkgPDwgMzsgICAvLyBxMTMKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ4MDoKKyAgICAgICAgY2VudGVyX2ZyZXEgPSBmTXVsdChjZW50ZXJfZnJlcSwgSU5WNDgwKSA8PCA0OyAvLyBxMTMKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBjZW50ZXJfZnJlcSA9IChGSVhQX0RCTCkwOworICAgIH0KKworICAgIHgxID0gZk11bHQoY2VudGVyX2ZyZXEsIEZPVVJCWTNFTTQpOyAgICAgICAgLyogcTEzICogcTQzIC0gKERGUkFDVF9CSVRTLTEpID0gcTI1ICovCisgICAgeDIgPSBmTXVsdChjZW50ZXJfZnJlcSwgUFpaWjc2KSA8PCAyOyAgICAgICAvKiBxMTMgKiBxNDEgLSAoREZSQUNUX0JJVFMtMSkgKyAyID0gcTI1ICovCisKKyAgICBhdGFuMSA9IGZpeHBfYXRhbih4MSk7CisgICAgYXRhbjIgPSBmaXhwX2F0YW4oeDIpOworCisgICAgLyogcTI1IChxMjYgKiBxMzAgLSAoREZSQUNUX0JJVFMtMSkpICsgcTI1IChxMjcgKiBxMzAgKiBxMzApICovCisgICAgYnZhbEZGVExpbmUgPSBmTXVsdChPTkUzUDMsIGF0YW4yKSArIGZNdWx0KFRIUkVFUDUsIGZNdWx0KGF0YW4xLCBhdGFuMSkpOworICAgIHJldHVybihidmFsRkZUTGluZSk7CisKK30KKworLyoKKyAgIGRvIG5vdCBjb25zaWRlciBlbmVyZ2llcyBiZWxvdyBhIGNlcnRhaW4gaW5wdXQgc2lnbmFsIGxldmVsLAorICAgaS5lLiBvZiAtOTZkQiBvciAxIGJpdCBhdCAxNiBiaXQgUENNIHJlc29sdXRpb24sCisgICBtaWdodCBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSB0byBlLmcuIDI0IGJpdCBQQ00gSW5wdXQgb3IgYSBsb3dlcgorICAgcmVzb2x1dGlvbiBmb3IgbG93IGJpdCByYXRlcworKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19Jbml0TWluUENNUmVzb2x1dGlvbihpbnQgICBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJQQ01xdWFudFRocmVzaG9sZCkKK3sKKyAgLyogUENNX1FVQU5UX05PSVNFID0gRkRLcG93KDEwLjBmLCAtIDIwLmYgLyAxMC4wZikgKiBBQlNfTE9XICogTk9STV9QQ01fRU5FUkdZICogRkRLcG93KDIsUENNX1FVQU5UX1RIUl9TQ0FMRSkgKi8KKyAgI2RlZmluZSBQQ01fUVVBTlRfTk9JU0UgICgoRklYUF9EQkwpMHgwMDU0NzA2MikKKworICBmb3IoIGludCBpID0gMDsgaSA8IG51bVBiOyBpKysgKSB7CisgICAgc2ZiUENNcXVhbnRUaHJlc2hvbGRbaV0gPSAocGJPZmZzZXRbaSsxXSAtIHBiT2Zmc2V0W2ldKSAqIFBDTV9RVUFOVF9OT0lTRTsKKyAgfQorfQorCitzdGF0aWMgRklYUF9EQkwgZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgY29uc3QgRklYUF9EQkwgZGJWYWxfZml4LAorICAgICAgICBjb25zdCBJTlQgICAgICBkYlZhbF9lLAorICAgICAgICBjb25zdCBGSVhQX0RCTCB0ZW5fZml4LAorICAgICAgICBjb25zdCBJTlQgICAgICB0ZW5fZQorICAgICAgICApCit7CisgICAgSU5UIHFfbXNrOworICAgIEZJWFBfREJMIG1hc2tfZmFjdG9yOworCisgICAgbWFza19mYWN0b3IgPSBmUG93KHRlbl9maXgsIERGUkFDVF9CSVRTLTEtdGVuX2UsIC1kYlZhbF9maXgsIERGUkFDVF9CSVRTLTEtZGJWYWxfZSwgJnFfbXNrKTsKKyAgICBxX21zayA9IGZpeE1pbihERlJBQ1RfQklUUy0xLGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHFfbXNrKSk7CisKKyAgICBpZiAoIChxX21zaz4wKSAmJiAobWFza19mYWN0b3I+KEZJWFBfREJMKU1BWFZBTF9EQkw+PnFfbXNrKSApIHsKKyAgICAgIG1hc2tfZmFjdG9yID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbWFza19mYWN0b3IgPSBzY2FsZVZhbHVlKG1hc2tfZmFjdG9yLCBxX21zayk7CisgICAgfQorCisgICAgcmV0dXJuIChtYXNrX2ZhY3Rvcik7Cit9CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0U3ByZWFkaW5nKElOVCBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiQmFyY1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrTG9GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiTWFza0xvRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGUpCisKK3sKKyAgICBJTlQgaTsKKyAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU4sIE1BU0tISUdIU1BSRU47CisKKyAgICBGSVhQX0RCTCBNQVNLSElHSCAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLTE9XICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDMuMCBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU5MT05HICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDMuMCBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9ORyAgICAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIDIuMCBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9OR0xPV0JSID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU5TSE9SVCAgICAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIDIuMCBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOU0hPUlQgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KKyAgICBGSVhQX0RCTCBURU4gICAgICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NTAwMDAwMDA7IC8qIDEwLjAgaW4gcTI3ICovCisKKyAgICBpZiAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykKKyAgICB7CisgICAgICAgIE1BU0tMT1dTUFJFTiA9IE1BU0tMT1dTUFJFTkxPTkc7CisgICAgICAgIE1BU0tISUdIU1BSRU4gPSAoYml0cmF0ZT4yMDAwMCk/TUFTS0hJR0hTUFJFTkxPTkc6TUFTS0hJR0hTUFJFTkxPTkdMT1dCUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTUFTS0xPV1NQUkVOID0gTUFTS0xPV1NQUkVOU0hPUlQ7CisgICAgICAgIE1BU0tISUdIU1BSRU4gPSBNQVNLSElHSFNQUkVOU0hPUlQ7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tISUdILCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpLTFdKSksIDIzLAorICAgICAgICAgICAgICAgICAgICBURU4sIDI3KTsKKworICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tMT1csIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV0pKSwgMjMsCisgICAgICAgICAgICAgICAgICAgIFRFTiwgMjcpOworCisgICAgICAgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgZk11bHQoTUFTS0hJR0hTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKKyAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7CisKKyAgICAgICAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5baS0xXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tMT1dTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKKyAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYk1hc2tIaUZhY3RvcltpXSAgICAgICAgICAgID0gKEZJWFBfREJMKTA7CisgICAgICAgICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYi0xXSAgICAgID0gKEZJWFBfREJMKTA7CisgICAgICAgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldICAgICAgID0gKEZJWFBfREJMKTA7CisgICAgICAgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW251bVBiLTFdID0gKEZJWFBfREJMKTA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0QmFyY1ZhbHVlcyhJTlQgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiQnZhbCkKK3sKKyAgICBJTlQgaTsKKyAgICBGSVhQX0RCTCBNQVhfQkFSQyA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAyNC4wIGluIHEyNSAqLworCisgICAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKQorICAgIHsKKyAgICAgICAgRklYUF9EQkwgdjEsIHYyLCBjdXJfYmFyazsKKyAgICAgICAgdjEgPSBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgcGJPZmZzZXRbaV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICAgICAgdjIgPSBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgcGJPZmZzZXRbaSsxXSwgc2FtcGxpbmdGcmVxdWVuY3kpOworICAgICAgICBjdXJfYmFyayA9ICh2MSA+PiAxKSArICh2MiA+PiAxKTsKKyAgICAgICAgcGJCdmFsW2ldID0gZml4TWluKGN1cl9iYXJrLCBNQVhfQkFSQyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdE1pblNucihjb25zdCBMT05HICAgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgbnVtTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnNmYk1pblNuckxkRGF0YSkKK3sKKyAgICBJTlQgc2ZiOworCisgICAgLyogRml4IGNvbnZlcnNpb24gdmFyaWFibGVzICovCisgICAgSU5UIHFiZmFjLCBxcGVyd2luLCBxZGl2LCBxcGVwcnRfY29uc3QsIHFwZXBydDsKKyAgICBJTlQgcXRtcCwgcXNuciwgc2ZiV2lkdGg7CisKKyAgICBGSVhQX0RCTCBNQVhfQkFSQyAgICAgICA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAyNC4wIGluIHEyNSAqLworICAgIEZJWFBfREJMIE1BWF9CQVJDUDEgICAgID0gKEZJWFBfREJMKTB4MzIwMDAwMDA7IC8qIDI1LjAgaW4gcTI1ICovCisgICAgRklYUF9EQkwgQklUUzJQRUZBQyAgICAgPSAoRklYUF9EQkwpMHg0Yjg1MWViODsgLyogMS4xOCBpbiBxMzAgKi8KKyAgICBGSVhQX0RCTCBQRVJTMlA0ICAgICAgICA9IChGSVhQX0RCTCkweDYyNGRkMmYyOyAvKiAwLjAyNCBpbiBxMzYgKi8KKyAgICBGSVhQX0RCTCBPTkVQNSAgICAgICAgICA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAvKiAxLjUgaW4gcTMwICovCisgICAgRklYUF9EQkwgTUFYX1NOUiAgICAgICAgPSAoRklYUF9EQkwpMHgzMzMzMzMzMzsgLyogMC44IGluIHEzMCAqLworICAgIEZJWFBfREJMIE1JTl9TTlIgICAgICAgID0gKEZJWFBfREJMKTB4MDAzMTI2ZTk7IC8qIDAuMDAzIGluIHEzMCAqLworCisgICAgRklYUF9EQkwgYmFyY0ZhY3RvciwgcGVQZXJXaW5kb3csIHBlUGFydCwgYmFyY1dpZHRoOworICAgIEZJWFBfREJMIHBlUGFydF9jb25zdCwgdG1wLCBzbnIsIG9uZV9xc25yLCBvbmVfcG9pbnQ1OworCisgICAgLyogcmVsYXRpdmUgbnVtYmVyIG9mIGFjdGl2ZSBiYXJrcyAqLworICAgIGJhcmNGYWN0b3IgPSBmRGl2Tm9ybShmaXhNaW4oRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHNmYk9mZnNldFtzZmJBY3RpdmVdLCBzYW1wbGVyYXRlKSwgTUFYX0JBUkMpLAorICAgICAgICBNQVhfQkFSQ1AxLCAmcWJmYWMpOworCisgICAgcWJmYWMgPSBERlJBQ1RfQklUUy0xLXFiZmFjOworCisgICAgcGVQZXJXaW5kb3cgPSBmRGl2Tm9ybShiaXRyYXRlLCBzYW1wbGVyYXRlLCAmcXBlcndpbik7CisgICAgcXBlcndpbiA9IERGUkFDVF9CSVRTLTEtcXBlcndpbjsKKyAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBCSVRTMlBFRkFDKTsgICAgICAgICAgICAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gKyAzMCAtIChERlJBQ1RfQklUUy0xKTsKKyAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBQRVJTMlA0KTsgICAgICAgICAgICAgICAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gKyAzNiAtIChERlJBQ1RfQklUUy0xKTsKKworICAgIHN3aXRjaCAobnVtTGluZXMpIHsKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyODoKKyAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTEyOgorICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0ODA6CisgICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gOTsKKyAgICAgICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgRkwyRlhDT05TVF9EQkwoNDgwLmYvNTEyLmYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZm9yIHNob3J0IGJsb2NrcyBpdCBpcyBhc3N1bWVkIHRoYXQgbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgKi8KKyAgICBpZiAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykKKyAgICB7CisgICAgICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIE9ORVA1KTsKKyAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gKyAzMCAtIChERlJBQ1RfQklUUy0xKTsKKyAgICB9CisgICAgcGVQYXJ0X2NvbnN0ID0gZkRpdk5vcm0ocGVQZXJXaW5kb3csIGJhcmNGYWN0b3IsICZxZGl2KTsgICAgICBxcGVwcnRfY29uc3QgPSBxcGVyd2luIC0gcWJmYWMgKyBERlJBQ1RfQklUUy0xLXFkaXY7CisKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCisgICAgeworICAgICAgICBiYXJjV2lkdGggPSBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYisxXSwgc2FtcGxlcmF0ZSkgLQorICAgICAgICAgICAgRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHNmYk9mZnNldFtzZmJdLCBzYW1wbGVyYXRlKTsKKworICAgICAgICAvKiBhZGFwdCB0byBzZmIgYmFuZHMgKi8KKyAgICAgICAgcGVQYXJ0ID0gZk11bHQocGVQYXJ0X2NvbnN0LCBiYXJjV2lkdGgpOyBxcGVwcnQgPSBxcGVwcnRfY29uc3QgKyAyNSAtIChERlJBQ1RfQklUUy0xKTsKKworICAgICAgICAvKiBwZSAtPiBzbnIgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgc2ZiV2lkdGggPSAoc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdKTsKKyAgICAgICAgcGVQYXJ0ID0gZkRpdk5vcm0ocGVQYXJ0LCBzZmJXaWR0aCwgJnFkaXYpOyBxcGVwcnQgKz0gREZSQUNUX0JJVFMtMS1xZGl2OworCisgICAgICAgIHRtcCA9IGYyUG93KHBlUGFydCwgREZSQUNUX0JJVFMtMS1xcGVwcnQsICZxdG1wKTsKKyAgICAgICAgcXRtcCA9IERGUkFDVF9CSVRTLTEtcXRtcDsKKworICAgICAgICAvKiBTdWJ0cmFjdCAxLjUgKi8KKyAgICAgICAgcXNuciA9IGZpeE1pbihxdG1wLCAzMCk7CisgICAgICAgIHRtcCA9IHRtcCA+PiAocXRtcCAtIHFzbnIpOworCisgICAgICAgIGlmKCgzMCsxLXFzbnIpID4gKERGUkFDVF9CSVRTLTEpKQorICAgICAgICAgICAgb25lX3BvaW50NSA9IChGSVhQX0RCTCkwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvbmVfcG9pbnQ1ID0gKEZJWFBfREJMKShPTkVQNSA+PiAoMzArMS1xc25yKSk7CisKKyAgICAgICAgc25yID0gKHRtcD4+MSkgLSAob25lX3BvaW50NSk7IHFzbnIgLT0gMTsKKworICAgICAgICAvKiBtYXgoc25yLCAxLjApICovCisgICAgICAgIGlmKHFzbnIgPiAwKQorICAgICAgICAgICAgb25lX3FzbnIgPSAoRklYUF9EQkwpKDEgPDwgcXNucik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9uZV9xc25yID0gKEZJWFBfREJMKTA7CisKKyAgICAgICAgc25yID0gZml4TWF4KG9uZV9xc25yLCBzbnIpOworCisgICAgICAgIC8qIDEvc25yICovCisgICAgICAgIHNuciA9IGZEaXZOb3JtKG9uZV9xc25yLCBzbnIsICZxc25yKTsKKyAgICAgICAgcXNuciA9IERGUkFDVF9CSVRTLTEtcXNucjsKKyAgICAgICAgc25yID0gKHFzbnIgPiAzMCk/IChzbnI+Pihxc25yLTMwKSk6c25yOworCisgICAgICAgIC8qIHVwcGVyIGxpbWl0IGlzIC0xIGRCICovCisgICAgICAgIHNuciA9IChzbnIgPiBNQVhfU05SKSA/IE1BWF9TTlIgOiBzbnI7CisKKyAgICAgICAgLyogbG93ZXIgbGltaXQgaXMgLTI1IGRCICovCisgICAgICAgIHNuciA9IChzbnIgPCBNSU5fU05SKSA/IE1JTl9TTlIgOiBzbnI7CisgICAgICAgIHNuciA9IHNuciA8PCAxOworCisgICAgICAgIHNmYk1pblNuckxkRGF0YVtzZmJdID0gQ2FsY0xkRGF0YShzbnIpOworICAgIH0KK30KKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKElOVCAgIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgYmxvY2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgdXNlSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBzeUNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJfVFlQRSBmaWx0ZXJiYW5rKQoreworICAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworICAgIElOVCAgICAgIHNmYjsKKyAgICBGSVhQX0RCTCBzZmJCYXJjVmFsW01BWF9TRkJdOworICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aExvbmcgPSBncmFudWxlTGVuZ3RoOworICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aFNob3J0ID0gZ3JhbnVsZUxlbmd0aC9UUkFOU19GQUM7CisKKyAgICBGREttZW1jbGVhcihwc3lDb25mLCBzaXplb2YoUFNZX0NPTkZJR1VSQVRJT04pKTsKKyAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoID0gZ3JhbnVsZUxlbmd0aDsKKyAgICBwc3lDb25mLT5maWx0ZXJiYW5rID0gZmlsdGVyYmFuazsKKworICAgIHBzeUNvbmYtPmFsbG93SVMgICAgICAgPSAodXNlSVMpICYmICggKGJpdHJhdGUvYmFuZHdpZHRoKSA8IDUgKTsKKworICAgIC8qIGluaXQgc2ZiIHRhYmxlICovCisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfaW5pdFNmYlRhYmxlKHNhbXBsZXJhdGUsYmxvY2t0eXBlLGdyYW51bGVMZW5ndGgscHN5Q29uZi0+c2ZiT2Zmc2V0LCZwc3lDb25mLT5zZmJDbnQpOworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQorICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgICAgLyogY2FsY3VsYXRlIGJhcmMgdmFsdWVzIGZvciBlYWNoIHBiICovCisgICAgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKHBzeUNvbmYtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCisgICAgICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKKworICAgIEZES2FhY0VuY19Jbml0TWluUENNUmVzb2x1dGlvbihwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlBjbVF1YW50VGhyZXNob2xkKTsKKworICAgIC8qIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24gKi8KKyAgICBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICBibG9ja3R5cGUpOworCisgICAgLyogaW5pdCByYXRpbyAqLworCisgICAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZWdlciAqLworICAgIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IChGSVhQX1NHTCkweDAxNDg7IC8qIEZMMkZYQ09OU1RfU0dMKDAuMDFmKTsgKi8gIC8qIGZyYWN0ICAgKi8KKworICAgIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPSAoRklYUF9EQkwpMHg3NzM1OTNmZjsgLyogRkwyRlhDT05TVF9EQkwoMS4wZTkqTk9STV9QQ01fRU5FUkdZKTsgKi8KKworICAgIGlmIChibG9ja3R5cGUhPVNIT1JUX1dJTkRPVykgeworICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IChJTlQpKCgyKmJhbmR3aWR0aCpmcmFtZUxlbmd0aExvbmcpL3NhbXBsZXJhdGUpOworICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IExGRV9MT1dQQVNTX0xJTkU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IChJTlQpKCgyKmJhbmR3aWR0aCpmcmFtZUxlbmd0aFNob3J0KS9zYW1wbGVyYXRlKTsKKyAgICAgICAgcHN5Q29uZi0+bG93cGFzc0xpbmVMRkUgPSAwOyAvKiBMRkUgb25seSBpbiBsb25mIGJsb2NrcyAqLworICAgICAgICAvKiBwc3lDb25mLT5jbGlwRW5lcmd5IC89IChUUkFOU19GQUMgKiBUUkFOU19GQUMpOyAqLworICAgICAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID4+PSA2OworICAgIH0KKworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKyl7CisgICAgICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwc3lDb25mLT5zZmJBY3RpdmUgPSBzZmI7CisKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspeworICAgICAgICBpZiAocHN5Q29uZi0+c2ZiT2Zmc2V0W3NmYl0gPj0gcHN5Q29uZi0+bG93cGFzc0xpbmVMRkUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHN5Q29uZi0+c2ZiQWN0aXZlTEZFID0gc2ZiOworCisgICAgLyogY2FsY3VsYXRlIG1pblNuciAqLworICAgIEZES2FhY0VuY19pbml0TWluU25yKGJpdHJhdGUsCisgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICBibG9ja3R5cGUsCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNaW5TbnJMZERhdGEpOworCisgICAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmggYi9hYWMvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjkyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTY1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1BTWV9DT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgX1BTWV9DT05GSUdVUkFUSU9OX0gKKworCisjaW5jbHVkZSAiYWFjZW5jLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgorI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKKworI2RlZmluZSBUSFJfU0hJRlRCSVRTICAgICAgICAgNAorI2RlZmluZSBQQ01fUVVBTlRfVEhSX1NDQUxFICAxNgorCisjZGVmaW5lIENfUkFUSU8gKEZJWFBfREJMKTB4MDI5NDBhMTAgLyogRkwyRlhDT05TVF9EQkwoMC4wMDEyNTg5MjVmKSA8PCBUSFJfU0hJRlRCSVRTOyAqLyAvKiBwb3coMTAuMGYsIC0oMjkuMGYvMTAuMGYpKSAqLworCit0eXBlZGVmIHN0cnVjdHsKKworICBJTlQgc2ZiQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXhpc3Rpbmcgc2YgYmFuZHMgKi8KKyAgSU5UIHNmYkFjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KKyAgSU5UIHNmYkFjdGl2ZUxGRTsKKyAgSU5UIHNmYk9mZnNldFtNQVhfU0ZCKzFdOworCisgIElOVCAgICAgICBmaWx0ZXJiYW5rOyAgICAgICAgICAgICAgICAgICAgIC8qIExDLCBMRCBvciBFTEQgKi8KKworICBGSVhQX0RCTCAgc2ZiUGNtUXVhbnRUaHJlc2hvbGRbTUFYX1NGQl07CisKKyAgSU5UICAgICAgIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsgICAgICAgICAgLyogcHJlZWNobyBjb250cm9sICovCisgIEZJWFBfU0dMICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7CisKKyAgSU5UICAgICAgIGxvd3Bhc3NMaW5lOworICBJTlQgICAgICAgbG93cGFzc0xpbmVMRkU7CisgIEZJWFBfREJMICBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBsZXZlbCBkZXBlbmRlbmQgdG1uICovCisKKyAgRklYUF9EQkwgIHNmYk1hc2tMb3dGYWN0b3JbTUFYX1NGQl07CisgIEZJWFBfREJMICBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCXTsKKworICBGSVhQX0RCTCAgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJdOworICBGSVhQX0RCTCAgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCXTsKKworICBGSVhQX0RCTCAgc2ZiTWluU25yTGREYXRhW01BWF9TRkJdOyAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KKworICBUTlNfQ09ORklHIHRuc0NvbmY7CisgIFBOU19DT05GSUcgcG5zQ29uZjsKKworICBJTlQgICAgICAgIGdyYW51bGVMZW5ndGg7CisgIElOVCAgICAgICAgYWxsb3dJUzsKKworfVBTWV9DT05GSUdVUkFUSU9OOworCisKK3R5cGVkZWYgc3RydWN0eworICAgIFVDSEFSIHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgICBVQ0hBUiBzZmJXaWR0aFtNQVhfU0ZCX0xPTkddOyAgICAgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGxvbmcgYmxvY2tzICovCit9U0ZCX1BBUkFNX0xPTkc7CisKK3R5cGVkZWYgc3RydWN0eworICAgIFVDSEFSIHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgICBVQ0hBUiBzZmJXaWR0aFtNQVhfU0ZCX1NIT1JUXTsgICAgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIHNob3J0IGJsb2NrcyAqLworfVNGQl9QQVJBTV9TSE9SVDsKKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oSU5UICBiaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGJsb2NrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICB1c2VJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl9UWVBFIGZpbHRlcmJhbmspOworCisjZW5kaWYgLyogX1BTWV9DT05GSUdVUkFUSU9OX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3BzeV9jb25zdC5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljOWY0MwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3BzeV9jb25zdC5oCkBAIC0wLDAgKzEsMTYwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBHbG9iYWwgcHN5Y2hvYWNjb3VzdGljIGNvbnN0YW50cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9QU1lDT05TVF9ICisjZGVmaW5lIF9QU1lDT05TVF9ICisKKworI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKworICAjZGVmaW5lIFRSQU5TX0ZBQyAgICAgICAgIDggIC8qIGVuY29kZXIgc2hvcnQgbG9uZyByYXRpbyAqLworCisjZGVmaW5lIEZSQU1FX01BWExFTl9TSE9SVCAgICAoKDEwMjQpL1RSQU5TX0ZBQykKKyNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUXzEyOCAgICgoMTAyNCkvVFJBTlNfRkFDKQorCisvKiBGaWx0ZXJiYW5rIHR5cGUqLworZW51bSBGQl9UWVBFIHsKKyAgRkJfTEMgID0gMCwKKyAgRkJfTEQgID0gMSwKKyAgRkJfRUxEID0gMgorfTsKKworLyogQmxvY2sgdHlwZXMgKi8KKyNkZWZpbmUgTl9CTE9DS1RZUEVTIDYKK2VudW0KK3sKKyAgTE9OR19XSU5ET1cgPSAwLAorICBTVEFSVF9XSU5ET1csCisgIFNIT1JUX1dJTkRPVywKKyAgU1RPUF9XSU5ET1csCisgIF9MT1dPVl9XSU5ET1csIC8qIERvIG5vdCB1c2UgdGhpcyBibG9jayB0eXBlIG91dCBzaWRlIG9mIGJsb2NrX3N3aXRjaC5jcHAgKi8KKyAgV1JPTkdfV0lORE9XCit9OworCisvKiBXaW5kb3cgc2hhcGVzICovCitlbnVtCit7CisgIFNJTkVfV0lORE9XID0gMCwKKyAgS0JEX1dJTkRPVyAgPSAxLAorICBMT0xfV0lORE9XID0gMiAvKiBMb3cgT3ZlckxhcCB3aW5kb3cgc2hhcGUgZm9yIEFBQy1MRCAqLworfTsKKworLyoKKyAgTVMgc3R1ZmYKKyovCitlbnVtCit7CisgIFNJX01TX01BU0tfTk9ORSA9IDAsCisgIFNJX01TX01BU0tfU09NRSA9IDEsCisgIFNJX01TX01BU0tfQUxMICA9IDIKK307CisKKworICAjZGVmaW5lIE1BWF9OT19PRl9HUk9VUFMgICA0CisgICNkZWZpbmUgTUFYX1NGQl9MT05HICAgICAgIDUxICAvKiA1MSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSA2NCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KKyAgI2RlZmluZSBNQVhfU0ZCX1NIT1JUICAgICAgMTUgIC8qIDE1IGZvciBhIG1lbW9yeSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24sIG1heWJlIDE2IGZvciBjb252ZW5pZW50IGRlYnVnZ2luZyAqLworCisjZGVmaW5lIE1BWF9TRkIgICAgICAgICAoTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IE1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpICAgLyogPSA1MSAqLworI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgKE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpIC8qID0gNjAgKi8KKworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSX1NJWkUgICgyKigxMDI0KSkgICAvKiAyMDQ4ICovCisKKworI2RlZmluZSBQQ01fTEVWRUwgICAgICAgICAgICAgMS4wZgorI2RlZmluZSBOT1JNX1BDTSAgICAgICAgICAgICAgKFBDTV9MRVZFTC8zMjc2OC4wZikKKyNkZWZpbmUgTk9STV9QQ01fRU5FUkdZICAgICAgIChOT1JNX1BDTSpOT1JNX1BDTSkKKyNkZWZpbmUgTE9HX05PUk1fUENNICAgICAgICAgIC0xNQorCisjZGVmaW5lIFROU19QUkVER0FJTl9TQ0FMRSAgICAoMTAwMCkKKworI2RlZmluZSBMRkVfTE9XUEFTU19MSU5FICAgICAgMTIKKworI2VuZGlmIC8qIF9QU1lDT05TVF9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9wc3lfZGF0YS5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTgzOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X2RhdGEuaApAQCAtMCwwICsxLDE1MiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogUHN5Y2hvYWNjb3VzdGljIGRhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9QU1lfREFUQV9ICisjZGVmaW5lIF9QU1lfREFUQV9ICisKKworI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgorCisvKiBCZSBjYXJlZnVsIHdpdGggTUFYX1NGQl9MT05HIGFzIGxlbmd0aCBvZiB0aGUgLkxvbmcgYXJyYXlzLgorICogc2ZiRW5lcmd5LkxvbmcgYW5kIHNmYkVuZXJneU1TLkxvbmcgYW5kIHNmYlRocmVzaG9sZC5Mb25nIGFyZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSByZWdyb3VwZWQKKyAqIHNob3J0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGJldHdlZW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgYW5kIEJ1aWxkSW50ZXJmYWNlKCkgaW4gRkRLYWFjRW5jX3BzeU1haW4oKS4KKyAqIFRoZSBzcGFjZSByZXF1aXJlZCBmb3IgdGhpcyBpcyBNQVhfR1JPVVBFRF9TRkIgKCA9IE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCApLgorICogSG93ZXZlciwgdGhpcyBpcyBub3QgaW1wb3J0YW50IGlmIHVuaW9ucyBhcmUgdXNlZCAod2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGggcGZsb2F0KS4gKi8KKwordHlwZWRlZiBzaG91bGRCZVVuaW9ueworICBGSVhQX0RCTCAgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCAgU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKK31TRkJfVEhSRVNIT0xEOworCit0eXBlZGVmIHNob3VsZEJlVW5pb257CisgIEZJWFBfREJMICBMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfVNGQl9FTkVSR1k7CisKK3R5cGVkZWYgc2hvdWxkQmVVbmlvbnsKKyAgRklYUF9EQkwgIExvbmdbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgIFNob3J0W1RSQU5TX0ZBQ11bTUFYX1NGQl9TSE9SVF07Cit9U0ZCX0xEX0VORVJHWTsKKwordHlwZWRlZiBzaG91bGRCZVVuaW9ueworICBJTlQgIExvbmdbTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfVNGQl9NQVhfU0NBTEU7CisKKwordHlwZWRlZiBzdHJ1Y3R7CisgIElOVF9QQ00qICAgICAgICAgICAgICAgICAgcHN5SW5wdXRCdWZmZXI7CisgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgb3ZlcmxhcEFkZEJ1ZmZlclsxMDI0XTsKKworICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbDsgICAgICAgICAgICAgIC8qIGJsb2NrIHN3aXRjaGluZyAqLworICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZG5tMVtNQVhfU0ZCXTsgICAgICAgICAgIC8qIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCAqLworICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZW5tMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIG9mIGxhc3QgYmxvY2sncyBtZGN0IChGREthYWNFbmNfUHJlRWNob0NvbnRyb2wpICovCisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgY2FsY1ByZUVjaG87CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgaXNMRkU7Cit9UFNZX1NUQVRJQzsKKworCit0eXBlZGVmIHN0cnVjdHsKKyAgRklYUF9EQkwgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW07CisgIFNGQl9USFJFU0hPTEQgICAgICAgICAgICAgc2ZiVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZmIgZW5lcmdpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTRkJfTERfRU5FUkdZICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YTsgICAgICAgICAgICAgICAgICAgIC8qIHNmYiBlbmVyZ2llcyBpbiBsZERhdGEgZm9ybWF0ICAgICAgICAgICovCisgIFNGQl9NQVhfU0NBTEUgICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjOworICBTRkJfRU5FUkdZICAgICAgICAgICAgICAgIHNmYkVuZXJneU1TOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pZC9zaWRlIHNmYiBlbmVyZ2llcyAgICAgICAgICAgICAgICAgICovCisgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TVNMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsgLyogbWlkL3NpZGUgc2ZiIGVuZXJnaWVzIGluIGxkRGF0YSBmb3JtYXQgKi8KKyAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJTcHJlYWRFbmVyZ3k7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhwb25lbnQgb2YgZGF0YSBpbiBtZGN0U3BlY3RydW0gICAgICAgKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQisxXTsKKyAgSU5UICAgICAgICAgICAgICAgICAgICAgICBzZmJBY3RpdmU7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbG93cGFzc0xpbmU7Cit9UFNZX0RBVEE7CisKKworI2VuZGlmIC8qIF9QU1lfREFUQV9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxOTNjNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3BzeV9tYWluLmNwcApAQCAtMCwwICsxLDEzODAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jaworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKworI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgorI2luY2x1ZGUgInRyYW5zZm9ybS5oIgorI2luY2x1ZGUgInNwcmVhZGluZy5oIgorI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJiYW5kX25yZy5oIgorI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAicHN5X2RhdGEuaCIKKyNpbmNsdWRlICJtc19zdGVyZW8uaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJwc3lfbWFpbi5oIgorI2luY2x1ZGUgImdycF9kYXRhLmgiCisjaW5jbHVkZSAidG5zX2Z1bmMuaCIKKyNpbmNsdWRlICJwbnNfZnVuYy5oIgorI2luY2x1ZGUgInRvbmFsaXR5LmgiCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorI2luY2x1ZGUgImludGVuc2l0eS5oIgorCisKKworLyogYmxlbmRpbmcgdG8gcmVkdWNlIGdpYmJzIGFydGlmYWN0cyAqLworI2RlZmluZSBGQURFX09VVF9MRU4gNgorc3RhdGljIGNvbnN0IEZJWFBfREJMIGZhZGVPdXRGYWN0b3JbRkFERV9PVVRfTEVOXSA9IHsxODQwNjQ0MDk2LCAxNTMzODcwMDgwLCAxMjI3MDk2MDY0LCA5MjAzMjIwNDgsIDYxMzU0ODAzMiwgMzA2Nzc0MDE2fTsKKworLyogZm9yd2FyZCBkZWZpbml0aW9ucyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUHN5TmV3CisgICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYworICAgIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQorICAgIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lOZXcoUFNZX0lOVEVSTkFMICAqKnBocHN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgICAgICpkeW5hbWljX1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgICBQU1lfSU5URVJOQUwgKmhQc3k7CisgICAgSU5UIGk7CisKKyAgICBoUHN5ID0gR2V0UmFtX2FhY0VuY19Qc3lJbnRlcm5hbCgpOworICAgICpwaHBzeSA9IGhQc3k7CisgICAgaWYgKGhQc3kgPT0gTlVMTCkgeworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgICAgICAvKiBQU1lfRUxFTUVOVCAqLworICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lFbGVtZW50KGkpOworICAgICAgICBpZiAoaFBzeS0+cHN5RWxlbWVudFtpXSA9PSBOVUxMKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgeworICAgICAgICAvKiBQU1lfU1RBVElDICovCisgICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUHN5U3RhdGljKGkpOworICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldPT1OVUxMKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCisgICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIgPSBHZXRSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKGkpOworICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldLT5wc3lJbnB1dEJ1ZmZlcj09TlVMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmV1c2FibGUgcHN5Y2ggbWVtb3J5ICovCisgICAgaFBzeS0+cHN5RHluYW1pYyA9IEdldFJhbV9hYWNFbmNfUHN5RHluYW1pYygwLCBkeW5hbWljX1JBTSk7CisKKyAgICByZXR1cm4gQUFDX0VOQ19PSzsKKworYmFpbDoKKyAgIEZES2FhY0VuY19Qc3lDbG9zZShwaHBzeSwgTlVMTCk7CisKKyAgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Qc3lPdXROZXcKKyAgICBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeU91dCBzdHJ1YworICAgIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQorICAgIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lPdXROZXcoUFNZX09VVCAgICoqcGhwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuU3ViRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgKmR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgaW50IG4sIGk7CisgIGludCBlbEluYyA9IDAsIGNoSW5jID0gMDsKKworICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKKyAgICBwaHBzeU91dFtuXSA9IEdldFJhbV9hYWNFbmNfUHN5T3V0KG4pOworCisgICAgaWYgKHBocHN5T3V0W25dID09IE5VTEwpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgICAgIHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoY2hJbmMrKyk7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cyhlbEluYysrKTsKKyAgICAgIGlmIChwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSA9PSBOVUxMKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogblN1YkZyYW1lcyAqLworCisgIHJldHVybiBBQUNfRU5DX09LOworCitiYWlsOgorICBGREthYWNFbmNfUHN5Q2xvc2UoTlVMTCwgcGhwc3lPdXQpOworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoUFNZX0lOVEVSTkFMICAgICpoUHN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX1NUQVRJQyogcHN5U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlKQoreworICAvKiBpbml0IGlucHV0IGJ1ZmZlciAqLworICBGREttZW1jbGVhcihwc3lTdGF0aWMtPnBzeUlucHV0QnVmZmVyLCBNQVhfSU5QVVRfQlVGRkVSX1NJWkUqc2l6ZW9mKElOVF9QQ00pKTsKKworICBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKCZwc3lTdGF0aWMtPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdChQU1lfSU5URVJOQUwgICAgKmhQc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICAgICAgICAqKnBocHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuTWF4Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CisgIGludCBpLCBjaCwgbiwgY2hJbmMgPSAwLCByZXNldENoYW5uZWxzID0gMzsKKworICBpZiAoIChuTWF4Q2hhbm5lbHM+MikgJiYgKGNtLT5uQ2hhbm5lbHM9PTIpICkgeworICAgIGNoSW5jID0gMTsKKyAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbMF0sIGF1ZGlvT2JqZWN0VHlwZSk7CisgIH0KKworICBpZiAoIChuTWF4Q2hhbm5lbHM9PTIpICkgeworICAgIHJlc2V0Q2hhbm5lbHMgPSAwOworICB9CisKKyAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSE9SURfTEZFKSB7CisgICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0gPSBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbY2hJbmNdOworICAgICAgICBpZiAoY2hJbmM+PXJlc2V0Q2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0sIGF1ZGlvT2JqZWN0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+aXNMRkUgPSAwOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0gPSBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbbk1heENoYW5uZWxzLTFdOworICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5pc0xGRSA9IDE7CisgICAgICB9CisgICAgICBjaEluYysrOworICAgIH0KKyAgfQorCisgIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgeworICAgIGNoSW5jID0gMDsKKyAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXSA9IHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbY2hJbmMrK107CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcHN5TWFpbkluaXQKKyAgICBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBzeWNob2Fjb3VzdGljCisgICAgcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbkluaXQoUFNZX0lOVEVSTkFMICpoUHN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0bnNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBpbml0RmxhZ3MpCit7CisgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworICBpbnQgaSwgY2g7CisgIGludCBjaGFubmVsc0VmZiA9IGNtLT5uQ2hhbm5lbHNFZmY7CisgIGludCB0bnNDaGFubmVscyA9IDA7CisgIEZCX1RZUEUgZmlsdGVyQmFuazsKKworCisgIHN3aXRjaChGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY20tPmVuY01vZGUpKSB7CisgICAgLyogLi4uIGFuZCBtYXAgdG8gdG5zQ2hhbm5lbHMgKi8KKyAgICBjYXNlIEVMX01PREVfTU9OTzogICB0bnNDaGFubmVscyA9IDE7IGJyZWFrOworICAgIGNhc2UgRUxfTU9ERV9TVEVSRU86IHRuc0NoYW5uZWxzID0gMjsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgdG5zQ2hhbm5lbHMgPSAwOworICB9CisKKyAgc3dpdGNoIChhdWRpb09iamVjdFR5cGUpCisgIHsKKyAgICBkZWZhdWx0OiBmaWx0ZXJCYW5rID0gRkJfTEM7ICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6ICBmaWx0ZXJCYW5rID0gRkJfTEQ7ICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOiBmaWx0ZXJCYW5rID0gRkJfRUxEOyBicmVhazsKKyAgfQorCisgIGhQc3ktPmdyYW51bGVMZW5ndGggPSBncmFudWxlTGVuZ3RoOworCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKGJpdFJhdGUvY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgTE9OR19XSU5ET1csIGhQc3ktPmdyYW51bGVMZW5ndGgsIHVzZUlTLCAmKGhQc3ktPnBzeUNvbmZbMF0pLCBmaWx0ZXJCYW5rKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKAorICAgICAgICAoYml0UmF0ZSp0bnNDaGFubmVscykvY2hhbm5lbHNFZmYsCisgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgIHRuc0NoYW5uZWxzLAorICAgICAgICBMT05HX1dJTkRPVywKKyAgICAgICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCwKKyAgICAgICAgKHN5bnRheEZsYWdzJkFDX1NCUl9QUkVTRU5UKT8xOjAsCisgICAgICAgJihoUHN5LT5wc3lDb25mWzBdLnRuc0NvbmYpLAorICAgICAgICZoUHN5LT5wc3lDb25mWzBdLAorICAgICAgICAoSU5UKSh0bnNNYXNrJjIpLAorICAgICAgICAoSU5UKSh0bnNNYXNrJjgpICk7CisKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgIGlmIChncmFudWxlTGVuZ3RoID4gNTEyKSB7CisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oYml0UmF0ZS9jaGFubmVsc0VmZiwgc2FtcGxlUmF0ZSwgYmFuZHdpZHRoLCBTSE9SVF9XSU5ET1csIGhQc3ktPmdyYW51bGVMZW5ndGgsIHVzZUlTLCAmaFBzeS0+cHN5Q29uZlsxXSwgZmlsdGVyQmFuayk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisKKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIChiaXRSYXRlKnRuc0NoYW5uZWxzKS9jaGFubmVsc0VmZiwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICB0bnNDaGFubmVscywKKyAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKKyAgICAgICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKKyAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0udG5zQ29uZiwKKyAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0sCisgICAgICAgICAgICAoSU5UKSh0bnNNYXNrJjEpLAorICAgICAgICAgICAgKElOVCkodG5zTWFzayY0KSApOworCisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgIH0KKworCisgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICBpZiAoaW5pdEZsYWdzKSB7CisgICAgICAgIC8qIHJlc2V0IHN0YXRlcyAqLworICAgICAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLCBhdWRpb09iamVjdFR5cGUpOworICAgICAgfQorCisgICAgICBGREthYWNFbmNfSW5pdFByZUVjaG9Db250cm9sKGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYlBjbVF1YW50VGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEpOworICAgIH0KKyAgfQorCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKCZoUHN5LT5wc3lDb25mWzBdLnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUvY2hhbm5lbHNFZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvWzBdLm5DaGFubmVsc0luRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUHN5LT5wc3lDb25mWzBdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCisgICAgcmV0dXJuIEVycm9yU3RhdHVzOworCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKCZoUHN5LT5wc3lDb25mWzFdLnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUvY2hhbm5lbHNFZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlsxXS5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvWzFdLm5DaGFubmVsc0luRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUHN5LT5wc3lDb25mWzFdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKK3N0YXRpYwordm9pZCBGREthYWNFbmNfZGVpbnRlcmxlYXZlSW5wdXRCdWZmZXIoSU5UX1BDTSAqcE91dHB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpwSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscykKK3sKKyAgICBJTlQgazsKKyAgICAvKiBkZWludGVybGF2ZSBpbnB1dCBzYW1wbGVzIGFuZCB3cml0ZSB0byBvdXRwdXQgYnVmZmVyICovCisgICAgZm9yIChrPTA7IGs8blNhbXBsZXM7IGsrKykgeworICAgICAgICBwT3V0cHV0U2FtcGxlc1trXSA9IHBJbnB1dFNhbXBsZXNbaypuQ2hhbm5lbHNdOworICAgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcHN5TWFpbgorICAgIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMKKyAgICByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBlbm91Z2ggaW5wdXQgZGF0YSBpcyBpbiB0aGUgbW9kdWxvIGJ1ZmZlci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRUxFTUVOVCAgICAgICAgKnBzeUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRFlOQU1JQyAgICAgICAgKnBzeUR5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAgKnBzeUNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgKlJFU1RSSUNUIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjaElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIElOVCBjb21tb25XaW5kb3cgPSAxOworICAgIElOVCBtYXhTZmJQZXJHcm91cFsoMildOworICAgIElOVCBtZGN0U3BlY3RydW1fZTsKKyAgICBJTlQgY2g7ICAgLyogY291bnRzIHRocm91Z2ggY2hhbm5lbHMgICAgICAgICAgKi8KKyAgICBJTlQgdzsgICAgLyogY291bnRzIHRocm91Z2ggd2luZG93cyAgICAgICAgICAgKi8KKyAgICBJTlQgc2ZiOyAgLyogY291bnRzIHRocm91Z2ggc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgICBJTlQgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KKworICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZkxvbmcgID0gJnBzeUNvbmZbMF07CisgICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhQc3lDb25mU2hvcnQgPSAmcHN5Q29uZlsxXTsKKyAgICBQU1lfT1VUX0NIQU5ORUwgICoqUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7CisgICAgRklYUF9TR0wgc2ZiVG9uYWxpdHlbKDIpXVtNQVhfU0ZCX0xPTkddOworCisgICAgUFNZX1NUQVRJQyAgICAgICAgKipSRVNUUklDVCBwc3lTdGF0aWMgPSBwc3lFbGVtZW50LT5wc3lTdGF0aWM7CisKKyAgICBQU1lfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBzeURhdGFbKDIpXTsKKyAgICBUTlNfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHRuc0RhdGFbKDIpXTsKKyAgICBQTlNfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbKDIpXTsKKworICAgIElOVCB6ZXJvU3BlYyA9IFRSVUU7IC8qIG1lYW5zIGFsbCBzcGVjdHJhbCBsaW5lcyBhcmUgemVybyAqLworCisgICAgSU5UIGJsb2NrU3dpdGNoaW5nT2Zmc2V0OworCisgICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhUaGlzUHN5Q29uZlsoMildOworICAgIElOVCB3aW5kb3dMZW5ndGhbKDIpXTsKKyAgICBJTlQgbldpbmRvd3NbKDIpXTsKKyAgICBJTlQgd09mZnNldDsKKworICAgIElOVCAgICAgICBtYXhTZmJbKDIpXTsKKyAgICBJTlQgICAgICAqcFNmYk1heFNjYWxlU3BlY1soMildOworICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5WygyKV07CisgICAgRklYUF9EQkwgKnBTZmJTcHJlYWRFbmVyZ3lbKDIpXTsKKyAgICBGSVhQX0RCTCAqcFNmYkVuZXJneUxkRGF0YVsoMildOworICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5TVNbKDIpXTsKKyAgICBGSVhQX0RCTCAqcFNmYlRocmVzaG9sZFsoMildOworCisgICAgSU5UIGlzU2hvcnRXaW5kb3dbKDIpXTsKKworCisgICAgaWYgKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayA9PSBGQl9MQykgeworICAgICAgYmxvY2tTd2l0Y2hpbmdPZmZzZXQgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoICsgKDkqcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aC8oMipUUkFOU19GQUMpKTsKKyAgICB9IGVsc2UgeworICAgICAgYmxvY2tTd2l0Y2hpbmdPZmZzZXQgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoOworICAgIH0KKworICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICBwc3lEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT5wc3lEYXRhW2NoXTsKKyAgICAgICAgdG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+dG5zRGF0YVtjaF07CisgICAgICAgIHBuc0RhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnBuc0RhdGFbY2hdOworCisgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gPSBwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtOworICAgIH0KKworICAgIC8qIGJsb2NrIHN3aXRjaGluZyAqLworICAgIGlmIChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmsgIT0gRkJfRUxEKQorICAgIHsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICB7CisgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBUaW1lU2lnbmFsLCBJTlRfUENNLCAoMTAyNCkpCisKKyAgICAgICAgICAvKiBkZWludGVybGVhdmUgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KKyAgICAgICAgICBGREthYWNFbmNfZGVpbnRlcmxlYXZlSW5wdXRCdWZmZXIoIHBUaW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcElucHV0W2NoSWR4W2NoXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscyk7CisKKworICAgICAgICAgIEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyAoJnBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmlzTEZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lU2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworICAgICAgICAgICAgLyogZmlsbCB1cCBpbnRlcm5hbCBpbnB1dCBidWZmZXIsIHRvIDJ4ZnJhbWVsZW5ndGggc2FtcGxlcyAqLworICAgICAgICAgICAgRkRLbWVtY3B5KHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyK2Jsb2NrU3dpdGNoaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIHBUaW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICgyKnBzeUNvbmYtPmdyYW51bGVMZW5ndGgtYmxvY2tTd2l0Y2hpbmdPZmZzZXQpKnNpemVvZihJTlRfUENNKSk7CisKKyAgICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocFRpbWVTaWduYWwsIElOVF9QQ00sICgxMDI0KSkKKyAgICAgIH0KKworICAgICAgLyogc3luY2ggbGVmdCBhbmQgcmlnaHQgYmxvY2sgdHlwZSAqLworICAgICAgZXJyID0gRkRLYWFjRW5jX1N5bmNCbG9ja1N3aXRjaGluZygmcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uV2luZG93KTsKKworICAgICAgaWYgKGVycikgeworICAgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsgLyogbWl4ZWQgdXAgTEMgYW5kIExEICovCisgICAgICB9CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgeworICAgICAgICAvKiBkZWludGVybGVhdmUgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KKyAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIGJsb2NrU3dpdGNoaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnB1dFtjaElkeFtjaF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscyk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgIGlzU2hvcnRXaW5kb3dbY2hdPShwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVyk7CisKKyAgICAvKiBzZXQgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gd2luZG93IGxlbmd0aCAqLworICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkgeworICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXSAgICAgICA9IGhQc3lDb25mU2hvcnQ7CisgICAgICAgICAgICB3aW5kb3dMZW5ndGhbY2hdICAgICAgID0gcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aC9UUkFOU19GQUM7CisgICAgICAgICAgICBuV2luZG93c1tjaF0gICAgICAgICAgID0gVFJBTlNfRkFDOworICAgICAgICAgICAgbWF4U2ZiW2NoXSAgICAgICAgICAgICA9IE1BWF9TRkJfU0hPUlQ7CisKKyAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLlNob3J0WzBdOworICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gICAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuU2hvcnRbMF07CisgICAgICAgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneS5TaG9ydFswXTsKKyAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLlNob3J0WzBdOworICAgICAgICAgICAgcFNmYkVuZXJneU1TW2NoXSAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5TaG9ydFswXTsKKyAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdICAgICAgPSBwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLlNob3J0WzBdOworCisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdICAgICAgID0gaFBzeUNvbmZMb25nOworICAgICAgICAgICAgd2luZG93TGVuZ3RoW2NoXSAgICAgICA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CisgICAgICAgICAgICBuV2luZG93c1tjaF0gICAgICAgICAgID0gMTsKKyAgICAgICAgICAgIG1heFNmYltjaF0gICAgICAgICAgICAgPSBNQVhfR1JPVVBFRF9TRkI7CisKKyAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLkxvbmc7CisgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSAgICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nOworICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKKyAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmc7CisgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbY2hdICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmc7CisgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSAgICAgID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVHJhbnNmb3JtIGFuZCBnZXQgbWRjdFNjYWxpbmcgZm9yIGFsbCBjaGFubmVscyBhbmQgd2luZG93cy4gKi8KKyAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgIHsKKyAgICAgICAgLyogdXBkYXRlIG51bWJlciBvZiBhY3RpdmUgYmFuZHMgKi8KKyAgICAgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlID0gaFRoaXNQc3lDb25mW2NoXS0+c2ZiQWN0aXZlTEZFOworICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID0gaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmVMRkU7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlID0gaFRoaXNQc3lDb25mW2NoXS0+c2ZiQWN0aXZlOworICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID0gaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7CisgICAgICAgIH0KKworICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworCisgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKKworICAgICAgICAgIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbCggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIgKyB3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWRjdFNwZWN0cnVtX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5maWx0ZXJiYW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwc3lTdGF0aWNbY2hdLT5vdmVybGFwQWRkQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAvKiBMb3cgcGFzcyAvIGhpZ2hlc3Qgc2ZiICovCisgICAgICAgICAgRkRLbWVtY2xlYXIoJnBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lK3dPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICh3aW5kb3dMZW5ndGhbY2hdLXBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSkqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgICAgICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0xDKSB7CisgICAgICAgICAgICAvKiBEbyBibGVuZGluZyB0byByZWR1Y2UgZ2liYnMgYXJ0aWZhY3RzICovCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8RkFERV9PVVRfTEVOOyBpKyspIHsKKyAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldCAtIEZBREVfT1VUX0xFTiArIGldID0gZk11bHQocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldCAtIEZBREVfT1VUX0xFTiArIGldLCBmYWRlT3V0RmFjdG9yW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKworICAgICAgICAgIC8qIENoZWNrIGZvciB6ZXJvIHNwZWN0cnVtLiBUaGVzZSBsb29wcyB3aWxsIHVzdWFsbHkgdGVybWluYXRlIHZlcnksIHZlcnkgZWFybHkuICovCisgICAgICAgICAgZm9yKGxpbmU9MDsgKGxpbmU8cHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lKSAmJiAoemVyb1NwZWM9PVRSVUUpOyBsaW5lKyspIHsKKyAgICAgICAgICAgICAgaWYgKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZSt3T2Zmc2V0XSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgICAgICAgICAgICAgemVyb1NwZWMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIH0gLyogdyBsb29wICovCisKKyAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSA9IG1kY3RTcGVjdHJ1bV9lOworCisgICAgICAgIC8qIHJvdGF0ZSBpbnRlcm5hbCB0aW1lIHNhbXBsZXMgKi8KKyAgICAgICAgRkRLbWVtbW92ZShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgqc2l6ZW9mKElOVF9QQ00pKTsKKworCisgICAgICAgIC8qIC4uLiBhbmQgZ2V0IHJlbWFpbmluZyBzYW1wbGVzIGZyb20gaW5wdXQgYnVmZmVyICovCisgICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5wdXRbICgyKnBzeUNvbmYtPmdyYW51bGVMZW5ndGgtYmxvY2tTd2l0Y2hpbmdPZmZzZXQpKnRvdGFsQ2hhbm5lbHMgKyBjaElkeFtjaF0gXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ09mZnNldC1wc3lDb25mLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOworCisgICAgfSAvKiBjaCAqLworCisgICAgLyogRG8gc29tZSByZXNjYWxpbmcgdG8gZ2V0IG1heGltdW0gcG9zc2libGUgYWNjdXJhY3kgZm9yIGVuZXJnaWVzICovCisgICAgaWYgKCB6ZXJvU3BlYyA9PSBGQUxTRSkgeworCisgICAgICAgIC8qIENhbGMgcG9zc2libGUgc3BlY3RydW0gbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdCBpcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLworICAgICAgICBJTlQgbWluU3BlY1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKKyAgICAgICAgSU5UIG5yZ1NoaWZ0ICAgICA9IE1BWF9TSElGVF9EQkw7CisgICAgICAgIElOVCBmaW5hbFNoaWZ0ICAgPSBNQVhfU0hJRlRfREJMOworICAgICAgICBGSVhQX0RCTCBjdXJyTnJnID0gMDsKKyAgICAgICAgRklYUF9EQkwgbWF4TnJnICA9IDA7CisKKyAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworCisgICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspCisgICAgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjIHBvc3NpYmxlIGVuZXJneSBsZWZ0c2hpZnQgZm9yIGVhY2ggc2ZiICgxIG1lYW5zOiAxIGJpdCBsZWZ0IHNoaWZ0IGlzIHBvc3NpYmxlIHdpdGhvdXQgb3ZlcmZsb3cpICovCisgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKKyAgICAgICAgICAgICAgICBjdXJyTnJnID0gRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0rdyptYXhTZmJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TcGVjU2hpZnQtNCk7CisKKyAgICAgICAgICAgICAgICBtYXhOcmcgPSBmaXhNYXgobWF4TnJnLCBjdXJyTnJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggbWF4TnJnICE9IChGSVhQX0RCTCkwICkgeworICAgICAgICAgICAgbnJnU2hpZnQgPSAoQ291bnRMZWFkaW5nQml0cyhtYXhOcmcpPj4xKSArIChtaW5TcGVjU2hpZnQtNCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAyY2hlY2s6IEhhc24ndCB0aGlzIGRlY2lzaW9uIHRvIGJlIG1hZGUgZm9yIGJvdGggY2hhbm5lbHM/ICovCisgICAgICAgIC8qIEZvciBzaG9ydCB3aW5kb3dzIDEgYWRkaXRpb25hbCBiaXQgaGVhZHJvb20gaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgb3ZlcmZsb3dzIHdoZW4gc3VtbWluZyB1cCBlbmVyZ2llcyBpbiBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoKSAqLworICAgICAgICBpZihpc1Nob3J0V2luZG93WzBdKSBucmdTaGlmdC0tOworCisgICAgICAgIC8qIGJvdGggc3BlY3RydW0gYW5kIGVuZXJnaWVzIG11c3RuJ3Qgb3ZlcmZsb3cgKi8KKyAgICAgICAgZmluYWxTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIG5yZ1NoaWZ0KTsKKworICAgICAgICAvKiBkbyBub3Qgc2hpZnQgbW9yZSB0aGFuIDMgYml0cyBtb3JlIHRvIHRoZSBsZWZ0IHRoYW4gc2lnbmFsIHdpdGhvdXQgYmxvY2tmbG9hdGluZyBwb2ludAorICAgICAgICAgKiB3b3VsZCBiZSB0byBhdm9pZCBvdmVyZmxvdyBvZiBzY2FsZWQgUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGRzICovCisgICAgICAgIGlmIChmaW5hbFNoaWZ0ID4gcHN5RGF0YVswXS0+bWRjdFNjYWxlICsgMyApCisgICAgICAgICAgICBmaW5hbFNoaWZ0ID0gcHN5RGF0YVswXS0+bWRjdFNjYWxlICsgMzsKKworICAgICAgICBGREtfQVNTRVJUKGZpbmFsU2hpZnQgPj0gMCk7ICAgIC8qIHJpZ2h0IHNoaWZ0IGlzIG5vdCBhbGxvd2VkICovCisKKyAgICAgICAgLyogY29ycmVjdCBzZmJFbmVyZ3kgYW5kIHNmYkVuZXJneUxkRGF0YSB3aXRoIG5ldyBmaW5hbFNoaWZ0ICovCisgICAgICAgIEZJWFBfREJMIGxkU2hpZnQgPSBmaW5hbFNoaWZ0ICogRkwyRlhDT05TVF9EQkwoMi4wLzY0KTsKKyAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGUgPSBmaXhNYXgoMCwgKHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXS00KTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgICAgID0gZml4TWluKChzY2FsZS1maW5hbFNoaWZ0KTw8MSwgREZSQUNUX0JJVFMtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+PSAwKSAocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdID4+PSAoc2NhbGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgKHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA8PD0gKC1zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIChwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPSBmTXVsdCgocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdLCBDX1JBVElPKTsKKyAgICAgICAgICAgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSArPSBsZFNoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZmluYWxTaGlmdCAhPSAwICkgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICAgICAgICAgICAgICBmb3IobGluZT0wOyBsaW5lPHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZTsgbGluZSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUrd09mZnNldF0gPDw9IGZpbmFsU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHNmYk1heFNjYWxlU3BlYyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gLT0gZmluYWxTaGlmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogdXBkYXRlIG1kY3RTY2FsZSAqLworICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgLT0gZmluYWxTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYWxsIHNwZWN0cmFsIGxpbmVzIGFyZSB6ZXJvICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlID0gMDsgICAgIC8qIG90aGVyd2lzZSBtZGN0U2NhbGUgd291bGQgYmUgZm9yIGV4YW1wbGUgNyBhbmQgUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGRzIHdvdWxkIGJlIHNoaWZ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTQgYml0cyB0byB0aGUgcmlnaHQgY2F1c2luZyBzb21lIG9mIHRoZW0gdG8gYmVjb21lIDAgKHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBsYXRlcikgKi8KKyAgICAgICAgICAgIC8qIGNsZWFyIHNmYk1heFNjYWxlU3BlYyAqLworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICAgICAgICAgICAgICAocFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdKVtzZmJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSAgICAgICA9IChGSVhQX0RCTCkwOworICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgICAgICAgICAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgID0gKEZJWFBfREJMKTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQWR2YW5jZSBwc3ljaG9hY291c3RpY3M6IFRvbmFsaXR5IGFuZCBUTlMgKi8KKyAgICBpZiAocHN5U3RhdGljWzBdLT5pc0xGRSkgeworICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaWYgKCFpc1Nob3J0V2luZG93W2NoXSkgeworICAgICAgICAgICAgICAgIC8qIHRvbmFsaXR5ICovCisgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eSggcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJUb25hbGl0eVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+cG5zQ29uZi51c2VQbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNBY3RpdmUgfHwgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNBY3RpdmUpIHsKKyAgICAgICAgICAgIElOVCB0bnNBY3RpdmVbVFJBTlNfRkFDXTsKKyAgICAgICAgICAgIElOVCBucmdTY2FsaW5nWzJdID0gezAsMH07CisgICAgICAgICAgICBJTlQgdG5zU3BlY1NoaWZ0ID0gMDsKKworICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgLyogVE5TICovCisgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19UbnNEZXRlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgRkRLYWFjRW5jX1Ruc1N5bmMoCisgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzFdLT50bnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzBdLT50bnNJbmZvLAorCisgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mWzFdLT50bnNDb25mKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRkRLX0FTU0VSVChjb21tb25XaW5kb3c9MSk7IC8qIGFsbCBjaGVja3MgZm9yIFROUyBkbyBvbmx5IHdvcmsgZm9yIGNvbW1vbiB3aW5kb3dzICh3aGljaCBpcyBhbHdheXMgc2V0KSovCisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1swXTsgdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1Nob3J0V2luZG93WzBdKQorICAgICAgICAgICAgICAgICAgICB0bnNBY3RpdmVbd10gPSB0bnNEYXRhWzBdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgfHwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFubmVscyA9PSAyKSA/IHRuc0RhdGFbMV0tPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZSA6IDApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0gdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgfHwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFubmVscyA9PSAyKSA/IHRuc0RhdGFbMV0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlIDogMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodG5zQWN0aXZlWzBdICYmICFpc1Nob3J0V2luZG93W2NoXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSBkb3duIHNwZWN0cnVtIGlmIHRucyBpcyBhY3RpdmUgaW4gb25lIG9mIHRoZSB0d28gY2hhbm5lbHMgd2l0aCBzYW1lIGxhc3RXaW5kb3dTZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbjsgaXQncyBub3QgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBzZmJNYXhTY2FsZVNwZWMgKi8KKyAgICAgICAgICAgICAgICAgICAgSU5UIHNoaWZ0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHNmYj0wOyBzZmI8aFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IHNmYisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPSBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdGhyZXNob2xkcyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdW3NmYl0gPj49ICgyKnNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgKz0gc2hpZnQ7IC8qIHVwZGF0ZSBtZGN0U2NhbGUgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIHNmYkVuZXJnaWVzIGFmdGVyIHRuc0VuY29kZSBhZ2FpbiAhICovCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfVG5zRW5jb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbY2hdLT50bnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXRbcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZV0sLypoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZSovIC8qIGZpbHRlciBzdG9wcyBiZWZvcmUgdGhhdCBsaW5lICEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlKTsKKworICAgICAgICAgICAgICAgICAgICBpZih0bnNBY3RpdmVbd10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRucyBhY3RpdmUgaW4gY3VycmVudCBjaGFubmVsIG9yIGluIG9uZSBjaGFubmVsIHdpdGggc2FtZSBsYXN0V2luZG93U2VxdWVuY2UgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworCisgICAgICAgICAgICAgICAgaWYgKHRuc0FjdGl2ZVt3XSkgeworCisgICAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3cqd2luZG93TGVuZ3RoW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5yZ1NjYWxpbmdbY2hdID0gICAgICAgIC8qIHdpdGggdG5zLCBlbmVyZ3kgY2FsY3VsYXRpb24gY2FuIG92ZXJmbG93OyAtPiBzY2FsaW5nICovCisgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdKTsKKyAgICAgICAgICAgICAgICAgICAgdG5zU3BlY1NoaWZ0ID0gZml4TWF4KHRuc1NwZWNTaGlmdCwgbnJnU2NhbGluZ1tjaF0pOyAgICAgICAvKiBucmdTY2FsaW5nIGlzIHNldCBvbmx5IGlmIG5yZyB3b3VsZCBoYXZlIGFuIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBpZiB0bnNBY3RpdmUgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBlbmQgY2hhbm5lbCBsb29wICovCisKKyAgICAgICAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdG8gcHJldmVudCBucmcgb3ZlcmZsb3csIG9ubHkgZm9yIGxvbmcgYmxvY2tzICovCisgICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgIGlmICggKHRuc1NwZWNTaGlmdCE9MCkgJiYgIWlzU2hvcnRXaW5kb3dbY2hdICkgeworICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gc3BlY3RydW0sIG5yZydzIGFuZCB0aHJlc2hvbGRzLCBpZiB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cgaW4gc2ZiTnJnIGNhbGN1bGF0aW9uIGFmdGVyIHRucyAqLworICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8aFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IGxpbmUrKykgeworICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSA+Pj0gdG5zU3BlY1NoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTlQgc2NhbGUgPSAodG5zU3BlY1NoaWZ0LW5yZ1NjYWxpbmdbY2hdKTw8MTsKKyAgICAgICAgICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF1bc2ZiXSAgIC09IHNjYWxlKkZMMkZYQ09OU1RfREJMKDEuMC9MRF9EQVRBX1NDQUxJTkcpOworICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF1bc2ZiXSAgICAgICAgPj49IHNjYWxlOworICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF1bc2ZiXSAgICAgPj49ICh0bnNTcGVjU2hpZnQ8PDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHRuc1NwZWNTaGlmdDsgIC8qIHVwZGF0ZSBtZGN0U2NhbGU7IG5vdCBuZWNlc3NhcnkgdG8gdXBkYXRlIHNmYk1heFNjYWxlU3BlYyAqLworCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLworCisgICAgICAgIH0gLyogVE5TIGFjdGl2ZSAqLworICAgIH0gIC8qICFpc0xGRSAqLworCisKKworCisKKworICAgIC8qIEFkdmFuY2UgdGhyZXNob2xkcyAqLworICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgSU5UIGhlYWRyb29tOworCisgICAgICAgIEZJWFBfREJMIGNsaXBFbmVyZ3k7CisgICAgICAgIElOVCBlbmVyZ3lTaGlmdCAgPSBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlKjIgOworICAgICAgICBJTlQgY2xpcE5yZ1NoaWZ0ID0gZW5lcmd5U2hpZnQgLSBUSFJfU0hJRlRCSVRTIDsKKworICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKKyAgICAgICAgICAgIGhlYWRyb29tID0gNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZHJvb20gPSAwOworCisgICAgICAgIGlmIChjbGlwTnJnU2hpZnQgPj0gMCkKKyAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5ID4+ICBjbGlwTnJnU2hpZnQgOworICAgICAgICBlbHNlIGlmIChjbGlwTnJnU2hpZnQ+PS1oZWFkcm9vbSkKKyAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5IDw8IC1jbGlwTnJnU2hpZnQgOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGlwRW5lcmd5ID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgOworCisgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKQorICAgICAgICB7CisgICAgICAgICAgICBJTlQgaTsKKyAgICAgICAgICAgIC8qIGxpbWl0IHRocmVzaG9sZCB0byBhdm9pZCBjbGlwcGluZyAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNaW4oKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSksIGNsaXBFbmVyZ3kpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzcHJlYWRpbmcgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY19TcHJlYWRpbmdNYXgocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrTG93RmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXSk7CisKKworICAgICAgICAgICAgLyogUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgKi8KKyAgICAgICAgICAgIGVuZXJneVNoaWZ0ICs9IFBDTV9RVUFOVF9USFJfU0NBTEU7CisgICAgICAgICAgICBpZiAoZW5lcmd5U2hpZnQ+PTApIHsKKyAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsZW5lcmd5U2hpZnQpOworICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA9IGZpeE1heCgqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA+PiBUSFJfU0hJRlRCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoVGhpc1BzeUNvbmZbY2hdLT5zZmJQY21RdWFudFRocmVzaG9sZFtpXSA+PiBlbmVyZ3lTaGlmdCkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWVuZXJneVNoaWZ0KTsKKyAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNYXgoKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPj4gVEhSX1NISUZUQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPDwgZW5lcmd5U2hpZnQpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KKyAgICAgICAgICAgICAgICBpZihwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGZyb20gY29tcGFyaW5nIHN0b3AKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEpOworCisgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gPSAxOworCisgICAgICAgICAgICAgICAgaWYocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTVEFSVF9XSU5ET1cpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCBpbiBuZXh0IGZyYW1lIHRvIGNvbXBhcmUgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3ByZWFkIGVuZXJneSB0byBhdm9pZCBob2xlIGRldGVjdGlvbiAqLworICAgICAgICAgICAgRkRLbWVtY3B5KHBTZmJTcHJlYWRFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAgICAgICBGREthYWNFbmNfU3ByZWFkaW5nTWF4KHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0rdyptYXhTZmJbY2hdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsLiBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMgZXhpc3QgKi8KKyAgICBpZiAoY2hhbm5lbHM9PTIpIHsKKyAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbMV07IHcrKykgeworICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoWzFdOworICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQocHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzBdK3cqbWF4U2ZiWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzFdK3cqbWF4U2ZiWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbMV0tPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbMF0rdyptYXhTZmJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lNU1sxXSt3Km1heFNmYlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVNMZERhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ3JvdXAgc2hvcnQgZGF0YSAobWF4U2ZiW2NoXSBmb3Igc2hvcnQgYmxvY2tzIGlzIGRldGVybWluZWQgaGVyZSkgKi8KKyAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKQorICAgIHsKKyAgICAgICAgSU5UIG5vU2ZiLCBpOworICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNmYkdycDsKKyAgICAgICAgICAgIG5vU2ZiID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKiBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7CisgICAgICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBhcmUgY29waWVkL3JlZ3JvdXBlZCBmcm9tIHRoZSAiLlNob3J0IiB0byB0aGUgIi5Mb25nIiBhcnJheXMgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSggcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNmYlBlckdyb3VwW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzFdLmdyYW51bGVMZW5ndGgpOworCisKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBsZERhdGEgYXJyYXlzIChzaG9ydCB2YWx1ZXMgYXJlIGluIC5Mb25nLWFycmF5cyBhZnRlciBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEpICovCisgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CisgICAgICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nW3NmYkdycF0sICZwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLworICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgeworICAgICAgICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZ1tzZmJHcnBdLCAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgICAgICAgICAgZm9yIChzZmI9MDtzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtzZmIrKykgeworICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGNoYW5uZWxzPT0yICkgeworICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CisgICAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuTG9uZ1tzZmJHcnBdLCAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TTGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0cywgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsIChNQVhfR1JPVVBFRF9TRkIrMSkqc2l6ZW9mKElOVCkpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBtYXhTZmJbY2hdIGZvciBsb25nIGJsb2NrcyAqLworICAgICAgICAgICAgZm9yIChzZmIgPSBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLTE7IHNmYiA+PSAwOyBzZmItLSkgeworICAgICAgICAgICAgICAgIGZvciAobGluZSA9IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYisxXS0xOyBsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSAhPSBGTDJGWENPTlNUX1NHTCgwLjBmKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lID4gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBzZmIgKyAxOworICAgICAgICAgICAgLyogZW5zdXJlIGF0IGxlYXN0IG9uZSBzZWN0aW9uIGluIElDUzsgd29ya2Fyb3VuZCBmb3IgZXhpc3RpbmcgZGVjb2RlciBjcmMgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IGZpeE1heChmaXhNaW4oNSxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKSxtYXhTZmJQZXJHcm91cFtjaF0pOworCisgICAgICAgICAgICAvKiBzZmJOcmdMZERhdGEgaXMgY2FsY3VsYXRlZCBpbiBGREthYWNFbmNfYWR2YW5jZVBzeWNoTG9uZywgY29weSBpbiBwc3lPdXQgc3RydWN0dXJlICovCisgICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LCAoTUFYX0dST1VQRURfU0ZCKzEpKnNpemVvZihJTlQpKTsKKworICAgICAgICAgICAgLyogc2ZiTWluU25yTGREYXRhIG1vZGlmaWVkIGluIGFkanVzdCB0aHJlc2hvbGQsIGNvcHkgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnJMZERhdGEsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgICAgICAgIC8qIHNmYkVuZXJneU1TTGREYXRhIGlzdCBhbHJlYWR5IGNhbGN1bGF0ZWQgaW4gRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQ7IG9ubHkgaW4gbG9uZyBjYXNlICovCisKKyAgICAgICAgICAgIC8qIGNhbGMgc2ZiVGhybGQgYW5kIHNldCBWYWx1ZXMgc21hbGxlciAyXi0zMSB0byAyXi0zMyovCisgICAgICAgICAgICBMZERhdGFWZWN0b3IocHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nLCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgICAgICAgIGZvciAoaT0wO2k8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhNYXgocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSwgRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qCisgICAgICAgIEludGVuc2l0eSBwYXJhbWV0ZXIgaW50aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKElOVCkpOworICAgICAgICBGREttZW1jbGVhcihwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSwgTUFYX0dST1VQRURfU0ZCKnNpemVvZihJTlQpKTsKKyAgICB9CisKKyAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7CisgICAgICAgIElOVCB3aW4gPSAoaXNTaG9ydFdpbmRvd1tjaF0/MTowKTsKKyAgICAgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUE5TIERlY2lzaW9uICovCisgICAgICAgICAgICBGREthYWNFbmNfUG5zRGV0ZWN0KCAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCisgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0sIC8qIGNvdW50IG9mIFNmYiB3aGljaCBhcmUgbm90IHplcm8uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbd2luXS5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJNYXhTY2FsZVNwZWMuTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHlbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+dG5zSW5mby5vcmRlclswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnICk7CisgICAgICAgIH0gLyogIWlzTEZFICovCisgICAgfQorCisgICAgLyoKKyAgICAgICAgc3RlcmVvIFByb2Nlc3NpbmcKKyAgICAqLworICAgIGlmKGNoYW5uZWxzID09IDIpCisgICAgeworICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QgPSBNU19OT05FOworICAgICAgICBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3cgICAgICAgPSBjb21tb25XaW5kb3c7CisgICAgICAgIGlmIChwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3cpCisgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSA9IG1heFNmYlBlckdyb3VwWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChtYXhTZmJQZXJHcm91cFswXSwgbWF4U2ZiUGVyR3JvdXBbMV0pOworCisgICAgICAgIGlmKHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBOUyBwcmVwcm9jZXNzaW5nIGRlcGVuZGluZyBvbiBtcyBwcm9jZXNzaW5nOiBQTlMgbm90IGluIFNob3J0IFdpbmRvdyEgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZwc3lEYXRhWzBdLT5zZmJFbmVyZ3kpLT5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnBzeURhdGFbMV0tPnNmYkVuZXJneSktPkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNUy5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMV0pOworCisgICAgICAgICAgICBGREthYWNFbmNfSW50ZW5zaXR5U3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlRocmVzaG9sZC5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgY29tbW9uV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGEpOworCisgICAgICAgICAgICBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CisKKyAgICAgICAgICAgIC8qIFBOUyBwb3N0cHJvY2Vzc2luZyAqLworICAgICAgICAgICAgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIocHN5RGF0YVswXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGREthYWNFbmNfSW50ZW5zaXR5U3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlRocmVzaG9sZC5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzFdLnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPmdyb3VwZWRTZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uYWxsb3dJUyAmJiBjb21tb25XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YSk7CisKKyAgICAgICAgICAgIC8qIGl0J3MgT0sgdG8gcGFzcyB0aGUgIi5Mb25nIiBhcnJheXMgaGVyZS4gVGhleSBjb250YWluIGdyb3VwZWQgc2hvcnQgZGF0YSBzaW5jZSBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoKSAqLworICAgICAgICAgICAgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZyggcHN5RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyoKKyAgICBQTlMgQ29kaW5nCisgICovCisgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspIHsKKyAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgeworICAgICAgICAgIC8qIG5vIFBOUyBjb2RpbmcgKi8KKyAgICAgICAgICBmb3Ioc2ZiID0gMDsgc2ZiIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOworICAgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgeworICAgICAgICAgIEZES2FhY0VuY19Db2RlUG5zQ2hhbm5lbChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICYocHN5Q29uZltjaF0ucG5zQ29uZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVtjaF0tPnBuc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZywgLyogdGhpcyBpcyB0aGUgZW5lcmd5IHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhKTsKKyAgICAgIH0KKyAgfQorCisgICAgLyoKKyAgICAgICAgYnVpbGQgb3V0cHV0CisgICAgKi8KKyAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKQorICAgIHsKKyAgICAgICAgSU5UIGosIGdycCwgbWFzazsKKworICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cFtjaF07CisgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUgICAgICAgICA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGU7CisKKyAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF09PTApIHsKKworICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7CisgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAgICAgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKKyAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlOworICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPndpbmRvd1NoYXBlICAgID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgSU5UIHNmYkNudCA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudDsKKworICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gc2ZiQ250OworICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwICAgID0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250OworICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKKyAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2VuZXJhdGUgZ3JvdXBpbmcgbWFzayAqLworICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgZm9yIChncnAgPSAwOyBncnAgPCBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwczsgZ3JwKyspCisgICAgICAgIHsKKyAgICAgICAgICBtYXNrIDw8PSAxOworICAgICAgICAgIGZvciAoaj0xOyBqPHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgICAgICAgICAgbWFzayA9IChtYXNrPDwxKSB8IDEgOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrID0gbWFzazsKKworICAgICAgICAvKiBidWlsZCBpbnRlcmZhY2UgKi8KKyAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5ncm91cExlbixwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sTUFYX05PX09GX0dST1VQUypzaXplb2YoSU5UKSk7CisgICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5LCgmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSktPkxvbmcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJTcHJlYWRFbmVyZ3ksKCZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5KS0+TG9uZywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOworLy8gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCAoMTAyNCkqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorCisgICAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKKwordm9pZCBGREthYWNFbmNfUHN5Q2xvc2UoUFNZX0lOVEVSTkFMICAgKipwaFBzeUludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaFBzeU91dCkKK3sKKyAgICBpbnQgbiwgaTsKKworCisgICAgaWYocGhQc3lJbnRlcm5hbCE9TlVMTCkgeworICAgICAgUFNZX0lOVEVSTkFMICpoUHN5SW50ZXJuYWwgPSAqcGhQc3lJbnRlcm5hbDsKKworICAgICAgaWYgKGhQc3lJbnRlcm5hbCkKKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKKyAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0pIHsKKyAgICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpCisgICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKCZoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpOyAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCisKKyAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeVN0YXRpYygmaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU1lfU1RBVElDICovCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKKyAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wc3lFbGVtZW50W2ldKQorICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5RWxlbWVudCgmaFBzeUludGVybmFsLT5wc3lFbGVtZW50W2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTWV9FTEVNRU5UICovCisgICAgICAgIH0KKworCisgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUludGVybmFsKHBoUHN5SW50ZXJuYWwpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwaFBzeU91dCE9TlVMTCkgeworICAgICAgZm9yIChuPTA7IG48KDEpOyBuKyspIHsKKyAgICAgICAgaWYgKHBoUHN5T3V0W25dKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKQorICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsKCZwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKTsgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0NIQU5ORUwgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHBoUHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldKQorICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cygmcGhQc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0pOyAgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0VMRU1FTlRTICovCisgICAgICAgICAgfQorCisgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0KCZwaFBzeU91dFtuXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRjYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uaApAQCAtMCwwICsxLDE3NCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogUHN5Y2hvYWNjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUFNZTUFJTl9ICisjZGVmaW5lIF9QU1lNQUlOX0gKKworCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiYWFjZW5jX3Bucy5oIgorCisvKgorICBwc3ljaCBpbnRlcm5hbAorKi8KK3R5cGVkZWYgc3RydWN0ICB7CisKKyAgUFNZX1NUQVRJQyogICAgICAgIHBzeVN0YXRpY1soMildOworCit9UFNZX0VMRU1FTlQ7CisKK3R5cGVkZWYgc3RydWN0ICB7CisKKyAgUFNZX0RBVEEgICAgICAgICAgIHBzeURhdGFbKDIpXTsKKyAgVE5TX0RBVEEgICAgICAgICAgIHRuc0RhdGFbKDIpXTsKKyAgUE5TX0RBVEEgICAgICAgICAgIHBuc0RhdGFbKDIpXTsKKworfVBTWV9EWU5BTUlDOworCisKK3R5cGVkZWYgc3RydWN0ICB7CisKKyAgUFNZX0NPTkZJR1VSQVRJT04gIHBzeUNvbmZbMl07IC8qIExPTkcgLyBTSE9SVCAqLworICBQU1lfRUxFTUVOVCogICAgICAgcHN5RWxlbWVudFsoOCldOworICBQU1lfU1RBVElDKiAgICAgICAgcFN0YXRpY0NoYW5uZWxzWyg4KV07CisgIFBTWV9EWU5BTUlDKiAgICAgICBwc3lEeW5hbWljOworICBJTlQgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aDsKKworfVBTWV9JTlRFUk5BTDsKKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5TmV3KFBTWV9JTlRFUk5BTCAgKipwaHBzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5DaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICAgICAqZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5T3V0TmV3KFBTWV9PVVQgICAgKipwaHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5TdWJGcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAgKmR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICAgICpoUHN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbk1heENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSk7CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluSW5pdChQU1lfSU5URVJOQUwgKmhQc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRuc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGluaXRGbGFncyk7CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRUxFTUVOVCAgICAgICAgICpwc3lFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0RZTkFNSUMgICAgICAgICAqcHN5RHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICAgKnBzeUNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY2hJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK3ZvaWQgRkRLYWFjRW5jX1BzeUNsb3NlKFBTWV9JTlRFUk5BTCAgICoqcGhQc3lJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhQc3lPdXQpOworCisjZW5kaWYgLyogX1BTWU1BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzA5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9xY19kYXRhLmgKQEAgLTAsMCArMSwyNzggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nIGRhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9RQ19EQVRBX0gKKyNkZWZpbmUgX1FDX0RBVEFfSAorCisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJkeW5fYml0cy5oIgorI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgorI2luY2x1ZGUgImxpbmVfcGUuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworCit0eXBlZGVmIGVudW0geworICBRQ0RBVEFfQlJfTU9ERV9JTlZBTElEID0gLTEsCisgIFFDREFUQV9CUl9NT0RFX0NCUiAgICAgPSAgMCwKKyAgUUNEQVRBX0JSX01PREVfVkJSXzEgICA9ICAxLCAvKiAzMiBrYnBzL2NoYW5uZWwgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzIgICA9ICAyLCAvKiA0MCBrYnBzL2NoYW5uZWwgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzMgICA9ICAzLCAvKiA0OCBrYnBzL2NoYW5uZWwgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzQgICA9ICA0LCAvKiA2NCBrYnBzL2NoYW5uZWwgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzUgICA9ICA1LCAvKiA5NiBrYnBzL2NoYW5uZWwgKi8KKyAgUUNEQVRBX0JSX01PREVfRkYgICAgICA9ICA2LCAgLyogRml4ZWQgZnJhbWUgbW9kZS4gKi8KKyAgUUNEQVRBX0JSX01PREVfU0ZSICAgICA9ICA3ICAvKiBTdXBlcmZyYW1lIG1vZGUuICovCisKKworfSBRQ0RBVEFfQlJfTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBNUDRfRUxFTUVOVF9JRCBlbFR5cGU7CisgIElOVCBpbnN0YW5jZVRhZzsKKyAgSU5UIG5DaGFubmVsc0luRWw7CisgIElOVCBDaGFubmVsSW5kZXhbMl07CisgIEZJWFBfREJMIHJlbGF0aXZlQml0czsKK30gRUxFTUVOVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENIQU5ORUxfTU9ERSBlbmNNb2RlOworICBJTlQgbkNoYW5uZWxzOworICBJTlQgbkNoYW5uZWxzRWZmOworICBJTlQgbkVsZW1lbnRzOworICBFTEVNRU5UX0lORk8gZWxJbmZvWyg4KV07Cit9IENIQU5ORUxfTUFQUElORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgcGFkZGluZ1Jlc3Q7Cit9IFBBRERJTkc7CisKKworLyogUXVhbnRpemluZyAmIGNvZGluZyBzdGFnZSAqLworCitzdHJ1Y3QgUUNfSU5JVHsKKyAgQ0hBTk5FTF9NQVBQSU5HKiBjaGFubmVsTWFwcGluZzsKKyAgSU5UIHNjZUNwZTsgICAgICAvKiBub3QgdXNlZCB5ZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIG1heEJpdHM7ICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIHJlc2Vydm9pciAgKi8KKyAgSU5UIGF2ZXJhZ2VCaXRzOyAvKiBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHdlIHNob3VsZCB1c2UgKi8KKyAgSU5UIGJpdFJlczsKKyAgSU5UIHNhbXBsZVJhdGU7ICAgICAgIC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYWR2YW5jZWRCaXRzVG9QZTsgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCisgIElOVCBzdGF0aWNCaXRzOyAgLyogQml0cyBwZXIgZnJhbWUgY29uc3VtZWQgYnkgdHJhbnNwb3J0IGxheWVycy4gKi8KKyAgUUNEQVRBX0JSX01PREUgYml0cmF0ZU1vZGU7CisgIElOVCBtZWFuUGU7CisgIElOVCBjaEJpdHJhdGU7CisgIElOVCBpbnZRdWFudDsKKyAgSU5UIG1heEl0ZXJhdGlvbnM7IC8qIE1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgaXRlcmF0aW9ucyBiZWZvcmUgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoKSBpcyBhcHBsaWVkLiAqLworICBGSVhQX0RCTCBtYXhCaXRGYWM7CisgIElOVCBiaXRyYXRlOworICBJTlQgblN1YkZyYW1lczsgLyogaGVscGVyIHZhcmlhYmxlICovCisgIElOVCBtaW5CaXRzOyAgICAvKiBtaW5pbWFsIG51bWJlciBvZiBiaXRzIGluIG9uZSBmcmFtZSovCisKKyAgUEFERElORyBwYWRkaW5nOworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRklYUF9EQkwgICAgICBtZGN0U3BlY3RydW1bKDEwMjQpXTsKKworICBTSE9SVCAgICAgICAgIHF1YW50U3BlY1soMTAyNCldOworCisgIFVJTlQgICAgICAgICAgbWF4VmFsdWVJblNmYltNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgICAgICAgICAgIHNjZltNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgICAgICAgICAgIGdsb2JhbEdhaW47CisgIFNFQ1RJT05fREFUQSAgc2VjdGlvbkRhdGE7CisKKyAgRklYUF9EQkwgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW01BWF9HUk9VUEVEX1NGQl07CisKKyAgRklYUF9EQkwgICAgICBzZmJUaHJlc2hvbGRMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgICAgICBzZmJNaW5TbnJMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgICAgICBzZmJFbmVyZ3lMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgICAgICBzZmJFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgICAgICBzZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOworCisgIEZJWFBfREJMICAgICAgc2ZiRW5GYWNMZFtNQVhfR1JPVVBFRF9TRkJdOworCisgIEZJWFBfREJMICAgICAgc2ZiU3ByZWFkRW5lcmd5W01BWF9HUk9VUEVEX1NGQl07CisKK30gUUNfT1VUX0NIQU5ORUw7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRVhUX1BBWUxPQURfVFlQRSAgdHlwZTsgIC8qIHR5cGUgb2YgdGhlIGV4dGVuc2lvbiBwYXlsb2FkICovCisgIElOVCAgICBuUGF5bG9hZEJpdHM7ICAgICAvKiBzaXplIG9mIHRoZSBwYXlsb2FkICovCisgIFVDSEFSICpwUGF5bG9hZDsgICAgICAgICAvKiBwb2ludGVyIHRvIHBheWxvYWQgKi8KKworfSBRQ19PVVRfRVhURU5TSU9OOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIElOVCAgICAgICAgICBzdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLworICBJTlQgICAgICAgICAgZHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKworICBJTlQgICAgICAgICAgZXh0Qml0c1VzZWQ7ICAgIC8qIGJpdCBjb25zdW1wdGlvbiBvZiBleHRlbmRlZCBmaWxsIGVsZW1lbnRzICovCisgIElOVCAgICAgICAgICBuRXh0ZW5zaW9uczsgICAgLyogbnVtYmVyIG9mIGV4dGVuc2lvbiBwYXlsb2FkcyBmb3IgdGhpcyBlbGVtZW50ICovCisgIFFDX09VVF9FWFRFTlNJT04gZXh0ZW5zaW9uWygxKV07ICAvKiByZWZmZXJpbmcgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKworICBJTlQgICAgICAgICAgZ3JhbnRlZER5bkJpdHM7CisKKyAgSU5UICAgICAgICAgIGdyYW50ZWRQZTsKKyAgSU5UICAgICAgICAgIGdyYW50ZWRQZUNvcnI7CisKKyAgUEVfREFUQSAgICAgIHBlRGF0YTsKKworICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsWygyKV07CisKKworfSBRQ19PVVRfRUxFTUVOVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUUNfT1VUX0VMRU1FTlQgICAgKnFjRWxlbWVudFsoOCldOworICBRQ19PVVRfQ0hBTk5FTCAgICAqcFFjT3V0Q2hhbm5lbHNbKDgpXTsKKyAgUUNfT1VUX0VYVEVOU0lPTiAgIGV4dGVuc2lvblsoMisyKV07ICAvKiBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgSU5UICAgICAgICAgIG5FeHRlbnNpb25zOyAgICAgICAvKiBudW1iZXIgb2YgZXh0ZW5zaW9uIHBheWxvYWRzIGZvciB0aGlzIEFVICovCisgIElOVCAgICAgICAgICBtYXhEeW5CaXRzOyAgICAgICAgLyogbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyBpbiBmcmFtZSAqLworICBJTlQgICAgICAgICAgZ3JhbnRlZER5bkJpdHM7ICAgIC8qIGdyYW50ZWQgZHluYW1pYyBiaXRzIGluIGZyYW1lICovCisgIElOVCAgICAgICAgICB0b3RGaWxsQml0czsgICAgICAgLyogZmlsbCBiaXRzICovCisgIElOVCAgICAgICAgICBlbGVtZW50RXh0Qml0czsgICAgLyogZWxlbWVudCBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkIGJpdHMsIGUuZy4gc2JyLCBkcmMgLi4uICovCisgIElOVCAgICAgICAgICBnbG9iYWxFeHRCaXRzOyAgICAgLyogZnJhbWUvYXUgYXNzb2NpYXRlZCBleHRlbnNpb24gcGF5bG9hZCBiaXRzIChhbmMgZGF0YSAuLi4pICovCisgIElOVCAgICAgICAgICBzdGF0aWNCaXRzOyAgICAgICAgLyogYWFjIHNpZGUgaW5mbyBiaXRzICovCisKKyAgSU5UICAgICAgICAgIHRvdGFsTm9SZWRQZTsKKyAgSU5UICAgICAgICAgIHRvdGFsR3JhbnRlZFBlQ29ycjsKKworICBJTlQgICAgICAgICAgdXNlZER5bkJpdHM7ICAgICAgIC8qIG51bWJlciBvZiBkeW5hbWljIGJpdHMgaW4gdXNlICovCisgIElOVCAgICAgICAgICBhbGlnbkJpdHM7ICAgICAgICAgLyogQVUgYWxpZ25tZW50IGJpdHMgKi8KKyAgSU5UICAgICAgICAgIHRvdGFsQml0czsgICAgICAgICAvKiBzdW0gb2Ygc3RhdGljLCBkeW4sIHNiciwgZmlsbCwgYWxpZ24gYW5kIGRzZSBiaXRzICovCisKK30gUUNfT1VUOworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBjaEJpdHJhdGVFbDsgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYml0cmF0ZSBpbiBlbGVtZW50ICh0b3RhbGJpdHJhdGUqZWxfcmVsYXRpdmVCaXRzL2VsX2NoYW5uZWxzKSAqLworICBJTlQgbWF4Qml0c0VsOyAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkIGluIGNyYXNoIHJlY292ZXJ5ICovCisgIElOVCBiaXRSZXNMZXZlbEVsOyAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBiaXRyZXNlcnZvaXIgbGV2ZWwgaW4gZWFjaCBjYWxsIG9mIEZES2FhY0VuY19RQ01haW4gKi8KKyAgSU5UIG1heEJpdFJlc0JpdHNFbDsgICAgICAgICAgICAgICAgLyogbkVmZkNoYW5uZWxzKjYxNDQgLSBhdmVyYWdlQml0c0luRnJhbWUgKi8KKyAgRklYUF9EQkwgcmVsYXRpdmVCaXRzRWw7ICAgICAgICAgICAgLyogQml0cyByZWxhdGl2ZSB0byB0b3RhbCBCaXRzKi8KK30gRUxFTUVOVF9CSVRTOworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiB0aGlzIGlzIGJhc2ljYWxseSBzdHJ1Y3QgUUNfSU5JVCAqLworCisgIElOVCBnbG9iSGRyQml0czsKKyAgSU5UIG1heEJpdHNQZXJGcmFtZTsgICAvKiBtYXhpbWFsIGFsbG93ZWQgYml0cyBwZXIgZnJhbWUsIDYxNDQqbkNoYW5uZWxzRWZmICovCisgIElOVCBtaW5CaXRzUGVyRnJhbWU7ICAgLyogbWluaW1hbCBhbGxvd2QgYml0cyBwZXIgZnJhbSwgc3VwZXJmcmFtaW5nIC0gRFJNICovCisgIElOVCBuRWxlbWVudHM7CisgIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOworICBJTlQgYml0RGlzdHJpYnV0aW9uTW9kZTsgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQgYml0cmVzZXJ2b2lyLCAyOiBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgKi8KKyAgSU5UIGJpdFJlc1RvdDsKKyAgSU5UIGJpdFJlc1RvdE1heDsKKyAgSU5UIG1heEl0ZXJhdGlvbnM7ICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBpdGVyYXRpb25zIGJlZm9yZSBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeSgpIGlzIGFwcGxpZWQuICovCisgIElOVCBpbnZRdWFudDsKKworICBGSVhQX0RCTCB2YnJRdWFsRmFjdG9yOworICBGSVhQX0RCTCBtYXhCaXRGYWM7CisKKyAgUEFERElORyBwYWRkaW5nOworCisgIEVMRU1FTlRfQklUUyAgKmVsZW1lbnRCaXRzWyg4KV07CisgIEJJVENOVFJfU1RBVEUgKmhCaXRDb3VudGVyOworICBBREpfVEhSX1NUQVRFICpoQWRqVGhyOworCit9IFFDX1NUQVRFOworCisjZW5kaWYgLyogX1FDX0RBVEFfSCAqLworCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL3FjX21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDUxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcApAQCAtMCwwICsxLDE2MzggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInFjX21haW4uaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkal90aHIuaCIKKyNpbmNsdWRlICJzZl9lc3RpbS5oIgorI2luY2x1ZGUgImJpdF9jbnQuaCIKKyNpbmNsdWRlICJkeW5fYml0cy5oIgorI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCisjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOworICBMT05HIHZiclF1YWxGYWN0b3I7Cit9IFRBQl9WQlJfUVVBTF9GQUNUT1I7CisKK3N0YXRpYyBjb25zdCBUQUJfVkJSX1FVQUxfRkFDVE9SIHRhYmxlVmJyUXVhbEZhY3RvcltdID0geworICB7UUNEQVRBX0JSX01PREVfQ0JSLCAgIEZMMkZYQ09OU1RfREJMKDAuMDBmKX0sCisgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMSwgRkwyRlhDT05TVF9EQkwoMC4xNjBmKX0sIC8qIDMyIGticHMgbW9ubyAgIEFBQy1MQyArIFNCUiArIFBTICovCisgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMiwgRkwyRlhDT05TVF9EQkwoMC4xNDhmKX0sIC8qIDY0IGticHMgc3RlcmVvIEFBQy1MQyArIFNCUiAgICAgICovCisgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMywgRkwyRlhDT05TVF9EQkwoMC4xMzVmKX0sIC8qIDgwIC0gOTYga2JwcyBzdGVyZW8gQUFDLUxDICAgICAgICovCisgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNCwgRkwyRlhDT05TVF9EQkwoMC4xMTFmKX0sIC8qIDEyOCBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgICAgICovCisgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNSwgRkwyRlhDT05TVF9EQkwoMC4wNzBmKX0sIC8qIDE5MiBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgICAgICovCisgIHtRQ0RBVEFfQlJfTU9ERV9TRlIsICAgRkwyRlhDT05TVF9EQkwoMC4wMGYpfSwKKyAge1FDREFUQV9CUl9NT0RFX0ZGLCAgICBGTDJGWENPTlNUX0RCTCgwLjAwZil9Cit9OworCitzdGF0aWMgSU5UIGlzQ29uc3RhbnRCaXRyYXRlTW9kZSgKKyAgICAgICAgY29uc3QgUUNEQVRBX0JSX01PREUgYml0cmF0ZU1vZGUKKyAgICAgICAgKQoreworICByZXR1cm4gKCAoKGJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9DQlIpIHx8IChiaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfU0ZSKSB8fCAoYml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0ZGKSkgPyAxIDogMCApOworfQorCisKKwordHlwZWRlZiBlbnVteworICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKKyAgICBGUkFNRV9MRU5fQllURVNfSU5UICAgID0gIDIKK31GUkFNRV9MRU5fUkVTVUxUX01PREU7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKElOVCAgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICpSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpSRVNUUklDVCBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpSRVNUUklDVCBtYXhWYWx1ZSk7CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAgKnFjRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWcpOworCitzdGF0aWMKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19yZWR1Y2VCaXRDb25zdW1wdGlvbihpbnQqICAgICAgICAgICAgIGl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIG1heEl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGdhaW5BZGp1c3RtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiAgICBlbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgZXBDb25maWcpOworCisKK3ZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNGcmFtZUxlbgorICAgIGRlc2NyaXB0aW9uOgorICAgIHJldHVybnM6CisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNGcmFtZUxlbihJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fUkVTVUxUX01PREUgbW9kZSkKK3sKKworICAgSU5UIHJlc3VsdDsKKworICAgcmVzdWx0ID0gKChncmFudWxlTGVuZ3RoKT4+MykqKGJpdFJhdGUpOworCisgICBzd2l0Y2gobW9kZSkgeworICAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19NT0RVTE86CisgICAgICAgICByZXN1bHQgJT0gc2FtcGxlUmF0ZTsKKyAgICAgYnJlYWs7CisgICAgIGNhc2UgRlJBTUVfTEVOX0JZVEVTX0lOVDoKKyAgICAgICAgIHJlc3VsdCAvPSBzYW1wbGVSYXRlOworICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybihyZXN1bHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfZnJhbWVQYWRkaW5nCisgICAgZGVzY3JpcHRpb246IENhbGN1bGF0ZXMgaWYgcGFkZGluZyBpcyBuZWVkZWQgZm9yIGFjdHVhbCBmcmFtZQorICAgIHJldHVybnM6CisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2ZyYW1lUGFkZGluZyhJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBhZGRpbmdSZXN0KQoreworICBJTlQgcGFkZGluZ09uOworICBJTlQgZGlmZmVyZW5jZTsKKworICBwYWRkaW5nT24gPSAwOworCisgIGRpZmZlcmVuY2UgPSBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7CisgICpwYWRkaW5nUmVzdC09ZGlmZmVyZW5jZTsKKworICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7CisgICAgcGFkZGluZ09uID0gMTsKKyAgICAqcGFkZGluZ1Jlc3QgKz0gc2FtcGxlUmF0ZTsKKyAgfQorCisgIHJldHVybiggcGFkZGluZ09uICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RQ091dE5ldworICAgICAgICAgZGVzY3JpcHRpb246CisgICAgICAgICByZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXROZXcoUUNfT1VUICAgICoqcGhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5TdWJGcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICpkeW5hbWljX1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgaW50IG4sIGk7CisgIGludCBlbEluYyA9IDAsIGNoSW5jID0gMDsKKworICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKKyAgICBwaFFDW25dID0gR2V0UmFtX2FhY0VuY19RQ291dChuKTsKKyAgICBpZiAocGhRQ1tuXSA9PSBOVUxMKSB7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgICAgZ290byBRQ091dE5ld19iYWlsOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CisgICAgICBwaFFDW25dLT5wUWNPdXRDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUUNjaGFubmVsKGNoSW5jLCBkeW5hbWljX1JBTSk7CisgICAgICBpZiAoIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2ldID09IE5VTEwKKyAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CisgICAgICB9CisgICAgICBjaEluYysrOworICAgIH0gLyogbkNoYW5uZWxzICovCisKKyAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldICAgICAgPSBHZXRSYW1fYWFjRW5jX1FDZWxlbWVudChlbEluYyk7CisgICAgICBpZiAocGhRQ1tuXS0+cWNFbGVtZW50W2ldID09IE5VTEwpCisgICAgICB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgIGdvdG8gUUNPdXROZXdfYmFpbDsKKyAgICAgIH0KKyAgICAgIGVsSW5jKys7CisgICAgfSAvKiBuRWxlbWVudHMgKi8KKworICB9IC8qIG5TdWJGcmFtZXMgKi8KKworCisgIHJldHVybiBBQUNfRU5DX09LOworCitRQ091dE5ld19iYWlsOgorICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNPdXRJbml0CisgICAgICAgICBkZXNjcmlwdGlvbjoKKyAgICAgICAgIHJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dEluaXQoUUNfT1VUICAgICAgICAgICpwaFFDWygxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjbSkKK3sKKyAgSU5UIG4saSxjaDsKKworICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKKyAgICBJTlQgY2hJbmMgPSAwOworICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdID0gcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbY2hJbmNdOworICAgICAgICBjaEluYysrOworICAgICAgfSAvKiBjaEluRWwgKi8KKyAgICB9IC8qIG5FbGVtZW50cyAqLworICB9IC8qIG5TdWJGcmFtZXMgKi8KKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RQ05ldworICAgICAgICAgZGVzY3JpcHRpb246CisgICAgICAgICByZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNOZXcoUUNfU1RBVEUgICoqcGhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBuRWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogICAgICBkeW5hbWljX1JBTQorICAgICAgICAgICApCit7CisgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworICBpbnQgaTsKKworICBRQ19TVEFURSogaFFDID0gR2V0UmFtX2FhY0VuY19RQ3N0YXRlKCk7CisgICpwaFFDID0gaFFDOworICBpZiAoaFFDID09IE5VTEwpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgIGdvdG8gUUNOZXdfYmFpbDsKKyAgfQorCisgIGlmIChGREthYWNFbmNfQWRqVGhyTmV3KCZoUUMtPmhBZGpUaHIsIG5FbGVtZW50cykpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgIGdvdG8gUUNOZXdfYmFpbDsKKyAgfQorCisgIGlmIChGREthYWNFbmNfQkNOZXcoJihoUUMtPmhCaXRDb3VudGVyKSwgZHluYW1pY19SQU0pKSB7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICBnb3RvIFFDTmV3X2JhaWw7CisgIH0KKworICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0gPSBHZXRSYW1fYWFjRW5jX0VsZW1lbnRCaXRzKGkpOworICAgIGlmIChoUUMtPmVsZW1lbnRCaXRzW2ldID09IE5VTEwpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICBnb3RvIFFDTmV3X2JhaWw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CisKK1FDTmV3X2JhaWw6CisgIEZES2FhY0VuY19RQ0Nsb3NlKHBoUUMsIE5VTEwpOworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNJbml0CisgICAgICAgICBkZXNjcmlwdGlvbjoKKyAgICAgICAgIHJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ0luaXQoUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFFDX0lOSVQgKmluaXQpCit7CisgIGhRQy0+bWF4Qml0c1BlckZyYW1lID0gaW5pdC0+bWF4Qml0czsKKyAgaFFDLT5taW5CaXRzUGVyRnJhbWUgPSBpbml0LT5taW5CaXRzOworICBoUUMtPm5FbGVtZW50cyAgICAgICA9IGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7CisgIGhRQy0+Yml0UmVzVG90TWF4ICAgID0gaW5pdC0+Yml0UmVzOworICBoUUMtPmJpdFJlc1RvdCAgICAgICA9IGluaXQtPmJpdFJlczsKKyAgaFFDLT5tYXhCaXRGYWMgICAgICAgPSBpbml0LT5tYXhCaXRGYWM7CisgIGhRQy0+Yml0cmF0ZU1vZGUgICAgID0gaW5pdC0+Yml0cmF0ZU1vZGU7CisgIGhRQy0+aW52UXVhbnQgICAgICAgID0gaW5pdC0+aW52UXVhbnQ7CisgIGhRQy0+bWF4SXRlcmF0aW9ucyAgID0gaW5pdC0+bWF4SXRlcmF0aW9uczsKKworICBpZiAoIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSApIHsKKyAgICBJTlQgYml0cmVzUGVyQ2hhbm5lbCA9IChoUUMtPmJpdFJlc1RvdE1heCAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpOworICAgIC8qIDA6IGZ1bGwgYml0cmVzZXJ2b2lyLCAxOiByZWR1Y2VkIGJpdHJlc2Vydm9pciwgMjogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCisgICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gKGJpdHJlc1BlckNoYW5uZWw+MTAwKSA/IDAgOiAoYml0cmVzUGVyQ2hhbm5lbD4wKSA/IDEgOiAyOworICB9CisgIGVsc2UgeworICAgIGhRQy0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9IDA7IC8qIGZ1bGwgYml0cmVzZXJ2b2lyICovCisgIH0KKworCisgIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7CisKKyAgaFFDLT5nbG9iSGRyQml0cyA9IGluaXQtPnN0YXRpY0JpdHM7IC8qIEJpdCBvdmVyaGVhZCBkdWUgdG8gdHJhbnNwb3J0ICovCisKKyAgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+Yml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdC0+YXZlcmFnZUJpdHMvaW5pdC0+blN1YkZyYW1lcykgLSBoUUMtPmdsb2JIZHJCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4Qml0c1BlckZyYW1lL2luaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpOworCisgIHN3aXRjaChoUUMtPmJpdHJhdGVNb2RlKXsKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0NCUjoKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8xOgorICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzI6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzoKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl80OgorICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzU6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9GRjoKKyAgICAgIGlmKChpbnQpaFFDLT5iaXRyYXRlTW9kZSA8IChpbnQpKHNpemVvZih0YWJsZVZiclF1YWxGYWN0b3IpL3NpemVvZihUQUJfVkJSX1FVQUxfRkFDVE9SKSkpeworICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IgPSAoRklYUF9EQkwpdGFibGVWYnJRdWFsRmFjdG9yW2hRQy0+Yml0cmF0ZU1vZGVdLnZiclF1YWxGYWN0b3I7CisgICAgICB9IGVsc2UgeworICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOyAvKiBkZWZhdWx0IHNldHRpbmcgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUUNEQVRBX0JSX01PREVfSU5WQUxJRDoKKyAgICBkZWZhdWx0OgorICAgICAgaFFDLT52YnJRdWFsRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgRkRLYWFjRW5jX0FkalRockluaXQoCisgICAgICAgIGhRQy0+aEFkalRociwKKyAgICAgICAgaW5pdC0+bWVhblBlLAorICAgICAgICBoUUMtPmVsZW1lbnRCaXRzLCAgICAgICAgICAgICAgICAgLyogb3IgY2hhbm5lbEJpdHJhdGVzLCB3YXM6IGNoYW5uZWxCaXRyYXRlICovCisgICAgICAgIGhRQy0+aW52UXVhbnQsCisgICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHMsCisgICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYsCisgICAgICAgIGluaXQtPnNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KKyAgICAgICAgaW5pdC0+YWR2YW5jZWRCaXRzVG9QZSwgICAgICAgICAgIC8qIGlmIHNldCwgY2FsYyBiaXRzMlBFIGZhY3RvciBkZXBlbmRpbmcgb24gc2FtcGxlcmF0ZSAqLworICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IKKyAgICAgICAgKTsKKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNNYWluUHJlcGFyZQorICAgICAgICAgZGVzY3JpcHRpb246CisgICAgICAgICByZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluUHJlcGFyZShFTEVNRU5UX0lORk8gICAgICAgICAgICAgICplbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogUkVTVFJJQ1QgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICAgcWNPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKKyAgSU5UICBuQ2hhbm5lbHMgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7CisKKyAgUFNZX09VVF9DSEFOTkVMKiogUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7ICAgIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLworCisgIEZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICAvKiBwcmVwYXJlIGFuZCBjYWxjdWxhdGUgUEUgd2l0aG91dCByZWR1Y3Rpb24gKi8KKyAgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oJnFjT3V0RWxlbWVudC0+cGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbywgYWRqVGhyU3RhdGVFbGVtZW50LCBuQ2hhbm5lbHMpOworCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIE5VTEwsIGVsSW5mbywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0RWxlbWVudC0+c3RhdGljQml0c1VzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZQorICAgICAgICAgZGVzY3JpcHRpb246ICBhZGp1c3RzIGZyYW1lbGVuZ3RoIHZpYSBwYWRkaW5nIG9uIGEgZnJhbWUgdG8gZnJhbWUgYmFzaXMsCisgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjaGlldmUgYSBiaXRyYXRlIHRoYXQgZGVtYW5kcyBhIG5vbiBieXRlIGFsaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVsZW5ndGgKKyAgICAgICAgIHJldHVybjogICAgICAgZXJyb3Jjb2RlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAgICAgICAgKlJFU1RSSUNUIGhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqUkVTVFJJQ1QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgKmF2Z1RvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgYml0UmF0ZSwgICAgICAgLyogdG90YWwgYml0cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBzYW1wbGVSYXRlLCAgICAvKiBvdXRwdXQgc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoKSAvKiBmcmFtZSBsZW5ndGggKi8KK3sKKyAgSU5UIHBhZGRpbmdPbjsKKyAgSU5UIGZyYW1lTGVuOworCisgIC8qIERvIHdlIG5lZWQgYW4gZXh0cmEgcGFkZGluZyBieXRlPyAqLworICBwYWRkaW5nT24gPSBGREthYWNFbmNfZnJhbWVQYWRkaW5nKGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7CisKKyAgZnJhbWVMZW4gPSBwYWRkaW5nT24gKyBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOworCisgICphdmdUb3RhbEJpdHMgPSBmcmFtZUxlbjw8MzsKKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoUUNfU1RBVEUqICAgICAgICAgaFFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGNvZGVCaXRzKQoreworCisgIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOworICBJTlQgdG90YWxCaXRzID0gMDsKKworICBmb3IgKGk9KGNtLT5uRWxlbWVudHMtMSk7IGk+PTA7IGktLSkgeworICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKKyAgICB7CisgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzID0gIChJTlQpZk11bHQoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIChGSVhQX0RCTCljb2RlQml0cyk7CisgICAgICB0b3RhbEJpdHMgKz0gcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0czsKKyAgICAgIGZpcnN0RWwgPSBpOworICAgIH0KKyAgfQorICBxY0VsZW1lbnRbZmlyc3RFbF0tPmdyYW50ZWREeW5CaXRzICs9IGNvZGVCaXRzIC0gdG90YWxCaXRzOworCisgIHJldHVybiBBQUNfRU5DX09LOworfQorCisvKioKKyAqIFxicmllZiAgVmVyaWZ5IHdoZXRoZXIgbWluQml0c1BlckZyYW1lIGNyaXRlcmlvbiBjYW4gYmUgc2F0aXNmaWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSBiaXQgY29uc3VtcHRpb24gb25seSBpZiBtaW5CaXRzUGVyRnJhbWUgcGFyYW1ldGVyIGlzIG5vdCAwLgorICogSW4gaHlwZXJmcmFtaW5nIG1vZGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBncmFudGVkRHluQml0cyBhbmQgdXNlZER5bkJpdHMgb2YgYWxsIHN1YiBmcmFtZXMKKyAqIHJlc3VsdHMgdGhlIG51bWJlciBvZiBmaWxsYml0cyB0byBiZSB3cml0dGVuLgorICogVGhpcyBiaXRzIGNhbiBiZSBkaXN0cnViaXR1ZWQgaW4gc3VwZXJmcmFtZSB0byByZWFjaCBtaW5CaXRzUGVyRnJhbWUgYml0IGNvbnN1bXB0aW9uIGluIHNpbmdsZSBBVSdzLgorICogVGhlIHJldHVybiB2YWx1ZSBkZW5vdGVzIGlmIGVub3VnaCBkZXNpcmVkIGZpbGwgYml0cyBhcmUgYXZhaWxhYmxlIHRvIGFjaGlldmUgbWluQml0c1BlckZyYW1lIGluIGFsbCBmcmFtZXMuCisgKiBUaGlzIGNoZWNrIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIHN1cGVyZnJhbWVzLgorICoKKyAqIFxwYXJhbSBxY091dCAgICAgICAgICAgIFBvaW50ZXIgdG8gY29kaW5nIGRhdGEgc3RydWN0LgorICogXHBhcmFtIG1pbkJpdHNQZXJGcmFtZSAgTWluaW1hbCBudW1iZXIgb2YgYml0cyB0byBiZSBjb25zdW1lZCBpbiBlYWNoIGZyYW1lLgorICogXHBhcmFtIG5TdWJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcyBpbiBzdXBlcmZyYW1lCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSAxOiBhbGwgZmluZQorICogICAgICAgICAgLSAwOiBjcml0ZXJpb24gbm90IGZ1bGZpbGxlZAorICovCitzdGF0aWMgaW50IGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKAorICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0LAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG1pbkJpdHNQZXJGcmFtZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzCisgICAgICAgICkKK3sKKyAgaW50IHJlc3VsdCA9IDE7IC8qIGFsbCBmaW5lKi8KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZAorICAgICAgICAgZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgbWlubWFsIHNpemUgb2Ygc3RhdGljIGJpdHMgYnkgcmVkdWN0aW9uICwKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gemVybyBzcGVjdHJ1bSBhbmQgZGVhY3RpdmF0aW5nIHRucyBhbmQgTVMKKyAgICAgICAgIHJldHVybjogICAgICAgbnVtYmVyIG9mIHN0YXRpYyBiaXRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEZES2FhY0VuY19nZXRNaW5pbWFsU3RhdGljQml0ZGVtYW5kKENIQU5ORUxfTUFQUElORyogICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogICAgICAgICAgICBwc3lPdXQpCit7CisgIEFVRElPX09CSkVDVF9UWVBFIGFvdCA9IEFPVF9BQUNfTEM7CisgIFVJTlQgIHN5bnRheEZsYWdzID0gMDsKKyAgU0NIQVIgZXBDb25maWcgPSAtMTsKKyAgaW50IGksIGJpdGNvdW50ID0gMDsKKworICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworCisgICAgICBpZiAoIChlbEluZm8uZWxUeXBlID09IElEX1NDRSkKKyAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKQorICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpICkKKyAgICAgIHsKKyAgICAgICAgSU5UIG1pbkVsQml0cyA9IDA7CisKKyAgICAgICAgRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIE5VTEwsICZlbEluZm8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICBiaXRjb3VudCArPSBtaW5FbEJpdHM7CisgICAgICB9CisgIH0KKworICByZXR1cm4gYml0Y291bnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHJlcGFyZUJpdERpc3RyaWJ1dGlvbihRQ19TVEFURSogICAgICAgICAgICBoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogICAgICAgICAgICBwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgICAgcWNFbGVtZW50WygxKV1bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnRvdGFsQXZhaWxhYmxlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmF2Z1RvdGFsRHluQml0cykKK3sKKyAgICBpbnQgaTsKKyAgICAgIC8qIGdldCBtYXhpbWFsIGFsbG93ZWQgZHluYW1pYyBiaXRzICovCisgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgPSAgKGZpeE1pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgYXZnVG90YWxCaXRzKSAtIGhRQy0+Z2xvYkhkckJpdHMpJn43OworICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC09IChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKKyAgICAgIHFjT3V0WzBdLT5tYXhEeW5CaXRzID0gKChoUUMtPm1heEJpdHNQZXJGcmFtZSkmfjcpIC0gKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOworICAgICAgLyogYXNzdXJlIHRoYXQgZW5vdWdoIGJpdHMgYXJlIGF2YWlsYWJsZSAqLworICAgICAgaWYgKChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMraFFDLT5iaXRSZXNUb3QpIDwgMCkgeworICAgICAgICAvKiBjcmFzaCByZWNvdmVyeSBhbGxvd3MgdG8gcmVkdWNlIHN0YXRpYyBiaXRzIHRvIGEgbWluaW11bSAqLworICAgICAgICBpZiAoIChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMraFFDLT5iaXRSZXNUb3QpIDwgKEZES2FhY0VuY19nZXRNaW5pbWFsU3RhdGljQml0ZGVtYW5kKGNtLCBwc3lPdXQpLXFjT3V0WzBdLT5zdGF0aWNCaXRzKSApCisgICAgICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7CisgICAgICB9CisKKyAgICAgIC8qIGRpc3RyaWJ1dGUgZHluYW1pYyBiaXRzIHRvIGVhY2ggZWxlbWVudCAqLworICAgICAgRkRLYWFjRW5jX2Rpc3RyaWJ1dGVFbGVtZW50RHluQml0cyhoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyk7CisKKyAgICAgICphdmdUb3RhbER5bkJpdHMgPSAwOyAvKmZyYW1lRHluQml0czsqLworCisgICAgKnRvdGFsQXZhaWxhYmxlQml0cyA9IGF2Z1RvdGFsQml0czsKKworICAgIC8qIHN1bSB1cCBjb3JyZWN0ZWQgZ3JhbnRlZCBQRSAqLworICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgPSAwOworCisgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQorICAgIHsKKyAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgICAgICAgIGludCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKKworICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAgICAgICAgICAgICBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoaFFDLT5oQWRqVGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY0VsZW1lbnRbMF1baV0tPnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29yciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPmNvbW1vbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkRHluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEJpdEZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlKTsKKworICAgICAgICAgICAgICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKKyAgICAgICAgLyogZ2V0IHRvdGFsIGNvcnJlY3RlZCBncmFudGVkIFBFICovCisgICAgICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgKz0gcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyOworICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisKKyAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKworICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgPSBGREttaW4oaFFDLT5tYXhCaXRzUGVyRnJhbWUsICgqdG90YWxBdmFpbGFibGVCaXRzKSk7CisKKyAgICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlVXNlZER5bkJpdHMoSU5UKiAgICAgICAgICAgICAgIHN1bUR5bkJpdHNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgIHFjRWxlbWVudFsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgY20pCit7CisgIElOVCBpOworCisgICpzdW1EeW5CaXRzQ29uc3VtZWQgPSAwOworCisgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgeworICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisKKyAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQorICAgICAgeworICAgICAgICAgIC8qIHN1bSB1cCBiaXRzIGNvbnN1bWVkICovCisgICAgICAgICAgKnN1bUR5bkJpdHNDb25zdW1lZCAgKz0gcWNFbGVtZW50W2ldLT5keW5CaXRzVXNlZDsKKyAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KKworICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCitzdGF0aWMgSU5UIEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkRHluQml0cyhRQ19PVVQqKiBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TdWJGcmFtZXMpCit7CisgICAgSU5UIGMsIHRvdGFsQml0cz0wOworCisgICAgLyogc3VtIHVwIGJpdCBjb25zdW1wdGlvbiBmb3IgYWxsIHN1YiBmcmFtZXMgKi8KKyAgICBmb3IgKGM9MDsgYzxuU3ViRnJhbWVzOyBjKyspCisgICAgeworICAgICAgICAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGlmIGR5bmFtaWMgYml0cworICAgICAgICAgICBub3QgYXZhaWxhYmxlIGluIG9uZSBzdWIgZnJhbWUgKi8KKyAgICAgICAgaWYgKHFjT3V0W2NdLT51c2VkRHluQml0cz09LTEpIHJldHVybiAtMTsKKyAgICAgICAgdG90YWxCaXRzICs9IHFjT3V0W2NdLT51c2VkRHluQml0czsKKyAgICB9CisKKyAgICByZXR1cm4gdG90YWxCaXRzOworCit9CisKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKFFDX09VVCoqICAgICAgICAgIHFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDEpXVsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgZ2xvYkhkckJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG5TdWJGcmFtZXMpCit7CisgICAgaW50IGMsIGk7CisgICAgaW50IHRvdGFsVXNlZEJpdHMgPSAwOworCisgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKKyAgICB7CisgICAgICAgIGludCBkYXRhQml0cyA9IDA7CisgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgZGF0YUJpdHMgKz0gcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArIHFjRWxlbWVudFtjXVtpXS0+c3RhdGljQml0c1VzZWQgKyBxY0VsZW1lbnRbY11baV0tPmV4dEJpdHNVc2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFCaXRzICs9IHFjT3V0W2NdLT5nbG9iYWxFeHRCaXRzOworCisgICAgICAgIHRvdGFsVXNlZEJpdHMgKz0gKDggLSAoZGF0YUJpdHMpICUgOCkgJSA4OworICAgICAgICB0b3RhbFVzZWRCaXRzICs9IGRhdGFCaXRzICsgZ2xvYkhkckJpdHM7ICAvKiBoZWFkZXIgYml0cyBmb3IgZXZlcnkgZnJhbWUgKi8KKyAgICB9CisgICAgcmV0dXJuIHRvdGFsVXNlZEJpdHM7Cit9CisKK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQml0UmVzUmVkaXN0cmlidXRpb24oCisgICAgICAgIFFDX1NUQVRFICpjb25zdCAgICAgICAgICAgICAgaFFDLAorICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cworICAgICAgICApCit7CisgICAgLyogY2hlY2sgYml0cmVzZXJ2b2lyIGZpbGwgbGV2ZWwgKi8KKyAgICBpZiAoaFFDLT5iaXRSZXNUb3QgPCAwKSB7CisgICAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0xPVzsKKyAgICB9CisgICAgZWxzZSBpZiAoaFFDLT5iaXRSZXNUb3QgPiBoUUMtPmJpdFJlc1RvdE1heCkgeworICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19ISUdIOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOworICAgICAgSU5UIHRvdGFsQml0cyA9IDAsIHRvdGFsQml0c19tYXggPSAwOworCisgICAgICBpbnQgdG90YWxCaXRyZXNlcnZvaXIgICAgPSBGREttaW4oaFFDLT5iaXRSZXNUb3QsIChoUUMtPm1heEJpdHNQZXJGcmFtZS1hdmdUb3RhbEJpdHMpKTsKKyAgICAgIGludCB0b3RhbEJpdHJlc2Vydm9pck1heCA9IEZES21pbihoUUMtPmJpdFJlc1RvdE1heCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lLWF2Z1RvdGFsQml0cykpOworCisgICAgICBpbnQgc2NfYml0UmVzVG90ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pcik7CisgICAgICBpbnQgc2NfYml0UmVzVG90TWF4ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pck1heCk7CisKKyAgICAgIGZvciAoaT0oY20tPm5FbGVtZW50cy0xKTsgaT49MDsgaS0tKSB7CisgICAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCisgICAgICAgIHsKKyAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsID0gKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKSh0b3RhbEJpdHJlc2Vydm9pcjw8c2NfYml0UmVzVG90KSk+PnNjX2JpdFJlc1RvdDsKKyAgICAgICAgICB0b3RhbEJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKKworICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCA9IChJTlQpZk11bHQoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIChGSVhQX0RCTCkodG90YWxCaXRyZXNlcnZvaXJNYXg8PHNjX2JpdFJlc1RvdE1heCkpPj5zY19iaXRSZXNUb3RNYXg7CisgICAgICAgICAgdG90YWxCaXRzX21heCArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWw7CisKKyAgICAgICAgICBmaXJzdEVsID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaFFDLT5lbGVtZW50Qml0c1tmaXJzdEVsXS0+Yml0UmVzTGV2ZWxFbCAgICs9IHRvdGFsQml0cmVzZXJ2b2lyIC0gdG90YWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1tmaXJzdEVsXS0+bWF4Qml0UmVzQml0c0VsICs9IHRvdGFsQml0cmVzZXJ2b2lyTWF4IC0gdG90YWxCaXRzX21heDsKKyAgICB9CisKKyAgICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFKiBSRVNUUklDVCAgICAgICAgIGhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgICAgICAgcHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgICBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgICAgICAgICBjbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGksIGM7CisgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKKyAgSU5UIGF2Z1RvdGFsRHluQml0cyA9IDA7IC8qIG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgZm9yIGFsbCBmcmFtZXMgKi8KKyAgSU5UIHRvdGFsQXZhaWxhYmxlQml0cyA9IDA7CisgIElOVCBuU3ViRnJhbWVzID0gMTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIHJlZGlzdHJpYnV0ZSB0b3RhbCBiaXRyZXNlcnZvaXIgdG8gZWxlbWVudHMgKi8KKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfQml0UmVzUmVkaXN0cmlidXRpb24oaFFDLCBjbSwgYXZnVG90YWxCaXRzKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHsKKyAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIGZhc3RlbmMgbmVlZHMgb25lIHRpbWUgdGhyZXNob2xkIHNpbXVsYXRpb24sCisgICAgIGluIGNhc2Ugb2YgbXVsdGlwbGUgZnJhbWVzLCBvbmUgbW9yZSBndWVzcyBoYXMgdG8gYmUgY2FsY3VsYXRlZCAqLworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKiBoZWxwZXIgcG9pbnRlciAqLworICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDEpXVsoOCldOworCisgICAgICAvKiB3b3JrIG9uIGEgY29weSBvZiBxY0NoYW5uZWwgYW5kIHFjRWxlbWVudCAqLworICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQorICAgICAgeworICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworCisgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAgICAgICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSA9IHFjT3V0W2NdLT5xY0VsZW1lbnRbaV07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIGlmICggaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpICkKKyAgICAgIHsKKyAgICAgICAgICAvKiBjYWxjIGdyYW50ZWQgZHluYW1pYyBiaXRzIGZvciBzdWIgZnJhbWUgYW5kCisgICAgICAgICAgICAgZGlzdHJpYnV0ZSBpdCB0byBlYWNoIGVsZW1lbnQgKi8KKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsQXZhaWxhYmxlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Z1RvdGFsRHluQml0cyk7CisKKyAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyA9ICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUgLSAoaFFDLT5nbG9iSGRyQml0cykpJn43KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKKyAgICAgICAgICBxY091dFswXS0+bWF4RHluQml0cyAgICAgPSBxY091dFswXS0+Z3JhbnRlZER5bkJpdHM7CisKKyAgICAgICAgICB0b3RhbEF2YWlsYWJsZUJpdHMgPSBoUUMtPm1heEJpdHNQZXJGcmFtZTsKKyAgICAgICAgICBhdmdUb3RhbER5bkJpdHMgPSAwOworICAgICAgfQorCisjaWZkZWYgUE5TX1BSRUNPVU5UX0VOQUJMRQorICAgICAgLyogQ2FsY3VsYXRlIGVzdGltYXRlZCBwbnMgYml0cyBhbmQgc3Vic3RyYWN0IHRoZW0gZnJvbSBncmFudGVkRHluQml0cyB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cy4gKi8KKyAgICAgIGlmIChzeW50YXhGbGFncyAmIChBQ19MRHxBQ19FTEQpKQorICAgICAgeworICAgICAgICBpbnQgZXN0aW1hdGVkUG5zQml0cyA9IDAsIGNoOworCisgICAgICAgIGZvciAoY2g9MDsgY2g8Y20tPm5DaGFubmVsczsgY2grKykgeworICAgICAgICAgIHFjT3V0WzBdLT5wUWNPdXRDaGFubmVsc1tjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cyA9IG5vaXNlUHJlQ291bnQocHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5ub2lzZU5yZywgcHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5tYXhTZmJQZXJHcm91cCk7CisgICAgICAgICAgZXN0aW1hdGVkUG5zQml0cyArPSBxY091dFswXS0+cFFjT3V0Q2hhbm5lbHNbY2hdLT5zZWN0aW9uRGF0YS5ub2lzZU5yZ0JpdHM7CisgICAgICAgIH0KKyAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC09IGVzdGltYXRlZFBuc0JpdHM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCisgICAgICB7CisgICAgICAgICAgLyogZm9yIENCUiBhbmQgVkJSIG1vZGUgKi8KKyAgICAgICAgICBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7CisKKyAgICAgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgSU5UIGl0ZXJhdGlvbnNbKDEpXVsoOCldOworICAgICAgSU5UIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldWygyKV07CisgICAgICBJTlQgY2FsY3VsYXRlUXVhbnRbKDEpXVsoOCldWygyKV07CisgICAgICBJTlQgY29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldOworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCisgICAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQorICAgICAgeworICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOworCisgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIHRocmVzaG9sZHMgaW50byBzY2FsZWZhY3RvcnMsIG9wdGltaXplIGJpdCBjb25zdW1wdGlvbiBhbmQgdmVyaWZ5IGNvbmZvcm1hbmNlICovCisgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aW52UXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCk7CisKKworICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uc1tjXVtpXSA9IDAgOworCisgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgICAgICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisKKyAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKworICAgICAgICAgIHFjT3V0W2NdLT51c2VkRHluQml0cyA9IC0xOworCisgICAgICB9IC8qIC1lbmQtIHN1YiBmcmFtZSBjb3VudGVyICovCisKKworCisgICAgICBJTlQgcXVhbnRpemF0aW9uRG9uZSA9IDA7CisgICAgICBJTlQgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgID0gMDsKKyAgICAgIElOVCBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gLTE7IC8qIG5vIGRpcmVjdGlvbiB5ZXQhICovCisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIC1zdGFydC0gUXVhbnRpemF0aW9uIGxvb3AgLi4uICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIGRvIC8qIHVudGlsIG1heCBhbGxvd2VkIGJpdHMgcGVyIGZyYW1lIGFuZCBtYXhEeW5CaXRzIT0tMSovCisgICAgICB7CisgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7CisKKyAgICAgICAgICAgICAgYyA9IDA7ICAgICAgICAgICAgICAvKiBnZXQgZnJhbWUgdG8gcHJvY2VzcyAqLworCisgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgICAgICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOworCisgICAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBkbyAvKiB1bnRpbCBzcGVjdHJhbCB2YWx1ZXMgPCBNQVhfUVVBTlQgKi8KKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKCZpdGVyYXRpb25zW2NdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4SXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbikgPyAxIDogLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0W2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxIDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPSBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdID0gMDsgLyogY2FsY3VsYXRlIHF1YW50aXphdGlvbiBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKHBzeU91dENoLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+Z2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5zY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjKSA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihwc3lPdXRDaC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAwIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHF1YW5penRlZCB2YWx1ZSBvdXQgb2YgcmFuZ2U7IGluY3JlYXNlIGdsb2JhbCBnYWluISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGlmIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogY2hhbm5lbCBsb29wICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6ZSBzcGVjdHJ1bSAocGVyIGVhY2ggY2hhbm5lbCkgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0pIDsgLyogZG9lcyBub3QgcmVnYXJkIGJpdCBjb25zdW1wdGlvbiAqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgPSAwIDsgLyogcmVzZXQgZHluYW1pYyBiaXRzICovCisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gdmFsaWQgaW4gY3VycmVudCBjaGFubmVsISAqLworICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoID0gcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCBkeW5hbWljIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoRHluQml0cyA9IEZES2FhY0VuY19keW5CaXRDb3VudChoUUMtPmhCaXRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXRDaC0+c2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5pc0Jvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmlzU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MpIDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgZHluYW1pYyBjaGFubmVsIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArPSBjaER5bkJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgaWYoaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmR5bkJpdHNMYXN0PT0tMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXS0+ZHluQml0c0xhc3QgPSBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KKworICAgICAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKworICAgICAgICAgICAgICAvKiB1cGRhdGUgZHluQml0cyBvZiBjdXJyZW50IHN1YkZyYW1lICovCisgICAgICAgICAgICAgIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cygmcWNPdXRbY10tPnVzZWREeW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20pOworCisgICAgICAgICAgICAgIC8qIGdldCB0b3RhbCBjb25zdW1lZCBiaXRzLCBkeW4gYml0cyBpbiBhbGwgc3ViIGZyYW1lcyBoYXZlIHRvIGJlIHZhbGlkICovCisgICAgICAgICAgICAgIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWREeW5CaXRzKHFjT3V0LCBuU3ViRnJhbWVzKTsKKworICAgICAgICAgICAgICBpZiAoc3VtRHluQml0c0NvbnN1bWVkVG90YWw9PS0xKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsgLyogYml0IGNvbnN1bXB0aW9uIG5vdCB2YWxpZCBpbiBhbGwgc3ViIGZyYW1lcyAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CisKKyAgICAgICAgICAgICAgICAvKiBpbiBhbGwgZnJhbWVzIGFyZSB2YWxpZCBkeW5hbWljIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpIHx8IHFjT3V0W2NdLT51c2VkRHluQml0cz09MCkgJiYgKGRlY3JlYXNlQml0Q29uc3VtcHRpb249PTEpICYmIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgLyooKSovICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsgLyogZXhpdCBiaXQgYWRqdXN0bWVudCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPiB0b3RhbEF2YWlsYWJsZUJpdHMgJiYgKGRlY3JlYXNlQml0Q29uc3VtcHRpb249PTApICkKKy8vICAgICAgICAgICAgICAgICAgICAgIC8qKCkqLyAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7IC8qIHJlc2V0ISAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgICAgICAgIGludCBlbWVyZ2VuY3lJdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgICAgaW50IGR5bkJpdHNPdmVyc2hvb3QgICAgPSAwOworCisgICAgICAgICAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKworICAgICAgICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRpb24gbGltaXRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZW1lcmdlbmN5SXRlcmF0aW9ucyAmPSAoKGl0ZXJhdGlvbnNbY11baV0gPCBoUUMtPm1heEl0ZXJhdGlvbnMpID8gMCA6IDEpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIGRldGVjdGlvbiBpZiB1c2VkIGR5biBiaXRzIGV4Y2VlZHMgdGhlIG1heGltYWwgYWxsb3dlZCBjcml0ZXJpb24gKi8KKyAgICAgICAgICAgICAgICAgIGR5bkJpdHNPdmVyc2hvb3QgfD0gKChxY091dFtjXS0+dXNlZER5bkJpdHMgPiBxY091dFtjXS0+bWF4RHluQml0cykgPyAxIDogMCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uRG9uZT09MCB8fCBkeW5CaXRzT3ZlcnNob290KQorICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CisKKyAgICAgICAgICAgICAgICAgIGlmICggKHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID49IGF2Z1RvdGFsRHluQml0cykgfHwgKHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsPT0wKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChlbWVyZ2VuY3lJdGVyYXRpb25zICYmIChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPiB0b3RhbEF2YWlsYWJsZUJpdHMpIHx8ICFjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCxoUUMtPm1pbkJpdHNQZXJGcmFtZSxuU3ViRnJhbWVzKSkgeworICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykgJiYgY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsaFFDLT5taW5CaXRzUGVyRnJhbWUsblN1YkZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZHluQml0c092ZXJzaG9vdCkgeworICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogcmVzZXQgY29uc3RyYWludHMgZnVsbGZpbGxlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjb25zdHJhaW50c0Z1bGZpbGxlZCkpOworICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgc2l6ZW9mKGNoQ29uc3RyYWludHNGdWxmaWxsZWQpKTsKKworCisgICAgICAgICAgICAgIH0vKiBxdWFudGl6YXRpb25Eb25lICovCisKKyAgICAgIH0gd2hpbGUgKCFxdWFudGl6YXRpb25Eb25lKSA7CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIC4uLiAtZW5kLSBRdWFudGl6YXRpb24gbG9vcCAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICByZXR1cm4gQUFDX0VOQ19PSzsKK30KKworCitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKGludCogICAgICAgICAgICAgaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIG1heEl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBnYWluQWRqdXN0bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjT3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqICAgIGVsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgIGVwQ29uZmlnKQoreworICBpbnQgY2g7CisKKyAgLyoqIFNPTFZJTkcgUFJPQkxFTSAqKi8KKyAgaWYgKCgqaXRlcmF0aW9ucykrKyA+PSBtYXhJdGVyYXRpb25zKQorICB7CisgICAgaWYgKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQ9PTApIHsKKyAgICB9CisgICAgLyogY3Jhc2ggcmVjb3ZlcnkgKi8KKyAgICBlbHNlIHsKKyAgICAgIElOVCBiaXRzVG9TYXZlID0gMDsKKyAgICAgIGlmICggKGJpdHNUb1NhdmUgPSBmaXhNYXgoKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyA4KSAtIChlbEJpdHMtPmJpdFJlc0xldmVsRWwgKyBxY091dEVsZW1lbnQtPmdyYW50ZWREeW5CaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsgOCkgLSAoZWxCaXRzLT5tYXhCaXRzRWwpKSkgPiAwICkKKyAgICAgIHsKKyAgICAgICAgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkobkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsCisgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnKSA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCisgICAgICB7CisgICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IDE7CisgICAgICB9CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKKyAgICB7CisgICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOworICAgIH0KKyAgfQorICB9CisgIGVsc2UgLyogaXRlcmF0aW9ucyA+PSBtYXhJdGVyYXRpb25zICovCisgIHsKKyAgICAvKiBpbmNyZWFzZSBnYWluICgrIG5leHQgaXRlcmF0aW9uKSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKKyAgICB7CisgICAgICBpZighY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjaF0pCisgICAgICB7CisgICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IGdhaW5BZGp1c3RtZW50IDsKKyAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOyAvKiBnbG9iYWwgZ2FpbiBoYXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgcXVhbnRpemF0aW9uIGluIG5leHQgaXRlcmF0aW9uISAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBBQUNfRU5DX09LOworfQorCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoQ0hBTk5FTF9NQVBQSU5HKiAgICAgICAgICBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogICAgICAgICAgICAgICAgIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogUkVTVFJJQ1QgICAgZWxCaXRzWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICBxY091dCkKK3sKKyAgc3dpdGNoIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGUpIHsKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1NGUjoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9GRjoKKyAgICAgICBicmVhazsKKworICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNToKKyAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9IChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLSBxY091dFswXS0+dXNlZER5bkJpdHMpJjc7IC8qIHByZWNhbGN1bGF0ZSBhbGlnbm1lbnQgYml0cyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0NCUjoKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIElOVCBiaXRSZXNTcGFjZSA9IHFjS2VybmVsLT5iaXRSZXNUb3RNYXggLSBxY0tlcm5lbC0+Yml0UmVzVG90IDsKKyAgICAgIC8qIHByb2Nlc3NpbmcgZmlsbC1iaXRzICovCisgICAgICBJTlQgZGVsdGFCaXRSZXMgPSBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLSBxY091dFswXS0+dXNlZER5bkJpdHMgOworICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzID0gZml4TWF4KChkZWx0YUJpdFJlcyY3KSwgKGRlbHRhQml0UmVzIC0gKGZpeE1heCgwLGJpdFJlc1NwYWNlLTcpJn43KSkpOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGUpICovCisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIKKyAgICAgICAgIGRlc2NyaXB0aW9uOgorICAgICAgICAgcmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihJTlQgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqUkVTVFJJQ1QgbWF4VmFsdWUpCit7CisgIElOVCBzZmJPZmZzLHNmYjsKKyAgSU5UIG1heFZhbHVlQWxsID0gMDsKKworICBmb3IgKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykKKyAgICB7CisgICAgICBJTlQgbGluZTsKKyAgICAgIElOVCBtYXhUaGlzU2ZiID0gMDsKKyAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzK3NmYl07IGxpbmUgPCBzZmJPZmZzZXRbc2ZiT2ZmcytzZmIrMV07IGxpbmUrKykKKyAgICAgIHsKKyAgICAgICAgSU5UIHRtcCA9IGZpeHBfYWJzKHF1YW50U3BlY3RydW1bbGluZV0pOworICAgICAgICBtYXhUaGlzU2ZiID0gZml4TWF4KHRtcCwgbWF4VGhpc1NmYik7CisgICAgICB9CisKKyAgICAgIG1heFZhbHVlW3NmYk9mZnMrc2ZiXSA9IG1heFRoaXNTZmI7CisgICAgICBtYXhWYWx1ZUFsbCA9IGZpeE1heChtYXhUaGlzU2ZiLCBtYXhWYWx1ZUFsbCk7CisgICAgfQorICByZXR1cm4gbWF4VmFsdWVBbGw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY191cGRhdGVCaXRyZXMKKyAgICAgICAgIGRlc2NyaXB0aW9uOgorICAgICAgICAgcmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfdXBkYXRlQml0cmVzKENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0KQoreworICBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgeworICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMToKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8yOgorICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzM6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDoKKyAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl81OgorICAgICAgLyogdmFyaWFibGUgYml0cmF0ZSAqLworICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IEZES21pbihxY0tlcm5lbC0+bWF4Qml0c1BlckZyYW1lLCBxY0tlcm5lbC0+Yml0UmVzVG90TWF4KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9DQlI6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CisgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9JTlZBTElEOgorICAgIGRlZmF1bHQ6CisgICAgICBpbnQgYyA9IDA7CisgICAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCisgICAgICB7CisgICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgKz0gcWNPdXRbY10tPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0W2NdLT51c2VkRHluQml0cyArIHFjT3V0W2NdLT50b3RGaWxsQml0cyArIHFjT3V0W2NdLT5hbGlnbkJpdHMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uCisgICAgICAgICBkZXNjcmlwdGlvbjoKKyAgICAgICAgIHJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqKiBxY0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgZXBDb25maWcpCit7CisgIFFDX09VVF9FWFRFTlNJT04gZmlsbEV4dFBheWxvYWQ7CisgIElOVCB0b3RGaWxsQml0cywgYWxpZ25CaXRzOworCisgIC8qIEdldCB0b3RhbCBjb25zdW1lZCBiaXRzIGluIEFVICovCisgIHFjT3V0LT50b3RhbEJpdHMgPSBxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyAgKyBxY091dC0+dG90RmlsbEJpdHMgKworICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHM7CisKKyAgaWYgKHFjS2VybmVsLT5iaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfQ0JSKSB7CisKKyAgICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgZXhhY3QgdHJhbnNwb3J0IGJpdCBhbW91bnQsIGFuZCBob3BlZnVsbHkgaXQgaXMgZXF1YWwgdG8gdGhlIGVzdGltYXRlZCB2YWx1ZSAqLworICAgIElOVCBleGFjdFRwQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CisKKyAgICBpZiAoZXhhY3RUcEJpdHMgIT0gcWNLZXJuZWwtPmdsb2JIZHJCaXRzKSB7CisgICAgICBJTlQgZGlmZkZpbGxCaXRzID0gMDsKKworICAgICAgLyogSG93IG1hbnkgYml0cyBjYW4gYmUgdGFrZW4gYnkgYml0cmVzZXJ2b2lyICovCisgICAgICBjb25zdCBJTlQgYml0cmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gKHFjS2VybmVsLT5iaXRSZXNUb3QgKyAocWNPdXQtPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT50b3RGaWxsQml0cykgKSApOworCisgICAgICAvKiBOdW1iZXIgb2YgYml0cyB3aGljaCBjYW4gYmUgbW92ZWQgdG8gYml0cmVzZXJ2b2lyLiAqLworICAgICAgY29uc3QgSU5UIGJpdHNUb0JpdHJlcyA9IHFjS2VybmVsLT5nbG9iSGRyQml0cyAtIGV4YWN0VHBCaXRzOworICAgICAgRkRLX0FTU0VSVChiaXRzVG9CaXRyZXM+PTApOyAvKiBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKworICAgICAgLyogSWYgYml0cmVzZXJ2b2lyIGNhbiBub3QgdGFrZSBhbGwgYml0cywgbW92ZSByYW1haW5pbmcgYml0cyB0byBmaWxsYml0cyAqLworICAgICAgZGlmZkZpbGxCaXRzID0gRkRLbWF4KDAsIGJpdHNUb0JpdHJlcyAtIGJpdHJlc1NwYWNlKTsKKworICAgICAgLyogQXNzdXJlIHByZXZpb3VzIGFsaWdubWVudCAqLworICAgICAgZGlmZkZpbGxCaXRzID0gKGRpZmZGaWxsQml0cys3KSZ+NzsKKworICAgICAgLyogTW92ZSBhcyBtYW55IGJpdHMgYXMgcG9zc2libGUgdG8gYml0cmVzZXJ2b2lyICovCisgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICAgICs9IChiaXRzVG9CaXRyZXMtZGlmZkZpbGxCaXRzKTsKKworICAgICAgLyogV3JpdGUgcmVtYWluZyBiaXRzIGFzIGZpbGwgYml0cyAqLworICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICAgICArPSBkaWZmRmlsbEJpdHM7CisgICAgICBxY091dC0+dG90YWxCaXRzICAgICAgICs9IGRpZmZGaWxsQml0czsKKyAgICAgIHFjT3V0LT5ncmFudGVkRHluQml0cyAgKz0gZGlmZkZpbGxCaXRzOworCisgICAgICAvKiBHZXQgbmV3IGhlYWRlciBiaXRzICovCisgICAgICBxY0tlcm5lbC0+Z2xvYkhkckJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjT3V0LT50b3RhbEJpdHMpOworCisgICAgICBpZiAocWNLZXJuZWwtPmdsb2JIZHJCaXRzICE9IGV4YWN0VHBCaXRzKSB7CisgICAgICAgIC8qIEluIHByZXZpb3VzIHN0ZXAsIGZpbGwgYml0cyBhbmQgY29ycmVzcG9uZGluZyB0b3RhbCBiaXRzIHdlcmUgY2hhbmdlZCB3aGVuIGJpdHJlc2Vydm9pciB3YXMgY29tcGxldGVseSBmaWxsZWQuCisgICAgICAgICAgIE5vdyB3ZSBjYW4gdGFrZSB0aGUgdG9vIG11Y2ggdGFrZW4gYml0cyBjYXVzZWQgYnkgaGVhZGVyIG92ZXJoZWFkIGZyb20gYml0cmVzZXJ2b2lyLgorICAgICAgICAgKi8KKyAgICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCAtPSAocWNLZXJuZWwtPmdsb2JIZHJCaXRzIC0gZXhhY3RUcEJpdHMpOworICAgICAgfQorICAgIH0KKworICB9IC8qIE1PREVfQ0JSICovCisKKyAgLyogVXBkYXRlIGV4YWN0IG51bWJlciBvZiBjb25zdW1lZCBoZWFkZXIgYml0cy4gKi8KKyAgcWNLZXJuZWwtPmdsb2JIZHJCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY091dC0+dG90YWxCaXRzKTsKKworICAvKiBTYXZlIHRvdGFsIGZpbGwgYml0cyBhbmQgZGlzdHJpYnV0IHRvIGFsaWdubWVudCBhbmQgZmlsbCBiaXRzICovCisgIHRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzOworCisgIC8qIGZha2UgYSBmaWxsIGV4dGVuc2lvbiBwYXlsb2FkICovCisgIEZES21lbWNsZWFyKCZmaWxsRXh0UGF5bG9hZCwgc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKKworICBmaWxsRXh0UGF5bG9hZC50eXBlID0gRVhUX0ZJTExfREFUQTsKKyAgZmlsbEV4dFBheWxvYWQublBheWxvYWRCaXRzID0gdG90RmlsbEJpdHM7CisKKyAgLyogYXNrIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IG9mIHRoYXQgYml0cyBjYW4gYmUgd3JpdHRlbiBpbiBhIGZpbGwgZXh0ZW5zaW9uIGRhdGEgZW50aXR5ICovCisgIHFjT3V0LT50b3RGaWxsQml0cyA9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGxFeHRQYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyApOworCisgIC8qIG5vdyBkaXN0cmlidXRlIGV4dHJhIGZpbGxiaXRzIGFuZCBhbGlnbmJpdHMgKi8KKyAgYWxpZ25CaXRzID0gNyAtIChxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cworICAgICAgICAgICAgICAgICAgICsgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHMgLTEpJTg7CisKKyAgLyogTWF5YmUgd2UgY291bGQgcmVtb3ZlIHRoaXMgKi8KKyAgaWYoICgoYWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHMpPT04KSAmJiAocWNPdXQtPnRvdEZpbGxCaXRzPjgpICkKKyAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzIC09IDg7CisKKyAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgIGFsaWduQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzOworCisgIGlmICggKHFjT3V0LT50b3RhbEJpdHM+cWNLZXJuZWwtPm1heEJpdHNQZXJGcmFtZSkgfHwgKHFjT3V0LT50b3RhbEJpdHM8cWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSkgKSB7CisgICAgcmV0dXJuIEFBQ19FTkNfUVVBTlRfRVJST1I7CisgIH0KKworICBxY091dC0+YWxpZ25CaXRzID0gYWxpZ25CaXRzOworCisgIHJldHVybiBBQUNfRU5DX09LOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jcmFzaFJlY292ZXJ5CisgICAgICAgICBkZXNjcmlwdGlvbjogIGZ1bGZpbGxzIGNvbnN0cmFpbnRzIGJ5IG1lYW5zIG9mIGJydXRlIGZvcmNlLi4uCisgICAgICAgICAgICAgICAgICAgICAgID0+IGJpdHMgYXJlIHNhdmVkIGJ5IGNhbmNlbGxpbmcgb3V0IHNwZWN0cmFsIGxpbmVzISEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2lubmluZyBhdCB0aGUgaGlnaGVzdCBmcmVxdWVuY2llcykKKyAgICAgICAgIHJldHVybjogICAgICAgZXJyb3Jjb2RlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAgKnFjRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWcpCit7CisgIElOVCBjaCA7CisgIElOVCBzYXZlZEJpdHMgPSAwIDsKKyAgSU5UIHNmYiwgc2ZiR3JwIDsKKyAgSU5UIGJpdHNQZXJTY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdIDsKKyAgSU5UIHNlY3Rpb25Ub1NjZlsoMildW01BWF9HUk9VUEVEX1NGQl0gOworICBJTlQgKnNmYk9mZnNldCA7CisgIElOVCBzZWN0LCBzdGF0Qml0c05ldyA7CisgIFFDX09VVF9DSEFOTkVMICoqcWNDaGFubmVsID0gcWNFbGVtZW50LT5xY091dENoYW5uZWw7CisgIFBTWV9PVVRfQ0hBTk5FTCAqKnBzeUNoYW5uZWwgPSBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsOworCisgIC8qIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIGNvbnZlcnRzIGZycS1iaW5zIHRvIGJpdC1kZW1hbmQuLi4gICAgW2JpdHNQZXJTY2ZdICovCisgIC8qIC4uLmFuZCBhbm90aGVyIG9uZSB3aGljaCBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9ucyBbc2VjdGlvblRvU2NmXSAqLworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCisgIHsKKyAgICBzZmJPZmZzZXQgPSBwc3lDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0cyA7CisKKyAgICBmb3IgKHNlY3QgPSAwOyBzZWN0IDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZlNlY3Rpb25zOyBzZWN0KyspCisgICAgeworICAgICAgSU5UIHNmYiA7CisgICAgICBJTlQgY29kZUJvb2sgPSBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5jb2RlQm9vayA7CisKKyAgICAgIGZvciAoc2ZiID0gcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiU3RhcnQ7CisgICAgICAgICAgIHNmYiA8IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYlN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiQ250OworICAgICAgICAgICBzZmIrKykKKyAgICAgIHsKKyAgICAgICAgYml0c1BlclNjZltjaF1bc2ZiXSA9IDA7CisgICAgICAgIGlmICggKGNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pIC8qJiYKKyAgICAgICAgICAgICAoc2ZiIDwgKHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vT2ZHcm91cHMqcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXApKSovICkKKyAgICAgICAgeworICAgICAgICAgICAgSU5UIHNmYlN0YXJ0TGluZSA9IHNmYk9mZnNldFtzZmJdIDsKKyAgICAgICAgICAgIElOVCBub09mTGluZXMgICAgPSBzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiU3RhcnRMaW5lIDsKKyAgICAgICAgICAgIGJpdHNQZXJTY2ZbY2hdW3NmYl0gPSBGREthYWNFbmNfY291bnRWYWx1ZXMoJihxY0NoYW5uZWxbY2hdLT5xdWFudFNwZWNbc2ZiU3RhcnRMaW5lXSksIG5vT2ZMaW5lcywgY29kZUJvb2spIDsKKyAgICAgICAgfQorICAgICAgICBzZWN0aW9uVG9TY2ZbY2hdW3NmYl0gPSBzZWN0IDsKKyAgICAgIH0KKworICAgIH0KKyAgfQorCisgIC8qIExPV0VSIFttYXhTZmJdIElOIEJPVEggQ0hBTk5FTFMhISAqLworICAvKiBBdHRlbnRpb246IGluIGNhc2Ugb2Ygc3RlcmVvOiBtYXhTZmJMID09IG1heFNmYlIsIEdyb3VwaW5nTCA9PSBHcm91cGluZ1IgOyAqLworCisgIGZvciAoc2ZiID0gcWNDaGFubmVsWzBdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cC0xOyBzZmIgPj0gMDsgc2ZiLS0pCisgIHsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeUNoYW5uZWxbMF0tPnNmYkNudDsgc2ZiR3JwICs9IHBzeUNoYW5uZWxbMF0tPnNmYlBlckdyb3VwKQorICAgIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKKyAgICAgIHsKKyAgICAgICAgaW50IHNlY3QgPSBzZWN0aW9uVG9TY2ZbY2hdW3NmYkdycCtzZmJdOworICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQtLSA7CisgICAgICAgIHNhdmVkQml0cyArPSBiaXRzUGVyU2NmW2NoXVtzZmJHcnArc2ZiXSA7CisKKyAgICAgICAgaWYgKHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudCA9PSAwKSB7CisgICAgICAgICAgc2F2ZWRCaXRzICs9IChwc3lDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpID8gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbMF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiAuLi5oYXZlIGVub3VnaCBiaXRzIGJlZW4gc2F2ZWQ/ICovCisgICAgaWYgKHNhdmVkQml0cyA+PSBiaXRzVG9TYXZlKQorICAgICAgYnJlYWsgOworCisgIH0gLyogc2ZiIGxvb3AgKi8KKworICAvKiBpZiBub3QgZW5vdWdoIGJpdHMgc2F2ZWQsCisgICAgIGNsZWFuIHdob2xlIHNwZWN0cnVtIGFuZCByZW1vdmUgc2lkZSBpbmZvIG92ZXJoZWFkICovCisgIGlmIChzZmIgPT0gLTEpIHsKKyAgICBzZmIgPSAwIDsKKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKKyAgeworICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwID0gc2ZiIDsKKyAgICBwc3lDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgPSBzZmIgOworICAgIC8qIHdoZW4gbm8gc3BlY3RydW0gaXMgY29kZWQgc2F2ZSB0b29scyBpbmZvIGluIGJpdHN0cmVhbSAqLworICAgIGlmKHNmYj09MCkgeworICAgICAgRkRLbWVtY2xlYXIoJnBzeUNoYW5uZWxbY2hdLT50bnNJbmZvLCBzaXplb2YoVE5TX0lORk8pKTsKKyAgICAgIEZES21lbWNsZWFyKCZwc3lPdXRFbGVtZW50LT50b29sc0luZm8sIHNpemVvZihUT09MU0lORk8pKTsKKyAgICB9CisgIH0KKyAgLyogZHluYW1pYyBiaXRzIHdpbGwgYmUgdXBkYXRlZCBpbiBpdGVyYXRpb24gbG9vcCAqLworCisgIHsgLyogaWYgc3RvcCBzZmIgaGFzIGNoYW5nZWQgc2F2ZSBiaXRzIGluIHNpZGUgaW5mbywgZS5nLiBNUyBvciBUTlMgY29kaW5nICovCisgICAgRUxFTUVOVF9JTkZPIGVsSW5mbzsKKworICAgIEZES21lbWNsZWFyKCZlbEluZm8sIHNpemVvZihFTEVNRU5UX0lORk8pKTsKKyAgICBlbEluZm8ubkNoYW5uZWxzSW5FbCA9IG5DaGFubmVsczsKKyAgICBlbEluZm8uZWxUeXBlID0gKG5DaGFubmVscyA9PSAyKSA/IElEX0NQRSA6IElEX1NDRTsKKworICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCAmZWxJbmZvLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdEJpdHNOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKKyAgfQorCisgIHNhdmVkQml0cyA9IHFjRWxlbWVudC0+c3RhdGljQml0c1VzZWQgLSBzdGF0Qml0c05ldzsKKworICAvKiB1cGRhdGUgc3RhdGljIGFuZCBkeW5hbWljIGJpdHMgKi8KKyAgcWNFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCAtPSBzYXZlZEJpdHM7CisgIHFjRWxlbWVudC0+Z3JhbnRlZER5bkJpdHMgKz0gc2F2ZWRCaXRzOworCisgIHFjT3V0LT5zdGF0aWNCaXRzICAgICAtPSBzYXZlZEJpdHM7CisgIHFjT3V0LT5ncmFudGVkRHluQml0cyArPSBzYXZlZEJpdHM7CisgIHFjT3V0LT5tYXhEeW5CaXRzICAgICArPSBzYXZlZEJpdHM7CisKKworfQorCisKKwordm9pZCAgRkRLYWFjRW5jX1FDQ2xvc2UgKFFDX1NUQVRFICAqKnBoUUNzdGF0ZSwgUUNfT1VUICoqcGhRQykKK3sKKyAgaW50IG4sIGk7CisKKyAgaWYgKHBoUUMhPU5VTEwpIHsKKworICAgIGZvciAobj0wO248KDEpO24rKykgeworICAgICAgaWYgKHBoUUNbbl0gIT0gTlVMTCkgeworICAgICAgICBRQ19PVVQgICAgKmhRQyAgICAgID0gcGhRQ1tuXTsKKyAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CisgICAgICAgICAgaWYgKGhRQy0+cWNFbGVtZW50W2ldKQorICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUUNlbGVtZW50KCZoUUMtPnFjRWxlbWVudFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBGcmVlUmFtX2FhY0VuY19RQ291dCgmcGhRQ1tuXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHBoUUNzdGF0ZSE9TlVMTCkgeworICAgIGlmICgqcGhRQ3N0YXRlICE9IE5VTEwpIHsKKyAgICAgIFFDX1NUQVRFICAqaFFDc3RhdGUgPSAqcGhRQ3N0YXRlOworCisgICAgICBpZiAoaFFDc3RhdGUtPmhBZGpUaHIgIT0gTlVMTCkKKyAgICAgICAgRkRLYWFjRW5jX0FkalRockNsb3NlKCZoUUNzdGF0ZS0+aEFkalRocik7CisKKyAgICAgIGlmIChoUUNzdGF0ZS0+aEJpdENvdW50ZXIgIT0gTlVMTCkKKyAgICAgICAgRkRLYWFjRW5jX0JDQ2xvc2UoJmhRQ3N0YXRlLT5oQml0Q291bnRlcik7CisKKyAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CisgICAgICAgIGlmIChoUUNzdGF0ZS0+ZWxlbWVudEJpdHNbaV0hPU5VTEwpIHsKKyAgICAgICAgICBGcmVlUmFtX2FhY0VuY19FbGVtZW50Qml0cygmaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRnJlZVJhbV9hYWNFbmNfUUNzdGF0ZShwaFFDc3RhdGUpOworICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9xY19tYWluLmggYi9hYWMvbGliQUFDZW5jL3NyYy9xY19tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4YzA0MgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3FjX21haW4uaApAQCAtMCwwICsxLDE3MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFF1YW50aXppbmcgJiBjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUUNfTUFJTl9ICisjZGVmaW5lIF9RQ19NQUlOX0gKKworCisjaW5jbHVkZSAiYWFjZW5jLmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgInBzeV9tYWluLmgiCisjaW5jbHVkZSAidHBlbmNfbGliLmgiCisKKy8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0TmV3KFFDX09VVCAgICAqKnBoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuU3ViRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAqZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXRJbml0KFFDX09VVCAgICAgICAgICAqcGhRQ1soMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY20pOworCitBQUNfRU5DT0RFUl9FUlJPUiAgRkRLYWFjRW5jX1FDTmV3KFFDX1NUQVRFICAqKnBoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG5FbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KKyAgICAgICAgICAgKTsKKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDSW5pdChRQ19TVEFURSAqaFFDLCBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW5QcmVwYXJlKAorICAgICAgICAgICBFTEVNRU5UX0lORk8gICAgICAgICAgICAgICplbEluZm8sCisgICAgICAgICAgIEFUU19FTEVNRU5UKiAgUkVTVFJJQ1QgICAgIGFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBSRVNUUklDVCAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICAgcWNPdXRFbGVtZW50LCAgIC8qIHJldHVybnMgZXJyb3IgY29kZSAgICAgICAqLworICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCisgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAorICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZworICAgICAgICAgICApOworCisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW4oUUNfU1RBVEUqIFJFU1RSSUNUICAgICAgICAgaFFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogICAgICAgICAgICAgICAgICBwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgIHFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgICAgICAgIGNtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEFVRElPX09CSkVDVF9UWVBFICAgICAgICAgIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVGaWxsQml0cyhDSEFOTkVMX01BUFBJTkcqICAgICAgICAgIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFKiAgICAgICAgICAgICAgICAgcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBSRVNUUklDVCAgICBlbEJpdHNbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0KTsKKworCit2b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoICBDSEFOTkVMX01BUFBJTkcgKmNtLAorICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqKnFjT3V0KTsKKworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oIENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiogcWNFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICBlcENvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAqUkVTVFJJQ1QgaFFDLAorICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpSRVNUUklDVCBjbSwKKyAgICAgICAgICAgICAgICAgIElOVCAqYXZnVG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoKTsKKwordm9pZCAgRkRLYWFjRW5jX1FDQ2xvc2UgKFFDX1NUQVRFICAqKnBoUUNzdGF0ZSwgUUNfT1VUICoqcGhRQyk7CisKKyNlbmRpZiAvKiBfUUNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4MGUzNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3F1YW50aXplLmNwcApAQCAtMCwwICsxLDM5NSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogUXVhbnRpemF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInF1YW50aXplLmgiCisKKyNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcXVhbnRpemVMaW5lcworICAgIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMKKyAgICByZXR1cm5zOgorICAgIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MsIHNwZWN0cmFsIGRhdGEKKyAgICBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKElOVCAgICAgIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgIG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAqcXVhU3BlY3RydW0pCit7CisgIGludCAgIGxpbmU7CisgIEZJWFBfREJMIGsgPSBGTDJGWENPTlNUX0RCTCgtMC4wOTQ2ZiArIDAuNWYpPj4xNjsKKyAgRklYUF9RVEQgcXVhbnRpemVyID0gRkRLYWFjRW5jX3F1YW50VGFibGVRWygtZ2FpbikmM107CisgIElOVCAgICAgIHF1YW50aXplcnNoaWZ0ID0gKCgtZ2Fpbik+PjIpKzE7CisKKworICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbm9PZkxpbmVzOyBsaW5lKyspCisgIHsKKyAgICBGSVhQX0RCTCBhY2N1ID0gZk11bHREaXYyKG1kY3RTcGVjdHJ1bVtsaW5lXSxxdWFudGl6ZXIpOworCisgICAgaWYgKGFjY3UgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICB7CisgICAgICBhY2N1PS1hY2N1OworICAgICAgLyogbm9ybWFsaXplICovCisgICAgICBJTlQgICBhY2N1U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYWNjdSkgLSAxOyAgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KKyAgICAgIGFjY3UgPDw9IGFjY3VTaGlmdDsKKyAgICAgIElOVCB0YWJJbmRleCA9IChJTlQpKGFjY3U+PihERlJBQ1RfQklUUy0yLU1BTlRfRElHSVRTKSkmKH5NQU5UX1NJWkUpOworICAgICAgSU5UIHRvdGFsU2hpZnQgPSBxdWFudGl6ZXJzaGlmdC1hY2N1U2hpZnQrMTsKKyAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkRLYWFjRW5jX21UYWJfM180W3RhYkluZGV4XSxGREthYWNFbmNfcXVhbnRUYWJsZUVbdG90YWxTaGlmdCYzXSk7CisgICAgICB0b3RhbFNoaWZ0ID0gKDE2LTQpLSgzKih0b3RhbFNoaWZ0Pj4yKSk7CisgICAgICBGREtfQVNTRVJUKHRvdGFsU2hpZnQgPj0wKTsgLyogTUFYX1FVQU5UX1ZJT0xBVElPTiAqLworICAgICAgYWNjdSA+Pj0gZml4TWluKHRvdGFsU2hpZnQsREZSQUNUX0JJVFMtMSk7CisgICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9IChTSE9SVCkoLSgoTE9ORykoayArIGFjY3UpID4+IChERlJBQ1RfQklUUy0xLTE2KSkpOworICAgIH0KKyAgICBlbHNlIGlmKGFjY3UgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICB7CisgICAgICAvKiBub3JtYWxpemUgKi8KKyAgICAgIElOVCAgIGFjY3VTaGlmdCA9IENudExlYWRpbmdaZXJvcyhhY2N1KSAtIDE7ICAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlIHNpbmNlIHRlc3QgdmFsdWUgaXMgYWx3YXlzID4gMCAqLworICAgICAgYWNjdSA8PD0gYWNjdVNoaWZ0OworICAgICAgSU5UIHRhYkluZGV4ID0gKElOVCkoYWNjdT4+KERGUkFDVF9CSVRTLTItTUFOVF9ESUdJVFMpKSYofk1BTlRfU0laRSk7CisgICAgICBJTlQgdG90YWxTaGlmdCA9IHF1YW50aXplcnNoaWZ0LWFjY3VTaGlmdCsxOworICAgICAgYWNjdSA9IGZNdWx0RGl2MihGREthYWNFbmNfbVRhYl8zXzRbdGFiSW5kZXhdLEZES2FhY0VuY19xdWFudFRhYmxlRVt0b3RhbFNoaWZ0JjNdKTsKKyAgICAgIHRvdGFsU2hpZnQgPSAoMTYtNCktKDMqKHRvdGFsU2hpZnQ+PjIpKTsKKyAgICAgIEZES19BU1NFUlQodG90YWxTaGlmdCA+PTApOyAvKiBNQVhfUVVBTlRfVklPTEFUSU9OICovCisgICAgICBhY2N1ID4+PSBmaXhNaW4odG90YWxTaGlmdCxERlJBQ1RfQklUUy0xKTsKKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gKFNIT1JUKSgoTE9ORykoayArIGFjY3UpID4+IChERlJBQ1RfQklUUy0xLTE2KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdPTA7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTppRkRLYWFjRW5jX3F1YW50aXplTGluZXMKKyAgICBkZXNjcmlwdGlvbjogaXF1YW50aXplcyBzcGVjdHJ1bSBsaW5lcworICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gPSBpcXVhU3BlY3RydW1eNC8zICoyXigwLjI1KmdhaW4pCisgICAgaW5wdXQ6IGdsb2JhbCBnYWluLCBudW1iZXIgb2YgbGluZXMgdG8gcHJvY2VzcyxxdWFudGl6ZWQgc3BlY3RydW0KKyAgICBvdXRwdXQ6IHNwZWN0cmFsIGRhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhJTlQgIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgbm9PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSkKKworeworICBJTlQgaXF1YW50aXplcm1vZDsKKyAgSU5UIGlxdWFudGl6ZXJzaGlmdDsKKyAgSU5UIGxpbmU7CisKKyAgaXF1YW50aXplcm1vZCA9IGdhaW4mMzsKKyAgaXF1YW50aXplcnNoaWZ0ID0gZ2Fpbj4+MjsKKworICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbm9PZkxpbmVzOyBsaW5lKyspIHsKKworICAgIGlmKHF1YW50U3BlY3RydW1bbGluZV0gPCAwKSB7CisgICAgICBGSVhQX0RCTCBhY2N1OworICAgICAgSU5UIGV4LHNwZWNFeHAsdGFiSW5kZXg7CisgICAgICBGSVhQX0RCTCBzLHQ7CisKKyAgICAgIGFjY3UgPSAoRklYUF9EQkwpIC1xdWFudFNwZWN0cnVtW2xpbmVdOworCisgICAgICBleCA9IENvdW50TGVhZGluZ0JpdHMoYWNjdSk7CisgICAgICBhY2N1IDw8PSBleDsKKyAgICAgIHNwZWNFeHAgPSAoREZSQUNUX0JJVFMtMSkgLSBleDsKKworICAgICAgRkRLX0FTU0VSVChzcGVjRXhwIDwgMTQpOyAgICAgICAvKiB0aGlzIGZhaWxzIGlmIGFicyh2YWx1ZSkgPiA4MTkxICovCisKKyAgICAgIHRhYkluZGV4ID0gKElOVCkoYWNjdT4+KERGUkFDVF9CSVRTLTItTUFOVF9ESUdJVFMpKSYofk1BTlRfU0laRSk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSAibWFudGlzc2EiIF40LzMgKi8KKyAgICAgIHMgPSBGREthYWNFbmNfbVRhYl80XzNFbGNbdGFiSW5kZXhdOworCisgICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGggc2NmTW9kICovCisgICAgICB0ID0gRkRLYWFjRW5jX3NwZWNFeHBNYW50VGFibGVDb21iRWxjW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOworCisgICAgICAvKiBtdWx0aXBseSAibWFudGlzc2EiIF40LzMgd2l0aCBleHBvbmVudCBtdWx0aXBsaWVyICovCisgICAgICBhY2N1ID0gZk11bHQocyx0KTsKKworICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBzaGlmdGVyICovCisgICAgICBzcGVjRXhwID0gRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbaXF1YW50aXplcm1vZF1bc3BlY0V4cF0tMTsgLyogLTEgdG8gYXZvaWQgb3ZlcmZsb3dzIGluIGFjY3UgKi8KKworICAgICAgaWYgKCgtaXF1YW50aXplcnNoaWZ0LXNwZWNFeHApIDwgMCkKKyAgICAgICAgYWNjdSA8PD0gLSgtaXF1YW50aXplcnNoaWZ0LXNwZWNFeHApOworICAgICAgZWxzZQorICAgICAgICBhY2N1ID4+PSAtaXF1YW50aXplcnNoaWZ0LXNwZWNFeHA7CisKKyAgICAgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IC1hY2N1OworICAgIH0KKyAgICBlbHNlIGlmIChxdWFudFNwZWN0cnVtW2xpbmVdID4gMCkgeworICAgICAgRklYUF9EQkwgYWNjdTsKKyAgICAgIElOVCBleCxzcGVjRXhwLHRhYkluZGV4OworICAgICAgRklYUF9EQkwgcyx0OworCisgICAgICBhY2N1ID0gKEZJWFBfREJMKShJTlQpcXVhbnRTcGVjdHJ1bVtsaW5lXTsKKworICAgICAgZXggPSBDb3VudExlYWRpbmdCaXRzKGFjY3UpOworICAgICAgYWNjdSA8PD0gZXg7CisgICAgICBzcGVjRXhwID0gKERGUkFDVF9CSVRTLTEpIC0gZXg7CisKKyAgICAgIEZES19BU1NFUlQoc3BlY0V4cCA8IDE0KTsgICAgICAgLyogdGhpcyBmYWlscyBpZiBhYnModmFsdWUpID4gODE5MSAqLworCisgICAgICB0YWJJbmRleCA9IChJTlQpKGFjY3U+PihERlJBQ1RfQklUUy0yLU1BTlRfRElHSVRTKSkmKH5NQU5UX1NJWkUpOworCisgICAgICAvKiBjYWxjdWxhdGUgIm1hbnRpc3NhIiBeNC8zICovCisgICAgICBzID0gRkRLYWFjRW5jX21UYWJfNF8zRWxjW3RhYkluZGV4XTsKKworICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoIHNjZk1vZCAqLworICAgICAgdCA9IEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsKKworICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLworICAgICAgYWNjdSA9IGZNdWx0KHMsdCk7CisKKyAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLworICAgICAgc3BlY0V4cCA9IEZES2FhY0VuY19zcGVjRXhwVGFibGVDb21iW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdLTE7IC8qIC0xIHRvIGF2b2lkIG92ZXJmbG93cyBpbiBhY2N1ICovCisKKyAgICAgIGlmICgoIC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCkgPCAwKQorICAgICAgICBhY2N1IDw8PSAtKC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCk7CisgICAgICBlbHNlCisgICAgICAgIGFjY3UgPj49IC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cDsKKworICAgICAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtCisgICAgZGVzY3JpcHRpb246IHF1YW50aXplcyB0aGUgZW50aXJlIHNwZWN0cnVtCisgICAgcmV0dXJuczoKKyAgICBpbnB1dDogbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIHRvIGJlIHF1YW50aXplZCwgLi4uCisgICAgb3V0cHV0OiBxdWFudGl6ZWQgc3BlY3RydW0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSkKK3sKKyAgSU5UIHNmYk9mZnMsc2ZiOworCisgIC8qIGluIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzIHF1YVNwZWN0cnVtIGlzIGNhbGN1bGF0ZWQgd2l0aDoKKyAgICAgICAgc3BlY14oMy80KSAqIDJeKC0zLzE2KlFTUykgKiAyXigzLzQqc2NhbGUpICsgaworICAgICBzaW1wbGlmeSBzY2FsaW5nIGNhbGN1bGF0aW9uIGFuZCByZWR1Y2UgUVNTIGJlZm9yZToKKyAgICAgICAgc3BlY14oMy80KSAqIDJeKC0zLzE2KihRU1MgLSA0KnNjYWxlKSkgKi8KKworICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKQorICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykKKyAgeworICAgIElOVCBzY2FsZWZhY3RvciA9IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYl0gOworCisgICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2xvYmFsR2FpbiAtIHNjYWxlZmFjdG9yLCAvKiBRU1MgKi8KKyAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmJPZmZzK3NmYisxXSAtIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNTZmJEaXN0CisgICAgZGVzY3JpcHRpb246IGNhbGN1bGF0ZXMgZGlzdG9ydGlvbiBvZiBxdWFudGl6ZWQgdmFsdWVzCisgICAgcmV0dXJuczogZGlzdG9ydGlvbgorICAgIGlucHV0OiBnYWluLCBudW1iZXIgb2YgbGluZXMgdG8gcHJvY2Vzcywgc3BlY3RyYWwgZGF0YQorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluCisgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpLHNjYWxlOworICBGSVhQX0RCTCB4ZnNmOworICBGSVhQX0RCTCBkaWZmOworICBGSVhQX0RCTCBpbnZRdWFudFNwZWM7CisKKyAgeGZzZiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIGZvciAoaT0wOyBpPG5vT2ZMaW5lczsgaSsrKSB7CisgICAgLyogcXVhbnRpemF0aW9uICovCisgICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2FpbiwKKyAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICZtZGN0U3BlY3RydW1baV0sCisgICAgICAgICAgICAgICAgICZxdWFudFNwZWN0cnVtW2ldKTsKKworICAgIGlmIChmQWJzKHF1YW50U3BlY3RydW1baV0pPk1BWF9RVUFOVCkgeworICAgICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIH0KKyAgICAvKiBpbnZlcnNlIHF1YW50aXphdGlvbiAqLworICAgIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKGdhaW4sMSwmcXVhbnRTcGVjdHJ1bVtpXSwmaW52UXVhbnRTcGVjKTsKKworICAgIC8qIGRpc3QgKi8KKyAgICBkaWZmID0gZml4cF9hYnMoZml4cF9hYnMoaW52UXVhbnRTcGVjKSAtIGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtpXT4+MSkpOworCisgICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKGRpZmYpOworICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIHNjYWxlKTsKKyAgICBkaWZmID0gZlBvdzIoZGlmZik7CisgICAgc2NhbGUgPSBmaXhNaW4oMiooc2NhbGUtMSksIERGUkFDVF9CSVRTLTEpOworCisgICAgZGlmZiA9IHNjYWxlVmFsdWUoZGlmZiwgLXNjYWxlKTsKKworICAgIHhmc2YgPSB4ZnNmICsgZGlmZjsKKyAgfQorCisgIHhmc2YgPSBDYWxjTGREYXRhKHhmc2YpOworCisgIHJldHVybiB4ZnNmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNTZmJRdWFudEVuZXJneUFuZERpc3QKKyAgICBkZXNjcmlwdGlvbjogY2FsY3VsYXRlcyBlbmVyZ3kgYW5kIGRpc3RvcnRpb24gb2YgcXVhbnRpemVkIHZhbHVlcworICAgIHJldHVybnM6CisgICAgaW5wdXQ6IGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLCBxdWFudGl6ZWQgc3BlY3RyYWwgZGF0YSwKKyAgICAgICAgICAgc3BlY3RyYWwgZGF0YQorICAgIG91dHB1dDogZW5lcmd5LCBkaXN0b3J0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfY2FsY1NmYlF1YW50RW5lcmd5QW5kRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0KQoreworICBJTlQgaSxzY2FsZTsKKyAgRklYUF9EQkwgaW52UXVhbnRTcGVjOworICBGSVhQX0RCTCBkaWZmOworCisgIEZJWFBfREJMIGVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBGSVhQX0RCTCBkaXN0b3J0aW9uID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgZm9yIChpPTA7IGk8bm9PZkxpbmVzOyBpKyspIHsKKworICAgIGlmIChmQWJzKHF1YW50U3BlY3RydW1baV0pPk1BWF9RVUFOVCkgeworICAgICAgKmVuICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICpkaXN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KKyAgICBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhnYWluLDEsJnF1YW50U3BlY3RydW1baV0sJmludlF1YW50U3BlYyk7CisKKyAgICAvKiBlbmVyZ3kgKi8KKyAgICBlbmVyZ3kgKz0gZlBvdzIoaW52UXVhbnRTcGVjKTsKKworICAgIC8qIGRpc3QgKi8KKyAgICBkaWZmID0gZml4cF9hYnMoZml4cF9hYnMoaW52UXVhbnRTcGVjKSAtIGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtpXT4+MSkpOworCisgICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKGRpZmYpOworICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIHNjYWxlKTsKKyAgICBkaWZmID0gZlBvdzIoZGlmZik7CisKKyAgICBzY2FsZSA9IGZpeE1pbigyKihzY2FsZS0xKSwgREZSQUNUX0JJVFMtMSk7CisKKyAgICBkaWZmID0gc2NhbGVWYWx1ZShkaWZmLCAtc2NhbGUpOworCisgICAgZGlzdG9ydGlvbiArPSBkaWZmOworICB9CisKKyAgKmVuICAgPSBDYWxjTGREYXRhKGVuZXJneSkrRkwyRlhDT05TVF9EQkwoMC4wMzEyNWYpOworICAqZGlzdCA9IENhbGNMZERhdGEoZGlzdG9ydGlvbik7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3F1YW50aXplLmggYi9hYWMvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NWI5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oCkBAIC0wLDAgKzEsMTE5IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9RVUFOVElaRV9IXworI2RlZmluZSBfUVVBTlRJWkVfSF8KKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyogcXVhbnRpemluZyAqLworCisjZGVmaW5lIE1BWF9RVUFOVCA4MTkxCisKK3ZvaWQgRkRLYWFjRW5jX1F1YW50aXplU3BlY3RydW0oSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiT2Zmc2V0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBnbG9iYWxHYWluLCBJTlQgKnNjYWxlZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRpemVkU3BlY3RydW0pOworCitGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluKTsKKwordm9pZCBGREthYWNFbmNfY2FsY1NmYlF1YW50RW5lcmd5QW5kRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgIG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRpc3QpOworCisjZW5kaWYgLyogX1FVQU5USVpFX0hfICovCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiNzVhNgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmNwcApAQCAtMCwwICsxLDEzMDEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzZl9lc3RpbS5oIgorI2luY2x1ZGUgImFhY0VuY19yb20uaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgImJpdF9jbnQuaCIKKworCisKKworI2RlZmluZSBBU19QRV9GQUNfU0hJRlQgNworI2RlZmluZSBESVNUX0ZBQ19TSElGVCAgMworI2RlZmluZSBBU19QRV9GQUNfRkxPQVQgKGZsb2F0KSgxIDw8IEFTX1BFX0ZBQ19TSElGVCkKK3N0YXRpYyBjb25zdCBJTlQgTUFYX1NDRl9ERUxUQSA9IDYwOworCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBQRV9DMSA9IEZMMkZYQ09OU1RfREJMKDMuMGYvQVNfUEVfRkFDX0ZMT0FUKTsgICAgICAgICAgLyogKGxvZyg4LjApL2xvZygyKSkgPj4gQVNfUEVfRkFDX1NISUZUICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzIgPSBGTDJGWENPTlNUX0RCTCgxLjMyMTkyODFmL0FTX1BFX0ZBQ19GTE9BVCk7ICAgIC8qIChsb2coMi41KS9sb2coMikpID4+IEFTX1BFX0ZBQ19TSElGVCAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MzID0gRkwyRlhDT05TVF9EQkwoMC41NTkzNTczZik7ICAgICAgICAgICAgICAgICAgICAvKiAxLUMyL0MxICovCisKKworLyoKKyAgRnVuY3Rpb247IEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsCisKKyAgRGVzY3JpcHRpb246IENhbGN1bGF0ZXMgdGhlIGZvcm1mYWN0b3IKKworICBzZjogc2NhbGUgZmFjdG9yIG9mIHRoZSBtZGN0IHNwZWN0cnVtCisgIHNmYkZvcm1GYWN0b3JMZERhdGEgaXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAxLygoKDJec2YpXjAuNSkgKiAoMl5GT1JNX0ZBQ19TSElGVCkpCisqLworc3RhdGljIHZvaWQKK0ZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKEZJWFBfREJMICpSRVNUUklDVCBzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqUkVTVFJJQ1QgcHN5T3V0Q2hhbikKK3sKKyAgSU5UIGosIHNmYiwgc2ZiR3JwOworICBGSVhQX0RCTCBmb3JtRmFjdG9yOworCisgIGludCB0bXAwID0gcHN5T3V0Q2hhbi0+c2ZiQ250OworICBpbnQgdG1wMSA9IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOworICBpbnQgc3RlcCA9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwOworICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgdG1wMDsgc2ZiR3JwICs9IHN0ZXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHRtcDE7IHNmYisrKSB7CisgICAgICBmb3JtRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAvKiBjYWxjIHN1bSBvZiBzcXJ0KHNwZWMpICovCisgICAgICBmb3Ioaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkdycCtzZmJdOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiR3JwK3NmYisxXTsgaisrICkgeworICAgICAgICAgZm9ybUZhY3RvciArPSBzcXJ0Rml4cChmaXhwX2Ficyhwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0pKT4+Rk9STV9GQUNfU0hJRlQ7CisgICAgICB9CisgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdID0gQ2FsY0xkRGF0YShmb3JtRmFjdG9yKTsKKyAgICB9CisgICAgLyogc2V0IHNmYkZvcm1GYWN0b3IgZm9yIHNmYnMgd2l0aCB6ZXJvIHNwZWMgdG8gemVyby4gSnVzdCBmb3IgZGVidWdnaW5nLiAqLworICAgIGZvciAoIDsgc2ZiIDwgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIH0KKyAgfQorfQorCisvKgorICBGdW5jdGlvbjogRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yCisKKyAgRGVzY3JpcHRpb246IENhbGxzIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKCkgZm9yIGVhY2ggY2hhbm5lbAorKi8KKwordm9pZAorRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuQ2hhbm5lbHMpCit7CisgIElOVCBqOworICBmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgeworICAgIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKHFjT3V0Q2hhbm5lbFtqXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwgcHN5T3V0Q2hhbm5lbFtqXSk7CisgIH0KK30KKworLyoKKyAgRnVuY3Rpb246IEZES2FhY0VuY19jYWxjU2ZiUmVsZXZhbnRMaW5lcworCisgIERlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIHNmYk5SZWxldmFudExpbmVzCisKKyAgc2ZiTlJlbGV2YW50TGluZXMgaXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAxLygoMl5GT1JNX0ZBQ19TSElGVCkgKiAyLjApCisqLworc3RhdGljIHZvaWQKK0ZES2FhY0VuY19jYWxjU2ZiUmVsZXZhbnRMaW5lcyggY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3Qgc2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzKQoreworICBJTlQgc2ZiT2Zmcywgc2ZiOworICBGSVhQX0RCTCBzZmJXaWR0aExkRGF0YTsKKyAgRklYUF9EQkwgYXNQZUZhY0xkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1KTsgICAvKiBBU19QRV9GQUNfU0hJRlQqbGQ2NCgyKSAqLworICBGSVhQX0RCTCBhY2N1OworCisgIC8qIHNmYk5SZWxldmFudExpbmVzW2ldID0gMl4oIChzZmJGb3JtRmFjdG9yTGREYXRhW2ldIC0gMC4yNSAqIChzZmJFbmVyZ3lMZERhdGFbaV0gLSBsZDY0KHNmYldpZHRoW2ldLygyXjcpKSAtIEFTX1BFX0ZBQ19TSElGVCpsZDY0KDIpKSAqIDY0KTsgKi8KKworICBGREttZW1jbGVhcihzZmJOUmVsZXZhbnRMaW5lcywgc2ZiQ250ICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8c2ZiQ250OyBzZmJPZmZzKz1zZmJQZXJHcm91cCkgeworICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgLyogY2FsYyBzdW0gb2Ygc3FydChzcGVjKSAqLworICAgICAgaWYoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0gPiAoRklYUF9EQkwpc2ZiVGhyZXNob2xkTGREYXRhW3NmYk9mZnMrc2ZiXSkgeworICAgICAgICBJTlQgc2ZiV2lkdGggPSBzZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdIC0gc2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl07CisKKyAgICAgICAgLyogYXZnRm9ybUZhY3RvckxkRGF0YSA9IHNxcnRGaXhwKHNxcnRGaXhwKHNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0vc2ZiV2lkdGgpKTsgKi8KKyAgICAgICAgLyogc2ZiTlJlbGV2YW50TGluZXNbc2ZiT2ZmcytzZmJdID0gc2ZiRm9ybUZhY3RvcltzZmJPZmZzK3NmYl0gLyBhdmdGb3JtRmFjdG9yTGREYXRhOyAqLworICAgICAgICBzZmJXaWR0aExkRGF0YSA9IChGSVhQX0RCTCkoc2ZiV2lkdGggPDwgKERGUkFDVF9CSVRTLTEtQVNfUEVfRkFDX1NISUZUKSk7CisgICAgICAgIHNmYldpZHRoTGREYXRhID0gQ2FsY0xkRGF0YShzZmJXaWR0aExkRGF0YSk7CisKKyAgICAgICAgYWNjdSA9IHNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0gLSBzZmJXaWR0aExkRGF0YSAtIGFzUGVGYWNMZERhdGE7CisgICAgICAgIGFjY3UgPSBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYk9mZnMrc2ZiXSAtIChhY2N1ID4+IDIpOworCisgICAgICAgIHNmYk5SZWxldmFudExpbmVzW3NmYk9mZnMrc2ZiXSA9IENhbGNJbnZMZERhdGEoYWNjdSkgPj4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoKKyAgRnVuY3Rpb246IEZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMKKworICBEZXNjcmlwdGlvbjoKKworICBzY2ZCaXRzRnJhY3QgaXMgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDX1NISUZUKSkKKyovCitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2luZ2xlU2NmQml0cyhJTlQgc2NmLCBJTlQgc2NmTGVmdCwgSU5UIHNjZlJpZ2h0KQoreworICBGSVhQX0RCTCBzY2ZCaXRzRnJhY3Q7CisKKyAgc2NmQml0c0ZyYWN0ID0gKEZJWFBfREJMKSAoICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZkxlZnQtc2NmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmLXNjZlJpZ2h0KSApOworCisgIHNjZkJpdHNGcmFjdCA9IHNjZkJpdHNGcmFjdCA8PCAoREZSQUNUX0JJVFMtMS0oMipBU19QRV9GQUNfU0hJRlQpKTsKKworICByZXR1cm4gc2NmQml0c0ZyYWN0OyAvKiBvdXRwdXQgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDKSkgKi8KK30KKworLyoKKyAgRnVuY3Rpb246IEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlCisKKyAgc3BlY1BlIGlzIHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpCisqLworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKElOVCBzY2YsIEZJWFBfREJMIHNmYkNvbnN0UGVQYXJ0LCBGSVhQX0RCTCBuTGluZXMpCit7CisgIEZJWFBfREJMIHNwZWNQZSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBGSVhQX0RCTCBsZFJhdGlvOworICBGSVhQX0RCTCBzY2ZGcmFjdDsKKworICBzY2ZGcmFjdCA9IChGSVhQX0RCTCkoc2NmIDw8IChERlJBQ1RfQklUUy0xLUFTX1BFX0ZBQ19TSElGVCkpOworCisgIGxkUmF0aW8gPSBzZmJDb25zdFBlUGFydCAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1Ziksc2NmRnJhY3QpOworCisgIGlmIChsZFJhdGlvID49IFBFX0MxKSB7CisgICAgc3BlY1BlID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksZk11bHQobkxpbmVzLGxkUmF0aW8pKTsKKyAgfQorICBlbHNlIHsKKyAgICBzcGVjUGUgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSxmTXVsdChuTGluZXMsKFBFX0MyICsgZk11bHQoUEVfQzMsbGRSYXRpbykpKSk7CisgIH0KKworICByZXR1cm4gc3BlY1BlOyAvKiBvdXRwdXQgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDKSkgKi8KK30KKworLyoKKyAgRnVuY3Rpb246IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmCisKKyAgc2NmQml0c0RpZmYgaXMgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDX1NISUZUKSkKKyovCitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoSU5UICpzY2ZPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjZk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcFNmYikKK3sKKyAgRklYUF9EQkwgc2NmQml0c0ZyYWN0OworICBJTlQgc2NmQml0c0RpZmYgPSAwOworICBJTlQgc2ZiID0gMCwgc2ZiTGFzdDsKKyAgSU5UIHNmYlByZXYsIHNmYk5leHQ7CisKKyAgLyogc2VhcmNoIGZvciBmaXJzdCByZWxldmFudCBzZmIgKi8KKyAgc2ZiTGFzdCA9IHN0YXJ0U2ZiOworICB3aGlsZSAoKHNmYkxhc3Q8c3RvcFNmYikgJiYgKHNjZk9sZFtzZmJMYXN0XT09RkRLX0lOVF9NSU4pKQorICAgIHNmYkxhc3QrKzsKKyAgLyogc2VhcmNoIGZvciBwcmV2aW91cyByZWxldmFudCBzZmIgYW5kIGNvdW50IGRpZmYgKi8KKyAgc2ZiUHJldiA9IHN0YXJ0U2ZiIC0gMTsKKyAgd2hpbGUgKChzZmJQcmV2Pj0wKSAmJiAoc2NmT2xkW3NmYlByZXZdPT1GREtfSU5UX01JTikpCisgICAgc2ZiUHJldi0tOworICBpZiAoc2ZiUHJldj49MCkKKyAgICBzY2ZCaXRzRGlmZiArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XS1zY2ZOZXdbc2ZiTGFzdF0pIC0KKyAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XS1zY2ZPbGRbc2ZiTGFzdF0pOworICAvKiBub3cgbG9vcCB0aHJvdWdoIGFsbCBzZmJzIGFuZCBjb3VudCBkaWZmcyBvZiByZWxldmFudCBzZmJzICovCisgIGZvciAoc2ZiPXNmYkxhc3QrMTsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgaWYgKHNjZk9sZFtzZmJdIT1GREtfSU5UX01JTikgeworICAgICAgc2NmQml0c0RpZmYgKz0gRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZOZXdbc2ZiTGFzdF0tc2NmTmV3W3NmYl0pIC0KKyAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdLXNjZk9sZFtzZmJdKTsKKyAgICAgIHNmYkxhc3QgPSBzZmI7CisgICAgfQorICB9CisgIC8qIHNlYXJjaCBmb3IgbmV4dCByZWxldmFudCBzZmIgYW5kIGNvdW50IGRpZmYgKi8KKyAgc2ZiTmV4dCA9IHN0b3BTZmI7CisgIHdoaWxlICgoc2ZiTmV4dDxzZmJDbnQpICYmIChzY2ZPbGRbc2ZiTmV4dF09PUZES19JTlRfTUlOKSkKKyAgICBzZmJOZXh0Kys7CisgIGlmIChzZmJOZXh0PHNmYkNudCkKKyAgICBzY2ZCaXRzRGlmZiArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XS1zY2ZOZXdbc2ZiTmV4dF0pIC0KKyAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XS1zY2ZPbGRbc2ZiTmV4dF0pOworCisgIHNjZkJpdHNGcmFjdCA9IChGSVhQX0RCTCkgKHNjZkJpdHNEaWZmIDw8IChERlJBQ1RfQklUUy0xLSgyKkFTX1BFX0ZBQ19TSElGVCkpKTsKKworICByZXR1cm4gc2NmQml0c0ZyYWN0OworfQorCisvKgorICBGdW5jdGlvbjogRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmCisKKyAgc3BlY1BlRGlmZiBpcyBzY2FsZWQgYnkgMS8oMl4oMipBU19QRV9GQUNfU0hJRlQpKQorKi8KK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmTmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0U2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wU2ZiKQoreworICBGSVhQX0RCTCBzcGVjUGVEaWZmID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIEZJWFBfREJMIHNjZkZyYWN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIElOVCBzZmI7CisKKyAgLyogbG9vcCB0aHJvdWdoIGFsbCBzZmJzIGFuZCBjb3VudCBwZSBkaWZmZXJlbmNlICovCisgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICBpZiAoc2NmT2xkW3NmYl0hPUZES19JTlRfTUlOKSB7CisgICAgICBGSVhQX0RCTCBsZFJhdGlvT2xkLCBsZFJhdGlvTmV3LCBwT2xkLCBwTmV3OworCisgICAgICAvKiBzZmJDb25zdFBlUGFydFtzZmJdID0gKGZsb2F0KWxvZyhwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSAqIDYuNzVmIC8gc2ZiRm9ybUZhY3RvcltzZmJdKSAqIExPRzJfMTsgKi8KKyAgICAgIC8qIDAuMDIxNTIyNTU4NjFmID0gbG9nKDYuNzUpL2xvZygyKS9BU19QRV9GQUNfRkxPQVQ7IExPRzJfMSBpcyAxLjAgZm9yIGxvZzIgKi8KKyAgICAgIC8qIDAuMDkzNzVmID0gbG9nKDY0LjApL2xvZygyLjApLzY0LjAgPSBzY2FsZSBvZiBzZmJGb3JtRmFjdG9yTGREYXRhICovCisgICAgICBpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9PSAoRklYUF9EQkwpRkRLX0lOVF9NSU4pCisgICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYl0gPSAoKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJdIC0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJdIC0gRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKSA+PiAxKSArIEZMMkZYQ09OU1RfREJMKDAuMDIxNTIyNTU4NjFmKTsKKworICAgICAgc2NmRnJhY3QgPSAoRklYUF9EQkwpIChzY2ZPbGRbc2ZiXSA8PCAoREZSQUNUX0JJVFMtMS1BU19QRV9GQUNfU0hJRlQpKTsKKyAgICAgIGxkUmF0aW9PbGQgPSBzZmJDb25zdFBlUGFydFtzZmJdIC0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNzVmKSxzY2ZGcmFjdCk7CisKKyAgICAgIHNjZkZyYWN0ID0gKEZJWFBfREJMKSAoc2NmTmV3W3NmYl0gPDwgKERGUkFDVF9CSVRTLTEtQVNfUEVfRkFDX1NISUZUKSk7CisgICAgICBsZFJhdGlvTmV3ID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1Ziksc2NmRnJhY3QpOworCisgICAgICBpZiAobGRSYXRpb09sZCA+PSBQRV9DMSkKKyAgICAgICAgcE9sZCA9IGxkUmF0aW9PbGQ7CisgICAgICBlbHNlCisgICAgICAgIHBPbGQgPSBQRV9DMiArIGZNdWx0KFBFX0MzLGxkUmF0aW9PbGQpOworCisgICAgICBpZiAobGRSYXRpb05ldyA+PSBQRV9DMSkKKyAgICAgICAgcE5ldyA9IGxkUmF0aW9OZXc7CisgICAgICBlbHNlCisgICAgICAgIHBOZXcgPSBQRV9DMiArIGZNdWx0KFBFX0MzLGxkUmF0aW9OZXcpOworCisgICAgICBzcGVjUGVEaWZmICs9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLGZNdWx0KHNmYk5SZWxldmFudExpbmVzW3NmYl0sKHBOZXcgLSBwT2xkKSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzcGVjUGVEaWZmOworfQorCisvKgorICBGdW5jdGlvbjogRkRLYWFjRW5jX2ltcHJvdmVTY2YKKworICBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHRoZSBkaXN0b3J0aW9uIGJ5IHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gb2YgdGhlIHNwZWN0cnVtIHdpdGgKKyAgICAgICAgICAgICAgIHZhcmlvdXMgc2NhbGVmYWN0b3JzLiBUaGUgc2NhbGVmYWN0b3Igd2hpY2ggcHJvdmlkZXMgdGhlIGJlc3QgcmVzdWx0cyB3aWxsIGJlIHVzZWQuCisqLworc3RhdGljIElOVCBGREthYWNFbmNfaW1wcm92ZVNjZihGSVhQX0RCTCAqc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0aHJlc2hMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgbWluU2NmLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZGlzdExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICApCit7CisgICBGSVhQX0RCTCBzZmJEaXN0TGREYXRhOworICAgSU5UIHNjZkJlc3QgPSBzY2Y7CisgICBJTlQgazsKKyAgIEZJWFBfREJMIGRpc3RGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY1KTsgICAvKiBsZDY0KDEvMS4yNSkgKi8KKworICAgLyogY2FsYyByZWFsIGRpc3RvcnRpb24gKi8KKyAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmKTsKKyAgICptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOworICAgLyogbm1yID4gMS4yNSAtPiB0cnkgdG8gaW1wcm92ZSBubXIgKi8KKyAgIGlmIChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YS1kaXN0RmFjdG9yTGREYXRhKSkgeworICAgICAgSU5UIHNjZkVzdGltYXRlZCA9IHNjZjsKKyAgICAgIEZJWFBfREJMIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKKyAgICAgIElOVCBjbnQ7CisgICAgICAvKiBpbXByb3ZlIGJ5IGJpZ2dlciBzY2YgPyAqLworICAgICAgY250ID0gMDsKKworICAgICAgd2hpbGUgKChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YS1kaXN0RmFjdG9yTGREYXRhKSkgJiYgKGNudCsrIDwgMykpIHsKKyAgICAgICAgIHNjZisrOworICAgICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YpOworCisgICAgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7CisgICAgICAgICAgICBzY2ZCZXN0ID0gc2NmOworICAgICAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKKwkgICAgICAgICAgICAgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOworICAgICAgICAgfQorICAgICAgfQorICAgICAgLyogaW1wcm92ZSBieSBzbWFsbGVyIHNjZiA/ICovCisgICAgICBjbnQgPSAwOworICAgICAgc2NmID0gc2NmRXN0aW1hdGVkOworICAgICAgc2ZiRGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOworICAgICAgd2hpbGUgKChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YS1kaXN0RmFjdG9yTGREYXRhKSkgJiYgKGNudCsrIDwgMSkgJiYgKHNjZiA+IG1pblNjZikpIHsKKyAgICAgICAgIHNjZi0tOworICAgICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YpOworCisgICAgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7CisgICAgICAgICAgICBzY2ZCZXN0ID0gc2NmOworICAgICAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKKwkgICAgICAgICAgICAgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOworICAgICAgICAgfQorICAgICAgICAgKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7CisgICAgICB9CisgICAgICAqZGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOworICAgfQorICAgZWxzZSB7IC8qIG5tciA8PSAxLjI1IC0+IHRyeSB0byBmaW5kIGJpZ2dlciBzY2YgdG8gdXNlIGxlc3MgYml0cyAqLworICAgICAgRklYUF9EQkwgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgRklYUF9EQkwgc2ZiRGlzdEFsbG93ZWRMZERhdGEgPSBmaXhNaW4oc2ZiRGlzdExkRGF0YS1kaXN0RmFjdG9yTGREYXRhLHRocmVzaExkRGF0YSk7CisgICAgICBpbnQgY250OworICAgICAgZm9yIChjbnQ9MDsgY250PDM7IGNudCsrKSB7CisgICAgICAgICBzY2YrKzsKKyAgICAgICAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmKTsKKworICAgICAgICAgaWYgKHNmYkRpc3RMZERhdGEgPCBzZmJEaXN0QWxsb3dlZExkRGF0YSkgeworICAgICAgICAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZkJlc3QrMTsKKyAgICAgICAgICAgc2NmQmVzdCA9IHNjZjsKKyAgICAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQorICAgICAgICAgICAgIHF1YW50U3BlY1trXSA9IHF1YW50U3BlY1RtcFtrXTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpkaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7CisgICB9CisKKyAgIC8qIHJldHVybiBiZXN0IHNjYWxlZmFjdG9yICovCisgICByZXR1cm4gc2NmQmVzdDsKK30KKworLyoKKyAgRnVuY3Rpb246IEZES2FhY0VuY19hc3NpbWlsYXRlU2luZ2xlU2NmCisKKyovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCByZXN0YXJ0T25TdWNjZXNzKQoreworICBJTlQgc2ZiTGFzdCwgc2ZiQWN0LCBzZmJOZXh0OworICBJTlQgc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQsIHNjZk1pbiwgc2NmTWF4OworICBJTlQgc2ZiV2lkdGgsIHNmYk9mZnM7CisgIEZJWFBfREJMIGVuTGREYXRhOworICBGSVhQX0RCTCBzZmJQZU9sZCwgc2ZiUGVOZXc7CisgIEZJWFBfREJMIHNmYkRpc3ROZXc7CisgIElOVCBpLCBrOworICBJTlQgc3VjY2VzcyA9IDA7CisgIEZJWFBfREJMIGRlbHRhUGUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgRklYUF9EQkwgZGVsdGFQZU5ldywgZGVsdGFQZVRtcDsKKyAgSU5UIHByZXZTY2ZMYXN0W01BWF9HUk9VUEVEX1NGQl0sIHByZXZTY2ZOZXh0W01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIGRlbHRhUGVMYXN0W01BWF9HUk9VUEVEX1NGQl07CisgIElOVCB1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkOworCisgIGZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisgICAgcHJldlNjZkxhc3RbaV0gPSBGREtfSU5UX01BWDsKKyAgICBwcmV2U2NmTmV4dFtpXSA9IEZES19JTlRfTUFYOworICAgIGRlbHRhUGVMYXN0W2ldID0gKEZJWFBfREJMKUZES19JTlRfTUFYOworICB9CisKKyAgc2ZiTGFzdCA9IC0xOworICBzZmJBY3QgID0gLTE7CisgIHNmYk5leHQgPSAtMTsKKyAgc2NmTGFzdCA9IDA7CisgIHNjZk5leHQgPSAwOworICBzY2ZNaW4gID0gRkRLX0lOVF9NQVg7CisgIHNjZk1heCAgPSBGREtfSU5UX01BWDsKKyAgZG8geworICAgIC8qIHNlYXJjaCBmb3IgbmV3IHJlbGV2YW50IHNmYiAqLworICAgIHNmYk5leHQrKzsKKyAgICB3aGlsZSAoKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpICYmIChzY2Zbc2ZiTmV4dF0gPT0gRkRLX0lOVF9NSU4pKQorICAgICAgc2ZiTmV4dCsrOworICAgIGlmICgoc2ZiTGFzdD49MCkgJiYgKHNmYkFjdD49MCkgJiYgKHNmYk5leHQ8cHN5T3V0Q2hhbi0+c2ZiQ250KSkgeworICAgICAgLyogcmVsZXZhbnQgc2NmcyB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0ICovCisgICAgICBzY2ZBY3QgID0gc2NmW3NmYkFjdF07CisgICAgICBzY2ZMYXN0ID0gc2NmICsgc2ZiTGFzdDsKKyAgICAgIHNjZk5leHQgPSBzY2YgKyBzZmJOZXh0OworICAgICAgc2NmTWluICA9IGZpeE1pbigqc2NmTGFzdCwgKnNjZk5leHQpOworICAgICAgc2NmTWF4ICA9IGZpeE1heCgqc2NmTGFzdCwgKnNjZk5leHQpOworICAgIH0KKyAgICBlbHNlIGlmICgoc2ZiTGFzdD09LTEpICYmIChzZmJBY3Q+PTApICYmIChzZmJOZXh0PHBzeU91dENoYW4tPnNmYkNudCkpIHsKKyAgICAgIC8qIGZpcnN0IHJlbGV2YW50IHNjZiAqLworICAgICAgc2NmQWN0ICA9IHNjZltzZmJBY3RdOworICAgICAgc2NmTGFzdCA9ICZzY2ZBY3Q7CisgICAgICBzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKKyAgICAgIHNjZk1pbiAgPSAqc2NmTmV4dDsKKyAgICAgIHNjZk1heCAgPSAqc2NmTmV4dDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIChzZmJOZXh0PT1wc3lPdXRDaGFuLT5zZmJDbnQpKSB7CisgICAgICAvKiBsYXN0IHJlbGV2YW50IHNjZiAqLworICAgICAgc2NmQWN0ICA9IHNjZltzZmJBY3RdOworICAgICAgc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7CisgICAgICBzY2ZOZXh0ID0gJnNjZkFjdDsKKyAgICAgIHNjZk1pbiAgPSAqc2NmTGFzdDsKKyAgICAgIHNjZk1heCAgPSAqc2NmTGFzdDsKKyAgICB9CisgICAgaWYgKHNmYkFjdD49MCkKKyAgICAgIHNjZk1pbiA9IGZpeE1heChzY2ZNaW4sIG1pblNjZltzZmJBY3RdKTsKKworICAgIGlmICgoc2ZiQWN0ID49IDApICYmCisgICAgICAgIChzZmJMYXN0Pj0wIHx8IHNmYk5leHQ8cHN5T3V0Q2hhbi0+c2ZiQ250KSAmJgorICAgICAgICAoc2NmQWN0ID4gc2NmTWluKSAmJgorICAgICAgICAoc2NmQWN0IDw9IHNjZk1pbitNQVhfU0NGX0RFTFRBKSAmJgorICAgICAgICAoc2NmQWN0ID49IHNjZk1heC1NQVhfU0NGX0RFTFRBKSAmJgorICAgICAgICAoKnNjZkxhc3QgIT0gcHJldlNjZkxhc3Rbc2ZiQWN0XSB8fAorICAgICAgICAgKnNjZk5leHQgIT0gcHJldlNjZk5leHRbc2ZiQWN0XSB8fAorICAgICAgICAgZGVsdGFQZSA8IGRlbHRhUGVMYXN0W3NmYkFjdF0pKSB7CisgICAgICAvKiBiaWdnZXIgdGhhbiBuZWlnaGJvdXJpbmcgc2NmIGZvdW5kLCB0cnkgdG8gdXNlIHNtYWxsZXIgc2NmICovCisgICAgICBzdWNjZXNzID0gMDsKKworICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCsxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XTsKKyAgICAgIHNmYk9mZnMgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdF07CisKKyAgICAgIC8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIGFjdHVhbCBzY2YgKi8KKyAgICAgIGVuTGREYXRhID0gcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiQWN0XTsKKworICAgICAgLyogc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IChmbG9hdClsb2coNi43NWYqZW4vc2ZiRm9ybUZhY3RvcltzZmJBY3RdKSAqIExPRzJfMTsgKi8KKyAgICAgIC8qIDAuMDIxNTIyNTU4NjFmID0gbG9nKDYuNzUpL2xvZygyKS9BU19QRV9GQUNfRkxPQVQ7IExPRzJfMSBpcyAxLjAgZm9yIGxvZzIgKi8KKyAgICAgIC8qIDAuMDkzNzVmID0gbG9nKDY0LjApL2xvZygyLjApLzY0LjAgPSBzY2FsZSBvZiBzZmJGb3JtRmFjdG9yTGREYXRhICovCisgICAgICBpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9PSAoRklYUF9EQkwpRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9ICgoZW5MZERhdGEgLSBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkFjdF0gLSBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikpID4+IDEpICsgRkwyRlhDT05TVF9EQkwoMC4wMjE1MjI1NTg2MWYpOworICAgICAgfQorCisgICAgICBzZmJQZU9sZCA9IEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCxzZmJDb25zdFBlUGFydFtzZmJBY3RdLHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pCisgICAgICAgICAgICAgICAgK0ZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOworCisgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZTsKKyAgICAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAxOworCisgICAgICBkbyB7CisgICAgICAgIC8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIHNtYWxsZXIgc2NmICovCisgICAgICAgIHNjZkFjdC0tOworICAgICAgICAvKiBjaGVjayBvbmx5IGlmIHRoZSBzYW1lIGNoZWNrIHdhcyBub3QgZG9uZSBiZWZvcmUgKi8KKyAgICAgICAgaWYgKHNjZkFjdCA8IG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSAmJiBzY2ZBY3Q+PXNjZk1heC1NQVhfU0NGX0RFTFRBKXsKKyAgICAgICAgICAvKiBlc3RpbWF0ZSByZXF1aXJlZCBiaXRzIGZvciBuZXcgc2NmICovCisgICAgICAgICAgc2ZiUGVOZXcgPSAgRkRLYWFjRW5jX2NhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sc2ZiTlJlbGV2YW50TGluZXNbc2ZiQWN0XSkKKyAgICAgICAgICAgICAgICAgICAgICtGREthYWNFbmNfY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwqc2NmTGFzdCwgKnNjZk5leHQpOworCisgICAgICAgICAgLyogdXNlIG5ldyBzY2YgaWYgbm8gaW5jcmVhc2UgaW4gcGUgYW5kCisgICAgICAgICAgICAgcXVhbnRpemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgKi8KKyAgICAgICAgICBkZWx0YVBlVG1wID0gZGVsdGFQZSArIHNmYlBlTmV3IC0gc2ZiUGVPbGQ7CisgICAgICAgICAgLyogMC4wMDA2MTAzNTE1NjI1ZiA9IDEwLjBmLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpICovCisgICAgICAgICAgaWYgKGRlbHRhUGVUbXAgPCBGTDJGWENPTlNUX0RCTCgwLjAwMDYxMDM1MTU2MjVmKSkgeworICAgICAgICAgICAgLyogZGlzdG9ydGlvbiBvZiBuZXcgc2NmICovCisgICAgICAgICAgICBzZmJEaXN0TmV3ID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtzZmJPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0KTsKKworICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXcgPCBzZmJEaXN0W3NmYkFjdF0pIHsKKyAgICAgICAgICAgICAgLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLworICAgICAgICAgICAgICBzY2Zbc2ZiQWN0XSA9IHNjZkFjdDsKKyAgICAgICAgICAgICAgc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsKKworICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQorICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzK2tdID0gcXVhbnRTcGVjVG1wW3NmYk9mZnMra107CisKKyAgICAgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGVUbXA7CisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbWFyayBhcyBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICAgICAgICAgIGlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKQorICAgICAgICAgICAgICBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0gPSBzY2ZBY3Q7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogZnJvbSB0aGlzIHNjZiB2YWx1ZSBvbiBub3QgYWxsIG5ldyB2YWx1ZXMgaGF2ZSBiZWVuIGNoZWNrZWQgKi8KKyAgICAgICAgICAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc2NmQWN0ID4gc2NmTWluKTsKKworICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7CisKKyAgICAgIC8qIHNhdmUgcGFyYW1ldGVycyB0byBhdm9pZCBtdWx0aXBsZSBjb21wdXRhdGlvbnMgb2YgdGhlIHNhbWUgc2ZiICovCisgICAgICBwcmV2U2NmTGFzdFtzZmJBY3RdID0gKnNjZkxhc3Q7CisgICAgICBwcmV2U2NmTmV4dFtzZmJBY3RdID0gKnNjZk5leHQ7CisgICAgICBkZWx0YVBlTGFzdFtzZmJBY3RdID0gZGVsdGFQZTsKKyAgICB9CisKKyAgICBpZiAoc3VjY2VzcyAmJiByZXN0YXJ0T25TdWNjZXNzKSB7CisgICAgICAvKiBzdGFydCBhZ2FpbiBhdCBmaXJzdCBzZmIgKi8KKyAgICAgIHNmYkxhc3QgPSAtMTsKKyAgICAgIHNmYkFjdCAgPSAtMTsKKyAgICAgIHNmYk5leHQgPSAtMTsKKyAgICAgIHNjZkxhc3QgPSAwOworICAgICAgc2NmTmV4dCA9IDA7CisgICAgICBzY2ZNaW4gID0gRkRLX0lOVF9NQVg7CisgICAgICBzY2ZNYXggID0gRkRLX0lOVF9NQVg7CisgICAgICBzdWNjZXNzID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBzaGlmdCBzZmJzIGZvciBuZXh0IGJhbmQgKi8KKyAgICAgIHNmYkxhc3QgPSBzZmJBY3Q7CisgICAgICBzZmJBY3QgID0gc2ZiTmV4dDsKKyAgICB9CisgIH0gd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpOworfQorCisvKgorICBGdW5jdGlvbjogRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZgorCisqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpCit7CisgIElOVCBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiOworICBJTlQgc2NmVG1wW01BWF9HUk9VUEVEX1NGQl0sIHNjZk1pbiwgc2NmTWF4LCBzY2ZBY3Q7CisgIElOVCBwb3NzaWJsZVJlZ2lvbkZvdW5kOworICBJTlQgc2ZiV2lkdGgsIHNmYk9mZnMsIGksIGs7CisgIEZJWFBfREJMIHNmYkRpc3ROZXdbTUFYX0dST1VQRURfU0ZCXSwgZGlzdE9sZFN1bSwgZGlzdE5ld1N1bTsKKyAgSU5UIGRlbHRhU2NmQml0czsKKyAgRklYUF9EQkwgZGVsdGFTcGVjUGU7CisgIEZJWFBfREJMIGRlbHRhUGUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgRklYUF9EQkwgZGVsdGFQZU5ldzsKKyAgSU5UIHNmYkNudCA9IHBzeU91dENoYW4tPnNmYkNudDsKKworICAvKiBjYWxjIG1pbiBhbmQgbWF4IHNjYWxmYWN0b3JzICovCisgIHNjZk1pbiA9IEZES19JTlRfTUFYOworICBzY2ZNYXggPSBGREtfSU5UX01JTjsKKyAgZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKKyAgICBpZiAoc2NmW3NmYl0hPUZES19JTlRfTUlOKSB7CisgICAgICBzY2ZNaW4gPSBmaXhNaW4oc2NmTWluLCBzY2Zbc2ZiXSk7CisgICAgICBzY2ZNYXggPSBmaXhNYXgoc2NmTWF4LCBzY2Zbc2ZiXSk7CisgICAgfQorICB9CisKKyAgaWYgKHNjZk1heCAhPSBGREtfSU5UX01JTiAmJiBzY2ZNYXggPD0gc2NmTWluK01BWF9TQ0ZfREVMVEEpIHsKKworICAgIHNjZkFjdCA9IHNjZk1heDsKKworICAgIGRvIHsKKyAgICAgIC8qIHRyeSBzbWFsbGVyIHNjZiAqLworICAgICAgc2NmQWN0LS07CisgICAgICBmb3IgKGk9MDsgaTxNQVhfR1JPVVBFRF9TRkI7IGkrKykKKyAgICAgICAgc2NmVG1wW2ldID0gc2NmW2ldOworICAgICAgc3RvcFNmYiA9IDA7CisgICAgICBkbyB7CisgICAgICAgIC8qIHNlYXJjaCBmb3IgcmVnaW9uIHdoZXJlIGFsbCBzY2ZzIGFyZSBiaWdnZXIgdGhhbiBzY2ZBY3QgKi8KKyAgICAgICAgc2ZiID0gc3RvcFNmYjsKKyAgICAgICAgd2hpbGUgKHNmYjxzZmJDbnQgJiYgKHNjZltzZmJdPT1GREtfSU5UX01JTiB8fCBzY2Zbc2ZiXSA8PSBzY2ZBY3QpKQorICAgICAgICAgIHNmYisrOworICAgICAgICBzdGFydFNmYiA9IHNmYjsKKyAgICAgICAgc2ZiKys7CisgICAgICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmIChzY2Zbc2ZiXT09RkRLX0lOVF9NSU4gfHwgc2NmW3NmYl0gPiBzY2ZBY3QpKQorICAgICAgICAgIHNmYisrOworICAgICAgICBzdG9wU2ZiID0gc2ZiOworCisgICAgICAgIC8qIGNoZWNrIGlmIGluIGFsbCBzZmIgb2YgYSB2YWxpZCByZWdpb24gc2NmQWN0ID49IG1pblNjZltzZmJdICovCisgICAgICAgIHBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOworICAgICAgICBpZiAoc3RhcnRTZmIgPCBzZmJDbnQpIHsKKyAgICAgICAgICBwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMTsKKyAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pCisgICAgICAgICAgICAgIGlmIChzY2ZBY3QgPCBtaW5TY2Zbc2ZiXSkgeworICAgICAgICAgICAgICAgIHBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvc3NpYmxlUmVnaW9uRm91bmQpIHsgLyogcmVnaW9uIGZvdW5kICovCisKKyAgICAgICAgICAvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLworICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikKKyAgICAgICAgICAgICAgc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCisgICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7CisKKyAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZihwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOworCisgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyAoRklYUF9EQkwpZGVsdGFTY2ZCaXRzICsgZGVsdGFTcGVjUGU7CisKKyAgICAgICAgICAvKiBuZXcgYml0IGRlbWFuZCBzbWFsbCBlbm91Z2ggPyAqLworICAgICAgICAgIC8qIDAuMDAwNjEwMzUxNTYyNWYgPSAxMC4wZi8oMl4oMipBU19QRV9GQUNfU0hJRlQpKSAqLworICAgICAgICAgIGlmIChkZWx0YVBlTmV3IDwgRkwyRlhDT05TVF9EQkwoMC4wMDA2MTAzNTE1NjI1ZikpIHsKKworICAgICAgICAgICAgLyogcXVhbnRpemUgYW5kIGNhbGMgc3VtIG9mIG5ldyBkaXN0b3J0aW9uICovCisgICAgICAgICAgICBkaXN0T2xkU3VtID0gZGlzdE5ld1N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICAgICAgICBkaXN0T2xkU3VtICs9IENhbGNJbnZMZERhdGEoc2ZiRGlzdFtzZmJdKSA+PiBESVNUX0ZBQ19TSElGVDsKKworICAgICAgICAgICAgICAgIHNmYldpZHRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIrMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl07CisgICAgICAgICAgICAgICAgc2ZiT2ZmcyA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKKworICAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtzZmJPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZkFjdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ld1tzZmJdID5xY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKSB7CisgICAgICAgICAgICAgICAgICAvKiBubyBpbXByb3ZlbWVudCwgc2tpcCBmdXJ0aGVyIGRpc3QuIGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgICAgICAgZGlzdE5ld1N1bSA9IGRpc3RPbGRTdW0gPDwgMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXN0TmV3U3VtICs9IENhbGNJbnZMZERhdGEoc2ZiRGlzdE5ld1tzZmJdKSA+PiBESVNUX0ZBQ19TSElGVDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGlzdG9ydGlvbiBzbWFsbGVyID8gLT4gdXNlIG5ldyBzY2FsZWZhY3RvcnMgKi8KKyAgICAgICAgICAgIGlmIChkaXN0TmV3U3VtIDwgZGlzdE9sZFN1bSkgeworICAgICAgICAgICAgICBkZWx0YVBlID0gZGVsdGFQZU5ldzsKKyAgICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgeworICAgICAgICAgICAgICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYisxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKKyAgICAgICAgICAgICAgICAgIHNmYk9mZnMgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl07CisgICAgICAgICAgICAgICAgICBzY2Zbc2ZiXSA9IHNjZkFjdDsKKyAgICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKKworICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnMra10gPSBxdWFudFNwZWNUbXBbc2ZiT2ZmcytrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB9IHdoaWxlIChzdG9wU2ZiIDw9IHNmYkNudCk7CisKKyAgICB9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOworICB9Cit9CisKKy8qCisgIEZ1bmN0aW9uOiBGREthYWNFbmNfRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZjIKKworKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmMihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptaW5TY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpCit7CisgIElOVCBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiOworICBJTlQgc2NmVG1wW01BWF9HUk9VUEVEX1NGQl0sIHNjZkFjdCwgc2NmTmV3OworICBJTlQgc2NmUHJldiwgc2NmTmV4dCwgc2NmUHJldk5leHRNaW4sIHNjZlByZXZOZXh0TWF4LCBzY2ZMbywgc2NmSGk7CisgIElOVCBzY2ZNaW4sIHNjZk1heDsKKyAgSU5UICpzZmJPZmZzID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0czsKKyAgRklYUF9EQkwgc2ZiRGlzdE5ld1tNQVhfR1JPVVBFRF9TRkJdLCBzZmJEaXN0TWF4W01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIGRpc3RPbGRTdW0sIGRpc3ROZXdTdW07CisgIElOVCBkZWx0YVNjZkJpdHM7CisgIEZJWFBfREJMIGRlbHRhU3BlY1BlOworICBGSVhQX0RCTCBkZWx0YVBlID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIEZJWFBfREJMIGRlbHRhUGVOZXcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgSU5UIHNmYkNudCA9IHBzeU91dENoYW4tPnNmYkNudDsKKyAgSU5UIGJTdWNjZXNzLCBiQ2hlY2tTY2Y7CisgIElOVCBpLGs7CisKKyAgLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLworICBzY2ZNaW4gPSBGREtfSU5UX01BWDsKKyAgc2NmTWF4ID0gRkRLX0lOVF9NSU47CisgIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHNjZltzZmJdIT1GREtfSU5UX01JTikgeworICAgICAgc2NmTWluID0gZml4TWluKHNjZk1pbiwgc2NmW3NmYl0pOworICAgICAgc2NmTWF4ID0gZml4TWF4KHNjZk1heCwgc2NmW3NmYl0pOworICAgIH0KKyAgfQorCisgIHN0b3BTZmIgPSAwOworICBzY2ZBY3QgPSBGREtfSU5UX01JTjsKKyAgZG8geworICAgIC8qIHNlYXJjaCBmb3IgcmVnaW9uIHdpdGggc2FtZSBzY2YgdmFsdWVzIHNjZkFjdCAqLworICAgIHNjZlByZXYgPSBzY2ZBY3Q7CisKKyAgICBzZmIgPSBzdG9wU2ZiOworICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmIChzY2Zbc2ZiXT09RkRLX0lOVF9NSU4pKQorICAgICAgc2ZiKys7CisgICAgc3RhcnRTZmIgPSBzZmI7CisgICAgc2NmQWN0ID0gc2NmW3N0YXJ0U2ZiXTsKKyAgICBzZmIrKzsKKyAgICB3aGlsZSAoc2ZiPHNmYkNudCAmJiAoKHNjZltzZmJdPT1GREtfSU5UX01JTikgfHwgKHNjZltzZmJdPT1zY2Zbc3RhcnRTZmJdKSkpCisgICAgICBzZmIrKzsKKyAgICBzdG9wU2ZiID0gc2ZiOworCisgICAgaWYgKHN0b3BTZmIgPCBzZmJDbnQpCisgICAgICBzY2ZOZXh0ID0gc2NmW3N0b3BTZmJdOworICAgIGVsc2UKKyAgICAgIHNjZk5leHQgPSBzY2ZBY3Q7CisKKyAgICBpZiAoc2NmUHJldiA9PSBGREtfSU5UX01JTikKKyAgICAgIHNjZlByZXYgPSBzY2ZBY3Q7CisKKyAgICBzY2ZQcmV2TmV4dE1heCA9IGZpeE1heChzY2ZQcmV2LCBzY2ZOZXh0KTsKKyAgICBzY2ZQcmV2TmV4dE1pbiA9IGZpeE1pbihzY2ZQcmV2LCBzY2ZOZXh0KTsKKworICAgIC8qIHRyeSB0byByZWR1Y2UgYml0cyBieSBjaGVja2luZyBzY2YgdmFsdWVzIGluIHRoZSByYW5nZQorICAgICAgIHNjZltzdGFydFNmYl0uLi5zY2ZIaSAqLworICAgIHNjZkhpID0gZml4TWF4KHNjZlByZXZOZXh0TWF4LCBzY2ZBY3QpOworICAgIC8qIHRyeSB0byBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uIGJ5IHJlZHVjaW5nIHRoZSBzY2YgZGlmZmVyZW5jZSB0bworICAgICAgIHRoZSBuZWFyZXN0IHBvc3NpYmxlIGxvd2VyIHNjZiAqLworICAgIGlmIChzY2ZQcmV2TmV4dE1heCA+PSBzY2ZBY3QpCisgICAgICBzY2ZMbyA9IGZpeE1pbihzY2ZBY3QsIHNjZlByZXZOZXh0TWluKTsKKyAgICBlbHNlCisgICAgICBzY2ZMbyA9IHNjZlByZXZOZXh0TWF4OworCisgICAgaWYgKHN0YXJ0U2ZiIDwgc2ZiQ250ICYmIHNjZkhpLXNjZkxvIDw9IE1BWF9TQ0ZfREVMVEEpIHsgLyogcmVnaW9uIGZvdW5kICovCisgICAgICAvKiAxLiB0cnkgdG8gc2F2ZSBiaXRzIGJ5IGNvYXJzZXIgcXVhbnRpemF0aW9uICovCisgICAgICBpZiAoc2NmSGkgPiBzY2Zbc3RhcnRTZmJdKSB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgYWxsb3dlZCBkaXN0b3J0aW9uICovCisgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICAgIC8qIHNmYkRpc3RNYXhbc2ZiXSA9IChmbG9hdClwb3cocWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRbc2ZiXSpzZmJEaXN0W3NmYl0qc2ZiRGlzdFtzZmJdLDEuMGYvMy4wZik7ICovCisgICAgICAgICAgICAvKiBzZmJEaXN0TWF4W3NmYl0gPSBmaXhNYXgoc2ZiRGlzdE1heFtzZmJdLHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5W3NmYl0qRkwyRlhDT05TVF9EQkwoMS5lLTNmKSk7ICovCisgICAgICAgICAgICAvKiAtMC4xNTU3MTUzNzk0NCA9IGxkNjQoMS5lLTNmKSovCisgICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPSBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzMuMGYpLHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pK2ZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMy4wZiksc2ZiRGlzdFtzZmJdKStmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzMuMGYpLHNmYkRpc3Rbc2ZiXSk7CisgICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPSBmaXhNYXgoc2ZiRGlzdE1heFtzZmJdLHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0tRkwyRlhDT05TVF9EQkwoMC4xNTU3MTUzNzk0NCkpOworICAgICAgICAgICAgc2ZiRGlzdE1heFtzZmJdID0gZml4TWluKHNmYkRpc3RNYXhbc2ZiXSxxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBsb29wIG92ZXIgYWxsIHBvc3NpYmxlIHNjZiB2YWx1ZXMgZm9yIHRoaXMgcmVnaW9uICovCisgICAgICAgIGJDaGVja1NjZiA9IDE7CisgICAgICAgIGZvciAoc2NmTmV3PXNjZltzdGFydFNmYl0rMTsgc2NmTmV3PD1zY2ZIaTsgc2NmTmV3KyspIHsKKwkgICAgICAgICBmb3IgKGs9MDsgazxNQVhfR1JPVVBFRF9TRkI7IGsrKykKKyAgICAgICAgICAgIHNjZlRtcFtrXSA9IHNjZltrXTsKKworICAgICAgICAgIC8qIHJlcGxhY2Ugc2NmcyBpbiByZWdpb24gYnkgc2NmTmV3ICovCisgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKQorICAgICAgICAgICAgICBzY2ZUbXBbc2ZiXSA9IHNjZk5ldzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KKyAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKKworICAgICAgICAgIGRlbHRhU3BlY1BlID0gRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKHBzeU91dENoYW4sIHFjT3V0Q2hhbm5lbCwgc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNmYiwgc3RvcFNmYik7CisKKyAgICAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZSArIChGSVhQX0RCTClkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKKworICAgICAgICAgIC8qIG5ldyBiaXQgZGVtYW5kIHNtYWxsIGVub3VnaCA/ICovCisgICAgICAgICAgaWYgKGRlbHRhUGVOZXcgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgICAgYlN1Y2Nlc3MgPSAxOworCisgICAgICAgICAgICAvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KKyAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7CisgICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZOZXcpOworCisgICAgICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXdbc2ZiXSA+IHNmYkRpc3RNYXhbc2ZiXSkgeworICAgICAgICAgICAgICAgICAgLyogbm8gaW1wcm92ZW1lbnQsIHNraXAgZnVydGhlciBkaXN0LiBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgIGJTdWNjZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPT0gcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZiB3aG9sZSBzZmIgaXMgYWxyZWFkeSBxdWFudGl6ZWQgdG8gMCwgZnVydGhlcgorICAgICAgICAgICAgICAgICAgICAgICBjaGVja3Mgd2l0aCBldmVuIGNvYXJzZXIgcXVhbnQuIGFyZSB1c2VsZXNzKi8KKyAgICAgICAgICAgICAgICAgICAgYkNoZWNrU2NmID0gMDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJDaGVja1NjZj09MCkgLyogZnVydGhlciBjYWxjdWxhdGlvbnMgdXNlbGVzcyA/ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBkaXN0b3J0aW9uIHNtYWxsIGVub3VnaCA/IC0+IHVzZSBuZXcgc2NhbGVmYWN0b3JzICovCisgICAgICAgICAgICBpZiAoYlN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7CisgICAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICAgICAgICAgIHNjZltzZmJdID0gc2NmTmV3OworICAgICAgICAgICAgICAgICAgc2ZiRGlzdFtzZmJdID0gc2ZiRGlzdE5ld1tzZmJdOworCisgICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl07IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnNbc2ZiXStrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzW3NmYl0ra107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIDIuIG9ubHkgaWYgY29hcnNlciBxdWFudGl6YXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsLCB0cnkgdG8gZmluZAorICAgICAgICAgYSBiZXR0ZXIgc29sdXRpb24gYnkgZmluZXIgcXVhbnRpemF0aW9uIGFuZCByZWR1Y2luZyBiaXRzIGZvcgorICAgICAgICAgc2NhbGVmYWN0b3IgY29kaW5nICovCisgICAgICBpZiAoc2NmQWN0PT1zY2Zbc3RhcnRTZmJdICYmCisgICAgICAgICAgc2NmTG8gPCBzY2ZBY3QgJiYKKyAgICAgICAgICBzY2ZNYXgtc2NmTWluIDw9IE1BWF9TQ0ZfREVMVEEpIHsKKworICAgICAgICBpbnQgYm1pblNjZlZpb2xhdGlvbiA9IDA7CisKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0dST1VQRURfU0ZCOyBrKyspCisgICAgICAgICAgc2NmVG1wW2tdID0gc2NmW2tdOworCisgICAgICAgIHNjZk5ldyA9IHNjZkxvOworCisgICAgICAgIC8qIHJlcGxhY2Ugc2NmcyBpbiByZWdpb24gYnkgc2NmTmV3IGFuZAorICAgICAgICAgICBjaGVjayBpZiBpbiBhbGwgc2ZiIHNjZk5ldyA+PSBtaW5TY2Zbc2ZiXSAqLworICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7CisgICAgICAgICAgICBzY2ZUbXBbc2ZiXSA9IHNjZk5ldzsKKyAgICAgICAgICAgIGlmIChzY2ZOZXcgPCBtaW5TY2Zbc2ZiXSkKKyAgICAgICAgICAgICAgYm1pblNjZlZpb2xhdGlvbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFibWluU2NmVmlvbGF0aW9uKSB7CisgICAgICAgICAgLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCisgICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7CisKKyAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZihwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOworCisgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyAoRklYUF9EQkwpZGVsdGFTY2ZCaXRzICsgZGVsdGFTcGVjUGU7CisgICAgICAgIH0KKworICAgICAgICAvKiBuZXcgYml0IGRlbWFuZCBzbWFsbCBlbm91Z2ggPyAqLworICAgICAgICBpZiAoIWJtaW5TY2ZWaW9sYXRpb24gJiYgZGVsdGFQZU5ldyA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisKKyAgICAgICAgICAvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KKyAgICAgICAgICBkaXN0T2xkU3VtID0gZGlzdE5ld1N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgeworICAgICAgICAgICAgICBkaXN0T2xkU3VtICs9IENhbGNJbnZMZERhdGEoc2ZiRGlzdFtzZmJdKSA+PiBESVNUX0ZBQ19TSElGVDsKKworICAgICAgICAgICAgICBzZmJEaXN0TmV3W3NmYl0gPSBGREthYWNFbmNfY2FsY1NmYkRpc3QocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0rc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3NmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZk5ldyk7CisKKyAgICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXdbc2ZiXSA+IHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pIHsKKyAgICAgICAgICAgICAgICAvKiBubyBpbXByb3ZlbWVudCwgc2tpcCBmdXJ0aGVyIGRpc3QuIGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgICAgIGRpc3ROZXdTdW0gPSBkaXN0T2xkU3VtIDw8IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGlzdE5ld1N1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3ROZXdbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGRpc3RvcnRpb24gc21hbGxlciA/IC0+IHVzZSBuZXcgc2NhbGVmYWN0b3JzICovCisgICAgICAgICAgaWYgKGRpc3ROZXdTdW0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjhmKSxkaXN0T2xkU3VtKSkgeworICAgICAgICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7CisgICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgeworICAgICAgICAgICAgICAgIHNjZltzZmJdID0gc2NmTmV3OworICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKKworICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXTsgaysrKQorICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnNbc2ZiXStrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzW3NmYl0ra107CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogMy4gdHJ5IHRvIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gKHNhdmUgYml0cykgYnkgb25seSByZWR1Y2luZyB0aGUKKyAgICAgICAgIHNjYWxlZmFjdG9yIHdpdGhvdXQgbmV3IHF1YW50aXphdGlvbiAqLworICAgICAgaWYgKHNjZk1heC1zY2ZNaW4gPD0gTUFYX1NDRl9ERUxUQS0zKSB7IC8qIDMgYmVjLiBzY2YgaXMgcmVkdWNlZCAzIHRpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBmb3IgbG9vcCBiZWxvdyAqLworCisgICAgICAgIGZvciAoaz0wOyBrPHNmYkNudDsgaysrKQorICAgICAgICAgIHNjZlRtcFtrXSA9IHNjZltrXTsKKworICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKKyAgICAgICAgICBzY2ZOZXcgPSBzY2ZUbXBbc3RhcnRTZmJdLTE7CisgICAgICAgICAgLyogcmVwbGFjZSBzY2ZzIGluIHJlZ2lvbiBieSBzY2ZOZXcgKi8KKyAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pCisgICAgICAgICAgICAgIHNjZlRtcFtzZmJdID0gc2NmTmV3OworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KKyAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZSArIChGSVhQX0RCTClkZWx0YVNjZkJpdHM7CisgICAgICAgICAgLyogbmV3IGJpdCBkZW1hbmQgc21hbGwgZW5vdWdoID8gKi8KKyAgICAgICAgICBpZiAoZGVsdGFQZU5ldyA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworCisgICAgICAgICAgICBiU3VjY2VzcyA9IDE7CisgICAgICAgICAgICBkaXN0T2xkU3VtID0gZGlzdE5ld1N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCBzZmJFblE7CisgICAgICAgICAgICAgICAgLyogY2FsYyB0aGUgZW5lcmd5IGFuZCBkaXN0b3J0aW9uIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RydW0gZm9yCisgICAgICAgICAgICAgICAgICAgYSBzbWFsbGVyIHNjZiAqLworICAgICAgICAgICAgICAgIEZES2FhY0VuY19jYWxjU2ZiUXVhbnRFbmVyZ3lBbmREaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytzZmJPZmZzW3NmYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl0sIHNjZk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZmJFblEsICZzZmJEaXN0TmV3W3NmYl0pOworCisgICAgICAgICAgICAgICAgZGlzdE9sZFN1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3Rbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CisgICAgICAgICAgICAgICAgZGlzdE5ld1N1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3ROZXdbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CisKKyAgICAgICAgICAgICAgICAvKiAgMC4wMDI1OTQ4ODU1NjE2NyA9IGxkNjQoMS4xMjJmKSAqLworICAgICAgICAgICAgICAgIC8qIC0wLjAwNzc4NzIyNjg2NjUyID0gbGQ2NCgwLjcwNzlmKSAqLworICAgICAgICAgICAgICAgIGlmICgoc2ZiRGlzdE5ld1tzZmJdID4gKHNmYkRpc3Rbc2ZiXStGTDJGWENPTlNUX0RCTCgwLjAwMjU5NDg4NTU2MTY3ZikpKSB8fCAoc2ZiRW5RIDwgKHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0gLSBGTDJGWENPTlNUX0RCTCgwLjAwNzc4NzIyNjg2NjUyZikpKSl7CisgICAgICAgICAgICAgICAgICBiU3VjY2VzcyA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRpc3RvcnRpb24gc21hbGxlciA/IC0+IHVzZSBuZXcgc2NhbGVmYWN0b3JzICovCisgICAgICAgICAgICBpZiAoZGlzdE5ld1N1bSA8IGRpc3RPbGRTdW0gJiYgYlN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7CisgICAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICAgICAgICAgIHNjZltzZmJdID0gc2NmTmV3OworICAgICAgICAgICAgICAgICAgc2ZiRGlzdFtzZmJdID0gc2ZiRGlzdE5ld1tzZmJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoc3RvcFNmYiA8PSBzZmJDbnQpOworCit9CisKK3N0YXRpYyB2b2lkCitGREthYWNFbmNfRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbChRQ19PVVRfQ0hBTk5FTCAgICpxY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkZvcm1GYWN0b3JMZERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsY29uc3QgSU5UIGludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpSRVNUUklDVCBxdWFudFNwZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpLCBqLCBzZmIsIHNmYk9mZnM7CisgIElOVCBzY2ZJbnQ7CisgIElOVCBtYXhTZjsKKyAgSU5UIG1pblNmOworICBGSVhQX0RCTCB0aHJlc2hMZERhdGE7CisgIEZJWFBfREJMIGVuZXJneUxkRGF0YTsKKyAgRklYUF9EQkwgZW5lcmd5UGFydExkRGF0YTsKKyAgRklYUF9EQkwgdGhyZXNob2xkUGFydExkRGF0YTsKKyAgRklYUF9EQkwgc2NmRnJhY3Q7CisgIEZJWFBfREJMIG1heFNwZWM7CisgIEZJWFBfREJMIGFic1NwZWM7CisgIElOVCBtaW5TY2ZDYWxjdWxhdGVkW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYkRpc3RMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHF1YW50U3BlY1RtcCwgU0hPUlQsICgxMDI0KSk7CisgIElOVCBtaW5TZk1heFF1YW50W01BWF9HUk9VUEVEX1NGQl07CisKKyAgRklYUF9EQkwgdGhyZXNoQ29uc3RMZERhdGE9RkwyRlhDT05TVF9EQkwoMC4wNDMwNDUxMTcyMmYpOyAvKiBsb2cxMCg2Ljc1KS9sb2cxMCgyLjApLzY0LjAgKi8KKyAgRklYUF9EQkwgY29udkNvbnN0PUZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjZmKTsgLyogbG9nMTAoMi4wKSAqLworICBGSVhQX0RCTCBjMUNvbnN0PUZMMkZYQ09OU1RfREJMKC0wLjI3MDgzMTgzNTk0Zik7IC8qIEMxID0gLTY5LjMzMjk1ID0+IEMxLzJeOCAqLworCisKKworICBpZiAoaW52UXVhbnQ+MCkgeworICAgIEZES21lbWNsZWFyKHF1YW50U3BlYywgKDEwMjQpKnNpemVvZihTSE9SVCkpOworICB9CisKKyAgLyogc2NmcyB3aXRob3V0IGVuZXJneSBvciB3aXRoIHRocmVzaD5lbmVyZ3kgYXJlIG1hcmtlZCB3aXRoIEZES19JTlRfTUlOICovCisgIGZvcihpPTA7IGk8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBpKyspIHsKKyAgICBzY2ZbaV0gPSBGREtfSU5UX01JTjsKKyAgfQorCisgIGZvciAoaT0wOyBpPE1BWF9HUk9VUEVEX1NGQjsgaSsrKSB7CisgICAgbWluU2ZNYXhRdWFudFtpXSA9IEZES19JTlRfTUlOOworICB9CisKKyAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvcihzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCisgICAgICB0aHJlc2hMZERhdGEgPSBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJPZmZzK3NmYl07CisgICAgICBlbmVyZ3lMZERhdGEgPSBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl07CisKKyAgICAgIHNmYkRpc3RMZERhdGFbc2ZiT2ZmcytzZmJdID0gZW5lcmd5TGREYXRhOworCisKKyAgICAgIGlmIChlbmVyZ3lMZERhdGEgPiB0aHJlc2hMZERhdGEpIHsKKyAgICAgICAgRklYUF9EQkwgdG1wOworCisgICAgICAgIC8qIGVuZXJneVBhcnQgPSAoZmxvYXQpbG9nMTAoc2ZiRm9ybUZhY3RvcltzZmJPZmZzK3NmYl0pOyAqLworICAgICAgICAvKiAwLjA5Mzc1ZiA9IGxvZyg2NC4wKS9sb2coMi4wKS82NC4wID0gc2NhbGUgb2Ygc2ZiRm9ybUZhY3RvckxkRGF0YSAqLworICAgICAgICBlbmVyZ3lQYXJ0TGREYXRhID0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJPZmZzK3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1Zik7CisKKyAgICAgICAgLyogaW5mbHVlbmNlIG9mIGFsbG93ZWQgZGlzdG9ydGlvbiAqLworICAgICAgICAvKiB0aHJlc2hvbGRQYXJ0ID0gKGZsb2F0KWxvZzEwKDYuNzUqdGhyZXNoK0ZMVF9NSU4pOyAqLworICAgICAgICB0aHJlc2hvbGRQYXJ0TGREYXRhID0gdGhyZXNoQ29uc3RMZERhdGEgKyB0aHJlc2hMZERhdGE7CisKKyAgICAgICAgLyogc2NmIGNhbGMgKi8KKyAgICAgICAgLyogc2NmRmxvYXQgPSA4Ljg1ODVmICogKHRocmVzaG9sZFBhcnQgLSBlbmVyZ3lQYXJ0KTsgKi8KKyAgICAgICAgc2NmRnJhY3QgPSB0aHJlc2hvbGRQYXJ0TGREYXRhIC0gZW5lcmd5UGFydExkRGF0YTsKKyAgICAgICAgLyogY29udmVyc2lvbiBmcm9tIGxvZzIgdG8gbG9nMTAgKi8KKyAgICAgICAgc2NmRnJhY3QgPSBmTXVsdChjb252Q29uc3Qsc2NmRnJhY3QpOworICAgICAgICAvKiAoOC44NTg1ZiAqIHNjZkZyYWN0KS84ID0gOC84ICogc2NmRnJhY3QgKyAwLjg1ODUgKiBzY2ZGcmFjdC84ICovCisgICAgICAgIHNjZkZyYWN0ID0gc2NmRnJhY3QgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ODVmKSxzY2ZGcmFjdCA+PiAzKTsKKworICAgICAgICAvKiBpbnRlZ2VyIHNjYWxlZmFjdG9yICovCisgICAgICAgIC8qIHNjZkludCA9IChpbnQpZmxvb3Ioc2NmRmxvYXQpOyAqLworICAgICAgICBzY2ZJbnQgPSAoSU5UKShzY2ZGcmFjdD4+KChERlJBQ1RfQklUUy0xKS0zLUxEX0RBVEFfU0hJRlQpKTsgLyogMyBiaXRzID0+IHNjZkZyYWN0LzguMDsgNiBiaXRzID0+IGxkNjQgKi8KKworICAgICAgICAvKiBtYXhpbXVtIG9mIHNwZWN0cnVtICovCisgICAgICAgIG1heFNwZWMgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICBmb3Ioaj1wc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXTsgajxwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdOyBqKysgKXsKKyAgICAgICAgICBhYnNTcGVjID0gZml4cF9hYnMocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW1bal0pOworICAgICAgICAgIG1heFNwZWMgPSAoYWJzU3BlYyA+IG1heFNwZWMpID8gYWJzU3BlYyA6IG1heFNwZWM7CisgICAgICAgIH0KKworICAgICAgICAvKiBsb3dlciBzY2YgbGltaXQgdG8gYXZvaWQgcXVhbnRpemVkIHZhbHVlcyBiaWdnZXIgdGhhbiBNQVhfUVVBTlQgKi8KKyAgICAgICAgLyogQzEgPSAtNjkuMzMyOTVmLCBDMiA9IDUuNzcwNzhmID0gNC9sb2coMikgKi8KKyAgICAgICAgLyogbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoaW50KWNlaWwoQzEgKyBDMipsb2cobWF4U3BlYykpOyAqLworICAgICAgICAvKiBDMS8yXjggKyA0L2xvZygyLjApKmxvZyhtYXhTcGVjKS8yXjggID0+IEMxLzJeOCArIGxvZyhtYXhTcGVjKS9sb2coMi4wKSo0LzJeOCA9PiBDMS8yXjggKyBsb2cobWF4U3BlYykvbG9nKDIuMCkvNjQuMCAqLworCisgICAgICAgIC8vbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKChjMUNvbnN0ICsgQ2FsY0xkRGF0YShtYXhTcGVjKSkgPj4gKChERlJBQ1RfQklUUy0xKS04KSkpICsgMTsKKyAgICAgICAgdG1wID0gQ2FsY0xkRGF0YShtYXhTcGVjKTsKKyAgICAgICAgaWYgKGMxQ29uc3Q+RkwyRlhDT05TVF9EQkwoLTEuZiktdG1wKSB7CisgICAgICAgICAgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKChjMUNvbnN0ICsgdG1wKSA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcytzZmJdID0gKChJTlQpIChGTDJGWENPTlNUX0RCTCgtMS5mKSA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgc2NmSW50ID0gZml4TWF4KHNjZkludCwgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0pOworCisKKyAgICAgICAgLyogZmluZCBiZXR0ZXIgc2NhbGVmYWN0b3Igd2l0aCBhbmFseXNpcyBieSBzeW50aGVzaXMgKi8KKyAgICAgICAgaWYgKGludlF1YW50PjApIHsKKyAgICAgICAgICBzY2ZJbnQgPSBGREthYWNFbmNfaW1wcm92ZVNjZihxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV0tcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hMZERhdGEsIHNjZkludCwgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ZiRGlzdExkRGF0YVtzZmJPZmZzK3NmYl0sICZtaW5TY2ZDYWxjdWxhdGVkW3NmYk9mZnMrc2ZiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gc2NmSW50OworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgaWYgKGludlF1YW50PjEpIHsKKyAgICAvKiB0cnkgdG8gZGVjcmVhc2Ugc2NmIGRpZmZlcmVuY2VzICovCisgICAgRklYUF9EQkwgc2ZiQ29uc3RQZVBhcnRbTUFYX0dST1VQRURfU0ZCXTsKKyAgICBGSVhQX0RCTCBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOworCisgICAgZm9yIChpPTA7IGk8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBpKyspCisgICAgICBzZmJDb25zdFBlUGFydFtpXSA9IChGSVhQX0RCTClGREtfSU5UX01JTjsKKworICAgIEZES2FhY0VuY19jYWxjU2ZiUmVsZXZhbnRMaW5lcyggc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXMpOworCisKKyAgICBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLCBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLCBtaW5TY2ZDYWxjdWxhdGVkLCAxKTsKKworCisgICAgRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLCBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7CisKKworICAgIEZES2FhY0VuY19GREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmMihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLCBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKKworICB9CisKKworICAvKiBnZXQgbWluIHNjYWxlZmFjICovCisgIG1pblNmID0gRkRLX0lOVF9NQVg7CisgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgaWYgKHNjZltzZmJPZmZzK3NmYl0hPUZES19JTlRfTUlOKQorICAgICAgICBtaW5TZiA9IGZpeE1pbihtaW5TZixzY2Zbc2ZiT2ZmcytzZmJdKTsKKyAgICB9CisgIH0KKworICAvKiBsaW1pdCBzY2YgZGVsdGEgKi8KKyAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBpZiAoKHNjZltzZmJPZmZzK3NmYl0gIT0gRkRLX0lOVF9NSU4pICYmIChtaW5TZitNQVhfU0NGX0RFTFRBKSA8IHNjZltzZmJPZmZzK3NmYl0pIHsKKyAgICAgICAgc2NmW3NmYk9mZnMrc2ZiXSA9IG1pblNmICsgTUFYX1NDRl9ERUxUQTsKKyAgICAgICAgaWYgKGludlF1YW50ID4gMCkgeyAvKiBjaGFuZ2VkIGJhbmRzIG5lZWQgdG8gYmUgcXVhbnRpemVkIGFnYWluICovCisgICAgICAgICAgc2ZiRGlzdExkRGF0YVtzZmJPZmZzK3NmYl0gPQorICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdLXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZltzZmJPZmZzK3NmYl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKiBnZXQgbWF4IHNjYWxlZmFjIGZvciBnbG9iYWwgZ2FpbiAqLworICBtYXhTZiA9IEZES19JTlRfTUlOOworICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIG1heFNmID0gZml4TWF4KG1heFNmLHNjZltzZmJPZmZzK3NmYl0pOworICAgIH0KKyAgfQorCisgIC8qIGNhbGMgbG9vcCBzY2FsZWZhY3RvcnMsIGlmIHNwZWMgaXMgbm90IGFsbCB6ZXJvIChpLmUuIG1heFNmID09IC05OSkgKi8KKyAgaWYoIG1heFNmID4gRkRLX0lOVF9NSU4gKSB7CisgICAgKmdsb2JhbEdhaW4gPSBtYXhTZjsKKyAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBpZiggc2NmW3NmYk9mZnMrc2ZiXSA9PSBGREtfSU5UX01JTiApIHsKKyAgICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gMDsKKyAgICAgICAgICAvKiBzZXQgYmFuZCBleHBsaWNpdGVseSB0byB6ZXJvICovCisgICAgICAgICAgZm9yKGo9cHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl07IGo8cHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYisxXTsgaisrICkgeworICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW1bal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgc2NmW3NmYk9mZnMrc2ZiXSA9IG1heFNmIC0gc2NmW3NmYk9mZnMrc2ZiXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNleworICAgICpnbG9iYWxHYWluID0gMDsKKyAgICAvKiBzZXQgc3BlY3RydW0gZXhwbGljaXRlbHkgdG8gemVybyAqLworICAgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIHNjZltzZmJPZmZzK3NmYl0gPSAwOworICAgICAgICAvKiBzZXQgYmFuZCBleHBsaWNpdGVseSB0byB6ZXJvICovCisgICAgICAgIGZvcihqPXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdOyBqPHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV07IGorKyApIHsKKyAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZnJlZSBxdWFudFNwZWNUbXAgZnJvbSBzY3JhdGNoICovCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocXVhbnRTcGVjVG1wLCBTSE9SVCwgKDEwMjQpKTsKKworCit9CisKK3ZvaWQKK0ZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbnZRdWFudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQ2hhbm5lbHMpCit7CisgIGludCBjaDsKKworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCisgIHsKKyAgICAgIEZES2FhY0VuY19GREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKHFjT3V0Q2hhbm5lbFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaW52UXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmggYi9hYWMvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWMwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5oCkBAIC0wLDAgKzEsMTE3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogU2NhbGUgZmFjdG9yIGVzdGltYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TRl9FU1RJTV9ICisjZGVmaW5lIF9TRl9FU1RJTV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworI2RlZmluZSBGT1JNX0ZBQ19TSElGVCAgNgorCisKK3ZvaWQKK0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihRQ19PVVRfQ0hBTk5FTCAgICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzKTsKKwordm9pZAorRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5DaGFubmVscyk7CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5jcHAgYi9hYWMvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmRhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTcHJlYWRpbmcgb2YgZW5lcmd5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNwcmVhZGluZy5oIgorCit2b2lkIEZES2FhY0VuY19TcHJlYWRpbmdNYXgoY29uc3QgSU5UICAgICAgIHBiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqUkVTVFJJQ1QgbWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKlJFU1RSSUNUIG1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAqUkVTVFJJQ1QgcGJTcHJlYWRFbmVyZ3kpCit7CisgICBpbnQgaTsKKyAgIEZJWFBfREJMIGRlbGF5OworCisgICAvKiBzbG9wZSB0byBoaWdoZXIgZnJlcXVlbmNpZXMgKi8KKyAgIGRlbGF5ID0gcGJTcHJlYWRFbmVyZ3lbMF07CisgICBmb3IgKGk9MTsgaTxwYkNudDsgaSsrKSB7CisgICAgICBkZWxheSA9IGZpeE1heChwYlNwcmVhZEVuZXJneVtpXSwgZk11bHQobWFza0hpZ2hGYWN0b3JbaV0sIGRlbGF5KSk7CisgICAgICBwYlNwcmVhZEVuZXJneVtpXSA9IGRlbGF5OworICAgfQorCisgICAvKiBzbG9wZSB0byBsb3dlciBmcmVxdWVuY2llcyAqLworICAgZGVsYXkgPSBwYlNwcmVhZEVuZXJneVtwYkNudC0xXTsKKyAgIGZvciAoaT1wYkNudC0yOyBpPj0wOyBpLS0pIHsKKyAgICAgIGRlbGF5ID0gZml4TWF4KHBiU3ByZWFkRW5lcmd5W2ldLCBmTXVsdChtYXNrTG93RmFjdG9yW2ldLGRlbGF5KSk7CisgICAgICBwYlNwcmVhZEVuZXJneVtpXSA9IGRlbGF5OworICAgfQorfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmggYi9hYWMvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI1MDZjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmgKQEAgLTAsMCArMSwxMDIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IFNwcmVhZGluZyBvZiBlbmVyZ3kgYW5kIHdlaWdodGVkIHRvbmFsaXR5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU1BSRUFESU5HX0gKKyNkZWZpbmUgX1NQUkVBRElOR19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKwordm9pZCBGREthYWNFbmNfU3ByZWFkaW5nTWF4KGNvbnN0IElOVCAgICAgICAgIHBiQ250LAorICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKlJFU1RSSUNUIG1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqUkVTVFJJQ1QgbWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAqUkVTVFJJQ1QgcGJTcHJlYWRFbmVyZ3kpOworCisjZW5kaWYgLyogI2lmbmRlZiBfU1BSRUFESU5HX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3Ruc19mdW5jLmggYi9hYWMvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZTBlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oCkBAIC0wLDAgKzEsMTQ0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHb2VzY2hlbAorICAgY29udGVudHMvZGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9UTlNfRlVOQ19ICisjZGVmaW5lIF9UTlNfRlVOQ19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgorCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oSU5UIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibG9ja3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxkU2JyUHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBzeUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VUbnNQZWFrICk7CisKK0lOVCBGREthYWNFbmNfVG5zRGV0ZWN0KAorICAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMsCisgICAgICAgICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAorICAgICAgICAgICAgICBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgIElOVCBzdWJCbG9ja051bWJlciwKKyAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZQorICAgICAgICAgICAgICApOworCisKKwordm9pZCBGREthYWNFbmNfVG5zU3luYygKKyAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YURlc3QsCisgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCisgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LAorICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvU3JjLAorICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LAorICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCisgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMKKyAgICAgICAgICAgICApOworCitJTlQgRkRLYWFjRW5jX1Ruc0VuY29kZSgKKyAgICAgICAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCisgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtT2ZTZmIsCisgICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICBjb25zdCBJTlQgbG93UGFzc0xpbmUsCisgICAgICAgICAgICAgIEZJWFBfREJMKiBzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgY29uc3QgSU5UIHN1YkJsb2NrTnVtYmVyLAorICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlCisgICAgICAgICAgICAgICk7CisKKworCisjZW5kaWYgLyogX1ROU19GVU5DX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ2YTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBhdXRob3I6ICAgTS4gV2VybmVyCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ29udmVydCBjaGFvcyBtZWFzdXJlIHRvIHRoZSB0b25hbGl0eSBpbmRleAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0b25hbGl0eS5oIgorI2luY2x1ZGUgImNoYW9zbWVhc3VyZS5oIgorCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbm9ybWxvZyA9IChGSVhQX0RCTCkweGQ5NzdkOTQ5OyAvKkZMMkZYQ09OU1RfREJMKC0wLjQzNDI5NDQ4MTlmICogRkRLbG9nKDIuMCkvRkRLbG9nKDIuNzE4MjgxOCkpOyAqLworCitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1NmYlRvbmFsaXR5KEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNwZWN0cnVtLAorCQkJCQkJCUlOVCAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBjaGFvc01lYXN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgICAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQgKTsKKworCit2b2lkIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc3BlY3RydW0sCisJCQkJCQkgICAgICAgICAgICAgSU5UICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgICAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICB1c2VQbnMpCit7CisgIElOVCBqOworI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKKyAgRklYUF9TR0wgYWxwaGFfMCA9IEZMMkZYQ09OU1RfU0dMKDAuMjVmKTsgICAgICAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCisgIEZJWFBfU0dMIGFscGhhXzEgPSBGTDJGWENPTlNUX1NHTCgxLjBmLTAuMjVmKTsgIC8qIHVzZWQgaW4gc21vb3RoIENoYW9zTWVhc3VyZSAqLworI2Vsc2UKKyAgRklYUF9EQkwgYWxwaGFfMCA9IEZMMkZYQ09OU1RfREJMKDAuMjVmKTsgICAgICAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCisgIEZJWFBfREJMIGFscGhhXzEgPSBGTDJGWENPTlNUX0RCTCgxLjBmLTAuMjVmKTsgIC8qIHVzZWQgaW4gc21vb3RoIENoYW9zTWVhc3VyZSAqLworI2VuZGlmCisgIElOVCBudW1iZXJPZkxpbmVzID0gc2ZiT2Zmc2V0W3NmYkNudF07CisKKyAgaWYgKCF1c2VQbnMpCisgICAgcmV0dXJuOworCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChjaGFvc01lYXN1cmVQZXJMaW5lLCBGSVhQX0RCTCwgKDEwMjQpKTsKKyAgLyogY2FsY3VsYXRlIGNoYW9zIG1lYXN1cmUgKi8KKyAgRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZShzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lKTsKKworICAvKiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCisgIGZvciAoaj0xO2o8bnVtYmVyT2ZMaW5lcztqKyspIHsKKyAgICBGSVhQX0RCTCB0bXAgPSBmTXVsdERpdjIoYWxwaGFfMSwgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSk7CisgICAgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSA9IGZNdWx0QWRkKHRtcCwgYWxwaGFfMCwgY2hhb3NNZWFzdXJlUGVyTGluZVtqLTFdKTsKKyAgfQorCisgIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHksCisgICAgICAgICAgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMRDY0KTsKKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGNoYW9zTWVhc3VyZVBlckxpbmUsIEZJWFBfREJMLCAoMTAyNCkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBDYWxjdWxhdGVUb25hbGl0eUluZGV4CisgICAgZGVzY3JpcHRpb246ICBjb21wdXRlcyB0b25hbGl0eSB2YWx1ZXMgb3V0IG9mIHVucHJlZGljdGFiaWxpdHkgdmFsdWVzCisgICAgICAgICAgICAgICAgICBsaW1pdHMgcmFuZ2UgYW5kIGNvbXB1dGVzIGxvZygpCisgICAgcmV0dXJuczoKKyAgICBpbnB1dDogICAgICAgIHB0ciB0byBlbmVyZ2llcywgcHRyIHRvIGNoYW9zIG1lYXN1cmUgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIHNmYgorICAgIG91dHB1dDogICAgICAgc2ZiIHdpc2UgdG9uYWxpdHkgdmFsdWVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNTZmJUb25hbGl0eShGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1QgY2hhb3NNZWFzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICAgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKlJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0ICkKK3sKKyAgICBJTlQgaSwgajsKKworICAgIGZvciAoaT0wOyBpPHNmYkNudDsgaSsrKSB7CisgICAgICBGSVhQX0RCTCBjaGFvc01lYXN1cmVTZmJMRDY0OworICAgICAgSU5UIHNoaWZ0Qml0cyA9IGZpeE1heCgwLHNmYk1heFNjYWxlU3BlY1tpXSAtIDQpOyAgLyogbWF4IHNmYldpZHRoID0gOTYgOyAyXjc9MTI4ID0+IDcvMiA9IDQgKHNwYypzcGMpICovCisKKyAgICAgIEZJWFBfREJMIGNoYW9zTWVhc3VyZVNmYiA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisKKyAgICAgIC8qIGNhbGMgY2hhb3NNZWFzdXJlUGVyU2ZiICovCisgICAgICBmb3IgKGo9KHNmYk9mZnNldFtpKzFdLXNmYk9mZnNldFtpXSktMTsgaj49MDsgai0tKSB7CisgICAgICAgIEZJWFBfREJMIHRtcCA9ICgqc3BlY3RydW0rKyk8PHNoaWZ0Qml0czsKKyAgICAgICAgRklYUF9EQkwgbGluZU5yZyA9IGZNdWx0RGl2Mih0bXAsIHRtcCk7CisgICAgICAgIGNoYW9zTWVhc3VyZVNmYiA9IGZNdWx0QWRkRGl2MihjaGFvc01lYXN1cmVTZmIsIGxpbmVOcmcsICpjaGFvc01lYXN1cmUrKyk7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGMgdG9uYWxpdHlQZXJTZmIgKi8KKyAgICAgIGlmIChjaGFvc01lYXN1cmVTZmIgIT0gRkwyRlhDT05TVF9EQkwoMC4wKSkKKyAgICAgIHsKKyAgICAgICAgLyogYWRkIGxkKGNvbnZ0b25lKS82NCBhbmQgMi82NCBiZWMuZk11bHREaXYyICovCisgICAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgPSBDYWxjTGREYXRhKChjaGFvc01lYXN1cmVTZmIpKSAtIHNmYkVuZXJneUxENjRbaV07CisgICAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgKz0gRkwyRlhDT05TVF9EQkwoMy4wZi82NCkgLSAoKEZJWFBfREJMKShzaGlmdEJpdHMpPDwoREZSQUNUX0JJVFMtNikpOworCisgICAgICAgIGlmIChjaGFvc01lYXN1cmVTZmJMRDY0ID4gRkwyRlhDT05TVF9EQkwoLTAuMDUxOTA1MSkgKSAgICAgLyogPiBsZCgwLjA1KStsZCgyKSAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYkxENjQgPD0gRkwyRlhDT05TVF9EQkwoMC4wKSApCisJCSAgICBzZmJUb25hbGl0eVtpXSA9IEZYX0RCTDJGWF9TR0woZk11bHREaXYyKCBjaGFvc01lYXN1cmVTZmJMRDY0ICwgbm9ybWxvZyApIDw8IDcpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYlRvbmFsaXR5W2ldID0gRkwyRlhDT05TVF9TR0woMC4wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy90b25hbGl0eS5oIGIvYWFjL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU3OGVlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuaApAQCAtMCwwICsxLDEwOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgYXV0aG9yOiAgIE0uIExvaHdhc3NlcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IENhbGN1bGF0ZSB0b25hbGl0eSBpbmRleAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19UT05BTElUWV9ICisjZGVmaW5lIF9fVE9OQUxJVFlfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisKKyNpbmNsdWRlICJjaGFvc21lYXN1cmUuaCIKKworCit2b2lkIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICAgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgIHVzZVBucyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmNwcCBiL2FhYy9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwYjgyZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5jcHAKQEAgLTAsMCArMSwyNjQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgRGVzY3JpcHRpb246IEZES2FhY0xkRW5jX01kY3RUcmFuc2Zvcm00ODA6CisgICAgICAgICAgICAgICAgVGhlIG1vZHVsZSBGREthYWNMZEVuY19NZGN0VHJhbnNmb3JtIHdpbGwgcGVyZm9ybSB0aGUgTURDVC4KKyAgICAgICAgICAgICAgICBUaGUgTURDVCBzdXBwb3J0cyB0aGUgc2luZSB3aW5kb3cgYW5kCisgICAgICAgICAgICAgICAgdGhlIHplcm8gcGFkZGVkIHdpbmRvdy4gVGhlIGFsZ29yaXRobSBvZiB0aGUgTURDVAorICAgICAgICAgICAgICAgIGNhbiBiZSBkaXZpZGVkIGluICBXaW5kb3dpbmcsIFByZU1vZHVsYXRpb24sIEZmdCBhbmQKKyAgICAgICAgICAgICAgICBQb3N0TW9kdWxhdGlvbi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHJhbnNmb3JtLmgiCisKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCitJTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsIChjb25zdCBJTlRfUENNICogcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcHJldldpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0RGF0YV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZpbHRlclR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEZJWFBfREJMICogUkVTVFJJQ1Qgb3ZlcmxhcEFkZEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGNvbnN0IElOVF9QQ00gKiBSRVNUUklDVCB0aW1lRGF0YTsKKworICBJTlQgaTsKKyAgLyogdGw6IHRyYW5zZm9ybSBsZW5ndGgKKyAgICAgZmw6IGxlZnQgd2luZG93IHNsb3BlIGxlbmd0aAorICAgICBubDogbGVmdCB3aW5kb3cgc2xvcGUgb2Zmc2V0CisgICAgIGZyOiByaWdodCB3aW5kb3cgc2xvcGUgbGVuZ3RoCisgICAgIG5yOiByaWdodCB3aW5kb3cgc2xvcGUgb2Zmc2V0CisgICAgIFNlZSBGREtfdG9vbHMvZG9jL2ludGVybi9tZGN0LnRleCBmb3IgbW9yZSBkZXRhaWwuICovCisgIGludCB0bCwgZmwsIG5sLCBmciwgbnI7CisKKyAgY29uc3QgRklYUF9XVFAgKiBSRVNUUklDVCBwTGVmdFdpbmRvd1BhcnQ7CisgIGNvbnN0IEZJWFBfV1RQICogUkVTVFJJQ1QgcFJpZ2h0V2luZG93UGFydDsKKworICAvKgorICAgKiBNRENUIHNjYWxlOgorICAgKiArIDE6IGZNdWx0RGl2MigpIGluIHdpbmRvd2luZy4KKyAgICogKyAxOiBCZWNhdXNlIG9mIGZhY3RvciAxLzIgaW4gUHJpbmNlbi1CcmFkbGV5IGNvbXBsaWFudCB3aW5kb3dlZCBUREFDLgorICAgKi8KKyAgKm1kY3REYXRhX2UgPSAxKzE7CisKKyAgdGwgPSBmcmFtZUxlbmd0aDsKKyAgdGltZURhdGEgPSBwVGltZURhdGE7CisKKyAgc3dpdGNoKCBibG9ja1R5cGUgKSB7CisgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgIHsKKyAgICAgICAgaW50IG9mZnNldCA9ICh3aW5kb3dTaGFwZSA9PSBMT0xfV0lORE9XKSA/ICgoZnJhbWVMZW5ndGggKiAzKT4+MikgOiAwOworICAgICAgICBmbCA9IGZyYW1lTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgICBmciA9IGZyYW1lTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIGZsID0gZnJhbWVMZW5ndGggPj4gMzsKKyAgICAgIGZyID0gZnJhbWVMZW5ndGg7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVJUX1dJTkRPVzogLyogb3IgU3RvcFN0YXJ0U2VxdWVuY2UgKi8KKyAgICAgIGZsID0gZnJhbWVMZW5ndGg7CisgICAgICBmciA9IGZyYW1lTGVuZ3RoID4+IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgIGZsID0gZnIgPSBmcmFtZUxlbmd0aCA+PiAzOworICAgICAgdGwgPj49IDM7CisgICAgICB0aW1lRGF0YSA9IHBUaW1lRGF0YSArIDMqZmwgKyAoZmwvMik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogVGFrZW4gZnJvbSBGREtfdG9vbHMvc3JjL21kY3QuY3BwIERlcml2ZSBOUiBhbmQgTkwgKi8KKyAgbnIgPSAodGwgLSBmcik+PjE7CisgIG5sID0gKHRsIC0gZmwpPj4xOworCisgIHBMZWZ0V2luZG93UGFydCA9IEZES2dldFdpbmRvd1Nsb3BlKGZsLCAqcHJldldpbmRvd1NoYXBlKTsKKyAgcFJpZ2h0V2luZG93UGFydCA9IEZES2dldFdpbmRvd1Nsb3BlKGZyLCB3aW5kb3dTaGFwZSk7CisKKyAgLyogd2luZG93aW5nICovCisgIGlmIChmaWx0ZXJUeXBlICE9IEZCX0VMRCkKKyAgeworICAgIC8qIExlZnQgd2luZG93IHNsb3BlIG9mZnNldCAqLworICAgIGZvciAoaT0wOyBpPG5sIDsgaSsrKQorICAgIHsKKyNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUyAgIC8qIFNQQ19CSVRTIGFuZCBERlJBQ1RfQklUUyBzaG91bGQgYmUgZXF1YWwuICovCisgICAgICBtZGN0RGF0YVsodGwvMikraV0gPSAtIChGSVhQX0RCTCkgdGltZURhdGFbdGwtaS0xXSA+PiAoIDEgKTsKKyNlbHNlCisgICAgICBtZGN0RGF0YVsodGwvMikraV0gPSAtIChGSVhQX0RCTCkgdGltZURhdGFbdGwtaS0xXSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOworI2VuZGlmCisgICAgfQorICAgIC8qIExlZnQgd2luZG93IHNsb3BlICovCisgICAgZm9yIChpPTA7IGk8ZmwvMjsgaSsrKQorICAgIHsKKyAgICAgIEZJWFBfREJMIHRtcDA7CisgICAgICB0bXAwID0gZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtpK25sXSwgcExlZnRXaW5kb3dQYXJ0W2ldLnYuaW0pOworICAgICAgbWRjdERhdGFbKHRsLzIpK2krbmxdID0gZk11bHRTdWJEaXYyKHRtcDAsIChGSVhQX1BDTSl0aW1lRGF0YVt0bC1ubC1pLTFdLCBwTGVmdFdpbmRvd1BhcnRbaV0udi5yZSk7CisgICAgfQorCisgICAgLyogUmlnaHQgd2luZG93IHNsb3BlIG9mZnNldCAqLworICAgIGZvcihpPTA7IGk8bnI7IGkrKykKKyAgICB7CisjaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMgICAgLyogVGhpcyBzaG91bGQgYmUgU1BDX0JJVFMgaW5zdGVhZCBvZiBERlJBQ1RfQklUUy4gKi8KKyAgICAgIG1kY3REYXRhWyh0bC8yKS0xLWldID0gLSAoRklYUF9EQkwpIHRpbWVEYXRhW3RsK2ldID4+ICgxKTsKKyNlbHNlCisgICAgICBtZGN0RGF0YVsodGwvMiktMS1pXSA9IC0gKEZJWFBfREJMKSB0aW1lRGF0YVt0bCtpXSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOworI2VuZGlmCisgICAgfQorICAgIC8qIFJpZ2h0IHdpbmRvdyBzbG9wZSAqLworICAgIGZvciAoaT0wOyBpPGZyLzI7IGkrKykKKyAgICB7CisgICAgICBGSVhQX0RCTCB0bXAxOworICAgICAgdG1wMSA9IGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbdGwrbnIraV0sIHBSaWdodFdpbmRvd1BhcnRbaV0udi5yZSk7CisgICAgICBtZGN0RGF0YVsodGwvMiktbnItaS0xXSA9IC1mTXVsdEFkZERpdjIodG1wMSwgKEZJWFBfUENNKXRpbWVEYXRhWyh0bCoyKS1uci1pLTFdLCBwUmlnaHRXaW5kb3dQYXJ0W2ldLnYuaW0pOworICAgIH0KKyAgfQorCisgIGlmIChmaWx0ZXJUeXBlID09IEZCX0VMRCkKKyAgeworICAgIGNvbnN0IEZJWFBfV1RCICpwV2luZG93RUxEPU5VTEw7CisgICAgaW50IGksIE4gPSBmcmFtZUxlbmd0aCwgTCA9IGZyYW1lTGVuZ3RoOworCisgICAgaWYgKGZyYW1lTGVuZ3RoID09IDUxMikgeworICAgICAgcFdpbmRvd0VMRCA9IEVMREFuYWx5c2lzNTEyOworICAgIH0gZWxzZSB7CisgICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXM0ODA7CisgICAgfQorCisgICAgZm9yKGk9MDtpPE4vNDtpKyspCisgICAgeworICAgICAgRklYUF9EQkwgejAsIG91dHZhbDsKKworICAgICAgejAgPSAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOLzItMS1pXSk8PCAoV1RTMC0xKSkgKyAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQraV0sIHBXaW5kb3dFTERbTi8yK2ldKTw8IChXVFMwLTEpKTsKKworICAgICAgb3V0dmFsICA9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOK04vMi0xLWldKSA+PiAoLVdUUzEpKTsKKyAgICAgIG91dHZhbCArPSAoZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtMK04qMy80K2ldLCBwV2luZG93RUxEW04rTi8yK2ldKSA+PiAoLVdUUzEpICk7CisgICAgICBvdXR2YWwgKz0gKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04vMitpXSwgcFdpbmRvd0VMRFsyKk4raV0pPj4gKC1XVFMyLTEpKTsKKworICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0gPSBvdmVybGFwQWRkQnVmZmVyW2ldOworCisgICAgICBvdmVybGFwQWRkQnVmZmVyW2ldID0gejA7CisgICAgICBtZGN0RGF0YVtpXSA9IG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldICsgKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04rTi8yLTEtaV0sIHBXaW5kb3dFTERbMipOK04vMitpXSkgPj4gKC1XVFMyLTEpKTsKKworICAgICAgbWRjdERhdGFbTi0xLWldID0gb3V0dmFsOworICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOK04vMi0xLWldID0gb3V0dmFsOworICAgIH0KKworICAgIGZvcihpPU4vNDtpPE4vMjtpKyspCisgICAgeworICAgICAgRklYUF9EQkwgejAsIG91dHZhbDsKKworICAgICAgejAgPSBmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTCtOKjMvNC0xLWldLCBwV2luZG93RUxEW04vMi0xLWldKSA8PCAoV1RTMC0xKTsKKworICAgICAgb3V0dmFsICA9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOK04vMi0xLWldKSA+PiAoLVdUUzEpKSA7CisgICAgICBvdXR2YWwgKz0gKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04vMitpXSwgcFdpbmRvd0VMRFsyKk4raV0pID4+ICgtV1RTMi0xKSk7CisKKyAgICAgIG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltpXSArIChmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTC1OLzQraV0sIHBXaW5kb3dFTERbTi8yK2ldKTw8IChXVFMwLTEpICk7CisKKyAgICAgIG92ZXJsYXBBZGRCdWZmZXJbaV0gPSB6MDsKKyAgICAgIG1kY3REYXRhW2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0gKyAoZk11bHREaXYyKG92ZXJsYXBBZGRCdWZmZXJbTitOLzItMS1pXSwgcFdpbmRvd0VMRFsyKk4rTi8yK2ldKSA+PiAoLVdUUzItMSkpOworCisgICAgICBtZGN0RGF0YVtOLTEtaV0gPSBvdXR2YWw7CisgICAgICBvdmVybGFwQWRkQnVmZmVyW04rTi8yLTEtaV0gPSBvdXR2YWw7CisgICAgfQorICB9CisKKyAgZGN0X0lWKG1kY3REYXRhLCB0bCwgbWRjdERhdGFfZSk7CisKKyAgKnByZXZXaW5kb3dTaGFwZSA9IHdpbmRvd1NoYXBlOworCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uaCBiL2FhYy9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTMxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDEyMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgorICAgY29udGVudHMvZGVzY3JpcHRpb246IE1EQ1QgVHJhbnNmb3JtCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVFJBTlNGT1JNX0gKKyNkZWZpbmUgX1RSQU5TRk9STV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNkZWZpbmUgV1RTMCAxCisjZGVmaW5lIFdUUzEgMAorI2RlZmluZSBXVFMyIC0yCisKKy8qKgorICogXGJyaWVmOiBQZXJmb3JtZSBNRENUIHRyYW5zZm9ybSBvZiB0aW1lIGRvbWFpbiBkYXRhLgorICogXHBhcmFtIHRpbWVEYXRhIHBvaW50ZXIgdG8gdGltZSBkb21haW4gaW5wdXQgc2lnbmFsLgorICogXHBhcmFtIG1kY3REYXRhIHBvaW50ZXIgdG8gc3RvcmUgZnJlcXVlbmN5IGRvbWFpbiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBibG9ja1R5cGUgaW5kZXggaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBibG9jay4gRWl0aGVyCisgKiAgICAgICAgTE9OR19XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XIG9yIFNUT1BfV0lORE9XLgorICogXHBhcmFtIHdpbmRvd1NoYXBlIGluZGV4IGluZGljYXRpbmcgdGhlIHdpbmRvdyBzbG9wZSB0eXBlIHRvIGJlIHVzZWQuCisgKiAgICAgICAgVmFsdWVzIGFsbG93ZWQgYXJlIGVpdGhlciBTSU5FX1dJTkRPVyBvciBLQkRfV0lORE9XLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoIGxlbmd0aCBvZiB0aGUgYmxvY2suCisgKiBccGFyYW0gbWRjdERhdGFfZSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIGZyZXF1ZW5jeQorICogICAgICAgIGRvbWFpbiBvdXRwdXQgZGF0YSBpcyBzdG9yZWQgaW50by4KKyAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIGluIGNhc2Ugb2YgZXJyb3IgKGluY29uc2lzdGVudCBwYXJhbWV0ZXJzKS4KKyAqLworSU5UIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbCAoY29uc3QgSU5UX1BDTSAqdGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwcmV2V2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1kY3REYXRhX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZmlsdGVyVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsRklYUF9EQkwgKiBSRVNUUklDVCBvdmVybGFwQWRkQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9GREtfYXJjaGRlZi5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL0ZES19hcmNoZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYzEzOAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9GREtfYXJjaGRlZi5oCkBAIC0wLDAgKzEsMjQ1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQVJDSF9IX18KKyNkZWZpbmUgX19BUkNIX0hfXworCisvKiBQZXJmb3JtYW5jZSAvIFF1YWxpdHkgcHJvZmlsZSBzZWxlY3RvciAqLworICAjZGVmaW5lIEZES19ISUdIX1BFUkZPUk1BTkNFCisKKy8qIFVuaWZ5IHNvbWUgZmV3IHRvb2xjaGFpbiBzcGVjaWZpYyBkZWZpbmVzIHRvIGF2b2lkIGhhdmluZyBsYXJnZSAib3IiIG1hY3JvIGNvbnRyYXB0aW9ucyBhbGwgb3ZlciB0aGUgc291cmNlIGNvZGUuICovCisKKy8qIFRha2UgYWN0aW9uIGFnYWluc3QgVmlzdWFsU3R1ZGlvIDIwMDUgY3Jvc3Njb21waWxlIHByb2JsZW1zLiAqLworCisvKiBVc2Ugc2luZ2xlIG1hY3JvICh0aGUgR0NDIGJ1aWx0IGluIG1hY3JvKSBmb3IgYXJjaGl0ZWN0dXJlIGlkZW50aWZpY2F0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHRvb2xjaGFpbiAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKQorI2RlZmluZSBfX3g4Nl9fCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfX0NDX0FSTSkpICYmICFkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19USV9UTVM0NzBfVjVfXykgJiYgIWRlZmluZWQoX19hcm1fXykKKyNkZWZpbmUgX19hcm1fXworI2VuZGlmCisKKworCisvKiBEZWZpbmUgX19BUk1fQVJDSF81VEVfXyBpZiBhcm12NXRlIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgICovCisjaWYgKF9fVEFSR0VUX0FSQ0hfQVJNID09IDUpIHx8IGRlZmluZWQoX19UQVJHRVRfRkVBVFVSRV9EU1BNVUwpIHx8IChfTV9BUk0gPT0gNSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykgfHwgZGVmaW5lZChfX1RJX1RNUzQ3MF9WNV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0VNX18pCisjZGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18KKyNlbmRpZgorCisvKiBEZWZpbmUgX19BUk1fQVJDSF82X18gaWYgdGhlIGFybXY2IGludHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQuICovCisjaWYgKF9fVEFSR0VUX0FSQ0hfQVJNID09IDYpIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisjZGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18KKyNkZWZpbmUgX19BUk1fQVJDSF82X18KKyNlbmRpZgorCisvKiBEZWZpbmUgX19BUk1fQVJDSF83X0FfXyBpZiB0aGUgYXJtdjcgaW50cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZC4gKi8KKyNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN19SKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXykKKyNkZWZpbmUgX19BUk1fQVJDSF81VEVfXworI2RlZmluZSBfX0FSTV9BUkNIXzZfXworI2RlZmluZSBfX0FSTV9BUkNIXzdfUl9fCisjZW5kaWYKKworLyogRGVmaW5lIF9fQVJNX0FSQ0hfN19BX18gaWYgdGhlIGFybXY3IGludHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQuICovCisjaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdfQSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCisjZGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18KKyNkZWZpbmUgX19BUk1fQVJDSF82X18KKyNkZWZpbmUgX19BUk1fQVJDSF83X0FfXworI2VuZGlmCisKKy8qIERlZmluZSBfX0FSTV9BUkNIXzdNX18gaWYgdGhlIEFSTXY3LU0gaW5zdHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQsIGUuZy4gQ29ydGV4LU0zLiAqLworI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF83X00pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83X01fXykKKyNkZWZpbmUgX19BUk1fQVJDSF83TV9fCisjZW5kaWYKKworLyogRGVmaW5lIF9fQVJNX0FSQ0hfN0VNX18gaWYgdGhlIEFSTXY3LU1FIGluc3RydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLCBlLmcuIENvcnRleC1NNC4gKi8KKyNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN0VfTSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdFX01fXykKKyNkZWZpbmUgX19BUk1fQVJDSF83RU1fXworI2VuZGlmCisKKy8qIERldGVjdCBhbmQgdW5pZnkgbWFjcm9zIGZvciBuZW9uIGZlYXR1cmUuICovCisjaWYgZGVmaW5lZChfX1RBUkdFVF9GRUFUVVJFX05FT04pICYmICFkZWZpbmVkKF9fQVJNX05FT05fXykKKyNkZWZpbmUgX19BUk1fTkVPTl9fCisjZW5kaWYKKworI2lmZGVmIF9NX0FSTQorI2luY2x1ZGUgImNtbmludHJpbi5oIgorI2luY2x1ZGUgImFybWludHIuaCIKKyNlbmRpZgorCisKKy8qIERlZmluZSBwcmVmZXJyZWQgTXVsdGlwbGljYXRpb24gdHlwZSAqLworI2lmIGRlZmluZWQoRkRLX0hJR0hfUEVSRk9STUFOQ0UpICYmICFkZWZpbmVkKEZES19ISUdIX1FVQUxJVFkpIC8qIEZES19ISUdIX1BFUkZPUk1BTkNFICovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc2hfXykKKyNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8xNngxNgorI3VuZGVmIFNJTkVUQUJMRV8xNkJJVAorI3VuZGVmIFBPVzJDT0VGRl8xNkJJVAorI3VuZGVmIExEQ09FRkZfMTZCSVQKKyN1bmRlZiBXSU5ET1dUQUJMRV8xNkJJVAorCisjZWxpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKKyNkZWZpbmUgU0lORVRBQkxFXzE2QklUCisjZGVmaW5lIFBPVzJDT0VGRl8xNkJJVAorI2RlZmluZSBMRENPRUZGXzE2QklUCisjZGVmaW5lIFdJTkRPV1RBQkxFXzE2QklUCisKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzdNX18pCisjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKKyNkZWZpbmUgU0lORVRBQkxFXzE2QklUCisjZGVmaW5lIFBPVzJDT0VGRl8xNkJJVAorI2RlZmluZSBMRENPRUZGXzE2QklUCisjZGVmaW5lIFdJTkRPV1RBQkxFXzE2QklUCisKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzdFTV9fKQorI2RlZmluZSBBUkNIX1BSRUZFUl9NVUxUXzMyeDMyCisjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKKyNkZWZpbmUgU0lORVRBQkxFXzE2QklUCisjZGVmaW5lIFBPVzJDT0VGRl8xNkJJVAorI2RlZmluZSBMRENPRUZGXzE2QklUCisjZGVmaW5lIFdJTkRPV1RBQkxFXzE2QklUCisKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKKyNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8xNngxNgorI3VuZGVmIFNJTkVUQUJMRV8xNkJJVAorI3VuZGVmIFdJTkRPV1RBQkxFXzE2QklUCisjdW5kZWYgUE9XMkNPRUZGXzE2QklUCisjdW5kZWYgTERDT0VGRl8xNkJJVAorCisjZWxpZiBkZWZpbmVkKF9feDg2X18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8zMngxNgorI2RlZmluZSBTSU5FVEFCTEVfMTZCSVQKKyNkZWZpbmUgV0lORE9XVEFCTEVfMTZCSVQKKyNkZWZpbmUgUE9XMkNPRUZGXzE2QklUCisjZGVmaW5lIExEQ09FRkZfMTZCSVQKKworI2Vsc2UKKworICAjd2FybmluZyAgPj4+PiBQbGVhc2Ugc2V0IGFyY2hpdGVjdHVyZSBjaGFyYWN0ZXJpemF0aW9uIGRlZmluZXMgZm9yIHlvdXIgcGxhdGZvcm0gKEZES19ISUdIX1BFUkZPUk1BTkNFKSEgPDw8PAorCisjZW5kaWYgLyogQXJjaGl0ZWN0dXJlIHN3aXRjaGVzICovCisKKyNlbHNlIC8qIG5laXRoZXIgRkRLX0hJR0hfUVVBTElUWSBvciBGREtfSElHSF9QRVJGT1JNQU5DRSAqLworCisjZXJyb3IgRWl0aGVyIHNldCBGREtfSElHSF9RVUFMSVRZIG9yIEZES19ISUdIX1BFUkZPUk1BTkNFLCBidXQgbm90IGJvdGggbm9yIG5vbmUgb2YgdGhlbS4KKworI2VuZGlmIC8qIEVuZCBvZiBxdWFsaXR5L2NvbXBsZXhpdHkgdHJhZGVvZmYgKi8KKworI2RlZmluZSBGREtUT09MU19QQUNLRURfVEFCTEVTCisKKworI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAorICAjZGVmaW5lIEZJWFBfU1RCIEZJWFBfU0dMICAgICAvKiBTVEIgc2ludXMgVGFiIHVzZWQgaW4gdHJhbnNmb3JtYXRpb24gKi8KKyAgI2RlZmluZSBGSVhQX1NUUCBGSVhQX1NQSworICAjZGVmaW5lIFNUQyhhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKQorI2Vsc2UKKyAgI2RlZmluZSBGSVhQX1NUQiBGSVhQX0RCTAorICAjZGVmaW5lIEZJWFBfU1RQIEZJWFBfRFBLCisgICNkZWZpbmUgU1RDKGEpICgoRklYUF9EQkwpKExPTkcpKGEpKQorI2VuZGlmIC8qIGRlZmluZWQoU0lORVRBQkxFXzE2QklUKSAqLworCisjZGVmaW5lIFNUQ1AoY29zLHNpbikgeyB7IFNUQyhjb3MpLCBTVEMoc2luKSB9IH0KKworCisjaWZkZWYgV0lORE9XVEFCTEVfMTZCSVQKKyAgI2RlZmluZSBGSVhQX1dUQiBGSVhQX1NHTCAvKiBzaW5nbGUgRklYUF9TR0wgdmFsdWVzICovCisgICNkZWZpbmUgRklYUF9XVFAgRklYUF9TUEsgLyogcGFja2VkIEZJWFBfU0dMIHZhbHVlcyAqLworICAjZGVmaW5lIFdUQyhhKSBGWF9EQkwyRlhDT05TVF9TR0woYSkKKyNlbHNlIC8qIFNJTkVUQUJMRV8xNkJJVCAqLworICAjZGVmaW5lIEZJWFBfV1RCIEZJWFBfREJMCisgICNkZWZpbmUgRklYUF9XVFAgRklYUF9EUEsKKyAgI2RlZmluZSBXVEMoYSkgKEZJWFBfREJMKShhKQorI2VuZGlmIC8qIFNJTkVUQUJMRV8xNkJJVCAqLworCisjZGVmaW5lIFdUQ1AoYSxiKSB7IHsgV1RDKGEpLCBXVEMoYikgfSB9CisKKworI2VuZGlmIC8qIF9fQVJDSF9IX18gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9GREtfYml0YnVmZmVyLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2JpdGJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmEwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2JpdGJ1ZmZlci5oCkBAIC0wLDAgKzEsMTY2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisgICBEZXNjcmlwdGlvbjogY29tbW9uIGJpdGJ1ZmZlciByZWFkL3dyaXRlIHJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0ZES19CSVRCVUZGRVJfSF9fCisjZGVmaW5lIF9fRkRLX0JJVEJVRkZFUl9IX18KKworCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVCBWYWxpZEJpdHM7CisgIFVJTlQgUmVhZE9mZnNldDsKKyAgVUlOVCBXcml0ZU9mZnNldDsKKyAgVUlOVCBCaXRDbnQ7CisgIFVJTlQgQml0TmR4OworCisgIFVDSEFSICpCdWZmZXI7CisgIFVJTlQgICBidWZTaXplOworICBVSU5UICAgYnVmQml0czsKK30gRkRLX0JJVEJVRjsKKwordHlwZWRlZiBGREtfQklUQlVGICpIQU5ETEVfRkRLX0JJVEJVRjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IFVJTlQgQml0TWFzayBbMzIrMV07CisKKy8qKiAgVGhlIEJpdEJ1ZmZlciBGdW5jdGlvbnMgYXJlIGNhbGxlZCBzdHJhaWdodCBmcm9tIEZES19iaXRzdHJlYW0gSW50ZXJmYWNlLgorICAgICBGb3IgRnVuY3Rpb25zIGZ1bmN0aW9uYWwgc3VydmV5IGxvb2sgdGhlcmUuCisqLworCit2b2lkIEZES19DcmVhdGVCaXRCdWZmZXIgKEhBTkRMRV9GREtfQklUQlVGICpoQml0QnVmZmVyLCBVQ0hBUiAqcEJ1ZmZlciwgVUlOVCBidWZTaXplKSA7CisKK3ZvaWQgRkRLX0luaXRCaXRCdWZmZXIgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpIDsKKwordm9pZCBGREtfUmVzZXRCaXRCdWZmZXIgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKSA7CisKK3ZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlciAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworCitJTlQgIEZES19nZXQgICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSA7CisKK0lOVCAgRkRLX2dldDMyICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworCit2b2lkIEZES19wdXQgICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSA7CisKK0lOVCAgRkRLX2dldEJ3ZCAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwordm9pZCBGREtfcHV0QndkICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVSU5UIHZhbHVlLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgOworCit2b2lkIEZES19wdXNoQmFjayAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpIDsKK3ZvaWQgRkRLX3B1c2hGb3J3YXJkICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsIFVDSEFSIGNvbmZpZykgOworCit2b2lkIEZES19ieXRlQWxpZ24gICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSIGNvbmZpZykgOworCitVSU5UIEZES19nZXRWYWxpZEJpdHMgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKK0lOVCAgRkRLX2dldEZyZWVCaXRzICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworCit2b2lkIEZES19zZXRCaXRDbnQgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgdmFsdWUpIDsKK0lOVCAgRkRLX2dldEJpdENudCAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworCit2b2lkIEZES19GZWVkICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSIGlucHV0QnVmZmVyIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpIDsKKwordm9pZCBGREtfQ29weSAgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmRHN0LCBIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmU3JjLCBVSU5UICpieXRlc1ZhbGlkKSA7CisKK3ZvaWQgRkRLX0ZldGNoICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUNIQVIgb3V0QnVmW10sIFVJTlQgKndyaXRlQnl0ZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2JpdHN0cmVhbS5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL0ZES19iaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhkN2RlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL0ZES19iaXRzdHJlYW0uaApAQCAtMCwwICsxLDYxOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgorICAgRGVzY3JpcHRpb246IGJpdHN0cmVhbSBpbnRlcmZhY2UgdG8gYml0YnVmZmVyIHJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0ZES19CSVRTVFJFQU1fSF9fCisjZGVmaW5lIF9fRkRLX0JJVFNUUkVBTV9IX18KKworCisKKyNpbmNsdWRlICJGREtfYml0YnVmZmVyLmgiCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjZGVmaW5lIENBQ0hFX0JJVFMgMzIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBCU19SRUFERVIsCisgICAgQlNfV1JJVEVSCit9IEZES19CU19DRkc7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVCAgICAgICBDYWNoZVdvcmQgOworICBVSU5UICAgICAgIEJpdHNJbkNhY2hlIDsKKyAgRkRLX0JJVEJVRiBoQml0QnVmOworICBVSU5UICAgICAgIENvbmZpZ0NhY2hlIDsKK30gRkRLX0JJVFNUUkVBTTsKKwordHlwZWRlZiBGREtfQklUU1RSRUFNKiBIQU5ETEVfRkRLX0JJVFNUUkVBTTsKKworLyoqCisgKiBcYnJpZWYgQ3JlYXRlQml0U3RyZWFtIEZ1bmN0aW9uLgorICoKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBiaXRzdHJlYW0gd2l0aCBleHRlcm4gYWxsb2NhdGVkIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gcEJ1ZmZlciAgUG9pbnRlciB0byBCaXRCdWZmZXIgYXJyYXkuCisgKiBccGFyYW0gYnVmU2l6ZSAgTGVuZ3RoIG9mIEJpdEJ1ZmZlciBhcnJheS4gKGF3YWl0cyBzaXplIDJebikKKyAqIFxwYXJhbSBjb25maWcgICBJbml0aWFsaXplIEJpdFN0cmVhbSBhcyBSZWFkZXIgb3IgV3JpdGVyLgorICovCitGREtfSU5MSU5FCitIQU5ETEVfRkRLX0JJVFNUUkVBTSBGREtjcmVhdGVCaXRTdHJlYW0gKFVDSEFSICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQoreworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtID0gKEhBTkRMRV9GREtfQklUU1RSRUFNKSBGREtjYWxsb2MoMSwgc2l6ZW9mKEZES19CSVRTVFJFQU0pKTsKKyAgRkRLX0luaXRCaXRCdWZmZXIoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIHBCdWZmZXIsIGJ1ZlNpemUsIDApIDsKKworICAvKiBpbml0IGNhY2hlICovCisgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMCA7CisgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnIDsKKworICByZXR1cm4gaEJpdFN0cmVhbSA7Cit9CisKKworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6ZSBCaXN0cmVhbUJ1ZmZlci4gQml0QnVmZmVyIGNhbiBwb2ludCB0byBmaWxsZWQgQml0QnVmZmVyIGFycmF5IC4KKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBwQnVmZmVyICAgIFBvaW50ZXIgdG8gQml0QnVmZmVyIGFycmF5LgorICogXHBhcmFtIGJ1ZlNpemUgICAgTGVuZ3RoIG9mIEJpdEJ1ZmZlciBhcnJheS4gKGF3YWl0cyBzaXplIDJebikKKyAqIFxwYXJhbSB2YWxpZEJpdHMgIE51bWJlciBvZiB2YWxpZCBCaXRCdWZmZXIgZmlsbGVkIEJpdHMuCisgKiBccGFyYW0gY29uZmlnICAgICBJbml0aWFsaXplIEJpdFN0cmVhbSBhcyBSZWFkZXIgb3IgV3JpdGVyLgorICogXHJldHVybiB2b2lkCisgKi8KK0ZES19JTkxJTkUKK3ZvaWQgRkRLaW5pdEJpdFN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB2YWxpZEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQoreworICBGREtfSW5pdEJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgdmFsaWRCaXRzKSA7CisKKyAgLyogaW5pdCBjYWNoZSAqLworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOworICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9IGNvbmZpZyA7Cit9CisKKworLyoqCisgKiBcYnJpZWYgUmVzZXRCaXRidWZmZXIgRnVuY3Rpb24uIFJlc2V0IHN0YXRlcyBpbiBCaXRCdWZmZXIgYW5kIENhY2hlLgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIGNvbmZpZyAgICAgSW5pdGlhbGl6ZSBCaXRTdHJlYW0gYXMgUmVhZGVyIG9yIFdyaXRlci4KKyAqIFxyZXR1cm4gdm9pZAorICovCitGREtfSU5MSU5FIHZvaWQgRkRLcmVzZXRCaXRidWZmZXIoIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQoreworICBGREtfUmVzZXRCaXRCdWZmZXIoICZoQml0U3RyZWFtLT5oQml0QnVmICkgOworCisgIC8qIGluaXQgY2FjaGUgKi8KKyAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwIDsKKyAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPSBjb25maWcgOworfQorCisKKy8qKiBEZWxldGVCaXRTdHJlYW0uCisKKyAgICBEZWxldGVzIHRoZSBpbiBDcmVhdGUgQml0c3RyZWFtIGFsbG9jYXRlZCBCaXRTdHJlYW0gYW5kIEJpdEJ1ZmZlci4KKyovCitGREtfSU5MSU5FIHZvaWQgRkRLZGVsZXRlQml0U3RyZWFtIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICBGREtfRGVsZXRlQml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7CisgIEZES2ZyZWUoaEJpdFN0cmVhbSkgOworfQorCisKKy8qKgorICogXGJyaWVmIFJlYWRCaXRzIEZ1bmN0aW9uIChmb3J3YXJkKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbnVtYmVyIG9mIHNlcXVlbnRpYWwKKyAqICAgICAgICBiaXRzIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4KKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBudW1iZXJPZkJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSByZXRyaWV2ZWQuCisgKiBccmV0dXJuIHRoZSByZXF1ZXN0ZWQgYml0cywgcmlnaHQgYWxpZ25lZAorICogXHJldHVybgorICovCisjZGVmaW5lIE9QVElNSVpFX0ZES1JFQURCSVRTCisKK0ZES19JTkxJTkUgVUlOVCBGREtyZWFkQml0cyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCit7CisjaWZkZWYgbm9PUFRJTUlaRV9GREtSRUFEQklUUworICBJTlQgbWlzc2luZ0JpdHMgPSBudW1iZXJPZkJpdHMgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZTsKKyAgaWYgKG1pc3NpbmdCaXRzID4gMCkKKyAgeworICAgIFVJTlQgYml0cyA9IGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBtaXNzaW5nQml0czsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIgKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBDQUNIRV9CSVRTIC0gbWlzc2luZ0JpdHM7CisgICAgcmV0dXJuICggYml0cyB8IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpKSAmIEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKKyAgfQorCisgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKKyAgcmV0dXJuICggaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSAmIEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKKworI2Vsc2UKKyAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKworICBpZiAoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPD0gbnVtYmVyT2ZCaXRzKQorICB7CisgICAgY29uc3QgSU5UIGZyZWVCaXRzID0gKENBQ0hFX0JJVFMtMSkgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA7CisKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IGZyZWVCaXRzKSB8IEZES19nZXQgKCZoQml0U3RyZWFtLT5oQml0QnVmLGZyZWVCaXRzKSA7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gZnJlZUJpdHMgOworICB9CisKKyAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgLT0gbnVtYmVyT2ZCaXRzIDsKKworICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiB2YWxpZE1hc2sgOworI2VuZGlmCit9CisKK0ZES19JTkxJTkUgVUlOVCBGREtyZWFkQml0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisjaWZkZWYgT1BUSU1JWkVfRkRLUkVBREJJVFMKKyAgaWYgKCFoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkKKyAgeworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IEZES19nZXQzMiAoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gQ0FDSEVfQklUUzsKKyAgfQorICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZS0tOworCisgIHJldHVybiAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSAmIDE7CisjZWxzZQorIHJldHVybiBGREtyZWFkQml0cyhoQml0U3RyZWFtLDEpOworI2VuZGlmCit9CisKKy8qKgorICogXGJyaWVmIFJlYWQyQml0cyBGdW5jdGlvbiAoZm9yd2FyZCkuIFRoaXMgZnVuY3Rpb24gMiBzZXF1ZW50aWFsCisgKiAgICAgICAgYml0cyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uIEl0IGlzIHRoZSBvcHRpbWl6ZWQgdmVyc2lvbgorICAgICAgICAgIG9mIEZES3JlYWRCaXRzKCkgZm9yIHJlYWRpZ24gMiBiaXRzLgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKKyAqIFxyZXR1cm4KKyAqLworaW5saW5lIFVJTlQgRkRLcmVhZDJCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIFVJTlQgQml0c0luQ2FjaGUgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZTsKKyAgaWYgKEJpdHNJbkNhY2hlIDwgMikgIC8qIENvbXBhcmlzb24gY2hhbmdlZCBmcm9tICdsZXNzLWVxdWFsJyB0byAnbGVzcycgKi8KKyAgeworICAgIGNvbnN0IElOVCBmcmVlQml0cyA9IChDQUNIRV9CSVRTLTEpIC0gQml0c0luQ2FjaGUgOworCisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBmcmVlQml0cykgfCBGREtfZ2V0ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixmcmVlQml0cykgOworICAgIEJpdHNJbkNhY2hlICs9IGZyZWVCaXRzOworICB9CisgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gQml0c0luQ2FjaGUgLSAyOworICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiAweDM7Cit9CisKKy8qKgorICogXGJyaWVmIFJlYWRCaXRzIEZ1bmN0aW9uIChiYWNrd2FyZCkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZiBzZXF1ZW50aWFsIGJpdHMKKyAqICAgICAgICBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uCisgKgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLgorICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKKyAqLworRkRLX0lOTElORSBVSU5UIEZES3JlYWRCaXRzQndkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKK3sKKyAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKworICBpZiAoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPD0gbnVtYmVyT2ZCaXRzKQorICB7CisgICAgY29uc3QgSU5UIGZyZWVCaXRzID0gKENBQ0hFX0JJVFMtMSkgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA7CisKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IGZyZWVCaXRzKSB8IEZES19nZXRCd2QgKCZoQml0U3RyZWFtLT5oQml0QnVmLGZyZWVCaXRzKSA7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gZnJlZUJpdHMgOworICB9CisKKyAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgLT0gbnVtYmVyT2ZCaXRzIDsKKworICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiB2YWxpZE1hc2sgOworfQorCisKKy8qKgorICogXGJyaWVmIHJldHVybiBhIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIGJpdEJ1ZmZlci4KKyAqICAgICAgICBZb3UgaGF2ZSB0byBrbm93IHdoYXQgeW91IGRvISBDYWNoZSBoYXMgdG8gYmUgc3luY2hyb25pemVkIGJlZm9yZSB1c2luZyB0aGlzCisgKiAgICAgICAgZnVuY3Rpb24uCisgKgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gbnVtQml0cyBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLgorICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKKyAqLworRkRLX0lOTElORSBVSU5UIEZES2dldEJpdHMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgbnVtQml0cykKK3sKKyAgICByZXR1cm4gRkRLX2dldCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG51bUJpdHMpIDsKK30KKworCisvKioKKyAqIFxicmllZiBXcml0ZUJpdHMgRnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG51bWJlck9mQml0cyBvZiB2YWx1ZSBpbnRvIGJpdHN0cmVhbS4KKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSB2YWx1ZSAgICAgICAgIFZhcmlhYmxlIGhvbGRzIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqIFxwYXJhbSBudW1iZXJPZkJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSB3cml0dGVuLgorICogXHJldHVybiBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgKi8KK0ZES19JTkxJTkUgVUNIQVIgRkRLd3JpdGVCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKK3sKKyAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKworICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cykgPCBDQUNIRV9CSVRTKQorICB7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzIDsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9ICAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG51bWJlck9mQml0cykgfCAodmFsdWUgJiB2YWxpZE1hc2spOworICB9CisgIGVsc2UKKyAgeworICAgIEZES19wdXQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIDsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IG51bWJlck9mQml0cyA7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAodmFsdWUgJiB2YWxpZE1hc2spIDsKKyAgfQorCisgcmV0dXJuIG51bWJlck9mQml0czsKK30KKworCisvKioKKyAqIFxicmllZiBXcml0ZUJpdHMgRnVuY3Rpb24gKGJhY2t3YXJkKS4gVGhpcyBmdW5jdGlvbiB3cml0ZXMgbnVtYmVyT2ZCaXRzIG9mIHZhbHVlIGludG8gYml0c3RyZWFtLgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIHZhbHVlICAgICAgICAgVmFyaWFibGUgaG9sZHMgZGF0YSB0byBiZSB3cml0dGVuLgorICogXHBhcmFtIG51bWJlck9mQml0cyAgVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHdyaXR0ZW4uCisgKiBccmV0dXJuIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAqLworRkRLX0lOTElORSBVQ0hBUiBGREt3cml0ZUJpdHNCd2QoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQoreworICBjb25zdCBVSU5UIHZhbGlkTWFzayA9IEJpdE1hc2sgW251bWJlck9mQml0c10gOworCisgIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUrbnVtYmVyT2ZCaXRzKSA8PSBDQUNIRV9CSVRTKQorICB7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzIDsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9ICAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG51bWJlck9mQml0cykgfCAodmFsdWUgJiB2YWxpZE1hc2spOworICB9CisgIGVsc2UKKyAgeworICAgIEZES19wdXRCd2QoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIDsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IG51bWJlck9mQml0cyA7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAodmFsdWUgJiB2YWxpZE1hc2spIDsKKyAgfQorCisgcmV0dXJuIG51bWJlck9mQml0czsKK30KKworCisvKioKKyAqIFxicmllZiBTeW5jQ2FjaGUgRnVuY3Rpb24uIENsZWFyIGNhY2hlIGFmdGVyIHJlYWQgZm9yd2FyZC4KKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKKyAqIFxyZXR1cm4gdm9pZAorICovCitGREtfSU5MSU5FIHZvaWQgRkRLc3luY0NhY2hlIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICBpZiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKQorICAgIEZES19wdXNoQmFjayAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUsaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpIDsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX1dSSVRFUiAqLworICAgIEZES19wdXQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIDsKKworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9IDAgOworfQorCisKKy8qKgorICogXGJyaWVmIFN5bmNDYWNoZSBGdW5jdGlvbi4gQ2xlYXIgY2FjaGUgYWZ0ZXIgcmVhZCBiYWNrd2FyZHMuCisgKgorICogXHBhcmFtICBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHJldHVybiB2b2lkCisgKi8KK0ZES19JTkxJTkUgdm9pZCBGREtzeW5jQ2FjaGVCd2QgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIGlmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpIHsKKyAgICBGREtfcHVzaEZvcndhcmQgKCZoQml0U3RyZWFtLT5oQml0QnVmLGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlLGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKSA7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX1dSSVRFUiAqLworICAgIEZES19wdXRCd2QgKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSA7CisgIH0KKworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9IDAgOworfQorCisKKy8qKgorICogXGJyaWVmIEJ5dGUgQWxpZ25tZW50IEZ1bmN0aW9uLgorICogICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGJ5dGVfYWxpZ25tZW50KCkgc3ludGFjdGljIGZ1bmN0aW9uIG9uIHRoZSBpbnB1dCBzdHJlYW0sCisgKiAgICAgICAgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQvcGFkZGVkIHNvIHRoYXQgdGhlIG5leHQgYml0cyB0byBiZSByZWFkL3dyaXR0ZW4gd2lsbAorICogICAgICAgIGJlIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgYml0IHBvc2l0aW9uIDAuCisgKgorICogXHBhcmFtICBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHJldHVybiB2b2lkCisgKi8KK0ZES19JTkxJTkUgdm9pZCBGREtieXRlQWxpZ24gKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOworICBGREtfYnl0ZUFsaWduICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgKFVDSEFSKWhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKSA7Cit9CisKKworLyoqCisgKiBcYnJpZWYgQnl0ZSBBbGlnbm1lbnQgRnVuY3Rpb24gd2l0aCBhbmNob3IKKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBieXRlX2FsaWdubWVudCgpIHN5bnRhY3RpYyBmdW5jdGlvbiBvbiB0aGUgaW5wdXQgc3RyZWFtLAorICogICAgICAgIGkuZS4gc29tZSBiaXRzIHdpbGwgYmUgZGlzY2FyZGVkIHNvIHRoYXQgdGhlIG5leHQgYml0cyB0byBiZSByZWFkL3dyaXR0ZW4gd291bGQgYmUgYWxpZ25lZAorICogICAgICAgIG9uIGEgYnl0ZSBib3VuZGFyeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGdpdmVuIGFsaWdubWVudCBhbmNob3IuCisgKgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gYWxpZ25tZW50QW5jaG9yIGJpdCBwb3NpdGlvbiB0byBiZSBjb25zaWRlcmVkIGFzIG9yaWdpbiBmb3IgYnl0ZSBhbGlnbm1lbnQKKyAqIFxyZXR1cm4gdm9pZAorICovCitGREtfSU5MSU5FIHZvaWQgRkRLYnl0ZUFsaWduIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIGFsaWdubWVudEFuY2hvcikKK3sKKyAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7CisgIGlmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpIHsKKyAgICBGREtfcHVzaEZvcndhcmQgKCZoQml0U3RyZWFtLT5oQml0QnVmLAorICAgICAgICAgICAgICAgICAgICAgKDggLSAoKGFsaWdubWVudEFuY2hvciAtIEZES19nZXRWYWxpZEJpdHMoJmhCaXRTdHJlYW0tPmhCaXRCdWYpKSAmIDB4MDcpKSAmIDB4MDcsCisgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSkgOworICB9CisgIGVsc2UgeworICAgIEZES19wdXQgKCZoQml0U3RyZWFtLT5oQml0QnVmLAorICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgKDggLSAoKEZES19nZXRWYWxpZEJpdHMoJmhCaXRTdHJlYW0tPmhCaXRCdWYpLWFsaWdubWVudEFuY2hvcikgJiAweDA3KSkgJiAweDA3ICk7CisgIH0KK30KKworCisvKioKKyAqIFxicmllZiBQdXNoIEJhY2soQ2FjaGUpIC8gRm9yIC8gQmlEaXJlY3Rpb25hbCBGdW5jdGlvbi4KKyAqICAgICAgICBQdXNoQmFja0NhY2hlIGZ1bmN0aW9uIHVuZ2V0cyBhIG51bWJlciBvZiBiaXRzIGVycm9uZW91c2x5IHJlYWQvd3JpdHRlbiBieSB0aGUgbGFzdCBHZXQoKSBjYWxsLgorICogICAgICAgTkI6IFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBzdHVmZmVkIGJhY2sgaW50byB0aGUgc3RyZWFtIG1heSBuZXZlciBleGNlZWQgdGhlCisgKiAgICAgICBudW1iZXIgb2YgYml0cyByZXR1cm5lZCBieSB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIEdldCgpIGNhbGwuCisgKgorICogICAgICAgUHVzaEJhY2sgZnVuY3Rpb24gdW5nZXRzIGEgbnVtYmVyIG9mIGJpdHMgKGNvbWJpbmVzIGNhY2hlIGFuZCBiaXRidWZmZXIgaW5kaWNlcykKKyAqICAgICAgIFB1c2hGb3IgIGZ1bmN0aW9uIGdldHMgYSBudW1iZXIgb2YgYml0cyAoY29tYmluZXMgY2FjaGUgYW5kIGJpdGJ1ZmZlciBpbmRpY2VzKQorICogICAgICAgUHVzaEJpRGlyZWN0aW9uYWwgZ2V0cy91bmdldHMgbnVtYmVyIG9mIGJpdHMgYXMgZGVmaW5lZCBpbiBQdXNCYWNrL0ZvciBmdW5jdGlvbgorICogICAgICAgTkI6IFRoZSBzaWduIG9mIGJpdHMgaXMgbm90IGtub3duLCBzbyB0aGUgZnVuY3Rpb24gY2hlY2tzIGRpcmVjdGlvbiBhbmQgY2FsbHMKKyAqICAgICAgICBhcHByb3ByaWF0ZSBmdW5jdGlvbi4gKHBvc2l0aXZlIHNpZ24gcHVzaEZvciwgbmVnYXRpdmUgc2lnbiBwdXNoQmFjayApCisgKgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcHVzaGVkIGJhY2svZm9yLgorICogXHJldHVybiB2b2lkCisgKi8KK0ZES19JTkxJTkUgdm9pZCBGREtwdXNoQmFja0NhY2hlIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKK3sKKyAgRkRLX0FTU0VSVCAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8PUNBQ0hFX0JJVFMpOworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOworfQorCitGREtfSU5MSU5FIHZvaWQgRkRLcHVzaEJhY2sgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQoreworICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8Q0FDSEVfQklUUyAmJiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSApIHsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7IC8qIHN5bmMgY2FjaGUgdG8gYXZvaWQgaW52YWxpZCBjYWNoZSAqLworICB9CisgIGVsc2UgeworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7CisgICAgRkRLX3B1c2hCYWNrKCZoQml0U3RyZWFtLT5oQml0QnVmLG51bWJlck9mQml0cyxoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CisgIH0KK30KKworRkRLX0lOTElORSB2b2lkIEZES3B1c2hGb3IgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQoreworICBpZiAoIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZT5udW1iZXJPZkJpdHMpICYmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpICkgeworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKKyAgfQorICBlbHNlIHsKKyAgICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSkgOworICAgIEZES19wdXNoRm9yd2FyZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixudW1iZXJPZkJpdHMsaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOworICB9Cit9CisKK0ZES19JTkxJTkUgdm9pZCBGREtwdXNoQmlEaXJlY3Rpb25hbCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgY29uc3QgSU5UIG51bWJlck9mQml0cykKK3sKKyAgaWYobnVtYmVyT2ZCaXRzPj0wKSAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBudW1iZXJPZkJpdHMpIDsKKyAgZWxzZSAgICAgICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJpdFN0cmVhbSwgLW51bWJlck9mQml0cykgOworfQorCisKKy8qKgorICogXGJyaWVmIEdldFZhbGlkQml0cyBGdW5jdGlvbi4gIENsZWFyIGNhY2hlIGFuZCByZXR1cm4gdmFsaWQgQml0cyBmcm9tIEJpdGJ1ZmZlci4KKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHJldHVybiBhbW91bnQgb2YgdmFsaWQgYml0cyB0aGF0IHN0aWxsIGNhbiBiZSByZWFkIG9yIHdlcmUgYWxyZWFkeSB3cml0dGVuLgorICoKKyAqLworRkRLX0lOTElORSBVSU5UIEZES2dldFZhbGlkQml0cyAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKK3sKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pIDsKKyAgcmV0dXJuIEZES19nZXRWYWxpZEJpdHMoJmhCaXRTdHJlYW0tPmhCaXRCdWYpIDsKK30KKworCisvKioKKyAqIFxicmllZiByZXR1cm4gYW1vdW50IG9mIHVudXNlZCBCaXRzIGZyb20gQml0YnVmZmVyLgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccmV0dXJuIGFtb3VudCBvZiBmcmVlIGJpdHMgdGhhdCBzdGlsbCBjYW4gYmUgd3JpdHRlbiBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqLworRkRLX0lOTElORSBJTlQgRkRLZ2V0RnJlZUJpdHMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgICByZXR1cm4gRkRLX2dldEZyZWVCaXRzICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZikgOworfQorCisvKioKKyAqIFxicmllZiByZXNldCBiaXRjb3VudGVyIGluIGJpdEJ1ZmZlciB0byB6ZXJvLgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccmV0dXJuIHZvaWQKKyAqLworRkRLX0lOTElORSB2b2lkIEZES3Jlc2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoreworICAgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOworICAgIEZES19zZXRCaXRDbnQgKCZoQml0U3RyZWFtLT5oQml0QnVmLCAwKSA7Cit9CisKKy8qKgorICogXGJyaWVmIHNldCBiaXRjb3V0bmVyIGluIGJpdEJ1ZmZlciB0byBnaXZlbiB2YWx1ZS4KKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIHZhbHVlIG5ldyB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYml0IGNvdW50ZXIKKyAqIFxyZXR1cm4gdm9pZAorICovCitGREtfSU5MSU5FIHZvaWQgRkRLc2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIHZhbHVlKQoreworICAgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOworICAgIEZES19zZXRCaXRDbnQgKCZoQml0U3RyZWFtLT5oQml0QnVmLCB2YWx1ZSkgOworfQorCisvKioKKyAqIFxicmllZiBnZXQgYml0Y291bnRlciBzdGF0ZSBmcm9tIGJpdEJ1ZmZlci4KKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHJldHVybiBjdXJyZW50IGJpdCBjb3VudGVyIHZhbHVlCisgKi8KK0ZES19JTkxJTkUgSU5UICBGREtnZXRCaXRDbnQgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgICAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pIDsKKyAgICByZXR1cm4gRkRLX2dldEJpdENudCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZikgOworfQorCisKKy8qKgorICogXGJyaWVmIEZpbGwgdGhlIEJpdEJ1ZmZlciB3aXRoIGEgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGZyb20gIGV4dGVybmFsIHNvdXJjZS4KKyAqICAgICAgICBUaGUgYnl0ZXNWYWxpZCB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmFtYWluaW5nIHZhbGlkIGJ5dGVzIGluIGV4dGVybiBpbnB1dEJ1ZmZlci4KKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gaW5wdXRCdWZmZXIgUG9pbnRlciB0byBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YS4KKyAqIFxwYXJhbSBidWZmZXJTaXplICBUb3RhbCBzaXplIG9mIGlucHV0QnVmZmVyIGFycmF5LgorICogXHBhcmFtIGJ5dGVzVmFsaWQgIElucHV0OiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gaW5wdXRCdWZmZXIuIE91dHB1dDogYnl0ZXMgc3RpbGwgbGVmdCB1bnJlYWQgaW4gaW5wdXRCdWZmZXIuCisgKiBccmV0dXJuIHZvaWQKKyAqLworRkRLX0lOTElORSB2b2lkIEZES2ZlZWRCdWZmZXIgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVDSEFSIGlucHV0QnVmZmVyIFtdLCBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpCit7CisgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOworICBGREtfRmVlZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgKFVDSEFSKilpbnB1dEJ1ZmZlciwgYnVmZmVyU2l6ZSwgYnl0ZXNWYWxpZCAgKSA7Cit9CisKKworLyoqCisgKiBcYnJpZWYgZmlsbCBkZXN0aW5hdGlvbiBCaXRCdWZmZXIgd2l0aCBhIG51bWJlciBvZiBieXRlcyBmcm9tIHNvdXJjZSBCaXRCdWZmZXIuIFRoZQorICogICAgICAgIGJ5dGVzVmFsaWQgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJhbWFpbmluZyB2YWxpZCBieXRlcyBpbiBzb3VyY2UgQml0QnVmZmVyLgorICoKKyAqIFxwYXJhbSBoQlNEc3QgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUgdG8gd3JpdGUgZGF0YSBpbnRvCisgKiBccGFyYW0gaEJTU3JjICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlIHRvIHJlYWQgZGF0YSBmcm9tCisgKiBccGFyYW0gYnl0ZXNWYWxpZCAgICAgICAgSW5wdXQ6IG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBpbnB1dEJ1ZmZlci4gT3V0cHV0OiBieXRlcyBzdGlsbCBsZWZ0IHVucmVhZCBpbiBpbnB1dEJ1ZmZlci4KKyAqIFxyZXR1cm4gdm9pZAorICovCitGREtfSU5MSU5FIHZvaWQgRkRLY29weUJ1ZmZlciAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJTRHN0LCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQlNTcmMsIFVJTlQgKmJ5dGVzVmFsaWQpCit7CisgIEZES3N5bmNDYWNoZSAoaEJTU3JjKSA7CisgIEZES19Db3B5ICgmaEJTRHN0LT5oQml0QnVmLCAmaEJTU3JjLT5oQml0QnVmLCBieXRlc1ZhbGlkKSA7Cit9CisKKworLyoqCisgKiBcYnJpZWYgZmlsbCB0aGUgb3V0cHV0QnVmZmVyIHdpdGggYWxsIHZhbGlkIGJ5dGVzIGhvbGQgaW4gQml0QnVmZmVyLiBUaGUgV3JpdGVCeXRlcworICogICAgICAgIHZhcmlhYmxlIHJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIEJ5dGVzLgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIG91dHB1dEJ1ZmZlciAgUG9pbnRlciB0byBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHdyaXRlQnl0ZXMgICAgTnVtYmVyIG9mIGJ5dGVzIHdyaXRlIHRvIG91dHB1dCBidWZmZXIuCisgKiBccmV0dXJuIHZvaWQKKyAqLworRkRLX0lOTElORSB2b2lkIEZES2ZldGNoQnVmZmVyKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVDSEFSICpvdXRwdXRCdWZmZXIsIFVJTlQgKndyaXRlQnl0ZXMpCit7CisgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOworICBGREtfRmV0Y2goJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG91dHB1dEJ1ZmZlciwgd3JpdGVCeXRlcyk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2NvcmUuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9GREtfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTZhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2NvcmUuaApAQCAtMCwwICsxLDEwOSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBGREsgdG9vbHMgdmVyc2lvbmluZyBzdXBwb3J0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGREtfQ09SRV9ICisjZGVmaW5lIEZES19DT1JFX0gKKworI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAYnJpZWYgR2V0IEZES190b29scyBsaWJyYXJ5IGluZm9ybWF0aW9uLgorICogIEByZXR1cm4gICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3Jjb2RlIG9uIGZhaWx1cmUgKHNlZSBlcnJvcmNvZGVzLmgpLgorICovCitpbnQgRkRLX3Rvb2xzR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL0ZES19jcmMuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9GREtfY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmZWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9GREtfY3JjLmgKQEAgLTAsMCArMSwyMzEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOgorICAgY29udGVudHMvZGVzY3JpcHRpb246IENSQyBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkRLX0NSQ19ICisjZGVmaW5lIEZES19DUkNfSAorCisKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworCisjZGVmaW5lIE1BWF9DUkNfUkVHUyAzICAgIC8qITwgTWF4aW1hbCBudW1iZXIgb2Ygb3ZlcmxhcHBpbmcgY3JjIHJlZ2lvbiBpbiBBRFRTIGNoYW5uZWwgcGFpciBlbGVtZW50IGlzIHR3by4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhyZWUgaW5kZXBlbmRlbnQgcmVnaW9ucyBwcmV2ZW50aXZlbHkuICovCisKKy8qKgorICogIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBzaW5nbGUgY3JjIHJlZ2lvbiB1c2VkIGZvciBjcmMgY2FsY3VsYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIFVDSEFSIGlzQWN0aXZlOworICBJTlQgICBtYXhCaXRzOworICBVSU5UICBiaXRCdWZDbnRCaXRzOworICBVSU5UICB2YWxpZEJpdHM7CisKK30gQ0NyY1JlZ0RhdGE7CisKKy8qKgorICogIENSQyBpbmZvIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQ3JjUmVnRGF0YSAgY3JjUmVnRGF0YVtNQVhfQ1JDX1JFR1NdOyAgIC8qITwgTXVsdGlwbGUgY3JjIHJlZ2lvbiBkZXNjcmlwdGlvbi4gKi8KKyAgICBjb25zdCBVU0hPUlQgICAgICAgKnBDcmNMb29rdXA7ICAgICAgICAgIC8qITwgUG9pbnRlciB0byBsb29rdXAgdGFibGUgZmlsbGVkIGluIEZES19jcmNJbml0KCkuICovCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgIGNyY1BvbHk7ICAgICAgICAgICAgIC8qITwgQ1JDIGdlbmVyYXRvciBwb2x5bm9tLiAqLworICAgIFVTSE9SVCAgICAgICAgICAgICAgY3JjTWFzazsgICAgICAgICAgICAgLyohPCBDUkMgbWFzay4gKi8KKyAgICBVU0hPUlQgICAgICAgICAgICAgIHN0YXJ0VmFsdWU7ICAgICAgICAgIC8qITwgQ1JDIHN0YXJ0IHZhbHVlLiAqLworICAgIFVDSEFSICAgICAgICAgICAgICAgY3JjTGVuOyAgICAgICAgICAgICAgLyohPCBDUkMgbGVuZ3RoLiAqLworCisgICAgVUlOVCAgICAgICAgICAgICAgICByZWdTdGFydDsgICAgICAgICAgICAvKiE8IFN0YXJ0IHJlZ2lvbiBtYXJrZXIgZm9yIHN5bmNocm9uaXphdGlvbi4gKi8KKyAgICBVSU5UICAgICAgICAgICAgICAgIHJlZ1N0b3A7ICAgICAgICAgICAgIC8qITwgU3RvcCByZWdpb24gbWFya2VyIGZvciBzeW5jaHJvbml6YXRpb24uICovCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgIGNyY1ZhbHVlOyAgICAgICAgICAgIC8qITwgQ3JjIHZhbHVlIHRvIGJlIGNhbGN1bGF0ZWQuICovCisKK30gRkRLX0NSQ0lORk87CisKKy8qKgorICogIENSQyBpbmZvIGhhbmRsZS4KKyAqLwordHlwZWRlZiBGREtfQ1JDSU5GTyogSEFORExFX0ZES19DUkNJTkZPOworCisKKy8qKgorICogXGJyaWVmICBJbml0aWFsaXplIENSQyBzdHJ1Y3R1cmUuCisgKgorICogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIGV4aXN0aW5nIGNyYyBpbmZvIHN0cnVjdHVyZSB3aXRoIGRlbm90ZWQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBjcmNQb2x5ICAgICAgICAgICAgICAgQ29uZmlndXJlIGNyYyBwb2x5bm9tLgorICogXHBhcmFtIGNyY1N0YXJ0VmFsdWUgICAgICAgICBDb25maWd1cmUgY3JjIHN0YXJ0IHZhbHVlLgorICogXHBhcmFtIGNyY0xlbiAgICAgICAgICAgICAgICBDb25maWd1cmUgY3JjIGxlbmd0aC4KKyAqCisgKiBccmV0dXJuICBub25lCisgKi8KK3ZvaWQgRkRLY3JjSW5pdCgKKyAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY1N0YXJ0VmFsdWUsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjTGVuCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICBSZXNldCBDUkMgaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgYWxsIGludGVybiBzdGF0ZXMgb2YgdGhlIGNyYyBzdHJ1Y3R1cmUuCisgKgorICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGNyYyBpbmZvIHN0dWN0dXJlLgorICoKKyAqIFxyZXR1cm4gIG5vbmUKKyAqLwordm9pZCBGREtjcmNSZXNldCgKKyAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbworICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmICBTdGFydCBDUkMgcmVnaW9uIHdpdGggbWF4aW11bSBudW1iZXIgb2YgYml0cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1hcmtzIHBvc2l0aW9uIGluIGJpdHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0YXJ0IHBvaW50IGZvciBjcmMgY2FsY3VsYXRpb24uCisgKiBCaXRzdHJlYW0gcmFuZ2UgZm9yIGNyYyBjYWxjdWxhdGlvbiBjYW4gYmUgbGltaXRlZCBvciBrZXB0IGR5bmFtaWMgZGVwZW5kaW5nIG9uIG1CaXRzIHBhcmFtZXRlci4KKyAqIFRoZSBjcmMgcmVnaW9uIGhhcyB0byBiZSB0ZXJtaW5hdGVkIHdpdGggRkRLY3JjRW5kUmVnKCkgaW4gZWFjaCBjYXNlLgorICoKKyAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBjcmMgaW5mbyBzdHVjdHVyZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgorICogXHBhcmFtIG1CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIHRvIGJlIGNhbGN1bGF0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbUJpdHMgPiAwOiBaZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1CaXRzIDwgMDogTm8gemVybyBwYWRkaW5nIGlzIGRvbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbUJpdHMgPSAwOiBUaGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBjcmMgY2FsY3VsYXRpb24gaXMgZHluYW1pY2FsbHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gYml0c3RyZWFtIHBvc2l0aW9uIGJldHdlZW4gRkRLY3JjU3RhcnRSZWcoKSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2NyY0VuZFJlZygpIGNhbGwuCisgKgorICogXHJldHVybiAgSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitJTlQgRkRLY3JjU3RhcnRSZWcoCisgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCisgICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEVuZHMgQ1JDIHJlZ2lvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgY3JjIHJlZ2lvbiBzcGVjaWZpZWQgd2l0aCBGREtjcmNTdGFydFJlZygpLiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiBkZXBlbmRzCisgKiBvbiBtQml0cyBwYXJhbWV0ZXIgb2YgRkRLY3JjU3RhcnRSZWcoKS4KKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjcmMgaW4gaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGNyYyBpbmZvIHN0dWN0dXJlLgorICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gcmVnICAgICAgICAgICAgICAgICAgIENyYyByZWdpb24gSUQgY3JlYXRlZCBpbiBGREtjcmNTdGFydFJlZygpLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2VzcworICovCitJTlQgRkRLY3JjRW5kUmVnKAorICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAorICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgIGhCcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICByZWcKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNyYyB2YWx1ZSBmcm9tIGluZm8gc3RydWN0LgorICoKKyAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBjcmMgaW5mbyBzdHVjdHVyZS4KKyAqCisgKiBccmV0dXJuICBDUkMgdmFsdWUgbWFza2VkIHdpdGggY3JjIGxlbmd0aC4KKyAqLworVVNIT1JUIEZES2NyY0dldENSQygKKyAgICAgICAgY29uc3QgSEFORExFX0ZES19DUkNJTkZPICAgICAgICBoQ3JjSW5mbworICAgICAgICApOworCisKKyNlbmRpZiAvKiBGREtfQ1JDX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9GREtfaHlicmlkLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2h5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjJkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX2h5YnJpZC5oCkBAIC0wLDAgKzEsMjczIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogTWFya3VzIExvaHdhc3NlcgorICAgRGVzY3JpcHRpb246IEZESyBUb29scyBIeWJyaWQgRmlsdGVyYmFuaworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19GREtfSFlCUklEX0gKKyNkZWZpbmUgX19GREtfSFlCUklEX0gKKworCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tIGVudW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEh5YnJpZCBGaWx0ZXJiYW5kIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIFRIUkVFX1RPX1RFTiwKKyAgICBUSFJFRV9UT19UV0VMVkUsCisgICAgVEhSRUVfVE9fU0lYVEVFTgorCit9IEZES19IWUJSSURfTU9ERTsKKworCisvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IEZES19IWUJSSURfU0VUVVAgKkhBTkRMRV9GREtfSFlCUklEX1NFVFVQOworCit0eXBlZGVmIHN0cnVjdAoreworICBGSVhQX0RCTCAgICAgICAgICAgICAqYnVmZmVyTEZSZWFsWzNdOyAgICAgLyohPCBMRiByZWFsIGZpbHRlciBzdGF0ZXMuICovCisgIEZJWFBfREJMICAgICAgICAgICAgICpidWZmZXJMRkltYWdbM107ICAgICAvKiE8IExGIGltYWcgZmlsdGVyIHN0YXRlcy4gKi8KKyAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckhGUmVhbFsxM107ICAgIC8qITwgSEYgcmVhbCBkZWxheSBsaW5lcy4gKi8KKyAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckhGSW1hZ1sxM107ICAgIC8qITwgSEYgaW1hZyBkZWxheSBsaW5lcy4gKi8KKworICBJTlQgICAgICAgICAgICAgICAgICAgYnVmZmVyTEZwb3M7ICAgICAgICAgLyohPCBQb3NpdGlvbiB0byB3cml0ZSBpbmNvbWluZyBkYXRhIGludG8gcmluZ2J1ZmZlci4gKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhGcG9zOyAgICAgICAgIC8qITwgRGVsYXkgbGluZSBwb3NpdGlvbmluZy4gKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgIG5yQmFuZHM7ICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcy4gKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgIGNwbHhCYW5kczsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCisgIFVDSEFSICAgICAgICAgICAgICAgICBoZk1vZGU7ICAgICAgICAgICAgICAvKiE8IEZsYWcgc2lnbmFsaXplcyB0cmVhdG1lbnQgb2YgSEYgYmFuZHMuICovCisKKyAgRklYUF9EQkwgICAgICAgICAgICAgKnBMRm1lbW9yeTsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBMRiBzdGF0ZXMgYnVmZmVyLiAqLworICBGSVhQX0RCTCAgICAgICAgICAgICAqcEhGbWVtb3J5OyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIEhGIHN0YXRlcyBidWZmZXIuICovCisKKyAgVUlOVCAgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZTsgICAgICAgIC8qITwgU2l6ZSBvZiBMRiBzdGF0ZXMgYnVmZmVyLiAqLworICBVSU5UICAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplOyAgICAgICAgLyohPCBTaXplIG9mIEhGIHN0YXRlcyBidWZmZXIuICovCisKKyAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgcFNldHVwOyAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc2V0dXAuICovCisKK30gRkRLX0FOQV9IWUJfRklMVEVSOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIElOVCAgICAgICAgICAgICAgICAgICBuckJhbmRzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMuICovCisgIElOVCAgICAgICAgICAgICAgICAgICBjcGx4QmFuZHM7ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb21wbGV4IFFNRiBiYW5kcy4qLworCisgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLworCit9IEZES19TWU5fSFlCX0ZJTFRFUjsKKwordHlwZWRlZiBGREtfQU5BX0hZQl9GSUxURVIgKkhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVI7Cit0eXBlZGVmIEZES19TWU5fSFlCX0ZJTFRFUiAqSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUjsKKworCisvKioKKyAqIFxicmllZiAgQ3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBIeWJyaWQgQW5hbHlpcyBGaWx0ZXJiYW5rLgorICoKKyAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBwTEZtZW1vcnkgICAgICAgICAgIFBvaW50ZXIgdG8gb3V0bHlpbmcgYnVmZmVyIHVzZWQgTEYgZmlsdGVyaW5nLgorICogXHBhcmFtIExGbWVtb3J5U2l6ZSAgICAgICAgU2l6ZSBvZiBwTEZtZW1vcnkgaW4gYnl0ZXMuCisgKiBccGFyYW0gcEhGbWVtb3J5ICAgICAgICAgICBQb2ludGVyIHRvIG91dGx5aW5nIGJ1ZmZlciB1c2VkIEhGIGRlbGF5IGxpbmUuCisgKiBccGFyYW0gSEZtZW1vcnlTaXplICAgICAgICBTaXplIG9mIHBMRm1lbW9yeSBpbiBieXRlcy4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtoeWJyaWRBbmFseXNpc09wZW4oCisgICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcExGbWVtb3J5LAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBMRm1lbW9yeVNpemUsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBIRm1lbW9yeSwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBIeWJyZGlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIGhBbmFseXNpc0h5YkZpbHRlciAgQSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBoYW5kbGUuCisgKiBccGFyYW0gbW9kZSAgICAgICAgICAgICAgICBTZWxlY3QgaHlicmlkIGZpbHRlciBjb25maWd1cmF0aW9uLgorICogXHBhcmFtIHFtZkJhbmRzICAgICAgICAgICAgTnVtYmVyIG9mIHFtZiBiYW5kcyB0byBiZSBwcm9jZXNzZWQuCisgKiBccGFyYW0gY3BseEJhbmRzICAgICAgICAgICBOdW1iZXIgb2YgY29tcGxleCBxbWYgYmFuZHMgdG8gYmUgcHJvY2Vzc2VkLgorICogXHBhcmFtIGluaXRTdGF0ZXNGbGFnICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0YXRlcyBidWZmZXIgaGFzIHRvIGJlIGNsZWFyZWQuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitJTlQgRkRLaHlicmlkQW5hbHlzaXNJbml0KAorICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGluaXRTdGF0ZXNGbGFnCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEFkanVzdCBIeWJyZGlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgc3RhdGVzLgorICoKKyAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIEEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgorICogXHBhcmFtIHNjYWxpbmdWYWx1ZSAgICAgICAgU2NhbGluZyB2YWx1ZSB0byBiZSBhcHBsaWVkIG9uIGZpbHRlciBzdGF0ZXMuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitJTlQgRkRLaHlicmlkQW5hbHlzaXNTY2FsZVN0YXRlcygKKyAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzY2FsaW5nVmFsdWUKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgQXBwbHkgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgb24gUW1mIGlucHV0IGRhdGEuCisgKgorICogXHBhcmFtIGhBbmFseXNpc0h5YkZpbHRlciAgQSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBoYW5kbGUuCisgKiBccGFyYW0gcFFtZlJlYWwgICAgICAgICAgICBRbWYgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBwUW1mSW1hZyAgICAgICAgICAgIFFtZiBpbnB1dCBkYXRhLgorICogXHBhcmFtIHBIeWJyaWRSZWFsICAgICAgICAgSHlicmlkIG91dHB1dCBkYXRhLgorICogXHBhcmFtIHBIeWJyaWRJbWFnICAgICAgICAgSHlicmlkIG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KKyAqLworSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCisgICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSHlicmlkUmVhbCwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZEltYWcKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgQ2xvc2UgYSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KKyAqCisgKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBQb2ludGVyIHRvIGEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitJTlQgRkRLaHlicmlkQW5hbHlzaXNDbG9zZSgKKyAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgSHlicmRpZCBTeW50aGVzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KKyAqCisgKiBccGFyYW0gaFN5bnRoZXNpc0h5YkZpbHRlciBBIEh5YnJpZCBTeW50aGVzaXMgRmlsdGVyYmFuayBoYW5kbGUuCisgKiBccGFyYW0gbW9kZSAgICAgICAgICAgICAgICBTZWxlY3QgaHlicmlkIGZpbHRlciBjb25maWd1cmF0aW9uLgorICogXHBhcmFtIHFtZkJhbmRzICAgICAgICAgICAgTnVtYmVyIG9mIHFtZiBiYW5kcyB0byBiZSBwcm9jZXNzZWQuCisgKiBccGFyYW0gY3BseEJhbmRzICAgICAgICAgICBOdW1iZXIgb2YgY29tcGxleCBxbWYgYmFuZHMgdG8gYmUgcHJvY2Vzc2VkLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KKyAqLworSU5UIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoCisgICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCisgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIG9uIEh5YnJpZCBkYXRhLgorICoKKyAqIFxwYXJhbSBoU3ludGhlc2lzSHliRmlsdGVyICBBIEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5kayBoYW5kbGUuCisgKiBccGFyYW0gcEh5YnJpZFJlYWwgICAgICAgICAgSHlicmlkIGlucHV0IGRhdGEuCisgKiBccGFyYW0gcEh5YnJpZEltYWcgICAgICAgICAgSHlicmlkIGlucHV0IGRhdGEuCisgKiBccGFyYW0gcFFtZlJlYWwgICAgICAgICAgICAgUW1mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIHBRbWZJbWFnICAgICAgICAgICAgIFFtZiBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtoeWJyaWRTeW50aGVzaXNBcHBseSgKKyAgICAgICAgSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiAgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZFJlYWwsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBIeWJyaWRJbWFnLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwUW1mUmVhbCwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZkltYWcKKyAgICAgICAgKTsKKworCisjZW5kaWYgLyogX19GREtfSFlCUklEX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9GREtfdG9vbHNfcm9tLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX3Rvb2xzX3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjFjODEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX3Rvb2xzX3JvbS5oCkBAIC0wLDAgKzEsMjcwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgT2xpdmVyIE1vc2VyCisgICBEZXNjcmlwdGlvbjogUk9NIHRhYmxlcyB1c2VkIGJ5IEZESyB0b29scworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19GREtfVE9PTFNfUk9NX0hfXworI2RlZmluZSBfX0ZES19UT09MU19ST01fSF9fCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKworLyogTm9uZSByYWRpeDIgcm90YXRpb24gdmVjdG9ycyAqLworZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw2MFs2MF07CitleHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzYwWzYwXTsKK2V4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjQwWzI0MF07CitleHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzI0MFsyNDBdOworZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0ODBbNDgwXTsKK2V4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDgwWzQ4MF07CisKKworLyogUmVndWxhciBzaW5lIHRhYmxlcyAqLworZXh0ZXJuIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTUxMltdOworZXh0ZXJuIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTQ4MFtdOworCisvKiBBQUMtTEMgd2luZG93cyAqLworZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMDI0W107CitleHRlcm4gY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTAyNFtdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjhbXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjhbXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c5NjBbXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c5NjBbXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTIwW107CitleHRlcm4gY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTIwW107CisKKy8qIEFBQy1MRCB3aW5kb3dzICovCitleHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzUxMltdOworI2RlZmluZSBMb3dPdmVybGFwV2luZG93NTEyIFNpbmVXaW5kb3cxMjgKK2V4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDgwW107CisjZGVmaW5lIExvd092ZXJsYXBXaW5kb3c0ODAgU2luZVdpbmRvdzEyMAorCisKKworZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c2NFtdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3czMltdOworCisvKioKKyAqIFxicmllZiBIZWxwZXIgdGFibGUgZm9yIHdpbmRvdyBzbG9wZSBtYXBwaW5nLiBZb3Ugc2hvdWxkIHByZWZlciB0aGUgdXNhZ2Ugb2YgdGhlCisgKiBmdW5jdGlvbiBGREtnZXRXaW5kb3dTbG9wZSgpLCB0aGlzIHRhYmxlIGlzIG9ubHkgbWFkZSBwdWJsaWMgZm9yIHNvbWUgb3B0aW1pemVkCisgKiBhY2Nlc3MgaW5zaWRlIGRjdC5jcHAuCisgKi8KK2V4dGVybiBjb25zdCBGSVhQX1dUUCAqY29uc3Qgd2luZG93U2xvcGVzWzJdWzNdWzldOworCisvKioKKyAqIFxicmllZiBXaW5kb3cgc2xvcGUgYWNjZXNzIGhlbHBlci4gT2J0YWluIGEgd2luZG93IG9mIGdpdmVuIGxlbmd0aCBhbmQgc2hhcGUuCisgKiBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgd2luZG93IHNsb3BlLgorICogXHBhcmFtIHNoYXBlIFNoYXBlIGluZGV4IG9mIHRoZSB3aW5kb3cgc2xvcGUuIDA6IHNpbmUgd2luZG93LCAxOiBLYWlzZXItQmVzc2VsLiBBbnkgb3RoZXIKKyAqICAgICAgICAgICAgICB2YWx1ZSBpcyBhcHBsaWVkIGEgbWFzayBvZiAxIHRvLCBtYXBwaW5nIGl0IHRvIGVpdGhlciAwIG9yIDEuCisgKiBccGFyYW0gUG9pbnRlciB0byB3aW5kb3cgc2xvcGUgb3IgTlVMTCBpZiB0aGUgcmVxdWVzdGVkIHdpbmRvdyBzbG9wZSBpcyBub3QgYXZhaWxhYmxlLgorICovCitjb25zdCBGSVhQX1dUUCAqIEZES2dldFdpbmRvd1Nsb3BlKGludCBsZW5ndGgsIGludCBzaGFwZSk7CisKK2V4dGVybiBjb25zdCBGSVhQX1dUUCBzaW5fdHdpZGRsZV9MNjRbXTsKKworLyoKKyAqIEZpbHRlciBjb2VmZmljaWVudCB0eXBlIGRlZmluaXRpb24KKyAqLworCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzE2eDE2KSB8fCBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCisgICNkZWZpbmUgUU1GX0NPRUZGXzE2QklUCisjZW5kaWYKKworI2RlZmluZSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFICAgIDY0MAorI2RlZmluZSBRTUZfTk9fUE9MWSAgICAgICAgICAgICAgICAgIDUKKworI2lmZGVmIFFNRl9DT0VGRl8xNkJJVAorICAjZGVmaW5lIEZJWFBfUEZUIEZJWFBfU0dMCisgICNkZWZpbmUgRklYUF9RVFcgRklYUF9TR0wKKyNlbHNlCisgICNkZWZpbmUgRklYUF9QRlQgRklYUF9EQkwKKyAgI2RlZmluZSBGSVhQX1FUVyBGSVhQX0RCTAorI2VuZGlmCisKKyNkZWZpbmUgUU1GNjQwX1BGVF9UQUJMRV9TSVpFICAgICAgICg2NDAvMiArIFFNRl9OT19QT0xZKQorCitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJbMzJdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjMyWzMyXTsKKy8qIEFkYXB0ZWQgYW5hbHlzaXMgcG9zdC10d2lkZGxlcyBmb3IgZG93bi1zYW1wbGVkIEhRIFNCUiAqLworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2Nvc19kb3duc2FtcDMyWzMyXTsKK2V4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW5fZG93bnNhbXAzMlszMl07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNjRbNjRdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjY0WzY0XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfUEZUIHFtZl82NFtRTUY2NDBfUEZUX1RBQkxFX1NJWkUrUU1GX05PX1BPTFldOworCisKKworCisKKyNkZWZpbmUgUU1GNjQwX0NMREZCX1BGVF9UQUJMRV9TSVpFICg2NDApCisjZGVmaW5lIFFNRjMyMF9DTERGQl9QRlRfVEFCTEVfU0laRSAoMzIwKQorI2RlZmluZSBRTUZfQ0xERkJfUEZUX1NDQUxFIDEKKworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiWzMyXTsKK2V4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMl9jbGRmYlszMl07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNjRfY2xkZmJbNjRdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjY0X2NsZGZiWzY0XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl82NDBbUU1GNjQwX0NMREZCX1BGVF9UQUJMRV9TSVpFXTsKK2V4dGVybiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfMzIwW1FNRjMyMF9DTERGQl9QRlRfVEFCTEVfU0laRV07CisKKworCisKKworLyoKKyAqIFJhdyBEYXRhIEJsb2NrIGxpc3Qgc3R1ZmYuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAorICBjb21tb25fd2luZG93LAorICBnbG9iYWxfZ2FpbiwKKyAgaWNzX2luZm8sIC8qIGljc19yZXNlcnZlZF9iaXQsIHdpbmRvd19zZXF1ZW5jZSwgd2luZG93X3NoYXBlLCBtYXhfc2ZiLCBzY2FsZV9mYWN0b3JfZ3JvdXBpbmcsIHByZWRpY3Rvcl9kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsIGx0cF9kYXRhICovCisgIG1heF9zZmIsCisgIG1zLCAvKiBtc19tYXNrX3ByZXNlbnQsIG1zX3VzZWQgKi8KKyAgLypwcmVkaWN0b3JfZGF0YV9wcmVzZW50LCovIC8qIHBhcnQgb2YgaWNzX2luZm8gKi8KKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGEsCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHB1bHNlLCAvKiBwdWxzZV9kYXRhX3ByZXNlbnQsIHB1bHNlX2RhdGEgICovCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICBnYWluX2NvbnRyb2xfZGF0YSwKKyAgZXNjMV9oY3IsCisgIGVzYzJfcnZsYywKKyAgc3BlY3RyYWxfZGF0YSwKKworICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICBjb3JlX21vZGUsCisgIGNvbW1vbl90dywKKyAgbHBkX2NoYW5uZWxfc3RyZWFtLAorICB0d19kYXRhLAorICBub2lzZSwKKyAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgZmFjX2RhdGEsCisgIHRuc19hY3RpdmUsIC8qIGludHJvZHVjZWQgaW4gTVBFRy1EIHVzYWMgQ0QgKi8KKyAgdG5zX2RhdGFfcHJlc2VudF91c2FjLAorICBjb21tb25fbWF4X3NmYiwKKworCisgIC8qIE5vbiBkYXRhIGxpc3QgaXRlbXMgKi8KKyAgYWR0c2NyY19zdGFydF9yZWcxLAorICBhZHRzY3JjX3N0YXJ0X3JlZzIsCisgIGFkdHNjcmNfZW5kX3JlZzEsCisgIGFkdHNjcmNfZW5kX3JlZzIsCisgIGRybWNyY19zdGFydF9yZWcsCisgIGRybWNyY19lbmRfcmVnLAorICBuZXh0X2NoYW5uZWwsCisgIG5leHRfY2hhbm5lbF9sb29wLAorICBsaW5rX3NlcXVlbmNlLAorICBlbmRfb2Zfc2VxdWVuY2UKK30gcmJkX2lkX3Q7CisKK3N0cnVjdCBlbGVtZW50X2xpc3QgeworICBjb25zdCByYmRfaWRfdCAqaWQ7CisgIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3QgKm5leHRbMl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBlbGVtZW50X2xpc3QgZWxlbWVudF9saXN0X3Q7CisvKioKKyAqIFxicmllZiBnZXQgZWxlbWVudGFyeSBzdHJlYW0gcGllY2VzIGxpc3QgZm9yIGdpdmVuIHBhcmFtZXRlcnMuCisgKiBccGFyYW0gYW90IGF1ZGlvIG9iamVjdCB0eXBlCisgKiBccGFyYW0gZXBDb25maWcgdGhlIGVwQ29uZmlnIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgQXVkaW8gU3BlY2lmaWMgQ29uZmlnCisgKiBccGFyYW0gbkNoYW5uZWxzIGFtb3VudCBvZiBjaGFubmVscyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAqIFxwYXJhbSBsYXllciB0aGUgbGF5ZXIgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAqIFxyZXR1cm4gZWxlbWVudF9saXN0X3QgcGFyc2VyIGd1aWRhbmNlIHN0cnVjdHVyZS4KKyAqLworY29uc3QgZWxlbWVudF9saXN0X3QgKiBnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFNDSEFSIGVwQ29uZmlnLCBVQ0hBUiBuQ2hhbm5lbHMsIFVDSEFSIGxheWVyKTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmMwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvRkRLX3RyaWdGY3RzLmgKQEAgLTAsMCArMSwyMjkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEhhcmljaGFyYW4gTGFrc2htYW4sIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBUcmlnb25vbWV0cmljIGZ1bmN0aW9ucyBmaXhlZCBwb2ludCBmcmFjdGlvbmFsIGltcGxlbWVudGF0aW9uLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCisvKiBGaXhlZCBwb2ludCBwcmVjaXNpb24gZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUShmb3JtYXQpICAgICAgICAoKEZJWFBfREJMKSgoKExPTkcpMSkgPDwgKGZvcm1hdCkpKQorCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAgICAgICgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2ZikKKyNlbmRpZgorCisvKiEKKyAqIEludmVyc2UgdGFuZ2VudCBmdW5jdGlvbi4KKyAqLworCisvLyAtLS0gZml4cF9hdGFuKCkgLS0tLQorI2RlZmluZSBRX0FUQU5JTlAgICAoMjUpICAgIC8vIElucHV0IGluIHEyNSwgT3V0cHV0IGluIHEzMAorI2RlZmluZSBRX0FUQU5PVVQgICAoMzApCisjZGVmaW5lIEFUSV9TRiAgICAgICAgICAgICAgKChERlJBQ1RfQklUUy0xKS1RX0FUQU5JTlApICAvLyA2CisjZGVmaW5lIEFUSV9TQ0FMRSAgICAgICAgICAgKChmbG9hdCkoMTw8QVRJX1NGKSkgICAgICAgICAvLworI2RlZmluZSBBVE9fU0YgICAgICAgICAgICAgICgoREZSQUNUX0JJVFMtMSktUV9BVEFOT1VUKSAgLy8gMSAgIF0gLXBpLzIgLi4gcGkvMiBbCisjZGVmaW5lIEFUT19TQ0FMRSAgICAgICAgICAgKChmbG9hdCkoMTw8QVRPX1NGKSkgICAgICAgICAvLworLy8gLS0tIGZpeHBfYXRhbjIoKSAtLS0KKyNkZWZpbmUgUV9BVEFOMk9VVCAgKDI5KQorI2RlZmluZSBBVDJPX1NGICAgICAgICAgICAgICgoREZSQUNUX0JJVFMtMSktUV9BVEFOMk9VVCkgLy8gMiAgIF0gLXBpICAgLi4gcGkgICBdCisjZGVmaW5lIEFUMk9fU0NBTEUgICAgICAgICAgKChmbG9hdCkoMTw8QVQyT19TRikpICAgICAgICAvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRklYUF9EQkwgZml4cF9hdGFuKEZJWFBfREJMIHgpOworRklYUF9EQkwgZml4cF9hdGFuMihGSVhQX0RCTCB5LCBGSVhQX0RCTCB4KTsKKworRklYUF9EQkwgZml4cF9jb3MoRklYUF9EQkwgeCwgaW50IHNjYWxlKTsKK0ZJWFBfREJMIGZpeHBfc2luKEZJWFBfREJMIHgsIGludCBzY2FsZSk7CisKKyNkZWZpbmUgRklYUF9DT1NfU0lOCisKKworI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKworI2RlZmluZSBTSU5FVEFCIFNpbmVUYWJsZTUxMgorI2RlZmluZSBMRCA5CisKKworI2lmbmRlZiBGVU5DVElPTl9pbmxpbmVfZml4cF9jb3Nfc2luCisKKyNkZWZpbmUgRlVOQ1RJT05faW5saW5lX2ZpeHBfY29zX3NpbgorCisvKgorICogQ2FsY3VsYXRlcyBjb2Fyc2UgbG9va3VwIGluZGV4IGFuZCBzaWduIGZvciBzaW5lLgorICogUmV0dXJucyBkZWx0YSB4IHJlc2lkdWFsLgorICovCitzdGF0aWMgaW5saW5lIEZJWFBfREJMIGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoRklYUF9EQkwgeCwgaW50IHNjYWxlLCBGSVhQX0RCTCAqc2luZSwgRklYUF9EQkwgKmNvc2luZSkKK3sKKyAgICBGSVhQX0RCTCByZXNpZHVhbDsKKyAgICBpbnQgczsKKyAgICBpbnQgc2hpZnQgPSAoMzEtc2NhbGUtTEQtMSk7CisgICAgaW50IHNzaWduID0gMTsKKyAgICBpbnQgY3NpZ24gPSAxOworCisgICAgcmVzaWR1YWwgPSBmTXVsdCh4LCBGTDJGWENPTlNUX0RCTCgxLjAvTV9QSSkpOworICAgIHMgPSAoKExPTkcpcmVzaWR1YWwpID4+IHNoaWZ0OworCisgICAgcmVzaWR1YWwgJj0gKCAoMTw8c2hpZnQpIC0gMSApOworICAgIHJlc2lkdWFsID0gZk11bHQocmVzaWR1YWwsIEZMMkZYQ09OU1RfREJMKE1fUEkvNC4wKSkgPDwgMjsKKyAgICByZXNpZHVhbCA8PD0gc2NhbGU7CisKKyAgICAvKiBTaW5lIHNpZ24gc3ltbWV0cnkgKi8KKyAgICBpZiAocyAmICgoMTw8TEQpPDwxKSApIHsKKyAgICAgIHNzaWduID0gLXNzaWduOworICAgIH0KKyAgICAvKiBDb3NpbmUgc2lnbiBzeW1tZXRyeSAqLworICAgIGlmICggKHMgKyAoMTw8TEQpKSAmICgoMTw8TEQpPDwxKSApIHsKKyAgICAgIGNzaWduID0gLWNzaWduOworICAgIH0KKworICAgIHMgPSBmQWJzKHMpOworCisgICAgcyAmPSAoKCgxPDxMRCk8PDEpLTEpOyAvKiBNb2R1bG8gUEkgKi8KKworICAgIGlmIChzID4gKDE8PExEKSkgeworICAgICAgcyA9ICgoMTw8TEQpPDwxKSAtIHM7CisgICAgfQorCisgICAgeworICAgICAgTE9ORyBzbCwgY2w7CisgICAgICAvKiBCZWNhdXNlIG9mIHBhY2tlZCB0YWJsZSAqLworICAgICAgaWYgKHMgPiAoMTw8KExELTEpKSkgeworICAgICAgICBGSVhQX1NUUCB0bXA7CisgICAgICAgIC8qIENvc2luZS9TaW5lIHNpbWV0cnkgZm9yIGFuZ2xlcyBncmVhdGVyIHRoYW4gUEkvNCAqLworICAgICAgICBzID0gKDE8PExEKS1zOworICAgICAgICB0bXAgPSBTSU5FVEFCW3NdOworICAgICAgICBzbCA9IChMT05HKXRtcC52LnJlOworICAgICAgICBjbCA9IChMT05HKXRtcC52LmltOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRklYUF9TVFAgdG1wOworICAgICAgICB0bXAgPSBTSU5FVEFCW3NdOworICAgICAgICBzbCA9IChMT05HKXRtcC52LmltOworICAgICAgICBjbCA9IChMT05HKXRtcC52LnJlOworICAgICAgfQorCisjaWZkZWYgU0lORVRBQkxFXzE2QklUCisgICAgICAqc2luZSAgID0gKEZJWFBfREJMKSgoc2wgKiBzc2lnbikgPDwgKERGUkFDVF9CSVRTLUZSQUNUX0JJVFMpKTsKKyAgICAgICpjb3NpbmUgPSAoRklYUF9EQkwpKChjbCAqIGNzaWduKSA8PCAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUykpOworI2Vsc2UKKyAgICAgICpzaW5lICAgPSAoRklYUF9EQkwpKHNsICogc3NpZ24pOworICAgICAgKmNvc2luZSA9IChGSVhQX0RCTCkoY2wgKiBjc2lnbik7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gcmVzaWR1YWw7Cit9CisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBjb3NpbmUgYW5kIHNpbmUgdmFsdWUgZWFjaCBvZiAyIGFuZ2xlcyBkaWZmZXJlbnQgYW5nbGUgdmFsdWVzLgorICogXHBhcmFtIHgxIGZpcnN0IGFuZ2xlIHZhbHVlCisgKiBccGFyYW0geDIgc2Vjb25kIGFuZ2xlIHZhbHVlCisgKiBccGFyYW0gc2NhbGUgZXhwb25lbnQgb2YgeDEgYW5kIHgyCisgKiBccGFyYW0gb3V0IHBvaW50ZXIgdG8gNCBGSVhQX0RCTCBsb2NhdGlvbnMsIHdlcmUgdGhlIHZhbHVlcyBjb3MoeDEpLCBzaW4oeDEpLCBjb3MoeDIpLCBzaW4oeDIpCisgKiAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGludG8uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmxpbmVfZml4cF9jb3Nfc2luIChGSVhQX0RCTCB4MSwgRklYUF9EQkwgeDIsIGNvbnN0IGludCBzY2FsZSwgRklYUF9EQkwgKm91dCkKK3sKKyAgICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IwLCBlcnJvcjEsIHNpbmUsIGNvc2luZTsKKyAgICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeDEsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgICAgZXJyb3IwID0gZk11bHREaXYyKHNpbmUsIHJlc2lkdWFsKTsKKyAgICBlcnJvcjEgPSBmTXVsdERpdjIoY29zaW5lLCByZXNpZHVhbCk7CisgICAgKm91dCsrICA9IGNvc2luZSAtIChlcnJvcjA8PDEpOworICAgICpvdXQrKyAgPSBzaW5lICAgKyAoZXJyb3IxPDwxKTsKKworICAgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4Miwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgICBlcnJvcjAgPSBmTXVsdERpdjIoc2luZSwgcmVzaWR1YWwpOworICAgIGVycm9yMSA9IGZNdWx0RGl2Mihjb3NpbmUsIHJlc2lkdWFsKTsKKyAgICAqb3V0KysgID0gY29zaW5lIC0gKGVycm9yMDw8MSk7CisgICAgKm91dCsrICA9IHNpbmUgICArIChlcnJvcjE8PDEpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9hYnMuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9hYnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM3ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2Ficy5oCkBAIC0wLDAgKzEsMTIxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgYWJzIGRlZmluaXRpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fQUJTX0hfXykKKyNkZWZpbmUgX19BQlNfSF9fCisKKworI2lmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL2Fic19taXBzLmgiCisKKyNlbGlmIGRlZmluZWQoX194ODZfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgIng4Ni9hYnNfeDg2LmgiCisKKyNlbmRpZiAvKiBhbGwgY29yZXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgU29mdHdhcmUgZmFsbGJhY2tzIGZvciBtaXNzaW5nIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4YWJzX0QpCitpbmxpbmUgRklYUF9EQkwgZml4YWJzX0QoRklYUF9EQkwgeCkgeyByZXR1cm4gKCh4KSA+IChGSVhQX0RCTCkoMCkpID8gKHgpIDogLSh4KSA7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4YWJzX0kpCitpbmxpbmUgSU5UIGZpeGFic19JKElOVCB4KSAgICAgICAgICAgeyByZXR1cm4gKCh4KSA+IChJTlQpKDApKSAgICAgID8gKHgpIDogLSh4KSA7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4YWJzX1MpCitpbmxpbmUgRklYUF9TR0wgZml4YWJzX1MoRklYUF9TR0wgeCkgeyByZXR1cm4gKCh4KSA+IChGSVhQX1NHTCkoMCkpID8gKHgpIDogLSh4KSA7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogX19BQlNfSF9fICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2Nsel9hcm0uaCBiL2FhYy9saWJGREsvaW5jbHVkZS9hcm0vY2x6X2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2E3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2Nsel9hcm0uaApAQCAtMCwwICsxLDEyMiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyAgLyogQVJNIGdjYyovCisKKyAgI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisgICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybV9ECisKKyAgaW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpCisgIHsKKyAgICBJTlQgcmVzdWx0OworICAgIGFzbSgiY2x6ICUwLCAlMSAiOiAiPXIiKHJlc3VsdCkgOiAiciIodmFsdWUpICk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpCisgIHsKKyAgICBJTlQgcmVzdWx0OworICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgdmFsdWUgPSB+dmFsdWU7CisgICAgfQorICAgIHJlc3VsdCA9ICBmaXhub3Jtel9EKHZhbHVlKTsKKyAgICByZXR1cm4gcmVzdWx0IC0gMTsKKyAgfQorCisjZW5kaWYgLyogYXJtIHRvb2xjaGFpbiAqLworCisjZW5kaWYgLyogX19hcm1fXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0ODAzMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWwuaApAQCAtMCwwICsxLDIxNCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKKyAgI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKKyAgI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgorICAvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTYKKyAgLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2WDIKKyNlbmRpZgorCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCisvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMgorCisjaWZkZWYgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2CitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TUEsgd3BrICkKK3sKKyAgIExPTkcgdG1wMSx0bXAyOworICAgY29uc3QgTE9ORyB3ID0gd3BrLnc7CisKKyAgIGFzbSgic211bHd0ICUwLCAlMywgJTQ7XG4iCisgICAgICAgInJzYiAlMSwlMCwjMDtcbiIKKyAgICAgICAic21sYXdiICUwLCAlMiwgJTQsICUxO1xuIgorICAgICAgICJzbXVsd3QgJTEsICUyLCAlNDtcbiIKKyAgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIgorICAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKHcpCisgICAgICAgKTsKKworICAgICpjX1JlID0gdG1wMTsKKyAgICAqY19JbSA9IHRtcDI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2ICovCisKKyNpZmRlZiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pCit7CisgICAgTE9ORyB0bXAxLCB0bXAyOworCisgICAgYXNtKCJzbXVsd2IgJTAsICUzLCAlNTtcbiIgICAgIC8qICU3ICAgPSAtYV9JbSAqIGJfSW0gKi8KKyAgICAgICAgInJzYiAlMSwlMCwjMDtcbiIKKyAgICAgICAgInNtbGF3YiAlMCwgJTIsICU0LCAlMTtcbiIgLyogdG1wMSA9ICBhX1JlICogYl9SZSAtIGFfSW0gKiBiX0ltICovCisgICAgICAgICJzbXVsd2IgJTEsICUyLCAlNTtcbiIgICAgIC8qICU3ICAgPSAgYV9SZSAqIGJfSW0gKi8KKyAgICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIgLyogdG1wMiA9ICBhX0ltICogYl9SZSArIGFfUmUgKiBiX0ltICovCisgICAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pCisgICAgICAgICk7CisKKyAgICAgKmNfUmUgPSB0bXAxOworICAgICAqY19JbSA9IHRtcDI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIgKi8KKworI2lmZGVmIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyCitpbmxpbmUgdm9pZCBjcGx4TXVsdEFkZERpdjIoIEZJWFBfREJMICpjX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKQoreworICAgIExPTkcgdG1wMSwgdG1wMjsKKworICAgIGFzbSgic211bHdiICUwLCAlMywgJTU7XG4iCisgICAgICAgICJyc2IgJTEsJTAsIzA7XG4iCisgICAgICAgICJzbWxhd2IgJTAsICUyLCAlNCwgJTE7XG4iCisgICAgICAgICJzbXVsd2IgJTEsICUyLCAlNTtcbiIKKyAgICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIKKyAgICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKKyAgICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkKKyAgICAgICAgKTsKKworICAgICAqY19SZSArPSB0bXAxOworICAgICAqY19JbSArPSB0bXAyOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyICovCisKKworI2lmZGVmIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9JbSkKK3sKKyAgICBMT05HIHRtcDEsIHRtcDI7CisKKyNpZmRlZiBfX0FSTV9BUkNIXzZfXworICAgIGFzbSgKKyAgICAgICAic21tdWwgJTAsICUyLCAlNDtcbiIgICAgIC8qIHRtcDEgID0gYV9SZSAqIGJfUmUgKi8KKyAgICAgICAic21tbHMgJTAsICUzLCAlNSwgJTA7XG4iIC8qIHRtcDEgLT0gYV9JbSAqIGJfSW0gKi8KKyAgICAgICAic21tdWwgJTEsICUyLCAlNTtcbiIgICAgIC8qIHRtcDIgID0gYV9SZSAqIGJfSW0gKi8KKyAgICAgICAic21tbGEgJTEsICUzLCAlNCwgJTE7XG4iIC8qIHRtcDIgKz0gYV9JbSAqIGJfUmUgKi8KKyAgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKQorICAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pCisgICAgICAgOiAicjAiCisgICAgICAgKTsKKyNlbHNlCisgICAgTE9ORyBkaXNjYXJkOworICAgIGFzbSgKKyAgICAgICAic211bGwgJTIsICUwLCAlNywgJTY7XG4iIC8qIHRtcDEgID0gLWFfSW0gKiBiX0ltICovCisgICAgICAgInNtbGFsICUyLCAlMCwgJTMsICU1O1xuIiAvKiB0bXAxICs9ICBhX1JlICogYl9SZSAqLworICAgICAgICJzbXVsbCAlMiwgJTEsICUzLCAlNjtcbiIgLyogdG1wMiAgPSAgYV9SZSAqIGJfSW0gKi8KKyAgICAgICAic21sYWwgJTIsICUxLCAlNCwgJTU7XG4iIC8qIHRtcDIgKz0gIGFfSW0gKiBiX1JlICovCisgICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMiksICI9JnIiKGRpc2NhcmQpCisgICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSksICJyIigtYV9JbSkKKyAgICAgICApOworICNlbmRpZgorICAgICpjX1JlID0gdG1wMTsKKyAgICAqY19JbSA9IHRtcDI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIgKi8KKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9maXhtYWRkX2FybS5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9maXhtYWRkX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTE0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG1hZGRfYXJtLmgKQEAgLTAsMCArMSwxNjAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCisgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisgICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKyAgICAvKiBBUk0gR05VIEdDQyAqLworCisgICAgI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAorCisgICAgI2lmZGVmIF9fQVJNX0FSQ0hfNl9fCisgICAgICBpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgICAgICAgSU5UIHJlc3VsdDsKKyAgICAgICAgYXNtICAoInNtbWxhICUwLCAlMSwgJTIsICUzO1xuIgorICAgICAgICAgICAgICA6ICI9ciIgKHJlc3VsdCkKKyAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIoeCkgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA7CisgICAgICB9CisgICAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RECisgICAgICBpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgICAgICAgSU5UIHJlc3VsdDsKKyAgICAgICAgYXNtICAoInNtbWxzICUwLCAlMSwgJTIsICUzO1xuIgorICAgICAgICAgICAgICA6ICI9ciIgKHJlc3VsdCkKKyAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIoeCkgKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA7CisgICAgICB9CisgICAgI2Vsc2UgLyogX19BUk1fQVJDSF82X18gKi8KKyAgICAgIGlubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICAgICAgICBJTlQgZGlzY2FyZCwgcmVzdWx0ID0geDsKKyAgICAgICAgYXNtICAoInNtbGFsICUwLCAlMSwgJTIsICUzO1xuIgorICAgICAgICAgICAgICA6ICI9ciIgKGRpc2NhcmQpLCAiK3IiIChyZXN1bHQpCisgICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSApOworICAgICAgICByZXR1cm4gcmVzdWx0IDsKKyAgICAgIH0KKyAgICAjZW5kaWYgLyogX19BUk1fQVJDSF82X18gKi8KKworICAgICNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pCisKKyAgICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMKKworICAgICAgaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgICAgICAgIElOVCByZXN1bHQ7CisgICAgICAgIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIKKyAgICAgICAgICAgICAgOiAiPXIiIChyZXN1bHQpCisgICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiICh4KSApOworICAgICAgICByZXR1cm4gcmVzdWx0IDsKKyAgICAgIH0KKworICAgICNlbmRpZiAvKiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pICovCisKKyAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfREQKKyAgICAjZGVmaW5lIGZpeG1hZGRkaXYyQml0RXhhY3RfREQoYSwgYiwgYykgZml4bWFkZGRpdjJfREQoYSwgYiwgYykKKworICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAorICAgIGlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgICAgICByZXR1cm4geCAtIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKTsKKyAgICB9CisKKyAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMKKyAgICAjZGVmaW5lIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMoYSwgYiwgYykgZml4bWFkZGRpdjJfRFMoYSwgYiwgYykKKworICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUworICAgIGlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgICAgICByZXR1cm4geCAtIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhhLCBiKTsKKyAgICB9CisgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisgICNlbmRpZiAvKiB0b29sY2hhaW4gKi8KKyAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKworI2VuZGlmIC8qIF9fYXJtX18gKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9maXhtdWxfYXJtLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG11bF9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA0NzA1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9maXhtdWxfYXJtLmgKQEAgLTAsMCArMSwxNDIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisvKiBBUk0gd2l0aCBHTlUgY29tcGlsZXIgKi8KKworI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RECisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLGIpIGZpeG11bGRpdjJfREQoYSxiKQorI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTCisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhhLGIpIGZpeG11bGRpdjJfRFMoYSxiKQorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RTCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsYikgZml4bXVsX0RTKGEsYikKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19UQVJHRVRfQVJDSF83RV9NKQoraW5saW5lIElOVCBmaXhtdWxkaXYyX0REIChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpCit7CisgIElOVCByZXN1bHQgOworICBfX2FzbV9fICgic21tdWwgJTAsICUxLCAlMiIgOiAiPXIiIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKKyAgcmV0dXJuIHJlc3VsdCA7Cit9CisjZWxzZQoraW5saW5lIElOVCBmaXhtdWxkaXYyX0REIChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpCit7CisgIElOVCBkaXNjYXJkLCByZXN1bHQgOworICBfX2FzbV9fICgic211bGwgJTAsICUxLCAlMiwgJTMiIDogIj0mciIgKGRpc2NhcmQpLCAiPXIiIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpKSA7CisgIHJldHVybiByZXN1bHQgOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgSU5UIGIpCit7CisgIElOVCByZXN1bHQgOworICBfX2FzbV9fICgic211bHdiICUwLCAlMSwgJTIiCisgICAgOiAiPXIiIChyZXN1bHQpCisgICAgOiAiciIgKGIpLCAiciIgKGEpKSA7CisgIHJldHVybiByZXN1bHQgOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pICovCisKKyNlbmRpZiAvKiBfX2FybV9fICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9hcm0vc2NhbGUuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9hcm0vc2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI4MWRjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZS5oCkBAIC0wLDAgKzEsMTUyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBBUk0gc2NhbGluZyBvcGVyYXRpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pIC8qIEdDQyBDb21waWxlciAqLwkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQorCitpbmxpbmUgc3RhdGljIElOVCBzaGlmdFJpZ2h0U2F0KElOVCBzcmMsIGludCBzY2FsZSkKK3sKKyAgSU5UIHJlc3VsdDsKKyAgYXNtKAorICAgICAgInNzYXQgJTAsJTIsJTA7XG4iCisKKyAgICAgIDogIj0mciIocmVzdWx0KQorICAgICAgOiAiciIoc3JjPj5zY2FsZSksICJNIihTQU1QTEVfQklUUykKKyAgICAgICk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworICAjZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fUklHSFRfU0hJRlQoc3JjLCBzY2FsZSkgc2hpZnRSaWdodFNhdChzcmMsIHNjYWxlKQorCitpbmxpbmUgc3RhdGljIElOVCBzaGlmdExlZnRTYXQoSU5UIHNyYywgaW50IHNjYWxlKQoreworICBJTlQgcmVzdWx0OworICBhc20oCisgICAgICAic3NhdCAlMCwlMiwlMDtcbiIKKworICAgICAgOiAiPSZyIihyZXN1bHQpCisgICAgICA6ICJyIihzcmM8PHNjYWxlKSwgIk0iKFNBTVBMRV9CSVRTKQorICAgICAgKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisgICNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9MRUZUX1NISUZUKHNyYywgc2NhbGUpICBzaGlmdExlZnRTYXQoc3JjLCBzY2FsZSkKKworI2VuZGlmIC8qIF9fQVJNX0FSQ0hfNl9fICovCisKKyNlbmRpZiAvKiBjb21waWxlciBzZWxlY3Rpb24gKi8KKworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlSW5QbGFjZQoraW5saW5lCit2b2lkIHNjYWxlVmFsdWVJblBsYWNlKEZJWFBfREJMICp2YWx1ZSwgLyohPCBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSU5UIG5ld3NjYWxlOworICBpZiAoKG5ld3NjYWxlID0gc2NhbGVmYWN0b3IpID49IDApCisgICAgKnZhbHVlIDw8PSBuZXdzY2FsZTsKKyAgZWxzZQorICAgICp2YWx1ZSA+Pj0gLW5ld3NjYWxlOworfQorCisKKyAgI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggKCgoTE9ORykoc3JjKSBeICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMtMSkpKT4+KHNjYWxlKSkgPiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSkgICAgIFwKKyAgICAgICAgICA/ICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMtMSkpIF4gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA6ICgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKQorCisgICNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICgoTE9ORykoc3JjKSBeICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMtMSkpKSA+ICgoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSA+PiAoc2NhbGUpKSApICBcCisgICAgICAgICAgPyAoKExPTkcpKHNyYykgPj4gKERGUkFDVF9CSVRTLTEpKSBeIChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9zY3JhbWJsZS5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL2FybS9zY3JhbWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDAzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlLmgKQEAgLTAsMCArMSwxNTggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IGJpdHJldmVyc2FsIG9mIGlucHV0IGRhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NyYW1ibGUKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKKyNkZWZpbmUgVVNFX0xEUkRfU1RSRCAgIC8qIExEUkQgcmVxdWlyZXMgOCBieXRlIGRhdGEgYWxpZ25tZW50LiAqLworI2VuZGlmCisKK2lubGluZSB2b2lkIHNjcmFtYmxlKEZJWFBfREJMIHggW10sIElOVCBuKSB7CisgIEZES19BU1NFUlQoISgoKElOVCl4KSYoQUxJR05NRU5UX0RFRkFVTFQtMSkpKTsKKyAgYXNtKCJtb3YgICAgIHIyLCAjMTtcbiIgICAgICAgICAgICAgICAvKiByMihtKSA9IDE7ICAgICAgICAgICAqLworICAgICAgInN1YiAgICAgcjMsICUxLCAjMTtcbiIgICAgICAgICAgIC8qIHIzID0gbi0xOyAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNCwgIzA7XG4iICAgICAgICAgICAgICAgLyogcjQoaikgPSAwOyAgICAgICAgICAgKi8KKworInNjcmFtYmxlX21fbG9vcCU9OlxuIiAgICAgICAgICAgICAgICAgIC8qIHsgICAgICAgICAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNSwgJTE7XG4iICAgICAgICAgICAgICAgLyogIHI1KGspID0gMTsgICAgICAgICAgKi8KKworInNjcmFtYmxlX2tfbG9vcCU9OlxuIiAgICAgICAgICAgICAgICAgIC8qICB7ICAgICAgICAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNSwgcjUsIGxzciAjMTtcbiIgICAgICAgLyogICBrID4+PSAxOyAgICAgICAgICAgKi8KKyAgICAgICJlb3IgICAgIHI0LCByNCwgcjU7XG4iICAgICAgICAgICAvKiAgIGogXj1rOyAgICAgICAgICAgICAqLworICAgICAgImFuZHMgICAgcjEwLCByNCwgcjU7XG4iICAgICAgICAgICAvKiAgIHIxMCA9IHI0ICYgcjU7ICAgICAgKi8KKyAgICAgICJiZXEgICAgIHNjcmFtYmxlX2tfbG9vcCU9O1xuIiAgICAgIC8qICB9IHdoaWxlIChyMTAgPT0gMCk7ICAqLworCisgICAgICAiY21wICAgICByNCwgcjI7XG4iICAgICAgICAgICAgICAgLyogICBpZiAocjQgPCByMikgYnJlYWs7ICAgICAgICAqLworICAgICAgImJjYyAgICAgc2NyYW1ibGVfbV9sb29wX2VuZCU9O1xuIgorCisjaWZkZWYgVVNFX0xEUkRfU1RSRAorICAgICAgIm1vdiAgICAgcjUsIHIyLCBsc2wgIzM7XG4iICAgICAgIC8qIG0ocjUpID0gcjIqNCoyICAgICAgICAgICAgICAgKi8KKyAgICAgICJsZHJkICAgIHIxMCwgWyUwLCByNV07XG4iICAgICAgICAgLyogcjEwID0geFtyNV0sIHg3ID0geFtyNSsxXSAgICAgKi8KKyAgICAgICJtb3YgICAgIHI2LCByNCwgbHNsICMzO1xuIiAgICAgIC8qIGoocjYpID0gcjQqNCoyICAgICAgICAgICAgICAqLworICAgICAgImxkcmQgICAgcjgsIFslMCwgcjZdO1xuIiAgICAgICAgLyogcjggPSB4W3I2XSwgcjkgPSB4W3I2KzFdOyAgKi8KKyAgICAgICJzdHJkICAgIHIxMCwgWyUwLCByNl07XG4iICAgICAgICAvKiB4W3I2LHI2KzFdID0gcjEwLHIxMTsgICAgICAgICovCisgICAgICAic3RyZCAgICByOCwgWyUwLCByNV07XG4iICAgICAgICAgLyogeFtyNSxyNSsxXSA9IHI4LHI5OyAgICAgICAgICAqLworI2Vsc2UKKyAgICAgICJtb3YgICAgICByNSwgcjIsIGxzbCAjMztcbiIgICAgICAgLyogbShyNSkgPSByMio0KjIgICAgICAgICAgICAgICAqLworICAgICAgImxkcglyMTAsIFslMCwgcjVdO1xuIgorICAgICAgIm1vdiAgICAgIHI2LCByNCwgbHNsICMzO1xuIiAgICAgIC8qIGoocjYpID0gcjQqNCoyICAgICAgICAgICAgICAqLworICAgICAgImxkcglyMTEsIFslMCwgcjZdO1xuIgorCisgICAgICAic3RyCXIxMCwgWyUwLCByNl07XG4iCisgICAgICAic3RyICAgICAgcjExLCBbJTAsIHI1XTtcbiIKKworICAgICAgImFkZAlyNSwgcjUsICM0OyIKKyAgICAgICJsZHIJcjEwLCBbJTAsIHI1XTtcbiIKKyAgICAgICJhZGQJcjYsIHI2LCAjNDsiCisgICAgICAibGRyICAgICAgcjExLCBbJTAsIHI2XTtcbiIKKyAgICAgICJzdHIgICAgICByMTAsIFslMCwgcjZdO1xuIgorICAgICAgInN0ciAgICAgIHIxMSwgWyUwLCByNV07XG4iCisjZW5kaWYKKyJzY3JhbWJsZV9tX2xvb3BfZW5kJT06XG4iCisgICAgICAiYWRkICAgICByMiwgcjIsICMxO1xuIiAgICAgICAgICAgLyogcjIrKzsgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgImNtcCAgICAgcjIsIHIzO1xuIgorICAgICAgImJjYyAgICAgc2NyYW1ibGVfbV9sb29wJT07XG4iICAgICAgLyogfSB3aGlsZSAocjIobSkgPCByMyhuLTEpKTsgICAqLworICAgICAgIDoKKyAgICAgICA6ICJyIih4KSwgInIiKG4pCisjaWZkZWYgVVNFX0xEUkRfU1RSRAorICAgICAgIDogInIyIiwicjMiLCAicjQiLCJyNSIsICJyMTAiLCJyMTEiLCAicjgiLCJyOSIsICJyNiIgKTsKKyNlbHNlCisgICAgICAgOiAicjIiLCJyMyIsICJyNCIsInI1IiwgInIxMCIsInIxMSIsICJyNiIgKTsKKyNlbmRpZgorfQorI2Vsc2UKKy8qIEZvcmNlIEMgaW1wbGVtZW50YXRpb24gaWYgbm8gYXNzZW1ibGVyIHZlcnNpb24gYXZhaWxhYmxlLiAqLworI3VuZGVmIEZVTkNUSU9OX3NjcmFtYmxlCisjZW5kaWYJLyogVG9vbGNoYWluIHNlbGVjdGlvbi4gKi8KKworI2VuZGlmCS8qIGRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvYXV0b2NvcnIybmQuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9hdXRvY29ycjJuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTk1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvYXV0b2NvcnIybmQuaApAQCAtMCwwICsxLDEyOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgorICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGFicyBkZWZpbml0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FVVE9DT1JSXzJORF9ICisjZGVmaW5lIF9BVVRPQ09SUl8yTkRfSAorCisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCAgcjAwcjsKKyAgRklYUF9EQkwgIHIxMXI7CisgIEZJWFBfREJMICByMjJyOworICBGSVhQX0RCTCAgcjAxcjsKKyAgRklYUF9EQkwgIHIwMnI7CisgIEZJWFBfREJMICByMTJyOworICBGSVhQX0RCTCAgcjAxaTsKKyAgRklYUF9EQkwgIHIwMmk7CisgIEZJWFBfREJMICByMTJpOworICBGSVhQX0RCTCAgZGV0OworICBpbnQgZGV0X3NjYWxlOworfSBBQ09SUl9DT0VGUzsKKworI2RlZmluZSBMUENfT1JERVIgMgorCisKK0lOVAorYXV0b0NvcnIybmRfcmVhbCAoQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAvKiE8IFBvaW50ZXIgdG8gdG8gcmVhbCBwYXJ0IG9mIHNwZWN0cnVtICovCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHFtZiBzbG90cyAqLworICAgICAgICAgICAgICAgICApOworSU5UCithdXRvQ29ycjJuZF9jcGx4IChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIHRvIHJlYWwgcGFydCBvZiBzcGVjdHJ1bSAqLworICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmltQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIGltYWcgcGFydCBvZiBzcGVjdHJ1bSAqLworICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbiAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgcW1mIHNsb3RzICovCisgICAgICAgICAgICAgICAgICk7CisKKworI2VuZGlmIC8qIF9BVVRPQ09SUl8yTkRfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2Nsei5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL2Nsei5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjEyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvY2x6LmgKQEAgLTAsMCArMSwxOTIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmMgR2F5ZXIKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fQ0xaX0hfXykKKyNkZWZpbmUgX19DTFpfSF9fCisKKyNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgorI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorCisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9jbHpfYXJtLmgiCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL2Nsel9taXBzLmgiCisKKyNlbGlmIGRlZmluZWQoX194ODZfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgIng4Ni9jbHpfeDg2LmgiCisKKyNlbmRpZiAvKiBhbGwgY29yZXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBTb2Z0d2FyZSBmYWxsYmFja3MgZm9yIG1pc3NpbmcgZnVuY3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bm9ybXpfUykKKyNpZmRlZiBGVU5DVElPTl9maXhub3Jtel9ECitpbmxpbmUgSU5UIGZpeG5vcm16X1MgKFNIT1JUIGEpCit7CisgIHJldHVybiBmaXhub3Jtel9EKChJTlQpKGEpKTsKK30KKyNlbHNlCitpbmxpbmUgSU5UIGZpeG5vcm16X1MgKFNIT1JUIGEpCit7CisgICAgaW50IGxlYWRpbmdCaXRzID0gMDsKKyAgICBhID0gfmE7CisgICAgd2hpbGUoYSAmIDB4ODAwMCkgeworICAgICAgbGVhZGluZ0JpdHMrKzsKKyAgICAgIGEgPDw9IDE7CisgICAgfQorCisgICAgcmV0dXJuIChsZWFkaW5nQml0cyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bm9ybXpfRCkKK2lubGluZSBJTlQgZml4bm9ybXpfRCAoTE9ORyBhKQoreworICAgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgICAgYSA9IH5hOworICAgIHdoaWxlKGEgJiAweDgwMDAwMDAwKSB7CisgICAgICBsZWFkaW5nQml0cysrOworICAgICAgYSA8PD0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gKGxlYWRpbmdCaXRzKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBmaXhub3JtX0QKKyAgICBkZXNjcmlwdGlvbjogIENvdW50IGxlYWRpbmcgb25lcyBvciB6ZXJvcyBvZiBvcGVyYW5kIHZhbCBmb3IgZGZyYWN0L0xPTkcgSU5UIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgIFJldHVybiB0aGlzIHZhbHVlIG1pbnVzIDEuIFJldHVybiAwIGlmIG9wZXJhbmQ9PTAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhub3JtX1MpCisjaWZkZWYgRlVOQ1RJT05fZml4bm9ybV9ECitpbmxpbmUgSU5UIGZpeG5vcm1fUyhGSVhQX1NHTCB2YWwpCit7CisgIHJldHVybiBmaXhub3JtX0QoKElOVCkodmFsKSk7Cit9CisjZWxzZQoraW5saW5lIElOVCBmaXhub3JtX1MoRklYUF9TR0wgdmFsKQoreworICAgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgICAgaWYgKCB2YWwgIT0gKEZJWFBfU0dMKTAgKSB7CisgICAgICAgIGlmICggdmFsIDwgKEZJWFBfU0dMKTAgKSB7CisgICAgICAgICAgICB2YWwgPSB+dmFsOworICAgICAgICB9CisgICAgICAgIGxlYWRpbmdCaXRzID0gZml4bm9ybXpfUyh2YWwpIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIChsZWFkaW5nQml0cyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bm9ybV9EKQoraW5saW5lIElOVCBmaXhub3JtX0QoRklYUF9EQkwgdmFsKQoreworICAgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgICAgaWYgKCB2YWwgIT0gKEZJWFBfREJMKTAgKSB7CisgICAgICAgIGlmICggdmFsIDwgKEZJWFBfREJMKTAgKSB7CisgICAgICAgICAgICB2YWwgPSB+dmFsOworICAgICAgICB9CisgICAgICAgIGxlYWRpbmdCaXRzID0gZml4bm9ybXpfRCh2YWwpIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIChsZWFkaW5nQml0cyk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ0xaX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2NvbW1vbl9maXguaCBiL2FhYy9saWJGREsvaW5jbHVkZS9jb21tb25fZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkMTFmNAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9jb21tb25fZml4LmgKQEAgLTAsMCArMSwzNzggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKyAgIERlc2NyaXB0aW9uOiBGbGV4aWJsZSBmaXhwb2ludCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DT01NT05fRklYX0gKKyNkZWZpbmUgX0NPTU1PTl9GSVhfSAorCisjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyogKioqKiogU3RhcnQgb2YgZm9ybWVyIGZpeC5oICoqKioqKiAqLworCisvKiBDb25maWd1cmUgZnJhY3Rpb25hbCBvciBpbnRlZ2VyIGFyaXRobWV0aWMgKi8KKyAgI2RlZmluZSBGSVhfRlJBQ1QgMCAvKiBEZWZpbmUgdGhpcyB0byAiMSIgdG8gdXNlIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBzaW11bGF0aW9uIGluIGNsYXNzIGZyYWN0IGluc3RlYWQgb2YgaW50ZWdlciBhcml0aG1ldGljICovCisgICAgICAgICAgICAgICAgICAgICAgLyogMSBmb3IgZGVidWcgd2l0aCBleHRyYSBydW50aW1lIG92ZXJmbG93IGNoZWNraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIERlZmluZSBiaXQgc2l6ZXMgb2YgaW50ZWdlciBmaXhwb2ludCBmcmFjdGlvbmFsIGRhdGEgdHlwZXMgKi8KKyNkZWZpbmUgRlJBQ1RfQklUUyAgICAgIDE2IC8qIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNkZWZpbmUgREZSQUNUX0JJVFMgICAgIDMyIC8qIGRvdWJsZSBwcmVjaXNpb24gKi8KKyNkZWZpbmUgQUNDVV9CSVRTICAgICAgIDQwIC8qIGRvdWJsZSBwcmVjaXNpb24gcGx1cyBvdmVyZmxvdyAqLworCisvKiBGaXhwb2ludCBlcXVpdmFsZW50IHR5cGUgZm90IFBDTSBhdWRpbyB0aW1lIGRvbWFpbiBkYXRhLiAqLworI2lmIGRlZmluZWQoU0FNUExFX0JJVFMpCisjaWYgKFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTKQorICAjZGVmaW5lIEZJWFBfUENNICAgICAgRklYUF9EQkwKKyAgI2RlZmluZSBGWF9QQ00yRlhfREJMKHgpICgoRklYUF9EQkwpKHgpKQorICAjZGVmaW5lIEZYX0RCTDJGWF9QQ00oeCkgKChJTlRfUENNKSh4KSkKKyNlbGlmIChTQU1QTEVfQklUUyA9PSBGUkFDVF9CSVRTKQorICAjZGVmaW5lIEZJWFBfUENNICAgICAgRklYUF9TR0wKKyAgI2RlZmluZSBGWF9QQ00yRlhfREJMKHgpIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKKyAgI2RlZmluZSBGWF9EQkwyRlhfUENNKHgpIEZYX0RCTDJGWF9TR0woeCkKKyNlbHNlCisgICNlcnJvciBTQU1QTEVfQklUUyBkaWZmZXJlbnQgZnJvbSBGUkFDVF9CSVRTIG9yIERGUkFDVF9CSVRTIG5vdCBpbXBsZW1lbnRlZCEKKyNlbmRpZgorI2VuZGlmCisKKy8qICoqKioqKiBFbmQgb2YgZm9ybWVyIGZpeC5oICoqKioqKiAqLworCisjZGVmaW5lIFNHTF9NQVNLICAgICAgICAgICAgKCgxVUw8PEZSQUNUX0JJVFMpLTEpICAgLyogMTZiaXQ6ICgyXjE2KS0xID0gMHhGRkZGICovCisKKyNkZWZpbmUgTUFYX1NISUZUX1NHTCAoRlJBQ1RfQklUUy0xKSAgIC8qIG1heGltdW0gcG9zc2libGUgc2hpZnQgZm9yIEZJWFBfU0dMIHZhbHVlcyAqLworI2RlZmluZSBNQVhfU0hJRlRfREJMIChERlJBQ1RfQklUUy0xKSAgLyogbWF4aW11bSBwb3NzaWJsZSBzaGlmdCBmb3IgRklYUF9EQkwgdmFsdWVzICovCisKKy8qIFNjYWxlIGZhY3RvciBmcm9tL3RvIGZsb2F0L2ZpeHBvaW50IHZhbHVlcy4gRE8gTk9UIFVTRSBUSEVTRSBWQUxVRVMgQVMgU0FUVVJBVElPTiBMSU1JVFMgISEgKi8KKyNkZWZpbmUgRlJBQ1RfRklYX1NDQUxFICAgICAoKElOVDY0KDEpPDwoRlJBQ1RfQklUUy0xKSkpCisjZGVmaW5lIERGUkFDVF9GSVhfU0NBTEUgICAgKChJTlQ2NCgxKTw8KERGUkFDVF9CSVRTLTEpKSkKKworLyogTWF4IGFuZCBNaW4gdmFsdWVzIGZvciBzYXR1cmF0aW9uIHB1cnBvc2VzLiBETyBOT1QgVVNFIFRIRVNFIFZBTFVFUyBBUyBTQ0FMRSBWQUxVRVMgISEgKi8KKyNkZWZpbmUgIE1BWFZBTF9TR0wgICAgICgoc2lnbmVkKTB4MDAwMDdGRkYpICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCisjZGVmaW5lICBNSU5WQUxfU0dMICAgICAoKHNpZ25lZCkweEZGRkY4MDAwKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gRlJBQ1RfQklUUyAqLworI2RlZmluZSAgTUFYVkFMX0RCTCAgICAgKChzaWduZWQpMHg3RkZGRkZGRikgICAgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIERGUkFDVF9CSVRTICovCisjZGVmaW5lICBNSU5WQUxfREJMICAgICAoKHNpZ25lZCkweDgwMDAwMDAwKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gREZSQUNUX0JJVFMgKi8KKworCisjZGVmaW5lIEZYX0RCTDJGWENPTlNUX1NHTCh2YWwpICggKCAoKCgodmFsKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSkgKyAxKSA+ICgoKExPTkcpMTw8RlJBQ1RfQklUUyktMSkpICYmICgoTE9ORykodmFsKSA+IDApICkgPyBcCisgICAoRklYUF9TR0wpKFNIT1JUKSgoKExPTkcpMTw8KEZSQUNUX0JJVFMtMSkpLTEpOihGSVhQX1NHTCkoU0hPUlQpKCgoKHZhbCkgPj4gKERGUkFDVF9CSVRTLUZSQUNUX0JJVFMtMSkpICsgMSkgPj4gMSkgKQorCisKKworI2RlZmluZSBzaG91bGRCZVVuaW9uIHVuaW9uICAgICAvKiB1bmlvbnMgYXJlIHBvc3NpYmxlICovCisKKyAgICB0eXBlZGVmIFNIT1JUICAgICAgIEZJWFBfU0dMOworICAgIHR5cGVkZWYgTE9ORyAgICAgICAgRklYUF9EQkw7CisKKy8qIG1hY3JvcyBmb3IgY29tcGlsZS10aW1lIGNvbnZlcnNpb24gb2YgY29uc3RhbnQgZmxvYXQgdmFsdWVzIHRvIGZpeGVkcG9pbnQgKi8KKyNkZWZpbmUgRkwyRlhDT05TVF9TUEMgRkwyRlhDT05TVF9EQkwKKworI2RlZmluZSBNSU5WQUxfREJMX0NPTlNUIE1JTlZBTF9EQkwKKyNkZWZpbmUgTUlOVkFMX1NHTF9DT05TVCBNSU5WQUxfU0dMCisKKyNkZWZpbmUgRkwyRlhDT05TVF9TR0wodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKEZJWFBfU0dMKSggKCAodmFsKSA+PSAwKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCgoIChkb3VibGUpKHZhbCkgKiAoRlJBQ1RfRklYX1NDQUxFKSArIDAuNSApID49IChkb3VibGUpKE1BWFZBTF9TR0wpICkgPyAoU0hPUlQpKE1BWFZBTF9TR0wpIDogKFNIT1JUKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKEZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSA6ICAgXAorKCgoIChkb3VibGUpKHZhbCkgKiAoRlJBQ1RfRklYX1NDQUxFKSAtIDAuNSkgPD0gIChkb3VibGUpKE1JTlZBTF9TR0xfQ09OU1QpICkgPyAoU0hPUlQpKE1JTlZBTF9TR0xfQ09OU1QpIDogKFNIT1JUKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKEZSQUNUX0ZJWF9TQ0FMRSkgLSAwLjUpKSApCisKKyNkZWZpbmUgRkwyRlhDT05TVF9EQkwodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKEZJWFBfREJMKSggKCAodmFsKSA+PSAwKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCgoIChkb3VibGUpKHZhbCkgKiAoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUgKSA+PSAoZG91YmxlKShNQVhWQUxfREJMKSApID8gKExPTkcpKE1BWFZBTF9EQkwpIDogKExPTkcpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSA6IFwKKygoKCAoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSA8PSAgKGRvdWJsZSkoTUlOVkFMX0RCTF9DT05TVCkgKSA/IChMT05HKShNSU5WQUxfREJMX0NPTlNUKSA6IChMT05HKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSkgKQorCisvKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBmbG9hdCB2YWx1ZXMgdG8gaW50ZWdlciBmaXhlZHBvaW50LiBOTyBPVkVSRkxPVyBDSEVDSyEhISAqLworI2RlZmluZSBGTDJGWF9TUEMgRkwyRlhfREJMCisjZGVmaW5lIEZMMkZYX1NHTCh2YWwpICggKHZhbCk+MC4wZiA/IChTSE9SVCkoICh2YWwpKihmbG9hdCkoRlJBQ1RfRklYX1NDQUxFKSswLjVmICkgOiAoU0hPUlQpKCAodmFsKSooZmxvYXQpKEZSQUNUX0ZJWF9TQ0FMRSktMC41ZiApICkKKyNkZWZpbmUgRkwyRlhfREJMKHZhbCkgKCAodmFsKT4wLjBmID8gKExPTkcpKCAodmFsKSooZmxvYXQpKERGUkFDVF9GSVhfU0NBTEUpKzAuNWYgKSA6IChMT05HKSggKHZhbCkqKGZsb2F0KShERlJBQ1RfRklYX1NDQUxFKS0wLjVmICkgKQorCisvKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBmaXhlZHBvaW50IHZhbHVlcyB0byBvdGhlciBmaXhlZHBvaW50LiBOTyBST1VORElORyEhISAqLworI2RlZmluZSBGWF9BQ0MyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCk+PihBQ0NVX0JJVFMtRlJBQ1RfQklUUykpKQorI2RlZmluZSBGWF9BQ0MyRlhfREJMKHZhbCkgKChGSVhQX0RCTCkoKHZhbCk+PihBQ0NVX0JJVFMtREZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfU0dMMkZYX0FDQyh2YWwpICgoRklYUF9BQ0MpKChMT05HKSh2YWwpPDwoQUNDVV9CSVRTLUZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfU0dMMkZYX0RCTCh2YWwpICgoRklYUF9EQkwpKChMT05HKSh2YWwpPDwoREZSQUNUX0JJVFMtRlJBQ1RfQklUUykpKQorI2RlZmluZSBGWF9EQkwyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCk+PihERlJBQ1RfQklUUy1GUkFDVF9CSVRTKSkpCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKworLyogbWFjcm9zIGZvciBydW50aW1lIGNvbnZlcnNpb24gb2YgaW50ZWdlciBmaXhlZHBvaW50IHZhbHVlcyB0byBmbG9hdC4gKi8KKy8qIFRoaXMgaXMganVzdCBmb3IgdGVtcG9yYXJ5IHVzZSBhbmQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBpbiBhIGZpbmFsIHZlcnNpb24hICovCisKKy8qICNkZWZpbmUgRlhfREJMMkZMKHZhbCkgICgoZmxvYXQpKHBvdygyLiwtMzEuKSooZmxvYXQpdmFsKSkgKi8gIC8qIHZlcnNpb24gIzEgKi8KKyNkZWZpbmUgRlhfREJMMkZMKHZhbCkgICgoZmxvYXQpKChkb3VibGUpKHZhbCkvKGRvdWJsZSlERlJBQ1RfRklYX1NDQUxFKSkgICAvKiB2ZXJzaW9uICMyIC0gaWRlbnRpY2FsIHRvIGNsYXNzIGRmcmFjdCBjYXN0IGZyb20gZGZyYWN0IHRvIGZsb2F0ICovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKyNpbmNsdWRlICJmaXhtdWwuaCIKKworRkRLX0lOTElORSBMT05HIGZNdWx0KFNIT1JUIGEsIFNIT1JUIGIpICAgICAgICAgeyByZXR1cm4gZml4bXVsX1NTKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgTE9ORyBiKSAgICAgICAgICB7IHJldHVybiBmaXhtdWxfU0QoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdChMT05HIGEsIFNIT1JUIGIpICAgICAgICAgIHsgcmV0dXJuIGZpeG11bF9EUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0KExPTkcgYSwgTE9ORyBiKSAgICAgICAgICAgeyByZXR1cm4gZml4bXVsX0REKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZlBvdzIoTE9ORyBhKSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwb3cyX0QoYSk7ICAgIH0KK0ZES19JTkxJTkUgTE9ORyBmUG93MihTSE9SVCBhKSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBvdzJfUyhhKTsgICAgfQorCitGREtfSU5MSU5FIElOVCAgZk11bHRJKExPTkcgYSwgU0hPUlQgYikgICAgICAgICB7IHJldHVybiAoIChJTlQpKCgoMTw8KEZSQUNUX0JJVFMtMikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKChJTlQpYjw8RlJBQ1RfQklUUykpKT4+KEZSQUNUX0JJVFMtMSkpICk7IH0KKworRkRLX0lOTElORSBJTlQgIGZNdWx0SWZsb29yKExPTkcgYSwgSU5UIGIpICAgICAgeyByZXR1cm4gKCAoSU5UKSgoMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4bXVsZGl2Ml9ERChhLChiPDxGUkFDVF9CSVRTKSkpID4+IChGUkFDVF9CSVRTLTEpKSApOyB9CisKK0ZES19JTkxJTkUgSU5UICBmTXVsdEljZWlsKExPTkcgYSwgSU5UIGIpICAgICAgIHsgcmV0dXJuICggKElOVCkoKChJTlQpMHg3ZmZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKGI8PEZSQUNUX0JJVFMpKSkgPj4gKEZSQUNUX0JJVFMtMSkpICk7IH0KKworRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBTSE9SVCBiKSAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBMT05HIGIpICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9TRChhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihMT05HIGEsIFNIT1JUIGIpICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9EUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihMT05HIGEsIExPTkcgYikgICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihMT05HIGEpICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKTsgICAgfQorRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihTSE9SVCBhKSAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93MmRpdjJfUyhhKTsgICAgfQorCitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyBhLCBMT05HIGIpICAgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoU0hPUlQgYSwgTE9ORyAgYikgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X1NEKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyAgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChMT05HIGEsIExPTkcgYikgICAgICAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfREQoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdEJpdEV4YWN0KFNIT1JUIGEsIExPTkcgIGIpICAgICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9TRChhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoTE9ORyAgYSwgU0hPUlQgYikgICAgIHsgcmV0dXJuIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpOyB9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjaW5jbHVkZSAiYWJzLmgiCisKK0ZES19JTkxJTkUgRklYUF9EQkwgZkFicyhGSVhQX0RCTCB4KQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGFic19EKHgpOyB9CitGREtfSU5MSU5FIEZJWFBfU0dMIGZBYnMoRklYUF9TR0wgeCkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhhYnNfUyh4KTsgfQorCisvKiB3b3JrYXJvdW5kIGZvciBUSSBDNnggY29tcGlsZXIgYnV0IG5vdCBmb3IgVEkgQVJNOUUgY29tcGlsZXIgKi8KKyNpZiAoIWRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pIHx8IGRlZmluZWQoX19USV9UTVM0NzBfVjVfXykpICYmICFkZWZpbmVkKF9fTFA2NF9fKQorRkRLX0lOTElORSBJTlQgIGZBYnMoSU5UIHgpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4YWJzX0koeCk7IH0KKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAiY2x6LmgiCisKK0ZES19JTkxJTkUgSU5UIGZOb3JteihGSVhQX0RCTCB4KQorICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybXpfRCh4KTsgfQorRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfU0dMIHgpCisgICAgICAgICAgICAgICB7IHJldHVybiBmaXhub3Jtel9TKHgpOyB9CitGREtfSU5MSU5FIElOVCBmTm9ybShGSVhQX0RCTCB4KQorICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybV9EKHgpOyB9CitGREtfSU5MSU5FIElOVCBmTm9ybShGSVhQX1NHTCB4KQorICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybV9TKHgpOyB9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSAiY2x6LmgiCisjZGVmaW5lIGZpeHBfYWJzKHgpIGZBYnMoeCkKKyNkZWZpbmUgZml4TWluKGEsYikgZk1pbihhLGIpCisjZGVmaW5lIGZpeE1heChhLGIpIGZNYXgoYSxiKQorI2RlZmluZSBDbnRMZWFkaW5nWmVyb3MoeCkgIGZpeG5vcm16X0QoeCkKKyNkZWZpbmUgQ291bnRMZWFkaW5nQml0cyh4KSBmaXhub3JtX0QoeCkKKworI2luY2x1ZGUgImZpeG1hZGQuaCIKKworLyogeSA9ICh4KzAuNSphKmIpICovCitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0REKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX1NEKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0RTKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX1NTKHgsIGEsIGIpOyB9CisKK0ZES19JTkxJTkUgRklYUF9EQkwgZlBvdzJBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZGRpdjJfRCh4LCBhKTsgfQorRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwYWRkZGl2Ml9TKHgsIGEpOyB9CisKKworLyogeSA9IDIqKHgrMC41KmEqYikgPSAoMngrYSpiKSAqLworRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfREQoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfU0QoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfRFMoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfU1MoeCwgYSwgYik7IH0KKworaW5saW5lIEZJWFBfREJMIGZQb3cyQWRkKEZJWFBfREJMIHgsIEZJWFBfREJMIGEpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZF9EKHgsIGEpOyB9CitpbmxpbmUgRklYUF9EQkwgZlBvdzJBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSkKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwYWRkX1MoeCwgYSk7IH0KKworCisvKiB5ID0gKHgtMC41KmEqYikgKi8KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2Ml9ERCh4LCBhLCBiKTsgfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGEsIGIpOyB9CitpbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJfRFMoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2Ml9TUyh4LCBhLCBiKTsgfQorCisvKiB5ID0gMiooeC0wLjUqYSpiKSA9ICgyKngtYSpiKSAqLworRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJfREQoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJfU0QoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJfRFMoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJfU1MoeCwgYSwgYik7IH0KKworRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfREQoeCwgYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X1NEKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsgfQorRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YkRpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfREQoeCwgYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKKyAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X1NEKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsgfQorCisjaW5jbHVkZSAiZml4bWlubWF4LmgiCisKK0ZES19JTkxJTkUgRklYUF9EQkwgZk1pbihGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1pbl9EKGEsYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk1heChGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1heF9EKGEsYik7IH0KKworRkRLX0lOTElORSBGSVhQX1NHTCBmTWluKEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWluX1MoYSxiKTsgfQorRkRLX0lOTElORSBGSVhQX1NHTCBmTWF4KEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCisgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWF4X1MoYSxiKTsgfQorCisvKiB3b3JrYXJvdW5kIGZvciBUSSBDNnggY29tcGlsZXIgYnV0IG5vdCBmb3IgVEkgQVJNOUUgKi8KKyNpZiAoKCFkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9fVElfVE1TNDcwX1Y1X18pKSAmJiAhZGVmaW5lZChfX0xQNjRfXykpIHx8IChGSVhfRlJBQ1QgPT0gMSkKK0ZES19JTkxJTkUgSU5UIGZNYXgoSU5UIGEsIElOVCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1heF9JKGEsYik7IH0KK0ZES19JTkxJTkUgSU5UIGZNaW4oSU5UIGEsIElOVCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1pbl9JKGEsYik7IH0KKyNlbmRpZgorCitpbmxpbmUgVUlOVCBmTWF4KFVJTlQgYSwgVUlOVCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1heF9VSShhLGIpOyB9CitpbmxpbmUgVUlOVCBmTWluKFVJTlQgYSwgVUlOVCBiKQorICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1pbl9VSShhLGIpOyB9CisKKy8qIENvbXBsZXggZGF0YSB0eXBlcyAqLwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgLyogdmVjdG9yIHJlcHJlc2VudGF0aW9uIGZvciBhcml0aG1ldGljICovCisgIHN0cnVjdCB7CisgICAgRklYUF9TR0wgcmU7CisgICAgRklYUF9TR0wgaW07CisgIH0gdjsKKyAgLyogd29yZCByZXByZXNlbnRhdGlvbiBmb3IgbWVtb3J5IG1vdmUgKi8KKyAgTE9ORyB3OworfSBGSVhQX1NQSzsKKwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgLyogdmVjdG9yIHJlcHJlc2VudGF0aW9uIGZvciBhcml0aG1ldGljICovCisgIHN0cnVjdCB7CisgICAgRklYUF9EQkwgcmU7CisgICAgRklYUF9EQkwgaW07CisgIH0gdjsKKyAgLyogd29yZCByZXByZXNlbnRhdGlvbiBmb3IgbWVtb3J5IG1vdmUgKi8KKyAgSU5UNjQgdzsKK30gRklYUF9EUEs7CisKKyNpbmNsdWRlICJmaXhtdWwuaCIKKyNpbmNsdWRlICJmaXhtYWRkLmgiCisjaW5jbHVkZSAiY3BseF9tdWwuaCIKKyNpbmNsdWRlICJzY2FsZS5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvY3BseF9tdWwuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9jcGx4X211bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWM5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvY3BseF9tdWwuaApAQCAtMCwwICsxLDI2OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpZiAhZGVmaW5lZChfX0NQTFhfTXVsdF9IX18pCisjZGVmaW5lIF9fQ1BMWF9NdWx0X0hfXworCisjaWYgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgImFybS9jcGx4X211bC5oIgorCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAmJiBfX21pcHNfaXNhX3JldiA8IDYKKyNpbmNsdWRlICJtaXBzL2NwbHhfbXVsLmgiCisKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZCBhbGwgY29yZXM6IGJmaW4sIGFybSwgZXRjLiAqLworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworCisvKiBGYWxsYmFjayBnZW5lcmljIGltcGxlbWVudGF0aW9ucyAqLworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9JbSkKK3sKKyAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOworICAqY19JbSA9IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNikKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2CisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NQSyB3ICkKK3sKKyAgY3BseE11bHREaXYyKGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIHcudi5yZSwgdy52LmltKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRBZGREaXYyXzMyeDE2WDIpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0QWRkRGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9JbSkKK3sKKyAgKmNfUmUgKz0gZk11bHREaXYyKGFfUmUsYl9SZSkgLSBmTXVsdERpdjIoYV9JbSxiX0ltKTsKKyAgKmNfSW0gKz0gZk11bHREaXYyKGFfUmUsYl9JbSkgKyBmTXVsdERpdjIoYV9JbSxiX1JlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRTdWJEaXYyXzMyeDE2WDIpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0U3ViRGl2Ml8zMngxNlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0U3ViRGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9JbSkKK3sKKyAgKmNfUmUgLT0gZk11bHREaXYyKGFfUmUsYl9SZSkgLSBmTXVsdERpdjIoYV9JbSxiX0ltKTsKKyAgKmNfSW0gLT0gZk11bHREaXYyKGFfUmUsYl9JbSkgKyBmTXVsdERpdjIoYV9JbSxiX1JlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9JbSkKK3sKKyAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOworICAqY19JbSA9IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMikKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICB3KQoreworICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdFN1YkRpdjJfMzJ4MzJYMikKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRTdWJEaXYyXzMyeDMyWDIKKworaW5saW5lIHZvaWQgY3BseE11bHRTdWJEaXYyKCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX0ltKQoreworICAqY19SZSAtPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOworICAqY19JbSAtPSBmTXVsdERpdjIoYV9SZSxiX0ltKSArIGZNdWx0RGl2MihhX0ltLGJfUmUpOworfQorI2VuZGlmCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngxNlgyKQorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngxNlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9JbSkKK3sKKyAgKmNfUmUgPSBmTXVsdChhX1JlLGJfUmUpIC0gZk11bHQoYV9JbSxiX0ltKTsKKyAgKmNfSW0gPSBmTXVsdChhX1JlLGJfSW0pICsgZk11bHQoYV9JbSxiX1JlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MTYpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2CisKK2lubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TUEsgdyApCit7CisgIGNwbHhNdWx0KGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIHcudi5yZSwgdy52LmltKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMikKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMgorCitpbmxpbmUgdm9pZCBjcGx4TXVsdCggRklYUF9EQkwgKmNfUmUsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGJfSW0pCit7CisgICpjX1JlID0gZk11bHQoYV9SZSxiX1JlKSAtIGZNdWx0KGFfSW0sYl9JbSk7CisgICpjX0ltID0gZk11bHQoYV9SZSxiX0ltKSArIGZNdWx0KGFfSW0sYl9SZSk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0XzMyeDMyKQorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMgoraW5saW5lIHZvaWQgY3BseE11bHQoIEZJWFBfREJMICpjX1JlLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICB3KQoreworICBjcGx4TXVsdChjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCB3LnYucmUsIHcudi5pbSk7Cit9CisjZW5kaWYKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKworI2VuZGlmIC8qIF9fQ1BMWF9NdWx0X0hfXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvZGN0LmggYi9hYWMvbGliRkRLL2luY2x1ZGUvZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxZWRkMwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9kY3QuaApAQCAtMCwwICsxLDE0NyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogTGlicmFyeSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHN0YW5kYXJkIERDVHMuIFRoaXMgd2lsbCBtb3N0CisgICAgICAgICAgICAgICAgbGlrZWx5IGJlIHJlcGxhY2VkIGJ5IGhhbmQtb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3IgdGhlIHNwZWNpZmljCisgICAgICAgICAgICAgICAgdGFyZ2V0IHByb2Nlc3Nvci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fZGN0X0gKKyNkZWZpbmUgX19kY3RfSAorCisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIERDVCB0eXBlIElJIG9mIGdpdmVuIGxlbmd0aC4gVGhlIERDVCBJViBpcworICogICAgICAgIGNhbGN1bGF0ZWQgYnkgYSBjb21wbGV4IEZGVCwgd2l0aCBzb21lIHByZSBhbmQgcG9zdCB0d2lkZGVsaW5nLgorICogICAgICAgIEEgZmFjdG9yIG9mIHNxcnQoMi8oTi0xKSkgaXMgTk9UIGFwcGxpZWQuCisgKiBccGFyYW0gcERhdCBwb2ludGVyIHRvIGlucHV0L291dHB1dCBkYXRhIChpbiBwbGFjZSBwcm9jZXNzaW5nKS4KKyAqIFxwYXJhbSBzaXplIHNpemUgb2YgcERhdC4KKyAqIFxwYXJhbSBwRGF0X2UgcG9pbnRlciB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGV4cG9uZW50IG9mIHRoZSBkYXRhCisgKiAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgYnkgcERhdC4gVGhlIGV4cG9uZW50IGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgKi8KK3ZvaWQgZGN0X0lJKEZJWFBfREJMICpwRGF0LCBGSVhQX0RCTCAqdG1wLCBpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgRENUIHR5cGUgSUlJIG9mIGdpdmVuIGxlbmd0aC4gVGhlIERDVCBJViBpcworICogICAgICAgIGNhbGN1bGF0ZWQgYnkgYSBjb21wbGV4IEZGVCwgd2l0aCBzb21lIHByZSBhbmQgcG9zdCB0d2lkZGVsaW5nLgorICogICAgICAgIE5vdGUgdGhhdCB0aGUgZmFjdG9yIDAuNSBmb3IgdGhlIHN1bSB0ZXJtIHhbMF0gaXMgMS4wIGluc3RlYWQgb2YgMC41LgorICogICAgICAgIEEgZmFjdG9yIG9mIHNxcnQoMi9OKSBpcyBOT1QgYXBwbGllZC4KKyAqIFxwYXJhbSBwRGF0IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0IGRhdGEgKGluIHBsYWNlIHByb2Nlc3NpbmcpLgorICogXHBhcmFtIHNpemUgc2l6ZSBvZiBwRGF0LgorICogXHBhcmFtIHBEYXRfZSBwb2ludGVyIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgZXhwb25lbnQgb2YgdGhlIGRhdGEKKyAqICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBieSBwRGF0LiBUaGUgZXhwb25lbnQgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KKyAqLwordm9pZCBkY3RfSUlJKEZJWFBfREJMICpwRGF0LCBGSVhQX0RCTCAqdG1wLCBpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgRENUIHR5cGUgSVYgb2YgZ2l2ZW4gbGVuZ3RoLiBUaGUgRENUIElWIGlzCisgKiAgICAgICAgY2FsY3VsYXRlZCBieSBhIGNvbXBsZXggRkZULCB3aXRoIHNvbWUgcHJlIGFuZCBwb3N0IHR3aWRkZWxpbmcuCisgKiAgICAgICAgQSBmYWN0b3Igb2Ygc3FydCgyL04pIGlzIE5PVCBhcHBsaWVkLgorICogXHBhcmFtIHBEYXQgcG9pbnRlciB0byBpbnB1dC9vdXRwdXQgZGF0YSAoaW4gcGxhY2UgcHJvY2Vzc2luZykuCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHBEYXQuCisgKiBccGFyYW0gcERhdF9lIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBleHBvbmVudCBvZiB0aGUgZGF0YQorICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHBEYXQuIFRoZSBleHBvbmVudCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgorICovCit2b2lkIGRjdF9JVihGSVhQX0RCTCAqcERhdCxpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgRFNUIHR5cGUgSVYgb2YgZ2l2ZW4gbGVuZ3RoLiBUaGUgRFNUIElWIGlzCisgKiAgICAgICAgY2FsY3VsYXRlZCBieSBhIGNvbXBsZXggRkZULCB3aXRoIHNvbWUgcHJlIGFuZCBwb3N0IHR3aWRkZWxpbmcuCisgKiAgICAgICAgQSBmYWN0b3Igb2Ygc3FydCgyL04pIGlzIE5PVCBhcHBsaWVkLgorICogXHBhcmFtIHBEYXQgcG9pbnRlciB0byBpbnB1dC9vdXRwdXQgZGF0YSAoaW4gcGxhY2UgcHJvY2Vzc2luZykuCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHBEYXQuCisgKiBccGFyYW0gcERhdF9lIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBleHBvbmVudCBvZiB0aGUgZGF0YQorICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHBEYXQuIFRoZSBleHBvbmVudCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgorICovCit2b2lkIGRzdF9JVihGSVhQX0RCTCAqcERhdCxpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvZmZ0LmggYi9hYWMvbGliRkRLL2luY2x1ZGUvZmZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2ZjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9mZnQuaApAQCAtMCwwICsxLDI1MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBEU1AgU29sdXRpb25zCisgICBEZXNjcmlwdGlvbjogRml4IHBvaW50IEZGVAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19GRlRfSF9fCisjZGVmaW5lIF9fRkZUX0hfXworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisvKioKKyAqIFxicmllZiBQZXJmb3JtIGFuIGlucGxhY2UgY29tcGxleCB2YWx1ZWQgRkZUIG9mIGxlbmd0aCAyXm4KKyAqCisgKiBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgRkZUIHRvIGJlIGNhbGN1bGF0ZWQuCisgKiBccGFyYW0gcElucHV0IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0IHNjYWxlIGhlYWRyb29tLgorICogICAgICAgICAgVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KKyAqIFxwYXJhbSBzY2FsZWZhY3RvciBQb2ludGVyIHRvIGFuIElOVCwgd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlIGlucHV0IGRhdGEsCisgKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIEZGVCBzY2FsZS4KKyAqLwordm9pZCBmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpzY2FsZWZhY3Rvcik7CisKKy8qKgorICogXGJyaWVmIFBlcmZvcm0gYW4gaW5wbGFjZSBjb21wbGV4IHZhbHVlZCBJRkZUIG9mIGxlbmd0aCAyXm4KKyAqCisgKiBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgRkZUIHRvIGJlIGNhbGN1bGF0ZWQuCisgKiBccGFyYW0gcElucHV0IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0IHNjYWxlIGhlYWRyb29tLgorICogICAgICAgICAgVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KKyAqIFxwYXJhbSBzY2FsZWZhY3RvciBQb2ludGVyIHRvIGFuIElOVCwgd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlIGlucHV0IGRhdGEsCisgKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIElGRlQgc2NhbGUuCisgKi8KK3ZvaWQgaWZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnNjYWxlZmFjdG9yKTsKKworCisvKgorICogRnJlcXVlbnRseSB1c2VkIGFuZCBmaXhlZCBzaG9ydCBsZW5ndGggRkZUcy4KKyAqLworCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgdm9pZCBGT1JDRUlOTElORSBmZnRfNChGSVhQX0RCTCAqeCkKK3sKKyAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzAsIHRtcDAsIHRtcDE7CisKKyAgICBhMDAgPSAoeFswXSArIHhbNF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgICBhMTAgPSAoeFsyXSArIHhbNl0pPj4xOyAgLyogUmUgQyArIFJlIEQgKi8KKyAgICBhMjAgPSAoeFsxXSArIHhbNV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KKyAgICBhMzAgPSAoeFszXSArIHhbN10pPj4xOyAgLyogSW0gQyArIEltIEQgKi8KKworICAgIHhbMF0gPSBhMDAgKyBhMTA7ICAgICAgIC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLworICAgIHhbMV0gPSBhMjAgKyBhMzA7ICAgICAgIC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLworCisgICAgdG1wMCA9IGEwMCAtIHhbNF07ICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdG1wMSA9IGEyMCAtIHhbNV07ICAgICAgIC8qIEltIEEgLSBJbSBCICovCisKKyAgICB4WzRdID0gYTAwIC0gYTEwOyAgICAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgICB4WzVdID0gYTIwIC0gYTMwOyAgICAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKworICAgIGExMCA9IGExMCAtIHhbNl07ICAgICAgIC8qIFJlIEMgLSBSZSBEICovCisgICAgYTMwID0gYTMwIC0geFs3XTsgICAgICAgLyogSW0gQyAtIEltIEQgKi8KKworICAgIHhbMl0gPSB0bXAwICsgYTMwOyAgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgICB4WzZdID0gdG1wMCAtIGEzMDsgICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCisgICAgeFszXSA9IHRtcDEgLSBhMTA7ICAgICAgIC8qIEltIEInID0gSW0gQSAtIEltIEIgLSBSZSBDICsgUmUgRCAqLworICAgIHhbN10gPSB0bXAxICsgYTEwOyAgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KK30KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIHZvaWQgRk9SQ0VJTkxJTkUgZmZ0XzgoRklYUF9EQkwgKngpCit7CisgICAgICAjZGVmaW5lIFdfUGlGT1VSVEggU1RDKDB4NWE4Mjc5OWEpCisKKyAgICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKKyAgICAgIEZJWFBfREJMIHlbMTZdOworCisgICAgICBhMDAgPSAoeFswXSArIHhbOF0pPj4xOworICAgICAgYTEwID0gIHhbNF0gKyB4WzEyXTsKKyAgICAgIGEyMCA9ICh4WzFdICsgeFs5XSk+PjE7CisgICAgICBhMzAgPSAgeFs1XSArIHhbMTNdOworCisgICAgICB5WzBdID0gYTAwICsgKGExMD4+MSk7CisgICAgICB5WzRdID0gYTAwIC0gKGExMD4+MSk7CisgICAgICB5WzFdID0gYTIwICsgKGEzMD4+MSk7CisgICAgICB5WzVdID0gYTIwIC0gKGEzMD4+MSk7CisKKyAgICAgIGEwMCA9IGEwMCAgICAgIC0geFs4XTsKKyAgICAgIGExMCA9IChhMTA+PjEpIC0geFsxMl07CisgICAgICBhMjAgPSBhMjAgICAgICAtIHhbOV07CisgICAgICBhMzAgPSAoYTMwPj4xKSAtIHhbMTNdOworCisgICAgICB5WzJdID0gYTAwICsgYTMwOworICAgICAgeVs2XSA9IGEwMCAtIGEzMDsKKyAgICAgIHlbM10gPSBhMjAgLSBhMTA7CisgICAgICB5WzddID0gYTIwICsgYTEwOworCisgICAgICBhMDAgPSAoeFsyXSArIHhbMTBdKT4+MTsKKyAgICAgIGExMCA9ICB4WzZdICsgeFsxNF07CisgICAgICBhMjAgPSAoeFszXSArIHhbMTFdKT4+MTsKKyAgICAgIGEzMCA9ICB4WzddICsgeFsxNV07CisKKyAgICAgIHlbOF0gID0gYTAwICsgKGExMD4+MSk7CisgICAgICB5WzEyXSA9IGEwMCAtIChhMTA+PjEpOworICAgICAgeVs5XSAgPSBhMjAgKyAoYTMwPj4xKTsKKyAgICAgIHlbMTNdID0gYTIwIC0gKGEzMD4+MSk7CisKKyAgICAgIGEwMCA9IGEwMCAgICAgIC0geFsxMF07CisgICAgICBhMTAgPSAoYTEwPj4xKSAtIHhbMTRdOworICAgICAgYTIwID0gYTIwICAgICAgLSB4WzExXTsKKyAgICAgIGEzMCA9IChhMzA+PjEpIC0geFsxNV07CisKKyAgICAgIHlbMTBdID0gYTAwICsgYTMwOworICAgICAgeVsxNF0gPSBhMDAgLSBhMzA7CisgICAgICB5WzExXSA9IGEyMCAtIGExMDsKKyAgICAgIHlbMTVdID0gYTIwICsgYTEwOworCisgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKKworICAgICAgdXIgPSB5WzBdPj4xOworICAgICAgdWkgPSB5WzFdPj4xOworICAgICAgdnIgPSB5WzhdOworICAgICAgdmkgPSB5WzldOworICAgICAgeFswXSA9IHVyICsgKHZyPj4xKTsKKyAgICAgIHhbMV0gPSB1aSArICh2aT4+MSk7CisgICAgICB4WzhdID0gdXIgLSAodnI+PjEpOworICAgICAgeFs5XSA9IHVpIC0gKHZpPj4xKTsKKworICAgICAgdXIgPSB5WzRdPj4xOworICAgICAgdWkgPSB5WzVdPj4xOworICAgICAgdmkgPSB5WzEyXTsKKyAgICAgIHZyID0geVsxM107CisgICAgICB4WzRdICA9IHVyICsgKHZyPj4xKTsKKyAgICAgIHhbNV0gID0gdWkgLSAodmk+PjEpOworICAgICAgeFsxMl0gPSB1ciAtICh2cj4+MSk7CisgICAgICB4WzEzXSA9IHVpICsgKHZpPj4xKTsKKworICAgICAgdXIgPSB5WzEwXTsKKyAgICAgIHVpID0geVsxMV07CisgICAgICB2ciA9IGZNdWx0RGl2Mih1aSt1cixXX1BpRk9VUlRIKTsKKyAgICAgIHZpID0gZk11bHREaXYyKHVpLXVyLFdfUGlGT1VSVEgpOworICAgICAgdXIgPSB5WzJdOworICAgICAgdWkgPSB5WzNdOworICAgICAgeFsyXSAgPSAodXI+PjEpICsgdnI7CisgICAgICB4WzNdICA9ICh1aT4+MSkgKyB2aTsKKyAgICAgIHhbMTBdID0gKHVyPj4xKSAtIHZyOworICAgICAgeFsxMV0gPSAodWk+PjEpIC0gdmk7CisKKyAgICAgIHVyID0geVsxNF07CisgICAgICB1aSA9IHlbMTVdOworICAgICAgdnIgPSBmTXVsdERpdjIodWktdXIsV19QaUZPVVJUSCk7CisgICAgICB2aSA9IGZNdWx0RGl2Mih1aSt1cixXX1BpRk9VUlRIKTsKKyAgICAgIHVyID0geVs2XTsKKyAgICAgIHVpID0geVs3XTsKKyAgICAgIHhbNl0gID0gKHVyPj4xKSArIHZyOworICAgICAgeFs3XSAgPSAodWk+PjEpIC0gdmk7CisgICAgICB4WzE0XSA9ICh1cj4+MSkgLSB2cjsKKyAgICAgIHhbMTVdID0gKHVpPj4xKSArIHZpOworfQorCisvKioKKyAqIFxicmllZiBGRlQgb2YgZml4ZWQgbGVuZ3RoIDE2CisgKi8KK2lubGluZSB2b2lkIGZmdF8xNihGSVhQX0RCTCAqeCk7CisKKy8qKgorICogXGJyaWVmIEZGVCBvZiBmaXhlZCBsZW5ndGggMzIKKyAqLworaW5saW5lIHZvaWQgZmZ0XzMyKEZJWFBfREJMICp4KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9mZnRfcmFkMi5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL2ZmdF9yYWQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkMTRkYQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9mZnRfcmFkMi5oCkBAIC0wLDAgKzEsMTM0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9GRlRfUkFEMl9ICisjZGVmaW5lIF9GRlRfUkFEMl9ICisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyoqCisgKiBcYnJpZWYgUGVyZm9ybWUgYW4gaW5wbGFjZSAgY29tcGxleCB2YWx1ZWQgRkZUIG9mIDJebiBsZW5ndGgKKyAqCisgKiBccGFyYW0geCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KKyAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCisgKiBccGFyYW0gbGRuIGxvZzIgb2YgRkZUIGxlbmd0aAorICogXHBhcmFtIHRyaWdkYXRhIFBvaW50ZXIgdG8gYSBzaW5ldGFibGUgb2YgYSBsZW5ndGggb2YgYXQgbGVhc3QgKDJebGRuKS8yIHNpbmUgdmFsdWVzLgorICogXHBhcmFtIHRyaWdEYXRhU2l6ZSBsZW5ndGggb2YgdGhlIHNpbmV0YWJsZSAidHJpZ2RhdGEiLgorICovCit2b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgOworCisvKioKKyAqIFxicmllZiBQZXJmb3JtZSBhbiBpbnBsYWNlIGNvbXBsZXggdmFsdWVkIGludmVyc2UgRkZUIG9mIDJebiBsZW5ndGgKKyAqCisgKiBccGFyYW0geCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KKyAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCisgKiBccGFyYW0gbGRuIGxvZzIgb2YgRkZUIGxlbmd0aAorICogXHBhcmFtIHRyaWdkYXRhIFBvaW50ZXIgdG8gYSBzaW5ldGFibGUgb2YgYSBsZW5ndGggb2YgYXQgbGVhc3QgKDJebGRuKS8yIHNpbmUgdmFsdWVzLgorICogXHBhcmFtIHRyaWdEYXRhU2l6ZSBsZW5ndGggb2YgdGhlIHNpbmV0YWJsZSAidHJpZ2RhdGEiLgorICovCit2b2lkIGRpdF9pZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpIDsKKworLyogUmVzdCBvZiB0aGUgd29ybGQuICovCisKKyNkZWZpbmUgU0NBTEVGQUNUT1IyMDQ4ICAgICAgIDEwCisjZGVmaW5lIFNDQUxFRkFDVE9SMTAyNCAgICAgICAgOQorI2RlZmluZSBTQ0FMRUZBQ1RPUjUxMiAgICAgICAgIDgKKyNkZWZpbmUgU0NBTEVGQUNUT1IyNTYgICAgICAgICA3CisjZGVmaW5lIFNDQUxFRkFDVE9SMTI4ICAgICAgICAgNgorI2RlZmluZSBTQ0FMRUZBQ1RPUjY0ICAgICAgICAgIDUKKyNkZWZpbmUgU0NBTEVGQUNUT1IzMiAgICAgICAgICA0CisjZGVmaW5lIFNDQUxFRkFDVE9SMTYgICAgICAgICAgMworI2RlZmluZSBTQ0FMRUZBQ1RPUjggICAgICAgICAgIDIKKyNkZWZpbmUgU0NBTEVGQUNUT1I0ICAgICAgICAgICAxCisjZGVmaW5lIFNDQUxFRkFDVE9SMiAgICAgICAgICAgMQorCisjZW5kaWYgLyogX0ZGVF9SQUQyX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL2ZpeG1hZGQuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9maXhtYWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxYjdhMgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9maXhtYWRkLmgKQEAgLTAsMCArMSwzMDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fRklYTUFERF9IX18pCisjZGVmaW5lIF9fRklYTUFERF9IX18KKworI2luY2x1ZGUgIkZES19hcmNoZGVmLmgiCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiZml4bXVsLmgiCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSAiYXJtL2ZpeG1hZGRfYXJtLmgiCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL2ZpeG1hZGRfbWlwcy5oIgorCisjZW5kaWYgLyogYWxsIGNvcmVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFNvZnR3YXJlIGZhbGxiYWNrcyBmb3IgbWlzc2luZyBmdW5jdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERpdmlkZSBieSB0d28gdmVyc2lvbnMuICovCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2Ml9ERCkKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKKyAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZk11bHREaXYyIChhLCBiKSk7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfU0QpCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU0QgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9EUworICByZXR1cm4gZml4bWFkZGRpdjJfRFMoeCwgYiwgYSk7CisjZWxzZQorICByZXR1cm4gZml4bWFkZGRpdjJfREQoeCwgRlhfU0dMMkZYX0RCTChhKSwgYik7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMpCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9TRAorICByZXR1cm4gZml4bWFkZGRpdjJfU0QoeCwgYiwgYSk7CisjZWxzZQorICByZXR1cm4gZml4bWFkZGRpdjJfREQoeCwgYSwgRlhfU0dMMkZYX0RCTChiKSk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfU1MpCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpCisgICAgICAgICAgICB7IHJldHVybiB4ICsgZk11bHREaXYyKGEsYik7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJfREQpCitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpCisgICAgICAgICAgICB7IHJldHVybiAoeCAtIGZNdWx0RGl2MiAoYSwgYikpOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX1NEKQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJfRFMKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX0RTKHgsIGIsIGEpOworI2Vsc2UKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX0REKHgsIEZYX1NHTDJGWF9EQkwoYSksIGIpOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RTKQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJfU0QKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGIsIGEpOworI2Vsc2UKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX0REKHgsIGEsIEZYX1NHTDJGWF9EQkwoYikpOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX1NTKQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKQorICAgICAgICAgICAgeyByZXR1cm4geCAtIGZNdWx0RGl2MihhLGIpOyB9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIHggKyBmTXVsdERpdjJCaXRFeGFjdChhLCBiKTsKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfU0QpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfU0QKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2MkJpdEV4YWN0X1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUworICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9EUyh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiB4ICsgZk11bHREaXYyQml0RXhhY3QoYSwgYik7CisjZW5kaWYKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9TRAorICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9TRCh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiB4ICsgZk11bHREaXYyQml0RXhhY3QoYSwgYik7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIHggLSBmTXVsdERpdjJCaXRFeGFjdChhLCBiKTsKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfU0QpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfU0QKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUworICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9EUyh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiB4IC0gZk11bHREaXYyQml0RXhhY3QoYSwgYik7CisjZW5kaWYKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfRFMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfRFMKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9TRAorICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9TRCh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiB4IC0gZk11bHREaXYyQml0RXhhY3QoYSwgYik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiBOb3JtYWwgdmVyc2lvbnMgKi8KKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfREQpCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZF9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0REKHgsYSxiKTw8MTsgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZF9TRCkKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZF9EUworICByZXR1cm4gZml4bWFkZF9EUyh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiBmaXhtYWRkX0REKHgsIEZYX1NHTDJGWF9EQkwoYSksIGIpOworI2VuZGlmCit9CisjZW5kaWYKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkX0RTKQoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkX1NECisgIHJldHVybiBmaXhtYWRkX1NEKHgsIGIsIGEpOworI2Vsc2UKKyAgcmV0dXJuIGZpeG1hZGRfREQoeCwgYSwgRlhfU0dMMkZYX0RCTChiKSk7CisjZW5kaWYKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfU1MpCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZF9TUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKKyAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZk11bHREaXYyKGEsYikpPDwxOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfREQpCitpbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX0REKHgsYSxiKTw8MTsgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1Yl9TRCkKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisjaWZkZWYgRlVOQ1RJT05fZml4bXN1Yl9EUworICByZXR1cm4gZml4bXN1Yl9EUyh4LCBiLCBhKTsKKyNlbHNlCisgIHJldHVybiBmaXhtc3ViX0REKHgsIEZYX1NHTDJGWF9EQkwoYSksIGIpOworI2VuZGlmCit9CisjZW5kaWYKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViX0RTKQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtc3ViX1NECisgIHJldHVybiBmaXhtc3ViX1NEKHgsIGIsIGEpOworI2Vsc2UKKyAgcmV0dXJuIGZpeG1zdWJfREQoeCwgYSwgRlhfU0dMMkZYX0RCTChiKSk7CisjZW5kaWYKK30KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfU1MpCitpbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9TUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKKyAgICAgICAgICAgIHsgcmV0dXJuICh4IC0gZk11bHREaXYyKGEsYikpPDwxOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRkaXYyX0QpCitpbmxpbmUgSU5UIGZpeHBhZGRkaXYyX0QgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEpCisgICAgICAgICAgICB7IHJldHVybiAoeCArIGZQb3cyRGl2MihhKSk7IH0KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRfRCkKK2lubGluZSBJTlQgZml4cGFkZF9EIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhKQorICAgICAgICAgICAgeyAgcmV0dXJuICh4ICsgZlBvdzIoYSkpOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRkaXYyX1MpCitpbmxpbmUgSU5UIGZpeHBhZGRkaXYyX1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEpCisgICAgICAgICAgICB7IHJldHVybiAoeCArIGZQb3cyRGl2MihhKSk7IH0KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRfUykKK2lubGluZSBJTlQgZml4cGFkZF9TIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhKQorICAgICAgICAgICAgeyAgcmV0dXJuICh4ICsgZlBvdzIoYSkpOyB9CisjZW5kaWYKKworCisKKyNlbmRpZiAvLyBfX0ZJWE1BRERfSF9fCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9maXhtaW5tYXguaCBiL2FhYy9saWJGREsvaW5jbHVkZS9maXhtaW5tYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUyODI0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2ZpeG1pbm1heC5oCkBAIC0wLDAgKzEsMTIwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCisgICBEZXNjcmlwdGlvbjogbWluL21heCBpbmxpbmUgZnVuY3Rpb25zIGFuZCBkZWZpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGSVhNSU5NQVhfX0gKKyNkZWZpbmUgRklYTUlOTUFYX19ICisKKyNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgorI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorCisvKiBJbmxpbmUgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVyL2JpZ2dlciB2YWx1ZSBvZiB0d28gdmFsdWVzIHdpdGggc2FtZSB0eXBlLiAqLworCisKK3RlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCBmaXhtaW4gKFQgYSwgVCBiKQoreworCXJldHVybiAoYSA8IGIgPyBhIDogYik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCBmaXhtYXggKFQgYSwgVCBiKQoreworCXJldHVybiAoYSA+IGIgPyBhIDogYik7Cit9CisKKyNkZWZpbmUgZml4bWF4X0QoYSxiKSBmaXhtYXgoYSxiKQorI2RlZmluZSBmaXhtaW5fRChhLGIpIGZpeG1pbihhLGIpCisjZGVmaW5lIGZpeG1heF9TKGEsYikgZml4bWF4KGEsYikKKyNkZWZpbmUgZml4bWluX1MoYSxiKSBmaXhtaW4oYSxiKQorI2RlZmluZSBmaXhtYXhfSShhLGIpIGZpeG1heChhLGIpCisjZGVmaW5lIGZpeG1pbl9JKGEsYikgZml4bWluKGEsYikKKyNkZWZpbmUgZml4bWF4X1VJKGEsYikgZml4bWF4KGEsYikKKyNkZWZpbmUgZml4bWluX1VJKGEsYikgZml4bWluKGEsYikKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9maXhtdWwuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9maXhtdWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRiYzZjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2ZpeG11bC5oCkBAIC0wLDAgKzEsMjg2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBTdGVmYW4gR2V3aW5uZXIKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBtdWx0aXBsaWNhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChfX0ZJWE1VTF9IX18pCisjZGVmaW5lIF9fRklYTVVMX0hfXworCisjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworCisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9maXhtdWxfYXJtLmgiCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL2ZpeG11bF9taXBzLmgiCisKKyNlbGlmIGRlZmluZWQoX194ODZfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgIng4Ni9maXhtdWxfeDg2LmgiCisKKyNlbmRpZiAvKiBhbGwgY29yZXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgU29mdHdhcmUgZmFsbGJhY2tzIGZvciBtaXNzaW5nIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsZGl2Ml9ERCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERAorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BTkFMT0dfRVhURU5TSU9OU19fKSB8fCBkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKQorI3ByYWdtYSBtZXNzYWdlICgiRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2Ml9ERCAhISIpCisjZWxzZQorI3dhcm5pbmcgRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2Ml9ERCAhIQorI2VuZGlmCitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX0REIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKK3sKKyAgcmV0dXJuIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BTkFMT0dfRVhURU5TSU9OU19fKSB8fCBkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKQorI3ByYWdtYSBtZXNzYWdlICgiRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2MkJpdEV4YWN0X0REICEhIikKKyNlbHNlCisjd2FybmluZyBFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxkaXYyQml0RXhhY3RfREQgISEKKyNlbmRpZgoraW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X0REIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKK3sKKyAgcmV0dXJuIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfREQpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9ERAoraW5saW5lIExPTkcgZml4bXVsX0REIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKKyAgeyByZXR1cm4gZml4bXVsZGl2Ml9ERCAoYSwgYikgPDwgMSA7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfREQpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RECisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX0FOQUxPR19FWFRFTlNJT05TX18pIHx8IGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pIHx8IGRlZmluZWQoX19YVEVOU0FfXykKKyNwcmFnbWEgbWVzc2FnZSAoIkV4dHJlbWVseSBzbG93IGltcGxlbWVudGF0aW9uIG9mIGZpeG11bEJpdEV4YWN0X0REICEhIikKKyNlbHNlCisjd2FybmluZyBFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxCaXRFeGFjdF9ERCAhIQorI2VuZGlmCitpbmxpbmUgTE9ORyBmaXhtdWxCaXRFeGFjdF9ERCAoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCit7CisgIHJldHVybiAoIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgKSA8PCAxOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyX1NTKQorI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX1NTCitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX1NTIChjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKQorICB7IHJldHVybiAoKExPTkcpYSpiKTsgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfU1MpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9TUworaW5saW5lIExPTkcgZml4bXVsX1NTIChjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKQorICB7IHJldHVybiAoYSpiKSA8PDE7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsZGl2Ml9TRCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9TRAoraW5saW5lIExPTkcgZml4bXVsZGl2Ml9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfRFMKKyAgeyByZXR1cm4gZml4bXVsZGl2Ml9EUyhiLCBhKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChGWF9TR0wyRlhfREJMKGEpLCBiKTsgfQorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJfRFMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfRFMKK2lubGluZSBMT05HIGZpeG11bGRpdjJfRFMgKGNvbnN0IExPTkcgYSwgY29uc3QgU0hPUlQgYikKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NECisgIHsgcmV0dXJuIGZpeG11bGRpdjJfU0QoYiwgYSk7IH0KKyNlbHNlCisgIHsgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgRlhfU0dMMkZYX0RCTChiKSk7IH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfU0QpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9TRAoraW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTCisgIHsgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhiLCBhKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA7IH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUworaW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X1NECisgIHsgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9TRChiLCBhKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA7IH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfU0QpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9TRAoraW5saW5lIExPTkcgZml4bXVsX1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxfRFMKKyAgcmV0dXJuIGZpeG11bF9TRChiLCBhKTsKKyNlbHNlCisgIHJldHVybiBmaXhtdWxkaXYyX1NEIChhLCBiKSA8PCAxIDsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfRFMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9EUworaW5saW5lIExPTkcgZml4bXVsX0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpIHsKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxfU0QKKyAgcmV0dXJuIGZpeG11bF9TRChiLCBhKTsKKyNlbHNlCisgIHJldHVybiBmaXhtdWxkaXYyX0RTKGEsIGIpIDw8IDEgOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X1NEKQorI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9TRAoraW5saW5lIExPTkcgZml4bXVsQml0RXhhY3RfU0QgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUworICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9EUyhiLCBhKTsgfQorI2Vsc2UKKyAgeyByZXR1cm4gKExPTkcpICgoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgPDwgMSk7IH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUykKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKK2lubGluZSBMT05HIGZpeG11bEJpdEV4YWN0X0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfU0QKKyAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfU0QoYiwgYSk7IH0KKyNlbHNlCisgIHsgcmV0dXJuIChMT05HKSAoKCgoKElOVDY0KWEpICogYikgPj4gMTYpIDw8IDEpOyB9CisjZW5kaWYKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyZGl2Ml9EKQorI2lmZGVmIEFSQ0hfV0FfMTZCSVRNVUxUCisjZXJyb3IgRmFsbGJhY2sgZm9yIGZpeHBvdzJkaXYyX0QgaXMgbm90IDE2IGJpdCBzYWZlICEKKyNlbmRpZgorI2RlZmluZSBGVU5DVElPTl9maXhwb3cyZGl2Ml9ECitpbmxpbmUgTE9ORyBmaXhwb3cyZGl2Ml9EIChjb25zdCBMT05HIGEpCisgIHsgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgYSk7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93Ml9EKQorI2lmZGVmIEFSQ0hfV0FfMTZCSVRNVUxUCisjZXJyb3IgRmFsbGJhY2sgZm9yIGZpeHBvdzJfRCBpcyBub3QgMTYgYml0IHNhZmUgIQorI2VuZGlmCisjZGVmaW5lIEZVTkNUSU9OX2ZpeHBvdzJfRAoraW5saW5lIExPTkcgZml4cG93Ml9EIChjb25zdCBMT05HIGEpCisgIHsgcmV0dXJuIGZpeHBvdzJkaXYyX0QoYSk8PDE7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmRpdjJfUykKKyNkZWZpbmUgRlVOQ1RJT05fZml4cG93MmRpdjJfUworaW5saW5lIExPTkcgZml4cG93MmRpdjJfUyAoY29uc3QgU0hPUlQgYSkKKyAgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBhKTsgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyX1MpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeHBvdzJfUworaW5saW5lIExPTkcgZml4cG93Ml9TIChjb25zdCBTSE9SVCBhKQorICB7IHJldHVybiBmaXhwb3cyZGl2Ml9TKGEpPDwxOyB9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19GSVhNVUxfSF9fICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvZml4cG9pbnRfbWF0aC5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjE0MWQzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaApAQCAtMCwwICsxLDQ2NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gR2F5ZXIKKyAgIERlc2NyaXB0aW9uOiBGaXhlZCBwb2ludCBzcGVjaWZpYyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX2ZpeHBvaW50X21hdGhfSAorI2RlZmluZSBfX2ZpeHBvaW50X21hdGhfSAorCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKworI2RlZmluZSBMRF9EQVRBX1NDQUxJTkcgKDY0LjBmKQorI2RlZmluZSBMRF9EQVRBX1NISUZUICAgNiAgIC8qIHBvdygyLCBMRF9EQVRBX1NISUZUKSA9IExEX0RBVEFfU0NBTElORyAqLworCisvKioKKyAqIFxicmllZiBkZXByZWNhdGVkLiBVc2UgZkxvZzIoKSBpbnN0ZWFkLgorICovCitGSVhQX0RCTCBDYWxjTGREYXRhKEZJWFBfREJMIG9wKTsKKwordm9pZCBMZERhdGFWZWN0b3IoRklYUF9EQkwgKnNyY1ZlY3RvciwgRklYUF9EQkwgKmRlc3RWZWN0b3IsIElOVCBudW1iZXIpOworCitGSVhQX0RCTCBDYWxjSW52TGREYXRhKEZJWFBfREJMIG9wKTsKKworCit2b2lkICAgICBJbml0TGRJbnQoKTsKK0ZJWFBfREJMIENhbGNMZEludChJTlQgaSk7CisKK2V4dGVybiBjb25zdCBVU0hPUlQgc3FydF90YWJbNDldOworCitpbmxpbmUgRklYUF9EQkwgc3FydEZpeHBfbG9va3VwKEZJWFBfREJMIHgpCit7CisgIFVJTlQgeSA9IChJTlQpeDsKKyAgVUNIQVIgaXNfemVybz0oeT09MCk7CisgIElOVCB6ZXJvcz1maXhub3Jtel9EKHkpICYgMHgxZTsKKyAgeTw8PXplcm9zOworICBVSU5UIGlkeD0oeT4+MjYpLTE2OworICBVU0hPUlQgZnJhYz0oeT4+MTApJjB4ZmZmZjsKKyAgVVNIT1JUIG5mcmFjPTB4ZmZmZl5mcmFjOworICBVSU5UIHQ9bmZyYWMqc3FydF90YWJbaWR4XStmcmFjKnNxcnRfdGFiW2lkeCsxXTsKKyAgdD10Pj4oemVyb3M+PjEpOworICByZXR1cm4oaXNfemVybyA/IDAgOiB0KTsKK30KKworaW5saW5lIEZJWFBfREJMIHNxcnRGaXhwX2xvb2t1cChGSVhQX0RCTCB4LCBJTlQgKnhfZSkKK3sKKyAgVUlOVCB5ID0gKElOVCl4OworICBJTlQgZTsKKworICBpZiAoeCA9PSAoRklYUF9EQkwpMCkgeworICAgIHJldHVybiB4OworICB9CisKKyAgLyogTm9ybWFsaXplICovCisgIGU9Zml4bm9ybXpfRCh5KTsKKyAgeTw8PWU7CisgIGUgID0gKnhfZSAtIGUgKyAyOworCisgIC8qIENvcnJlY3Qgb2RkIGV4cG9uZW50LiAqLworICBpZiAoZSAmIDEpIHsKKyAgICB5ID4+PSAxOworICAgIGUgKys7CisgIH0KKyAgLyogR2V0IHNxdWFyZSByb290ICovCisgIFVJTlQgaWR4PSh5Pj4yNiktMTY7CisgIFVTSE9SVCBmcmFjPSh5Pj4xMCkmMHhmZmZmOworICBVU0hPUlQgbmZyYWM9MHhmZmZmXmZyYWM7CisgIFVJTlQgdD1uZnJhYypzcXJ0X3RhYltpZHhdK2ZyYWMqc3FydF90YWJbaWR4KzFdOworCisgIC8qIFdyaXRlIGJhY2sgZXhwb25lbnQgKi8KKyAgKnhfZSA9IGUgPj4gMTsKKyAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykodD4+MSk7Cit9CisKKworCitGSVhQX0RCTCBzcXJ0Rml4cChGSVhQX0RCTCBvcCk7CisKK3ZvaWQgSW5pdEludlNxcnRUYWIoKTsKKworRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGludkZpeHAKKyAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvKG9wKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2lubGluZSBGSVhQX0RCTCBpbnZGaXhwKEZJWFBfREJMIG9wKQoreworICAgIElOVCB0bXBfZXhwIDsKKyAgICBGSVhQX0RCTCB0bXBfaW52ID0gaW52U3FydE5vcm0yKG9wLCAmdG1wX2V4cCkgOworICAgIEZES19BU1NFUlQoKDMxLSgyKnRtcF9leHArMSkpPj0wKSA7CisgICAgcmV0dXJuICggZlBvdzJEaXYyKCAoRklYUF9EQkwpdG1wX2ludiApID4+ICgzMS0oMip0bXBfZXhwKzEpKSApIDsKK30KKworCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX189PTIpCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NodXJfZGl2CitpbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQoreworICBJTlQgcmVzdWx0LCB0bXAgOworICAgX19hc21fXyAoInNybCAlMSwgJTIsIDE1XG4iCisgICAgICAgICAgICAiZGl2ICUzLCAlMVxuIiA6ICI9bG8iIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZCIgKHRtcCksICJkIiAoZGVudW0pICwgICJkIiAobnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiaGkiICkgOworICByZXR1cm4gcmVzdWx0PDwxNiA7Cit9CisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX189PTMpCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NodXJfZGl2CitpbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQoreworICBJTlQgcmVzdWx0LCB0bXA7CisKKyAgIF9fYXNtX18gKCJzcmwgICVbdG1wXSwgJVtkZW51bV0sIDE1XG4iCisgICAgICAgICAgICAiZGl2ICVbcmVzdWx0XSwgJVtudW1dLCAlW3RtcF1cbiIKKyAgICAgICAgICAgIDogW3RtcF0gIityIiAodG1wKSwgW3Jlc3VsdF0iPXIiKHJlc3VsdCkKKyAgICAgICAgICAgIDogW2RlbnVtXSJyIihkZW51bSksIFtudW1dInIiKG51bSkKKyAgICAgICAgICAgIDogImhpIiwgImxvIik7CisgIHJldHVybiByZXN1bHQgPDwgKERGUkFDVF9CSVRTLTE2KTsKK30KKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKyNlbGlmIGRlZmluZWQoU0lNVUxBVEVfTUlQU19ESVYpCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NodXJfZGl2CitpbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKK3sKKyAgICBGREtfQVNTRVJUIChjb3VudDw9REZSQUNUX0JJVFMtMSk7CisgICAgRkRLX0FTU0VSVCAobnVtPj0oRklYUF9EQkwpMCk7CisgICAgRkRLX0FTU0VSVCAoZGVudW0+KEZJWFBfREJMKTApOworICAgIEZES19BU1NFUlQgKG51bSA8PSBkZW51bSk7CisKKyAgICBJTlQgdG1wID0gZGVudW0gPj4gKGNvdW50LTEpOworICAgIElOVCByZXN1bHQgPSAwOworCisgICAgd2hpbGUgKG51bSA+IHRtcCkKKyAgICB7CisgICAgICAgIG51bSAtPSB0bXA7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQgPDwgKERGUkFDVF9CSVRTLWNvdW50KTsKK30KKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKyNlbmRpZiAvKiB0YXJnZXQgYXJjaGl0ZWN0dXJlIHNlbGVjdG9yICovCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpCisvKioKKyAqIFxicmllZiBEaXZpZGUgdHdvIEZJWFBfREJMIHZhbHVlcyB3aXRoIGdpdmVuIHByZWNpc2lvbi4KKyAqIFxwYXJhbSBudW0gZGl2aWRlbmQKKyAqIFxwYXJhbSBkZW51bSBkaXZpc29yCisgKiBccGFyYW0gY291bnQgYW1vdW50IG9mIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJlc3VsdCAoc3RhcnRpbmcgdG8gdGhlIE1TQikKKyAqIFxyZXR1cm4gbnVtL2Rpdmlzb3IKKyAqLworRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KTsKKyNlbmRpZgorCisKKworRklYUF9EQkwgbXVsX2RibF9zZ2xfcm5kIChjb25zdCBGSVhQX0RCTCBvcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIG9wMik7CisKKy8qKgorICogXGJyaWVmIG11bHRpcGx5IHR3byB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uLCB0aHVzIG1heCBwcmVjaXNpb24uCisgKiBBdXRob3I6IFJvYmVydCBXZWlkbmVyCisgKgorICogXHBhcmFtIGYxIGZpcnN0IGZhY3RvcgorICogXHBhcmFtIGYyIHNlY29kIGZhY3RvcgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbnRvCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSBwcm9kdWN0IGYxKmYyCisgKi8KK0ZJWFBfREJMIGZNdWx0Tm9ybSgKKyAgICAgICAgRklYUF9EQkwgZjEsCisgICAgICAgIEZJWFBfREJMIGYyLAorICAgICAgICBJTlQgKnJlc3VsdF9lCisgICAgICAgICk7CisKK2lubGluZSBGSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyKQoreworICBGSVhQX0RCTCBtOworICBJTlQgZTsKKworICBtID0gZk11bHROb3JtKGYxLCBmMiwgJmUpOworCisgIG0gPSBzY2FsZVZhbHVlU2F0dXJhdGUobSwgZSk7CisKKyAgcmV0dXJuIG07Cit9CisKKy8qKgorICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgorICogXHBhcmFtIG51bSBudW1lcmF0b3IKKyAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCisgKi8KK0ZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiBEaXZpZGUgMiBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uIG9mIGlucHV0IHZhbHVlcy4KKyAqIFxwYXJhbSBudW0gbnVtZXJhdG9yCisgKiBccGFyYW0gZGVudW0gZGVub21pbnRhdG9yCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgc3RvcmVkIGludG8KKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAqcmVzdWx0X2UKKyAqLworRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSk7CisKKy8qKgorICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgorICogXHBhcmFtIG51bSBudW1lcmF0b3IKKyAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCisgKi8KK0ZJWFBfREJMIGZEaXZOb3JtSGlnaFByZWMoRklYUF9EQkwgTF9udW0sIEZJWFBfREJMIExfZGVudW0sIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgbG9nKGFyZ3VtZW50KS9sb2coMikgKGxvZ2FyaXRobSB3aXRoIGJhc2UgMikuIGRlcHJlY2F0ZWQuIFVzZSBmTG9nMigpIGluc3RlYWQuCisgKiBccGFyYW0gYXJnIG1hbnRpc3NhIG9mIHRoZSBhcmd1bWVudAorICogXHBhcmFtIGFyZ19lIGV4cG9uZW50IG9mIHRoZSBhcmd1bWVudAorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHRvIHN0b3JlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CisgKiBccmV0dXJuIHRoZSBtYW50aXNzYSBvZiB0aGUgcmVzdWx0LgorICogXHBhcmFtCisgKi8KK0ZJWFBfREJMIENhbGNMb2cyKEZJWFBfREJMIGFyZywgSU5UIGFyZ19lLCBJTlQgKnJlc3VsdF9lKTsKKworLyoqCisgKiBcYnJpZWYgcmV0dXJuIDIgXiAoZXhwICogMl5leHBfZSkKKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLworRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSk7CisKKy8qKgorICogXGJyaWVmIHJldHVybiAyIF4gKGV4cF9tICogMl5leHBfZSkuIFRoaXMgdmVyc2lvbiByZXR1cm5zIG9ubHkgdGhlIG1hbnRpc3NhIHdpdGggaW1wbGljaXQgZXhwb25lbnQgb2YgemVyby4KKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLworRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSk7CisKKy8qKgorICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKKyAqICAgICAgICB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhIGNvbnN0YW50KS4KKyAqIFxwYXJhbSBsZHhfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBsZHhfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLworRklYUF9EQkwgZkxkUG93KAorICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwKKyAgICAgICAgSU5UIGJhc2VMZF9lLAorICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAorICAgICAgICBJTlQgKnJlc3VsdF9lCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKKyAqICAgICAgICB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhIGNvbnN0YW50KS4gVGhpcyB2ZXJzaW9uCisgKiAgICAgICAgZG9lcyBub3QgcmV0dXJuIGFuIGV4cG9uZW50LCB3aGljaCBpcyBpbXBsaWNpdGx5IDAuCisgKiBccGFyYW0gbGR4X20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gbGR4X2UgZXhwb25lbnQgb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGZMZFBvdygKKyAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKKyAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZQorICAgICAgICApOworCisvKioKKyAqIFxicmllZiByZXR1cm4gKGJhc2UgKiAyXmJhc2VfZSkgXiAoZXhwICogMl5leHBfZSkuIFVzZSBmTGRQb3coKSBpbnN0ZWFkIHdoZW5ldmVyIHBvc3NpYmxlLgorICogXHBhcmFtIGJhc2VfbSBtYW50aXNzYSBvZiB0aGUgYmFzZS4KKyAqIFxwYXJhbSBiYXNlX2UgZXhwb25lbnQgb2YgdGhlIGJhc2UuCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZS4KKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlLgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KKyAqLworRklYUF9EQkwgZlBvdyhGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiByZXR1cm4gKGJhc2UgKiAyXmJhc2VfZSkgXiBOCisgKiBccGFyYW0gYmFzZSBtYW50aXNzYSBvZiB0aGUgYmFzZQorICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZQorICogXHBhcmFtIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UKKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCitGSVhQX0RCTCBmUG93SW50KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UIE4sIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgbG9nYXJpdGhtIG9mIGJhc2UgMiBvZiB4X20gKiAyXih4X2UpCisgKiBccGFyYW0geF9tIG1hbnRpc3NhIG9mIHRoZSBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSB4X2UgZXhwb25lbnQgb2YgdGhlIGlucHV0IHZhbHVlLgorICogXHBhcmFtIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGludG8uCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCisgKi8KK0ZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSk7CisKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSBsb2dhcml0aG0gb2YgYmFzZSAyIG9mIHhfbSAqIDJeKHhfZSkKKyAqIFxwYXJhbSB4X20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgorICogXHBhcmFtIHhfZSBleHBvbmVudCBvZiB0aGUgaW5wdXQgdmFsdWUuCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiBMRF9EQVRBX1NISUZULgorICovCitGSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UpOworCisvKioKKyAqIFxicmllZiBBZGQgd2l0aCBzYXR1cmF0aW9uIG9mIHRoZSByZXN1bHQuCisgKiBccGFyYW0gYSBmaXJzdCBzdW1tYW5kCisgKiBccGFyYW0gYiBzZWNvbmQgc3VtbWFuZAorICogXHJldHVybiBzYXR1cmF0ZWQgc3VtIG9mIGEgYW5kIGIuCisgKi8KK2lubGluZSBGSVhQX1NHTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKK3sKKyAgTE9ORyBzdW07CisKKyAgc3VtID0gKExPTkcpKFNIT1JUKWEgKyAoTE9ORykoU0hPUlQpYjsKKyAgc3VtID0gZk1heChmTWluKChJTlQpc3VtLCAoSU5UKU1BWFZBTF9TR0wpLCAoSU5UKU1JTlZBTF9TR0wpOworICByZXR1cm4gKEZJWFBfU0dMKShTSE9SVClzdW07Cit9CisKKy8qKgorICogXGJyaWVmIEFkZCB3aXRoIHNhdHVyYXRpb24gb2YgdGhlIHJlc3VsdC4KKyAqIFxwYXJhbSBhIGZpcnN0IHN1bW1hbmQKKyAqIFxwYXJhbSBiIHNlY29uZCBzdW1tYW5kCisgKiBccmV0dXJuIHNhdHVyYXRlZCBzdW0gb2YgYSBhbmQgYi4KKyAqLworaW5saW5lIEZJWFBfREJMIGZBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQoreworICBMT05HIHN1bTsKKworICBzdW0gPSAoTE9ORykoYT4+MSkgKyAoTE9ORykoYj4+MSk7CisgIHN1bSA9IGZNYXgoZk1pbigoSU5UKXN1bSwgKElOVCkoTUFYVkFMX0RCTD4+MSkpLCAoSU5UKShNSU5WQUxfREJMPj4xKSk7CisgIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHN1bTw8MSk7Cit9CisKKy8vI2RlZmluZSBURVNUX1JPVU5ESU5HCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgYXJyYXkgZm9yIDEvbiwgbj0xLi41MAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiBjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs1MF07CisKKyAgTE5LX1NFQ1RJT05fSU5JVENPREUKKyAgaW5saW5lIHZvaWQgSW5pdEludkludCh2b2lkKSB7fQorCisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgMS9pIHdoZXJlIGkgaXMgYSBpbnRlZ2VyIHZhbHVlLiBJdCBzdXBwb3J0cworICogICAgICAgIGlucHV0IHZhbHVlcyBmcm9tIDEgdXB0byA1MC4KKyAqIFxwYXJhbSBpbnRWYWx1ZSBJbnRlZ2VyIGlucHV0IHZhbHVlLgorICogXHBhcmFtIEZJWFBfREJMIHJlcHJlc2VudGF0aW9uIG9mIDEvaW50VmFsdWUKKyAqLworaW5saW5lIEZJWFBfREJMIEdldEludkludChpbnQgaW50VmFsdWUpCit7CisgIEZES19BU1NFUlQoKGludFZhbHVlID4gMCkgJiYgKGludFZhbHVlIDwgNTApKTsKKyAgRkRLX0FTU0VSVChpbnRWYWx1ZTw1MCk7CisJcmV0dXJuIGludkNvdW50W2ludFZhbHVlXTsKK30KKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL21kY3QuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9tZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMmQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9tZGN0LmgKQEAgLTAsMCArMSwyNDMgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIsIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IE1EQ1Qgcm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTURDVF9IX18KKyNkZWZpbmUgX19NRENUX0hfXworCisKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBNRENUX09VVF9IRUFEUk9PTSAgICAgMiAvKiBPdXRwdXQgYWRkaXRpb25hbCBoZWFkcm9vbSAqLworI2RlZmluZSBNRENUX09VVFBVVF9TQ0FMRSAgICAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtTURDVF9PVVRfSEVBRFJPT00pCisvKiBSZWZlciB0byAiT3V0cHV0IHdvcmQgbGVuZ3RoIiBpbiBJU08vSUVDIDE0NDk2LTM6MjAwOChFKSAyMy4yLjMuNiAqLworI2RlZmluZSBNRENUX09VVFBVVF9HQUlOICAgICAgMTYKKworI2lmIChTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUykKKyNkZWZpbmUgSU1EQ1RfU0NBTEUoeCkgKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh4LCAtTURDVF9PVVRQVVRfU0NBTEUsIFNBTVBMRV9CSVRTKQorI2Vsc2UKKyNkZWZpbmUgSU1EQ1RfU0NBTEUoeCkgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoeCwgTURDVF9PVVRQVVRfU0NBTEUsIFNBTVBMRV9CSVRTKQorI2VuZGlmCisjZGVmaW5lIElNRENUX1NDQUxFX0RCTCh4KSAoRklYUF9EQkwpKHgpCisKKy8qKgorICogXGJyaWVmIE1EQ1QgcGVyc2lzdGVudCBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5pb24geworICAgIEZJWFBfREJMICpmcmVxOworICAgIEZJWFBfREJMICp0aW1lOworICB9IG92ZXJsYXA7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gb3ZlcmxhcCBtZW1vcnkgKi8KKworICBjb25zdCBGSVhQX1dUUCAqcHJldl93cnM7ICAgICAgICAvKio8IHBvaW50ZXIgdG8gcHJldmlvdXMgcmlnaHQgd2luZG93IHNsb3BlICAqLworICBpbnQgcHJldl90bDsgICAgICAgICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHRyYW5mb3JtIGxlbmd0aCAqLworICBpbnQgcHJldl9ucjsgICAgICAgICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBvZmZzZXQgKi8KKyAgaW50IHByZXZfZnI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcmV2aW91cyByaWdodCB3aW5kb3cgc2xvcGUgbGVuZ3RoICovCisgIGludCBvdl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgb3ZlcmxhcCB0aW1lIGRhdGEgZmlsbCBsZXZlbCAqLworICBpbnQgb3Zfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE92ZXJsYXAgYnVmZmVyIHNpemUgaW4gd29yZHMgKi8KKworfSBtZGN0X3Q7CisKK3R5cGVkZWYgbWRjdF90KiBIX01EQ1Q7CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgYXMgdmFsaWQgTURDVCBoYW5kbGUKKyAqCisgKiBccGFyYW0gaE1kY3QgaGFuZGxlIG9mIGFuIGFsbG9jYXRlZCBNRENUIGhhbmRsZS4KKyAqIFxwYXJhbSBvdmVybGFwIHBvaW50ZXIgdG8gRklYUF9EQkwgb3ZlcmxhcCBidWZmZXIuCisgKiBccGFyYW0gb3ZlcmxhcEJ1ZmZlclNpemUgc2l6ZSBpbiBGSVhQX0RCTHMgb2YgdGhlIGdpdmVuIG92ZXJsYXAgYnVmZmVyLgorICogXHJldHVybiB2b2lkCisgKi8KK3ZvaWQgbWRjdF9pbml0KCBIX01EQ1QgaE1kY3QsCisgICAgICAgICAgICAgICAgRklYUF9EQkwgKm92ZXJsYXAsCisgICAgICAgICAgICAgICAgSU5UIG92ZXJsYXBCdWZmZXJTaXplICk7CisKKy8qKgorICogXGJyaWVmIHBlcmZvcm0gTURDVCB0cmFuc2Zvcm0gKHRpbWUgZG9tYWluIHRvIGZyZXF1ZW5jeSBkb21haW4pIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy4KKyAqCisgKiBccGFyYW0gaE1kY3QgaGFuZGxlIG9mIGFuIGFsbG9jYXRlZCBNRENUIGhhbmRsZS4KKyAqIFxwYXJhbSBzcGVjdHJ1bSBwb2ludGVyIHRvIHdoZXJlIHRoZSByZXN1bHRpbmcgTURDVCBzcGVjdHJ1bSB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIHNjYWxlZmFjdG9yIHBvaW50ZXIgdG8gdGhlIGlucHV0IHNjYWxlIHNoaWZ0IHZhbHVlLiBVcGRhdGVkIGFjY29yZGluZ2x5IG9uIHJldHVybi4KKyAqIFxwYXJhbSBpbnB1dCBwb2ludGVyIHRvIGlucHV0IHRpbWUgZG9tYWluIHNpZ25hbAorICogXHBhcmFtIHRsIHRyYW5zZm9ybWF0aW9uIGxlbmd0aC4KKyAqIFxwYXJhbSBuciByaWdodCB3aW5kb3cgc2xvcGUgb2Zmc2V0IChhbW91bnQgb2Ygd2luZG93IGNvZWZmaWNpZW50cyBhc3N1bWVkIHRvIGJlIDEuMCkKKyAqIFxwYXJhbSBmciByaWdodCBvdmVybGFwIHdpbmRvdyBzbG9wZSBsZW5ndGgKKyAqIFxwYXJhbSB3cnMgcG9pbnRlciB0byB0aGUgcmlnaHQgc2lkZSBvdmVybGFwIHdpbmRvdyBjb2VmZmljaWVudHMuCisgKiBccmV0dXJuIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIHByb2Nlc3NlZC4KKyAqLworSU5UICBtZGN0X2Jsb2NrKAorICAgICAgICBIX01EQ1QgaE1kY3QsCisgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgSU5UICpzY2FsZWZhY3RvciwKKyAgICAgICAgSU5UX1BDTSAqaW5wdXQsCisgICAgICAgIElOVCB0bCwKKyAgICAgICAgSU5UIG5yLAorICAgICAgICBJTlQgZnIsCisgICAgICAgIGNvbnN0IEZJWFBfV1RCICp3cnMgKTsKKworCisvKioKKyAqIFxicmllZiBhZGQvbXVsdGlwbHkgMi9OIHRyYW5zZm9ybSBnYWluIGFuZCBNUEVHNCBwYXJ0IDMgZGVmaW5lZCBvdXRwdXQgZ2FpbiAoc2VlIGRlZmluaXRpb24KKyAqICAgICAgICBvZiBNRENUX09VVFBVVF9HQUlOKSB0byBnaXZlbiBtYW50aXNzYSBmYWN0b3IgYW5kIGV4cG9uZW50LgorICogXHBhcmFtIHBHYWluIHBvaW50ZXIgdG8gdGhlIG1hbnRpc3NhIG9mIGEgZ2FpbiBmYWN0b3IgdG8gYmUgYXBwbGllZCB0byBJTURDVCBkYXRhLgorICogXHBhcmFtIHBFeHBvbmVudCBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiBhIGdhaW4gZmFjdG9yIHRvIGJlIGFwcGxpZWQgdG8gSU1EQ1QgZGF0YS4KKyAqIFxwYXJhbSB0bCBsZW5ndGggb2YgdGhlIElNRENUIHdoZXJlIHRoZSBnYWluICpwR2FpbiAqICgyIF4gKnBFeHBvbmVudCkgd2lsbCBiZSBhcHBsaWVkIHRvLgorICovCit2b2lkIGltZGN0X2dhaW4oCisgICAgICAgIEZJWFBfREJMICpwR2FpbiwKKyAgICAgICAgaW50ICpwRXhwb25lbnQsCisgICAgICAgIGludCB0bAorICAgICAgICApOworCisvKioKKyAqIFxicmllZiBkcmFpbiBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBpbnRvIGdpdmVuIGJ1ZmZlci4gQ2hhbmdlcyB0aGUgTURDVCBzdGF0ZS4KKyAqLworSU5UIGltZGN0X2RyYWluKAorICAgICAgICBIX01EQ1QgaE1kY3QsCisgICAgICAgIEZJWFBfREJMICogcFRpbWVEYXRhLAorICAgICAgICBJTlQgbnJTYW1wbGVzUm9vbQorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmIENvcHkgb3ZlcmxhcCB0aW1lIGRvbWFpbiBkYXRhIHRvIGdpdmVuIGJ1ZmZlci4gRG9lcyBub3QgY2hhbmdlIHRoZSBNRENUIHN0YXRlLgorICogXHJldHVybiBudW1iZXIgb2YgYWN0dWFsbHkgY29waWVkIHNhbXBsZXMgKG92ICsgbnIpLgorICovCitJTlQgaW1kY3RfY29weV9vdl9hbmRfbnIoCisgICAgICAgIEhfTURDVCBoTWRjdCwKKyAgICAgICAgRklYUF9EQkwgKiBwVGltZURhdGEsCisgICAgICAgIElOVCBuclNhbXBsZXMKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgQWRhcHQgTURDVCBwYXJhbWV0ZXJzIGZvciBub24tbWF0Y2hpbmcgd2luZG93IHNsb3Blcy4KKyAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgorICogXHBhcmFtIHBmbCBwb2ludGVyIHRvIGxlZnQgb3ZlcmxhcCB3aW5kb3cgc2lkZSBsZW5ndGguCisgKiBccGFyYW0gcG5sIHBvaW50ZXIgdG8gbGVuZ3RoIG9mIHRoZSBsZWZ0IG4gcGFydCBvZiB0aGUgd2luZG93LgorICogXHBhcmFtIHRsIHRyYW5zZm9ybSBsZW5ndGguCisgKiBccGFyYW0gd2xzIHBvaW50ZXIgdG8gdGhlIGxlZnQgc2lkZSBvdmVybGFwIHdpbmRvdyBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gbm9PdXRTYW1wbGVzIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzLgorICovCit2b2lkIGltZGN0X2FkYXB0X3BhcmFtZXRlcnMoSF9NRENUIGhNZGN0LCBpbnQgKnBmbCwgaW50ICpwbmwsIGludCB0bCwgY29uc3QgRklYUF9XVFAgKndscywgaW50IG5vT3V0U2FtcGxlcyk7CisKKy8qKgorICogXGJyaWVmIHBlcmZvcm0gc2V2ZXJhbCBpbnZlcnNlIE1EQ1QgdHJhbnNmb3JtcyAoZnJlcXVlbmN5IGRvbWFpbiB0byB0aW1lIGRvbWFpbikgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgorICoKKyAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgorICogXHBhcmFtIG91dHB1dCBwb2ludGVyIHRvIHdoZXJlIHRoZSBvdXRwdXQgdGltZSBkb21haW4gc2lnbmFsIHdpbGwgYmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gc3RyaWRlIHRoZSBzdHJpZGUgZmFjdG9yIGZvciBhY2Nlc3NpbmcgdGltZSBkb21haW4gc2FtcGxlcyBpbiBvdXRwdXQuCisgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byB0aGUgaW5wdXQgTURDVCBzcGVjdHJhLgorICogXHBhcmFtIHNjYWxlZmFjdG9ycyBzY2FsZSBzaGlmdCB2YWx1ZXMgb2YgdGhlIGlucHV0IHNwZWN0cnVtLgorICogXHBhcmFtIG5TcGVjIG51bWJlciBvZiBNRENUIHNwZWN0cnVtcy4KKyAqIFxwYXJhbSBub091dFNhbXBsZXMgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMuCisgKiBccGFyYW0gdGwgdHJhbnNmb3JtIGxlbmd0aC4KKyAqIFxwYXJhbSB3bHMgcG9pbnRlciB0byB0aGUgbGVmdCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBmbCBsZWZ0IG92ZXJsYXAgd2luZG93IHNpZGUgbGVuZ3RoLgorICogXHBhcmFtIHdycyBwb2ludGVyIHRvIHRoZSByaWdodCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cyBvZiBhbGwgaW5kaXZpZHVhbCBJTURDVHMuCisgKiBccGFyYW0gZnIgcmlnaHQgb3ZlcmxhcCB3aW5kb3cgc2lkZSBsZW5ndGggb2YgYWxsIGluZGl2aWR1YWwgSU1EQ1RzLgorICogXHBhcmFtIGdhaW4gZmFjdG9yIHRvIGFwcGx5IHRvIG91dHB1dCBzYW1wbGVzIChpZiAhPSAwKS4KKyAqIFxyZXR1cm4gbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIHJldHVybmVkLgorICovCitJTlQgIGltZGN0X2Jsb2NrKAorICAgICAgICBIX01EQ1QgaE1kY3QsCisgICAgICAgIEZJWFBfREJMICpvdXRwdXQsCisgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgY29uc3QgU0hPUlQgc2NhbGVmYWN0b3JbXSwKKyAgICAgICAgY29uc3QgSU5UIG5TcGVjLAorICAgICAgICBjb25zdCBJTlQgbm9PdXRTYW1wbGVzLAorICAgICAgICBjb25zdCBJTlQgdGwsCisgICAgICAgIGNvbnN0IEZJWFBfV1RQICp3bHMsCisgICAgICAgIElOVCBmbCwKKyAgICAgICAgY29uc3QgRklYUF9XVFAgKndycywKKyAgICAgICAgY29uc3QgSU5UIGZyLAorICAgICAgICBGSVhQX0RCTCBnYWluICk7CisKKworI2VuZGlmIC8qIF9fTURDVF9IX18gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9taXBzL2Fic19taXBzLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWY4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oCkBAIC0wLDAgKzEsMTA3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19taXBzX18pCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKQorCisgICNpZiBkZWZpbmVkKF9fbWlwc19kc3ApCisgICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfRAorICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKyAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19TCisgICAgaW5saW5lIEZJWFBfREJMIGZpeGFic19EKEZJWFBfREJMIHgpIHsgcmV0dXJuIF9fYnVpbHRpbl9taXBzX2Fic3Ffc193KHgpOyB9CisgICAgaW5saW5lIEZJWFBfU0dMIGZpeGFic19TKEZJWFBfU0dMIHgpIHsgcmV0dXJuICgoeCkgPiAoRklYUF9TR0wpKDApKSA/ICh4KSA6IC0oeCkgOyB9CisgICAgaW5saW5lIElOVCBmaXhhYnNfSShJTlQgeCkgICAgICAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9taXBzX2Fic3Ffc193KHgpOyB9CisgICNlbmRpZiAvKiBfX21pcHNfZHNwICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAqLworCisjZW5kaWYgLypfX21pcHNfXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9jbHpfbWlwcy5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvY2x6X21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQwYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvY2x6X21pcHMuaApAQCAtMCwwICsxLDExOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0yKSAmJiAobWlwcz49MzIpCisKKyAgI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisgIGlubGluZSBJTlQgZml4bm9ybXpfRChMT05HIHZhbHVlKQorICB7CisgICAgSU5UIHJlc3VsdDsKKyAgICBfX2FzbV9fICgiY2x6ICUwLCUxIiA6ICI9ZCIgKHJlc3VsdCkgOiAiZCIgKHZhbHVlKSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIChfX0dOVUNfXz09MykgJiYgKF9fbWlwcz49MzIpCisKKyAgI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisgIElOVCBpbmxpbmUgZml4bm9ybXpfRChMT05HIHZhbHVlKQorICB7CisgICAgSU5UIHJlc3VsdDsKKyAgICBfX2FzbV9fICgiY2x6ICVbcmVzdWx0XSwgJVt2YWx1ZV0iIDogW3Jlc3VsdF0gIj1yIiAocmVzdWx0KSA6IFt2YWx1ZV0gInIiICh2YWx1ZSkpIDsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX21pcHNfXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9jcGx4X211bC5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2NkYmQwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaApAQCAtMCwwICsxLDE2MiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICYmIF9fbWlwc19pc2FfcmV2IDwgNgorCisKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgorLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2CisvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBiX0ltKQoreworICBJTlQgcmVzdWx0OworCisgICBfX2FzbV9fICgibXVsdCAlW2FfUmVdLCAlW2JfUmVdO1xuIgorICAgICAgICAgICAgIm1zdWIgJVthX0ltXSwgJVtiX0ltXTtcbiIKKyAgICAgICAgICAgICJtZmhpICVbcmVzdWx0XTtcbiIKKyAgICAgICA6IFtyZXN1bHRdIj1yIihyZXN1bHQpCisgICAgICAgOiBbYV9SZV0iZCIoYV9SZSksIFtiX1JlXSJkIihiX1JlKSwgIFthX0ltXSJkIihhX0ltKSwgW2JfSW1dImQiKGJfSW0pCisgICAgICAgOiAibG8iKTsKKworICAgKmNfUmUgPSByZXN1bHQ7CisKKyAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCisgICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgorICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgorICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkgCisgICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKKyAgICAgICA6ICJsbyIpOworICAgKmNfSW0gPSByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMikKK2lubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9JbSkKK3sKKyAgSU5UIHJlc3VsdDsKKworICAgX19hc21fXyAoIm11bHQgJVthX1JlXSwgJVtiX1JlXTtcbiIKKyAgICAgICAgICAgICJtc3ViICVbYV9JbV0sICVbYl9JbV07XG4iCisgICAgICAgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCisgICAgICAgICAgICAvLyJleHRyX3cgJVtyZXN1bHRdLCAzMTtcbiIKKyAgICAgICAgOiBbcmVzdWx0XSI9ciIocmVzdWx0KQorICAgICAgICA6IFthX1JlXSJyIihhX1JlKSwgW2JfUmVdInIiKGJfUmUpLCBbYV9JbV0iciIoYV9JbSksIFtiX0ltXSJyIihiX0ltKQorICAgICAgICA6ICJsbyIpOworICAgKmNfUmUgPSByZXN1bHQ8PDE7CisKKyAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCisgICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgorICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgorICAgICAgICAgICAgLy8iZXh0cl93ICVbcmVzdWx0XSwgMzE7XG4iCisgICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkKKyAgICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKKyAgICAgICAgOiAibG8iKTsKKyAgICpjX0ltID0gcmVzdWx0PDwxOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtYWRkX21pcHMuaCBiL2FhYy9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG1hZGRfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTc1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtYWRkX21pcHMuaApAQCAtMCwwICsxLDk1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19taXBzX18pCisKKworI2VuZGlmIC8qIF9fbWlwc19fICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG11bF9taXBzLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtdWxfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjkzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtdWxfbWlwcy5oCkBAIC0wLDAgKzEsMTEzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19taXBzX18pCisKKyNpZiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKy8qIE1JUFMgR0NDIGJhc2VkIGNvbXBpbGVyICovCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERAorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSxiKSBmaXhtdWxkaXYyX0REKGEsYikKKworaW5saW5lIElOVCBmaXhtdWxkaXYyX0REIChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpCit7CisgIElOVCByZXN1bHQgOworICByZXN1bHQgPSAoKGxvbmcgbG9uZylhICogYik+PjMyOworICByZXR1cm4gcmVzdWx0IDsKK30KKworI2VuZGlmIC8qIChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykgKi8KKworI2VuZGlmIC8qIF9fbWlwc19fICovCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfREQKKyNkZWZpbmUgZml4bXVsQml0RXhhY3RfREQgZml4bXVsX0RECmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZS5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvc2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYyOWRhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL21pcHMvc2NhbGUuaApAQCAtMCwwICsxLDExMCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE1JUFNfU0NBTEVfSAorI2RlZmluZSBNSVBTX1NDQUxFX0gKKworI2lmIGRlZmluZWQoX19taXBzX2RzcCkKKworLyohCisqCisqICBcYnJpZWYgIFNjYWxlIGlucHV0IHZhbHVlIGJ5IDJee3NjYWxlfSBhbmQgc2F0dXJhdGUgb3V0cHV0IHRvIDJee2RCaXRzLTF9CisqICBccmV0dXJuIHNjYWxlZCBhbmQgc2F0dXJhdGVkIHZhbHVlCisqCisqICBUaGlzIG1hY3JvIHNjYWxlcyBzcmMgdmFsdWUgcmlnaHQgb3IgbGVmdCBhbmQgYXBwbGllcyBzYXR1cmF0aW9uIHRvICgyXmRCaXRzKS0xCisqICBtYXhpbWEgb3V0cHV0LgorKi8KKyNkZWZpbmUgU0FUVVJBVEVfUklHSFRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgIFwKKyAgICAgICAgICAoX19idWlsdGluX21pcHNfc2hsbF9zX3coKHNyYyk+PnNjYWxlLChERlJBQ1RfQklUUy0oZEJpdHMpKSk+PihERlJBQ1RfQklUUy0oZEJpdHMpKSkKKworCisjZW5kaWYgLypfX21pcHNfZHNwICovCisKKyNlbmRpZiAvKiBNSVBTX1NDQUxFX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9taXBzL3NjcmFtYmxlLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMmZlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZS5oCkBAIC0wLDAgKzEsMTIxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTUlQU19TQ1JBTUJMRV9ICisjZGVmaW5lIE1JUFNfU0NSQU1CTEVfSAorCisjZGVmaW5lIEZVTkNUSU9OX3NjcmFtYmxlCisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX3NjcmFtYmxlKQoraW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgKngsIElOVCBuKSB7CisgIElOVCBtLGo7CisgIGludCBsZG49MTsKKyAgZG8ge2xkbisrO30gd2hpbGUoKDE8PGxkbik8bik7CisKKyAgZm9yIChtPTEsaj0wOyBtPG4tMTsgbSsrKQorICB7CisgICAgaiA9IF9fYnVpbHRpbl9taXBzX2JpdHJldihtKSA+PiAoMTYtbGRuKTsKKworICAgIGlmIChqPm0pCisgICAgeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgdG1wPXhbMiptXTsKKyAgICAgIHhbMiptXT14WzIqal07CisgICAgICB4WzIqal09dG1wOworCisgICAgICB0bXA9eFsyKm0rMV07CisgICAgICB4WzIqbSsxXT14WzIqaisxXTsKKyAgICAgIHhbMipqKzFdPXRtcDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisjZW5kaWYgLyogTUlQU19TQ1JBTUJMRV9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL2luY2x1ZGUvcW1mLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvcW1mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2OTQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9xbWYuaApAQCAtMCwwICsxLDI0OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZSAgIHFtZi5oCisgIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzICAgCisgIFxhdXRob3IgTWFya3VzIFdlcm5lcgorCisqLworI2lmbmRlZiBfX1FNRl9ICisjZGVmaW5lIF9fUU1GX0gKKworCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgImRjdC5oIgorCisvKgorICogRmlsdGVyIGNvZWZmaWNpZW50IHR5cGUgZGVmaW5pdGlvbgorICovCisjaWZkZWYgUU1GX0RBVEFfMTZCSVQKKyNkZWZpbmUgRklYUF9RTUYgRklYUF9TR0wKKyNkZWZpbmUgRlhfREJMMkZYX1FNRiBGWF9EQkwyRlhfU0dMCisjZGVmaW5lIEZYX1FNRjJGWF9EQkwgRlhfU0dMMkZYX0RCTAorI2RlZmluZSBRRlJBQ1RfQklUUyBGUkFDVF9CSVRTCisjZWxzZQorI2RlZmluZSBGSVhQX1FNRiBGSVhQX0RCTAorI2RlZmluZSBGWF9EQkwyRlhfUU1GCisjZGVmaW5lIEZYX1FNRjJGWF9EQkwKKyNkZWZpbmUgUUZSQUNUX0JJVFMgREZSQUNUX0JJVFMKKyNlbmRpZgorCisvKiBBUk0gbmVvbiBvcHRpbWl6ZWQgUU1GIGFuYWx5c2lzIGZpbHRlciByZXF1aXJlcyAzMiBiaXQgaW5wdXQuCisgICBJbXBsZW1lbnRlZCBmb3IgUlZDVCBvbmx5LCBjdXJyZW50bHkgZGlzYWJsZWQuIFNlZSBzcmMvYXJtL3FtZl9hcm0uY3BwOjQ1ICovCisjZGVmaW5lIEZJWFBfUUFTIEZJWFBfUENNCisjZGVmaW5lIFFBU19CSVRTIFNBTVBMRV9CSVRTCisKKyNpZmRlZiBRTUZTWU5fU1RBVEVTXzE2QklUCisjZGVmaW5lIEZJWFBfUVNTIEZJWFBfU0dMCisjZGVmaW5lIFFTU19CSVRTIEZSQUNUX0JJVFMKKyNlbHNlCisjZGVmaW5lIEZJWFBfUVNTIEZJWFBfREJMCisjZGVmaW5lIFFTU19CSVRTIERGUkFDVF9CSVRTCisjZW5kaWYKKworLyogRmxhZ3MgZm9yIFFNRiBpbnRpYWxpemF0aW9uICovCisvKiBMb3cgUG93ZXIgbW9kZSBmbGFnICovCisjZGVmaW5lIFFNRl9GTEFHX0xQICAgICAgICAgICAxCisvKiBGaWx0ZXIgaXMgbm90IHN5bWV0cmljLiBUaGlzIGZsYWcgaXMgc2V0IGludGVybmFsbHkgaW4gdGhlIFFNRiBpbml0aWFsaXphdGlvbiBhcyByZXF1aXJlZC4gKi8KKyNkZWZpbmUgUU1GX0ZMQUdfTk9OU1lNTUVUUklDIDIKKy8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIChvciBzdGQgc3ltbWV0cmljIGZpbHRlciBiYW5rKSAqLworI2RlZmluZSBRTUZfRkxBR19DTERGQiAgICAgICAgNAorLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHN0YXRlcyBzaG91bGQgYmUga2VwdC4gKi8KKyNkZWZpbmUgUU1GX0ZMQUdfS0VFUF9TVEFURVMgIDgKKy8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIHVzZWQgaW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyICovCisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkIgICAgIDE2CisvKiBDb21wbGV4IExvdyBEZWxheSBGaWx0ZXIgQmFuayB1c2VkIGluIE1QRUcgU3Vycm91bmQgRW5jb2RlciBhbGxvd3MgYSBvcHRpbWl6ZWQgY2FsY3VsYXRpb24gb2YgdGhlIG1vZHVsYXRpb24gaW4gcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgpICovCisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkJfT1BUSU1JWkVfTU9EVUxBVElPTiAgMzIKKy8qIEZsYWcgdG8gaW5kaWNhdGUgSEUtQUFDIGRvd24tc2FtcGxlZCBTQlIgbW9kZSAoZGVjb2RlcikgLT4gYWRhcHQgYW5hbHlzaXMgcG9zdCB0d2lkZGxpbmcgKi8KKyNkZWZpbmUgUU1GX0ZMQUdfRE9XTlNBTVBMRUQgIDY0CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IGxiX3NjYWxlOyAgICAgICAgLyohPCBTY2FsZSBvZiBsb3cgYmFuZCBhcmVhICAgICAgICAgICAgICAgICAgICovCisgIGludCBvdl9sYl9zY2FsZTsgICAgIC8qITwgU2NhbGUgb2YgYWRqdXN0ZWQgb3ZlcmxhcCBsb3cgYmFuZCBhcmVhICAqLworICBpbnQgaGJfc2NhbGU7ICAgICAgICAvKiE8IFNjYWxlIG9mIGhpZ2ggYmFuZCBhcmVhICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG92X2hiX3NjYWxlOyAgICAgLyohPCBTY2FsZSBvZiBhZGp1c3RlZCBvdmVybGFwIGhpZ2ggYmFuZCBhcmVhICovCit9IFFNRl9TQ0FMRV9GQUNUT1I7CisKK3N0cnVjdCBRTUZfRklMVEVSX0JBTksKK3sKKyAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyOyAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICB2b2lkICpGaWx0ZXJTdGF0ZXM7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYnVmZmVyIG9mIGZpbHRlciBzdGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1BDTSBpbiBhbmFseXNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGluIHN5bnRoZXNpcyBmaWx0ZXIgKi8KKyAgaW50IEZpbHRlclNpemU7ICAgICAgICAgICAgICAgLyohPCBTaXplIG9mIHByb3RvdHlwZSBmaWx0ZXIuICovCisgIGNvbnN0IEZJWFBfUVRXICp0X2NvczsgICAgICAgIC8qITwgTW9kdWxhdGlvbiB0YWJsZXMuICovCisgIGNvbnN0IEZJWFBfUVRXICp0X3NpbjsKKyAgaW50IGZpbHRlclNjYWxlOyAgICAgICAgICAgICAgLyohPCBmaWx0ZXIgc2NhbGUgKi8KKworICBpbnQgbm9fY2hhbm5lbHM7ICAgICAgICAgICAgICAvKiE8IFRvdGFsIG51bWJlciBvZiBjaGFubmVscyAoc3ViYmFuZHMpICovCisgIGludCBub19jb2w7ICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICAgICAgKi8KKyAgaW50IGxzYjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUb3Agb2YgbG93IHN1YmJhbmRzICovCisgIGludCB1c2I7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgVG9wIG9mIGhpZ2ggc3ViYmFuZHMgKi8KKworICBpbnQgb3V0U2NhbGVmYWN0b3I7ICAgICAgICAgICAvKiE8IFNjYWxlIGZhY3RvciBvZiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpICovCisgIEZJWFBfREJMIG91dEdhaW47ICAgICAgICAgICAgIC8qITwgR2FpbiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpIChpbml0IHdpdGggMHg4MDAwMDAwMCB0byBpZ25vcmUpICovCisKKyAgVUlOVCBmbGFnczsgICAgICAgICAgICAgICAgICAgLyohPCBmbGFncyAqLworICBVQ0hBUiBwX3N0cmlkZTsgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBGYWN0b3Igb2YgcG9seXBoYXNlIGZpbHRlcnMgKi8KKworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUU1GX0ZJTFRFUl9CQU5LICpIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LOworCit2b2lkCitxbWZBbmFseXNpc0ZpbHRlcmluZyggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsICAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZSZWFsLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsICAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICApOworCit2b2lkCitxbWZTeW50aGVzaXNGaWx0ZXJpbmcoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLCAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIG92X2xlbiwgICAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBiYW5kIG92ZXJsYXAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgKnRpbWVPdXQsICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHN0cmlkZSwgICAgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgKnBXb3JrQnVmZmVyICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworaW50CitxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IFFNRiBIYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgbG93ZXIgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjcml0aWNhbGx5IHNhbXBsZWQgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7ICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgKi8KKwordm9pZAorcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcW1mUmVhbCwgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCByZWFsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnFtZkltYWcsICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNICp0aW1lSW4sICAgICAgICAgIC8qITwgUG9pbnRlciB0byBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICBzdHJpZGUsICAgICAgICAgIC8qITwgc3RyaWRlIGZhY3RvciBvZiBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpwV29ya0J1ZmZlciAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK2ludAorcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUVNTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY3JpdGljYWxseSBzYW1wbGVkIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLworCit2b2lkIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnJlYWxTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqaW1hZ1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAqdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAgKnBXb3JrQnVmZmVyKTsKKwordm9pZAorcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IgKEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dFNjYWxlZmFjdG9yICAgICAgICAgICAgICAgICAvKiE8IE5ldyBzY2FsaW5nIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK3ZvaWQKK3FtZkNoYW5nZU91dEdhaW4gKEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICovCisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBvdXRwdXRHYWluICAgICAgICAgICAgICAgIC8qITwgTmV3IGdhaW4gZm9yIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICk7CisKKworCisjZW5kaWYgLyogX19RTUZfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9pbmNsdWRlL3NjYWxlLmggYi9hYWMvbGliRkRLL2luY2x1ZGUvc2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg3ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9pbmNsdWRlL3NjYWxlLmgKQEAgLTAsMCArMSwyNTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IFNjYWxpbmcgb3BlcmF0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0NBTEVfSAorI2RlZmluZSBTQ0FMRV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJmaXhtaW5tYXguaCIKKworICAjZGVmaW5lIFNDQUxFX0lOTElORSBpbmxpbmUKKworCisjaWYgZGVmaW5lZChfX2FybV9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjaW5jbHVkZSAiYXJtL3NjYWxlLmgiCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL3NjYWxlLmgiCisKKyNlbmRpZgorCisKKyNpbmNsdWRlICIuLi9zcmMvc2NhbGUuY3BwIgorCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWUKKy8qIQorICoKKyAqICBcYnJpZWYgTXVsdGlwbHkgaW5wdXQgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqCisgKiAgXHJldHVybiBTY2FsZWQgaW5wdXQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZQoraW5saW5lCitGSVhQX0RCTCBzY2FsZVZhbHVlKGNvbnN0IEZJWFBfREJMIHZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICApCit7CisgIGlmKHNjYWxlZmFjdG9yID4gMCkKKyAgICByZXR1cm4gKHZhbHVlPDxzY2FsZWZhY3Rvcik7CisgIGVsc2UKKyAgICByZXR1cm4gKHZhbHVlPj4oLXNjYWxlZmFjdG9yKSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlU2F0dXJhdGUKKy8qIQorICoKKyAqICBcYnJpZWYgTXVsdGlwbHkgaW5wdXQgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNjYWxlZC4KKyAqICBccGFyYW0gdGhlIHNoaWZ0IGFtb3VudAorICogIFxyZXR1cm4gXGYkIHZhbHVlICogMl5zY2FsZWZhY3RvciBcZiQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZVNhdHVyYXRlCitpbmxpbmUKK0ZJWFBfREJMIHNjYWxlVmFsdWVTYXR1cmF0ZSgKKyAgICAgICAgY29uc3QgRklYUF9EQkwgdmFsdWUsCisgICAgICAgIElOVCBzY2FsZWZhY3RvcgorICAgICAgICApCit7CisgIGlmKHNjYWxlZmFjdG9yID4gMCkgeworICAgIGlmIChmTm9ybSh2YWx1ZSkgPCBzY2FsZWZhY3RvciAmJiB2YWx1ZSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgaWYgKHZhbHVlID4gKEZJWFBfREJMKTApIHsKKyAgICAgICAgcmV0dXJuIChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChGSVhQX0RCTClNSU5WQUxfREJMOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKHZhbHVlPDxzY2FsZWZhY3Rvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICgtKERGUkFDVF9CSVRTLTEpID4gc2NhbGVmYWN0b3IpIHsKKyAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKKyAgICB9IGVsc2UgeworICAgIHJldHVybiAodmFsdWU+Pigtc2NhbGVmYWN0b3IpKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVJblBsYWNlCisvKiEKKyAqCisgKiAgXGJyaWVmIE11bHRpcGx5IGlucHV0IGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkIGluIHBsYWNlCisgKgorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlSW5QbGFjZQoraW5saW5lCit2b2lkIHNjYWxlVmFsdWVJblBsYWNlKAorICAgICAgICBGSVhQX0RCTCAqdmFsdWUsIC8qITwgVmFsdWUgKi8KKyAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgLyohPCBTY2FsZWZhY3RvciAqLworICAgICAgICApCit7CisgIElOVCBuZXdzY2FsZTsKKyAgLyogTm90ZTogVGhlIGFzc2lnbm1lbnQgaW5zaWRlIHRoZSBpZiBjb25kaXRpb25hbCBhbGxvd3MgY29tYmluaW5nIGEgbG9hZCB3aXRoIHRoZSBjb21wYXJlIHRvIHplcm8gKG9uIEFSTSBhbmQgbWF5YmUgb3RoZXJzKSAqLworICBpZiAoKG5ld3NjYWxlID0gKHNjYWxlZmFjdG9yKSkgPj0gMCkgeworICAgICoodmFsdWUpIDw8PSBuZXdzY2FsZTsKKyAgfSBlbHNlIHsKKyAgICAqKHZhbHVlKSA+Pj0gLW5ld3NjYWxlOworICB9Cit9CisjZW5kaWYKKworLyohCisgKgorICogIFxicmllZiAgU2NhbGUgaW5wdXQgdmFsdWUgYnkgMl57c2NhbGV9IGFuZCBzYXR1cmF0ZSBvdXRwdXQgdG8gMl57ZEJpdHMtMX0KKyAqICBccmV0dXJuIHNjYWxlZCBhbmQgc2F0dXJhdGVkIHZhbHVlCisgKgorICogIFRoaXMgbWFjcm8gc2NhbGVzIHNyYyB2YWx1ZSByaWdodCBvciBsZWZ0IGFuZCBhcHBsaWVzIHNhdHVyYXRpb24gdG8gKDJeZEJpdHMpLTEKKyAqICBtYXhpbWEgb3V0cHV0LgorICovCisKKyNpZm5kZWYgU0FUVVJBVEVfUklHSFRfU0hJRlQKKyAgI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICgoKExPTkcpKHNyYyk+PihzY2FsZSkpID4gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpICAgICAgPyAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSAgICBcCisgICAgICAgICAgICAgIDogKCgoTE9ORykoc3JjKT4+KHNjYWxlKSkgPCB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSkgPyB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSBcCisgICAgICAgICAgICAgIDogKChMT05HKShzcmMpID4+IChzY2FsZSkpICkKKyNlbmRpZgorCisjaWZuZGVmIFNBVFVSQVRFX0xFRlRfU0hJRlQKKyAgI2RlZmluZSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKT4+KHNjYWxlKSkpICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICBcCisgICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKT4+KHNjYWxlKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSkgICBcCisgICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpICkKKyNlbmRpZgorCisjaWZuZGVmIFNBVFVSQVRFX1NISUZUCisjZGVmaW5lIFNBVFVSQVRFX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgIFwKKyAgICAgKCAoKHNjYWxlKSA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/IFNBVFVSQVRFX0xFRlRfU0hJRlQoKHNyYyksIC0oc2NhbGUpLCAoZEJpdHMpKSAgIFwKKyAgICAgIDogU0FUVVJBVEVfUklHSFRfU0hJRlQoKHNyYyksIChzY2FsZSksIChkQml0cykpICkKKyNlbmRpZgorCisvKgorICogQWx0ZXJuYXRpdmUgc2hpZnQgYW5kIHNhdHVyYXRlIGxlZnQsIHNhdHVyYXRlcyB0byAtMC45OTk5OSBpbnN0ZWFkIG9mIC0xLjAwMDAKKyAqIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gaW52ZXJ0aW5nIHRoZSBzaWduIG9mIHRoZSByZXN1bHQuCisgKi8KKyNpZm5kZWYgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQKKyNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKT4+KHNjYWxlKSkpICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICBcCisgICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKT4+KHNjYWxlKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkgICBcCisgICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpICkKKyNlbmRpZgorCisjaWZuZGVmIFNBVFVSQVRFX1JJR0hUX1NISUZUX0FMVAorICAjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUX0FMVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggKCgoTE9ORykoc3JjKT4+KHNjYWxlKSkgPiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSkgICAgICA/IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpICAgIFwKKyAgICAgICAgICAgICAgOiAoKChMT05HKShzcmMpPj4oc2NhbGUpKSA8IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMikpKSA/IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMikpIFwKKyAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkgKQorI2VuZGlmCisKKyNpZm5kZWYgU0FUVVJBVEVfSU5UX1BDTV9SSUdIVF9TSElGVAorI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX1JJR0hUX1NISUZUKHNyYywgc2NhbGUpIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIFNBTVBMRV9CSVRTKQorI2VuZGlmCisKKyNpZm5kZWYgU0FUVVJBVEVfSU5UX1BDTV9MRUZUX1NISUZUCisjZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fTEVGVF9TSElGVChzcmMsIHNjYWxlKSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIFNBTVBMRV9CSVRTKQorI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZuZGVmIFNDQUxFX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL3NjcmFtYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhZjUyNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oCkBAIC0wLDAgKzEsMTY1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0NSQU1CTEVfSAorI2RlZmluZSBTQ1JBTUJMRV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSAiYXJtL3NjcmFtYmxlLmgiCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgIm1pcHMvc2NyYW1ibGUuaCIKKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBzY3JhbWJsZQorICAgIGRlc2NyaXB0aW9uOiAgYml0cmV2ZXJzYWwgb2YgaW5wdXQgZGF0YQorICAgIHJldHVybnM6CisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZV9zZ2wpCisKK2lubGluZSB2b2lkIHNjcmFtYmxlX3NnbChGSVhQX1NHTCAqeCwgSU5UIG4pCit7CisgIElOVCBtLGssajsKKworICBmb3IgKG09MSxqPTA7IG08bi0xOyBtKyspCisgIHsKKyAgICB7Zm9yKGs9bj4+MTsgKCEoKGpePWspJmspKTsgaz4+PTEpO30KKworICAgIGlmIChqPm0pCisgICAgeworICAgICAgRklYUF9TR0wgdG1wOworICAgICAgdG1wPXhbMiptXTsKKyAgICAgIHhbMiptXT14WzIqal07CisgICAgICB4WzIqal09dG1wOworCisgICAgICB0bXA9eFsyKm0rMV07CisgICAgICB4WzIqbSsxXT14WzIqaisxXTsKKyAgICAgIHhbMipqKzFdPXRtcDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCisKKy8qIGRlZmF1bHQgc2NyYW1ibGUgZnVuY3Rpb25hbGl0eSAqLworaW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgKngsIElOVCBuKQoreworICBJTlQgbSxrLGo7CisgIEZES19BU1NFUlQoISgoKFVJTlQ2NCl4KSYoQUxJR05NRU5UX0RFRkFVTFQtMSkpKTsKKworICBmb3IgKG09MSxqPTA7IG08bi0xOyBtKyspCisgIHsKKyAgICB7Zm9yKGs9bj4+MTsgKCEoKGpePWspJmspKTsgaz4+PTEpO30KKworICAgIGlmIChqPm0pCisgICAgeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgdG1wPXhbMiptXTsKKyAgICAgIHhbMiptXT14WzIqal07CisgICAgICB4WzIqal09dG1wOworCisgICAgICB0bXA9eFsyKm0rMV07CisgICAgICB4WzIqbSsxXT14WzIqaisxXTsKKyAgICAgIHhbMipqKzFdPXRtcDsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAvKiAhZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkgKi8KKworI2VuZGlmIC8qIFNDUkFNQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS94ODYvYWJzX3g4Ni5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL3g4Ni9hYnNfeDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNzRlYwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS94ODYvYWJzX3g4Ni5oCkBAIC0wLDAgKzEsMTA2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9feDg2X18pCisKKyAgI2lmIGRlZmluZWQoX194ODZfNjRfXykKKworICAgIGlubGluZSBJTlQgZml4YWJzX0QoSU5UIHgpICAgICAgeyByZXR1cm4gKCh4KSA+IChJTlQpKDApKSAgICAgID8gKHgpIDogLSh4KSA7IH0KKyAgICBpbmxpbmUgSU5UIGZpeGFic19TKElOVCB4KSAgICAgIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgICAgICA/ICh4KSA6IC0oeCkgOyB9CisKKyAgICAjZGVmaW5lIGZpeGFic19JKHgpIGZpeGFic19EKHgpCisKKyAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19TCisgICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfRAorICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKworICAjZW5kaWYgLyogX194ODZfNjRfXyAqLworCisjZW5kaWYgLypfX3g4Nl9fICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS94ODYvY2x6X3g4Ni5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL3g4Ni9jbHpfeDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjNDNlNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS94ODYvY2x6X3g4Ni5oCkBAIC0wLDAgKzEsMTU0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9feDg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisKKyAgI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisgICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybV9ECisKKyAgaW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpCisgIHsKKyAgICBJTlQgcmVzdWx0OworCisgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgIHJlc3VsdCA9IF9fYnVpbHRpbl9jbHoodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAzMjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpCisgIHsKKyAgICBJTlQgcmVzdWx0OworICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgdmFsdWUgPSB+dmFsdWU7CisgICAgfQorICAgIHJlc3VsdCA9ICBmaXhub3Jtel9EKHZhbHVlKTsKKyAgICByZXR1cm4gcmVzdWx0IC0gMTsKKyAgfQorCisKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkKKworI2luY2x1ZGUgPGludHJpbi5oPgorCisgICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAorICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAorCisgIGlubGluZSBJTlQgZml4bm9ybXpfRChMT05HIHZhbHVlKQorICB7CisgICAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgZXJyOworICAgIGVyciA9IF9CaXRTY2FuUmV2ZXJzZSgmcmVzdWx0LCB2YWx1ZSk7CisgICAgaWYgKGVycikgeworICAgICAgcmV0dXJuIDMxIC0gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMzI7CisgICAgfQorICB9CisKKyAgaW5saW5lIElOVCBmaXhub3JtX0QoTE9ORyB2YWx1ZSkKKyAgeworICAgIElOVCByZXN1bHQ7CisgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICB2YWx1ZSA9IH52YWx1ZTsKKyAgICB9CisgICAgcmVzdWx0ID0gIGZpeG5vcm16X0QodmFsdWUpOworICAgIHJldHVybiByZXN1bHQgLSAxOworICB9CisKKyNlbmRpZiAvKiB0b29sY2hhaW4gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvaW5jbHVkZS94ODYvZml4bXVsX3g4Ni5oIGIvYWFjL2xpYkZESy9pbmNsdWRlL3g4Ni9maXhtdWxfeDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3NGNjNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvaW5jbHVkZS94ODYvZml4bXVsX3g4Ni5oCkBAIC0wLDAgKzEsMTc4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX194ODZfXykKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikKKy8qIEludGVsIHg4NiAqLworCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9ERAorI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RECisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSxiKSBmaXhtdWxkaXYyX0REKGEsYikKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfREQKKyNkZWZpbmUgZml4bXVsQml0RXhhY3RfREQoYSxiKSBmaXhtdWxfREQoYSxiKQorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUworI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKworI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUworI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisKK2lubGluZSBJTlQgZml4bXVsX0REIChJTlQgYSwgY29uc3QgSU5UIGIpCit7CisgIF9fYXNtCisgIHsKKyAgICBtb3YgZWF4LCBhCisgICAgaW11bCBiCisgICAgc2hsIGVkeCwgMQorICAgIG1vdiBhLCBlZHgKKyAgfQorICByZXR1cm4gYSA7Cit9CisKKworaW5saW5lIElOVCBmaXhtdWxkaXYyX0REIChJTlQgYSwgY29uc3QgSU5UIGIpCit7CisgIF9fYXNtCisgIHsKKyAgICBtb3YgZWF4LCBhCisgICAgaW11bCBiCisgICAgbW92IGEsIGVkeAorICB9CisgIHJldHVybiBhIDsKK30KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKyNlbGlmIChkZWZpbmVkKF9fR05VQ19fKXx8ZGVmaW5lZChfX2dudV9saW51eF9fKSkgJiYgZGVmaW5lZChfX3g4Nl9fKQorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9ERAorI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RECisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLGIpIGZpeG11bGRpdjJfREQoYSxiKQorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RECisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsYikgZml4bXVsX0REKGEsYikKKworI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsYikgZml4bXVsZGl2Ml9EUyhhLGIpCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKKyNkZWZpbmUgZml4bXVsQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxfRFMoYSxiKQorCitpbmxpbmUgSU5UIGZpeG11bF9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoreworICBJTlQgcmVzdWx0OworCisgIGFzbSggImltdWwgJTI7XG4iCisgICAgICAgInNobCAkMSwgJTA7XG4iCisgICAgICAgICAgICA6ICI9ZCIocmVzdWx0KSwgIithIihhKQorICAgICAgICAgICAgOiAiciIoYikgKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoreworICBJTlQgcmVzdWx0OworCisgIGFzbSAoICJpbXVsICUyOyIKKyAgICAgICAgICAgICA6ICI9ZCIocmVzdWx0KSwgIithIihhKQorICAgICAgICAgICAgIDogInIiKGIpICk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkKF9fR05VQ19fKXx8ZGVmaW5lZChfX2dudV9saW51eF9fKSkgJiYgZGVmaW5lZChfX3g4Nl9fKSAqLworCisjZW5kaWYgLyogX194ODZfXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9GREtfYml0YnVmZmVyLmNwcCBiL2FhYy9saWJGREsvc3JjL0ZES19iaXRidWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGNlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9GREtfYml0YnVmZmVyLmNwcApAQCAtMCwwICsxLDQ4MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgorICAgRGVzY3JpcHRpb246IGNvbW1vbiBiaXRidWZmZXIgcmVhZC93cml0ZSByb3V0aW5lcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGREtfYml0YnVmZmVyLmgiCisKKworCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJmaXhtaW5tYXguaCIKKworY29uc3QgVUlOVCBCaXRNYXNrIFszMisxXSA9Cit7CisgICAgICAgICAweDAsICAgICAgICAweDEsICAgICAgICAweDMsICAgICAgICAweDcsCisgICAgICAgICAweGYsICAgICAgIDB4MWYsICAgICAgIDB4M2YsICAgICAgIDB4N2YsCisgICAgICAgIDB4ZmYsICAgICAgMHgxZmYsICAgICAgMHgzZmYsICAgICAgMHg3ZmYsCisgICAgICAgMHhmZmYsICAgICAweDFmZmYsICAgICAweDNmZmYsICAgICAweDdmZmYsCisgICAgICAweGZmZmYsICAgIDB4MWZmZmYsICAgIDB4M2ZmZmYsICAgIDB4N2ZmZmYsCisgICAgIDB4ZmZmZmYsICAgMHgxZmZmZmYsICAgMHgzZmZmZmYsICAgMHg3ZmZmZmYsCisgICAgMHhmZmZmZmYsICAweDFmZmZmZmYsICAweDNmZmZmZmYsICAweDdmZmZmZmYsCisgICAweGZmZmZmZmYsIDB4MWZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4N2ZmZmZmZmYsCisgIDB4ZmZmZmZmZmYKK307CisKK2NvbnN0IFVJTlQgKmNvbnN0IFJFU1RSSUNUIHBCaXRNYXNrID0gQml0TWFzazsKKwordm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSkKK3sKKyAgIEZES19Jbml0Qml0QnVmZmVyICgqaEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCk7CisKKyAgIEZES21lbWNsZWFyKCgqaEJpdEJ1ZiktPkJ1ZmZlciwgYnVmU2l6ZSpzaXplb2YoVUNIQVIpKTsKK30KKwordm9pZCBGREtfRGVsZXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKSB7IDsgfQorCit2b2lkIEZES19Jbml0Qml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpCit7CisgICBoQml0QnVmLT5WYWxpZEJpdHMgICA9IHZhbGlkQml0cyA7CisgICBoQml0QnVmLT5SZWFkT2Zmc2V0ICA9IDAgOworICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgPSAwIDsKKyAgIGhCaXRCdWYtPkJpdENudCAgICAgID0gMCA7CisgICBoQml0QnVmLT5CaXROZHggICAgICA9IDAgOworCisgICBoQml0QnVmLT5CdWZmZXIgICAgICA9IHBCdWZmZXIgOworICAgaEJpdEJ1Zi0+YnVmU2l6ZSAgICAgPSBidWZTaXplIDsKKyAgIGhCaXRCdWYtPmJ1ZkJpdHMgICAgID0gKGJ1ZlNpemUgPDwgMykgOworI2lmIGRlZmluZWQoRkRLX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHKQorICAgLyphc3N1cmUgYnVmc2l6ZSAoMl5uKSAqLworICAgaWYgKGJ1ZlNpemUhPTApIHsKKyAgICAgVUlOVCB4ID0gMCwgbj1idWZTaXplOworICAgICBmb3IgKHg9MDsgbj4wOyB4Kyssbj4+PTEpIHt9CisgICAgIGlmICggYnVmU2l6ZSAhPSAoMTw8KHgtMSkpICkgeworICAgICAgIEZES3ByaW50ZkVycigiRXJyb3I6IGJ1ZlNpemVpbiBGREtfSW5pdEJpdEJ1ZmZlcigpICE9ICgyXm4pLCAlZFxuIiwgYnVmU2l6ZSk7CisgICAgIH0KKyAgIH0KKyNlbmRpZgorfQorCit2b2lkIEZES19SZXNldEJpdEJ1ZmZlciAoIEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYgKQoreworICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICAgPSAwIDsKKyAgIGhCaXRCdWYtPlJlYWRPZmZzZXQgID0gMCA7CisgICBoQml0QnVmLT5Xcml0ZU9mZnNldCA9IDAgOworICAgaEJpdEJ1Zi0+Qml0Q250ICAgICAgPSAwIDsKKyAgIGhCaXRCdWYtPkJpdE5keCAgICAgID0gMCA7Cit9CisKK0lOVCAgRkRLX2dldCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCit7CisgIFVJTlQgYnl0ZU9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzIDsKKyAgVUlOVCBiaXRPZmZzZXQgID0gaEJpdEJ1Zi0+Qml0TmR4ICYgMHgwNyA7CisKKyAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggKyBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7CisgIGhCaXRCdWYtPkJpdENudCAgICArPSAgbnVtYmVyT2ZCaXRzIDsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09ICBudW1iZXJPZkJpdHMgOworCisgIFVJTlQgYnl0ZU1hc2sgPSBoQml0QnVmLT5idWZTaXplIC0gMSA7CisKKyAgVUlOVCB0eCA9IChoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdIDw8IDI0KSB8CisgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsxKSAmIGJ5dGVNYXNrXSA8PCAxNikgfAorICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMikgJiBieXRlTWFza10gPDwgIDgpIHwKKyAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzMpICYgYnl0ZU1hc2tdOworCisgIGlmIChiaXRPZmZzZXQpCisgIHsKKyAgICB0eCA8PD0gYml0T2Zmc2V0OworICAgIHR4IHw9IGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gPj4gKDgtYml0T2Zmc2V0KTsKKyAgfQorCisgIHJldHVybiAodHggPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkgOworfQorCitJTlQgRkRLX2dldDMyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQoreworICBVSU5UIEJpdE5keCA9IGhCaXRCdWYtPkJpdE5keCArIDMyOworICBpZiAoQml0TmR4IDw9IGhCaXRCdWYtPmJ1ZkJpdHMpCisgIHsKKyAgICBoQml0QnVmLT5CaXROZHggPSBCaXROZHg7CisgICAgaEJpdEJ1Zi0+Qml0Q250ICs9ICAzMjsKKyAgICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gMzI7CisKKyAgICBVSU5UIGJ5dGVPZmZzZXQgPSAoQml0TmR4LTEpID4+IDM7CisgICAgVUlOVCBjYWNoZSA9IChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMyldIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMildIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMSldIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMCldOworCisgICAgaWYgKCAoQml0TmR4ID0gKEJpdE5keCY3KSkgIT0gMCApIHsKKyAgICAgIGNhY2hlID0gKGNhY2hlID4+ICg4LUJpdE5keCkpIHwgKChVSU5UKWhCaXRCdWYtPkJ1ZmZlciBbYnl0ZU9mZnNldC00XSA8PCAoMjQrQml0TmR4KSk7CisgICAgfQorICAgIHJldHVybiAoY2FjaGUpIDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBleG90aWMgcGF0aCwgdXNlZCBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgd2hlbiB3cmFwcGluZyBhcm91bmQgKi8KKyAgICBpbnQgbkJpdHMgPSAoSU5UKWhCaXRCdWYtPmJ1ZkJpdHMtKElOVCloQml0QnVmLT5CaXROZHg7CisKKyAgICBVSU5UIGNhY2hlID0gRkRLX2dldCAoaEJpdEJ1ZixuQml0cyk8PCAoMzItbkJpdHMpOworICAgIGNhY2hlIHw9IChGREtfZ2V0IChoQml0QnVmLDMyLW5CaXRzKSk7CisgICAgcmV0dXJuIChjYWNoZSk7CisgIH0KK30KKworSU5UIEZES19nZXRCd2QgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQoreworICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMyA7CisgIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOworICBVSU5UIGJ5dGVNYXNrICAgPSBoQml0QnVmLT5idWZTaXplIC0gMSA7CisgIGludCBpOworCisgIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4IC0gbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOworICBoQml0QnVmLT5CaXRDbnQgICAgLT0gIG51bWJlck9mQml0cyA7CisgIGhCaXRCdWYtPlZhbGlkQml0cyArPSAgbnVtYmVyT2ZCaXRzIDsKKworICBVSU5UIHR4ID0gaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0zKSAmIGJ5dGVNYXNrXSA8PCAyNCB8CisgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTIpICYgYnl0ZU1hc2tdIDw8IDE2IHwKKyAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMSkgJiBieXRlTWFza10gPDwgIDggfAorICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSA7CisgIFVJTlQgdHhhID0gMHgwOworCisgIHR4ID4+PSAoOCAtIGJpdE9mZnNldCkgOworCisgIGlmIChiaXRPZmZzZXQgJiYgbnVtYmVyT2ZCaXRzID4gMjQpCisgIHsKKyAgICB0eCB8PSBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdIDw8ICgyNCArIGJpdE9mZnNldCkgOworICB9CisKKyAgLyogaW4gcGxhY2UgdHVybiBhcm91bmQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBVSU5UIGJpdE1hc2tSID0gMHgwMDAwMDAwMSA8PCBpOworICAgIFVJTlQgYml0TWFza0wgPSAweDgwMDAwMDAwID4+IGk7CisKKyAgICB0eGEgfD0gKHR4ICYgYml0TWFza1IpIDw8ICgzMSAtIChpPDwxKSk7CisgICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tMKSA+PiAoMzEgLSAoaTw8MSkpOworICB9CisKKyAgcmV0dXJuICh0eGEgPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkgOworfQorCit2b2lkIEZES19wdXQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQoreworICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMyA7CisgIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOworCisgIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOworICBoQml0QnVmLT5CaXRDbnQgICAgKz0gIG51bWJlck9mQml0cyA7CisgIGhCaXRCdWYtPlZhbGlkQml0cyArPSAgbnVtYmVyT2ZCaXRzIDsKKworICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOworCisgIFVJTlQgdG1wICA9IHZhbHVlPDwoMzItbnVtYmVyT2ZCaXRzKT4+Yml0T2Zmc2V0OworICBVSU5UIG1hc2sgPSB+Qml0TWFza1soMzItYml0T2Zmc2V0KV0gfCAoQml0TWFzayBbKDMyLW51bWJlck9mQml0cyldID4+IGJpdE9mZnNldCkgOworCisgIGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10mKG1hc2s+PjI0KSkgfCAoVUNIQVIpKHRtcD4+MjQpOworICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdJihtYXNrPj4xNikpIHwgKFVDSEFSKSh0bXA+PjE2KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSYobWFzaz4+OCkpICB8IChVQ0hBUikodG1wPj44KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCszKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCszKSAmIGJ5dGVNYXNrXSYobWFzaykpICAgICB8IChVQ0hBUikodG1wKTsKKworICBpZiAoYml0T2Zmc2V0ICYmIG51bWJlck9mQml0cyA+IDI0KQorICB7CisgICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCs0KSAmIGJ5dGVNYXNrXSAgPSAoVUNIQVIpKHZhbHVlPDwoNDAtbnVtYmVyT2ZCaXRzKT4+Yml0T2Zmc2V0KSB8CisgICAgICAgICAgICAgICAoIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gJiBCaXRNYXNrWyg0MC1udW1iZXJPZkJpdHMtYml0T2Zmc2V0KV0gKSA7CisgIH0KK30KKwordm9pZCBGREtfcHV0QndkIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVSU5UIHZhbHVlLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKK3sKKyAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOworICBVSU5UIGJpdE9mZnNldCAgPSA3IC0gKGhCaXRCdWYtPkJpdE5keCAmIDB4MDcpIDsKKyAgVUlOVCBieXRlTWFzayAgID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOworCisgIFVJTlQgbWFzayA9IH4oQml0TWFza1tudW1iZXJPZkJpdHNdIDw8IGJpdE9mZnNldCkgOworICBVSU5UIHRtcCA9IDB4MDAwMDsKKyAgaW50ICBpOworCisgIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4IC0gbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOworICBoQml0QnVmLT5CaXRDbnQgICAgLT0gIG51bWJlck9mQml0cyA7CisgIGhCaXRCdWYtPlZhbGlkQml0cyAtPSAgbnVtYmVyT2ZCaXRzIDsKKworICAvKiBpbiBwbGFjZSB0dXJuIGFyb3VuZCAqLworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIFVJTlQgYml0TWFza1IgPSAweDAwMDAwMDAxIDw8IGk7CisgICAgVUlOVCBiaXRNYXNrTCA9IDB4ODAwMDAwMDAgPj4gaTsKKworICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrUikgPDwgKDMxIC0gKGk8PDEpKTsKKyAgICB0bXAgfD0gKHZhbHVlICYgYml0TWFza0wpID4+ICgzMSAtIChpPDwxKSk7CisgIH0KKyAgdmFsdWUgPSB0bXA7CisgIHRtcCAgID0gdmFsdWU+PigzMi1udW1iZXJPZkJpdHMpPDxiaXRPZmZzZXQ7CisKKyAgaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSYobWFzaykpICAgICB8IChVQ0hBUikodG1wKTsKKyAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0xKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0xKSAmIGJ5dGVNYXNrXSYobWFzaz4+OCkpICB8IChVQ0hBUikodG1wPj44KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0yKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0yKSAmIGJ5dGVNYXNrXSYobWFzaz4+MTYpKSB8IChVQ0hBUikodG1wPj4xNik7CisgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMykgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMykgJiBieXRlTWFza10mKG1hc2s+PjI0KSkgfCAoVUNIQVIpKHRtcD4+MjQpOworCisgIGlmICgoYml0T2Zmc2V0ICsgbnVtYmVyT2ZCaXRzKSA+IDMyKQorICB7CisgICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC00KSAmIGJ5dGVNYXNrXSAgPSAoVUNIQVIpKHZhbHVlPj4oNjQtbnVtYmVyT2ZCaXRzLWJpdE9mZnNldCkpIHwKKyAgICAgICAgICAgICAgICggaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC00KSAmIGJ5dGVNYXNrXSAmIH4oQml0TWFza1tiaXRPZmZzZXRdID4+ICgzMi1udW1iZXJPZkJpdHMpKSApIDsKKyAgfQorfQorCisKK3ZvaWQgRkRLX3B1c2hCYWNrIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywgVUNIQVIgY29uZmlnKQoreworICBoQml0QnVmLT5CaXRDbnQgICAgLT0gbnVtYmVyT2ZCaXRzIDsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzICs9IChjb25maWc9PTApID8gbnVtYmVyT2ZCaXRzIDogKC0oSU5UKW51bWJlck9mQml0cykgOworICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCAtIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKK30KKwordm9pZCBGREtfcHVzaEZvcndhcmQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpCit7CisgIGhCaXRCdWYtPkJpdENudCAgICArPSBudW1iZXJPZkJpdHMgOworICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gKGNvbmZpZz09MCkgPyBudW1iZXJPZkJpdHMgOiAoLShJTlQpbnVtYmVyT2ZCaXRzKSA7CisgIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOworfQorCisKK3ZvaWQgRkRLX2J5dGVBbGlnbiAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUNIQVIgY29uZmlnKQoreworICBJTlQgYWxpZ25tZW50ID0gaEJpdEJ1Zi0+Qml0Q250ICYgMHgwNyA7CisKKyAgaWYgKGFsaWdubWVudCkKKyAgeworICAgIGlmIChjb25maWc9PTApCisgICAgICBGREtfcHVzaEZvcndhcmQgKGhCaXRCdWYsIDggLSBhbGlnbm1lbnQsIGNvbmZpZykgOyAvKiBCU19SRUFERVIgKi8KKyAgICBlbHNlCisgICAgICBGREtfcHV0IChoQml0QnVmLDAgLCA4IC0gYWxpZ25tZW50KSA7ICAgICAgICAgICAgICAvKiBCU19XUklURVIgKi8KKyAgfQorCisgIGhCaXRCdWYtPkJpdENudCA9IDAgOworfQorCitVSU5UIEZES19nZXRWYWxpZEJpdHMgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpCit7CisgICAgcmV0dXJuIGhCaXRCdWYtPlZhbGlkQml0czsKK30KKworSU5UIEZES19nZXRGcmVlQml0cyAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKK3sKKyAgICByZXR1cm4gKGhCaXRCdWYtPmJ1ZkJpdHMgLSBoQml0QnVmLT5WYWxpZEJpdHMpIDsKK30KKwordm9pZCBGREtfc2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIHZhbHVlKQoreworICBoQml0QnVmLT5CaXRDbnQgPSB2YWx1ZSA7Cit9CisKK0lOVCBGREtfZ2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQoreworICByZXR1cm4gaEJpdEJ1Zi0+Qml0Q250IDsKK30KKwordm9pZCBGREtfRmVlZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLAorICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICpSRVNUUklDVCBpbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAqYnl0ZXNWYWxpZCkKK3sKKyAgaW5wdXRCdWZmZXIgPSAmaW5wdXRCdWZmZXIgW2J1ZmZlclNpemUgLSAqYnl0ZXNWYWxpZF0gOworCisgIFVJTlQgYlRvdGFsID0gMCA7CisKKyAgVUlOVCBiVG9SZWFkICAgPSAoaEJpdEJ1Zi0+YnVmQml0cyAtIGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7CisgIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKGJUb1JlYWQgPCAqYnl0ZXNWYWxpZCkgPyBiVG9SZWFkIDogKmJ5dGVzVmFsaWQgOworCisgIHdoaWxlIChub09mQnl0ZXMgPiAwKQorICB7CisgICAgLyogc3BsaXQgcmVhZCB0byBidWZmZXIgc2l6ZSAqLworICAgIGJUb1JlYWQgPSBoQml0QnVmLT5idWZTaXplIC0gaEJpdEJ1Zi0+UmVhZE9mZnNldCA7CisgICAgYlRvUmVhZCA9IGZNaW4oYlRvUmVhZCwgbm9PZkJ5dGVzKTsgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzIDsKKworICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gJ3B0cicgdG8gaW5wdXRidWZmZXIgKi8KKyAgICBGREttZW1jcHkoJmhCaXRCdWYtPkJ1ZmZlcltoQml0QnVmLT5SZWFkT2Zmc2V0XSwgaW5wdXRCdWZmZXIsIGJUb1JlYWQqc2l6ZW9mKFVDSEFSKSk7CisKKyAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCisgICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICArPSBiVG9SZWFkIDw8IDMgOworICAgIGJUb3RhbCAgICAgICArPSBiVG9SZWFkIDsKKyAgICBpbnB1dEJ1ZmZlciAgKz0gYlRvUmVhZCA7CisKKyAgICBoQml0QnVmLT5SZWFkT2Zmc2V0ICA9IChoQml0QnVmLT5SZWFkT2Zmc2V0ICsgYlRvUmVhZCkgJiAoaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEpIDsKKyAgICBub09mQnl0ZXMgICAgLT0gYlRvUmVhZCA7CisgIH0KKworICAqYnl0ZXNWYWxpZCAtPSBiVG90YWwgOworfQorCit2b2lkIENvcHlBbGlnbmVkQmxvY2sgKEhBTkRMRV9GREtfQklUQlVGIGhfQml0QnVmU3JjLCBVQ0hBUiAqUkVTVFJJQ1QgZHN0QnVmZmVyLCBVSU5UIGJUb1JlYWQpCit7CisgIFVJTlQgYnl0ZU9mZnNldCA9IGhfQml0QnVmU3JjLT5CaXROZHggPj4gMyA7CisgIGNvbnN0IFVJTlQgYnl0ZU1hc2sgPSBoX0JpdEJ1ZlNyYy0+YnVmU2l6ZSAtIDEgOworCisgIFVDSEFSICpSRVNUUklDVCBwQkJCID0gaF9CaXRCdWZTcmMtPkJ1ZmZlcjsKKyAgZm9yIChVSU5UIGkgPSAwIDsgaSA8IGJUb1JlYWQgOyBpKyspCisgIHsKKyAgICBkc3RCdWZmZXJbaV0gPSBwQkJCWyhieXRlT2Zmc2V0K2kpICYgYnl0ZU1hc2tdIDsKKyAgfQorCisgIGJUb1JlYWQgPDw9IDMgOworCisgIGhfQml0QnVmU3JjLT5CaXROZHggPSAoaF9CaXRCdWZTcmMtPkJpdE5keCArIGJUb1JlYWQpICYgKGhfQml0QnVmU3JjLT5idWZCaXRzIC0gMSkgOworICBoX0JpdEJ1ZlNyYy0+Qml0Q250ICs9IGJUb1JlYWQgOworICBoX0JpdEJ1ZlNyYy0+VmFsaWRCaXRzIC09IGJUb1JlYWQgOworfQorCit2b2lkIEZES19Db3B5IChIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZkRzdCwgSEFORExFX0ZES19CSVRCVUYgaF9CaXRCdWZTcmMsIFVJTlQgKmJ5dGVzVmFsaWQpCit7CisgIElOVCBiVG90YWwgPSAwOworCisgIC8qIGxpbWl0IG5vT2ZCeXRlcyB0byB2YWxpZCBieXRlcyBpbiBzcmMgYnVmZmVyIGFuZCBhdmFpbGFibGUgYnl0ZXMgaW4gZHN0IGJ1ZmZlciAqLworICBVSU5UIGJUb1JlYWQgICA9IGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgPj4gMyA7CisgIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKCpieXRlc1ZhbGlkIDwgYlRvUmVhZCkgPyAqYnl0ZXNWYWxpZCA6IGJUb1JlYWQgOworICBiVG9SZWFkICAgPSBGREtfZ2V0RnJlZUJpdHMoaF9CaXRCdWZEc3QpOworICBub09mQnl0ZXMgPSBmTWluKGJUb1JlYWQsIG5vT2ZCeXRlcyk7IC8vKGJUb1JlYWQgPCBub09mQnl0ZXMpID8gYlRvUmVhZCA6IG5vT2ZCeXRlczsKKworICB3aGlsZSAobm9PZkJ5dGVzID4gMCkKKyAgeworICAgIC8qIFNwbGl0IFJlYWQgdG8gYnVmZmVyIHNpemUgKi8KKyAgICBiVG9SZWFkID0gaF9CaXRCdWZEc3QtPmJ1ZlNpemUgLSBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCA7CisgICAgYlRvUmVhZCA9IGZNaW4obm9PZkJ5dGVzLCBiVG9SZWFkKTsgLy8obm9PZkJ5dGVzIDwgYlRvUmVhZCkgPyBub09mQnl0ZXMgOiBiVG9SZWFkIDsKKworICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gYnVmZmVyIHRvIGJ1ZmZlciAqLworICAgIGlmICghKGhfQml0QnVmU3JjLT5CaXROZHggJiAweDA3KSkgeworICAgICAgQ29weUFsaWduZWRCbG9jayAoaF9CaXRCdWZTcmMsIGhfQml0QnVmRHN0LT5CdWZmZXIgKyBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCwgYlRvUmVhZCkgOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBiVG9SZWFkOyBpKyspCisgICAgICB7CisgICAgICAgIGhfQml0QnVmRHN0LT5CdWZmZXIgW2hfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICsgaV0gPSAoVUNIQVIpRkRLX2dldChoX0JpdEJ1ZlNyYyw4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCisgICAgaF9CaXRCdWZEc3QtPlZhbGlkQml0cyAgKz0gYlRvUmVhZCA8PCAzIDsKKyAgICBiVG90YWwgICAgICAgKz0gYlRvUmVhZDsKKworICAgIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICA9IChoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhfQml0QnVmRHN0LT5idWZTaXplLTEpOworICAgIG5vT2ZCeXRlcyAgICAtPSBiVG9SZWFkOworICB9CisKKyAgKmJ5dGVzVmFsaWQgLT1iVG90YWw7Cit9CisKK3ZvaWQgRkRLX0ZldGNoIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqb3V0QnVmLCBVSU5UICp3cml0ZUJ5dGVzKQoreworICBVQ0hBUiAqUkVTVFJJQ1Qgb3V0cHV0QnVmZmVyID0gb3V0QnVmOworICBVSU5UIGJUb3RhbCA9IDAgOworCisgIFVJTlQgYlRvV3JpdGUgID0gKGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7CisgIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9Xcml0ZSwgKndyaXRlQnl0ZXMpOyAvLyhiVG9Xcml0ZSA8ICp3cml0ZUJ5dGVzKSA/IGJUb1dyaXRlIDogKndyaXRlQnl0ZXMgOworCisgIHdoaWxlIChub09mQnl0ZXMgPiAwKQorICB7CisgICAgLyogc3BsaXQgd3JpdGUgdG8gYnVmZmVyIHNpemUgKi8KKyAgICBiVG9Xcml0ZSA9IGhCaXRCdWYtPmJ1ZlNpemUgLSBoQml0QnVmLT5Xcml0ZU9mZnNldCA7CisgICAgYlRvV3JpdGUgPSBmTWluKGJUb1dyaXRlLCBub09mQnl0ZXMpOyAvLyhiVG9Xcml0ZSA8IG5vT2ZCeXRlcykgPyBiVG9Xcml0ZSA6IG5vT2ZCeXRlcyA7CisKKyAgICAvKiBjb3B5ICdiVG9Xcml0ZScgYnl0ZXMgZnJvbSBiaXRidWZmZXIgdG8gb3V0cHV0YnVmZmVyICovCisgICAgRkRLbWVtY3B5KG91dHB1dEJ1ZmZlciwgJmhCaXRCdWYtPkJ1ZmZlcltoQml0QnVmLT5Xcml0ZU9mZnNldF0sIGJUb1dyaXRlKnNpemVvZihVQ0hBUikpOworCisgICAgLyogc3ViIG5vT2ZCaXRzIGZyb20gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCisgICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICAtPSBiVG9Xcml0ZSA8PCAzIDsKKyAgICBiVG90YWwgICAgICAgKz0gYlRvV3JpdGUgOworICAgIG91dHB1dEJ1ZmZlciArPSBiVG9Xcml0ZSA7CisKKyAgICBoQml0QnVmLT5Xcml0ZU9mZnNldCAgPSAoaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgKyBiVG9Xcml0ZSkgJiAoaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEpIDsKKyAgICBub09mQnl0ZXMgICAgLT0gYlRvV3JpdGUgOworICB9CisKKyAgKndyaXRlQnl0ZXMgPSBiVG90YWwgOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9GREtfY29yZS5jcHAgYi9hYWMvbGliRkRLL3NyYy9GREtfY29yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNmViMAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL0ZES19jb3JlLmNwcApAQCAtMCwwICsxLDEzMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBGREsgdG9vbHMgdmVyc2lvbmluZyBzdXBwb3J0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19jb3JlLmgiCisKKy8qIEZESyB0b29scyBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDAgMgorI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMSAzCisjZGVmaW5lIEZES19UT09MU19MSUJfVkwyIDIKKyNkZWZpbmUgRkRLX1RPT0xTX0xJQl9USVRMRSAiRkRLIFRvb2xzIgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIEZES19UT09MU19MSUJfQlVJTERfREFURSAiIgorI2RlZmluZSBGREtfVE9PTFNfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIEZES19UT09MU19MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBGREtfVE9PTFNfTElCX0JVSUxEX1RJTUUgX19USU1FX18KKyNlbmRpZgorCitpbnQgRkRLX3Rvb2xzR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykKK3sKKyAgVUlOVCB2OworICBpbnQgaTsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGkgPSBGREtsaWJJbmZvX2xvb2t1cChpbmZvLCBGREtfVE9PTFMpOworICBpZiAoaTwwKSByZXR1cm4gLTE7CisKKyAgaW5mbyArPSBpOworCisgIHYgPSBMSUJfVkVSU0lPTihGREtfVE9PTFNfTElCX1ZMMCwgRkRLX1RPT0xTX0xJQl9WTDEsIEZES19UT09MU19MSUJfVkwyKTsKKworICBGREtzcHJpbnRmKGluZm8tPnZlcnNpb25TdHIsICIlZC4lZC4lZCIsICgodiA+PiAyNCkgJiAweGZmKSwgKCh2ID4+IDE2KSAmIDB4ZmYpLCAoKHYgPj4gOCApICYgMHhmZikpOworCisgIGluZm8tPm1vZHVsZV9pZCA9IEZES19UT09MUzsKKyAgaW5mby0+dmVyc2lvbiA9IHY7CisgIGluZm8tPmJ1aWxkX2RhdGUgPSAoY2hhciAqKUZES19UT09MU19MSUJfQlVJTERfREFURTsKKyAgaW5mby0+YnVpbGRfdGltZSA9IChjaGFyICopRkRLX1RPT0xTX0xJQl9CVUlMRF9USU1FOworICBpbmZvLT50aXRsZSAgICAgID0gKGNoYXIgKilGREtfVE9PTFNfTElCX1RJVExFOworICBpbmZvLT5mbGFncyA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9GREtfY3JjLmNwcCBiL2FhYy9saWJGREsvc3JjL0ZES19jcmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDQ3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9GREtfY3JjLmNwcApAQCAtMCwwICsxLDQ1OSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6CisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ1JDIGNhbGN1bGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19jcmMuaCIKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIHByZWNhbGN1bGF0ZWQgbG9va3VwIHRhYmxlcyBmb3IgY3JjIHBvbHlub20gIHheMTYgKyB4XjE1ICsgeF4yICsgeF4wLgorICovCitzdGF0aWMgY29uc3QgVVNIT1JUIGNyY0xvb2t1cF8xNl8xNV8yXzBbMjU2XSA9Cit7CisgIDB4MDAwMCwgMHg4MDA1LCAweDgwMGYsIDB4MDAwYSwgMHg4MDFiLCAweDAwMWUsIDB4MDAxNCwgMHg4MDExLAorICAweDgwMzMsIDB4MDAzNiwgMHgwMDNjLCAweDgwMzksIDB4MDAyOCwgMHg4MDJkLCAweDgwMjcsIDB4MDAyMiwKKyAgMHg4MDYzLCAweDAwNjYsIDB4MDA2YywgMHg4MDY5LCAweDAwNzgsIDB4ODA3ZCwgMHg4MDc3LCAweDAwNzIsCisgIDB4MDA1MCwgMHg4MDU1LCAweDgwNWYsIDB4MDA1YSwgMHg4MDRiLCAweDAwNGUsIDB4MDA0NCwgMHg4MDQxLAorICAweDgwYzMsIDB4MDBjNiwgMHgwMGNjLCAweDgwYzksIDB4MDBkOCwgMHg4MGRkLCAweDgwZDcsIDB4MDBkMiwKKyAgMHgwMGYwLCAweDgwZjUsIDB4ODBmZiwgMHgwMGZhLCAweDgwZWIsIDB4MDBlZSwgMHgwMGU0LCAweDgwZTEsCisgIDB4MDBhMCwgMHg4MGE1LCAweDgwYWYsIDB4MDBhYSwgMHg4MGJiLCAweDAwYmUsIDB4MDBiNCwgMHg4MGIxLAorICAweDgwOTMsIDB4MDA5NiwgMHgwMDljLCAweDgwOTksIDB4MDA4OCwgMHg4MDhkLCAweDgwODcsIDB4MDA4MiwKKyAgMHg4MTgzLCAweDAxODYsIDB4MDE4YywgMHg4MTg5LCAweDAxOTgsIDB4ODE5ZCwgMHg4MTk3LCAweDAxOTIsCisgIDB4MDFiMCwgMHg4MWI1LCAweDgxYmYsIDB4MDFiYSwgMHg4MWFiLCAweDAxYWUsIDB4MDFhNCwgMHg4MWExLAorICAweDAxZTAsIDB4ODFlNSwgMHg4MWVmLCAweDAxZWEsIDB4ODFmYiwgMHgwMWZlLCAweDAxZjQsIDB4ODFmMSwKKyAgMHg4MWQzLCAweDAxZDYsIDB4MDFkYywgMHg4MWQ5LCAweDAxYzgsIDB4ODFjZCwgMHg4MWM3LCAweDAxYzIsCisgIDB4MDE0MCwgMHg4MTQ1LCAweDgxNGYsIDB4MDE0YSwgMHg4MTViLCAweDAxNWUsIDB4MDE1NCwgMHg4MTUxLAorICAweDgxNzMsIDB4MDE3NiwgMHgwMTdjLCAweDgxNzksIDB4MDE2OCwgMHg4MTZkLCAweDgxNjcsIDB4MDE2MiwKKyAgMHg4MTIzLCAweDAxMjYsIDB4MDEyYywgMHg4MTI5LCAweDAxMzgsIDB4ODEzZCwgMHg4MTM3LCAweDAxMzIsCisgIDB4MDExMCwgMHg4MTE1LCAweDgxMWYsIDB4MDExYSwgMHg4MTBiLCAweDAxMGUsIDB4MDEwNCwgMHg4MTAxLAorICAweDgzMDMsIDB4MDMwNiwgMHgwMzBjLCAweDgzMDksIDB4MDMxOCwgMHg4MzFkLCAweDgzMTcsIDB4MDMxMiwKKyAgMHgwMzMwLCAweDgzMzUsIDB4ODMzZiwgMHgwMzNhLCAweDgzMmIsIDB4MDMyZSwgMHgwMzI0LCAweDgzMjEsCisgIDB4MDM2MCwgMHg4MzY1LCAweDgzNmYsIDB4MDM2YSwgMHg4MzdiLCAweDAzN2UsIDB4MDM3NCwgMHg4MzcxLAorICAweDgzNTMsIDB4MDM1NiwgMHgwMzVjLCAweDgzNTksIDB4MDM0OCwgMHg4MzRkLCAweDgzNDcsIDB4MDM0MiwKKyAgMHgwM2MwLCAweDgzYzUsIDB4ODNjZiwgMHgwM2NhLCAweDgzZGIsIDB4MDNkZSwgMHgwM2Q0LCAweDgzZDEsCisgIDB4ODNmMywgMHgwM2Y2LCAweDAzZmMsIDB4ODNmOSwgMHgwM2U4LCAweDgzZWQsIDB4ODNlNywgMHgwM2UyLAorICAweDgzYTMsIDB4MDNhNiwgMHgwM2FjLCAweDgzYTksIDB4MDNiOCwgMHg4M2JkLCAweDgzYjcsIDB4MDNiMiwKKyAgMHgwMzkwLCAweDgzOTUsIDB4ODM5ZiwgMHgwMzlhLCAweDgzOGIsIDB4MDM4ZSwgMHgwMzg0LCAweDgzODEsCisgIDB4MDI4MCwgMHg4Mjg1LCAweDgyOGYsIDB4MDI4YSwgMHg4MjliLCAweDAyOWUsIDB4MDI5NCwgMHg4MjkxLAorICAweDgyYjMsIDB4MDJiNiwgMHgwMmJjLCAweDgyYjksIDB4MDJhOCwgMHg4MmFkLCAweDgyYTcsIDB4MDJhMiwKKyAgMHg4MmUzLCAweDAyZTYsIDB4MDJlYywgMHg4MmU5LCAweDAyZjgsIDB4ODJmZCwgMHg4MmY3LCAweDAyZjIsCisgIDB4MDJkMCwgMHg4MmQ1LCAweDgyZGYsIDB4MDJkYSwgMHg4MmNiLCAweDAyY2UsIDB4MDJjNCwgMHg4MmMxLAorICAweDgyNDMsIDB4MDI0NiwgMHgwMjRjLCAweDgyNDksIDB4MDI1OCwgMHg4MjVkLCAweDgyNTcsIDB4MDI1MiwKKyAgMHgwMjcwLCAweDgyNzUsIDB4ODI3ZiwgMHgwMjdhLCAweDgyNmIsIDB4MDI2ZSwgMHgwMjY0LCAweDgyNjEsCisgIDB4MDIyMCwgMHg4MjI1LCAweDgyMmYsIDB4MDIyYSwgMHg4MjNiLCAweDAyM2UsIDB4MDIzNCwgMHg4MjMxLAorICAweDgyMTMsIDB4MDIxNiwgMHgwMjFjLCAweDgyMTksIDB4MDIwOCwgMHg4MjBkLCAweDgyMDcsIDB4MDIwMgorfTsKKworLyoqCisgKiBcYnJpZWYgIFRoaXMgdGFibGUgZGVmaW5lcyBwcmVjYWxjdWxhdGVkIGxvb2t1cCB0YWJsZXMgZm9yIGNyYyBwb2x5bm9tICB4XjE2ICsgeF4xMiArIHheNSArIHheMC4KKyAqLworc3RhdGljIGNvbnN0IFVTSE9SVCBjcmNMb29rdXBfMTZfMTJfNV8wWzI1Nl0gPQoreworICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKKyAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCisgIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAorICAweDkzMzksIDB4ODMxOCwgMHhiMzdiLCAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwKKyAgMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0ZTYsIDB4NzRjNywgMHg0NGE0LCAweDU0ODUsCisgIDB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAorICAweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LCAweDU2OTUsIDB4NDZiNCwKKyAgMHhiNzViLCAweGE3N2EsIDB4OTcxOSwgMHg4NzM4LCAweGY3ZGYsIDB4ZTdmZSwgMHhkNzlkLCAweGM3YmMsCisgIDB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorICAweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwKKyAgMHg1YWY1LCAweDRhZDQsIDB4N2FiNywgMHg2YTk2LCAweDFhNzEsIDB4MGE1MCwgMHgzYTMzLCAweDJhMTIsCisgIDB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAorICAweDZjYTYsIDB4N2M4NywgMHg0Y2U0LCAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwKKyAgMHhlZGFlLCAweGZkOGYsIDB4Y2RlYywgMHhkZGNkLCAweGFkMmEsIDB4YmQwYiwgMHg4ZDY4LCAweDlkNDksCisgIDB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAorICAweGZmOWYsIDB4ZWZiZSwgMHhkZmRkLCAweGNmZmMsIDB4YmYxYiwgMHhhZjNhLCAweDlmNTksIDB4OGY3OCwKKyAgMHg5MTg4LCAweDgxYTksIDB4YjFjYSwgMHhhMWViLCAweGQxMGMsIDB4YzEyZCwgMHhmMTRlLCAweGUxNmYsCisgIDB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorICAweDgzYjksIDB4OTM5OCwgMHhhM2ZiLCAweGIzZGEsIDB4YzMzZCwgMHhkMzFjLCAweGUzN2YsIDB4ZjM1ZSwKKyAgMHgwMmIxLCAweDEyOTAsIDB4MjJmMywgMHgzMmQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCisgIDB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAorICAweDM0ZTIsIDB4MjRjMywgMHgxNGEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKyAgMHhhN2RiLCAweGI3ZmEsIDB4ODc5OSwgMHg5N2I4LCAweGU3NWYsIDB4Zjc3ZSwgMHhjNzFkLCAweGQ3M2MsCisgIDB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorICAweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LCAweGI5OGEsIDB4YTlhYiwKKyAgMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4YzAsIDB4MDhlMSwgMHgzODgyLCAweDI4YTMsCisgIDB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAorICAweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwKKyAgMHhmZDJlLCAweGVkMGYsIDB4ZGQ2YywgMHhjZDRkLCAweGJkYWEsIDB4YWQ4YiwgMHg5ZGU4LCAweDhkYzksCisgIDB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAorICAweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLCAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwKKyAgMHg2ZTE3LCAweDdlMzYsIDB4NGU1NSwgMHg1ZTc0LCAweDJlOTMsIDB4M2ViMiwgMHgwZWQxLCAweDFlZjAKK307CisKKworLyotLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKAorICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCisgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjTWFzaywKKyAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0cworICAgICAgICApOworCitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0J5dGVzKAorICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCisgICAgICAgIGNvbnN0IFVTSE9SVCAqICAgICAgICAgICAgICAgICAgcENyY0xvb2t1cCwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzCisgICAgICAgICk7CisKK3N0YXRpYyB2b2lkIGNyY0NhbGMoCisgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZworICAgICAgICApOworCisKKy8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBGREtjcmNJbml0KAorICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY1BvbHksCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjU3RhcnRWYWx1ZSwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNMZW4KKyAgICAgICAgKQoreworICAvKiBjcmMgcG9seW5vbSBleGFtcGxlOgorICB4XjE2ICsgeF4xNSArIHheMiArIHheMCAgICAgICAgKDEpIDEwMDAgMDAwMCAwMDAwIDAxMDEgLT4gMHg4MDA1CisgIHheMTYgKyB4XjEyICsgeF41ICsgeF4wICAgICAgICAoMSkgMDAwMSAwMDAwIDAwMTAgMDAwMSAtPiAweDEwMjEKKyAgeF44ICsgeF40ICsgeF4zICsgeF4yICsgeF4wICAgICAgICAgICAgICAoMSkgMDAwMSAxMTAxIC0+IDB4MDAxZCAqLworCisgIGhDcmNJbmZvLT5jcmNMZW4gICAgID0gY3JjTGVuOworICBoQ3JjSW5mby0+Y3JjUG9seSAgICA9IGNyY1BvbHk7CisgIGhDcmNJbmZvLT5zdGFydFZhbHVlID0gY3JjU3RhcnRWYWx1ZTsKKyAgaENyY0luZm8tPmNyY01hc2sgICAgPSAoY3JjTGVuKSA/ICgxPDwoY3JjTGVuLTEpKSA6IDA7CisKKyAgRkRLY3JjUmVzZXQoaENyY0luZm8pOworCisgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gMDsKKworICBpZiAoaENyY0luZm8tPmNyY0xlbj09MTYpIHsKKyAgICBzd2l0Y2ggKCBjcmNQb2x5ICkgeworICAgICAgY2FzZSAweDgwMDU6CisgICAgICAgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gY3JjTG9va3VwXzE2XzE1XzJfMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MTAyMToKKyAgICAgICAgaENyY0luZm8tPnBDcmNMb29rdXAgPSBjcmNMb29rdXBfMTZfMTJfNV8wOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwMDFkOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogbm8gbG9va3VwIHRhYmxlICovCisgICAgICAgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gMDsKKyAgICB9CisgIH0KKworCit9CisKK3ZvaWQgRkRLY3JjUmVzZXQoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvKQoreworICBpbnQgaTsKKworICBoQ3JjSW5mby0+Y3JjVmFsdWUgPSBoQ3JjSW5mby0+c3RhcnRWYWx1ZTsKKworICBmb3IoaT0wO2k8TUFYX0NSQ19SRUdTO2krKykgeworICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW2ldLmlzQWN0aXZlID0gMDsKKyAgfQorICBoQ3JjSW5mby0+cmVnU3RhcnQgPSAwOworICBoQ3JjSW5mby0+cmVnU3RvcCAgPSAwOworfQorCitJTlQgRkRLY3JjU3RhcnRSZWcoCisgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCisgICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzCisgICAgICAgICkKK3sKKyAgaW50IHJlZyA9IGhDcmNJbmZvLT5yZWdTdGFydDsKKworICBGREtfQVNTRVJUKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmU9PTApOworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlICAgICAgPSAxOworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLm1heEJpdHMgICAgICAgPSBtQml0czsKKyAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgICAgID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgOworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmJpdEJ1ZkNudEJpdHMgPSAwOworCisgIGhDcmNJbmZvLT5yZWdTdGFydCA9IChoQ3JjSW5mby0+cmVnU3RhcnQrMSklTUFYX0NSQ19SRUdTOworCisgIHJldHVybiAocmVnKTsKK30KKworSU5UIEZES2NyY0VuZFJlZygKKyAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKKyAgICAgICAgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQnMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgcmVnCisgICAgICAgICkKK3sKKyAgRkRLX0FTU0VSVCgocmVnPT0oSU5UKWhDcmNJbmZvLT5yZWdTdG9wKSYmKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmU9PTEpKTsKKworICBpZiAoaEJzLT5Db25maWdDYWNoZT09QlNfV1JJVEVSKSB7CisgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0czsKKyAgfQorICBlbHNlIHsKKyAgICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmJpdEJ1ZkNudEJpdHMgPSBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0cyAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICB9CisKKyAgaWYgKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10ubWF4Qml0cyA9PSAwKSB7CisgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5tYXhCaXRzID0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzOworICB9CisKKyAgY3JjQ2FsYyggaENyY0luZm8sIGhCcywgcmVnKTsKKworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlID0gMDsKKyAgaENyY0luZm8tPnJlZ1N0b3AgPSAoaENyY0luZm8tPnJlZ1N0b3ArMSklTUFYX0NSQ19SRUdTOworCisgIHJldHVybiAwOworfQorCitVU0hPUlQgRkRLY3JjR2V0Q1JDKAorICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgIGhDcmNJbmZvCisgICAgICAgICkKK3sKKyAgcmV0dXJuICggaENyY0luZm8tPmNyY1ZhbHVlICYgKCgoaENyY0luZm8tPmNyY01hc2stMSk8PDEpKzEpICk7Cit9CisKKy8qKgorICogXGJyaWVmICBDYWxjdWxhdGUgY3JjIGJpdHMuCisgKgorICogQ2FsY3VsYXRlIGNyYyBzdGFydGluZyBhdCBjdXJyZW50IGJpdHN0cmVhbSBwb3N0aW9uIG92ZXIgbkJpdHMuCisgKgorICogXHBhcmFtIHBDcmMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gY3JjTWFzayAgICAgICAgICAgICAgIENyY01hc2sgaW4gdXNlLgorICogXHBhcmFtIGNyY1BvbHkgICAgICAgICAgICAgICBDcmMgcG9seW5vbSBpbiB1c2UuCisgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIEhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgorICogXHBhcmFtIG5CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcHJvY2Vzc2luZyBiaXRzLgorICoKKyAqIFxyZXR1cm4gIE51bWJlciBvZiBwcm9jZXNzZWQgYml0cy4KKyAqLworc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKAorICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCisgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjTWFzaywKKyAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0cworICAgICAgICApCit7CisgIGludCBpOworICBVU0hPUlQgY3JjID0gKnBDcmM7IC8qIGdldCBjcmMgdmFsdWUgKi8KKworICBpZiAoaEJzIT1OVUxMKSB7CisgICAgZm9yIChpID0gMDsgKGkgPCBuQml0cyk7IGkrKykgeworICAgICAgVVNIT1JUIHRtcCA9IEZES3JlYWRCaXRzKGhCcywxKTsgICAgIC8vIHByb2Nlc3Mgc2luZ2xlIGJpdAorICAgICAgdG1wIF49ICggKGNyYyAmIGNyY01hc2spID8gMSA6IDAgKTsKKyAgICAgIHRtcCAqPSBjcmNQb2x5OworICAgICAgY3JjIDw8PSAxOworICAgICAgY3JjIF49IHRtcDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZm9yIChpID0gMDsgKGkgPCBuQml0cyk7IGkrKykgeworICAgICAgVVNIT1JUIHRtcCA9IDA7ICAgICAvLyBwcm9jZXNzIHNpbmdsZSBiaXQKKyAgICAgIHRtcCBePSAoIChjcmMgJiBjcmNNYXNrKSA/IDEgOiAwICk7CisgICAgICB0bXAgKj0gY3JjUG9seTsKKyAgICAgIGNyYyA8PD0gMTsKKyAgICAgIGNyYyBePSB0bXA7CisgICAgfQorICB9CisgICpwQ3JjID0gY3JjOyAvKiB1cGRhdGUgY3JjIHZhbHVlICovCisKKyAgcmV0dXJuIG5CaXRzOworfQorCisvKioKKyAqIFxicmllZiAgQ2FsY3VsYXRlIGNyYyBieXRlcy4KKyAqCisgKiBDYWxjdWxhdGUgY3JjIHN0YXJ0aW5nIGF0IGN1cnJlbnQgYml0c3RyZWFtIHBvc3Rpb24gb3ZlciBuQnl0ZXMuCisgKgorICogXHBhcmFtIHBDcmMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gcENyY0xvb2t1cCAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9va3VwIHRhYmxlIHVzZWQgZm9yIGZhc3QgY3JjIGNhbGN1bGF0aW9uLgorICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICBIYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBuQml0cyAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHByb2Nlc3NpbmcgYnl0ZXMuCisgKgorICogXHJldHVybiAgTnVtYmVyIG9mIHByb2Nlc3NlZCBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0J5dGVzKAorICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCisgICAgICAgIGNvbnN0IFVTSE9SVCAqICAgICAgICAgICAgICAgICAgcENyY0xvb2t1cCwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzCisgICAgICAgICkKK3sKKyAgaW50IGk7CisgIFVTSE9SVCBjcmMgPSAqcENyYzsgLyogZ2V0IGNyYyB2YWx1ZSAqLworCisgIGlmIChoQnMhPU5VTEwpIHsKKyAgICBmb3IgKGk9MDsgaTxuQnl0ZXM7IGkrKykgeworICAgICAgY3JjID0gKGNyYzw8OClecENyY0xvb2t1cFsoKGNyYz4+OCleKChVQ0hBUilGREtyZWFkQml0cyhoQnMsOCkpKSYweEZGXTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZm9yIChpPTA7IGk8bkJ5dGVzOyBpKyspIHsKKyAgICAgIGNyYyA9IChjcmM8PDgpXnBDcmNMb29rdXBbKChjcmM+PjgpXigoVUNIQVIpMCkpJjB4RkZdOworICAgIH0KKyAgfQorCisgICpwQ3JjID0gY3JjOyAvKiB1cGRhdGUgY3JjIHZhbHVlICovCisKKyAgcmV0dXJuIChpKTsKK30KKworLyoqCisgKiBcYnJpZWYgIENhbGN1bGF0ZSBjcmMuCisgKgorICogQ2FsY3VsYXRlIGNyYy4gTGVuZ2h0IGRlcGVuZHMgb24gbUJpdHMgcGFyYW1ldGVyIGluIEZES2NyY1N0YXJ0UmVnKCkgY29uZmlndXJhdGlvbi4KKyAqCisgKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgorICogXHBhcmFtIHJlZyAgICAgICAgICAgICAgICAgICBDcmMgcmVnaW9uIElELgorICoKKyAqIFxyZXR1cm4gIE51bWJlciBvZiBwcm9jZXNzZWQgYml0cy4KKyAqLworc3RhdGljIHZvaWQgY3JjQ2FsYygKKyAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgcmVnCisgICAgICAgICkKK3sKKyAgVVNIT1JUIGNyYyA9IGhDcmNJbmZvLT5jcmNWYWx1ZTsKKyAgQ0NyY1JlZ0RhdGEgKnJEID0gJmhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ107CisgIEZES19CSVRTVFJFQU0gYnNSZWFkZXI7CisKKyAgaWYgKGhCcy0+Q29uZmlnQ2FjaGU9PUJTX1JFQURFUikgeworICAgIGJzUmVhZGVyID0gKmhCczsKKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbCgmYnNSZWFkZXIsIC0oSU5UKShyRC0+dmFsaWRCaXRzLUZES2dldFZhbGlkQml0cygmYnNSZWFkZXIpKSk7CisgIH0KKyAgZWxzZSB7CisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNSZWFkZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCBoQnMtPmhCaXRCdWYuVmFsaWRCaXRzLCBCU19SRUFERVIpOworICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKCZic1JlYWRlciwgckQtPnZhbGlkQml0cyk7CisgIH0KKworICBpbnQgYml0cywgckJpdHM7CisgIHJCaXRzID0gKHJELT5tYXhCaXRzPj0wKSA/IHJELT5tYXhCaXRzIDogLXJELT5tYXhCaXRzOyAvKiByYW1haW5pbmcgYml0cyAqLworICBpZiAoKHJELT5tYXhCaXRzPjApICYmICgoKElOVClyRC0+Yml0QnVmQ250Qml0cz4+Mzw8Myk8ckJpdHMpICkgeworICAgIGJpdHMgPSByRC0+Yml0QnVmQ250Qml0czsKKyAgfQorICBlbHNlIHsKKyAgICBiaXRzID0gckJpdHM7CisgIH0KKworICBpbnQgd29yZHMgPSBiaXRzID4+IDM7ICAvKiBwcm9jZXNzaW5nIGJ5dGVzICovCisgIGludCBtQml0cyA9IGJpdHMgJiAweDc7IC8qIG1vZHVsbyBiaXRzICovCisKKyAgaWYoaENyY0luZm8tPnBDcmNMb29rdXApIHsKKyAgICByQml0cyAtPSAoY2FsY0NyY19CeXRlcygmY3JjLCBoQ3JjSW5mby0+cENyY0xvb2t1cCwgJmJzUmVhZGVyLCB3b3Jkcyk8PDMpOworICB9CisgIGVsc2UgeworICAgIHJCaXRzIC09IGNhbGNDcmNfQml0cygmY3JjLCBoQ3JjSW5mby0+Y3JjTWFzaywgaENyY0luZm8tPmNyY1BvbHksICZic1JlYWRlciwgd29yZHM8PDMgKTsKKyAgfQorCisgIC8qIHJlbWFpbmluZyB2YWxpZCBiaXRzKi8KKyAgaWYobUJpdHMhPTApIHsKKyAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsIG1CaXRzICk7CisgIH0KKworICBpZiAockJpdHMhPTApIHsKKyAgICAvKiB6ZXJvIGJ5dGVzICovCisgICAgaWYgKCAoaENyY0luZm8tPnBDcmNMb29rdXApICYmIChyQml0cz44KSApIHsKKyAgICAgIHJCaXRzIC09IChjYWxjQ3JjX0J5dGVzKCZjcmMsIGhDcmNJbmZvLT5wQ3JjTG9va3VwLCBOVUxMLCByQml0cz4+Myk8PDMpOworICAgIH0KKyAgICAvKiByZW1haW5pbmcgemVybyBiaXRzICovCisgICAgaWYgKHJCaXRzIT0wKSB7CisgICAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCBOVUxMLCByQml0cyApOworICAgIH0KKyAgfQorCisgIGhDcmNJbmZvLT5jcmNWYWx1ZSA9IGNyYzsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvRkRLX2h5YnJpZC5jcHAgYi9hYWMvbGliRkRLL3NyYy9GREtfaHlicmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDgxNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvRkRLX2h5YnJpZC5jcHAKQEAgLTAsMCArMSw3MDkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBNYXJrdXMgTG9od2Fzc2VyCisgICBEZXNjcmlwdGlvbjogRkRLIFRvb2xzIEh5YnJpZCBGaWx0ZXJiYW5rCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19oeWJyaWQuaCIKKworCisjaW5jbHVkZSAiZmZ0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBGRlRfSURYX1IoYSkgICgyKmEpCisjZGVmaW5lIEZGVF9JRFhfSShhKSAgKDIqYSsxKQorCisjZGVmaW5lIEhZQl9DT0VGOF8wICAoIDAuMDA3NDYwODI5NDk4MTJmICkKKyNkZWZpbmUgSFlCX0NPRUY4XzEgICggMC4wMjI3MDQyMDk0OTgyNWYgKQorI2RlZmluZSBIWUJfQ09FRjhfMiAgKCAwLjA0NTQ2ODY1OTMwNDczZiApCisjZGVmaW5lIEhZQl9DT0VGOF8zICAoIDAuMDcyNjYxMTM5Mjk1OTFmICkKKyNkZWZpbmUgSFlCX0NPRUY4XzQgICggMC4wOTg4NTEwODU3NTI2NGYgKQorI2RlZmluZSBIWUJfQ09FRjhfNSAgKCAwLjExNzkzNzEwNTY3MjE3ZiApCisjZGVmaW5lIEhZQl9DT0VGOF82ICAoIDAuMTI1MDAwMDAwMDAwMDBmICkKKyNkZWZpbmUgSFlCX0NPRUY4XzcgICggSFlCX0NPRUY4XzUgKQorI2RlZmluZSBIWUJfQ09FRjhfOCAgKCBIWUJfQ09FRjhfNCApCisjZGVmaW5lIEhZQl9DT0VGOF85ICAoIEhZQl9DT0VGOF8zICkKKyNkZWZpbmUgSFlCX0NPRUY4XzEwICggSFlCX0NPRUY4XzIgKQorI2RlZmluZSBIWUJfQ09FRjhfMTEgKCBIWUJfQ09FRjhfMSApCisjZGVmaW5lIEhZQl9DT0VGOF8xMiAoIEhZQl9DT0VGOF8wICkKKworCisvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKKyAgI2RlZmluZSBGSVhQX0hUQiBGSVhQX1NHTCAgICAgICAgICAgICAgIC8qIFNHTCBkYXRhIHR5cGUuICovCisgICNkZWZpbmUgRklYUF9IVFAgRklYUF9TUEsgICAgICAgICAgICAgICAvKiBQYWNrZWQgU0dMIGRhdGEgdHlwZS4gKi8KKyAgI2RlZmluZSBIVEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkgIC8qIENhc3QgdG8gU0dMICovCisgICNkZWZpbmUgRkwyRlhDT05TVF9IVEIgRkwyRlhDT05TVF9TR0wKKyNlbHNlCisgICNkZWZpbmUgRklYUF9IVEIgRklYUF9EQkwgICAgICAgICAgICAgICAvKiBTR0wgZGF0YSB0eXBlLiAqLworICAjZGVmaW5lIEZJWFBfSFRQIEZJWFBfRFBLICAgICAgICAgICAgICAgLyogUGFja2VkIERCTCBkYXRhIHR5cGUuICovCisgICNkZWZpbmUgSFRDKGEpICgoRklYUF9EQkwpKExPTkcpKGEpKSAgICAvKiBDYXN0IHRvIERCTCAqLworICAjZGVmaW5lIEZMMkZYQ09OU1RfSFRCIEZMMkZYQ09OU1RfREJMCisjZW5kaWYKKworI2RlZmluZSBIVENQKHJlYWwsaW1hZykgeyB7IEhUQyhyZWFsKSwgSFRDKGltYWcpIH0gfSAvKiBIb3cgdG8gYXJyYW5nZSB0aGUgcGFja2VkIHZhbHVlcy4gKi8KKworCitzdHJ1Y3QgRkRLX0hZQlJJRF9TRVRVUAoreworICAgIFVDSEFSICAgICAgICAgICAgICAgbnJRbWZCYW5kczsgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQuICovCisgICAgVUNIQVIgICAgICAgICAgICAgICBuSHliQmFuZHNbM107ICAgICAgICAvKiE8IE51bWJlciBvZiBIeWJyaWQgYmFuZHMgZ2VuZXJhdGVkIGJ5IG5yUW1mQmFuZHMuICovCisgICAgU0NIQVIgICAgICAgICAgICAgICBrSHlicmlkWzNdOyAgICAgICAgICAvKiE8IEZpbHRlciBjb25maWd1cmF0aW9uIG9mIGVhY2ggUU1GIGJhbmQuICovCisgICAgVUNIQVIgICAgICAgICAgICAgICBwcm90b0xlbjsgICAgICAgICAgICAvKiE8IFByb3RvdHlwZSBmaWx0ZXIgbGVuZ3RoLiAqLworICAgIFVDSEFSICAgICAgICAgICAgICAgZmlsdGVyRGVsYXk7ICAgICAgICAgLyohPCBEZWxheSBjYXVzZWQgYnkgaHlicmlkIGZpbHRlci4gKi8KKyAgICBjb25zdCBJTlQgICAgICAgICAgKnBSZWFkSWR4VGFibGU7ICAgICAgIC8qITwgSGVscGVyIHRhYmxlIHRvIGFjY2VzcyBpbnB1dCBkYXRhIHJpbmdidWZmZXIuICovCisKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGNvbnN0IElOVCByaW5nYnVmZklkeFRhYlsyKjEzXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiB9OworCitzdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzE2ID0geyAzLCB7IDgsIDQsIDR9LCB7ICA4LCAgNCwgIDR9LCAxMywgKDEzLTEpLzIsIHJpbmdidWZmSWR4VGFifTsKK3N0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTIgPSB7IDMsIHsgOCwgMiwgMn0sIHsgIDgsICAyLCAgMn0sIDEzLCAoMTMtMSkvMiwgcmluZ2J1ZmZJZHhUYWJ9Oworc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xMCA9IHsgMywgeyA2LCAyLCAyfSwgeyAtOCwgLTIsICAyfSwgMTMsICgxMy0xKS8yLCByaW5nYnVmZklkeFRhYn07CisKKworc3RhdGljIGNvbnN0IEZJWFBfSFRQIEh5YkZpbHRlckNvZWY4W10gPSB7CisgIEhUQ1AoMHgxMDAwMDAwMCwgMHgwMDAwMDAwMCksIEhUQ1AoMHgwZGYyNjQwNywgMHhmYTM5MTg4MiksIEhUQ1AoMHhmZjUzMjEwOSwgMHgwMGFjZGVmNyksIEhUQ1AoMHgwOGYyNmQzNiwgMHhmNzBkOTJjYSksCisgIEhUQ1AoMHhmZWUzNGI1ZiwgMHgwMmFmNTcwZiksIEhUQ1AoMHgwMzhmMjc2ZSwgMHhmNzY4NDc5MyksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksCisgIEhUQ1AoMHgwMzhmMjc2ZSwgMHgwODk3Yjg2ZCksIEhUQ1AoMHhmZWUzNGI1ZiwgMHhmZDUwYThmMSksIEhUQ1AoMHgwOGYyNmQzNiwgMHgwOGYyNmQzNiksIEhUQ1AoMHhmZjUzMjEwOSwgMHhmZjUzMjEwOSksCisgIEhUQ1AoMHgwZGYyNjQwNywgMHgwNWM2ZTc3ZSkKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0hUQiBIeWJGaWx0ZXJDb2VmMlsxM10gPSB7CisgIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAxODk5NDg3NTI2MDQ5ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjMwNTk2NjMwNTQ1MTY4ZiksCisgIEZMMkZYQ09OU1RfSFRCKCAwLjUwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjMwNTk2NjMwNTQ1MTY4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAxODk5NDg3NTI2MDQ5ZiksCisgIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZikKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0hUQiBIeWJGaWx0ZXJDb2VmNFsxM10gPSB7CisgIEZMMkZYQ09OU1RfSFRCKC0wLjAwMzA1MTUxOTI3MzA1ZiksIEZMMkZYQ09OU1RfSFRCKC0wLjAwNzk0ODYyMzE2MjAzZiksIEZMMkZYQ09OU1RfSFRCKCAgICAgICAgICAgICAgMC4wZiksIEZMMkZYQ09OU1RfSFRCKCAwLjA0MzE4OTI0MDM4NzU2ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjEyNTQyNDQ4MjEwNDQ1ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjIxMjI3ODA3MDQ5MTYwZiksCisgIEZMMkZYQ09OU1RfSFRCKCAgICAgICAgICAgICAwLjI1ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjIxMjI3ODA3MDQ5MTYwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjEyNTQyNDQ4MjEwNDQ1ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjA0MzE4OTI0MDM4NzU2ZiksIEZMMkZYQ09OU1RfSFRCKCAgICAgICAgICAgICAgMC4wZiksIEZMMkZYQ09OU1RfSFRCKC0wLjAwNzk0ODYyMzE2MjAzZiksCisgIEZMMkZYQ09OU1RfSFRCKC0wLjAwMzA1MTUxOTI3MzA1ZikKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZygKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAorICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZFJlYWwsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRJbWFnLAorICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAgICAgICBoeWJyaWRDb25maWcKKyAgICAgICAgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KKworSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKKyAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwTEZtZW1vcnksCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZSwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEhGbWVtb3J5LAorICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBIRm1lbW9yeVNpemUKKyAgICAgICAgKQoreworICBJTlQgZXJyID0gMDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gZXh0ZXJuIG1lbW9yeS4gKi8KKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5wTEZtZW1vcnkgICAgPSBwTEZtZW1vcnk7CisgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gTEZtZW1vcnlTaXplOworCisgIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ICAgID0gcEhGbWVtb3J5OworICBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSA9IEhGbWVtb3J5U2l6ZTsKKworICByZXR1cm4gZXJyOworfQorCitJTlQgRkRLaHlicmlkQW5hbHlzaXNJbml0KAorICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGluaXRTdGF0ZXNGbGFnCisgICAgICAgICkKK3sKKyAgICBpbnQgazsKKyAgICBJTlQgZXJyID0gMDsKKyAgICBGSVhQX0RCTCAqcE1lbSA9IE5VTEw7CisgICAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOworCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICBjYXNlIFRIUkVFX1RPX1RFTjogICAgIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEwOyBicmVhazsKKyAgICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOiAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTI7IGJyZWFrOworICAgICAgY2FzZSBUSFJFRV9UT19TSVhURUVOOiBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xNjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIGVyciA9IC0xOyBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBoYW5kbGUuICovCisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAgICAgICA9IHNldHVwOworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3MgPSBzZXR1cC0+cHJvdG9MZW4tMTsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zID0gMDsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgICAgID0gcW1mQmFuZHM7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgICA9IGNwbHhCYW5kczsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmhmTW9kZSAgICAgID0gMDsKKworICAgIC8qIENoZWNrIGF2YWlsYWJsZSBtZW1vcnkuICovCisgICAgaWYgKCAoKDIqc2V0dXAtPm5yUW1mQmFuZHMqc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpID4gaEFuYWx5c2lzSHliRmlsdGVyLT5MRm1lbW9yeVNpemUpCisgICAgICB8fCAoKHNldHVwLT5maWx0ZXJEZWxheSooKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSsoY3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSkqc2l6ZW9mKEZJWFBfREJMKSkgPiBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSkgKQorICAgIHsKKyAgICAgIGVyciA9IC0yOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIERpc3RyaWJ1dCBMRiBtZW1vcnkuICovCisgICAgcE1lbSA9IGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5OworICAgIGZvciAoaz0wOyBrPHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKKyAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdID0gcE1lbTsgcE1lbSArPSBzZXR1cC0+cHJvdG9MZW47CisgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSA9IHBNZW07IHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOworICAgIH0KKworICAgIC8qIERpc3RyaWJ1dCBIRiBtZW1vcnkuICovCisgICAgcE1lbSA9IGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5OworICAgIGZvciAoaz0wOyBrPHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7CisgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSA9IHBNZW07IHBNZW0gKz0gKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKTsKKyAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdID0gcE1lbTsgcE1lbSArPSAoY3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKTsKKyAgICB9CisKKyAgICBpZiAoaW5pdFN0YXRlc0ZsYWcpIHsKKyAgICAgIC8qIENsZWFyIExGIGJ1ZmZlciAqLworICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgeworICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSwgc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwgc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorCisgICAgICBpZiAocW1mQmFuZHMgPiBzZXR1cC0+bnJRbWZCYW5kcykgeworICAgICAgLyogQ2xlYXIgSEYgYnVmZmVyICovCisgICAgICBmb3IgKGs9MDsgazxzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgeworICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSwgKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10sIChjcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorICAgIH0KKyAgICB9CisKK2JhaWw6CisgICAgcmV0dXJuIGVycjsKK30KKworSU5UIEZES2h5YnJpZEFuYWx5c2lzU2NhbGVTdGF0ZXMoCisgICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgc2NhbGluZ1ZhbHVlCisgICAgICAgICkKK3sKKyAgICBJTlQgZXJyID0gMDsKKworICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXI9PU5VTEwpIHsKKyAgICAgIGVyciA9IDE7IC8qIGludmFsaWQgaGFuZGxlICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IGs7CisgICAgICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwOworCisgICAgICAvKiBTY2FsZSBMRiBidWZmZXIgKi8KKyAgICAgIGZvciAoaz0wOyBrPHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sIHNldHVwLT5wcm90b0xlbiwgc2NhbGluZ1ZhbHVlKTsKKyAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sIHNldHVwLT5wcm90b0xlbiwgc2NhbGluZ1ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBzZXR1cC0+bnJRbWZCYW5kcykgeworICAgICAgICAvKiBTY2FsZSBIRiBidWZmZXIgKi8KKyAgICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKKyAgICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcyksIHNjYWxpbmdWYWx1ZSk7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10sIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcyksIHNjYWxpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCisgICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSHlicmlkUmVhbCwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZEltYWcpCit7CisgICAgaW50IGssIGh5Yk9mZnNldCA9IDA7CisgICAgSU5UIGVyciA9IDA7CisgICAgY29uc3QgaW50IG5yUW1mQmFuZHNMRiA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5uclFtZkJhbmRzOyAvKiBudW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQgKi8KKworICAgIGNvbnN0IGludCB3cml0SW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOworICAgIGludCByZWFkSW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOworCisgICAgaWYgKCsrcmVhZEluZGV4Pj1oQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+cHJvdG9MZW4pIHJlYWRJbmRleCA9IDA7CisgICAgY29uc3QgSU5UKiBwQnVmZmVyTEZyZWFkSWR4ID0gJmhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5wUmVhZElkeFRhYmxlW3JlYWRJbmRleF07CisKKyAgICAvKgorICAgICAqIExGIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBmb3IgKGs9MDsgazxuclFtZkJhbmRzTEY7IGsrKykgeworICAgICAgICAvKiBOZXcgaW5wdXQgc2FtcGxlLiAqLworICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXVt3cml0SW5kZXhdID0gcFFtZlJlYWxba107CisgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdW3dyaXRJbmRleF0gPSBwUW1mSW1hZ1trXTsKKworICAgIC8qIFBlcmZvcm0gaHlicmlkIGZpbHRlcmluZy4gKi8KKyAgICAgICAga0NoYW5uZWxGaWx0ZXJpbmcoCisgICAgICAgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sCisgICAgICAgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sCisgICAgICAgICAgICAgICAgcEJ1ZmZlckxGcmVhZElkeCwKKyAgICAgICAgICAgICAgICBwSHlicmlkUmVhbCtoeWJPZmZzZXQsCisgICAgICAgICAgICAgICAgcEh5YnJpZEltYWcraHliT2Zmc2V0LAorICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5rSHlicmlkW2tdKTsKKworICAgICAgICBoeWJPZmZzZXQgKz0gaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPm5IeWJCYW5kc1trXTsKKyAgICB9CisKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zID0gcmVhZEluZGV4OyAvKiBJbmRleCB3aGVyZSB0byB3cml0ZSBuZXh0IGlucHV0IHNhbXBsZS4gKi8KKworICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBuclFtZkJhbmRzTEYpIHsKKyAgICAvKgorICAgICAqIEhGIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5oZk1vZGUhPTApIHsKKyAgICAgICAgLyogSEYgZGVsYXkgY29tcGVuc2F0aW9uIHdhcyBhcHBsaWVkIG91dHNpZGUuICovCisgICAgICAgIEZES21lbWNweShwSHlicmlkUmVhbCtoeWJPZmZzZXQsICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShwSHlicmlkSW1hZytoeWJPZmZzZXQsICZwUW1mSW1hZ1tuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEhGIGRlbGF5IGNvbXBlbnNhdGlvbiwgZmlsdGVybGVuZ3RoLzIuICovCisgICAgRkRLbWVtY3B5KHBIeWJyaWRSZWFsK2h5Yk9mZnNldCwgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkocEh5YnJpZEltYWcraHliT2Zmc2V0LCBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1toQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICBGREttZW1jcHkoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY3B5KGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICBpZiAoKytoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zPj1oQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+ZmlsdGVyRGVsYXkpIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3MgPSAwOworICAgIH0KKyAgICB9IC8qIHByb2Nlc3MgSEYgcGFydCovCisKKyAgICByZXR1cm4gZXJyOworfQorCitJTlQgRkRLaHlicmlkQW5hbHlzaXNDbG9zZSgKKyAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIKKyAgICAgICAgKQoreworICBJTlQgZXJyID0gMDsKKworICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyICE9IE5VTEwpIHsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeSAgICA9IE5VTEw7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5wSEZtZW1vcnkgICAgPSBOVUxMOworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gMDsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSA9IDA7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitJTlQgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgKKyAgICAgICAgSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiAgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFICAgICAgbW9kZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgcW1mQmFuZHMsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGNwbHhCYW5kcworICAgICAgICApCit7CisgICAgSU5UIGVyciA9IDA7CisgICAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOworCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICBjYXNlIFRIUkVFX1RPX1RFTjogICAgIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEwOyBicmVhazsKKyAgICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOiAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTI7IGJyZWFrOworICAgICAgY2FzZSBUSFJFRV9UT19TSVhURUVOOiBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xNjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIGVyciA9IC0xOyBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwICAgICAgPSBzZXR1cDsKKyAgICBoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzICAgICA9IHFtZkJhbmRzOworICAgIGhTeW50aGVzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcyAgID0gY3BseEJhbmRzOworCitiYWlsOgorICAgIHJldHVybiBlcnI7Cit9CisKKworSU5UIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAorICAgICAgICBIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSICBoU3ludGhlc2lzSHliRmlsdGVyLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwSHlicmlkUmVhbCwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZEltYWcsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBRbWZSZWFsLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwUW1mSW1hZworICAgICAgICApCit7CisgICAgaW50IGssIG4sIGh5Yk9mZnNldD0wOworICAgIElOVCBlcnIgPSAwOworICAgIGNvbnN0IElOVCBuclFtZkJhbmRzTEYgPSBoU3ludGhlc2lzSHliRmlsdGVyLT5wU2V0dXAtPm5yUW1mQmFuZHM7CisKKyAgICAvKgorICAgICAqIExGIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBmb3IgKGs9MDsgazxuclFtZkJhbmRzTEY7IGsrKykgeworICAgICAgY29uc3QgaW50IG5IeWJCYW5kcyA9IGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bkh5YkJhbmRzW2tdOworCisgICAgICBGSVhQX0RCTCBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBGSVhQX0RCTCBhY2N1MiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgICAgIC8qIFBlcmZvcm0gaHlicmlkIGZpbHRlcmluZy4gKi8KKyAgICAgIGZvciAobj0wOyBuPG5IeWJCYW5kczsgbisrKSB7CisgICAgICAgICAgYWNjdTEgKz0gcEh5YnJpZFJlYWxbaHliT2Zmc2V0K25dOworICAgICAgICAgIGFjY3UyICs9IHBIeWJyaWRJbWFnW2h5Yk9mZnNldCtuXTsKKyAgICAgIH0KKyAgICAgIHBRbWZSZWFsW2tdID0gYWNjdTE7CisgICAgICBwUW1mSW1hZ1trXSA9IGFjY3UyOworCisgICAgICBoeWJPZmZzZXQgKz0gbkh5YkJhbmRzOworICAgIH0KKworICAgIGlmIChoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzID4gbnJRbWZCYW5kc0xGKSB7CisgICAgICAvKgorICAgICAgICogSEYgYnVmZmVyLgorICAgICAgICovCisgICAgRkRLbWVtY3B5KCZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAmcEh5YnJpZFJlYWxbaHliT2Zmc2V0XSwgKGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkoJnBRbWZJbWFnW25yUW1mQmFuZHNMRl0sICZwSHlicmlkSW1hZ1toeWJPZmZzZXRdLCAoaFN5bnRoZXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZHVhbENoYW5uZWxGaWx0ZXJpbmcoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKKyAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW52ZXJ0CisgICAgICAgICkKK3sKKyAgICBjb25zdCBGSVhQX0hUQiAqcCA9IEh5YkZpbHRlckNvZWYyOworCisgICAgRklYUF9EQkwgIHIxLCByNjsKKyAgICBGSVhQX0RCTCAgaTEsIGk2OworCisgICAgLyogc3ltbWV0cmljIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICByMSAgPSBmTXVsdERpdjIocFsxXSwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dKSArIGZNdWx0RGl2MihwWzFdLCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dKSA7CisgICAgaTEgID0gZk11bHREaXYyKHBbMV0sIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSkgKyBmTXVsdERpdjIocFsxXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkgOworICAgIHIxICs9IGZNdWx0RGl2MihwWzNdLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pICsgZk11bHREaXYyKHBbM10sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pIDsKKyAgICBpMSArPSBmTXVsdERpdjIocFszXSwgcFFtZkltYWdbcFJlYWRJZHhbM11dKSArIGZNdWx0RGl2MihwWzNdLCBwUW1mSW1hZ1twUmVhZElkeFsgOV1dKSA7CisgICAgcjEgKz0gZk11bHREaXYyKHBbNV0sIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSkgKyBmTXVsdERpdjIocFs1XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDddXSkgOworICAgIGkxICs9IGZNdWx0RGl2MihwWzVdLCBwUW1mSW1hZ1twUmVhZElkeFs1XV0pICsgZk11bHREaXYyKHBbNV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pIDsKKyAgICByNiAgPSBmTXVsdERpdjIocFs2XSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKSA7CisgICAgaTYgID0gZk11bHREaXYyKHBbNl0sIHBRbWZJbWFnW3BSZWFkSWR4WzZdXSkgOworCisgICAgaWYgKGludmVydCkgeworICAgICAgbUh5YnJpZFJlYWxbMV0gPSAocjEgKyByNikgPDwgMTsKKyAgICAgIG1IeWJyaWRJbWFnWzFdID0gKGkxICsgaTYpIDw8IDE7CisKKyAgICAgIG1IeWJyaWRSZWFsWzBdID0gKHI2IC0gcjEpIDw8IDE7CisgICAgICBtSHlicmlkSW1hZ1swXSA9IChpNiAtIGkxKSA8PCAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1IeWJyaWRSZWFsWzBdID0gKHIxICsgcjYpIDw8IDE7CisgICAgICBtSHlicmlkSW1hZ1swXSA9IChpMSArIGk2KSA8PCAxOworCisgICAgICBtSHlicmlkUmVhbFsxXSA9IChyNiAtIHIxKSA8PCAxOworICAgICAgbUh5YnJpZEltYWdbMV0gPSAoaTYgLSBpMSkgPDwgMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZvdXJDaGFubmVsRmlsdGVyaW5nKAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKKyAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCisgICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKKyAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZEltYWcsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGludmVydAorICAgICAgICApCit7CisgICAgY29uc3QgRklYUF9IVEIgKnAgPSBIeWJGaWx0ZXJDb2VmNDsKKworICAgIEZJWFBfREJMIGZmdFs4XTsKKworICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCAgY3JbMTNdID0geworICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAxLmYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZikKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCAgY2lbMTNdID0geworICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZikKKyAgICB9OworCisKKyAgICAvKiBGSVIgZmlsdGVyLiAqLworICAgIC8qIHByZSB0d2lkZGVsaW5nIHdpdGggcHJlLXR3aWRkbGluZyBjb2VmZmljaWVudHMgY1tuXSAgKi8KKyAgICAvKiBtdWx0aXBsaWNhdGlvbiB3aXRoIGZpbHRlciBjb2VmZmljaWVudHMgcFtuXSAgICAgICAgICovCisgICAgLyogaGludDogKGEgKyBpYikqKGMgKyBpZCkgPSAoYSpjIC0gYipkKSArIGkoYSpkICsgYipjKSAqLworICAgIC8qIHdyaXRlIHRvIGZmdCBjb2VmZmljaWVudCBuJyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmZnRbRkZUX0lEWF9SKDApXSA9ICAoIGZNdWx0KHBbMTBdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgMl0sIHBRbWZSZWFsW3BSZWFkSWR4WyAyXV0pLCBjaVsgMl0sIHBRbWZJbWFnW3BSZWFkSWR4WyAyXV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNl0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA2XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDZdXSksIGNpWyA2XSwgcFFtZkltYWdbcFJlYWRJZHhbIDZdXSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAyXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbMTBdLCBwUW1mUmVhbFtwUmVhZElkeFsxMF1dKSwgY2lbMTBdLCBwUW1mSW1hZ1twUmVhZElkeFsxMF1dKSkpICk7CisgICAgZmZ0W0ZGVF9JRFhfSSgwKV0gPSAgKCBmTXVsdChwWzEwXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDJdLCBwUW1mUmVhbFtwUmVhZElkeFsgMl1dKSwgY3JbIDJdLCBwUW1mSW1hZ1twUmVhZElkeFsgMl1dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDZdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgNl0sIHBRbWZSZWFsW3BSZWFkSWR4WyA2XV0pLCBjclsgNl0sIHBRbWZJbWFnW3BSZWFkSWR4WyA2XV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMl0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWzEwXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTBdXSksIGNyWzEwXSwgcFFtZkltYWdbcFJlYWRJZHhbMTBdXSkpKSApOworCisgICAgLyogdHdpZGRsZSBkZWUgZHVtICovCisgICAgZmZ0W0ZGVF9JRFhfUigxKV0gPSAgKCBmTXVsdChwWyA5XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDNdLCBwUW1mUmVhbFtwUmVhZElkeFsgM11dKSwgY2lbIDNdLCBwUW1mSW1hZ1twUmVhZElkeFsgM11dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDVdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgN10sIHBRbWZSZWFsW3BSZWFkSWR4WyA3XV0pLCBjaVsgN10sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMV0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNpWzExXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSApOworICAgIGZmdFtGRlRfSURYX0koMSldID0gICggZk11bHQocFsgOV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAzXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDNdXSksIGNyWyAzXSwgcFFtZkltYWdbcFJlYWRJZHhbIDNdXSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA1XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDddLCBwUW1mUmVhbFtwUmVhZElkeFsgN11dKSwgY3JbIDddLCBwUW1mSW1hZ1twUmVhZElkeFsgN11dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDFdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pLCBjclsxMV0sIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0pKSkgKTsKKworICAgIC8qIHR3aWRkbGUgZGVlIGRlZSAqLworICAgIGZmdFtGRlRfSURYX1IoMildID0gICggZk11bHQocFsxMl0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyAwXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDBdXSksIGNpWyAwXSwgcFFtZkltYWdbcFJlYWRJZHhbIDBdXSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA4XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDRdLCBwUW1mUmVhbFtwUmVhZElkeFsgNF1dKSwgY2lbIDRdLCBwUW1mSW1hZ1twUmVhZElkeFsgNF1dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDRdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgOF0sIHBRbWZSZWFsW3BSZWFkSWR4WyA4XV0pLCBjaVsgOF0sIHBRbWZJbWFnW3BSZWFkSWR4WyA4XV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMF0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWzEyXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTJdXSksIGNpWzEyXSwgcFFtZkltYWdbcFJlYWRJZHhbMTJdXSkpKSApOworICAgIGZmdFtGRlRfSURYX0koMildID0gICggZk11bHQocFsxMl0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAwXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDBdXSksIGNyWyAwXSwgcFFtZkltYWdbcFJlYWRJZHhbIDBdXSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA4XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDRdLCBwUW1mUmVhbFtwUmVhZElkeFsgNF1dKSwgY3JbIDRdLCBwUW1mSW1hZ1twUmVhZElkeFsgNF1dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDRdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgOF0sIHBRbWZSZWFsW3BSZWFkSWR4WyA4XV0pLCBjclsgOF0sIHBRbWZJbWFnW3BSZWFkSWR4WyA4XV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMF0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWzEyXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTJdXSksIGNyWzEyXSwgcFFtZkltYWdbcFJlYWRJZHhbMTJdXSkpKSApOworCisgICAgZmZ0W0ZGVF9JRFhfUigzKV0gPSAgKCBmTXVsdChwWzExXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDFdLCBwUW1mUmVhbFtwUmVhZElkeFsgMV1dKSwgY2lbIDFdLCBwUW1mSW1hZ1twUmVhZElkeFsgMV1dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDddLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgNV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA1XV0pLCBjaVsgNV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA1XV0pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgM10sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA5XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDldXSksIGNpWyA5XSwgcFFtZkltYWdbcFJlYWRJZHhbIDldXSkpKSApOworICAgIGZmdFtGRlRfSURYX0koMyldID0gICggZk11bHQocFsxMV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAxXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDFdXSksIGNyWyAxXSwgcFFtZkltYWdbcFJlYWRJZHhbIDFdXSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA3XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDVdLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dKSwgY3JbIDVdLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDNdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgOV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pLCBjclsgOV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pKSkgKTsKKworICAgIC8qIGZmdCBtb2R1bGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogaGVyZTogZmFzdCBtYW51YWwgZmZ0IG1vZHVsYXRpb24gZm9yIGEgZmZ0IG9mIGxlbmd0aCBNPTQgICAgICAgICAgKi8KKyAgICAvKiBmZnRfNHt4W25dfSA9IHhbMF0qZXhwKC1pKjIqcGkvNCptKjApICsgeFsxXSpleHAoLWkqMipwaS80Km0qMSkgKworICAgIHhbMl0qZXhwKC1pKjIqcGkvNCptKjIpICsgeFszXSpleHAoLWkqMipwaS80Km0qMykgICAqLworCisgICAgLyoKKyAgICBmZnQgYmluIG09MDoKKyAgICBYWzAsIG5dID0geFswXSArICAgeFsxXSArIHhbMl0gKyAgIHhbM10KKyAgICAqLworICAgIG1IeWJyaWRSZWFsWzBdID0gZmZ0W0ZGVF9JRFhfUigwKV0gKyBmZnRbRkZUX0lEWF9SKDEpXSArIGZmdFtGRlRfSURYX1IoMildICsgZmZ0W0ZGVF9JRFhfUigzKV07CisgICAgbUh5YnJpZEltYWdbMF0gPSBmZnRbRkZUX0lEWF9JKDApXSArIGZmdFtGRlRfSURYX0koMSldICsgZmZ0W0ZGVF9JRFhfSSgyKV0gKyBmZnRbRkZUX0lEWF9JKDMpXTsKKworICAgIC8qCisgICAgZmZ0IGJpbiBtPTE6CisgICAgWFsxLCBuXSA9IHhbMF0gLSBpKnhbMV0gLSB4WzJdICsgaSp4WzNdCisgICAgKi8KKyAgICBtSHlicmlkUmVhbFsxXSA9IGZmdFtGRlRfSURYX1IoMCldICsgZmZ0W0ZGVF9JRFhfSSgxKV0gLSBmZnRbRkZUX0lEWF9SKDIpXSAtIGZmdFtGRlRfSURYX0koMyldOworICAgIG1IeWJyaWRJbWFnWzFdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gLSBmZnRbRkZUX0lEWF9SKDEpXSAtIGZmdFtGRlRfSURYX0koMildICsgZmZ0W0ZGVF9JRFhfUigzKV07CisKKyAgICAvKgorICAgIGZmdCBiaW4gbT0yOgorICAgIFhbMiwgbl0gPSB4WzBdIC0gICB4WzFdICsgeFsyXSAtICAgeFszXQorICAgICovCisgICAgbUh5YnJpZFJlYWxbMl0gPSBmZnRbRkZUX0lEWF9SKDApXSAtIGZmdFtGRlRfSURYX1IoMSldICsgZmZ0W0ZGVF9JRFhfUigyKV0gLSBmZnRbRkZUX0lEWF9SKDMpXTsKKyAgICBtSHlicmlkSW1hZ1syXSA9IGZmdFtGRlRfSURYX0koMCldIC0gZmZ0W0ZGVF9JRFhfSSgxKV0gKyBmZnRbRkZUX0lEWF9JKDIpXSAtIGZmdFtGRlRfSURYX0koMyldOworCisgICAgLyoKKyAgICBmZnQgYmluIG09MzoKKyAgICBYWzMsIG5dID0geFswXSArIGoqeFsxXSAtIHhbMl0gLSBqKnhbM10KKyAgICAqLworICAgIG1IeWJyaWRSZWFsWzNdID0gZmZ0W0ZGVF9JRFhfUigwKV0gLSBmZnRbRkZUX0lEWF9JKDEpXSAtIGZmdFtGRlRfSURYX1IoMildICsgZmZ0W0ZGVF9JRFhfSSgzKV07CisgICAgbUh5YnJpZEltYWdbM10gPSBmZnRbRkZUX0lEWF9JKDApXSArIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gLSBmZnRbRkZUX0lEWF9SKDMpXTsKK30KKworCitzdGF0aWMgdm9pZCBlaWdodENoYW5uZWxGaWx0ZXJpbmcoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKKyAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW52ZXJ0CisgICAgICAgICkKK3sKKyAgICBjb25zdCBGSVhQX0hUUCAqcCA9IEh5YkZpbHRlckNvZWY4OworICAgIElOVCBrLCBzYzsKKworICAgIEZJWFBfREJMIG1mZnRbMTYrQUxJR05NRU5UX0RFRkFVTFRdOworICAgIEZJWFBfREJMICpwZmZ0ID0gKEZJWFBfREJMKilBTElHTl9QVFIobWZmdCk7CisKKyAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKKworICAgIC8qIHByZSB0d2lkZGVsaW5nICovCisgICAgcGZmdFtGRlRfSURYX1IoMCldID0gZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKTsKKyAgICBwZmZ0W0ZGVF9JRFhfSSgwKV0gPSBmTXVsdERpdjIocFswXS52LnJlLCBwUW1mSW1hZ1twUmVhZElkeFs2XV0pOworCisgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFs3XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzddXSwgcFsxXSk7CisgICAgcGZmdFtGRlRfSURYX1IoMSldID0gYWNjdTE7CisgICAgcGZmdFtGRlRfSURYX0koMSldID0gYWNjdTI7CisKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzBdXSwgcFFtZkltYWdbcFJlYWRJZHhbMF1dLCBwWzJdKTsKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzhdXSwgcFFtZkltYWdbcFJlYWRJZHhbOF1dLCBwWzNdKTsKKyAgICBwZmZ0W0ZGVF9JRFhfUigyKV0gPSBhY2N1MSArIGFjY3UzOworICAgIHBmZnRbRkZUX0lEWF9JKDIpXSA9IGFjY3UyICsgYWNjdTQ7CisKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzFdXSwgcFFtZkltYWdbcFJlYWRJZHhbMV1dLCBwWzRdKTsKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzldXSwgcFFtZkltYWdbcFJlYWRJZHhbOV1dLCBwWzVdKTsKKyAgICBwZmZ0W0ZGVF9JRFhfUigzKV0gPSBhY2N1MSArIGFjY3UzOworICAgIHBmZnRbRkZUX0lEWF9JKDMpXSA9IGFjY3UyICsgYWNjdTQ7CisKKyAgICBwZmZ0W0ZGVF9JRFhfUig0KV0gPSBmTXVsdERpdjIocFFtZkltYWdbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKSAtIGZNdWx0RGl2MihwUW1mSW1hZ1twUmVhZElkeFsgMl1dLCBwWzZdLnYuaW0pOworICAgIHBmZnRbRkZUX0lEWF9JKDQpXSA9IGZNdWx0RGl2MihwUW1mUmVhbFtwUmVhZElkeFsgMl1dLCBwWzZdLnYuaW0pIC0gZk11bHREaXYyKHBRbWZSZWFsW3BSZWFkSWR4WzEwXV0sIHBbN10udi5pbSk7CisKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WyAzXV0sIHBRbWZJbWFnW3BSZWFkSWR4WyAzXV0sIHBbOF0pOworICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSwgcFs5XSk7CisgICAgcGZmdFtGRlRfSURYX1IoNSldID0gYWNjdTEgKyBhY2N1MzsKKyAgICBwZmZ0W0ZGVF9JRFhfSSg1KV0gPSBhY2N1MiArIGFjY3U0OworCisgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsgNF1dLCBwUW1mSW1hZ1twUmVhZElkeFsgNF1dLCBwWzEwXSk7CisgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dLCBwWzExXSk7CisgICAgcGZmdFtGRlRfSURYX1IoNildID0gYWNjdTEgKyBhY2N1MzsKKyAgICBwZmZ0W0ZGVF9JRFhfSSg2KV0gPSBhY2N1MiArIGFjY3U0OworCisgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dLCBwWzEyXSk7CisgICAgcGZmdFtGRlRfSURYX1IoNyldID0gYWNjdTE7CisgICAgcGZmdFtGRlRfSURYX0koNyldID0gYWNjdTI7CisKKyAgICAvKiBmZnQgbW9kdWxhdGlvbiAqLworICAgIGZmdF84IChwZmZ0KTsKKyAgICBzYyA9IDEgKyAyOworCisgICAgaWYgKGludmVydCkgeworICAgICAgbUh5YnJpZFJlYWxbMF0gID0gcGZmdFtGRlRfSURYX1IoNyldIDw8IHNjOworICAgICAgbUh5YnJpZEltYWdbMF0gID0gcGZmdFtGRlRfSURYX0koNyldIDw8IHNjOworICAgICAgbUh5YnJpZFJlYWxbMV0gID0gcGZmdFtGRlRfSURYX1IoMCldIDw8IHNjOworICAgICAgbUh5YnJpZEltYWdbMV0gID0gcGZmdFtGRlRfSURYX0koMCldIDw8IHNjOworCisgICAgICBtSHlicmlkUmVhbFsyXSAgPSBwZmZ0W0ZGVF9JRFhfUig2KV0gPDwgc2M7CisgICAgICBtSHlicmlkSW1hZ1syXSAgPSBwZmZ0W0ZGVF9JRFhfSSg2KV0gPDwgc2M7CisgICAgICBtSHlicmlkUmVhbFszXSAgPSBwZmZ0W0ZGVF9JRFhfUigxKV0gPDwgc2M7CisgICAgICBtSHlicmlkSW1hZ1szXSAgPSBwZmZ0W0ZGVF9JRFhfSSgxKV0gPDwgc2M7CisKKyAgICAgIG1IeWJyaWRSZWFsWzRdICA9IHBmZnRbRkZUX0lEWF9SKDIpXSA8PCBzYzsKKyAgICAgIG1IeWJyaWRSZWFsWzRdICs9IHBmZnRbRkZUX0lEWF9SKDUpXSA8PCBzYzsKKyAgICAgIG1IeWJyaWRJbWFnWzRdICA9IHBmZnRbRkZUX0lEWF9JKDIpXSA8PCBzYzsKKyAgICAgIG1IeWJyaWRJbWFnWzRdICs9IHBmZnRbRkZUX0lEWF9JKDUpXSA8PCBzYzsKKworICAgICAgbUh5YnJpZFJlYWxbNV0gID0gcGZmdFtGRlRfSURYX1IoMyldIDw8IHNjOworICAgICAgbUh5YnJpZFJlYWxbNV0gKz0gcGZmdFtGRlRfSURYX1IoNCldIDw8IHNjOworICAgICAgbUh5YnJpZEltYWdbNV0gID0gcGZmdFtGRlRfSURYX0koMyldIDw8IHNjOworICAgICAgbUh5YnJpZEltYWdbNV0gKz0gcGZmdFtGRlRfSURYX0koNCldIDw8IHNjOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvcihrPTA7IGs8ODtrKysgKSB7CisgICAgICAgIG1IeWJyaWRSZWFsW2tdID0gcGZmdFtGRlRfSURYX1IoayldIDw8IHNjOworICAgICAgICBtSHlicmlkSW1hZ1trXSA9IHBmZnRbRkZUX0lEWF9JKGspXSA8PCBzYzsKKyAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBJTlQga0NoYW5uZWxGaWx0ZXJpbmcoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKKyAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCisgICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAorICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKKyAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgICAgICAgaHlicmlkQ29uZmlnCisgICAgICAgICkKK3sKKyAgICBJTlQgZXJyID0gMDsKKworICAgIHN3aXRjaCAoaHlicmlkQ29uZmlnKSB7CisgICAgICBjYXNlICAyOgorICAgICAgY2FzZSAtMjoKKyAgICAgICAgZHVhbENoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnPDApID8gMSA6IDAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICA0OgorICAgICAgY2FzZSAtNDoKKyAgICAgICAgZm91ckNoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnPDApID8gMSA6IDAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICA4OgorICAgICAgY2FzZSAtODoKKyAgICAgICAgZWlnaHRDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLCBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZzwwKSA/IDEgOiAwICk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwIGIvYWFjL2xpYkZESy9zcmMvRkRLX3Rvb2xzX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNTE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwCkBAIC0wLDAgKzEsMjQ0MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9saXZlciBNb3NlcgorICAgRGVzY3JpcHRpb246IFJPTSB0YWJsZXMgdXNlZCBieSBGREsgdG9vbHMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCisKKworCisKKworCisKKworCisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU0ODBbXSA9Cit7CisgIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmZmZDMxNSwgMHgwMDZiM2I5YiksIFNUQ1AoMHg3ZmZmNGM1NCwgMHgwMGQ2NzZlYiksIFNUQ1AoMHg3ZmZlNmJiZiwgMHgwMTQxYjFhNSksCisgIFNUQ1AoMHg3ZmZkMzE1NCwgMHgwMWFjZWI3YyksIFNUQ1AoMHg3ZmZiOWQxNSwgMHgwMjE4MjQyNyksIFNUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksIFNUQ1AoMHg3ZmY3NjcyMSwgMHgwMmVlOTBjOCksCisgIFNUQ1AoMHg3ZmY0YzU2ZiwgMHgwMzU5YzQyOCksIFNUQ1AoMHg3ZmYxYzllZiwgMHgwM2M0ZjUyZiksIFNUQ1AoMHg3ZmVlNzRhMiwgMHgwNDMwMjM4ZiksIFNUQ1AoMHg3ZmVhYzU4ZCwgMHgwNDliNGYwMCksCisgIFNUQ1AoMHg3ZmU2YmNiMCwgMHgwNTA2NzczNCksIFNUQ1AoMHg3ZmUyNWEwZiwgMHgwNTcxOWJlMiksIFNUQ1AoMHg3ZmRkOWRhZCwgMHgwNWRjYmNiZSksIFNUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksCisgIFNUQ1AoMHg3ZmQzMTdiNCwgMHgwNmIyZjFkMiksIFNUQ1AoMHg3ZmNkNGUyNCwgMHgwNzFlMDU3NSksIFNUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksIFNUQ1AoMHg3ZmMwYWRmMiwgMHgwN2Y0MWQ3MiksCisgIFNUQ1AoMHg3ZmI5ZDc1OSwgMHgwODVmMjEzNyksIFNUQ1AoMHg3ZmIyYTcxYiwgMHgwOGNhMWYxYiksIFNUQ1AoMHg3ZmFiMWQzZCwgMHgwOTM1MTZkNCksIFNUQ1AoMHg3ZmEzMzljNSwgMHgwOWEwMDgxNyksCisgIFNUQ1AoMHg3ZjlhZmNiOSwgMHgwYTBhZjI5OSksIFNUQ1AoMHg3ZjkyNjYxZCwgMHgwYTc1ZDYwZSksIFNUQ1AoMHg3Zjg5NzVmOSwgMHgwYWUwYjIyYyksIFNUQ1AoMHg3ZjgwMmM1MiwgMHgwYjRiODZhOCksCisgIFNUQ1AoMHg3Zjc2ODkyZiwgMHgwYmI2NTMzNiksIFNUQ1AoMHg3ZjZjOGM5NiwgMHgwYzIxMTc4YyksIFNUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFNUQ1AoMHg3ZjU3ODcyMSwgMHgwY2Y2ODY2MiksCisgIFNUQ1AoMHg3ZjRjN2U1NCwgMHgwZDYxMzA0ZSksIFNUQ1AoMHg3ZjQxMWMyZiwgMHgwZGNiZDBkNSksIFNUQ1AoMHg3ZjM1NjBiOSwgMHgwZTM2NjdhZCksIFNUQ1AoMHg3ZjI5NGJmZCwgMHgwZWEwZjQ4YyksCisgIFNUQ1AoMHg3ZjFjZGUwMSwgMHgwZjBiNzcyNyksIFNUQ1AoMHg3ZjEwMTZjZSwgMHgwZjc1ZWYzMyksIFNUQ1AoMHg3ZjAyZjY2ZiwgMHgwZmUwNWM2NCksIFNUQ1AoMHg3ZWY1N2NlYSwgMHgxMDRhYmU3MSksCisgIFNUQ1AoMHg3ZWU3YWE0YywgMHgxMGI1MTUwZiksIFNUQ1AoMHg3ZWQ5N2U5YywgMHgxMTFmNWZmNCksIFNUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksIFNUQ1AoMHg3ZWJjMWMzMSwgMHgxMWYzZDE2NCksCisgIFNUQ1AoMHg3ZWFjZTU4YSwgMHgxMjVkZjc1YiksIFNUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFNUQ1AoMHg3ZThkNmQ5MSwgMHgxMzMyMWM1MyksIFNUQ1AoMHg3ZTdkMmM1NCwgMHgxMzljMWFiZiksCisgIFNUQ1AoMHg3ZTZjOTI1MSwgMHgxNDA2MGI2OCksIFNUQ1AoMHg3ZTViOWY5MywgMHgxNDZmZWUwMyksIFNUQ1AoMHg3ZTRhNTQyNiwgMHgxNGQ5YzI0NSksIFNUQ1AoMHg3ZTM4YjAxNywgMHgxNTQzODdlNiksCisgIFNUQ1AoMHg3ZTI2YjM3MSwgMHgxNWFkM2U5YSksIFNUQ1AoMHg3ZTE0NWU0MiwgMHgxNjE2ZTYxOCksIFNUQ1AoMHg3ZTAxYjA5NiwgMHgxNjgwN2UxNSksIFNUQ1AoMHg3ZGVlYWE3YSwgMHgxNmVhMDY0NiksCisgIFNUQ1AoMHg3ZGRiNGJmYywgMHgxNzUzN2U2MyksIFNUQ1AoMHg3ZGM3OTUyOSwgMHgxN2JjZTYyMSksIFNUQ1AoMHg3ZGIzODYwZiwgMHgxODI2M2QzNiksIFNUQ1AoMHg3ZDlmMWViZCwgMHgxODhmODM1NyksCisgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDc1NDdhNywgMHgxOTYxZGI5YiksIFNUQ1AoMHg3ZDVmZDgwMSwgMHgxOWNhZWQyOSksIFNUQ1AoMHg3ZDRhMTA1ZCwgMHgxYTMzZWM5YyksCisgIFNUQ1AoMHg3ZDMzZjBjYSwgMHgxYTljZDlhYyksIFNUQ1AoMHg3ZDFkNzk1OCwgMHgxYjA1YjQwZiksIFNUQ1AoMHg3ZDA2YWExNiwgMHgxYjZlN2I3YSksIFNUQ1AoMHg3Y2VmODMxNSwgMHgxYmQ3MmZhNCksCisgIFNUQ1AoMHg3Y2Q4MDQ2NCwgMHgxYzNmZDA0NSksIFNUQ1AoMHg3Y2MwMmUxNSwgMHgxY2E4NWQxMiksIFNUQ1AoMHg3Y2E4MDAzOCwgMHgxZDEwZDVjMiksIFNUQ1AoMHg3YzhmN2FkZSwgMHgxZDc5M2EwYiksCisgIFNUQ1AoMHg3Yzc2OWUxOCwgMHgxZGUxODlhNiksIFNUQ1AoMHg3YzVkNjlmNywgMHgxZTQ5YzQ0NyksIFNUQ1AoMHg3YzQzZGU4ZSwgMHgxZWIxZTlhNyksIFNUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksCisgIFNUQ1AoMHg3YzBmYzIyYSwgMHgxZjgxZjM3YyksIFNUQ1AoMHg3YmY1MzE1MywgMHgxZmU5ZDc1ZiksIFNUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksIFNUQ1AoMHg3YmJmMGFiYSwgMHgyMGI5NWJhYyksCisgIFNUQ1AoMHg3YmEzNzUxZCwgMHgyMTIwZmI4MyksIFNUQ1AoMHg3Yjg3ODhiYSwgMHgyMTg4ODQxYSksIFNUQ1AoMHg3YjZiNDVhNSwgMHgyMWVmZjUyOCksIFNUQ1AoMHg3YjRlYWJmMSwgMHgyMjU3NGU2NSksCisgIFNUQ1AoMHg3YjMxYmJiMiwgMHgyMmJlOGY4NyksIFNUQ1AoMHg3YjE0NzRmZCwgMHgyMzI1Yjg0NyksIFNUQ1AoMHg3YWY2ZDdlNiwgMHgyMzhjYzg1ZCksIFNUQ1AoMHg3YWQ4ZTQ4MiwgMHgyM2YzYmY3ZSksCisgIFNUQ1AoMHg3YWJhOWFlNiwgMHgyNDVhOWQ2NSksIFNUQ1AoMHg3YTliZmIyNywgMHgyNGMxNjFjNyksIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFNUQ1AoMHg3YTVkYjk5NywgMHgyNThlOWNlMCksCisgIFNUQ1AoMHg3YTNlMTdmMiwgMHgyNWY1MTMwNyksIFNUQ1AoMHg3YTFlMjA4MiwgMHgyNjViNmU4YSksIFNUQ1AoMHg3OWZkZDM1YywgMHgyNmMxYWYyMiksIFNUQ1AoMHg3OWRkMzA5OCwgMHgyNzI3ZDQ4NiksCisgIFNUQ1AoMHg3OWJjMzg0ZCwgMHgyNzhkZGU2ZSksIFNUQ1AoMHg3OTlhZWE5MiwgMHgyN2YzY2M5NCksIFNUQ1AoMHg3OTc5NDc3ZCwgMHgyODU5OWViMCksIFNUQ1AoMHg3OTU3NGYyOCwgMHgyOGJmNTQ3YiksCisgIFNUQ1AoMHg3OTM1MDFhOSwgMHgyOTI0ZWRhYyksIFNUQ1AoMHg3OTEyNWYxOSwgMHgyOThhNjlmYyksIFNUQ1AoMHg3OGVmNjc4ZiwgMHgyOWVmYzkyNSksIFNUQ1AoMHg3OGNjMWIyNiwgMHgyYTU1MGFkZiksCisgIFNUQ1AoMHg3OGE4NzlmNCwgMHgyYWJhMmVlNCksIFNUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFNUQ1AoMHg3ODYwMzk5ZSwgMHgyYjg0MWNhZiksIFNUQ1AoMHg3ODNiOWFhZCwgMHgyYmU4ZTVlOCksCisgIFNUQ1AoMHg3ODE2YTc1OSwgMHgyYzRkOTA1MCksIFNUQ1AoMHg3N2YxNWZiYywgMHgyY2IyMWJhMCksIFNUQ1AoMHg3N2NiYzNmMiwgMHgyZDE2ODc5MiksIFNUQ1AoMHg3N2E1ZDQxMywgMHgyZDdhZDNkZSksCisgIFNUQ1AoMHg3NzdmOTAzYywgMHgyZGRmMDA0MCksIFNUQ1AoMHg3NzU4Zjg4NiwgMHgyZTQzMGM2ZiksIFNUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksIFNUQ1AoMHg3NzBhY2RlYywgMHgyZjBhYzMyMCksCisgIFNUQ1AoMHg3NmUzM2IzZiwgMHgyZjZlNmQxNiksIFNUQ1AoMHg3NmJiNTUyMSwgMHgyZmQxZjVjMSksIFNUQ1AoMHg3NjkzMWJhZSwgMHgzMDM1NWNkZCksIFNUQ1AoMHg3NjZhOGYwNCwgMHgzMDk4YTIyMyksCisgIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NjE4N2M3NywgMHgzMTVlYzYxNyksIFNUQ1AoMHg3NWVlZjZjZSwgMHgzMWMxYTQzYiksIFNUQ1AoMHg3NWM1MWU2MSwgMHgzMjI0NWY3MiksCisgIFNUQ1AoMHg3NTlhZjM0YywgMHgzMjg2Zjc3OSksIFNUQ1AoMHg3NTcwNzVhYywgMHgzMmU5NmMwOSksIFNUQ1AoMHg3NTQ1YTVhMCwgMHgzMzRiYmNkZSksIFNUQ1AoMHg3NTFhODM0NiwgMHgzM2FkZTliMyksCisgIFNUQ1AoMHg3NGVmMGViYywgMHgzNDBmZjI0MiksIFNUQ1AoMHg3NGMzNDgyMCwgMHgzNDcxZDY0NyksIFNUQ1AoMHg3NDk3MmY5MiwgMHgzNGQzOTU3ZSksIFNUQ1AoMHg3NDZhYzUyZiwgMHgzNTM1MmZhMSksCisgIFNUQ1AoMHg3NDNlMDkxOCwgMHgzNTk2YTQ2YyksIFNUQ1AoMHg3NDEwZmI2YiwgMHgzNWY3ZjM5YyksIFNUQ1AoMHg3M2UzOWM0OSwgMHgzNjU5MWNlYSksIFNUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksCisgIFNUQ1AoMHg3Mzg3ZWEyMywgMHgzNzFhZmNkNSksIFNUQ1AoMHg3MzU5OTc2MCwgMHgzNzdiYjJlOSksIFNUQ1AoMHg3MzJhZjNhNywgMHgzN2RjNDIwYyksIFNUQ1AoMHg3MmZiZmYxYiwgMHgzODNjYTlmYiksCisgIFNUQ1AoMHg3MmNjYjlkYiwgMHgzODljZWE3MiksIFNUQ1AoMHg3MjlkMjQwOSwgMHgzOGZkMDMyZCksIFNUQ1AoMHg3MjZkM2RjNiwgMHgzOTVjZjNlOSksIFNUQ1AoMHg3MjNkMDczNCwgMHgzOWJjYmM2MyksCisgIFNUQ1AoMHg3MjBjODA3NSwgMHgzYTFjNWM1NyksIFNUQ1AoMHg3MWRiYTlhYiwgMHgzYTdiZDM4MiksIFNUQ1AoMHg3MWFhODJmNywgMHgzYWRiMjFhMSksIFNUQ1AoMHg3MTc5MGM3ZSwgMHgzYjNhNDY3MiksCisgIFNUQ1AoMHg3MTQ3NDY2MCwgMHgzYjk5NDFiMSksIFNUQ1AoMHg3MTE1MzBjMiwgMHgzYmY4MTMxYyksIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGIwMTc5MCwgMHgzY2I1Mzc2YiksCisgIFNUQ1AoMHg3MDdkMTQ0MywgMHgzZDEzODljYiksIFNUQ1AoMHg3MDQ5YzIwMywgMHgzZDcxYjE0ZCksIFNUQ1AoMHg3MDE2MjBmNSwgMHgzZGNmYWRiMCksIFNUQ1AoMHg2ZmUyMzEzYywgMHgzZTJkN2ViMSksCisgIFNUQ1AoMHg2ZmFkZjJmYywgMHgzZThiMjQwZSksIFNUQ1AoMHg2Zjc5NjY1YiwgMHgzZWU4OWQ4NiksIFNUQ1AoMHg2ZjQ0OGI3ZSwgMHgzZjQ1ZWFkOCksIFNUQ1AoMHg2ZjBmNjI4OSwgMHgzZmEzMGJjMSksCisgIFNUQ1AoMHg2ZWQ5ZWJhMSwgMHg0MDAwMDAwMCksIFNUQ1AoMHg2ZWE0MjZlZCwgMHg0MDVjYzc1NCksIFNUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksIFNUQ1AoMHg2ZTM3YjRiNiwgMHg0MTE1Y2UzOCksCisgIFNUQ1AoMHg2ZTAxMDc4MCwgMHg0MTcyMGQ0NiksIFNUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksIFNUQ1AoMHg2ZDkyYzU5YiwgMHg0MjJhMDE1NCksIFNUQ1AoMHg2ZDViMzEzYiwgMHg0Mjg1YjVkNCksCisgIFNUQ1AoMHg2ZDIzNTAxYiwgMHg0MmUxM2JhNCksIFNUQ1AoMHg2Y2ViMjI2MSwgMHg0MzNjOTI4MyksIFNUQ1AoMHg2Y2IyYTgzNywgMHg0Mzk3YmEzMiksIFNUQ1AoMHg2Yzc5ZTFjMiwgMHg0M2YyYjI3MSksCisgIFNUQ1AoMHg2YzQwY2YyYywgMHg0NDRkN2FmZiksIFNUQ1AoMHg2YzA3NzA5YiwgMHg0NGE4MTM5ZSksIFNUQ1AoMHg2YmNkYzYzOSwgMHg0NTAyN2MwYyksIFNUQ1AoMHg2YjkzZDAyZSwgMHg0NTVjYjQwYyksCisgIFNUQ1AoMHg2YjU5OGVhMywgMHg0NWI2YmI1ZSksIFNUQ1AoMHg2YjFmMDFjMCwgMHg0NjEwOTFjMiksIFNUQ1AoMHg2YWU0MjlhZSwgMHg0NjZhMzZmOSksIFNUQ1AoMHg2YWE5MDY5NywgMHg0NmMzYWFjNSksCisgIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2YTMxZTAwMCwgMHg0Nzc1ZmQxZiksIFNUQ1AoMHg2OWY1ZGNkMywgMHg0N2NlZGIzMSksIFNUQ1AoMHg2OWI5OGY0OCwgMHg0ODI3ODZkYyksCisgIFNUQ1AoMHg2OTdjZjc4YSwgMHg0ODdmZmZlNCksIFNUQ1AoMHg2OTQwMTVjMywgMHg0OGQ4NDYwOSksIFNUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksIFNUQ1AoMHg2OGM1NzRjNCwgMHg0OTg4MzhiNiksCisgIFNUQ1AoMHg2ODg3YjVlMiwgMHg0OWRmZTRjMiksIFNUQ1AoMHg2ODQ5YWRhMywgMHg0YTM3NWNmNSksIFNUQ1AoMHg2ODBiNWMzMywgMHg0YThlYTExMSksIFNUQ1AoMHg2N2NjYzFiZSwgMHg0YWU1YjBkYSksCisgIFNUQ1AoMHg2NzhkZGU2ZSwgMHg0YjNjOGMxMiksIFNUQ1AoMHg2NzRlYjI3MSwgMHg0YjkzMzI3YyksIFNUQ1AoMHg2NzBmM2RmMywgMHg0YmU5YTNkYiksIFNUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksCisgIFNUQ1AoMHg2NjhmN2MyNSwgMHg0Yzk1ZTY4OCksIFNUQ1AoMHg2NjRmMmYyZSwgMHg0Y2ViYjc1YyksIFNUQ1AoMHg2NjBlOWE2YSwgMHg0ZDQxNTIzNCksIFNUQ1AoMHg2NWNkYmUwNSwgMHg0ZDk2YjZkMyksCisgIFNUQ1AoMHg2NThjOWEyZCwgMHg0ZGViZTRmZSksIFNUQ1AoMHg2NTRiMmYxMCwgMHg0ZTQwZGM3OSksIFNUQ1AoMHg2NTA5N2NkYiwgMHg0ZTk1OWQwOCksIFNUQ1AoMHg2NGM3ODNiZCwgMHg0ZWVhMjY3MCksCisgIFNUQ1AoMHg2NDg1NDNlNCwgMHg0ZjNlNzg3NSksIFNUQ1AoMHg2NDQyYmQ3ZSwgMHg0ZjkyOTJkYyksIFNUQ1AoMHg2M2ZmZjBiYSwgMHg0ZmU2NzU2YSksIFNUQ1AoMHg2M2JjZGRjNywgMHg1MDNhMWZlNSksCisgIFNUQ1AoMHg2Mzc5ODRkNCwgMHg1MDhkOTIxMSksIFNUQ1AoMHg2MzM1ZTYxMSwgMHg1MGUwY2JiNCksIFNUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFNUQ1AoMHg2MmFkZDdkNiwgMHg1MTg2OTQ3NiksCisgIFNUQ1AoMHg2MjY5NjhiZSwgMHg1MWQ5MjMyMSksIFNUQ1AoMHg2MjI0YjQ5NSwgMHg1MjJiNzg1OSksIFNUQ1AoMHg2MWRmYmI4YSwgMHg1MjdkOTNlNiksIFNUQ1AoMHg2MTlhN2RjZSwgMHg1MmNmNzU4ZiksCisgIFNUQ1AoMHg2MTU0ZmI5MSwgMHg1MzIxMWQxOCksIFNUQ1AoMHg2MTBmMzUwNSwgMHg1MzcyOGE0YSksIFNUQ1AoMHg2MGM5MmE1YSwgMHg1M2MzYmNlYSksIFNUQ1AoMHg2MDgyZGJjMSwgMHg1NDE0YjRjMSksCisgIFNUQ1AoMHg2MDNjNDk2YywgMHg1NDY1NzE5NCksIFNUQ1AoMHg1ZmY1NzM4ZCwgMHg1NGI1ZjMyYyksIFNUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksIFNUQ1AoMHg1ZjY2ZmRmNSwgMHg1NTU2NDNjOCksCisgIFNUQ1AoMHg1ZjFmNWVhMSwgMHg1NWE2MTI1YyksIFNUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFNUQ1AoMHg1ZThmNTdlMiwgMHg1NjQ0ZmFmNCksIFNUQ1AoMHg1ZTQ2ZjBkZCwgMHg1Njk0MTQ4YiksCisgIFNUQ1AoMHg1ZGZlNDdhZCwgMHg1NmUyZjE1ZCksIFNUQ1AoMHg1ZGI1NWM4NiwgMHg1NzMxOTEzNSksIFNUQ1AoMHg1ZDZjMmY5OSwgMHg1NzdmZjNkYSksIFNUQ1AoMHg1ZDIyYzExYywgMHg1N2NlMTkxNyksCisgIFNUQ1AoMHg1Y2Q5MTE0MCwgMHg1ODFjMDBiMyksIFNUQ1AoMHg1YzhmMjAzYiwgMHg1ODY5YWE3OSksIFNUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksIFNUQ1AoMHg1YmZhN2I4MiwgMHg1OTA0NDNhNyksCisgIFNUQ1AoMHg1YmFmYzgzNywgMHg1OTUxMzJhMiksIFNUQ1AoMHg1YjY0ZDQ5MiwgMHg1OTlkZTJlZSksIFNUQ1AoMHg1YjE5YTBjOCwgMHg1OWVhNTQ1NCksIFNUQ1AoMHg1YWNlMmQwZiwgMHg1YTM2ODY5ZiksCisgIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSkKK307CisKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorY29uc3QgRklYUF9TVFAgU2luZVRhYmxlNTEyW10gPQoreworICBTVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBTVENQKDB4N2ZmZmQ4ODYsIDB4MDA2NDg3ZTMpLCBTVENQKDB4N2ZmZjYyMTYsIDB4MDBjOTBmODgpLCBTVENQKDB4N2ZmZTljYjIsIDB4MDEyZDk2YjEpLAorICBTVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLCBTVENQKDB4N2ZmYzI1MGYsIDB4MDFmNmEyOTcpLCBTVENQKDB4N2ZmYTcyZDEsIDB4MDI1YjI2ZDcpLCBTVENQKDB4N2ZmODcxYTIsIDB4MDJiZmE5YTQpLAorICBTVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLCBTVENQKDB4N2ZmMzgyNzQsIDB4MDM4OGE5ZWEpLCBTVENQKDB4N2ZmMDk0NzgsIDB4MDNlZDI2ZTYpLCBTVENQKDB4N2ZlZDU3OTEsIDB4MDQ1MWExNzcpLAorICBTVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLCBTVENQKDB4N2ZlNWYxMDgsIDB4MDUxYThlNWMpLCBTVENQKDB4N2ZlMWM3NmIsIDB4MDU3ZjAwMzUpLCBTVENQKDB4N2ZkZDRlZWMsIDB4MDVlMzZlYTkpLAorICBTVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLCBTVENQKDB4N2ZkMzcxNTMsIDB4MDZhYzQwNmYpLCBTVENQKDB4N2ZjZTBjM2UsIDB4MDcxMGEzNDUpLCBTVENQKDB4N2ZjODU4NTQsIDB4MDc3NTAxYmUpLAorICBTVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLCBTVENQKDB4N2ZiYzA0MGEsIDB4MDgzZGIwYTcpLCBTVENQKDB4N2ZiNTYzYjMsIDB4MDhhMjAwOWEpLCBTVENQKDB4N2ZhZTc0OTUsIDB4MDkwNjRiM2EpLAorICBTVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLCBTVENQKDB4N2Y5ZmFhMTUsIDB4MDljZWNmODkpLCBTVENQKDB4N2Y5N2NlYmQsIDB4MGEzMzA4YmQpLCBTVENQKDB4N2Y4ZmE0YjAsIDB4MGE5NzNiYTUpLAorICBTVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLCBTVENQKDB4N2Y3ZTY0OGMsIDB4MGI1ZjhkOWYpLCBTVENQKDB4N2Y3NTRlODAsIDB4MGJjM2FjMzUpLCBTVENQKDB4N2Y2YmU5ZDQsIDB4MGMyN2MzODkpLAorICBTVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLCBTVENQKDB4N2Y1ODM0YjcsIDB4MGNlZmRiNzYpLCBTVENQKDB4N2Y0ZGU0NTEsIDB4MGQ1M2RiOTIpLCBTVENQKDB4N2Y0MzQ1NjMsIDB4MGRiN2QzNzYpLAorICBTVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLCBTVENQKDB4N2YyZDFjMGUsIDB4MGU3ZmE5OWUpLCBTVENQKDB4N2YyMTkxYjQsIDB4MGVlMzg3NjYpLCBTVENQKDB4N2YxNWI4ZWUsIDB4MGY0NzViZmYpLAorICBTVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBTVENQKDB4N2VmZDFjM2MsIDB4MTAwZWU4YWQpLCBTVENQKDB4N2VmMDU4NjAsIDB4MTA3MmEwNDgpLCBTVENQKDB4N2VlMzQ2MzYsIDB4MTBkNjRkYmQpLAorICBTVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLCBTVENQKDB4N2VjODM3MWEsIDB4MTE5ZDg5NDEpLCBTVENQKDB4N2ViYTNhMzksIDB4MTIwMTE2ZDUpLCBTVENQKDB4N2VhYmVmMmMsIDB4MTI2NDk5NGUpLAorICBTVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBTVENQKDB4N2U4ZTZlYjIsIDB4MTMyYjdiZjkpLCBTVENQKDB4N2U3ZjM5NTcsIDB4MTM4ZWRiYjEpLCBTVENQKDB4N2U2ZmI1ZjQsIDB4MTNmMjJmNTgpLAorICBTVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLCBTVENQKDB4N2U0ZmM1M2UsIDB4MTRiOGIxN2YpLCBTVENQKDB4N2UzZjU3ZmYsIDB4MTUxYmRmODYpLCBTVENQKDB4N2UyZTljZGYsIDB4MTU3ZjAwODYpLAorICBTVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLCBTVENQKDB4N2UwYzNkMjksIDB4MTY0NTFhODMpLCBTVENQKDB4N2RmYTk4YTgsIDB4MTZhODEzMDUpLCBTVENQKDB4N2RlOGE2NzAsIDB4MTcwYWZkOGQpLAorICBTVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLCBTVENQKDB4N2RjM2Q5MGQsIDB4MTdkMGE3YmMpLCBTVENQKDB4N2RiMGZkZjgsIDB4MTgzMzY2ZTkpLCBTVENQKDB4N2Q5ZGQ1NWEsIDB4MTg5NjE3MjgpLAorICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4N2Q3NjliYjUsIDB4MTk1YjQ5ZWEpLCBTVENQKDB4N2Q2MjhhYzYsIDB4MTliZGNiZjMpLCBTVENQKDB4N2Q0ZTJjN2YsIDB4MWEyMDNlMWIpLAorICBTVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLCBTVENQKDB4N2QyNDg4MWIsIDB4MWFlNGYxZDYpLCBTVENQKDB4N2QwZjQyMTgsIDB4MWI0NzMyZWYpLCBTVENQKDB4N2NmOWFlZjAsIDB4MWJhOTYzMzUpLAorICBTVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBTVENQKDB4N2NjZGExNjksIDB4MWM2ZDkwNTMpLCBTVENQKDB4N2NiNzI3MjQsIDB4MWNjZjhjYjMpLCBTVENQKDB4N2NhMDVmZjEsIDB4MWQzMTc3NGQpLAorICBTVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBTVENQKDB4N2M3MWVhZjksIDB4MWRmNTE2M2YpLCBTVENQKDB4N2M1YTNkNTAsIDB4MWU1NmNhMWUpLCBTVENQKDB4N2M0MjQyZjIsIDB4MWViODZiNDYpLAorICBTVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLCBTVENQKDB4N2MxMTY4NTMsIDB4MWY3Yjc0ODEpLCBTVENQKDB4N2JmODg4MzAsIDB4MWZkY2RjMWIpLCBTVENQKDB4N2JkZjViOTQsIDB4MjAzZTMwMGQpLAorICBTVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLCBTVENQKDB4N2JhYzFkMzEsIDB4MjEwMDljMGMpLCBTVENQKDB4N2I5MjBiODksIDB4MjE2MWIzYTApLCBTVENQKDB4N2I3N2FkYTgsIDB4MjFjMmI2OWMpLAorICBTVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBTVENQKDB4N2I0MjBkN2EsIDB4MjI4NDdkZTApLCBTVENQKDB4N2IyNmNiNGYsIDB4MjJlNTQxYWYpLCBTVENQKDB4N2IwYjNkMmMsIDB4MjM0NWVmZjgpLAorICBTVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLCBTVENQKDB4N2FkMzNkNDUsIDB4MjQwNzBiMDgpLCBTVENQKDB4N2FiNmNiYTQsIDB4MjQ2Nzc3NTgpLCBTVENQKDB4N2E5YTBlNTAsIDB4MjRjN2NkMzMpLAorICBTVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBTVENQKDB4N2E1ZmIwZDgsIDB4MjU4ODM0OWQpLCBTVENQKDB4N2E0MjEwZDgsIDB4MjVlODQ1YjYpLCBTVENQKDB4N2EyNDI1NmYsIDB4MjY0ODNmNmMpLAorICBTVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLCBTVENQKDB4NzllNzZjYTcsIDB4MjcwN2ViYzcpLCBTVENQKDB4NzljODlmNmUsIDB4Mjc2NzlkZjQpLCBTVENQKDB4NzlhOTg3MTUsIDB4MjdjNzM3ZDMpLAorICBTVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBTVENQKDB4Nzk2YTc1NTQsIDB4Mjg4NjIxYjkpLCBTVENQKDB4Nzk0YTdjMTIsIDB4MjhlNTcxNGIpLCBTVENQKDB4NzkyYTM3ZmUsIDB4Mjk0NGE3YTIpLAorICBTVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLCBTVENQKDB4NzhlOGNmYjIsIDB4MmEwMmM3YjgpLCBTVENQKDB4NzhjN2FiYTIsIDB4MmE2MWIxMDEpLCBTVENQKDB4NzhhNjNkMTEsIDB4MmFjMDgwMjYpLAorICBTVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBTVENQKDB4Nzg2MjgwYmYsIDB4MmI3ZGNmMTcpLCBTVENQKDB4Nzg0MDMzMjksIDB4MmJkYzRlNmYpLCBTVENQKDB4NzgxZDliNjUsIDB4MmMzYWIyYjkpLAorICBTVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLCBTVENQKDB4NzdkNzhkYWEsIDB4MmNmNzI5MzkpLCBTVENQKDB4NzdiNDE3ZGYsIDB4MmQ1NTNhZmMpLCBTVENQKDB4Nzc5MDU4M2UsIDB4MmRiMzMwYzcpLAorICBTVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLCBTVENQKDB4Nzc0N2ZiY2UsIDB4MmU2ZWM3OTIpLCBTVENQKDB4NzcyMzVmMmQsIDB4MmVjYzY4MWUpLCBTVENQKDB4NzZmZTc5MGUsIDB4MmYyOWViY2MpLAorICBTVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLCBTVENQKDB4NzZiM2QwYjQsIDB4MmZlNDliYTcpLCBTVENQKDB4NzY4ZTBlYTYsIDB4MzA0MWM3NjEpLCBTVENQKDB4NzY2ODAzNzYsIDB4MzA5ZWQ1NTYpLAorICBTVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBTVENQKDB4NzYxYjEyMTEsIDB4MzE1ODk3MGUpLCBTVENQKDB4NzVmNDJjMGIsIDB4MzFiNTRhNWUpLCBTVENQKDB4NzVjY2ZkNDIsIDB4MzIxMWRmMDQpLAorICBTVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLCBTVENQKDB4NzU3ZGM1Y2EsIDB4MzJjYWFiNmYpLCBTVENQKDB4NzU1NWJkNGMsIDB4MzMyNmUyYzMpLCBTVENQKDB4NzUyZDZjNmMsIDB4MzM4MmZhODgpLAorICBTVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBTVENQKDB4NzRkYmYxZWYsIDB4MzQzYWNhODcpLCBTVENQKDB4NzRiMmM4ODQsIDB4MzQ5NjgyNTApLCBTVENQKDB4NzQ4OTU3MWMsIDB4MzRmMjE5YTgpLAorICBTVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLCBTVENQKDB4NzQzNTljYmQsIDB4MzVhOGU2MjUpLCBTVENQKDB4NzQwYjUzZmIsIDB4MzYwNDFhZDkpLCBTVENQKDB4NzNlMGMzYTMsIDB4MzY1ZjJlM2IpLAorICBTVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLCBTVENQKDB4NzM4YWNjOWUsIDB4MzcxNGYwMmEpLCBTVENQKDB4NzM1ZjY2MjYsIDB4Mzc2ZjllNDYpLCBTVENQKDB4NzMzM2I4ODMsIDB4MzdjYTJhMzApLAorICBTVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLCBTVENQKDB4NzJkYjg4MjgsIDB4Mzg3ZWRhOGUpLCBTVENQKDB4NzJhZjA1YTcsIDB4MzhkOGZlOTMpLCBTVENQKDB4NzI4MjNjNjcsIDB4MzkzMmZmODcpLAorICBTVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLCBTVENQKDB4NzIyN2Q2MWMsIDB4MzllNjk3NWUpLCBTVENQKDB4NzFmYTM5NDksIDB4M2E0MDJkZDIpLCBTVENQKDB4NzFjYzU2MjYsIDB4M2E5OWEwNTcpLAorICBTVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLCBTVENQKDB4NzE2ZmJkNjgsIDB4M2I0YzE4YmEpLCBTVENQKDB4NzE0MTA4MDUsIDB4M2JhNTFlMjkpLCBTVENQKDB4NzExMjBjYzUsIDB4M2JmZGZlY2QpLAorICBTVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBTVENQKDB4NzBiMzQ1MjUsIDB4M2NhZjUwZGEpLCBTVENQKDB4NzA4Mzc4ZmYsIDB4M2QwN2MxZDYpLCBTVENQKDB4NzA1MzY3NzEsIDB4M2Q2MDBkMmMpLAorICBTVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLCBTVENQKDB4NmZmMjc0OTcsIDB4M2UxMDMyMGQpLCBTVENQKDB4NmZjMTkzODUsIDB4M2U2ODBiMmMpLCBTVENQKDB4NmY5MDZkODQsIDB4M2ViZmJkY2QpLAorICBTVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBTVENQKDB4NmYyZDUzMmMsIDB4M2Y2ZWFlYjgpLCBTVENQKDB4NmVmYjVmMTIsIDB4M2ZjNWVjOTgpLCBTVENQKDB4NmVjOTI2ODMsIDB4NDAxZDAzMjEpLAorICBTVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBTVENQKDB4NmU2M2U4N2YsIDB4NDBjYWI5NTgpLCBTVENQKDB4NmUzMGUzNGEsIDB4NDEyMTU4OWIpLCBTVENQKDB4NmRmZDlhMWMsIDB4NDE3N2NmYjEpLAorICBTVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBTVENQKDB4NmQ5NjNjNTQsIDB4NDIyNDQ0ODEpLCBTVENQKDB4NmQ2MjI3ZmEsIDB4NDI3YTQxZDApLCBTVENQKDB4NmQyZGQwMjcsIDB4NDJkMDE2MWUpLAorICBTVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLCBTVENQKDB4NmNjNDU2OTgsIDB4NDM3YjQyZTEpLCBTVENQKDB4NmM4ZjM1MWMsIDB4NDNkMDlhZWQpLCBTVENQKDB4NmM1OWQwYTksIDB4NDQyNWM5MjMpLAorICBTVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLCBTVENQKDB4NmJlZTNmNjIsIDB4NDRjZmE3NDApLCBTVENQKDB4NmJiODEyZDEsIDB4NDUyNDU2YmQpLCBTVENQKDB4NmI4MWEzY2QsIDB4NDU3OGRiOTMpLAorICBTVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLCBTVENQKDB4NmIxM2ZlZjUsIDB4NDYyMTY0N2QpLCBTVENQKDB4NmFkY2M5NjQsIDB4NDY3NTY4MjgpLCBTVENQKDB4NmFhNTUxZTksIDB4NDZjOTQwNWMpLAorICBTVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBTVENQKDB4NmEzNTlkYjksIDB4NDc3MDZkOTMpLCBTVENQKDB4NjlmZDYxNGEsIDB4NDdjM2MyMmYpLCBTVENQKDB4NjljNGUzN2EsIDB4NDgxNmVhODYpLAorICBTVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLCBTVENQKDB4Njk1MzI0NDIsIDB4NDhiY2I1OTkpLCBTVENQKDB4NjkxOWUzMjAsIDB4NDkwZjU3ZWUpLCBTVENQKDB4NjhlMDYxMjksIDB4NDk2MWNkMzMpLAorICBTVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLCBTVENQKDB4Njg2YzliNGIsIDB4NGEwNjJmYmQpLCBTVENQKDB4NjgzMjU3YWIsIDB4NGE1ODFjOWUpLCBTVENQKDB4NjdmN2QzYzUsIDB4NGFhOWRiYTIpLAorICBTVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLCBTVENQKDB4Njc4MjBiYjcsIDB4NGI0Y2NmNGQpLCBTVENQKDB4Njc0NmM3ZDgsIDB4NGI5ZTAzOTApLCBTVENQKDB4NjcwYjQ0NDQsIDB4NGJlZjA5MmQpLAorICBTVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLCBTVENQKDB4NjY5MzdlOTEsIDB4NGM5MDg3YjEpLCBTVENQKDB4NjY1NzNjYmIsIDB4NGNlMTAwMzQpLCBTVENQKDB4NjYxYWJiYzUsIDB4NGQzMTQ5NGIpLAorICBTVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLCBTVENQKDB4NjVhMGZkMGIsIDB4NGRkMTRjNmUpLCBTVENQKDB4NjU2M2JmOTIsIDB4NGUyMTA2MTcpLCBTVENQKDB4NjUyNjQzOGYsIDB4NGU3MDhmOGYpLAorICBTVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLCBTVENQKDB4NjRhYTkwN2YsIDB4NGYwZjExMjYpLCBTVENQKDB4NjQ2YzU5YmYsIDB4NGY1ZTA4ZTMpLCBTVENQKDB4NjQyZGU1MGQsIDB4NGZhY2NmYWIpLAorICBTVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLCBTVENQKDB4NjNiMDQyNmQsIDB4NTA0OWM5OTkpLCBTVENQKDB4NjM3MTE0Y2MsIDB4NTA5N2ZjNWUpLCBTVENQKDB4NjMzMWE5ZDQsIDB4NTBlNWZkNmQpLAorICBTVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBTVENQKDB4NjJiMjFjN2IsIDB4NTE4MTY5YTUpLCBTVENQKDB4NjI3MWZhNjksIDB4NTFjZWQ0NmUpLCBTVENQKDB4NjIzMTliOWQsIDB4NTIxYzBjYzIpLAorICBTVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLCBTVENQKDB4NjFiMDI4NzYsIDB4NTJiNWU1NDYpLCBTVENQKDB4NjE2ZjE0NmMsIDB4NTMwMjg1MTgpLCBTVENQKDB4NjEyZGM0NDcsIDB4NTM0ZWYxYjUpLAorICBTVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBTVENQKDB4NjBhYTcwNTAsIDB4NTNlNzMwOTcpLCBTVENQKDB4NjA2ODZjY2YsIDB4NTQzMzAyN2QpLCBTVENQKDB4NjAyNjJkZDYsIDB4NTQ3ZWEwNzMpLAorICBTVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLCBTVENQKDB4NWZhMGZlMWYsIDB4NTUxNTNmZDQpLCBTVENQKDB4NWY1ZTBkYjMsIDB4NTU2MDQwZTIpLCBTVENQKDB4NWYxYWUyNzQsIDB4NTVhYjBkNDYpLAorICBTVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBTVENQKDB4NWU5M2RjMWYsIDB4NTY0MDA3NTgpLCBTVENQKDB4NWU1MDAxNWQsIDB4NTY4YTM0YTkpLCBTVENQKDB4NWUwYmVjNmUsIDB4NTZkNDJjOTkpLAorICBTVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLCBTVENQKDB4NWQ4MzE0YjEsIDB4NTc2NzdiOWQpLCBTVENQKDB4NWQzZTUyMzcsIDB4NTdiMGQyNTYpLCBTVENQKDB4NWNmOTU2MzgsIDB4NTdmOWYyZjgpLAorICBTVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLCBTVENQKDB4NWM2ZWIyNTgsIDB4NTg4YjkxNDApLCBTVENQKDB4NWMyOTBhY2MsIDB4NThkNDBlOGMpLCBTVENQKDB4NWJlMzJhNjcsIDB4NTkxYzU1MGUpLAorICBTVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLCBTVENQKDB4NWI1NmJmYmQsIDB4NTlhYzNjZmQpLCBTVENQKDB4NWIxMDM1Y2YsIDB4NTlmM2RlMTIpLCBTVENQKDB4NWFjOTczYjUsIDB4NWEzYjQ3YWIpLAorICBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpCit9OworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworLyogZ2VuZXJhdGVfZmZ0X3RhYmxlcy5tIDQgMTUgKi8KK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNjBbXSA9Cit7CisgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksCisgIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2NzhkZGU2ZSksCisgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksCisgIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHgyNzhkZGU2ZSksCisgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgwMDAwMDAwMCksCisgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhkODcyMjE5MSksCisgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhiNGMzNzNlZCksCisgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4ZjI5ZWNmYjEpLCBTVEMoMHg5ODcyMjE5MSksCisgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHg4NjQzYzdiMiksCisgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHg4MDAwMDAwMCksCisgIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4YWE1OWVkYTMpLCBTVEMoMHg4NjQzYzdiMiksCisgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg5ODcyMjE5MSksCisgIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHhiNGMzNzNlZCksCisgIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4ODJjYzBmMzUpLCBTVEMoMHhkODcyMjE5MSksCit9OworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc2MFtdID0KK3sKKyAgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDI3OGRkZTZlKSwKKyAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDRiM2M4YzEyKSwKKyAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDY3OGRkZTZlKSwKKyAgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDc5YmMzODRkKSwKKyAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdmZmZmZmZmKSwKKyAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc5YmMzODRkKSwKKyAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDY3OGRkZTZlKSwKKyAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDRiM2M4YzEyKSwKKyAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDI3OGRkZTZlKSwKKyAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDAwMDAwMDAwKSwKKyAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweGQ4NzIyMTkxKSwKKyAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweGI0YzM3M2VkKSwKKyAgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDk4NzIyMTkxKSwKKyAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDg2NDNjN2IyKSwKK307CisKKworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDI0MFtdID0KK3sKKyAgU1RDKDB4N2ZmNGM1NmYpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc2NDFhZjNkKSwKKyAgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2YjU5OGVhMyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDVhODI3OTlhKSwKKyAgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDMwZmJjNTRkKSwKKyAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAwMDAwMDAwKSwKKyAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGNmMDQzYWIyKSwKKyAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGE1N2Q4NjY1KSwKKyAgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YTMyNmVlYmYpLCBTVEMoMHg5NGE2NzE1YyksIFNUQygweDg5YmU1MGMyKSwKKyAgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmMjllY2ZiMSksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhhYTU5ZWRhMyksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHg4MmNjMGYzNSksIFNUQygweDgwMDAwMDAwKSwKKyAgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4ZjVmNTBkNjYpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGJkMWVjNDViKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5MmRjYWZlNCksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODA2NTAzNDYpLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDg5YmU1MGMyKSwKKyAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweGE1N2Q4NjY1KSwKKyAgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg2YjU5OGVhMyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhhYTU5ZWRhMyksIFNUQygweDkyZGNhZmU0KSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4MDBiM2E5MCksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4OTY4MzA4NzUpLCBTVEMoMHhhZjcyNmRlZSksIFNUQygweGNmMDQzYWIyKSwKKyAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGZmZmZmZmZmKSwKKyAgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGM1ZTNhM2E4KSwgU1RDKDB4YTMyNmVlYmYpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDgwNjUwMzQ2KSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg5NjgzMDg3NSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4ZGJhNTYyOWEpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDMwZmJjNTRkKSwKKyAgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4OTRhNjcxNWMpLCBTVEMoMHg4MmNjMGYzNSksIFNUQygweDgxOTM2ZGFlKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHhhZjcyNmRlZSksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDVhODI3OTlhKSwKK307CitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzI0MFtdID0KK3sKKyAgU1RDKDB4MDM1OWM0MjgpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MTc1MzdlNjMpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmFiYTJlZTQpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDMwZmJjNTRkKSwKKyAgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVhODI3OTlhKSwKKyAgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc2NDFhZjNkKSwKKyAgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmZmZmZmZmKSwKKyAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwKKyAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwKKyAgU1RDKDB4MTc1MzdlNjMpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NTgxYzAwYjMpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDMwZmJjNTRkKSwKKyAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDAwMDAwMDAwKSwKKyAgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGNmMDQzYWIyKSwKKyAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGE1N2Q4NjY1KSwKKyAgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHhmY2E2M2JkNyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4Yjc4MDAwMWIpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDg5YmU1MGMyKSwKKyAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgwMDAwMDAwKSwKKyAgU1RDKDB4MmFiYTJlZTQpLCBTVEMoMHg1MDhkOTIxMSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NTgxYzAwYjMpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhiNzgwMDAxYiksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4ODU0NTY1MTkpLCBTVEMoMHg4MDJjZTg0YiksIFNUQygweDg5YmU1MGMyKSwKKyAgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODAyY2U4NGIpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweGE1N2Q4NjY1KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNDgwW10gPQoreworICBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3Zjc2ODkyZiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdjZDgwNDY0KSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3YzBmYzIyYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdhM2UxN2YyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc2ZTMzYjNmKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3NTlhZjM0YyksCisgIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDcwN2QxNDQzKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4Njk3Y2Y3OGEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWNkOTExNDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU4MWMwMGIzKSwKKyAgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmMWNkZTAxKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2NDg1NDNlNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MmM0ZDkwNTApLAorICBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmOTRkMGUyZCksCisgIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY3YTBkZWM4KSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhlNzA3NDdjMyksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4ZDZkYjEyNTMpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGM3NjMxNThkKSwKKyAgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhlMjFlNzY1OSksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4Y2YwNDNhYjIpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGJkMWVjNDViKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhY2RlZTJlNyksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OWVhYjA0NmUpLAorICBTVEMoMHg3Zjc2ODkyZiksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NjhmN2MyNSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQ0NGQ3YWZmKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAxYWNlYjdjKSwgU1RDKDB4ZjVmNTBkNjYpLCBTVEMoMHhlYTUyYzE2NSksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4ZDNiMjZmYWYpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGJlOGRmMmI5KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhYjlhOGU2YiksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OWI3YWJjMWIpLCBTVEMoMHg5NGE2NzE1YyksIFNUQygweDhlYjhiOTlmKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4NWMxZTgwZCksCisgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGYyOWVjZmIxKSwgU1RDKDB4ZTU2MzI2NTMpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGNiZjAwZGJkKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4YTBlMGExNWUpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODBiMzgxYWIpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgwYjM4MWFiKSwKKyAgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMmJlOGY4NyksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGU3MDc0N2MzKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjYTY5NWI5MyksIFNUQygweGJkMWVjNDViKSwgU1RDKDB4YjBjMTg3OGEpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweDliN2FiYzFiKSwgU1RDKDB4OTJkY2FmZTQpLCBTVEMoMHg4YmMxZjZlNyksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODI3NWEwYmYpLCBTVEMoMHg4MDY1MDM0NiksIFNUQygweDgwMTk0MzRmKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4NGNlNDQ0ZCksIFNUQygweDg5YmU1MGMyKSwgU1RDKDB4OTA1MjBkMDMpLAorICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Y2YwNDNhYjIpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGIyMTQxYjAxKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5YTczNjVkMiksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDgxMTg1NWIzKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4MTE4NTViMyksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweDlhNzM2NWQyKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiMjE0MWIwMSksCisgIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDQ0NGQ3YWZmKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyMmJlOGY4NyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZmU1MzE0ODMpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGRhMGFlY2Y4KSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhiOGUzMTMxOCksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4OWQ5Njk3NDEpLCBTVEMoMHg5MmRjYWZlNCksIFNUQygweDhhNjUwY2IzKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4MGUzMjFmZSksIFNUQygweDgwMGIzYTkwKSwgU1RDKDB4ODFkOTRjOGUpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDhkMzM0NjI0KSwgU1RDKDB4OTY4MzA4NzUpLCBTVEMoMHhhMjAxYjg1MiksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4YmU4ZGYyYjkpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGUwN2UwYzgzKSwKKyAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFlKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGM1ZTNhM2E4KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGZmZmZmZmZmKSwgU1RDKDB4MTQwNjBiNjgpLAorICBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRhMGFlY2Y4KSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiMzZhMTk3NyksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OTU5MjY3NWIpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDgzZjAzZGQ1KSwgU1RDKDB4ODA2NTAzNDYpLCBTVEMoMHg4MDg5NzZkMCksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4OGJjMWY2ZTcpLCBTVEMoMHg5NjgzMDg3NSksIFNUQygweGE0NTAzN2M4KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhjNzYzMTU4ZCksIFNUQygweGRiYTU2MjlhKSwgU1RDKDB4ZjBmNDg4ZDgpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDFjM2ZkMDQ1KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0NDRkN2FmZiksCisgIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OTRhNjcxNWMpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODAwYjNhOTApLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDg3NTc4NjBiKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHg5ZWFiMDQ2ZSksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4YzJlYzc2MzQpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDg3ZmZmZTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY5N2NmNzhhKSwKK307CitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzQ4MFtdID0KK3sKKyAgU1RDKDB4MDFhY2ViN2MpLCBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MGJiNjUzMzYpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxMjVkZjc1YiksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxYzNmZDA0NSksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MWY4MWYzN2MpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNWY1MTMwNyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzI4NmY3NzkpLAorICBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDM3MWFmY2Q1KSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzZDEzODljYiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDQ4N2ZmZmU0KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1Y2Q5MTE0MCksCisgIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZjBiNzcyNyksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NGYzZTc4NzUpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1ZGZlNDdhZCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzQzZTA5MTgpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc4MTZhNzU5KSwKKyAgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2ZkMzE3YjQpLAorICBTVEMoMHgwODVmMjEzNyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MmNjYjlkYiksCisgIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDUzMjExZDE4KSwKKyAgU1RDKDB4MGJiNjUzMzYpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NGM5NWU2ODgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2YzQwY2YyYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2UyNmIzNzEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2ZTAxMDc4MCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzYjk5NDFiMSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjVmNTEzMDcpLAorICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDZlZDllYmExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmMjllY2ZiMSksCisgIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzQzZTA5MTgpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY0ODU0M2U0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhmYWY5ODhjYiksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZGQ0MTcwNzgpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGMxNzRkYmYxKSwKKyAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGNmMDQzYWIyKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhiMjE0MWIwMSksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OWE3MzY1ZDIpLAorICBTVEMoMHgxMjVkZjc1YiksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2YzQwY2YyYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDczODdlYTIzKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDUxZDkyMzIxKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzMjg2Zjc3OSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MGYwYjc3MjcpLCBTVEMoMHhmY2E2M2JkNyksIFNUQygweGVhNTJjMTY1KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjNzYzMTU4ZCksIFNUQygweGI3ODAwMDFiKSwgU1RDKDB4YTkxZDBlYTIpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDkxZmVmODdmKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4M2YwM2RkNSksCisgIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFlKSwKKyAgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NjY4ZjdjMjUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgxZjgxZjM3YyksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZjQ0OWFjYzkpLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGNhNjk1YjkzKSwgU1RDKDB4Yjc4MDAwMWIpLCBTVEMoMHhhNmFlY2Q1ZCksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4OGQzMzQ2MjQpLCBTVEMoMHg4NTQ1NjUxOSksIFNUQygweDgwZTMyMWZlKSwgU1RDKDB4ODAyY2U4NGIpLCBTVEMoMHg4MzI3ZmI5YiksIFNUQygweDg5YmU1MGMyKSwgU1RDKDB4OTNiZjMwZDMpLAorICBTVEMoMHgxNzUzN2U2MyksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDczODdlYTIzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDAzNTljNDI4KSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhkNTQ1ZDExYiksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YWNkZWUyZTcpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDhmODJlYmJjKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MTE4NTViMyksIFNUQygweDgwMmNlODRiKSwgU1RDKDB4ODM4OTYxZTcpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDk2ODMwODc1KSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiNzgwMDAxYiksCit9OworCisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTAyNFtdID0KK3sKKyAgV1RDUCgweDdmZmZmZDg4LCAweDAwMTkyMWZiKSwgV1RDUCgweDdmZmZlOWNiLCAweDAwNGI2NWVlKSwgV1RDUCgweDdmZmZjMjUxLCAweDAwN2RhOWQ0KSwgV1RDUCgweDdmZmY4NzE5LCAweDAwYWZlZGE4KSwKKyAgV1RDUCgweDdmZmYzODI0LCAweDAwZTIzMTYwKSwgV1RDUCgweDdmZmVkNTcyLCAweDAxMTQ3NGY2KSwgV1RDUCgweDdmZmU1ZjAzLCAweDAxNDZiODYwKSwgV1RDUCgweDdmZmRkNGQ3LCAweDAxNzhmYjk5KSwKKyAgV1RDUCgweDdmZmQzNmVlLCAweDAxYWIzZTk3KSwgV1RDUCgweDdmZmM4NTQ5LCAweDAxZGQ4MTU0KSwgV1RDUCgweDdmZmJiZmU2LCAweDAyMGZjM2M2KSwgV1RDUCgweDdmZmFlNmM3LCAweDAyNDIwNWU4KSwKKyAgV1RDUCgweDdmZjlmOWVjLCAweDAyNzQ0N2IwKSwgV1RDUCgweDdmZjhmOTU0LCAweDAyYTY4OTE3KSwgV1RDUCgweDdmZjdlNTAwLCAweDAyZDhjYTE2KSwgV1RDUCgweDdmZjZiY2YwLCAweDAzMGIwYWE0KSwKKyAgV1RDUCgweDdmZjU4MTI1LCAweDAzM2Q0YWJiKSwgV1RDUCgweDdmZjQzMTlkLCAweDAzNmY4YTUxKSwgV1RDUCgweDdmZjJjZTViLCAweDAzYTFjOTYwKSwgV1RDUCgweDdmZjE1NzVkLCAweDAzZDQwN2RmKSwKKyAgV1RDUCgweDdmZWZjY2E0LCAweDA0MDY0NWM3KSwgV1RDUCgweDdmZWUyZTMwLCAweDA0Mzg4MzEwKSwgV1RDUCgweDdmZWM3YzAyLCAweDA0NmFiZmIzKSwgV1RDUCgweDdmZWFiNjFhLCAweDA0OWNmYmE3KSwKKyAgV1RDUCgweDdmZThkYzc4LCAweDA0Y2YzNmU1KSwgV1RDUCgweDdmZTZlZjFjLCAweDA1MDE3MTY1KSwgV1RDUCgweDdmZTRlZTA2LCAweDA1MzNhYjIwKSwgV1RDUCgweDdmZTJkOTM4LCAweDA1NjVlNDBkKSwKKyAgV1RDUCgweDdmZTBiMGIxLCAweDA1OTgxYzI2KSwgV1RDUCgweDdmZGU3NDcxLCAweDA1Y2E1MzYxKSwgV1RDUCgweDdmZGMyNDdhLCAweDA1ZmM4OWI4KSwgV1RDUCgweDdmZDljMGNhLCAweDA2MmViZjIyKSwKKyAgV1RDUCgweDdmZDc0OTY0LCAweDA2NjBmMzk4KSwgV1RDUCgweDdmZDRiZTQ2LCAweDA2OTMyNzEzKSwgV1RDUCgweDdmZDIxZjcyLCAweDA2YzU1OThhKSwgV1RDUCgweDdmY2Y2Y2U4LCAweDA2Zjc4YWY2KSwKKyAgV1RDUCgweDdmY2NhNmE3LCAweDA3MjliYjRlKSwgV1RDUCgweDdmYzljY2IyLCAweDA3NWJlYThjKSwgV1RDUCgweDdmYzZkZjA4LCAweDA3OGUxOGE3KSwgV1RDUCgweDdmYzNkZGE5LCAweDA3YzA0NTk4KSwKKyAgV1RDUCgweDdmYzBjODk2LCAweDA3ZjI3MTU3KSwgV1RDUCgweDdmYmQ5ZmQwLCAweDA4MjQ5YmRkKSwgV1RDUCgweDdmYmE2MzU3LCAweDA4NTZjNTIwKSwgV1RDUCgweDdmYjcxMzJiLCAweDA4ODhlZDFiKSwKKyAgV1RDUCgweDdmYjNhZjRlLCAweDA4YmIxM2M1KSwgV1RDUCgweDdmYjAzN2JmLCAweDA4ZWQzOTE2KSwgV1RDUCgweDdmYWNhYzdmLCAweDA5MWY1ZDA2KSwgV1RDUCgweDdmYTkwZDhlLCAweDA5NTE3ZjhmKSwKKyAgV1RDUCgweDdmYTU1YWVlLCAweDA5ODNhMGE3KSwgV1RDUCgweDdmYTE5NDllLCAweDA5YjVjMDQ4KSwgV1RDUCgweDdmOWRiYWEwLCAweDA5ZTdkZTZhKSwgV1RDUCgweDdmOTljY2Y0LCAweDBhMTlmYjA0KSwKKyAgV1RDUCgweDdmOTVjYjlhLCAweDBhNGMxNjEwKSwgV1RDUCgweDdmOTFiNjk0LCAweDBhN2UyZjg1KSwgV1RDUCgweDdmOGQ4ZGUxLCAweDBhYjA0NzVjKSwgV1RDUCgweDdmODk1MTgyLCAweDBhZTI1ZDhkKSwKKyAgV1RDUCgweDdmODUwMTc5LCAweDBiMTQ3MjExKSwgV1RDUCgweDdmODA5ZGM1LCAweDBiNDY4NGRmKSwgV1RDUCgweDdmN2MyNjY4LCAweDBiNzg5NWYwKSwgV1RDUCgweDdmNzc5YjYyLCAweDBiYWFhNTNiKSwKKyAgV1RDUCgweDdmNzJmY2I0LCAweDBiZGNiMmJiKSwgV1RDUCgweDdmNmU0YTVlLCAweDBjMGViZTY2KSwgV1RDUCgweDdmNjk4NDYxLCAweDBjNDBjODM1KSwgV1RDUCgweDdmNjRhYWJmLCAweDBjNzJkMDIwKSwKKyAgV1RDUCgweDdmNWZiZDc3LCAweDBjYTRkNjIwKSwgV1RDUCgweDdmNWFiYzhhLCAweDBjZDZkYTJkKSwgV1RDUCgweDdmNTVhN2ZhLCAweDBkMDhkYzNmKSwgV1RDUCgweDdmNTA3ZmM3LCAweDBkM2FkYzRlKSwKKyAgV1RDUCgweDdmNGI0M2YyLCAweDBkNmNkYTUzKSwgV1RDUCgweDdmNDVmNDdiLCAweDBkOWVkNjQ2KSwgV1RDUCgweDdmNDA5MTY0LCAweDBkZDBkMDFmKSwgV1RDUCgweDdmM2IxYWFkLCAweDBlMDJjN2Q3KSwKKyAgV1RDUCgweDdmMzU5MDU3LCAweDBlMzRiZDY2KSwgV1RDUCgweDdmMmZmMjYzLCAweDBlNjZiMGMzKSwgV1RDUCgweDdmMmE0MGQyLCAweDBlOThhMWU5KSwgV1RDUCgweDdmMjQ3YmE1LCAweDBlY2E5MGNlKSwKKyAgV1RDUCgweDdmMWVhMmRjLCAweDBlZmM3ZDZiKSwgV1RDUCgweDdmMThiNjc5LCAweDBmMmU2N2I4KSwgV1RDUCgweDdmMTJiNjdjLCAweDBmNjA0ZmFmKSwgV1RDUCgweDdmMGNhMmU3LCAweDBmOTIzNTQ2KSwKKyAgV1RDUCgweDdmMDY3YmJhLCAweDBmYzQxODc2KSwgV1RDUCgweDdmMDA0MGY2LCAweDBmZjVmOTM4KSwgV1RDUCgweDdlZjlmMjlkLCAweDEwMjdkNzg0KSwgV1RDUCgweDdlZjM5MGFlLCAweDEwNTliMzUyKSwKKyAgV1RDUCgweDdlZWQxYjJjLCAweDEwOGI4YzliKSwgV1RDUCgweDdlZTY5MjE3LCAweDEwYmQ2MzU2KSwgV1RDUCgweDdlZGZmNTcwLCAweDEwZWYzNzdkKSwgV1RDUCgweDdlZDk0NTM4LCAweDExMjEwOTA3KSwKKyAgV1RDUCgweDdlZDI4MTcxLCAweDExNTJkN2VkKSwgV1RDUCgweDdlY2JhYTFhLCAweDExODRhNDI3KSwgV1RDUCgweDdlYzRiZjM2LCAweDExYjY2ZGFkKSwgV1RDUCgweDdlYmRjMGM2LCAweDExZTgzNDc4KSwKKyAgV1RDUCgweDdlYjZhZWNhLCAweDEyMTlmODgwKSwgV1RDUCgweDdlYWY4OTQzLCAweDEyNGJiOWJlKSwgV1RDUCgweDdlYTg1MDMzLCAweDEyN2Q3ODI5KSwgV1RDUCgweDdlYTEwMzliLCAweDEyYWYzM2JhKSwKKyAgV1RDUCgweDdlOTlhMzdjLCAweDEyZTBlYzZhKSwgV1RDUCgweDdlOTIyZmQ2LCAweDEzMTJhMjMwKSwgV1RDUCgweDdlOGFhOGFjLCAweDEzNDQ1NTA1KSwgV1RDUCgweDdlODMwZGZmLCAweDEzNzYwNGUyKSwKKyAgV1RDUCgweDdlN2I1ZmNlLCAweDEzYTdiMWJmKSwgV1RDUCgweDdlNzM5ZTFkLCAweDEzZDk1YjkzKSwgV1RDUCgweDdlNmJjOGViLCAweDE0MGIwMjU4KSwgV1RDUCgweDdlNjNlMDNiLCAweDE0M2NhNjA1KSwKKyAgV1RDUCgweDdlNWJlNDBjLCAweDE0NmU0Njk0KSwgV1RDUCgweDdlNTNkNDYyLCAweDE0OWZlM2ZjKSwgV1RDUCgweDdlNGJiMTNjLCAweDE0ZDE3ZTM2KSwgV1RDUCgweDdlNDM3YTljLCAweDE1MDMxNTNhKSwKKyAgV1RDUCgweDdlM2IzMDgzLCAweDE1MzRhOTAxKSwgV1RDUCgweDdlMzJkMmY0LCAweDE1NjYzOTgyKSwgV1RDUCgweDdlMmE2MWVkLCAweDE1OTdjNmI3KSwgV1RDUCgweDdlMjFkZDczLCAweDE1Yzk1MDk3KSwKKyAgV1RDUCgweDdlMTk0NTg0LCAweDE1ZmFkNzFiKSwgV1RDUCgweDdlMTA5YTI0LCAweDE2MmM1YTNiKSwgV1RDUCgweDdlMDdkYjUyLCAweDE2NWRkOWYwKSwgV1RDUCgweDdkZmYwOTExLCAweDE2OGY1NjMyKSwKKyAgV1RDUCgweDdkZjYyMzYyLCAweDE2YzBjZWY5KSwgV1RDUCgweDdkZWQyYTQ3LCAweDE2ZjI0NDNlKSwgV1RDUCgweDdkZTQxZGMwLCAweDE3MjNiNWY5KSwgV1RDUCgweDdkZGFmZGNlLCAweDE3NTUyNDIyKSwKKyAgV1RDUCgweDdkZDFjYTc1LCAweDE3ODY4ZWIzKSwgV1RDUCgweDdkYzg4M2I0LCAweDE3YjdmNWEzKSwgV1RDUCgweDdkYmYyOThkLCAweDE3ZTk1OGVhKSwgV1RDUCgweDdkYjViYzAyLCAweDE4MWFiODgxKSwKKyAgV1RDUCgweDdkYWMzYjE1LCAweDE4NGMxNDYxKSwgV1RDUCgweDdkYTJhNmM2LCAweDE4N2Q2YzgyKSwgV1RDUCgweDdkOThmZjE3LCAweDE4YWVjMGRiKSwgV1RDUCgweDdkOGY0NDA5LCAweDE4ZTAxMTY3KSwKKyAgV1RDUCgweDdkODU3NTlmLCAweDE5MTE1ZTFjKSwgV1RDUCgweDdkN2I5M2RhLCAweDE5NDJhNmYzKSwgV1RDUCgweDdkNzE5ZWJhLCAweDE5NzNlYmU2KSwgV1RDUCgweDdkNjc5NjQyLCAweDE5YTUyY2ViKSwKKyAgV1RDUCgweDdkNWQ3YTc0LCAweDE5ZDY2OWZjKSwgV1RDUCgweDdkNTM0YjUwLCAweDFhMDdhMzExKSwgV1RDUCgweDdkNDkwOGQ5LCAweDFhMzhkODIzKSwgV1RDUCgweDdkM2ViMzBmLCAweDFhNmEwOTI5KSwKKyAgV1RDUCgweDdkMzQ0OWY1LCAweDFhOWIzNjFkKSwgV1RDUCgweDdkMjljZDhjLCAweDFhY2M1ZWY2KSwgV1RDUCgweDdkMWYzZGQ2LCAweDFhZmQ4M2FkKSwgV1RDUCgweDdkMTQ5YWQ1LCAweDFiMmVhNDNhKSwKKyAgV1RDUCgweDdkMDllNDg5LCAweDFiNWZjMDk3KSwgV1RDUCgweDdjZmYxYWY1LCAweDFiOTBkOGJiKSwgV1RDUCgweDdjZjQzZTFhLCAweDFiYzFlYzllKSwgV1RDUCgweDdjZTk0ZGZiLCAweDFiZjJmYzNhKSwKKyAgV1RDUCgweDdjZGU0YTk4LCAweDFjMjQwNzg2KSwgV1RDUCgweDdjZDMzM2YzLCAweDFjNTUwZTdjKSwgV1RDUCgweDdjYzgwYTBmLCAweDFjODYxMTEzKSwgV1RDUCgweDdjYmNjY2VjLCAweDFjYjcwZjQzKSwKKyAgV1RDUCgweDdjYjE3YzhkLCAweDFjZTgwOTA2KSwgV1RDUCgweDdjYTYxOGYzLCAweDFkMThmZTU0KSwgV1RDUCgweDdjOWFhMjIxLCAweDFkNDllZjI2KSwgV1RDUCgweDdjOGYxODE3LCAweDFkN2FkYjczKSwKKyAgV1RDUCgweDdjODM3YWQ4LCAweDFkYWJjMzM0KSwgV1RDUCgweDdjNzdjYTY1LCAweDFkZGNhNjYyKSwgV1RDUCgweDdjNmMwNmMwLCAweDFlMGQ4NGY1KSwgV1RDUCgweDdjNjAyZmVjLCAweDFlM2U1ZWU1KSwKKyAgV1RDUCgweDdjNTQ0NWU5LCAweDFlNmYzNDJjKSwgV1RDUCgweDdjNDg0OGJhLCAweDFlYTAwNGMxKSwgV1RDUCgweDdjM2MzODYwLCAweDFlZDBkMDlkKSwgV1RDUCgweDdjMzAxNGRlLCAweDFmMDE5N2I4KSwKKyAgV1RDUCgweDdjMjNkZTM1LCAweDFmMzI1YTBiKSwgV1RDUCgweDdjMTc5NDY3LCAweDFmNjMxNzhmKSwgV1RDUCgweDdjMGIzNzc3LCAweDFmOTNkMDNjKSwgV1RDUCgweDdiZmVjNzY1LCAweDFmYzQ4NDBhKSwKKyAgV1RDUCgweDdiZjI0NDM0LCAweDFmZjUzMmYyKSwgV1RDUCgweDdiZTVhZGU2LCAweDIwMjVkY2VjKSwgV1RDUCgweDdiZDkwNDdjLCAweDIwNTY4MWYxKSwgV1RDUCgweDdiY2M0N2ZhLCAweDIwODcyMWY5KSwKKyAgV1RDUCgweDdiYmY3ODYwLCAweDIwYjdiY2ZlKSwgV1RDUCgweDdiYjI5NWIwLCAweDIwZTg1MmY2KSwgV1RDUCgweDdiYTU5ZmVlLCAweDIxMThlM2RjKSwgV1RDUCgweDdiOTg5NzE5LCAweDIxNDk2ZmE3KSwKKyAgV1RDUCgweDdiOGI3YjM2LCAweDIxNzlmNjRmKSwgV1RDUCgweDdiN2U0YzQ1LCAweDIxYWE3N2NmKSwgV1RDUCgweDdiNzEwYTQ5LCAweDIxZGFmNDFkKSwgV1RDUCgweDdiNjNiNTQzLCAweDIyMGI2YjMyKSwKKyAgV1RDUCgweDdiNTY0ZDM2LCAweDIyM2JkZDA4KSwgV1RDUCgweDdiNDhkMjI1LCAweDIyNmM0OTk2KSwgV1RDUCgweDdiM2I0NDEwLCAweDIyOWNiMGQ1KSwgV1RDUCgweDdiMmRhMmZhLCAweDIyY2QxMmJkKSwKKyAgV1RDUCgweDdiMWZlZWU1LCAweDIyZmQ2ZjQ4KSwgV1RDUCgweDdiMTIyN2QzLCAweDIzMmRjNjZkKSwgV1RDUCgweDdiMDQ0ZGM3LCAweDIzNWUxODI2KSwgV1RDUCgweDdhZjY2MGMyLCAweDIzOGU2NDZhKSwKKyAgV1RDUCgweDdhZTg2MGM3LCAweDIzYmVhYjMzKSwgV1RDUCgweDdhZGE0ZGQ4LCAweDIzZWVlYzc4KSwgV1RDUCgweDdhY2MyN2Y3LCAweDI0MWYyODMzKSwgV1RDUCgweDdhYmRlZjI1LCAweDI0NGY1ZTVjKSwKKyAgV1RDUCgweDdhYWZhMzY3LCAweDI0N2Y4ZWVjKSwgV1RDUCgweDdhYTE0NGJjLCAweDI0YWZiOWRhKSwgV1RDUCgweDdhOTJkMzI5LCAweDI0ZGZkZjIwKSwgV1RDUCgweDdhODQ0ZWFlLCAweDI1MGZmZWI3KSwKKyAgV1RDUCgweDdhNzViNzRmLCAweDI1NDAxODk2KSwgV1RDUCgweDdhNjcwZDBkLCAweDI1NzAyY2I3KSwgV1RDUCgweDdhNTg0ZmViLCAweDI1YTAzYjExKSwgV1RDUCgweDdhNDk3ZmViLCAweDI1ZDA0MzlmKSwKKyAgV1RDUCgweDdhM2E5ZDBmLCAweDI2MDA0NjU3KSwgV1RDUCgweDdhMmJhNzVhLCAweDI2MzA0MzMzKSwgV1RDUCgweDdhMWM5ZWNlLCAweDI2NjAzYTJjKSwgV1RDUCgweDdhMGQ4MzZkLCAweDI2OTAyYjM5KSwKKyAgV1RDUCgweDc5ZmU1NTM5LCAweDI2YzAxNjU1KSwgV1RDUCgweDc5ZWYxNDM2LCAweDI2ZWZmYjc2KSwgV1RDUCgweDc5ZGZjMDY0LCAweDI3MWZkYTk2KSwgV1RDUCgweDc5ZDA1OWM4LCAweDI3NGZiM2FlKSwKKyAgV1RDUCgweDc5YzBlMDYyLCAweDI3N2Y4NmI1KSwgV1RDUCgweDc5YjE1NDM1LCAweDI3YWY1M2E2KSwgV1RDUCgweDc5YTFiNTQ1LCAweDI3ZGYxYTc3KSwgV1RDUCgweDc5OTIwMzkyLCAweDI4MGVkYjIzKSwKKyAgV1RDUCgweDc5ODIzZjIwLCAweDI4M2U5NWExKSwgV1RDUCgweDc5NzI2N2YyLCAweDI4NmU0OWVhKSwgV1RDUCgweDc5NjI3ZTA4LCAweDI4OWRmN2Y4KSwgV1RDUCgweDc5NTI4MTY3LCAweDI4Y2Q5ZmMxKSwKKyAgV1RDUCgweDc5NDI3MjEwLCAweDI4ZmQ0MTQwKSwgV1RDUCgweDc5MzI1MDA2LCAweDI5MmNkYzZkKSwgV1RDUCgweDc5MjIxYjRiLCAweDI5NWM3MTQwKSwgV1RDUCgweDc5MTFkM2UyLCAweDI5OGJmZmIyKSwKKyAgV1RDUCgweDc5MDE3OWNkLCAweDI5YmI4N2JjKSwgV1RDUCgweDc4ZjEwZDBmLCAweDI5ZWIwOTU3KSwgV1RDUCgweDc4ZTA4ZGFiLCAweDJhMWE4NDdiKSwgV1RDUCgweDc4Y2ZmYmEzLCAweDJhNDlmOTIwKSwKKyAgV1RDUCgweDc4YmY1NmY5LCAweDJhNzk2NzQwKSwgV1RDUCgweDc4YWU5ZmIwLCAweDJhYThjZWQzKSwgV1RDUCgweDc4OWRkNWNiLCAweDJhZDgyZmQyKSwgV1RDUCgweDc4OGNmOTRjLCAweDJiMDc4YTM2KSwKKyAgV1RDUCgweDc4N2MwYTM2LCAweDJiMzZkZGY3KSwgV1RDUCgweDc4NmIwODhjLCAweDJiNjYyYjBlKSwgV1RDUCgweDc4NTlmNDRmLCAweDJiOTU3MTczKSwgV1RDUCgweDc4NDhjZDgzLCAweDJiYzRiMTIwKSwKKyAgV1RDUCgweDc4Mzc5NDJiLCAweDJiZjNlYTBkKSwgV1RDUCgweDc4MjY0ODQ5LCAweDJjMjMxYzMzKSwgV1RDUCgweDc4MTRlOWRmLCAweDJjNTI0NzhhKSwgV1RDUCgweDc4MDM3OGYxLCAweDJjODE2YzBjKSwKKyAgV1RDUCgweDc3ZjFmNTgxLCAweDJjYjA4OWIxKSwgV1RDUCgweDc3ZTA1ZjkxLCAweDJjZGZhMDcxKSwgV1RDUCgweDc3Y2ViNzI1LCAweDJkMGViMDQ2KSwgV1RDUCgweDc3YmNmYzNmLCAweDJkM2RiOTI4KSwKKyAgV1RDUCgweDc3YWIyZWUyLCAweDJkNmNiYjEwKSwgV1RDUCgweDc3OTk0ZjExLCAweDJkOWJiNWY2KSwgV1RDUCgweDc3ODc1Y2NlLCAweDJkY2FhOWQ1KSwgV1RDUCgweDc3NzU1ODFkLCAweDJkZjk5NmEzKSwKKyAgV1RDUCgweDc3NjM0MGZmLCAweDJlMjg3YzVhKSwgV1RDUCgweDc3NTExNzc4LCAweDJlNTc1YWYzKSwgV1RDUCgweDc3M2VkYjhiLCAweDJlODYzMjY3KSwgV1RDUCgweDc3MmM4ZDNhLCAweDJlYjUwMmFlKSwKKyAgV1RDUCgweDc3MWEyYzg4LCAweDJlZTNjYmMxKSwgV1RDUCgweDc3MDdiOTc5LCAweDJmMTI4ZDk5KSwgV1RDUCgweDc2ZjUzNDBlLCAweDJmNDE0ODJlKSwgV1RDUCgweDc2ZTI5YzRiLCAweDJmNmZmYjdhKSwKKyAgV1RDUCgweDc2Y2ZmMjMyLCAweDJmOWVhNzc1KSwgV1RDUCgweDc2YmQzNWM3LCAweDJmY2Q0YzE5KSwgV1RDUCgweDc2YWE2NzBkLCAweDJmZmJlOTVkKSwgV1RDUCgweDc2OTc4NjA1LCAweDMwMmE3ZjNhKSwKKyAgV1RDUCgweDc2ODQ5MmI0LCAweDMwNTkwZGFiKSwgV1RDUCgweDc2NzE4ZDFjLCAweDMwODc5NGE2KSwgV1RDUCgweDc2NWU3NTQwLCAweDMwYjYxNDI2KSwgV1RDUCgweDc2NGI0YjIzLCAweDMwZTQ4YzIyKSwKKyAgV1RDUCgweDc2MzgwZWM4LCAweDMxMTJmYzk1KSwgV1RDUCgweDc2MjRjMDMxLCAweDMxNDE2NTc2KSwgV1RDUCgweDc2MTE1ZjYzLCAweDMxNmZjNmJlKSwgV1RDUCgweDc1ZmRlYzYwLCAweDMxOWUyMDY3KSwKKyAgV1RDUCgweDc1ZWE2NzJhLCAweDMxY2M3MjY5KSwgV1RDUCgweDc1ZDZjZmM1LCAweDMxZmFiY2JkKSwgV1RDUCgweDc1YzMyNjM0LCAweDMyMjhmZjVjKSwgV1RDUCgweDc1YWY2YTdiLCAweDMyNTczYTNmKSwKKyAgV1RDUCgweDc1OWI5YzliLCAweDMyODU2ZDVlKSwgV1RDUCgweDc1ODdiYzk4LCAweDMyYjM5OGIzKSwgV1RDUCgweDc1NzNjYTc1LCAweDMyZTFiYzM2KSwgV1RDUCgweDc1NWZjNjM1LCAweDMzMGZkN2UxKSwKKyAgV1RDUCgweDc1NGJhZmRjLCAweDMzM2RlYmFiKSwgV1RDUCgweDc1Mzc4NzZjLCAweDMzNmJmNzhmKSwgV1RDUCgweDc1MjM0Y2U4LCAweDMzOTlmYjg1KSwgV1RDUCgweDc1MGYwMDU0LCAweDMzYzdmNzg1KSwKKyAgV1RDUCgweDc0ZmFhMWIzLCAweDMzZjVlYjg5KSwgV1RDUCgweDc0ZTYzMTA4LCAweDM0MjNkNzhhKSwgV1RDUCgweDc0ZDFhZTU1LCAweDM0NTFiYjgxKSwgV1RDUCgweDc0YmQxOTlmLCAweDM0N2Y5NzY2KSwKKyAgV1RDUCgweDc0YTg3MmU4LCAweDM0YWQ2YjMyKSwgV1RDUCgweDc0OTNiYTM0LCAweDM0ZGIzNmRmKSwgV1RDUCgweDc0N2VlZjg1LCAweDM1MDhmYTY2KSwgV1RDUCgweDc0NmExMmRmLCAweDM1MzZiNWJlKSwKKyAgV1RDUCgweDc0NTUyNDQ2LCAweDM1NjQ2OGUyKSwgV1RDUCgweDc0NDAyM2JjLCAweDM1OTIxM2M5KSwgV1RDUCgweDc0MmIxMTQ0LCAweDM1YmZiNjZlKSwgV1RDUCgweDc0MTVlY2UyLCAweDM1ZWQ1MGM5KSwKKyAgV1RDUCgweDc0MDBiNjlhLCAweDM2MWFlMmQzKSwgV1RDUCgweDczZWI2ZTZlLCAweDM2NDg2Yzg2KSwgV1RDUCgweDczZDYxNDYxLCAweDM2NzVlZGQ5KSwgV1RDUCgweDczYzBhODc4LCAweDM2YTM2NmM2KSwKKyAgV1RDUCgweDczYWIyYWI0LCAweDM2ZDBkNzQ2KSwgV1RDUCgweDczOTU5YjFiLCAweDM2ZmUzZjUyKSwgV1RDUCgweDczN2ZmOWFlLCAweDM3MmI5ZWUzKSwgV1RDUCgweDczNmE0NjcxLCAweDM3NThmNWYyKSwKKyAgV1RDUCgweDczNTQ4MTY4LCAweDM3ODY0NDc3KSwgV1RDUCgweDczM2VhYTk2LCAweDM3YjM4YTZkKSwgV1RDUCgweDczMjhjMWZmLCAweDM3ZTBjN2NjKSwgV1RDUCgweDczMTJjN2E1LCAweDM4MGRmYzhkKSwKKyAgV1RDUCgweDcyZmNiYjhjLCAweDM4M2IyOGE5KSwgV1RDUCgweDcyZTY5ZGI3LCAweDM4Njg0YzE5KSwgV1RDUCgweDcyZDA2ZTJiLCAweDM4OTU2NmQ2KSwgV1RDUCgweDcyYmEyY2VhLCAweDM4YzI3OGQ5KSwKKyAgV1RDUCgweDcyYTNkOWY3LCAweDM4ZWY4MjFjKSwgV1RDUCgweDcyOGQ3NTU3LCAweDM5MWM4Mjk3KSwgV1RDUCgweDcyNzZmZjBkLCAweDM5NDk3YTQzKSwgV1RDUCgweDcyNjA3NzFiLCAweDM5NzY2OTE5KSwKKyAgV1RDUCgweDcyNDlkZDg2LCAweDM5YTM0ZjEzKSwgV1RDUCgweDcyMzMzMjUxLCAweDM5ZDAyYzJhKSwgV1RDUCgweDcyMWM3NTgwLCAweDM5ZmQwMDU2KSwgV1RDUCgweDcyMDVhNzE2LCAweDNhMjljYjkxKSwKKyAgV1RDUCgweDcxZWVjNzE2LCAweDNhNTY4ZGQ0KSwgV1RDUCgweDcxZDdkNTg1LCAweDNhODM0NzE3KSwgV1RDUCgweDcxYzBkMjY1LCAweDNhYWZmNzU1KSwgV1RDUCgweDcxYTliZGJhLCAweDNhZGM5ZTg2KSwKKyAgV1RDUCgweDcxOTI5Nzg5LCAweDNiMDkzY2EzKSwgV1RDUCgweDcxN2I1ZmQzLCAweDNiMzVkMWE1KSwgV1RDUCgweDcxNjQxNjlkLCAweDNiNjI1ZDg2KSwgV1RDUCgweDcxNGNiYmViLCAweDNiOGVlMDNlKSwKKyAgV1RDUCgweDcxMzU0ZmMwLCAweDNiYmI1OWM3KSwgV1RDUCgweDcxMWRkMjIwLCAweDNiZTdjYTFhKSwgV1RDUCgweDcxMDY0MzBlLCAweDNjMTQzMTMwKSwgV1RDUCgweDcwZWVhMjhlLCAweDNjNDA4ZjAzKSwKKyAgV1RDUCgweDcwZDZmMGE0LCAweDNjNmNlMzhhKSwgV1RDUCgweDcwYmYyZDUzLCAweDNjOTkyZWMwKSwgV1RDUCgweDcwYTc1ODlmLCAweDNjYzU3MDllKSwgV1RDUCgweDcwOGY3MjhiLCAweDNjZjFhOTFjKSwKKyAgV1RDUCgweDcwNzc3YjFjLCAweDNkMWRkODM1KSwgV1RDUCgweDcwNWY3MjU1LCAweDNkNDlmZGUxKSwgV1RDUCgweDcwNDc1ODM5LCAweDNkNzYxYTE5KSwgV1RDUCgweDcwMmYyY2NkLCAweDNkYTIyY2Q3KSwKKyAgV1RDUCgweDcwMTZmMDE0LCAweDNkY2UzNjE0KSwgV1RDUCgweDZmZmVhMjEyLCAweDNkZmEzNWM4KSwgV1RDUCgweDZmZTY0MmNhLCAweDNlMjYyYmVlKSwgV1RDUCgweDZmY2RkMjQxLCAweDNlNTIxODdmKSwKKyAgV1RDUCgweDZmYjU1MDdhLCAweDNlN2RmYjczKSwgV1RDUCgweDZmOWNiZDc5LCAweDNlYTlkNGMzKSwgV1RDUCgweDZmODQxOTQyLCAweDNlZDVhNDZiKSwgV1RDUCgweDZmNmI2M2Q4LCAweDNmMDE2YTYxKSwKKyAgV1RDUCgweDZmNTI5ZDQwLCAweDNmMmQyNmEwKSwgV1RDUCgweDZmMzljNTdkLCAweDNmNThkOTIxKSwgV1RDUCgweDZmMjBkYzkyLCAweDNmODQ4MWRkKSwgV1RDUCgweDZmMDdlMjg1LCAweDNmYjAyMGNlKSwKKyAgV1RDUCgweDZlZWVkNzU4LCAweDNmZGJiNWVjKSwgV1RDUCgweDZlZDViYjEwLCAweDQwMDc0MTMyKSwgV1RDUCgweDZlYmM4ZGIwLCAweDQwMzJjMjk3KSwgV1RDUCgweDZlYTM0ZjNkLCAweDQwNWUzYTE2KSwKKyAgV1RDUCgweDZlODlmZmI5LCAweDQwODlhN2E4KSwgV1RDUCgweDZlNzA5ZjJhLCAweDQwYjUwYjQ2KSwgV1RDUCgweDZlNTcyZDkzLCAweDQwZTA2NGVhKSwgV1RDUCgweDZlM2RhYWY4LCAweDQxMGJiNDhjKSwKKyAgV1RDUCgweDZlMjQxNzVjLCAweDQxMzZmYTI3KSwgV1RDUCgweDZlMGE3MmM1LCAweDQxNjIzNWIyKSwgV1RDUCgweDZkZjBiZDM1LCAweDQxOGQ2NzI5KSwgV1RDUCgweDZkZDZmNmIxLCAweDQxYjg4ZTg0KSwKKyAgV1RDUCgweDZkYmQxZjNjLCAweDQxZTNhYmJjKSwgV1RDUCgweDZkYTMzNmRjLCAweDQyMGViZWNiKSwgV1RDUCgweDZkODkzZDkzLCAweDQyMzljN2FhKSwgV1RDUCgweDZkNmYzMzY1LCAweDQyNjRjNjUzKSwKKyAgV1RDUCgweDZkNTUxODU4LCAweDQyOGZiYWJlKSwgV1RDUCgweDZkM2FlYzZlLCAweDQyYmFhNGU2KSwgV1RDUCgweDZkMjBhZmFjLCAweDQyZTU4NGMzKSwgV1RDUCgweDZkMDY2MjE1LCAweDQzMTA1YTUwKSwKKyAgV1RDUCgweDZjZWMwM2FmLCAweDQzM2IyNTg1KSwgV1RDUCgweDZjZDE5NDdjLCAweDQzNjVlNjViKSwgV1RDUCgweDZjYjcxNDgyLCAweDQzOTA5Y2NkKSwgV1RDUCgweDZjOWM4M2MzLCAweDQzYmI0OGQ0KSwKKyAgV1RDUCgweDZjODFlMjQ1LCAweDQzZTVlYTY4KSwgV1RDUCgweDZjNjczMDBiLCAweDQ0MTA4MTg0KSwgV1RDUCgweDZjNGM2ZDFhLCAweDQ0M2IwZTIxKSwgV1RDUCgweDZjMzE5OTc1LCAweDQ0NjU5MDM5KSwKKyAgV1RDUCgweDZjMTZiNTIxLCAweDQ0OTAwN2M0KSwgV1RDUCgweDZiZmJjMDIxLCAweDQ0YmE3NGJkKSwgV1RDUCgweDZiZTBiYTdiLCAweDQ0ZTRkNzFjKSwgV1RDUCgweDZiYzVhNDMxLCAweDQ1MGYyZWRiKSwKKyAgV1RDUCgweDZiYWE3ZDQ5LCAweDQ1Mzk3YmY0KSwgV1RDUCgweDZiOGY0NWM3LCAweDQ1NjNiZTYwKSwgV1RDUCgweDZiNzNmZGFlLCAweDQ1OGRmNjE5KSwgV1RDUCgweDZiNThhNTAzLCAweDQ1YjgyMzE4KSwKKyAgV1RDUCgweDZiM2QzYmNiLCAweDQ1ZTI0NTU2KSwgV1RDUCgweDZiMjFjMjA4LCAweDQ2MGM1Y2NlKSwgV1RDUCgweDZiMDYzN2MxLCAweDQ2MzY2OTc4KSwgV1RDUCgweDZhZWE5Y2Y4LCAweDQ2NjA2YjRlKSwKKyAgV1RDUCgweDZhY2VmMWIyLCAweDQ2OGE2MjRhKSwgV1RDUCgweDZhYjMzNWY0LCAweDQ2YjQ0ZTY1KSwgV1RDUCgweDZhOTc2OWMxLCAweDQ2ZGUyZjk5KSwgV1RDUCgweDZhN2I4ZDFlLCAweDQ3MDgwNWRmKSwKKyAgV1RDUCgweDZhNWZhMDEwLCAweDQ3MzFkMTMxKSwgV1RDUCgweDZhNDNhMjlhLCAweDQ3NWI5MTg4KSwgV1RDUCgweDZhMjc5NGMxLCAweDQ3ODU0NmRlKSwgV1RDUCgweDZhMGI3Njg5LCAweDQ3YWVmMTJjKSwKKyAgV1RDUCgweDY5ZWY0N2Y2LCAweDQ3ZDg5MDZkKSwgV1RDUCgweDY5ZDMwOTBlLCAweDQ4MDIyNDk5KSwgV1RDUCgweDY5YjZiOWQzLCAweDQ4MmJhZGFiKSwgV1RDUCgweDY5OWE1YTRjLCAweDQ4NTUyYjliKSwKKyAgV1RDUCgweDY5N2RlYTdiLCAweDQ4N2U5ZTY0KSwgV1RDUCgweDY5NjE2YTY1LCAweDQ4YTgwNWZmKSwgV1RDUCgweDY5NDRkYTEwLCAweDQ4ZDE2MjY1KSwgV1RDUCgweDY5MjgzOTdlLCAweDQ4ZmFiMzkxKSwKKyAgV1RDUCgweDY5MGI4OGI1LCAweDQ5MjNmOTdiKSwgV1RDUCgweDY4ZWVjN2I5LCAweDQ5NGQzNDFlKSwgV1RDUCgweDY4ZDFmNjhmLCAweDQ5NzY2MzczKSwgV1RDUCgweDY4YjUxNTNhLCAweDQ5OWY4Nzc0KSwKKyAgV1RDUCgweDY4OTgyM2JmLCAweDQ5YzhhMDFiKSwgV1RDUCgweDY4N2IyMjI0LCAweDQ5ZjFhZDYxKSwgV1RDUCgweDY4NWUxMDZjLCAweDRhMWFhZjNmKSwgV1RDUCgweDY4NDBlZTliLCAweDRhNDNhNWIwKSwKKyAgV1RDUCgweDY4MjNiY2I3LCAweDRhNmM5MGFkKSwgV1RDUCgweDY4MDY3YWMzLCAweDRhOTU3MDMwKSwgV1RDUCgweDY3ZTkyOGM1LCAweDRhYmU0NDMzKSwgV1RDUCgweDY3Y2JjNmMwLCAweDRhZTcwY2FmKSwKKyAgV1RDUCgweDY3YWU1NGJhLCAweDRiMGZjOTlkKSwgV1RDUCgweDY3OTBkMmI2LCAweDRiMzg3YWY5KSwgV1RDUCgweDY3NzM0MGJhLCAweDRiNjEyMGJiKSwgV1RDUCgweDY3NTU5ZWNhLCAweDRiODliYWRkKSwKKyAgV1RDUCgweDY3MzdlY2VhLCAweDRiYjI0OTU4KSwgV1RDUCgweDY3MWEyYjIwLCAweDRiZGFjYzI4KSwgV1RDUCgweDY2ZmM1OTZmLCAweDRjMDM0MzQ1KSwgV1RDUCgweDY2ZGU3N2RjLCAweDRjMmJhZWE5KSwKKyAgV1RDUCgweDY2YzA4NjZkLCAweDRjNTQwZTRlKSwgV1RDUCgweDY2YTI4NTI0LCAweDRjN2M2MjJkKSwgV1RDUCgweDY2ODQ3NDA4LCAweDRjYTRhYTQxKSwgV1RDUCgweDY2NjY1MzFkLCAweDRjY2NlNjg0KSwKKyAgV1RDUCgweDY2NDgyMjY3LCAweDRjZjUxNmVlKSwgV1RDUCgweDY2MjllMWVjLCAweDRkMWQzYjdhKSwgV1RDUCgweDY2MGI5MWFmLCAweDRkNDU1NDIyKSwgV1RDUCgweDY1ZWQzMWI1LCAweDRkNmQ2MGRmKSwKKyAgV1RDUCgweDY1Y2VjMjA0LCAweDRkOTU2MWFjKSwgV1RDUCgweDY1YjA0MjlmLCAweDRkYmQ1NjgyKSwgV1RDUCgweDY1OTFiMzhjLCAweDRkZTUzZjVhKSwgV1RDUCgweDY1NzMxNGNmLCAweDRlMGQxYzMwKSwKKyAgV1RDUCgweDY1NTQ2NjZkLCAweDRlMzRlY2ZjKSwgV1RDUCgweDY1MzVhODZiLCAweDRlNWNiMWI5KSwgV1RDUCgweDY1MTZkYWNkLCAweDRlODQ2YTYwKSwgV1RDUCgweDY0ZjdmZDk4LCAweDRlYWMxNmViKSwKKyAgV1RDUCgweDY0ZDkxMGQxLCAweDRlZDNiNzU1KSwgV1RDUCgweDY0YmExNDdkLCAweDRlZmI0Yjk2KSwgV1RDUCgweDY0OWIwOGEwLCAweDRmMjJkM2FhKSwgV1RDUCgweDY0N2JlZDNmLCAweDRmNGE0Zjg5KSwKKyAgV1RDUCgweDY0NWNjMjYwLCAweDRmNzFiZjJlKSwgV1RDUCgweDY0M2Q4ODA2LCAweDRmOTkyMjkzKSwgV1RDUCgweDY0MWUzZTM4LCAweDRmYzA3OWIxKSwgV1RDUCgweDYzZmVlNGY4LCAweDRmZTdjNDgzKSwKKyAgV1RDUCgweDYzZGY3YzRkLCAweDUwMGYwMzAyKSwgV1RDUCgweDYzYzAwNDNiLCAweDUwMzYzNTI5KSwgV1RDUCgweDYzYTA3Y2M3LCAweDUwNWQ1YWYxKSwgV1RDUCgweDYzODBlNWY2LCAweDUwODQ3NDU0KSwKKyAgV1RDUCgweDYzNjEzZmNkLCAweDUwYWI4MTRkKSwgV1RDUCgweDYzNDE4YTUwLCAweDUwZDI4MWQ1KSwgV1RDUCgweDYzMjFjNTg1LCAweDUwZjk3NWU2KSwgV1RDUCgweDYzMDFmMTcxLCAweDUxMjA1ZDdiKSwKKyAgV1RDUCgweDYyZTIwZTE3LCAweDUxNDczODhjKSwgV1RDUCgweDYyYzIxYjdlLCAweDUxNmUwNzE1KSwgV1RDUCgweDYyYTIxOWFhLCAweDUxOTRjOTEwKSwgV1RDUCgweDYyODIwOGExLCAweDUxYmI3ZTc1KSwKKyAgV1RDUCgweDYyNjFlODY2LCAweDUxZTIyNzQwKSwgV1RDUCgweDYyNDFiOGZmLCAweDUyMDhjMzZhKSwgV1RDUCgweDYyMjE3YTcyLCAweDUyMmY1MmVlKSwgV1RDUCgweDYyMDEyY2MyLCAweDUyNTVkNWM1KSwKKyAgV1RDUCgweDYxZTBjZmY1LCAweDUyN2M0YmVhKSwgV1RDUCgweDYxYzA2NDEwLCAweDUyYTJiNTU2KSwgV1RDUCgweDYxOWZlOTE4LCAweDUyYzkxMjA0KSwgV1RDUCgweDYxN2Y1ZjEyLCAweDUyZWY2MWVlKSwKKyAgV1RDUCgweDYxNWVjNjAzLCAweDUzMTVhNTBlKSwgV1RDUCgweDYxM2UxZGYwLCAweDUzM2JkYjVkKSwgV1RDUCgweDYxMWQ2NmRlLCAweDUzNjIwNGQ3KSwgV1RDUCgweDYwZmNhMGQyLCAweDUzODgyMTc1KSwKKyAgV1RDUCgweDYwZGJjYmQxLCAweDUzYWUzMTMxKSwgV1RDUCgweDYwYmFlN2UxLCAweDUzZDQzNDA2KSwgV1RDUCgweDYwOTlmNTA1LCAweDUzZmEyOWVkKSwgV1RDUCgweDYwNzhmMzQ0LCAweDU0MjAxMmUxKSwKKyAgV1RDUCgweDYwNTdlMmEyLCAweDU0NDVlZWRiKSwgV1RDUCgweDYwMzZjMzI1LCAweDU0NmJiZGQ3KSwgV1RDUCgweDYwMTU5NGQxLCAweDU0OTE3ZmNlKSwgV1RDUCgweDVmZjQ1N2FkLCAweDU0YjczNGJhKSwKKyAgV1RDUCgweDVmZDMwYmJjLCAweDU0ZGNkYzk2KSwgV1RDUCgweDVmYjFiMTA0LCAweDU1MDI3NzVjKSwgV1RDUCgweDVmOTA0NzhhLCAweDU1MjgwNTA1KSwgV1RDUCgweDVmNmVjZjUzLCAweDU1NGQ4NThkKSwKKyAgV1RDUCgweDVmNGQ0ODY1LCAweDU1NzJmOGVkKSwgV1RDUCgweDVmMmJiMmM1LCAweDU1OTg1ZjIwKSwgV1RDUCgweDVmMGEwZTc3LCAweDU1YmRiODFmKSwgV1RDUCgweDVlZTg1YjgyLCAweDU1ZTMwM2U2KSwKKyAgV1RDUCgweDVlYzY5OWU5LCAweDU2MDg0MjZlKSwgV1RDUCgweDVlYTRjOWIzLCAweDU2MmQ3M2IyKSwgV1RDUCgweDVlODJlYWU1LCAweDU2NTI5N2FiKSwgV1RDUCgweDVlNjBmZDg0LCAweDU2NzdhZTU0KSwKKyAgV1RDUCgweDVlM2YwMTk0LCAweDU2OWNiN2E4KSwgV1RDUCgweDVlMWNmNzFjLCAweDU2YzFiM2ExKSwgV1RDUCgweDVkZmFkZTIwLCAweDU2ZTZhMjM5KSwgV1RDUCgweDVkZDhiNmE3LCAweDU3MGI4MzY5KSwKKyAgV1RDUCgweDVkYjY4MGI0LCAweDU3MzA1NzJlKSwgV1RDUCgweDVkOTQzYzRlLCAweDU3NTUxZDgwKSwgV1RDUCgweDVkNzFlOTc5LCAweDU3NzlkNjViKSwgV1RDUCgweDVkNGY4ODNiLCAweDU3OWU4MWI4KSwKKyAgV1RDUCgweDVkMmQxODlhLCAweDU3YzMxZjkyKSwgV1RDUCgweDVkMGE5YTlhLCAweDU3ZTdhZmU0KSwgV1RDUCgweDVjZTgwZTQxLCAweDU4MGMzMmE3KSwgV1RDUCgweDVjYzU3Mzk0LCAweDU4MzBhN2Q2KSwKKyAgV1RDUCgweDVjYTJjYTk5LCAweDU4NTUwZjZjKSwgV1RDUCgweDVjODAxMzU0LCAweDU4Nzk2OTYyKSwgV1RDUCgweDVjNWQ0ZGNjLCAweDU4OWRiNWIzKSwgV1RDUCgweDVjM2E3YTA1LCAweDU4YzFmNDViKSwKKyAgV1RDUCgweDVjMTc5ODA2LCAweDU4ZTYyNTUyKSwgV1RDUCgweDViZjRhN2QyLCAweDU5MGE0ODkzKSwgV1RDUCgweDViZDFhOTcxLCAweDU5MmU1ZTE5KSwgV1RDUCgweDViYWU5Y2U3LCAweDU5NTI2NWRmKSwKKyAgV1RDUCgweDViOGI4MjM5LCAweDU5NzY1ZmRlKSwgV1RDUCgweDViNjg1OTZkLCAweDU5OWE0YzEyKSwgV1RDUCgweDViNDUyMjg4LCAweDU5YmUyYTc0KSwgV1RDUCgweDViMjFkZDkwLCAweDU5ZTFmYWZmKSwKKyAgV1RDUCgweDVhZmU4YThiLCAweDVhMDViZGFlKSwgV1RDUCgweDVhZGIyOTdkLCAweDVhMjk3MjdiKSwgV1RDUCgweDVhYjdiYTZjLCAweDVhNGQxOTYwKSwgV1RDUCgweDVhOTQzZDVlLCAweDVhNzBiMjU4KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMDI0W10gPQoreworICBXVENQKDB4N2ZmZmZmYTQsIDB4MDAwOTk2MmYpLCBXVENQKDB4N2ZmZmZmMzksIDB4MDAwZTE2ZmIpLCBXVENQKDB4N2ZmZmZlYmYsIDB4MDAxMWVhNjUpLCBXVENQKDB4N2ZmZmZlMzQsIDB4MDAxNTc1MGUpLAorICBXVENQKDB4N2ZmZmZkOTYsIDB4MDAxOGRjNzQpLCBXVENQKDB4N2ZmZmZjZTUsIDB4MDAxYzMzMmUpLCBXVENQKDB4N2ZmZmZjMWYsIDB4MDAxZjgzZjUpLCBXVENQKDB4N2ZmZmZiNDMsIDB4MDAyMmQ1OWEpLAorICBXVENQKDB4N2ZmZmZhNGYsIDB4MDAyNjJjYzIpLCBXVENQKDB4N2ZmZmY5NDIsIDB4MDAyOThjYzQpLCBXVENQKDB4N2ZmZmY4MWEsIDB4MDAyY2Y4MWYpLCBXVENQKDB4N2ZmZmY2ZDYsIDB4MDAzMDcwYzQpLAorICBXVENQKDB4N2ZmZmY1NzMsIDB4MDAzM2Y4NDApLCBXVENQKDB4N2ZmZmYzZjEsIDB4MDAzNzhmZDkpLCBXVENQKDB4N2ZmZmYyNGQsIDB4MDAzYjM4YTEpLCBXVENQKDB4N2ZmZmYwODUsIDB4MDAzZWYzODEpLAorICBXVENQKDB4N2ZmZmVlOTgsIDB4MDA0MmMxNDcpLCBXVENQKDB4N2ZmZmVjODMsIDB4MDA0NmEyYTgpLCBXVENQKDB4N2ZmZmVhNDQsIDB4MDA0YTk4NDcpLCBXVENQKDB4N2ZmZmU3ZDgsIDB4MDA0ZWEyYjcpLAorICBXVENQKDB4N2ZmZmU1M2YsIDB4MDA1MmMyODMpLCBXVENQKDB4N2ZmZmUyNzQsIDB4MDA1NmY4MjkpLCBXVENQKDB4N2ZmZmRmNzYsIDB4MDA1YjQ0MjIpLCBXVENQKDB4N2ZmZmRjNDMsIDB4MDA1ZmE2ZGQpLAorICBXVENQKDB4N2ZmZmQ4ZDYsIDB4MDA2NDIwYzgpLCBXVENQKDB4N2ZmZmQ1MmYsIDB4MDA2OGIyNDkpLCBXVENQKDB4N2ZmZmQxNDksIDB4MDA2ZDViYzQpLCBXVENQKDB4N2ZmZmNkMjIsIDB4MDA3MjFkOWEpLAorICBXVENQKDB4N2ZmZmM4YjYsIDB4MDA3NmY4MjgpLCBXVENQKDB4N2ZmZmM0MDQsIDB4MDA3YmViY2EpLCBXVENQKDB4N2ZmZmJmMDYsIDB4MDA4MGY4ZDkpLCBXVENQKDB4N2ZmZmI5YmIsIDB4MDA4NjFmYWUpLAorICBXVENQKDB4N2ZmZmI0MWUsIDB4MDA4YjYwOWUpLCBXVENQKDB4N2ZmZmFlMmMsIDB4MDA5MGJiZmYpLCBXVENQKDB4N2ZmZmE3ZTEsIDB4MDA5NjMyMjQpLCBXVENQKDB4N2ZmZmExM2EsIDB4MDA5YmMzNjIpLAorICBXVENQKDB4N2ZmZjlhMzIsIDB4MDBhMTcwMDkpLCBXVENQKDB4N2ZmZjkyYzUsIDB4MDBhNzM4NmMpLCBXVENQKDB4N2ZmZjhhZjAsIDB4MDBhZDFjZGMpLCBXVENQKDB4N2ZmZjgyYWQsIDB4MDBiMzFkYTgpLAorICBXVENQKDB4N2ZmZjc5ZjksIDB4MDBiOTNiMjEpLCBXVENQKDB4N2ZmZjcwY2YsIDB4MDBiZjc1OTYpLCBXVENQKDB4N2ZmZjY3MmEsIDB4MDBjNWNkNTcpLCBXVENQKDB4N2ZmZjVkMDUsIDB4MDBjYzQyYjEpLAorICBXVENQKDB4N2ZmZjUyNWMsIDB4MDBkMmQ1ZjMpLCBXVENQKDB4N2ZmZjQ3MjksIDB4MDBkOTg3NmMpLCBXVENQKDB4N2ZmZjNiNjYsIDB4MDBlMDU3NjkpLCBXVENQKDB4N2ZmZjJmMTAsIDB4MDBlNzQ2MzgpLAorICBXVENQKDB4N2ZmZjIyMWYsIDB4MDBlZTU0MjYpLCBXVENQKDB4N2ZmZjE0OGUsIDB4MDBmNTgxODIpLCBXVENQKDB4N2ZmZjA2NTgsIDB4MDBmY2NlOTcpLCBXVENQKDB4N2ZmZWY3NzYsIDB4MDEwNDNiYjMpLAorICBXVENQKDB4N2ZmZWU3ZTIsIDB4MDEwYmM5MjMpLCBXVENQKDB4N2ZmZWQ3OTUsIDB4MDExMzc3MzMpLCBXVENQKDB4N2ZmZWM2OGEsIDB4MDExYjQ2MzEpLCBXVENQKDB4N2ZmZWI0YmEsIDB4MDEyMzM2NjkpLAorICBXVENQKDB4N2ZmZWEyMWQsIDB4MDEyYjQ4MjcpLCBXVENQKDB4N2ZmZThlYWMsIDB4MDEzMzdiYjgpLCBXVENQKDB4N2ZmZTdhNjEsIDB4MDEzYmQxNjcpLCBXVENQKDB4N2ZmZTY1MzMsIDB4MDE0NDQ5ODIpLAorICBXVENQKDB4N2ZmZTRmMWMsIDB4MDE0Y2U0NTQpLCBXVENQKDB4N2ZmZTM4MTMsIDB4MDE1NWEyMjkpLCBXVENQKDB4N2ZmZTIwMTEsIDB4MDE1ZTgzNGQpLCBXVENQKDB4N2ZmZTA3MGQsIDB4MDE2Nzg4MGMpLAorICBXVENQKDB4N2ZmZGVjZmYsIDB4MDE3MGIwYjIpLCBXVENQKDB4N2ZmZGQxZGYsIDB4MDE3OWZkOGIpLCBXVENQKDB4N2ZmZGI1YTIsIDB4MDE4MzZlZTEpLCBXVENQKDB4N2ZmZDk4NDIsIDB4MDE4ZDA1MDApLAorICBXVENQKDB4N2ZmZDc5YjMsIDB4MDE5NmMwMzUpLCBXVENQKDB4N2ZmZDU5ZWUsIDB4MDFhMGEwY2EpLCBXVENQKDB4N2ZmZDM4ZTgsIDB4MDFhYWE3MGEpLCBXVENQKDB4N2ZmZDE2OTcsIDB4MDFiNGQzNDEpLAorICBXVENQKDB4N2ZmY2YyZjIsIDB4MDFiZjI1YjkpLCBXVENQKDB4N2ZmY2NkZWUsIDB4MDFjOTllYmQpLCBXVENQKDB4N2ZmY2E3ODAsIDB4MDFkNDNlOTkpLCBXVENQKDB4N2ZmYzdmOWUsIDB4MDFkZjA1OTcpLAorICBXVENQKDB4N2ZmYzU2M2QsIDB4MDFlOWY0MDEpLCBXVENQKDB4N2ZmYzJiNTEsIDB4MDFmNTBhMjIpLCBXVENQKDB4N2ZmYmZlY2YsIDB4MDIwMDQ4NDQpLCBXVENQKDB4N2ZmYmQwYWIsIDB4MDIwYmFlYjEpLAorICBXVENQKDB4N2ZmYmEwZGEsIDB4MDIxNzNkYjQpLCBXVENQKDB4N2ZmYjZmNGYsIDB4MDIyMmY1OTYpLCBXVENQKDB4N2ZmYjNiZmQsIDB4MDIyZWQ2YTEpLCBXVENQKDB4N2ZmYjA2ZDgsIDB4MDIzYWUxMWYpLAorICBXVENQKDB4N2ZmYWNmZDMsIDB4MDI0NzE1NTgpLCBXVENQKDB4N2ZmYTk2ZTAsIDB4MDI1MzczOTcpLCBXVENQKDB4N2ZmYTViZjIsIDB4MDI1ZmZjMjUpLCBXVENQKDB4N2ZmYTFlZmMsIDB4MDI2Y2FmNGEpLAorICBXVENQKDB4N2ZmOWRmZWUsIDB4MDI3OThkNGYpLCBXVENQKDB4N2ZmOTllYmIsIDB4MDI4Njk2N2MpLCBXVENQKDB4N2ZmOTViNTUsIDB4MDI5M2NiMWIpLCBXVENQKDB4N2ZmOTE1YWIsIDB4MDJhMTJiNzIpLAorICBXVENQKDB4N2ZmOGNkYWYsIDB4MDJhZWI3Y2IpLCBXVENQKDB4N2ZmODgzNTEsIDB4MDJiYzcwNmQpLCBXVENQKDB4N2ZmODM2ODIsIDB4MDJjYTU1OWYpLCBXVENQKDB4N2ZmN2U3MzEsIDB4MDJkODY3YTkpLAorICBXVENQKDB4N2ZmNzk1NGUsIDB4MDJlNmE2ZDIpLCBXVENQKDB4N2ZmNzQwYzgsIDB4MDJmNTEzNjEpLCBXVENQKDB4N2ZmNmU5OGUsIDB4MDMwM2FkOWMpLCBXVENQKDB4N2ZmNjhmOGYsIDB4MDMxMjc1Y2EpLAorICBXVENQKDB4N2ZmNjMyYmEsIDB4MDMyMTZjMzApLCBXVENQKDB4N2ZmNWQyZmIsIDB4MDMzMDkxMTYpLCBXVENQKDB4N2ZmNTcwNDIsIDB4MDMzZmU0YmYpLCBXVENQKDB4N2ZmNTBhN2EsIDB4MDM0ZjY3NzMpLAorICBXVENQKDB4N2ZmNGExOTIsIDB4MDM1ZjE5NzUpLCBXVENQKDB4N2ZmNDM1NzYsIDB4MDM2ZWZiMGEpLCBXVENQKDB4N2ZmM2M2MTIsIDB4MDM3ZjBjNzgpLCBXVENQKDB4N2ZmMzUzNTMsIDB4MDM4ZjRlMDIpLAorICBXVENQKDB4N2ZmMmRkMjQsIDB4MDM5ZmJmZWIpLCBXVENQKDB4N2ZmMjYzNzAsIDB4MDNiMDYyNzkpLCBXVENQKDB4N2ZmMWU2MjMsIDB4MDNjMTM1ZWQpLCBXVENQKDB4N2ZmMTY1MjcsIDB4MDNkMjNhOGIpLAorICBXVENQKDB4N2ZmMGUwNjcsIDB4MDNlMzcwOTUpLCBXVENQKDB4N2ZmMDU3Y2MsIDB4MDNmNGQ4NGUpLCBXVENQKDB4N2ZlZmNiNDAsIDB4MDQwNjcxZjcpLCBXVENQKDB4N2ZlZjNhYWQsIDB4MDQxODNkZDMpLAorICBXVENQKDB4N2ZlZWE1ZmEsIDB4MDQyYTNjMjIpLCBXVENQKDB4N2ZlZTBkMTEsIDB4MDQzYzZkMjUpLCBXVENQKDB4N2ZlZDZmZGEsIDB4MDQ0ZWQxMWQpLCBXVENQKDB4N2ZlY2NlM2QsIDB4MDQ2MTY4NDkpLAorICBXVENQKDB4N2ZlYzI4MjEsIDB4MDQ3NDMyZWIpLCBXVENQKDB4N2ZlYjdkNmMsIDB4MDQ4NzMxNDApLCBXVENQKDB4N2ZlYWNlMDcsIDB4MDQ5YTYzODgpLCBXVENQKDB4N2ZlYTE5ZDYsIDB4MDRhZGNhMDEpLAorICBXVENQKDB4N2ZlOTYwYzAsIDB4MDRjMTY0ZWEpLCBXVENQKDB4N2ZlOGEyYWEsIDB4MDRkNTM0ODEpLCBXVENQKDB4N2ZlN2RmNzksIDB4MDRlOTM5MDIpLCBXVENQKDB4N2ZlNzE3MTIsIDB4MDRmZDcyYWEpLAorICBXVENQKDB4N2ZlNjQ5NWEsIDB4MDUxMWUxYjYpLCBXVENQKDB4N2ZlNTc2MzQsIDB4MDUyNjg2NjMpLCBXVENQKDB4N2ZlNDlkODMsIDB4MDUzYjYwZWIpLCBXVENQKDB4N2ZlM2JmMmIsIDB4MDU1MDcxODkpLAorICBXVENQKDB4N2ZlMmRiMGYsIDB4MDU2NWI4NzkpLCBXVENQKDB4N2ZlMWYxMTAsIDB4MDU3YjM1ZjQpLCBXVENQKDB4N2ZlMTAxMTEsIDB4MDU5MGVhMzUpLCBXVENQKDB4N2ZlMDBhZjMsIDB4MDVhNmQ1NzQpLAorICBXVENQKDB4N2ZkZjBlOTcsIDB4MDViY2Y3ZWEpLCBXVENQKDB4N2ZkZTBiZGQsIDB4MDVkMzUxY2YpLCBXVENQKDB4N2ZkZDAyYTYsIDB4MDVlOWUzNWMpLCBXVENQKDB4N2ZkYmYyZDIsIDB4MDYwMGFjYzgpLAorICBXVENQKDB4N2ZkYWRjNDAsIDB4MDYxN2FlNDgpLCBXVENQKDB4N2ZkOWJlY2YsIDB4MDYyZWU4MTQpLCBXVENQKDB4N2ZkODlhNWUsIDB4MDY0NjVhNjIpLCBXVENQKDB4N2ZkNzZlY2EsIDB4MDY1ZTA1NjUpLAorICBXVENQKDB4N2ZkNjNiZjEsIDB4MDY3NWU5NTQpLCBXVENQKDB4N2ZkNTAxYjAsIDB4MDY4ZTA2NjIpLCBXVENQKDB4N2ZkM2JmZTQsIDB4MDZhNjVjYzMpLCBXVENQKDB4N2ZkMjc2NmEsIDB4MDZiZWVjYWEpLAorICBXVENQKDB4N2ZkMTI1MWUsIDB4MDZkN2I2NDgpLCBXVENQKDB4N2ZjZmNiZGEsIDB4MDZmMGI5ZDEpLCBXVENQKDB4N2ZjZTZhN2EsIDB4MDcwOWY3NzUpLCBXVENQKDB4N2ZjZDAwZDgsIDB4MDcyMzZmNjUpLAorICBXVENQKDB4N2ZjYjhlY2YsIDB4MDczZDIxZDIpLCBXVENQKDB4N2ZjYTE0MzksIDB4MDc1NzBlZWEpLCBXVENQKDB4N2ZjODkwZWQsIDB4MDc3MTM2ZGQpLCBXVENQKDB4N2ZjNzA0YzcsIDB4MDc4Yjk5ZGEpLAorICBXVENQKDB4N2ZjNTZmOWQsIDB4MDdhNjM4MGQpLCBXVENQKDB4N2ZjM2QxNDcsIDB4MDdjMTExYTQpLCBXVENQKDB4N2ZjMjI5OWUsIDB4MDdkYzI2Y2MpLCBXVENQKDB4N2ZjMDc4NzgsIDB4MDdmNzc3YjEpLAorICBXVENQKDB4N2ZiZWJkYWMsIDB4MDgxMzA0N2QpLCBXVENQKDB4N2ZiY2Y5MGYsIDB4MDgyZWNkNWIpLCBXVENQKDB4N2ZiYjJhNzgsIDB4MDg0YWQyNzYpLCBXVENQKDB4N2ZiOTUxYmMsIDB4MDg2NzEzZjcpLAorICBXVENQKDB4N2ZiNzZlYWYsIDB4MDg4MzkyMDYpLCBXVENQKDB4N2ZiNTgxMjYsIDB4MDhhMDRjY2IpLCBXVENQKDB4N2ZiMzg4ZjQsIDB4MDhiZDQ0NmUpLCBXVENQKDB4N2ZiMTg1ZWUsIDB4MDhkYTc5MTUpLAorICBXVENQKDB4N2ZhZjc3ZTUsIDB4MDhmN2VhZTcpLCBXVENQKDB4N2ZhZDVlYWQsIDB4MDkxNTlhMDkpLCBXVENQKDB4N2ZhYjNhMTcsIDB4MDkzMzg2OWYpLCBXVENQKDB4N2ZhOTA5ZjYsIDB4MDk1MWIwY2QpLAorICBXVENQKDB4N2ZhNmNlMWEsIDB4MDk3MDE4YjcpLCBXVENQKDB4N2ZhNDg2NTMsIDB4MDk4ZWJlN2YpLCBXVENQKDB4N2ZhMjMyNzMsIDB4MDlhZGEyNDgpLCBXVENQKDB4N2Y5ZmQyNDksIDB4MDljY2M0MzEpLAorICBXVENQKDB4N2Y5ZDY1YTQsIDB4MDllYzI0NWIpLCBXVENQKDB4N2Y5YWVjNTMsIDB4MGEwYmMyZTcpLCBXVENQKDB4N2Y5ODY2MjUsIDB4MGEyYjlmZjMpLCBXVENQKDB4N2Y5NWQyZTcsIDB4MGE0YmJiOWUpLAorICBXVENQKDB4N2Y5MzMyNjcsIDB4MGE2YzE2MDQpLCBXVENQKDB4N2Y5MDg0NzIsIDB4MGE4Y2FmNDMpLCBXVENQKDB4N2Y4ZGM4ZDUsIDB4MGFhZDg3NzYpLCBXVENQKDB4N2Y4YWZmNWMsIDB4MGFjZTllYjkpLAorICBXVENQKDB4N2Y4ODI3ZDMsIDB4MGFlZmY1MjYpLCBXVENQKDB4N2Y4NTQyMDQsIDB4MGIxMThhZDgpLCBXVENQKDB4N2Y4MjRkYmIsIDB4MGIzMzVmZTYpLCBXVENQKDB4N2Y3ZjRhYzMsIDB4MGI1NTc0NjkpLAorICBXVENQKDB4N2Y3YzM4ZTQsIDB4MGI3N2M4NzkpLCBXVENQKDB4N2Y3OTE3ZTksIDB4MGI5YTVjMmIpLCBXVENQKDB4N2Y3NWU3OWIsIDB4MGJiZDJmOTcpLCBXVENQKDB4N2Y3MmE3YzMsIDB4MGJlMDQyZDApLAorICBXVENQKDB4N2Y2ZjU4MjgsIDB4MGMwMzk1ZWMpLCBXVENQKDB4N2Y2YmY4OTIsIDB4MGMyNzI4ZmQpLCBXVENQKDB4N2Y2ODg4YzksIDB4MGM0YWZjMTYpLCBXVENQKDB4N2Y2NTA4OTQsIDB4MGM2ZjBmNGEpLAorICBXVENQKDB4N2Y2MTc3YjksIDB4MGM5MzYyYTgpLCBXVENQKDB4N2Y1ZGQ1ZmYsIDB4MGNiN2Y2NDIpLCBXVENQKDB4N2Y1YTIzMmEsIDB4MGNkY2NhMjYpLCBXVENQKDB4N2Y1NjVmMDAsIDB4MGQwMWRlNjMpLAorICBXVENQKDB4N2Y1Mjg5NDcsIDB4MGQyNzMzMDcpLCBXVENQKDB4N2Y0ZWExYzIsIDB4MGQ0Y2M4MWYpLCBXVENQKDB4N2Y0YWE4MzUsIDB4MGQ3MjlkYjcpLCBXVENQKDB4N2Y0NjljNjUsIDB4MGQ5OGIzZGEpLAorICBXVENQKDB4N2Y0MjdlMTMsIDB4MGRiZjBhOTIpLCBXVENQKDB4N2YzZTRkMDQsIDB4MGRlNWExZTkpLCBXVENQKDB4N2YzYTA4ZjksIDB4MGUwYzc5ZTcpLCBXVENQKDB4N2YzNWIxYjQsIDB4MGUzMzkyOTUpLAorICBXVENQKDB4N2YzMTQ2ZjgsIDB4MGU1YWViZmEpLCBXVENQKDB4N2YyY2M4ODQsIDB4MGU4Mjg2MWEpLCBXVENQKDB4N2YyODM2MWIsIDB4MGVhYTYwZmQpLCBXVENQKDB4N2YyMzhmN2MsIDB4MGVkMjdjYTUpLAorICBXVENQKDB4N2YxZWQ0NjcsIDB4MGVmYWQ5MTcpLCBXVENQKDB4N2YxYTA0OWQsIDB4MGYyMzc2NTYpLCBXVENQKDB4N2YxNTFmZGMsIDB4MGY0YzU0NjIpLCBXVENQKDB4N2YxMDI1ZTMsIDB4MGY3NTczM2QpLAorICBXVENQKDB4N2YwYjE2NzIsIDB4MGY5ZWQyZTYpLCBXVENQKDB4N2YwNWYxNDYsIDB4MGZjODczNWUpLCBXVENQKDB4N2YwMGI2MWQsIDB4MGZmMjU0YTEpLCBXVENQKDB4N2VmYjY0YjQsIDB4MTAxYzc2YWUpLAorICBXVENQKDB4N2VmNWZjY2EsIDB4MTA0NmQ5ODEpLCBXVENQKDB4N2VmMDdlMTksIDB4MTA3MTdkMTUpLCBXVENQKDB4N2VlYWU4NjAsIDB4MTA5YzYxNjUpLCBXVENQKDB4N2VlNTNiNWIsIDB4MTBjNzg2NmEpLAorICBXVENQKDB4N2VkZjc2YzQsIDB4MTBmMmVjMWUpLCBXVENQKDB4N2VkOTlhNTgsIDB4MTExZTkyNzkpLCBXVENQKDB4N2VkM2E1ZDEsIDB4MTE0YTc5NzEpLCBXVENQKDB4N2VjZDk4ZWIsIDB4MTE3NmEwZmMpLAorICBXVENQKDB4N2VjNzczNjAsIDB4MTFhMzA5MTApLCBXVENQKDB4N2VjMTM0ZWIsIDB4MTFjZmIxYTEpLCBXVENQKDB4N2ViYWRkNDQsIDB4MTFmYzlhYTIpLCBXVENQKDB4N2ViNDZjMjcsIDB4MTIyOWM0MDYpLAorICBXVENQKDB4N2VhZGUxNGMsIDB4MTI1NzJkYmYpLCBXVENQKDB4N2VhNzNjNmMsIDB4MTI4NGQ3YmMpLCBXVENQKDB4N2VhMDdkNDEsIDB4MTJiMmMxZWQpLCBXVENQKDB4N2U5OWEzODIsIDB4MTJlMGVjNDIpLAorICBXVENQKDB4N2U5MmFlZTcsIDB4MTMwZjU2YTgpLCBXVENQKDB4N2U4YjlmMmEsIDB4MTMzZTAxMGIpLCBXVENQKDB4N2U4NDc0MDIsIDB4MTM2Y2ViNTkpLCBXVENQKDB4N2U3ZDJkMjUsIDB4MTM5YzE1N2IpLAorICBXVENQKDB4N2U3NWNhNGMsIDB4MTNjYjdmNWQpLCBXVENQKDB4N2U2ZTRiMmQsIDB4MTNmYjI4ZTYpLCBXVENQKDB4N2U2NmFmN2YsIDB4MTQyYjEyMDApLCBXVENQKDB4N2U1ZWY2ZjgsIDB4MTQ1YjNhOTIpLAorICBXVENQKDB4N2U1NzIxNTAsIDB4MTQ4YmEyODEpLCBXVENQKDB4N2U0ZjJlM2IsIDB4MTRiYzQ5YjQpLCBXVENQKDB4N2U0NzFkNzAsIDB4MTRlZDMwMGYpLCBXVENQKDB4N2UzZWVlYTUsIDB4MTUxZTU1NzUpLAorICBXVENQKDB4N2UzNmExOGUsIDB4MTU0ZmI5YzkpLCBXVENQKDB4N2UyZTM1ZTIsIDB4MTU4MTVjZWQpLCBXVENQKDB4N2UyNWFiNTYsIDB4MTViMzNlYzEpLCBXVENQKDB4N2UxZDAxOWUsIDB4MTVlNTVmMjUpLAorICBXVENQKDB4N2UxNDM4NmUsIDB4MTYxN2JkZjkpLCBXVENQKDB4N2UwYjRmN2QsIDB4MTY0YTViMTkpLCBXVENQKDB4N2UwMjQ2N2UsIDB4MTY3ZDM2NjIpLCBXVENQKDB4N2RmOTFkMjUsIDB4MTZiMDRmYjIpLAorICBXVENQKDB4N2RlZmQzMjcsIDB4MTZlM2E2ZTIpLCBXVENQKDB4N2RlNjY4MzcsIDB4MTcxNzNiY2UpLCBXVENQKDB4N2RkY2RjMGEsIDB4MTc0YjBlNGQpLCBXVENQKDB4N2RkMzJlNTMsIDB4MTc3ZjFlMzkpLAorICBXVENQKDB4N2RjOTVlYzYsIDB4MTdiMzZiNjkpLCBXVENQKDB4N2RiZjZkMTcsIDB4MTdlN2Y1YjMpLCBXVENQKDB4N2RiNTU4ZjksIDB4MTgxY2JjZWMpLCBXVENQKDB4N2RhYjIyMWYsIDB4MTg1MWMwZTkpLAorICBXVENQKDB4N2RhMGM4M2MsIDB4MTg4NzAxN2QpLCBXVENQKDB4N2Q5NjRiMDUsIDB4MThiYzdlN2MpLCBXVENQKDB4N2Q4YmFhMmIsIDB4MThmMjM3YjYpLCBXVENQKDB4N2Q4MGU1NjMsIDB4MTkyODJjZmQpLAorICBXVENQKDB4N2Q3NWZjNWUsIDB4MTk1ZTVlMjApLCBXVENQKDB4N2Q2YWVlZDAsIDB4MTk5NGNhZWUpLCBXVENQKDB4N2Q1ZmJjNmQsIDB4MTljYjczMzUpLCBXVENQKDB4N2Q1NDY0ZTYsIDB4MWEwMjU2YzIpLAorICBXVENQKDB4N2Q0OGU3ZWYsIDB4MWEzOTc1NjEpLCBXVENQKDB4N2QzZDQ1M2IsIDB4MWE3MGNlZGUpLCBXVENQKDB4N2QzMTdjN2MsIDB4MWFhODYzMDEpLCBXVENQKDB4N2QyNThkNjUsIDB4MWFlMDMxOTUpLAorICBXVENQKDB4N2QxOTc3YWEsIDB4MWIxODNhNjMpLCBXVENQKDB4N2QwZDNhZmMsIDB4MWI1MDdkMzApLCBXVENQKDB4N2QwMGQ3MTAsIDB4MWI4OGY5YzUpLCBXVENQKDB4N2NmNDRiOTcsIDB4MWJjMWFmZTYpLAorICBXVENQKDB4N2NlNzk4NDYsIDB4MWJmYTlmNTgpLCBXVENQKDB4N2NkYWJjY2UsIDB4MWMzM2M3ZTApLCBXVENQKDB4N2NjZGI4ZTQsIDB4MWM2ZDI5M2YpLCBXVENQKDB4N2NjMDhjMzksIDB4MWNhNmMzMzcpLAorICBXVENQKDB4N2NiMzM2ODIsIDB4MWNlMDk1OGEpLCBXVENQKDB4N2NhNWI3NzIsIDB4MWQxYTlmZjgpLCBXVENQKDB4N2M5ODBlYmQsIDB4MWQ1NGUyNDApLCBXVENQKDB4N2M4YTNjMTQsIDB4MWQ4ZjVjMjEpLAorICBXVENQKDB4N2M3YzNmMmUsIDB4MWRjYTBkNTYpLCBXVENQKDB4N2M2ZTE3YmMsIDB4MWUwNGY1OWYpLCBXVENQKDB4N2M1ZmM1NzMsIDB4MWU0MDE0YjQpLCBXVENQKDB4N2M1MTQ4MDcsIDB4MWU3YjZhNTMpLAorICBXVENQKDB4N2M0MjlmMmMsIDB4MWViNmY2MzMpLCBXVENQKDB4N2MzM2NhOTYsIDB4MWVmMmI4MGYpLCBXVENQKDB4N2MyNGM5ZmEsIDB4MWYyZWFmOWUpLCBXVENQKDB4N2MxNTlkMGQsIDB4MWY2YWRjOTgpLAorICBXVENQKDB4N2MwNjQzODMsIDB4MWZhNzNlYjIpLCBXVENQKDB4N2JmNmJkMTEsIDB4MWZlM2Q1YTMpLCBXVENQKDB4N2JlNzA5NmMsIDB4MjAyMGExMWUpLCBXVENQKDB4N2JkNzI4NGEsIDB4MjA1ZGEwZDgpLAorICBXVENQKDB4N2JjNzE5NjAsIDB4MjA5YWQ0ODMpLCBXVENQKDB4N2JiNmRjNjUsIDB4MjBkODNiZDEpLCBXVENQKDB4N2JhNjcxMGQsIDB4MjExNWQ2NzQpLCBXVENQKDB4N2I5NWQ3MTAsIDB4MjE1M2E0MWIpLAorICBXVENQKDB4N2I4NTBlMjQsIDB4MjE5MWE0NzYpLCBXVENQKDB4N2I3NDE1ZmYsIDB4MjFjZmQ3MzQpLCBXVENQKDB4N2I2MmVlNTksIDB4MjIwZTNjMDIpLCBXVENQKDB4N2I1MTk2ZTksIDB4MjI0Y2QyOGQpLAorICBXVENQKDB4N2I0MDBmNjcsIDB4MjI4YjlhODIpLCBXVENQKDB4N2IyZTU3OGEsIDB4MjJjYTkzOGEpLCBXVENQKDB4N2IxYzZmMGIsIDB4MjMwOWJkNTIpLCBXVENQKDB4N2IwYTU1YTEsIDB4MjM0OTE3ODMpLAorICBXVENQKDB4N2FmODBiMDcsIDB4MjM4OGExYzQpLCBXVENQKDB4N2FlNThlZjUsIDB4MjNjODViYmYpLCBXVENQKDB4N2FkMmUxMjQsIDB4MjQwODQ1MWEpLCBXVENQKDB4N2FjMDAxNGUsIDB4MjQ0ODVkN2MpLAorICBXVENQKDB4N2FhY2VmMmUsIDB4MjQ4OGE0OGEpLCBXVENQKDB4N2E5OWFhN2UsIDB4MjRjOTE5ZTkpLCBXVENQKDB4N2E4NjMyZjgsIDB4MjUwOWJkM2QpLCBXVENQKDB4N2E3Mjg4NTgsIDB4MjU0YThlMjkpLAorICBXVENQKDB4N2E1ZWFhNWEsIDB4MjU4YjhjNTApLCBXVENQKDB4N2E0YTk4YjksIDB4MjVjY2I3NTMpLCBXVENQKDB4N2EzNjUzMzMsIDB4MjYwZTBlZDMpLCBXVENQKDB4N2EyMWQ5ODMsIDB4MjY0ZjkyNzEpLAorICBXVENQKDB4N2EwZDJiNjgsIDB4MjY5MTQxY2IpLCBXVENQKDB4NzlmODQ4OWUsIDB4MjZkMzFjODApLCBXVENQKDB4NzllMzMwZTQsIDB4MjcxNTIyMmYpLCBXVENQKDB4NzljZGUzZjgsIDB4Mjc1NzUyNzMpLAorICBXVENQKDB4NzliODYxOWEsIDB4Mjc5OWFjZWEpLCBXVENQKDB4NzlhMmE5ODksIDB4MjdkYzMxMzApLCBXVENQKDB4Nzk4Y2JiODUsIDB4MjgxZWRlZGYpLCBXVENQKDB4Nzk3Njk3NGUsIDB4Mjg2MWI1OTEpLAorICBXVENQKDB4Nzk2MDNjYTUsIDB4MjhhNGI0ZTApLCBXVENQKDB4Nzk0OWFiNGMsIDB4MjhlN2RjNjUpLCBXVENQKDB4NzkzMmUzMDQsIDB4MjkyYjJiYjgpLCBXVENQKDB4NzkxYmUzOTAsIDB4Mjk2ZWEyNzApLAorICBXVENQKDB4NzkwNGFjYjMsIDB4MjliMjQwMjQpLCBXVENQKDB4NzhlZDNlMzAsIDB4MjlmNjA0NmIpLCBXVENQKDB4NzhkNTk3Y2MsIDB4MmEzOWVlZDgpLCBXVENQKDB4NzhiZGI5NGEsIDB4MmE3ZGZmMDIpLAorICBXVENQKDB4NzhhNWEyNzAsIDB4MmFjMjM0N2MpLCBXVENQKDB4Nzg4ZDUzMDQsIDB4MmIwNjhlZGEpLCBXVENQKDB4Nzg3NGNhY2IsIDB4MmI0YjBkYWUpLCBXVENQKDB4Nzg1YzA5OGQsIDB4MmI4ZmIwOGEpLAorICBXVENQKDB4Nzg0MzBmMTEsIDB4MmJkNDc3MDApLCBXVENQKDB4NzgyOWRiMWYsIDB4MmMxOTYwYTEpLCBXVENQKDB4NzgxMDZkN2YsIDB4MmM1ZTZjZmQpLCBXVENQKDB4NzdmNmM1ZmIsIDB4MmNhMzliYTMpLAorICBXVENQKDB4NzdkY2U0NWMsIDB4MmNlOGVjMjMpLCBXVENQKDB4NzdjMmM4NmUsIDB4MmQyZTVlMGIpLCBXVENQKDB4NzdhODcxZmEsIDB4MmQ3M2YwZTgpLCBXVENQKDB4Nzc4ZGUwY2QsIDB4MmRiOWE0NDkpLAorICBXVENQKDB4Nzc3MzE0YjIsIDB4MmRmZjc3YjgpLCBXVENQKDB4Nzc1ODBkNzgsIDB4MmU0NTZhYzQpLCBXVENQKDB4NzczY2NhZWIsIDB4MmU4YjdjZjYpLCBXVENQKDB4NzcyMTRjZGIsIDB4MmVkMWFkZGIpLAorICBXVENQKDB4NzcwNTkzMTUsIDB4MmYxN2ZjZmIpLCBXVENQKDB4NzZlOTlkNjksIDB4MmY1ZTY5ZTIpLCBXVENQKDB4NzZjZDZiYTksIDB4MmZhNGY0MTkpLCBXVENQKDB4NzZiMGZkYTQsIDB4MmZlYjliMjcpLAorICBXVENQKDB4NzY5NDUzMmUsIDB4MzAzMjVlOTYpLCBXVENQKDB4NzY3NzZjMTcsIDB4MzA3OTNkZWUpLCBXVENQKDB4NzY1YTQ4MzQsIDB4MzBjMDM4YjUpLCBXVENQKDB4NzYzY2U3NTksIDB4MzEwNzRlNzIpLAorICBXVENQKDB4NzYxZjQ5NTksIDB4MzE0ZTdlYWIpLCBXVENQKDB4NzYwMTZlMGIsIDB4MzE5NWM4ZTYpLCBXVENQKDB4NzVlMzU1NDUsIDB4MzFkZDJjYTkpLCBXVENQKDB4NzVjNGZlZGMsIDB4MzIyNGE5NzkpLAorICBXVENQKDB4NzVhNjZhYWIsIDB4MzI2YzNlZDgpLCBXVENQKDB4NzU4Nzk4ODcsIDB4MzJiM2VjNGQpLCBXVENQKDB4NzU2ODg4NGIsIDB4MzJmYmIxNTkpLCBXVENQKDB4NzU0OTM5ZDEsIDB4MzM0MzhkODEpLAorICBXVENQKDB4NzUyOWFjZjQsIDB4MzM4YjgwNDUpLCBXVENQKDB4NzUwOWUxOGUsIDB4MzNkMzg5MmEpLCBXVENQKDB4NzRlOWQ3N2QsIDB4MzQxYmE3YjEpLCBXVENQKDB4NzRjOThlOWUsIDB4MzQ2M2RiNWEpLAorICBXVENQKDB4NzRhOTA2Y2QsIDB4MzRhYzIzYTcpLCBXVENQKDB4NzQ4ODNmZWMsIDB4MzRmNDgwMTkpLCBXVENQKDB4NzQ2NzM5ZDgsIDB4MzUzY2YwMmYpLCBXVENQKDB4NzQ0NWY0NzIsIDB4MzU4NTczNmEpLAorICBXVENQKDB4NzQyNDZmOWMsIDB4MzVjZTA5NDkpLCBXVENQKDB4NzQwMmFiMzcsIDB4MzYxNmIxNGMpLCBXVENQKDB4NzNlMGE3MjcsIDB4MzY1ZjZhZjApLCBXVENQKDB4NzNiZTYzNTAsIDB4MzZhODM1YjUpLAorICBXVENQKDB4NzM5YmRmOTUsIDB4MzZmMTExMTgpLCBXVENQKDB4NzM3OTFiZGQsIDB4MzczOWZjOTgpLCBXVENQKDB4NzM1NjE4MGUsIDB4Mzc4MmY3YjIpLCBXVENQKDB4NzMzMmQ0MTAsIDB4MzdjYzAxZTMpLAorICBXVENQKDB4NzMwZjRmYzksIDB4MzgxNTFhYTgpLCBXVENQKDB4NzJlYjhiMjQsIDB4Mzg1ZTQxN2UpLCBXVENQKDB4NzJjNzg2MGEsIDB4MzhhNzc1ZTEpLCBXVENQKDB4NzJhMzQwNjYsIDB4MzhmMGI3NGQpLAorICBXVENQKDB4NzI3ZWJhMjQsIDB4MzkzYTA1M2UpLCBXVENQKDB4NzI1OWYzMzEsIDB4Mzk4MzVmMzApLCBXVENQKDB4NzIzNGViNzksIDB4MzljY2M0OWUpLCBXVENQKDB4NzIwZmEyZWIsIDB4M2ExNjM1MDMpLAorICBXVENQKDB4NzFlYTE5NzcsIDB4M2E1ZmFmZGEpLCBXVENQKDB4NzFjNDRmMGMsIDB4M2FhOTM0OWUpLCBXVENQKDB4NzE5ZTQzOWQsIDB4M2FmMmMyY2EpLCBXVENQKDB4NzE3N2Y3MWEsIDB4M2IzYzU5ZDcpLAorICBXVENQKDB4NzE1MTY5NzgsIDB4M2I4NWY5NDApLCBXVENQKDB4NzEyYTlhYWEsIDB4M2JjZmEwN2UpLCBXVENQKDB4NzEwMzhhYTQsIDB4M2MxOTRmMGQpLCBXVENQKDB4NzBkYzM5NWUsIDB4M2M2MzA0NjQpLAorICBXVENQKDB4NzBiNGE2Y2QsIDB4M2NhY2JmZmYpLCBXVENQKDB4NzA4Y2QyZTksIDB4M2NmNjgxNTUpLCBXVENQKDB4NzA2NGJkYWIsIDB4M2Q0MDQ3ZTEpLCBXVENQKDB4NzAzYzY3MGQsIDB4M2Q4YTEzMWMpLAorICBXVENQKDB4NzAxM2NmMGEsIDB4M2RkM2UyN2UpLCBXVENQKDB4NmZlYWY1OWMsIDB4M2UxZGI1ODApLCBXVENQKDB4NmZjMWRhYzEsIDB4M2U2NzhiOWIpLCBXVENQKDB4NmY5ODdlNzYsIDB4M2ViMTY0NDkpLAorICBXVENQKDB4NmY2ZWUwYjksIDB4M2VmYjNmMDEpLCBXVENQKDB4NmY0NTAxOGIsIDB4M2Y0NTFiM2QpLCBXVENQKDB4NmYxYWUwZWIsIDB4M2Y4ZWY4NzQpLCBXVENQKDB4NmVmMDdlZGIsIDB4M2ZkOGQ2MjApLAorICBXVENQKDB4NmVjNWRiNWQsIDB4NDAyMmIzYjkpLCBXVENQKDB4NmU5YWY2NzUsIDB4NDA2YzkwYjcpLCBXVENQKDB4NmU2ZmQwMjcsIDB4NDBiNjZjOTMpLCBXVENQKDB4NmU0NDY4NzksIDB4NDEwMDQ2YzUpLAorICBXVENQKDB4NmUxOGJmNzEsIDB4NDE0YTFlYzYpLCBXVENQKDB4NmRlY2Q1MTcsIDB4NDE5M2Y0MGQpLCBXVENQKDB4NmRjMGE5NzIsIDB4NDFkZGM2MTUpLCBXVENQKDB4NmQ5NDNjOGQsIDB4NDIyNzk0NTUpLAorICBXVENQKDB4NmQ2NzhlNzEsIDB4NDI3MTVlNDUpLCBXVENQKDB4NmQzYTlmMmEsIDB4NDJiYjIzNWYpLCBXVENQKDB4NmQwZDZlYzUsIDB4NDMwNGUzMWEpLCBXVENQKDB4NmNkZmZkNGYsIDB4NDM0ZTljZjEpLAorICBXVENQKDB4NmNiMjRhZDYsIDB4NDM5ODUwNWIpLCBXVENQKDB4NmM4NDU3NmIsIDB4NDNlMWZjZDEpLCBXVENQKDB4NmM1NjIzMWMsIDB4NDQyYmExY2QpLCBXVENQKDB4NmMyN2FkZmQsIDB4NDQ3NTNlYzcpLAorICBXVENQKDB4NmJmOGY4MWUsIDB4NDRiZWQzM2EpLCBXVENQKDB4NmJjYTAxOTUsIDB4NDUwODVlOWQpLCBXVENQKDB4NmI5YWNhNzUsIDB4NDU1MWUwNmIpLCBXVENQKDB4NmI2YjUyZDUsIDB4NDU5YjU4MWUpLAorICBXVENQKDB4NmIzYjlhYzksIDB4NDVlNGM1MmYpLCBXVENQKDB4NmIwYmEyNmIsIDB4NDYyZTI3MTcpLCBXVENQKDB4NmFkYjY5ZDMsIDB4NDY3NzdkNTIpLCBXVENQKDB4NmFhYWYxMWIsIDB4NDZjMGM3NWEpLAorICBXVENQKDB4NmE3YTM4NWMsIDB4NDcwYTA0YTkpLCBXVENQKDB4NmE0OTNmYjMsIDB4NDc1MzM0YjkpLCBXVENQKDB4NmExODA3M2QsIDB4NDc5YzU3MDcpLCBXVENQKDB4NjllNjhmMTcsIDB4NDdlNTZiMGMpLAorICBXVENQKDB4NjliNGQ3NjEsIDB4NDgyZTcwNDUpLCBXVENQKDB4Njk4MmUwMzksIDB4NDg3NzY2MmMpLCBXVENQKDB4Njk1MGE5YzAsIDB4NDhjMDRjM2YpLCBXVENQKDB4NjkxZTM0MWEsIDB4NDkwOTIxZjgpLAorICBXVENQKDB4NjhlYjdmNjcsIDB4NDk1MWU2ZDUpLCBXVENQKDB4NjhiODhiY2QsIDB4NDk5YTlhNTEpLCBXVENQKDB4Njg4NTU5NzAsIDB4NDllMzNiZWIpLCBXVENQKDB4Njg1MWU4NzUsIDB4NGEyYmNiMWYpLAorICBXVENQKDB4NjgxZTM5MDUsIDB4NGE3NDQ3NmIpLCBXVENQKDB4NjdlYTRiNDcsIDB4NGFiY2IwNGMpLCBXVENQKDB4NjdiNjFmNjMsIDB4NGIwNTA1NDEpLCBXVENQKDB4Njc4MWI1ODUsIDB4NGI0ZDQ1YzkpLAorICBXVENQKDB4Njc0ZDBkZDYsIDB4NGI5NTcxNjIpLCBXVENQKDB4NjcxODI4ODMsIDB4NGJkZDg3OGMpLCBXVENQKDB4NjZlMzA1YjgsIDB4NGMyNTg3YzYpLCBXVENQKDB4NjZhZGE1YTUsIDB4NGM2ZDcxOTApLAorICBXVENQKDB4NjY3ODA4NzgsIDB4NGNiNTQ0NmEpLCBXVENQKDB4NjY0MjJlNjAsIDB4NGNmY2ZmZDUpLCBXVENQKDB4NjYwYzE3OTAsIDB4NGQ0NGEzNTMpLCBXVENQKDB4NjVkNWM0MzksIDB4NGQ4YzJlNjQpLAorICBXVENQKDB4NjU5ZjM0OGUsIDB4NGRkM2EwOGMpLCBXVENQKDB4NjU2ODY4YzMsIDB4NGUxYWY5NGIpLCBXVENQKDB4NjUzMTYxMGQsIDB4NGU2MjM4MjUpLCBXVENQKDB4NjRmYTFkYTMsIDB4NGVhOTVjOWQpLAorICBXVENQKDB4NjRjMjllYmIsIDB4NGVmMDY2MzcpLCBXVENQKDB4NjQ4YWU0OGQsIDB4NGYzNzU0NzcpLCBXVENQKDB4NjQ1MmVmNTMsIDB4NGY3ZTI2ZTEpLCBXVENQKDB4NjQxYWJmNDYsIDB4NGZjNGRjZmIpLAorICBXVENQKDB4NjNlMjU0YTIsIDB4NTAwYjc2NDkpLCBXVENQKDB4NjNhOWFmYTIsIDB4NTA1MWYyNTMpLCBXVENQKDB4NjM3MGQwODMsIDB4NTA5ODUwOWYpLCBXVENQKDB4NjMzN2I3ODQsIDB4NTBkZTkwYjMpLAorICBXVENQKDB4NjJmZTY0ZTMsIDB4NTEyNGIyMTgpLCBXVENQKDB4NjJjNGQ4ZTAsIDB4NTE2YWI0NTUpLCBXVENQKDB4NjI4YjEzYmMsIDB4NTFiMDk2ZjMpLCBXVENQKDB4NjI1MTE1YjgsIDB4NTFmNjU5N2IpLAorICBXVENQKDB4NjIxNmRmMTgsIDB4NTIzYmZiNzgpLCBXVENQKDB4NjFkYzcwMWYsIDB4NTI4MTdjNzIpLCBXVENQKDB4NjFhMWM5MTIsIDB4NTJjNmRiZjUpLCBXVENQKDB4NjE2NmVhMzYsIDB4NTMwYzE5OGQpLAorICBXVENQKDB4NjEyYmQzZDIsIDB4NTM1MTM0YzUpLCBXVENQKDB4NjBmMDg2MmQsIDB4NTM5NjJkMmEpLCBXVENQKDB4NjBiNTAxOTAsIDB4NTNkYjAyNGEpLCBXVENQKDB4NjA3OTQ2NDQsIDB4NTQxZmIzYjEpLAorICBXVENQKDB4NjAzZDU0OTQsIDB4NTQ2NDQwZWYpLCBXVENQKDB4NjAwMTJjY2EsIDB4NTRhOGE5OTIpLCBXVENQKDB4NWZjNGNmMzMsIDB4NTRlY2VkMmIpLCBXVENQKDB4NWY4ODNjMWMsIDB4NTUzMTBiNDgpLAorICBXVENQKDB4NWY0YjczZDIsIDB4NTU3NTAzN2MpLCBXVENQKDB4NWYwZTc2YTUsIDB4NTViOGQ1NTgpLCBXVENQKDB4NWVkMTQ0ZTUsIDB4NTVmYzgwNmYpLCBXVENQKDB4NWU5M2RlZTEsIDB4NTY0MDA0NTIpLAorICBXVENQKDB4NWU1NjQ0ZWMsIDB4NTY4MzYwOTYpLCBXVENQKDB4NWUxODc3NTcsIDB4NTZjNjk0Y2YpLCBXVENQKDB4NWRkYTc2NzcsIDB4NTcwOWEwOTIpLCBXVENQKDB4NWQ5YzQyOWYsIDB4NTc0YzgzNzQpLAorICBXVENQKDB4NWQ1ZGRjMjQsIDB4NTc4ZjNkMGQpLCBXVENQKDB4NWQxZjQzNWQsIDB4NTdkMWNjZjIpLCBXVENQKDB4NWNlMDc4YTAsIDB4NTgxNDMyYmQpLCBXVENQKDB4NWNhMTdjNDUsIDB4NTg1NjZlMDQpLAorICBXVENQKDB4NWM2MjRlYTQsIDB4NTg5ODdlNjMpLCBXVENQKDB4NWMyMmYwMTYsIDB4NThkYTYzNzIpLCBXVENQKDB4NWJlMzYwZjYsIDB4NTkxYzFjY2MpLCBXVENQKDB4NWJhM2ExOWYsIDB4NTk1ZGFhMGQpLAorICBXVENQKDB4NWI2M2IyNmMsIDB4NTk5ZjBhZDEpLCBXVENQKDB4NWIyMzkzYmEsIDB4NTllMDNlYjYpLCBXVENQKDB4NWFlMzQ1ZTcsIDB4NWEyMTQ1NTgpLCBXVENQKDB4NWFhMmM5NTEsIDB4NWE2MjFlNTYpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjhbXSA9Cit7CisgIFdUQ1AoMHg3ZmZmNjIxNiwgMHgwMGM5MGY4OCksIFdUQ1AoMHg3ZmZhNzJkMSwgMHgwMjViMjZkNyksIFdUQ1AoMHg3ZmYwOTQ3OCwgMHgwM2VkMjZlNiksIFdUQ1AoMHg3ZmUxYzc2YiwgMHgwNTdmMDAzNSksCisgIFdUQ1AoMHg3ZmNlMGMzZSwgMHgwNzEwYTM0NSksIFdUQ1AoMHg3ZmI1NjNiMywgMHgwOGEyMDA5YSksIFdUQ1AoMHg3Zjk3Y2ViZCwgMHgwYTMzMDhiZCksIFdUQ1AoMHg3Zjc1NGU4MCwgMHgwYmMzYWMzNSksCisgIFdUQ1AoMHg3ZjRkZTQ1MSwgMHgwZDUzZGI5MiksIFdUQ1AoMHg3ZjIxOTFiNCwgMHgwZWUzODc2NiksIFdUQ1AoMHg3ZWYwNTg2MCwgMHgxMDcyYTA0OCksIFdUQ1AoMHg3ZWJhM2EzOSwgMHgxMjAxMTZkNSksCisgIFdUQ1AoMHg3ZTdmMzk1NywgMHgxMzhlZGJiMSksIFdUQ1AoMHg3ZTNmNTdmZiwgMHgxNTFiZGY4NiksIFdUQ1AoMHg3ZGZhOThhOCwgMHgxNmE4MTMwNSksIFdUQ1AoMHg3ZGIwZmRmOCwgMHgxODMzNjZlOSksCisgIFdUQ1AoMHg3ZDYyOGFjNiwgMHgxOWJkY2JmMyksIFdUQ1AoMHg3ZDBmNDIxOCwgMHgxYjQ3MzJlZiksIFdUQ1AoMHg3Y2I3MjcyNCwgMHgxY2NmOGNiMyksIFdUQ1AoMHg3YzVhM2Q1MCwgMHgxZTU2Y2ExZSksCisgIFdUQ1AoMHg3YmY4ODgzMCwgMHgxZmRjZGMxYiksIFdUQ1AoMHg3YjkyMGI4OSwgMHgyMTYxYjNhMCksIFdUQ1AoMHg3YjI2Y2I0ZiwgMHgyMmU1NDFhZiksIFdUQ1AoMHg3YWI2Y2JhNCwgMHgyNDY3Nzc1OCksCisgIFdUQ1AoMHg3YTQyMTBkOCwgMHgyNWU4NDViNiksIFdUQ1AoMHg3OWM4OWY2ZSwgMHgyNzY3OWRmNCksIFdUQ1AoMHg3OTRhN2MxMiwgMHgyOGU1NzE0YiksIFdUQ1AoMHg3OGM3YWJhMiwgMHgyYTYxYjEwMSksCisgIFdUQ1AoMHg3ODQwMzMyOSwgMHgyYmRjNGU2ZiksIFdUQ1AoMHg3N2I0MTdkZiwgMHgyZDU1M2FmYyksIFdUQ1AoMHg3NzIzNWYyZCwgMHgyZWNjNjgxZSksIFdUQ1AoMHg3NjhlMGVhNiwgMHgzMDQxYzc2MSksCisgIFdUQ1AoMHg3NWY0MmMwYiwgMHgzMWI1NGE1ZSksIFdUQ1AoMHg3NTU1YmQ0YywgMHgzMzI2ZTJjMyksIFdUQ1AoMHg3NGIyYzg4NCwgMHgzNDk2ODI1MCksIFdUQ1AoMHg3NDBiNTNmYiwgMHgzNjA0MWFkOSksCisgIFdUQ1AoMHg3MzVmNjYyNiwgMHgzNzZmOWU0NiksIFdUQ1AoMHg3MmFmMDVhNywgMHgzOGQ4ZmU5MyksIFdUQ1AoMHg3MWZhMzk0OSwgMHgzYTQwMmRkMiksIFdUQ1AoMHg3MTQxMDgwNSwgMHgzYmE1MWUyOSksCisgIFdUQ1AoMHg3MDgzNzhmZiwgMHgzZDA3YzFkNiksIFdUQ1AoMHg2ZmMxOTM4NSwgMHgzZTY4MGIyYyksIFdUQ1AoMHg2ZWZiNWYxMiwgMHgzZmM1ZWM5OCksIFdUQ1AoMHg2ZTMwZTM0YSwgMHg0MTIxNTg5YiksCisgIFdUQ1AoMHg2ZDYyMjdmYSwgMHg0MjdhNDFkMCksIFdUQ1AoMHg2YzhmMzUxYywgMHg0M2QwOWFlZCksIFdUQ1AoMHg2YmI4MTJkMSwgMHg0NTI0NTZiZCksIFdUQ1AoMHg2YWRjYzk2NCwgMHg0Njc1NjgyOCksCisgIFdUQ1AoMHg2OWZkNjE0YSwgMHg0N2MzYzIyZiksIFdUQ1AoMHg2OTE5ZTMyMCwgMHg0OTBmNTdlZSksIFdUQ1AoMHg2ODMyNTdhYiwgMHg0YTU4MWM5ZSksIFdUQ1AoMHg2NzQ2YzdkOCwgMHg0YjllMDM5MCksCisgIFdUQ1AoMHg2NjU3M2NiYiwgMHg0Y2UxMDAzNCksIFdUQ1AoMHg2NTYzYmY5MiwgMHg0ZTIxMDYxNyksIFdUQ1AoMHg2NDZjNTliZiwgMHg0ZjVlMDhlMyksIFdUQ1AoMHg2MzcxMTRjYywgMHg1MDk3ZmM1ZSksCisgIFdUQ1AoMHg2MjcxZmE2OSwgMHg1MWNlZDQ2ZSksIFdUQ1AoMHg2MTZmMTQ2YywgMHg1MzAyODUxOCksIFdUQ1AoMHg2MDY4NmNjZiwgMHg1NDMzMDI3ZCksIFdUQ1AoMHg1ZjVlMGRiMywgMHg1NTYwNDBlMiksCisgIFdUQ1AoMHg1ZTUwMDE1ZCwgMHg1NjhhMzRhOSksIFdUQ1AoMHg1ZDNlNTIzNywgMHg1N2IwZDI1NiksIFdUQ1AoMHg1YzI5MGFjYywgMHg1OGQ0MGU4YyksIFdUQ1AoMHg1YjEwMzVjZiwgMHg1OWYzZGUxMiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTI4W10gPQoreworICBXVENQKDB4N2ZmZmZmZmUsIDB4MDAwMTZmNjMpLCBXVENQKDB4N2ZmZmZmZjEsIDB4MDAwM2UzODIpLCBXVENQKDB4N2ZmZmZmYzcsIDB4MDAwNzhmNjQpLCBXVENQKDB4N2ZmZmZmNWQsIDB4MDAwY2MzMjMpLAorICBXVENQKDB4N2ZmZmZlNzYsIDB4MDAxM2Q5ZWQpLCBXVENQKDB4N2ZmZmZjYWEsIDB4MDAxZDNhOWQpLCBXVENQKDB4N2ZmZmY5NTMsIDB4MDAyOTU4MWYpLCBXVENQKDB4N2ZmZmYzNzIsIDB4MDAzOGIxYmQpLAorICBXVENQKDB4N2ZmZmU5OGIsIDB4MDA0YmQzNGQpLCBXVENQKDB4N2ZmZmQ5NzUsIDB4MDA2MzU1MzgpLCBXVENQKDB4N2ZmZmMwMjQsIDB4MDA3ZmRjNjQpLCBXVENQKDB4N2ZmZjk5NWIsIDB4MDBhMjE5ZjEpLAorICBXVENQKDB4N2ZmZjVmNWIsIDB4MDBjYWNhZDApLCBXVENQKDB4N2ZmZjBhNzUsIDB4MDBmYWI3MmQpLCBXVENQKDB4N2ZmZTkwOTEsIDB4MDEzMmIxYWYpLCBXVENQKDB4N2ZmZGU0OWUsIDB4MDE3Mzk2ODkpLAorICBXVENQKDB4N2ZmY2Y1ZWYsIDB4MDFiZTRhNjMpLCBXVENQKDB4N2ZmYmFmODQsIDB4MDIxM2I5MTApLCBXVENQKDB4N2ZmOWY3M2EsIDB4MDI3NGQ0MWUpLCBXVENQKDB4N2ZmN2FjZjEsIDB4MDJlMjkxM2EpLAorICBXVENQKDB4N2ZmNGE5OWEsIDB4MDM1ZGU4NmMpLCBXVENQKDB4N2ZmMGJlM2QsIDB4MDNlN2QyMzMpLCBXVENQKDB4N2ZlYmIyZjEsIDB4MDQ4MTQ1N2MpLCBXVENQKDB4N2ZlNTQ1ZDQsIDB4MDUyYjM1N2MpLAorICBXVENQKDB4N2ZkZDJhMDIsIDB4MDVlNjhmNzcpLCBXVENQKDB4N2ZkMzA2OTUsIDB4MDZiNDM4NmYpLCBXVENQKDB4N2ZjNjc1YjQsIDB4MDc5NTBhY2IpLCBXVENQKDB4N2ZiNzAzYmUsIDB4MDg4OWQzZWYpLAorICBXVENQKDB4N2ZhNDJlODksIDB4MDk5MzUxZTApLCBXVENQKDB4N2Y4ZDY0ZDgsIDB4MGFiMjMwZTApLCBXVENQKDB4N2Y3MjA1ZjgsIDB4MGJlNzA5MjMpLCBXVENQKDB4N2Y1MTYxOTUsIDB4MGQzMjVjOTMpLAorICBXVENQKDB4N2YyYWI3ZDAsIDB4MGU5NDk0YWUpLCBXVENQKDB4N2VmZDM5OTcsIDB4MTAwZTAwODUpLCBXVENQKDB4N2VjODA5NGEsIDB4MTE5ZWQyZWYpLCBXVENQKDB4N2U4YTNiYTcsIDB4MTM0NzIwZDgpLAorICBXVENQKDB4N2U0MmQ5MDYsIDB4MTUwNmRmZGMpLCBXVENQKDB4N2RmMGRlZTQsIDB4MTZkZGU1MGIpLCBXVENQKDB4N2Q5MzQxYjQsIDB4MThjYmUzZjcpLCBXVENQKDB4N2QyOGVmMDIsIDB4MWFkMDZlMDcpLAorICBXVENQKDB4N2NiMGNmY2MsIDB4MWNlYWYyMTUpLCBXVENQKDB4N2MyOWNiMjAsIDB4MWYxYWJjNGYpLCBXVENQKDB4N2I5MmM4ZWIsIDB4MjE1ZWY2NzcpLCBXVENQKDB4N2FlYWI0ZWMsIDB4MjNiNmE4NjcpLAorICBXVENQKDB4N2EzMDgxZDAsIDB4MjYyMGI4ZWMpLCBXVENQKDB4Nzk2MzJjNWEsIDB4Mjg5YmVlZjUpLCBXVENQKDB4Nzg4MWJlOTUsIDB4MmIyNmYzMGIpLCBXVENQKDB4Nzc4YjUzMDQsIDB4MmRjMDUxMWYpLAorICBXVENQKDB4NzY3ZjE3YzAsIDB4MzA2NjdhYTIpLCBXVENQKDB4NzU1YzUxNzgsIDB4MzMxN2M4ZGQpLCBXVENQKDB4NzQyMjVlNTAsIDB4MzVkMjdmOTgpLCBXVENQKDB4NzJkMGI4ODcsIDB4Mzg5NGNmZjMpLAorICBXVENQKDB4NzE2NmY4ZTcsIDB4M2I1Y2RiN2IpLCBXVENQKDB4NmZlNGQ4ZTgsIDB4M2UyOGI3NzApLCBXVENQKDB4NmU0YTM0OTEsIDB4NDBmNjcwMmEpLCBXVENQKDB4NmM5NzBiZmMsIDB4NDNjNDBjYWEpLAorICBXVENQKDB4NmFjYjg0ODMsIDB4NDY4ZjkyMzEpLCBXVENQKDB4NjhlN2U5OTQsIDB4NDk1NzA3ZjUpLCBXVENQKDB4NjZlY2FkMWMsIDB4NGMxODdhYzcpLCBXVENQKDB4NjRkYTY3OTcsIDB4NGVkMjAwYzUpLAorICBXVENQKDB4NjJiMWQ3YjcsIDB4NTE4MWJjZWEpLCBXVENQKDB4NjA3M2UxYWUsIDB4NTQyNWUyOGUpLCBXVENQKDB4NWUyMThlMTYsIDB4NTZiY2I4YzIpLCBXVENQKDB4NWJiYzA4NzUsIDB4NTk0NDlkNzYpLAorfTsKKworCisKKworCisKKworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2MFtdID0KK3sKKyAgV1RDUCgweDdmZmZmZDMxLCAweDAwMWFjZWVhKSwgV1RDUCgweDdmZmZlNmJjLCAweDAwNTA2Y2I5KSwgV1RDUCgweDdmZmZiOWQxLCAweDAwODYwYTc5KSwgV1RDUCgweDdmZmY3NjcxLCAweDAwYmJhODIyKSwKKyAgV1RDUCgweDdmZmYxYzliLCAweDAwZjE0NWFiKSwgV1RDUCgweDdmZmVhYzUwLCAweDAxMjZlMzA5KSwgV1RDUCgweDdmZmUyNTkwLCAweDAxNWM4MDMzKSwgV1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwKKyAgV1RDUCgweDdmZmNkNGIwLCAweDAxYzdiOWM2KSwgV1RDUCgweDdmZmMwYTkxLCAweDAxZmQ1NjFkKSwgV1RDUCgweDdmZmIyOWZkLCAweDAyMzJmMjFhKSwgV1RDUCgweDdmZmEzMmY0LCAweDAyNjg4ZGI0KSwKKyAgV1RDUCgweDdmZjkyNTc3LCAweDAyOWUyOGUyKSwgV1RDUCgweDdmZjgwMTg2LCAweDAyZDNjMzliKSwgV1RDUCgweDdmZjZjNzIwLCAweDAzMDk1ZGQ1KSwgV1RDUCgweDdmZjU3NjQ3LCAweDAzM2VmNzg2KSwKKyAgV1RDUCgweDdmZjQwZWZhLCAweDAzNzQ5MGE1KSwgV1RDUCgweDdmZjI5MTNhLCAweDAzYWEyOTJhKSwgV1RDUCgweDdmZjBmZDA3LCAweDAzZGZjMTA5KSwgV1RDUCgweDdmZWY1MjYwLCAweDA0MTU1ODNiKSwKKyAgV1RDUCgweDdmZWQ5MTQ4LCAweDA0NGFlZWI1KSwgV1RDUCgweDdmZWJiOWJkLCAweDA0ODA4NDZlKSwgV1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgV1RDUCgweDdmZTdjNzUyLCAweDA0ZWJhZDc5KSwKKyAgV1RDUCgweDdmZTVhYzcyLCAweDA1MjE0MGI3KSwgV1RDUCgweDdmZTM3YjIyLCAweDA1NTZkMzBmKSwgV1RDUCgweDdmZTEzMzYxLCAweDA1OGM2NDc4KSwgV1RDUCgweDdmZGVkNTMwLCAweDA1YzFmNGU3KSwKKyAgV1RDUCgweDdmZGM2MDhmLCAweDA1Zjc4NDUzKSwgV1RDUCgweDdmZDlkNTdmLCAweDA2MmQxMmI0KSwgV1RDUCgweDdmZDczNDAxLCAweDA2NjI5ZmZlKSwgV1RDUCgweDdmZDQ3YzE0LCAweDA2OTgyYzJiKSwKKyAgV1RDUCgweDdmZDFhZGI5LCAweDA2Y2RiNzJmKSwgV1RDUCgweDdmY2VjOGYxLCAweDA3MDM0MTAxKSwgV1RDUCgweDdmY2JjZGJjLCAweDA3MzhjOTk4KSwgV1RDUCgweDdmYzhiYzFiLCAweDA3NmU1MGViKSwKKyAgV1RDUCgweDdmYzU5NDBlLCAweDA3YTNkNmYwKSwgV1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgV1RDUCgweDdmYmYwMGIzLCAweDA4MGVkZWVjKSwgV1RDUCgweDdmYmI5NTY3LCAweDA4NDQ2MGNmKSwKKyAgV1RDUCgweDdmYjgxM2IwLCAweDA4NzllMTQwKSwgV1RDUCgweDdmYjQ3YjkxLCAweDA4YWY2MDMzKSwgV1RDUCgweDdmYjBjZDBhLCAweDA4ZTRkZGEwKSwgV1RDUCgweDdmYWQwODFiLCAweDA5MWE1OTdlKSwKKyAgV1RDUCgweDdmYTkyY2M1LCAweDA5NGZkM2MzKSwgV1RDUCgweDdmYTUzYjA5LCAweDA5ODU0YzY2KSwgV1RDUCgweDdmYTEzMmU4LCAweDA5YmFjMzVkKSwgV1RDUCgweDdmOWQxNDYxLCAweDA5ZjAzODlmKSwKKyAgV1RDUCgweDdmOThkZjc3LCAweDBhMjVhYzIzKSwgV1RDUCgweDdmOTQ5NDI5LCAweDBhNWIxZGRlKSwgV1RDUCgweDdmOTAzMjc5LCAweDBhOTA4ZGM5KSwgV1RDUCgweDdmOGJiYTY2LCAweDBhYzVmYmQ5KSwKKyAgV1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwgV1RDUCgweDdmODI4NzFmLCAweDBiMzBkMjQ0KSwgV1RDUCgweDdmN2RjYmVjLCAweDBiNjYzYThjKSwgV1RDUCgweDdmNzhmYTViLCAweDBiOWJhMGQ1KSwKKyAgV1RDUCgweDdmNzQxMjZiLCAweDBiZDEwNTEzKSwgV1RDUCgweDdmNmYxNDFmLCAweDBjMDY2NzQwKSwgV1RDUCgweDdmNjlmZjc2LCAweDBjM2JjNzRmKSwgV1RDUCgweDdmNjRkNDczLCAweDBjNzEyNTNhKSwKKyAgV1RDUCgweDdmNWY5MzE1LCAweDBjYTY4MGY1KSwgV1RDUCgweDdmNWEzYjVlLCAweDBjZGJkYTc5KSwgV1RDUCgweDdmNTRjZDRmLCAweDBkMTEzMWJhKSwgV1RDUCgweDdmNGY0OGU4LCAweDBkNDY4NmIxKSwKKyAgV1RDUCgweDdmNDlhZTJhLCAweDBkN2JkOTU0KSwgV1RDUCgweDdmNDNmZDE4LCAweDBkYjEyOTk5KSwgV1RDUCgweDdmM2UzNWIwLCAweDBkZTY3Nzc2KSwgV1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwKKyAgV1RDUCgweDdmMzI2M2U5LCAweDBlNTEwYmQ4KSwgV1RDUCgweDdmMmM1OThhLCAweDBlODY1MjQ4KSwgV1RDUCgweDdmMjYzOGRiLCAweDBlYmI5NjJjKSwgV1RDUCgweDdmMjAwMWRkLCAweDBlZjBkNzdiKSwKKyAgV1RDUCgweDdmMTliNDkxLCAweDBmMjYxNjJhKSwgV1RDUCgweDdmMTM1MGY4LCAweDBmNWI1MjMxKSwgV1RDUCgweDdmMGNkNzEyLCAweDBmOTA4Yjg2KSwgV1RDUCgweDdmMDY0NmUyLCAweDBmYzVjMjIwKSwKKyAgV1RDUCgweDdlZmZhMDY5LCAweDBmZmFmNWY2KSwgV1RDUCgweDdlZjhlM2E2LCAweDEwMzAyNmZlKSwgV1RDUCgweDdlZjIxMDlkLCAweDEwNjU1NTJlKSwgV1RDUCgweDdlZWIyNzRkLCAweDEwOWE4MDdlKSwKKyAgV1RDUCgweDdlZTQyN2I5LCAweDEwY2ZhOGU1KSwgV1RDUCgweDdlZGQxMWUxLCAweDExMDRjZTU4KSwgV1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgV1RDUCgweDdlY2VhMzZiLCAweDExNmYxMDQwKSwKKyAgV1RDUCgweDdlYzc0YWNmLCAweDExYTQyY2EyKSwgV1RDUCgweDdlYmZkYmY1LCAweDExZDk0NWViKSwgV1RDUCgweDdlYjg1NmRlLCAweDEyMGU1YzEzKSwgV1RDUCgweDdlYjBiYjhhLCAweDEyNDM2ZjEwKSwKKyAgV1RDUCgweDdlYTkwOWZjLCAweDEyNzg3ZWQ4KSwgV1RDUCgweDdlYTE0MjM1LCAweDEyYWQ4YjYzKSwgV1RDUCgweDdlOTk2NDM2LCAweDEyZTI5NGE3KSwgV1RDUCgweDdlOTE3MDAwLCAweDEzMTc5YTliKSwKKyAgV1RDUCgweDdlODk2NTk1LCAweDEzNGM5ZDM0KSwgV1RDUCgweDdlODE0NGY2LCAweDEzODE5YzZjKSwgV1RDUCgweDdlNzkwZTI1LCAweDEzYjY5ODM2KSwgV1RDUCgweDdlNzBjMTI0LCAweDEzZWI5MDhjKSwKKyAgV1RDUCgweDdlNjg1ZGYyLCAweDE0MjA4NTYzKSwgV1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwgV1RDUCgweDdlNTc1NTA4LCAweDE0OGE2NDZlKSwgV1RDUCgweDdlNGVhZjUxLCAweDE0YmY0ZTkxKSwKKyAgV1RDUCgweDdlNDVmMzcxLCAweDE0ZjQzNTEwKSwgV1RDUCgweDdlM2QyMTY5LCAweDE1MjkxN2UxKSwgV1RDUCgweDdlMzQzOTNiLCAweDE1NWRmNmZjKSwgV1RDUCgweDdlMmIzYWU4LCAweDE1OTJkMjU3KSwKKyAgV1RDUCgweDdlMjIyNjcyLCAweDE1YzdhOWVhKSwgV1RDUCgweDdlMThmYmRhLCAweDE1ZmM3ZGFhKSwgV1RDUCgweDdlMGZiYjIyLCAweDE2MzE0ZDhlKSwgV1RDUCgweDdlMDY2NDRjLCAweDE2NjYxOThkKSwKKyAgV1RDUCgweDdkZmNmNzU5LCAweDE2OWFlMTlmKSwgV1RDUCgweDdkZjM3NDRiLCAweDE2Y2ZhNWI5KSwgV1RDUCgweDdkZTlkYjIzLCAweDE3MDQ2NWQyKSwgV1RDUCgweDdkZTAyYmU0LCAweDE3MzkyMWUyKSwKKyAgV1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgV1RDUCgweDdkY2M4YjI1LCAweDE3YTI4ZGJlKSwgV1RDUCgweDdkYzI5OWE5LCAweDE3ZDczZDc5KSwgV1RDUCgweDdkYjg5MjFjLCAweDE4MGJlOTA0KSwKKyAgV1RDUCgweDdkYWU3NDdmLCAweDE4NDA5MDU4KSwgV1RDUCgweDdkYTQ0MGQ2LCAweDE4NzUzMzZhKSwgV1RDUCgweDdkOTlmNzIxLCAweDE4YTlkMjMxKSwgV1RDUCgweDdkOGY5NzYyLCAweDE4ZGU2Y2E1KSwKKyAgV1RDUCgweDdkODUyMTljLCAweDE5MTMwMmJjKSwgV1RDUCgweDdkN2E5NWNmLCAweDE5NDc5NDZjKSwgV1RDUCgweDdkNmZmM2ZlLCAweDE5N2MyMWFkKSwgV1RDUCgweDdkNjUzYzJiLCAweDE5YjBhYTc1KSwKKyAgV1RDUCgweDdkNWE2ZTU3LCAweDE5ZTUyZWJiKSwgV1RDUCgweDdkNGY4YTg1LCAweDFhMTlhZTc2KSwgV1RDUCgweDdkNDQ5MGI2LCAweDFhNGUyOTlkKSwgV1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwKKyAgV1RDUCgweDdkMmU1YjJhLCAweDFhYjcxMjA4KSwgV1RDUCgweDdkMjMxZjcwLCAweDFhZWI3ZjNhKSwgV1RDUCgweDdkMTdjZGMyLCAweDFiMWZlN2IzKSwgV1RDUCgweDdkMGM2NjIxLCAweDFiNTQ0YjZhKSwKKyAgV1RDUCgweDdkMDBlODhmLCAweDFiODhhYTU1KSwgV1RDUCgweDdjZjU1NTBlLCAweDFiYmQwNDZjKSwgV1RDUCgweDdjZTlhYmExLCAweDFiZjE1OWE0KSwgV1RDUCgweDdjZGRlYzQ4LCAweDFjMjVhOWY2KSwKKyAgV1RDUCgweDdjZDIxNzA3LCAweDFjNTlmNTU3KSwgV1RDUCgweDdjYzYyYmRmLCAweDFjOGUzYmJlKSwgV1RDUCgweDdjYmEyYWQzLCAweDFjYzI3ZDIzKSwgV1RDUCgweDdjYWUxM2U0LCAweDFjZjZiOTdjKSwKKyAgV1RDUCgweDdjYTFlNzE1LCAweDFkMmFmMGMxKSwgV1RDUCgweDdjOTVhNDY3LCAweDFkNWYyMmU3KSwgV1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwgV1RDUCgweDdjN2NkZDdiLCAweDFkYzc3N2IzKSwKKyAgV1RDUCgweDdjNzA1OTQwLCAweDFkZmI5YTQ4KSwgV1RDUCgweDdjNjNiZjJmLCAweDFlMmZiNzlhKSwgV1RDUCgweDdjNTcwZjRiLCAweDFlNjNjZmEwKSwgV1RDUCgweDdjNGE0OTk2LCAweDFlOTdlMjUxKSwKKyAgV1RDUCgweDdjM2Q2ZTEzLCAweDFlY2JlZmE0KSwgV1RDUCgweDdjMzA3Y2MyLCAweDFlZmZmNzhmKSwgV1RDUCgweDdjMjM3NWE4LCAweDFmMzNmYTBhKSwgV1RDUCgweDdjMTY1OGM1LCAweDFmNjdmNzBiKSwKKyAgV1RDUCgweDdjMDkyNjFkLCAweDFmOWJlZThhKSwgV1RDUCgweDdiZmJkZGIxLCAweDFmY2ZlMDdkKSwgV1RDUCgweDdiZWU3Zjg1LCAweDIwMDNjY2RiKSwgV1RDUCgweDdiZTEwYjk5LCAweDIwMzdiMzliKSwKKyAgV1RDUCgweDdiZDM4MWYxLCAweDIwNmI5NGI0KSwgV1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwgV1RDUCgweDdiYjgyZDc2LCAweDIwZDM0NWNjKSwgV1RDUCgweDdiYWE2MmE4LCAweDIxMDcxNWI4KSwKKyAgV1RDUCgweDdiOWM4MjI2LCAweDIxM2FkZmRhKSwgV1RDUCgweDdiOGU4YmY1LCAweDIxNmVhNDI2KSwgV1RDUCgweDdiODA4MDE1LCAweDIxYTI2Mjk1KSwgV1RDUCgweDdiNzI1ZThhLCAweDIxZDYxYjFlKSwKKyAgV1RDUCgweDdiNjQyNzU2LCAweDIyMDljZGI2KSwgV1RDUCgweDdiNTVkYTdjLCAweDIyM2Q3YTU1KSwgV1RDUCgweDdiNDc3N2ZlLCAweDIyNzEyMGYzKSwgV1RDUCgweDdiMzhmZmRlLCAweDIyYTRjMTg1KSwKKyAgV1RDUCgweDdiMmE3MjFmLCAweDIyZDg1YzA0KSwgV1RDUCgweDdiMWJjZWM0LCAweDIzMGJmMDY1KSwgV1RDUCgweDdiMGQxNWQwLCAweDIzM2Y3ZWEwKSwgV1RDUCgweDdhZmU0NzQ0LCAweDIzNzMwNmFiKSwKKyAgV1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgV1RDUCgweDdhZTA2OTcxLCAweDIzZGEwNDExKSwgV1RDUCgweDdhZDE1YTJmLCAweDI0MGQ3OTU4KSwgV1RDUCgweDdhYzIzNTYxLCAweDI0NDBlODRkKSwKKyAgV1RDUCgweDdhYjJmYjA5LCAweDI0NzQ1MGU0KSwgV1RDUCgweDdhYTNhYjI5LCAweDI0YTdiMzE3KSwgV1RDUCgweDdhOTQ0NWM1LCAweDI0ZGIwZWRiKSwgV1RDUCgweDdhODRjYWRlLCAweDI1MGU2NDI3KSwKKyAgV1RDUCgweDdhNzUzYTc5LCAweDI1NDFiMmYzKSwgV1RDUCgweDdhNjU5NDk2LCAweDI1NzRmYjM2KSwgV1RDUCgweDdhNTVkOTNhLCAweDI1YTgzY2U2KSwgV1RDUCgweDdhNDYwODY3LCAweDI1ZGI3N2ZhKSwKKyAgV1RDUCgweDdhMzYyMjIwLCAweDI2MGVhYzZhKSwgV1RDUCgweDdhMjYyNjY4LCAweDI2NDFkYTJkKSwgV1RDUCgweDdhMTYxNTQwLCAweDI2NzUwMTM5KSwgV1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwKKyAgV1RDUCgweDc5ZjViMmIxLCAweDI2ZGIzYjBhKSwgV1RDUCgweDc5ZTU2MTRmLCAweDI3MGU0ZGJkKSwgV1RDUCgweDc5ZDRmYTg5LCAweDI3NDE1OTk2KSwgV1RDUCgweDc5YzQ3ZTYzLCAweDI3NzQ1ZThjKSwKKyAgV1RDUCgweDc5YjNlY2UwLCAweDI3YTc1Yzk1KSwgV1RDUCgweDc5YTM0NjAyLCAweDI3ZGE1M2E5KSwgV1RDUCgweDc5OTI4OWNjLCAweDI4MGQ0M2JmKSwgV1RDUCgweDc5ODFiODQxLCAweDI4NDAyY2NlKSwKKyAgV1RDUCgweDc5NzBkMTY1LCAweDI4NzMwZWNkKSwgV1RDUCgweDc5NWZkNTNhLCAweDI4YTVlOWI0KSwgV1RDUCgweDc5NGVjM2MzLCAweDI4ZDhiZDc4KSwgV1RDUCgweDc5M2Q5ZDAzLCAweDI5MGI4YTEyKSwKKyAgV1RDUCgweDc5MmM2MGZlLCAweDI5M2U0Zjc4KSwgV1RDUCgweDc5MWIwZmI1LCAweDI5NzEwZGExKSwgV1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgV1RDUCgweDc4ZjgyZDY4LCAweDI5ZDY3NDFiKSwKKyAgV1RDUCgweDc4ZTY5YzY5LCAweDJhMDkxYzU5KSwgV1RDUCgweDc4ZDRmNjM0LCAweDJhM2JiZDM3KSwgV1RDUCgweDc4YzMzYWNiLCAweDJhNmU1NmFjKSwgV1RDUCgweDc4YjE2YTMyLCAweDJhYTBlOGIwKSwKKyAgV1RDUCgweDc4OWY4NDZiLCAweDJhZDM3MzM4KSwgV1RDUCgweDc4OGQ4OTdiLCAweDJiMDVmNjNkKSwgV1RDUCgweDc4N2I3OTYzLCAweDJiMzg3MWI1KSwgV1RDUCgweDc4Njk1NDI4LCAweDJiNmFlNTk4KSwKKyAgV1RDUCgweDc4NTcxOWNjLCAweDJiOWQ1MWRkKSwgV1RDUCgweDc4NDRjYTUzLCAweDJiY2ZiNjdiKSwgV1RDUCgweDc4MzI2NWMwLCAweDJjMDIxMzY5KSwgV1RDUCgweDc4MWZlYzE1LCAweDJjMzQ2ODllKSwKKyAgV1RDUCgweDc4MGQ1ZDU3LCAweDJjNjZiNjExKSwgV1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgV1RDUCgweDc3ZTgwMGFkLCAweDJjY2IzOTkwKSwgV1RDUCgweDc3ZDUzMmM3LCAweDJjZmQ2ZjhhKSwKKyAgV1RDUCgweDc3YzI0ZmRiLCAweDJkMmY5ZDlmKSwgV1RDUCgweDc3YWY1N2ViLCAweDJkNjFjM2M3KSwgV1RDUCgweDc3OWM0YWZjLCAweDJkOTNlMWY4KSwgV1RDUCgweDc3ODkyOTEwLCAweDJkYzVmODI5KSwKKyAgV1RDUCgweDc3NzVmMjJhLCAweDJkZjgwNjUzKSwgV1RDUCgweDc3NjJhNjRmLCAweDJlMmEwYzZjKSwgV1RDUCgweDc3NGY0NTgxLCAweDJlNWMwYTZiKSwgV1RDUCgweDc3M2JjZmM0LCAweDJlOGUwMDQ4KSwKKyAgV1RDUCgweDc3Mjg0NTFjLCAweDJlYmZlZGZhKSwgV1RDUCgweDc3MTRhNThiLCAweDJlZjFkMzc3KSwgV1RDUCgweDc3MDBmMTE1LCAweDJmMjNiMGI5KSwgV1RDUCgweDc2ZWQyN2JlLCAweDJmNTU4NWI1KSwKKyAgV1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwgV1RDUCgweDc2YzU1Njc5LCAweDJmYjkxNmI5KSwgV1RDUCgweDc2YjE0ZTkzLCAweDJmZWFkMmIwKSwgV1RDUCgweDc2OWQzMWQ5LCAweDMwMWM4NjNmKSwKKyAgV1RDUCgweDc2ODkwMDUwLCAweDMwNGUzMTVkKSwgV1RDUCgweDc2NzRiOWZhLCAweDMwN2ZkNDAxKSwgV1RDUCgweDc2NjA1ZWRiLCAweDMwYjE2ZTIzKSwgV1RDUCgweDc2NGJlZWY4LCAweDMwZTJmZmI5KSwKKyAgV1RDUCgweDc2Mzc2YTUyLCAweDMxMTQ4OGJjKSwgV1RDUCgweDc2MjJkMGVmLCAweDMxNDYwOTIyKSwgV1RDUCgweDc2MGUyMmQxLCAweDMxNzc4MGUyKSwgV1RDUCgweDc1Zjk1ZmZjLCAweDMxYThlZmY1KSwKKyAgV1RDUCgweDc1ZTQ4ODc0LCAweDMxZGE1NjUxKSwgV1RDUCgweDc1Y2Y5YzNkLCAweDMyMGJiM2VlKSwgV1RDUCgweDc1YmE5YjVhLCAweDMyM2QwOGMzKSwgV1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwKKyAgV1RDUCgweDc1OTA1YmEwLCAweDMyOWY5N2YzKSwgV1RDUCgweDc1N2IxY2NmLCAweDMyZDBkMjNjKSwgV1RDUCgweDc1NjVjOTYyLCAweDMzMDIwMzliKSwgV1RDUCgweDc1NTA2MTVjLCAweDMzMzMyYzA2KSwKKyAgV1RDUCgweDc1M2FlNGMwLCAweDMzNjQ0Yjc2KSwgV1RDUCgweDc1MjU1MzkyLCAweDMzOTU2MWUxKSwgV1RDUCgweDc1MGZhZGQ3LCAweDMzYzY2ZjQwKSwgV1RDUCgweDc0ZjlmMzkxLCAweDMzZjc3Mzg4KSwKKyAgV1RDUCgweDc0ZTQyNGM1LCAweDM0Mjg2ZWIzKSwgV1RDUCgweDc0Y2U0MTc3LCAweDM0NTk2MGI3KSwgV1RDUCgweDc0Yjg0OWFhLCAweDM0OGE0OThiKSwgV1RDUCgweDc0YTIzZDYyLCAweDM0YmIyOTI3KSwKKyAgV1RDUCgweDc0OGMxY2E0LCAweDM0ZWJmZjgzKSwgV1RDUCgweDc0NzVlNzcyLCAweDM1MWNjYzk2KSwgV1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgV1RDUCgweDc0NDkzZmM1LCAweDM1N2U0YWJlKSwKKyAgV1RDUCgweDc0MzJjZDUxLCAweDM1YWVmYmMyKSwgV1RDUCgweDc0MWM0NjdiLCAweDM1ZGZhMzVhKSwgV1RDUCgweDc0MDVhYjQ1LCAweDM2MTA0MTdmKSwgV1RDUCgweDczZWVmYmIzLCAweDM2NDBkNjI3KSwKKyAgV1RDUCgweDczZDgzN2NhLCAweDM2NzE2MTRiKSwgV1RDUCgweDczYzE1ZjhkLCAweDM2YTFlMmUwKSwgV1RDUCgweDczYWE3MzAxLCAweDM2ZDI1YWUwKSwgV1RDUCgweDczOTM3MjJhLCAweDM3MDJjOTQyKSwKKyAgV1RDUCgweDczN2M1ZDBiLCAweDM3MzMyZGZkKSwgV1RDUCgweDczNjUzM2E5LCAweDM3NjM4OTA4KSwgV1RDUCgweDczNGRmNjA3LCAweDM3OTNkYTViKSwgV1RDUCgweDczMzZhNDJiLCAweDM3YzQyMWVlKSwKKyAgV1RDUCgweDczMWYzZTE3LCAweDM3ZjQ1ZmI3KSwgV1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwgV1RDUCgweDcyZjAzNTVhLCAweDM4NTRiZGNmKSwgV1RDUCgweDcyZDg5MmJhLCAweDM4ODRkZTBiKSwKKyAgV1RDUCgweDcyYzBkYmYzLCAweDM4YjRmNDVkKSwgV1RDUCgweDcyYTkxMTA5LCAweDM4ZTUwMGJjKSwgV1RDUCgweDcyOTEzMjAxLCAweDM5MTUwMzFmKSwgV1RDUCgweDcyNzkzZWRmLCAweDM5NDRmYjdlKSwKKyAgV1RDUCgweDcyNjEzN2E4LCAweDM5NzRlOWQwKSwgV1RDUCgweDcyNDkxYzVlLCAweDM5YTRjZTBlKSwgV1RDUCgweDcyMzBlZDA3LCAweDM5ZDRhODJmKSwgV1RDUCgweDcyMThhOWE3LCAweDNhMDQ3ODJhKSwKKyAgV1RDUCgweDcyMDA1MjQyLCAweDNhMzQzZGY3KSwgV1RDUCgweDcxZTdlNmRjLCAweDNhNjNmOThkKSwgV1RDUCgweDcxY2Y2NzdhLCAweDNhOTNhYWU1KSwgV1RDUCgweDcxYjZkNDIwLCAweDNhYzM1MWY2KSwKKyAgV1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgV1RDUCgweDcxODU3MTk1LCAweDNiMjI4MTIwKSwgV1RDUCgweDcxNmNhMjZjLCAweDNiNTIwOTJhKSwgV1RDUCgweDcxNTNiZjVkLCAweDNiODE4NmNhKSwKKyAgV1RDUCgweDcxM2FjODZiLCAweDNiYjBmOWZhKSwgV1RDUCgweDcxMjFiZDljLCAweDNiZTA2MmIwKSwgV1RDUCgweDcxMDg5ZWYyLCAweDNjMGZjMGU2KSwgV1RDUCgweDcwZWY2Yzc0LCAweDNjM2YxNDkxKSwKKyAgV1RDUCgweDcwZDYyNjI1LCAweDNjNmU1ZGFhKSwgV1RDUCgweDcwYmNjYzA5LCAweDNjOWQ5YzI4KSwgV1RDUCgweDcwYTM1ZTI1LCAweDNjY2NkMDA0KSwgV1RDUCgweDcwODlkYzdlLCAweDNjZmJmOTM1KSwKKyAgV1RDUCgweDcwNzA0NzE4LCAweDNkMmIxN2IzKSwgV1RDUCgweDcwNTY5ZGY4LCAweDNkNWEyYjc1KSwgV1RDUCgweDcwM2NlMTIyLCAweDNkODkzNDc0KSwgV1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwKKyAgV1RDUCgweDcwMDkyYzY1LCAweDNkZTcyNjA0KSwgV1RDUCgweDZmZWYzNDg4LCAweDNlMTYwZTg1KSwgV1RDUCgweDZmZDUyOTA3LCAweDNlNDRlYzIyKSwgV1RDUCgweDZmYmIwOWU3LCAweDNlNzNiZWQyKSwKKyAgV1RDUCgweDZmYTBkNzJjLCAweDNlYTI4NjhjKSwgV1RDUCgweDZmODY5MGRiLCAweDNlZDE0MzQ5KSwgV1RDUCgweDZmNmMzNmY4LCAweDNlZmZmNTAxKSwgV1RDUCgweDZmNTFjOTg5LCAweDNmMmU5YmFiKSwKKyAgV1RDUCgweDZmMzc0ODkxLCAweDNmNWQzNzNlKSwgV1RDUCgweDZmMWNiNDE2LCAweDNmOGJjN2I0KSwgV1RDUCgweDZmMDIwYzFjLCAweDNmYmE0ZDAzKSwgV1RDUCgweDZlZTc1MGE4LCAweDNmZThjNzI0KSwKKyAgV1RDUCgweDZlY2M4MWJlLCAweDQwMTczNjBlKSwgV1RDUCgweDZlYjE5ZjY0LCAweDQwNDU5OWI5KSwgV1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwgV1RDUCgweDZlN2JhMDZmLCAweDQwYTIzZjMyKSwKKyAgV1RDUCgweDZlNjA4M2RlLCAweDQwZDA4MGYwKSwgV1RDUCgweDZlNDU1M2VmLCAweDQwZmViNzRmKSwgV1RDUCgweDZlMmExMGE4LCAweDQxMmNlMjQ2KSwgV1RDUCgweDZlMGViYTBjLCAweDQxNWIwMWNlKSwKKyAgV1RDUCgweDZkZjM1MDIwLCAweDQxODkxNWRlKSwgV1RDUCgweDZkZDdkMmVhLCAweDQxYjcxZTZmKSwgV1RDUCgweDZkYmM0MjZlLCAweDQxZTUxYjc3KSwgV1RDUCgweDZkYTA5ZWIxLCAweDQyMTMwY2YwKSwKKyAgV1RDUCgweDZkODRlN2I3LCAweDQyNDBmMmQxKSwgV1RDUCgweDZkNjkxZDg3LCAweDQyNmVjZDEyKSwgV1RDUCgweDZkNGQ0MDIzLCAweDQyOWM5YmFiKSwgV1RDUCgweDZkMzE0ZjkzLCAweDQyY2E1ZTk0KSwKKyAgV1RDUCgweDZkMTU0YmQ5LCAweDQyZjgxNWM1KSwgV1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwgV1RDUCgweDZjZGQwYjAwLCAweDQzNTM2MGRlKSwgV1RDUCgweDZjYzBjZGVhLCAweDQzODBmNGI3KSwKKyAgV1RDUCgweDZjYTQ3ZGJmLCAweDQzYWU3Y2I3KSwgV1RDUCgweDZjODgxYTg0LCAweDQzZGJmOGQ3KSwgV1RDUCgweDZjNmJhNDNlLCAweDQ0MDk2OTEwKSwgV1RDUCgweDZjNGYxYWYyLCAweDQ0MzZjZDU4KSwKKyAgV1RDUCgweDZjMzI3ZWE2LCAweDQ0NjQyNWE4KSwgV1RDUCgweDZjMTVjZjVkLCAweDQ0OTE3MWY4KSwgV1RDUCgweDZiZjkwZDFkLCAweDQ0YmViMjQwKSwgV1RDUCgweDZiZGMzN2ViLCAweDQ0ZWJlNjc5KSwKKyAgV1RDUCgweDZiYmY0ZmNkLCAweDQ1MTkwZTk5KSwgV1RDUCgweDZiYTI1NGM3LCAweDQ1NDYyYTlhKSwgV1RDUCgweDZiODU0NmRlLCAweDQ1NzMzYTczKSwgV1RDUCgweDZiNjgyNjE3LCAweDQ1YTAzZTFkKSwKKyAgV1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgV1RDUCgweDZiMmRhYzA2LCAweDQ1ZmEyMGMyKSwgV1RDUCgweDZiMTA1MmM2LCAweDQ2MjZmZmFlKSwgV1RDUCgweDZhZjJlNmJjLCAweDQ2NTNkMjRiKSwKKyAgV1RDUCgweDZhZDU2N2VmLCAweDQ2ODA5ODkxKSwgV1RDUCgweDZhYjdkNjYzLCAweDQ2YWQ1Mjc4KSwgV1RDUCgweDZhOWEzMjFkLCAweDQ2ZDlmZmY4KSwgV1RDUCgweDZhN2M3YjIzLCAweDQ3MDZhMTBhKSwKKyAgV1RDUCgweDZhNWViMTdhLCAweDQ3MzMzNWE1KSwgV1RDUCgweDZhNDBkNTI3LCAweDQ3NWZiZGMzKSwgV1RDUCgweDZhMjJlNjMwLCAweDQ3OGMzOTVhKSwgV1RDUCgweDZhMDRlNDk5LCAweDQ3YjhhODY0KSwKKyAgV1RDUCgweDY5ZTZkMDY3LCAweDQ3ZTUwYWQ4KSwgV1RDUCgweDY5YzhhOWExLCAweDQ4MTE2MGFlKSwgV1RDUCgweDY5YWE3MDRjLCAweDQ4M2RhOWUwKSwgV1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwKKyAgV1RDUCgweDY5NmRjNjA3LCAweDQ4OTYxNjM1KSwgV1RDUCgweDY5NGY1NTIzLCAweDQ4YzIzOTQ5KSwgV1RDUCgweDY5MzBkMWM0LCAweDQ4ZWU0Zjk4KSwgV1RDUCgweDY5MTIzYmYxLCAweDQ5MWE1OTFjKSwKKyAgV1RDUCgweDY4ZjM5M2FlLCAweDQ5NDY1NWNjKSwgV1RDUCgweDY4ZDRkOTAwLCAweDQ5NzI0NWExKSwgV1RDUCgweDY4YjYwYmVlLCAweDQ5OWUyODkyKSwgV1RDUCgweDY4OTcyYzdkLCAweDQ5YzlmZTk5KSwKKyAgV1RDUCgweDY4NzgzYWIxLCAweDQ5ZjVjN2FlKSwgV1RDUCgweDY4NTkzNjkxLCAweDRhMjE4M2M4KSwgV1RDUCgweDY4M2EyMDIyLCAweDRhNGQzMmUxKSwgV1RDUCgweDY4MWFmNzZhLCAweDRhNzhkNGYwKSwKKyAgV1RDUCgweDY3ZmJiYzZkLCAweDRhYTQ2OWVlKSwgV1RDUCgweDY3ZGM2ZjMxLCAweDRhY2ZmMWQzKSwgV1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgV1RDUCgweDY3OWQ5ZTE0LCAweDRiMjZkYTM1KSwKKyAgV1RDUCgweDY3N2UxYTNlLCAweDRiNTIzYWEyKSwgV1RDUCgweDY3NWU4NDNlLCAweDRiN2Q4ZGQ4KSwgV1RDUCgweDY3M2VkYzFjLCAweDRiYThkM2NmKSwgV1RDUCgweDY3MWYyMWRjLCAweDRiZDQwYzgwKSwKKyAgV1RDUCgweDY2ZmY1NTg0LCAweDRiZmYzN2UyKSwgV1RDUCgweDY2ZGY3NzFhLCAweDRjMmE1NWVmKSwgV1RDUCgweDY2YmY4NmEzLCAweDRjNTU2NjlmKSwgV1RDUCgweDY2OWY4NDI1LCAweDRjODA2OWVhKSwKKyAgV1RDUCgweDY2N2Y2ZmE1LCAweDRjYWI1ZmM5KSwgV1RDUCgweDY2NWY0OTI5LCAweDRjZDY0ODM0KSwgV1RDUCgweDY2M2YxMGI3LCAweDRkMDEyMzI0KSwgV1RDUCgweDY2MWVjNjU0LCAweDRkMmJmMDkxKSwKKyAgV1RDUCgweDY1ZmU2YTA2LCAweDRkNTZiMDczKSwgV1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgV1RDUCgweDY1YmQ3YmMwLCAweDRkYWMwNzdiKSwgV1RDUCgweDY1OWNlOWQ0LCAweDRkZDY5ZTkyKSwKKyAgV1RDUCgweDY1N2M0NjEzLCAweDRlMDEyODAwKSwgV1RDUCgweDY1NWI5MDgzLCAweDRlMmJhM2JlKSwgV1RDUCgweDY1M2FjOTJiLCAweDRlNTYxMWM1KSwgV1RDUCgweDY1MTlmMDEwLCAweDRlODA3MjBlKSwKKyAgV1RDUCgweDY0ZjkwNTM4LCAweDRlYWFjNDkwKSwgV1RDUCgweDY0ZDgwOGE4LCAweDRlZDUwOTQ1KSwgV1RDUCgweDY0YjZmYTY2LCAweDRlZmY0MDI1KSwgV1RDUCgweDY0OTVkYTc5LCAweDRmMjk2OTI4KSwKKyAgV1RDUCgweDY0NzRhOGU1LCAweDRmNTM4NDQ4KSwgV1RDUCgweDY0NTM2NWIyLCAweDRmN2Q5MTdjKSwgV1RDUCgweDY0MzIxMGU0LCAweDRmYTc5MGJlKSwgV1RDUCgweDY0MTBhYTgxLCAweDRmZDE4MjA2KSwKKyAgV1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwgV1RDUCgweDYzY2RhOTE2LCAweDUwMjUzYThiKSwgV1RDUCgweDYzYWMwZTE5LCAweDUwNGYwMWJhKSwgV1RDUCgweDYzOGE2MTllLCAweDUwNzhiYWQxKSwKKyAgV1RDUCgweDYzNjhhM2FkLCAweDUwYTI2NWM5KSwgV1RDUCgweDYzNDZkNDRiLCAweDUwY2MwMjljKSwgV1RDUCgweDYzMjRmMzdkLCAweDUwZjU5MTQxKSwgV1RDUCgweDYzMDMwMTRhLCAweDUxMWYxMWIyKSwKKyAgV1RDUCgweDYyZTBmZGI4LCAweDUxNDg4M2U3KSwgV1RDUCgweDYyYmVlOGNjLCAweDUxNzFlN2Q5KSwgV1RDUCgweDYyOWNjMjhjLCAweDUxOWIzZDgwKSwgV1RDUCgweDYyN2E4YjAwLCAweDUxYzQ4NGQ2KSwKKyAgV1RDUCgweDYyNTg0MjJjLCAweDUxZWRiZGQ0KSwgV1RDUCgweDYyMzVlODE2LCAweDUyMTZlODcxKSwgV1RDUCgweDYyMTM3Y2M1LCAweDUyNDAwNGE3KSwgV1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwKKyAgV1RDUCgweDYxY2U3Mjg5LCAweDUyOTIxMWMwKSwgV1RDUCgweDYxYWJkM2FiLCAweDUyYmIwMjk1KSwgV1RDUCgweDYxODkyM2E5LCAweDUyZTNlNGU2KSwgV1RDUCgweDYxNjY2Mjg5LCAweDUzMGNiOGFjKSwKKyAgV1RDUCgweDYxNDM5MDUzLCAweDUzMzU3ZGRmKSwgV1RDUCgweDYxMjBhZDBkLCAweDUzNWUzNDc5KSwgV1RDUCgweDYwZmRiOGJiLCAweDUzODZkYzcyKSwgV1RDUCgweDYwZGFiMzY1LCAweDUzYWY3NWMzKSwKKyAgV1RDUCgweDYwYjc5ZDEwLCAweDUzZDgwMDY1KSwgV1RDUCgweDYwOTQ3NWMzLCAweDU0MDA3YzUxKSwgV1RDUCgweDYwNzEzZDg0LCAweDU0MjhlOTgwKSwgV1RDUCgweDYwNGRmNDU5LCAweDU0NTE0N2ViKSwKKyAgV1RDUCgweDYwMmE5YTQ4LCAweDU0Nzk5NzhhKSwgV1RDUCgweDYwMDcyZjU3LCAweDU0YTFkODU3KSwgV1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgV1RDUCgweDVmYzAyNmYwLCAweDU0ZjIyZDVkKSwKKyAgV1RDUCgweDVmOWM4OTg3LCAweDU1MWE0MTg5KSwgV1RDUCgweDVmNzhkYjU2LCAweDU1NDI0NmM2KSwgV1RDUCgweDVmNTUxYzY1LCAweDU1NmEzZDBkKSwgV1RDUCgweDVmMzE0Y2JhLCAweDU1OTIyNDU3KSwKKyAgV1RDUCgweDVmMGQ2YzViLCAweDU1YjlmYzllKSwgV1RDUCgweDVlZTk3YjRmLCAweDU1ZTFjNWRhKSwgV1RDUCgweDVlYzU3OTliLCAweDU2MDk4MDA1KSwgV1RDUCgweDVlYTE2NzQ3LCAweDU2MzEyYjE3KSwKKyAgV1RDUCgweDVlN2Q0NDU4LCAweDU2NThjNzA5KSwgV1RDUCgweDVlNTkxMGQ0LCAweDU2ODA1M2Q1KSwgV1RDUCgweDVlMzRjY2MzLCAweDU2YTdkMTc0KSwgV1RDUCgweDVlMTA3ODJiLCAweDU2Y2YzZmRlKSwKKyAgV1RDUCgweDVkZWMxMzExLCAweDU2ZjY5ZjBkKSwgV1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwgV1RDUCgweDVkYTMxNzczLCAweDU3NDUyZjlkKSwgV1RDUCgweDVkN2U4MGZjLCAweDU3NmM2MGYxKSwKKyAgV1RDUCgweDVkNTlkYTFlLCAweDU3OTM4MmVlKSwgV1RDUCgweDVkMzUyMmRlLCAweDU3YmE5NThkKSwgV1RDUCgweDVkMTA1YjQ0LCAweDU3ZTE5OGM3KSwgV1RDUCgweDVjZWI4MzU1LCAweDU4MDg4Yzk2KSwKKyAgV1RDUCgweDVjYzY5YjE5LCAweDU4MmY3MGYzKSwgV1RDUCgweDVjYTFhMjk1LCAweDU4NTY0NWQ3KSwgV1RDUCgweDVjN2M5OWQxLCAweDU4N2QwYjNiKSwgV1RDUCgweDVjNTc4MGQzLCAweDU4YTNjMTE4KSwKKyAgV1RDUCgweDVjMzI1N2EwLCAweDU4Y2E2NzY3KSwgV1RDUCgweDVjMGQxZTQxLCAweDU4ZjBmZTIzKSwgV1RDUCgweDViZTdkNGJhLCAweDU5MTc4NTQzKSwgV1RDUCgweDViYzI3YjE0LCAweDU5M2RmY2MyKSwKKyAgV1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgV1RDUCgweDViNzc5NzgwLCAweDU5OGFiY2JlKSwgV1RDUCgweDViNTIwZGExLCAweDU5YjEwNTJmKSwgV1RDUCgweDViMmM3M2JiLCAweDU5ZDczZGUzKSwKKyAgV1RDUCgweDViMDZjOWQ2LCAweDU5ZmQ2NmQ0KSwgV1RDUCgweDVhZTEwZmY5LCAweDVhMjM3ZmZhKSwgV1RDUCgweDVhYmI0NjI5LCAweDVhNDk4OTUwKSwgV1RDUCgweDVhOTU2YzZlLCAweDVhNmY4MmNlKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c5NjBbXSA9Cit7CisgIFdUQ1AoMHg3ZmZmZmY5ZSwgMHgwMDA5ZTZhYyksIFdUQ1AoMHg3ZmZmZmYyYiwgMHgwMDBlOTZkNSksIFdUQ1AoMHg3ZmZmZmVhNiwgMHgwMDEyOTg3ZSksIFdUQ1AoMHg3ZmZmZmUwZSwgMHgwMDE2NTJiNiksCisgIFdUQ1AoMHg3ZmZmZmQ2MCwgMHgwMDE5ZWJjZSksIFdUQ1AoMHg3ZmZmZmM5YywgMHgwMDFkNzZiZiksIFdUQ1AoMHg3ZmZmZmJiZiwgMHgwMDIwZmU3OSksIFdUQ1AoMHg3ZmZmZmFjOSwgMHgwMDI0ODllZiksCisgIFdUQ1AoMHg3ZmZmZjliNywgMHgwMDI4MWRlMiksIFdUQ1AoMHg3ZmZmZjg4NywgMHgwMDJiYmRiYiksIFdUQ1AoMHg3ZmZmZjczNywgMHgwMDJmNmMwZCksIFdUQ1AoMHg3ZmZmZjVjNiwgMHgwMDMzMmFkOCksCisgIFdUQ1AoMHg3ZmZmZjQzMSwgMHgwMDM2ZmJiOSksIFdUQ1AoMHg3ZmZmZjI3NiwgMHgwMDNhZTAwNCksIFdUQ1AoMHg3ZmZmZjA5MiwgMHgwMDNlZDhkOCksIFdUQ1AoMHg3ZmZmZWU4NCwgMHgwMDQyZTcyZiksCisgIFdUQ1AoMHg3ZmZmZWM0OCwgMHgwMDQ3MGJlMyksIFdUQ1AoMHg3ZmZmZTlkZCwgMHgwMDRiNDdiOCksIFdUQ1AoMHg3ZmZmZTczZiwgMHgwMDRmOWI1ZiksIFdUQ1AoMHg3ZmZmZTQ2YiwgMHgwMDU0MDc3YSksCisgIFdUQ1AoMHg3ZmZmZTE1ZiwgMHgwMDU4OGNhMSksIFdUQ1AoMHg3ZmZmZGUxNywgMHgwMDVkMmI2MSksIFdUQ1AoMHg3ZmZmZGE5MSwgMHgwMDYxZTQ0MiksIFdUQ1AoMHg3ZmZmZDZjOSwgMHgwMDY2YjdjMiksCisgIFdUQ1AoMHg3ZmZmZDJiYiwgMHgwMDZiYTY1YyksIFdUQ1AoMHg3ZmZmY2U2NSwgMHgwMDcwYjA4NyksIFdUQ1AoMHg3ZmZmYzljMiwgMHgwMDc1ZDZiNSksIFdUQ1AoMHg3ZmZmYzRjZiwgMHgwMDdiMTk1NSksCisgIFdUQ1AoMHg3ZmZmYmY4NywgMHgwMDgwNzhkNSksIFdUQ1AoMHg3ZmZmYjllNywgMHgwMDg1ZjVhMCksIFdUQ1AoMHg3ZmZmYjNlYSwgMHgwMDhiOTAxZCksIFdUQ1AoMHg3ZmZmYWQ4YywgMHgwMDkxNDhiNCksCisgIFdUQ1AoMHg3ZmZmYTZjOSwgMHgwMDk3MWZjYiksIFdUQ1AoMHg3ZmZmOWY5YywgMHgwMDlkMTVjNyksIFdUQ1AoMHg3ZmZmOTgwMCwgMHgwMGEzMmIwYiksIFdUQ1AoMHg3ZmZmOGZmMCwgMHgwMGE5NWZmOSksCisgIFdUQ1AoMHg3ZmZmODc2NywgMHgwMGFmYjRmNCksIFdUQ1AoMHg3ZmZmN2U1ZiwgMHgwMGI2MmE1YyksIFdUQ1AoMHg3ZmZmNzRkNCwgMHgwMGJjYzA5MyksIFdUQ1AoMHg3ZmZmNmFjMCwgMHgwMGMzNzdmOCksCisgIFdUQ1AoMHg3ZmZmNjAxYywgMHgwMGNhNTBlYiksIFdUQ1AoMHg3ZmZmNTRlMywgMHgwMGQxNGJjYiksIFdUQ1AoMHg3ZmZmNDkwZSwgMHgwMGQ4NjhmNyksIFdUQ1AoMHg3ZmZmM2M5OCwgMHgwMGRmYThjZSksCisgIFdUQ1AoMHg3ZmZmMmY3OSwgMHgwMGU3MGJhZCksIFdUQ1AoMHg3ZmZmMjFhYywgMHgwMGVlOTFmMyksIFdUQ1AoMHg3ZmZmMTMyOCwgMHgwMGY2M2JmZSksIFdUQ1AoMHg3ZmZmMDNlNywgMHgwMGZlMGEyYyksCisgIFdUQ1AoMHg3ZmZlZjNlMSwgMHgwMTA1ZmNkOSksIFdUQ1AoMHg3ZmZlZTMxMCwgMHgwMTBlMTQ2MiksIFdUQ1AoMHg3ZmZlZDE2YSwgMHgwMTE2NTEyNiksIFdUQ1AoMHg3ZmZlYmVlOSwgMHgwMTFlYjM4MSksCisgIFdUQ1AoMHg3ZmZlYWI4MywgMHgwMTI3M2JkMCksIFdUQ1AoMHg3ZmZlOTczMSwgMHgwMTJmZWE2ZiksIFdUQ1AoMHg3ZmZlODFlYSwgMHgwMTM4YmZiYyksIFdUQ1AoMHg3ZmZlNmJhNCwgMHgwMTQxYmMxMiksCisgIFdUQ1AoMHg3ZmZlNTQ1NywgMHgwMTRhZGZjZSksIFdUQ1AoMHg3ZmZlM2JmYSwgMHgwMTU0MmI0ZCksIFdUQ1AoMHg3ZmZlMjI4MiwgMHgwMTVkOWVlOSksIFdUQ1AoMHg3ZmZlMDdlNiwgMHgwMTY3M2IwMSksCisgIFdUQ1AoMHg3ZmZkZWMxYiwgMHgwMTcwZmZlZSksIFdUQ1AoMHg3ZmZkY2YxNywgMHgwMTdhZWUwZSksIFdUQ1AoMHg3ZmZkYjBkMCwgMHgwMTg1MDViYyksIFdUQ1AoMHg3ZmZkOTEzYiwgMHgwMThmNDc1NCksCisgIFdUQ1AoMHg3ZmZkNzA0YiwgMHgwMTk5YjMzMCksIFdUQ1AoMHg3ZmZkNGRmNywgMHgwMWE0NDlhZCksIFdUQ1AoMHg3ZmZkMmEzMSwgMHgwMWFmMGIyNSksIFdUQ1AoMHg3ZmZkMDRlZiwgMHgwMWI5ZjdmNCksCisgIFdUQ1AoMHg3ZmZjZGUyMywgMHgwMWM1MTA3NCksIFdUQ1AoMHg3ZmZjYjVjMSwgMHgwMWQwNTUwMSksIFdUQ1AoMHg3ZmZjOGJiYywgMHgwMWRiYzVmNSksIFdUQ1AoMHg3ZmZjNjAwNiwgMHgwMWU3NjNhYiksCisgIFdUQ1AoMHg3ZmZjMzI5MywgMHgwMWYzMmU3ZCksIFdUQ1AoMHg3ZmZjMDM1NCwgMHgwMWZmMjZjNSksIFdUQ1AoMHg3ZmZiZDIzYiwgMHgwMjBiNGNkZSksIFdUQ1AoMHg3ZmZiOWYzYSwgMHgwMjE3YTEyMCksCisgIFdUQ1AoMHg3ZmZiNmE0MSwgMHgwMjI0MjNlNiksIFdUQ1AoMHg3ZmZiMzM0MiwgMHgwMjMwZDU4YSksIFdUQ1AoMHg3ZmZhZmEyZCwgMHgwMjNkYjY2NCksIFdUQ1AoMHg3ZmZhYmVmMiwgMHgwMjRhYzZjZSksCisgIFdUQ1AoMHg3ZmZhODE4MCwgMHgwMjU4MDcyMCksIFdUQ1AoMHg3ZmZhNDFjOSwgMHgwMjY1NzdiMyksIFdUQ1AoMHg3ZmY5ZmZiOSwgMHgwMjczMThlMCksIFdUQ1AoMHg3ZmY5YmI0MSwgMHgwMjgwZWFmZiksCisgIFdUQ1AoMHg3ZmY5NzQ0ZSwgMHgwMjhlZWU2OCksIFdUQ1AoMHg3ZmY5MmFjZiwgMHgwMjlkMjM3MSksIFdUQ1AoMHg3ZmY4ZGViMSwgMHgwMmFiOGE3NCksIFdUQ1AoMHg3ZmY4OGZlMiwgMHgwMmJhMjNjNyksCisgIFdUQ1AoMHg3ZmY4M2U0ZCwgMHgwMmM4ZWZjMCksIFdUQ1AoMHg3ZmY3ZTllMSwgMHgwMmQ3ZWViNyksIFdUQ1AoMHg3ZmY3OTI4OCwgMHgwMmU3MjEwMSksIFdUQ1AoMHg3ZmY3MzgyZiwgMHgwMmY2ODZmNSksCisgIFdUQ1AoMHg3ZmY2ZGFjMSwgMHgwMzA2MjBlOSksIFdUQ1AoMHg3ZmY2N2EyOSwgMHgwMzE1ZWYzMSksIFdUQ1AoMHg3ZmY2MTY1MSwgMHgwMzI1ZjIyNCksIFdUQ1AoMHg3ZmY1YWYyMywgMHgwMzM2MmExNCksCisgIFdUQ1AoMHg3ZmY1NDQ4YSwgMHgwMzQ2OTc1OCksIFdUQ1AoMHg3ZmY0ZDY2ZCwgMHgwMzU3M2E0MiksIFdUQ1AoMHg3ZmY0NjRiNywgMHgwMzY4MTMyNyksIFdUQ1AoMHg3ZmYzZWY0ZiwgMHgwMzc5MjI1YSksCisgIFdUQ1AoMHg3ZmYzNzYxZCwgMHgwMzhhNjgyZSksIFdUQ1AoMHg3ZmYyZjkwYSwgMHgwMzliZTRmNCksIFdUQ1AoMHg3ZmYyNzdmYiwgMHgwM2FkOTkwMCksIFdUQ1AoMHg3ZmYxZjJkOCwgMHgwM2JmODRhMyksCisgIFdUQ1AoMHg3ZmYxNjk4NiwgMHgwM2QxYTgyZSksIFdUQ1AoMHg3ZmYwZGJlYywgMHgwM2U0MDNmMyksIFdUQ1AoMHg3ZmYwNDllZiwgMHgwM2Y2OTg0MCksIFdUQ1AoMHg3ZmVmYjM3MywgMHgwNDA5NjU2OCksCisgIFdUQ1AoMHg3ZmVmMTg1ZCwgMHgwNDFjNmJiOCksIFdUQ1AoMHg3ZmVlNzg5MCwgMHgwNDJmYWI4MSksIFdUQ1AoMHg3ZmVkZDNmMSwgMHgwNDQzMjUxMCksIFdUQ1AoMHg3ZmVkMmE2MSwgMHgwNDU2ZDhiNCksCisgIFdUQ1AoMHg3ZmVjN2JjNCwgMHgwNDZhYzZiYSksIFdUQ1AoMHg3ZmViYzdmYiwgMHgwNDdlZWY3MCksIFdUQ1AoMHg3ZmViMGVlOCwgMHgwNDkzNTMyMiksIFdUQ1AoMHg3ZmVhNTA2YiwgMHgwNGE3ZjIxZCksCisgIFdUQ1AoMHg3ZmU5OGM2NSwgMHgwNGJjY2NhYiksIFdUQ1AoMHg3ZmU4YzJiNywgMHgwNGQxZTMxOCksIFdUQ1AoMHg3ZmU3ZjMzZSwgMHgwNGU3MzVhZiksIFdUQ1AoMHg3ZmU3MWRkYiwgMHgwNGZjYzRiYSksCisgIFdUQ1AoMHg3ZmU2NDI2YywgMHgwNTEyOTA4MSksIFdUQ1AoMHg3ZmU1NjBjZSwgMHgwNTI4OTk0ZCksIFdUQ1AoMHg3ZmU0NzhkZiwgMHgwNTNlZGY2OCksIFdUQ1AoMHg3ZmUzOGE3YywgMHgwNTU1NjMxOCksCisgIFdUQ1AoMHg3ZmUyOTU4MSwgMHgwNTZjMjRhNSksIFdUQ1AoMHg3ZmUxOTljYSwgMHgwNTgzMjQ1NSksIFdUQ1AoMHg3ZmUwOTczMywgMHgwNTlhNjI2ZSksIFdUQ1AoMHg3ZmRmOGQ5NSwgMHgwNWIxZGYzNSksCisgIFdUQ1AoMHg3ZmRlN2NjYiwgMHgwNWM5OWFlZiksIFdUQ1AoMHg3ZmRkNjRhZiwgMHgwNWUxOTVlMCksIFdUQ1AoMHg3ZmRjNDUxYSwgMHgwNWY5ZDA0YiksIFdUQ1AoMHg3ZmRiMWRlNCwgMHgwNjEyNGE3MyksCisgIFdUQ1AoMHg3ZmQ5ZWVlNSwgMHgwNjJiMDQ5OSksIFdUQ1AoMHg3ZmQ4YjdmNSwgMHgwNjQzZmYwMCksIFdUQ1AoMHg3ZmQ3NzhlYywgMHgwNjVkMzllNyksIFdUQ1AoMHg3ZmQ2MzE5ZSwgMHgwNjc2YjU4ZiksCisgIFdUQ1AoMHg3ZmQ0ZTFlMiwgMHgwNjkwNzIzNyksIFdUQ1AoMHg3ZmQzODk4ZCwgMHgwNmFhNzAxZCksIFdUQ1AoMHg3ZmQyMjg3MywgMHgwNmM0YWY4MCksIFdUQ1AoMHg3ZmQwYmU2YSwgMHgwNmRmMzA5YyksCisgIFdUQ1AoMHg3ZmNmNGI0NCwgMHgwNmY5ZjNhZCksIFdUQ1AoMHg3ZmNkY2VkNCwgMHgwNzE0ZjhmMCksIFdUQ1AoMHg3ZmNjNDhlZCwgMHgwNzMwNDA5ZiksIFdUQ1AoMHg3ZmNhYjk2MCwgMHgwNzRiY2FmNSksCisgIFdUQ1AoMHg3ZmM5MWZmZiwgMHgwNzY3OTgyYSksIFdUQ1AoMHg3ZmM3N2M5YSwgMHgwNzgzYTg3NyksIFdUQ1AoMHg3ZmM1Y2YwMiwgMHgwNzlmZmMxNCksIFdUQ1AoMHg3ZmM0MTcwNSwgMHgwN2JjOTMzOCksCisgIFdUQ1AoMHg3ZmMyNTQ3NCwgMHgwN2Q5NmUxOSksIFdUQ1AoMHg3ZmMwODcxYiwgMHgwN2Y2OGNlZCksIFdUQ1AoMHg3ZmJlYWVjYSwgMHgwODEzZWZlNyksIFdUQ1AoMHg3ZmJjY2I0YywgMHgwODMxOTczZCksCisgIFdUQ1AoMHg3ZmJhZGM3MCwgMHgwODRmODMyMCksIFdUQ1AoMHg3ZmI4ZTIwMCwgMHgwODZkYjNjMyksIFdUQ1AoMHg3ZmI2ZGJjOCwgMHgwODhjMjk1NyksIFdUQ1AoMHg3ZmI0Yzk5MywgMHgwOGFhZTQwYyksCisgIFdUQ1AoMHg3ZmIyYWIyYiwgMHgwOGM5ZTQxMiksIFdUQ1AoMHg3ZmIwODA1YSwgMHgwOGU5Mjk5NyksIFdUQ1AoMHg3ZmFlNDhlOSwgMHgwOTA4YjRjOSksIFdUQ1AoMHg3ZmFjMDRhMCwgMHgwOTI4ODVkNiksCisgIFdUQ1AoMHg3ZmE5YjM0NywgMHgwOTQ4OWNlOCksIFdUQ1AoMHg3ZmE3NTRhNiwgMHgwOTY4ZmEyYyksIFdUQ1AoMHg3ZmE0ZTg4NCwgMHgwOTg5OWRjYiksIFdUQ1AoMHg3ZmEyNmVhNiwgMHgwOWFhODdlZSksCisgIFdUQ1AoMHg3ZjlmZTZkMSwgMHgwOWNiYjhiZSksIFdUQ1AoMHg3ZjlkNTBjYywgMHgwOWVkMzA2MiksIFdUQ1AoMHg3ZjlhYWM1YSwgMHgwYTBlZWYwMCksIFdUQ1AoMHg3Zjk3ZjkzZiwgMHgwYTMwZjRiZiksCisgIFdUQ1AoMHg3Zjk1MzczZSwgMHgwYTUzNDFjMiksIFdUQ1AoMHg3ZjkyNjYxYiwgMHgwYTc1ZDYyZSksIFdUQ1AoMHg3ZjhmODU5NiwgMHgwYTk4YjIyNCksIFdUQ1AoMHg3ZjhjOTU3MiwgMHgwYWJiZDVjNyksCisgIFdUQ1AoMHg3Zjg5OTU2ZiwgMHgwYWRmNDEzNyksIFdUQ1AoMHg3Zjg2ODU0ZCwgMHgwYjAyZjQ5NCksIFdUQ1AoMHg3ZjgzNjRjZCwgMHgwYjI2ZWZmZCksIFdUQ1AoMHg3ZjgwMzNhZSwgMHgwYjRiMzM4ZiksCisgIFdUQ1AoMHg3ZjdjZjFhZSwgMHgwYjZmYmY2NyksIFdUQ1AoMHg3Zjc5OWU4YiwgMHgwYjk0OTNhMCksIFdUQ1AoMHg3Zjc2M2EwMywgMHgwYmI5YjA1NiksIFdUQ1AoMHg3ZjcyYzNkMiwgMHgwYmRmMTVhMiksCisgIFdUQ1AoMHg3ZjZmM2JiNSwgMHgwYzA0YzM5YyksIFdUQ1AoMHg3ZjZiYTE2OCwgMHgwYzJhYmE1ZCksIFdUQ1AoMHg3ZjY3ZjRhNiwgMHgwYzUwZjlmYSksIFdUQ1AoMHg3ZjY0MzUyOSwgMHgwYzc3ODI4YSksCisgIFdUQ1AoMHg3ZjYwNjJhYywgMHgwYzllNTQyMCksIFdUQ1AoMHg3ZjVjN2NlOCwgMHgwY2M1NmVkMSksIFdUQ1AoMHg3ZjU4ODM5NywgMHgwY2VjZDJhZSksIFdUQ1AoMHg3ZjU0NzY3MCwgMHgwZDE0N2ZjOCksCisgIFdUQ1AoMHg3ZjUwNTUyYywgMHgwZDNjNzYzMCksIFdUQ1AoMHg3ZjRjMWY4MywgMHgwZDY0YjVmNiksIFdUQ1AoMHg3ZjQ3ZDUyYSwgMHgwZDhkM2YyNiksIFdUQ1AoMHg3ZjQzNzVkOSwgMHgwZGI2MTFjZSksCisgIFdUQ1AoMHg3ZjNmMDE0NCwgMHgwZGRmMmRmYSksIFdUQ1AoMHg3ZjNhNzcyMywgMHgwZTA4OTNiNCksIFdUQ1AoMHg3ZjM1ZDcyOSwgMHgwZTMyNDMwNiksIFdUQ1AoMHg3ZjMxMjEwYSwgMHgwZTVjM2JmOSksCisgIFdUQ1AoMHg3ZjJjNTQ3YiwgMHgwZTg2N2U5NCksIFdUQ1AoMHg3ZjI3NzEyZSwgMHgwZWIxMGFkZCksIFdUQ1AoMHg3ZjIyNzZkOCwgMHgwZWRiZTBkYSksIFdUQ1AoMHg3ZjFkNjUyOSwgMHgwZjA3MDA4ZSksCisgIFdUQ1AoMHg3ZjE4M2JkMywgMHgwZjMyNjlmYyksIFdUQ1AoMHg3ZjEyZmE4OSwgMHgwZjVlMWQyNyksIFdUQ1AoMHg3ZjBkYTBmYiwgMHgwZjhhMWEwZSksIFdUQ1AoMHg3ZjA4MmVkOCwgMHgwZmI2NjBiMSksCisgIFdUQ1AoMHg3ZjAyYTNkMiwgMHgwZmUyZjEwZiksIFdUQ1AoMHg3ZWZjZmY5OCwgMHgxMDBmY2IyNSksIFdUQ1AoMHg3ZWY3NDFkOSwgMHgxMDNjZWVlZSksIFdUQ1AoMHg3ZWYxNmE0MiwgMHgxMDZhNWM2NiksCisgIFdUQ1AoMHg3ZWViNzg4NCwgMHgxMDk4MTM4NiksIFdUQ1AoMHg3ZWU1NmM0YSwgMHgxMGM2MTQ0NyksIFdUQ1AoMHg3ZWRmNDU0MywgMHgxMGY0NWVhMCksIFdUQ1AoMHg3ZWQ5MDMxYiwgMHgxMTIyZjI4OCksCisgIFdUQ1AoMHg3ZWQyYTU3ZiwgMHgxMTUxY2ZmMyksIFdUQ1AoMHg3ZWNjMmMxYSwgMHgxMTgwZjZkNSksIFdUQ1AoMHg3ZWM1OTY5OSwgMHgxMWIwNjcyMCksIFdUQ1AoMHg3ZWJlZTRhNiwgMHgxMWUwMjBjOCksCisgIFdUQ1AoMHg3ZWI4MTVlZCwgMHgxMjEwMjNiYSksIFdUQ1AoMHg3ZWIxMmExOCwgMHgxMjQwNmZlOCksIFdUQ1AoMHg3ZWFhMjBkMSwgMHgxMjcxMDUzZSksIFdUQ1AoMHg3ZWEyZjljMiwgMHgxMmExZTNhOSksCisgIFdUQ1AoMHg3ZTliYjQ5NCwgMHgxMmQzMGIxNSksIFdUQ1AoMHg3ZTk0NTBmMCwgMHgxMzA0N2I2YyksIFdUQ1AoMHg3ZThjY2U3ZiwgMHgxMzM2MzQ5NyksIFdUQ1AoMHg3ZTg1MmNlOSwgMHgxMzY4MzY3ZiksCisgIFdUQ1AoMHg3ZTdkNmJkNiwgMHgxMzlhODEwOSksIFdUQ1AoMHg3ZTc1OGFlZSwgMHgxM2NkMTQxYiksIFdUQ1AoMHg3ZTZkODlkOSwgMHgxM2ZmZWY5OSksIFdUQ1AoMHg3ZTY1NjgzZCwgMHgxNDMzMTM2OCksCisgIFdUQ1AoMHg3ZTVkMjVjMSwgMHgxNDY2N2Y2NyksIFdUQ1AoMHg3ZTU0YzIwYiwgMHgxNDlhMzM3OSksIFdUQ1AoMHg3ZTRjM2NjMywgMHgxNGNlMmY3YyksIFdUQ1AoMHg3ZTQzOTU4ZSwgMHgxNTAyNzM0ZiksCisgIFdUQ1AoMHg3ZTNhY2MxMSwgMHgxNTM2ZmVjZSksIFdUQ1AoMHg3ZTMxZGZmMiwgMHgxNTZiZDFkNiksIFdUQ1AoMHg3ZTI4ZDBkNywgMHgxNWEwZWM0MSksIFdUQ1AoMHg3ZTFmOWU2MywgMHgxNWQ2NGRlOSksCisgIFdUQ1AoMHg3ZTE2NDgzZCwgMHgxNjBiZjZhNSksIFdUQ1AoMHg3ZTBjY2UwOCwgMHgxNjQxZTY0YyksIFdUQ1AoMHg3ZTAzMmY2YSwgMHgxNjc4MWNiNCksIFdUQ1AoMHg3ZGY5NmMwNSwgMHgxNmFlOTliMiksCisgIFdUQ1AoMHg3ZGVmODM3ZSwgMHgxNmU1NWQxOCksIFdUQ1AoMHg3ZGU1NzU3OSwgMHgxNzFjNjZiYSksIFdUQ1AoMHg3ZGRiNDE5YSwgMHgxNzUzYjY2NyksIFdUQ1AoMHg3ZGQwZTc4NCwgMHgxNzhiNGJlZiksCisgIFdUQ1AoMHg3ZGM2NjZkOSwgMHgxN2MzMjcyMSksIFdUQ1AoMHg3ZGJiYmYzZSwgMHgxN2ZiNDdjYSksIFdUQ1AoMHg3ZGIwZjA1NiwgMHgxODMzYWRiNSksIFdUQ1AoMHg3ZGE1ZjljMywgMHgxODZjNThhZSksCisgIFdUQ1AoMHg3ZDlhZGIyOSwgMHgxOGE1NDg3ZCksIFdUQ1AoMHg3ZDhmOTQyOSwgMHgxOGRlN2NlYyksIFdUQ1AoMHg3ZDg0MjQ2NywgMHgxOTE3ZjVjMSksIFdUQ1AoMHg3ZDc4OGI4NiwgMHgxOTUxYjJjMiksCisgIFdUQ1AoMHg3ZDZjYzkyNywgMHgxOThiYjNiNCksIFdUQ1AoMHg3ZDYwZGNlZCwgMHgxOWM1Zjg1YSksIFdUQ1AoMHg3ZDU0YzY3YywgMHgxYTAwODA3NyksIFdUQ1AoMHg3ZDQ4ODU3NCwgMHgxYTNiNGJjYiksCisgIFdUQ1AoMHg3ZDNjMTk3OSwgMHgxYTc2NWExNyksIFdUQ1AoMHg3ZDJmODIyZCwgMHgxYWIxYWIxOCksIFdUQ1AoMHg3ZDIyYmYzMiwgMHgxYWVkM2U4ZCksIFdUQ1AoMHg3ZDE1ZDAyYiwgMHgxYjI5MTQzMiksCisgIFdUQ1AoMHg3ZDA4YjRiYSwgMHgxYjY1MmJjMSksIFdUQ1AoMHg3Y2ZiNmM4MiwgMHgxYmExODRmNSksIFdUQ1AoMHg3Y2VkZjcyNSwgMHgxYmRlMWY4NiksIFdUQ1AoMHg3Y2UwNTQ0NSwgMHgxYzFhZmIyYyksCisgIFdUQ1AoMHg3Y2QyODM4NiwgMHgxYzU4MTc5YyksIFdUQ1AoMHg3Y2M0ODQ4OSwgMHgxYzk1NzQ4ZCksIFdUQ1AoMHg3Y2I2NTZmMywgMHgxY2QzMTFiMSksIFdUQ1AoMHg3Y2E3ZmE2NSwgMHgxZDEwZWViZCksCisgIFdUQ1AoMHg3Yzk5NmU4MywgMHgxZDRmMGI2MCksIFdUQ1AoMHg3YzhhYjJmMCwgMHgxZDhkNjc0YyksIFdUQ1AoMHg3YzdiYzc0ZiwgMHgxZGNjMDIzMCksIFdUQ1AoMHg3YzZjYWI0NCwgMHgxZTBhZGJiYiksCisgIFdUQ1AoMHg3YzVkNWU3MSwgMHgxZTQ5ZjM5OCksIFdUQ1AoMHg3YzRkZTA3YywgMHgxZTg5NDk3MyksIFdUQ1AoMHg3YzNlMzEwOCwgMHgxZWM4ZGNmOCksIFdUQ1AoMHg3YzJlNGZiOSwgMHgxZjA4YWRkMCksCisgIFdUQ1AoMHg3YzFlM2MzNCwgMHgxZjQ4YmJhMyksIFdUQ1AoMHg3YzBkZjYxZCwgMHgxZjg5MDYxOCksIFdUQ1AoMHg3YmZkN2QxOCwgMHgxZmM5OGNkNiksIFdUQ1AoMHg3YmVjZDBjYywgMHgyMDBhNGY4MCksCisgIFdUQ1AoMHg3YmRiZjBkZCwgMHgyMDRiNGRiYyksIFdUQ1AoMHg3YmNhZGNmMSwgMHgyMDhjODcyYyksIFdUQ1AoMHg3YmI5OTRhZSwgMHgyMGNkZmI3MSksIFdUQ1AoMHg3YmE4MTdiOSwgMHgyMTBmYWEyYyksCisgIFdUQ1AoMHg3Yjk2NjViYiwgMHgyMTUxOTJmYyksIFdUQ1AoMHg3Yjg0N2U1OCwgMHgyMTkzYjU3ZiksIFdUQ1AoMHg3YjcyNjEzOSwgMHgyMWQ2MTE1MyksIFdUQ1AoMHg3YjYwMGUwNSwgMHgyMjE4YTYxNCksCisgIFdUQ1AoMHg3YjRkODQ2MywgMHgyMjViNzM1ZCksIFdUQ1AoMHg3YjNhYzNmYywgMHgyMjllNzhjNyksIFdUQ1AoMHg3YjI3Y2M3OSwgMHgyMmUxYjVlYiksIFdUQ1AoMHg3YjE0OWQ4MiwgMHgyMzI1MmE2MiksCisgIFdUQ1AoMHg3YjAxMzZjMSwgMHgyMzY4ZDVjMiksIFdUQ1AoMHg3YWVkOTdkZiwgMHgyM2FjYjdhMCksIFdUQ1AoMHg3YWQ5YzA4NywgMHgyM2YwY2Y5MiksIFdUQ1AoMHg3YWM1YjA2MywgMHgyNDM1MWQyYSksCisgIFdUQ1AoMHg3YWIxNjcxZSwgMHgyNDc5OWZmYyksIFdUQ1AoMHg3YTljZTQ2NCwgMHgyNGJlNTc5OSksIFdUQ1AoMHg3YTg4MjdlMSwgMHgyNTAzNDM5MSksIFdUQ1AoMHg3YTczMzE0MiwgMHgyNTQ4NjM3NSksCisgIFdUQ1AoMHg3YTVlMDAzMywgMHgyNThkYjZkMiksIFdUQ1AoMHg3YTQ4OTQ2MSwgMHgyNWQzM2QzNSksIFdUQ1AoMHg3YTMyZWQ3YywgMHgyNjE4ZjYyYyksIFdUQ1AoMHg3YTFkMGIzMSwgMHgyNjVlZTE0MyksCisgIFdUQ1AoMHg3YTA2ZWQyZiwgMHgyNmE0ZmUwMiksIFdUQ1AoMHg3OWYwOTMyNywgMHgyNmViNGJmNSksIFdUQ1AoMHg3OWQ5ZmNjOCwgMHgyNzMxY2FhMyksIFdUQ1AoMHg3OWMzMjljMiwgMHgyNzc4Nzk5NSksCisgIFdUQ1AoMHg3OWFjMTljOSwgMHgyN2JmNTg1MCksIFdUQ1AoMHg3OTk0Y2M4ZCwgMHgyODA2NjY1YyksIFdUQ1AoMHg3OTdkNDFjMSwgMHgyODRkYTMzYyksIFdUQ1AoMHg3OTY1NzkxOCwgMHgyODk1MGU3NCksCisgIFdUQ1AoMHg3OTRkNzI0NywgMHgyOGRjYTc4OCksIFdUQ1AoMHg3OTM1MmQwMSwgMHgyOTI0NmRmYSksIFdUQ1AoMHg3OTFjYThmYywgMHgyOTZjNjE0YSksIFdUQ1AoMHg3OTAzZTVlZSwgMHgyOWI0ODBmOSksCisgIFdUQ1AoMHg3OGVhZTM4ZCwgMHgyOWZjY2M4NyksIFdUQ1AoMHg3OGQxYTE5MSwgMHgyYTQ1NDM3MiksIFdUQ1AoMHg3OGI4MWZiMSwgMHgyYThkZTUzNyksIFdUQ1AoMHg3ODllNWRhNiwgMHgyYWQ2YjE1NSksCisgIFdUQ1AoMHg3ODg0NWIyOSwgMHgyYjFmYTc0NSksIFdUQ1AoMHg3ODZhMTdmNSwgMHgyYjY4YzY4NCksIFdUQ1AoMHg3ODRmOTNjNCwgMHgyYmIyMGU4YyksIFdUQ1AoMHg3ODM0Y2U1MywgMHgyYmZiN2VkNyksCisgIFdUQ1AoMHg3ODE5Yzc1YywgMHgyYzQ1MTZkYyksIFdUQ1AoMHg3N2ZlN2U5ZSwgMHgyYzhlZDYxNSksIFdUQ1AoMHg3N2UyZjNkNywgMHgyY2Q4YmJmNyksIFdUQ1AoMHg3N2M3MjZjNSwgMHgyZDIyYzdmYSksCisgIFdUQ1AoMHg3N2FiMTcyOCwgMHgyZDZjZjk5MyksIFdUQ1AoMHg3NzhlYzRjMCwgMHgyZGI3NTAzNyksIFdUQ1AoMHg3NzcyMmY0ZSwgMHgyZTAxY2I1OSksIFdUQ1AoMHg3NzU1NTY5NSwgMHgyZTRjNmE2ZCksCisgIFdUQ1AoMHg3NzM4M2E1OCwgMHgyZTk3MmNlNiksIFdUQ1AoMHg3NzFhZGE1YSwgMHgyZWUyMTIzNSksIFdUQ1AoMHg3NmZkMzY2MCwgMHgyZjJkMTljYyksIFdUQ1AoMHg3NmRmNGUzMCwgMHgyZjc4NDMxYSksCisgIFdUQ1AoMHg3NmMxMjE5MCwgMHgyZmMzOGQ5MSksIFdUQ1AoMHg3NmEyYjA0NywgMHgzMDBlZjg5ZCksIFdUQ1AoMHg3NjgzZmExZSwgMHgzMDVhODNhZiksIFdUQ1AoMHg3NjY0ZmVkZSwgMHgzMGE2MmUzNCksCisgIFdUQ1AoMHg3NjQ1YmU1MSwgMHgzMGYxZjc5OCksIFdUQ1AoMHg3NjI2Mzg0MiwgMHgzMTNkZGY0OSksIFdUQ1AoMHg3NjA2NmM3ZSwgMHgzMTg5ZTRiMSksIFdUQ1AoMHg3NWU2NWFkMSwgMHgzMWQ2MDczZCksCisgIFdUQ1AoMHg3NWM2MDMwOSwgMHgzMjIyNDY1NyksIFdUQ1AoMHg3NWE1NjRmNiwgMHgzMjZlYTE2OCksIFdUQ1AoMHg3NTg0ODA2NywgMHgzMmJiMTdkYSksIFdUQ1AoMHg3NTYzNTUyZCwgMHgzMzA3YTkxNyksCisgIFdUQ1AoMHg3NTQxZTMxYSwgMHgzMzU0NTQ4NiksIFdUQ1AoMHg3NTIwMmEwMiwgMHgzM2ExMTk4ZSksIFdUQ1AoMHg3NGZlMjliOCwgMHgzM2VkZjc5OCksIFdUQ1AoMHg3NGRiZTIxMSwgMHgzNDNhZWUwOSksCisgIFdUQ1AoMHg3NGI5NTJlMywgMHgzNDg3ZmM0OCksIFdUQ1AoMHg3NDk2N2MwNiwgMHgzNGQ1MjFiYiksIFdUQ1AoMHg3NDczNWQ1MSwgMHgzNTIyNWRjNyksIFdUQ1AoMHg3NDRmZjY5ZiwgMHgzNTZmYWZjZiksCisgIFdUQ1AoMHg3NDJjNDdjOSwgMHgzNWJkMTczYSksIFdUQ1AoMHg3NDA4NTBhYiwgMHgzNjBhOTM2OSksIFdUQ1AoMHg3M2U0MTEyMSwgMHgzNjU4MjNjMSksIFdUQ1AoMHg3M2JmODkwOSwgMHgzNmE1YzdhNCksCisgIFdUQ1AoMHg3MzlhYjg0MiwgMHgzNmYzN2U3NSksIFdUQ1AoMHg3Mzc1OWVhYiwgMHgzNzQxNDc5NiksIFdUQ1AoMHg3MzUwM2MyNiwgMHgzNzhmMjI2OCksIFdUQ1AoMHg3MzJhOTA5NSwgMHgzN2RkMGU0YyksCisgIFdUQ1AoMHg3MzA0OWJkYSwgMHgzODJiMGFhNCksIFdUQ1AoMHg3MmRlNWRkYiwgMHgzODc5MTZkMCksIFdUQ1AoMHg3MmI3ZDY3ZCwgMHgzOGM3MzIzMCksIFdUQ1AoMHg3MjkxMDVhNiwgMHgzOTE1NWMyNCksCisgIFdUQ1AoMHg3MjY5ZWIzZiwgMHgzOTYzOTQwYyksIFdUQ1AoMHg3MjQyODczMCwgMHgzOWIxZDk0NiksIFdUQ1AoMHg3MjFhZDk2NCwgMHgzYTAwMmIzMSksIFdUQ1AoMHg3MWYyZTFjNSwgMHgzYTRlODkyYyksCisgIFdUQ1AoMHg3MWNhYTA0MiwgMHgzYTljZjI5NiksIFdUQ1AoMHg3MWEyMTRjNywgMHgzYWViNjZjYyksIFdUQ1AoMHg3MTc5M2Y0MywgMHgzYjM5ZTUyYyksIFdUQ1AoMHg3MTUwMWZhNiwgMHgzYjg4NmQxNCksCisgIFdUQ1AoMHg3MTI2YjVlMywgMHgzYmQ2ZmRlMSksIFdUQ1AoMHg3MGZkMDFlYiwgMHgzYzI1OTZmMSksIFdUQ1AoMHg3MGQzMDNiMiwgMHgzYzc0Mzc5ZiksIFdUQ1AoMHg3MGE4YmIyZSwgMHgzY2MyZGY0OSksCisgIFdUQ1AoMHg3MDdlMjg1NSwgMHgzZDExOGQ0YyksIFdUQ1AoMHg3MDUzNGIxZSwgMHgzZDYwNDEwMyksIFdUQ1AoMHg3MDI4MjM4MSwgMHgzZGFlZjljYyksIFdUQ1AoMHg2ZmZjYjE3YSwgMHgzZGZkYjcwMiksCisgIFdUQ1AoMHg2ZmQwZjUwNCwgMHgzZTRjNzgwMCksIFdUQ1AoMHg2ZmE0ZWUxYSwgMHgzZTliM2MyNSksIFdUQ1AoMHg2Zjc4OWNiYiwgMHgzZWVhMDJjYSksIFdUQ1AoMHg2ZjRjMDBlNSwgMHgzZjM4Y2I0YiksCisgIFdUQ1AoMHg2ZjFmMWE5YSwgMHgzZjg3OTUwNSksIFdUQ1AoMHg2ZWYxZTlkYSwgMHgzZmQ2NWY1MyksIFdUQ1AoMHg2ZWM0NmVhOSwgMHg0MDI1Mjk5MCksIFdUQ1AoMHg2ZTk2YTkwYiwgMHg0MDczZjMxOCksCisgIFdUQ1AoMHg2ZTY4OTkwNSwgMHg0MGMyYmI0NiksIFdUQ1AoMHg2ZTNhM2U5ZCwgMHg0MTExODE3NiksIFdUQ1AoMHg2ZTBiOTlkZCwgMHg0MTYwNDUwNCksIFdUQ1AoMHg2ZGRjYWFjYywgMHg0MWFmMDU0YSksCisgIFdUQ1AoMHg2ZGFkNzE3NywgMHg0MWZkYzFhNSksIFdUQ1AoMHg2ZDdkZWRlOCwgMHg0MjRjNzk3MCksIFdUQ1AoMHg2ZDRlMjAyZSwgMHg0MjliMmMwNiksIFdUQ1AoMHg2ZDFlMDg1NSwgMHg0MmU5ZDhjNCksCisgIFdUQ1AoMHg2Y2VkYTY2ZiwgMHg0MzM4N2YwNSksIFdUQ1AoMHg2Y2JjZmE4ZCwgMHg0Mzg3MWUyNiksIFdUQ1AoMHg2YzhjMDRjMCwgMHg0M2Q1YjU4MSksIFdUQ1AoMHg2YzVhYzUxZCwgMHg0NDI0NDQ3NCksCisgIFdUQ1AoMHg2YzI5M2JiOCwgMHg0NDcyY2E1YSksIFdUQ1AoMHg2YmY3NjhhOCwgMHg0NGMxNDY5MCksIFdUQ1AoMHg2YmM1NGMwNiwgMHg0NTBmYjg3MyksIFdUQ1AoMHg2YjkyZTVlOSwgMHg0NTVlMWY1ZiksCisgIFdUQ1AoMHg2YjYwMzY2YywgMHg0NWFjN2FiMiksIFdUQ1AoMHg2YjJkM2RhYiwgMHg0NWZhYzljOCksIFdUQ1AoMHg2YWY5ZmJjMiwgMHg0NjQ5MGJmZiksIFdUQ1AoMHg2YWM2NzBkMSwgMHg0Njk3NDBiNSksCisgIFdUQ1AoMHg2YTkyOWNmNiwgMHg0NmU1Njc0NyksIFdUQ1AoMHg2YTVlODA1MywgMHg0NzMzN2YxMyksIFdUQ1AoMHg2YTJhMWIwYSwgMHg0NzgxODc3OSksIFdUQ1AoMHg2OWY1NmQzZSwgMHg0N2NmN2ZkNiksCisgIFdUQ1AoMHg2OWMwNzcxNSwgMHg0ODFkNjc4YSksIFdUQ1AoMHg2OThiMzhiNCwgMHg0ODZiM2RmMyksIFdUQ1AoMHg2OTU1YjI0MywgMHg0OGI5MDI3MiksIFdUQ1AoMHg2OTFmZTNlYywgMHg0OTA2YjQ2NiksCisgIFdUQ1AoMHg2OGU5Y2RkOCwgMHg0OTU0NTMzMCksIFdUQ1AoMHg2OGIzNzAzMywgMHg0OWExZGUzMCksIFdUQ1AoMHg2ODdjY2IyOSwgMHg0OWVmNTRjOCksIFdUQ1AoMHg2ODQ1ZGVlOSwgMHg0YTNjYjY1NyksCisgIFdUQ1AoMHg2ODBlYWJhMywgMHg0YThhMDI0MiksIFdUQ1AoMHg2N2Q3MzE4NywgMHg0YWQ3MzdlOSksIFdUQ1AoMHg2NzlmNzBjNywgMHg0YjI0NTZhZiksIFdUQ1AoMHg2NzY3Njk5NywgMHg0YjcxNWRmNyksCisgIFdUQ1AoMHg2NzJmMWMyYiwgMHg0YmJlNGQyNSksIFdUQ1AoMHg2NmY2ODhiYSwgMHg0YzBiMjM5YyksIFdUQ1AoMHg2NmJkYWY3YiwgMHg0YzU3ZTBjMiksIFdUQ1AoMHg2Njg0OTBhNiwgMHg0Y2E0ODNmYSksCisgIFdUQ1AoMHg2NjRiMmM3NiwgMHg0Y2YxMGNhYyksIFdUQ1AoMHg2NjExODMyNiwgMHg0ZDNkN2EzYiksIFdUQ1AoMHg2NWQ3OTRmMywgMHg0ZDg5Y2MwZiksIFdUQ1AoMHg2NTlkNjIxYSwgMHg0ZGQ2MDE4ZiksCisgIFdUQ1AoMHg2NTYyZWFkYSwgMHg0ZTIyMWEyMiksIFdUQ1AoMHg2NTI4MmY3NCwgMHg0ZTZlMTUzMCksIFdUQ1AoMHg2NGVkMzAyYiwgMHg0ZWI5ZjIyMiksIFdUQ1AoMHg2NGIxZWQ0MCwgMHg0ZjA1YjA2MSksCisgIFdUQ1AoMHg2NDc2NjZmOCwgMHg0ZjUxNGY1NyksIFdUQ1AoMHg2NDNhOWQ5OSwgMHg0ZjljY2U2ZiksIFdUQ1AoMHg2M2ZlOTE2YSwgMHg0ZmU4MmQxMyksIFdUQ1AoMHg2M2MyNDJiMiwgMHg1MDMzNmFhZiksCisgIFdUQ1AoMHg2Mzg1YjFiYywgMHg1MDdlODZiMCksIFdUQ1AoMHg2MzQ4ZGVkMSwgMHg1MGM5ODA4MiksIFdUQ1AoMHg2MzBiY2EzZiwgMHg1MTE0NTc5MyksIFdUQ1AoMHg2MmNlNzQ1MSwgMHg1MTVmMGI1MSksCisgIFdUQ1AoMHg2MjkwZGQ1NywgMHg1MWE5OWIyYiksIFdUQ1AoMHg2MjUzMDVhMCwgMHg1MWY0MDY5MiksIFdUQ1AoMHg2MjE0ZWQ3ZCwgMHg1MjNlNGNmNSksIFdUQ1AoMHg2MWQ2OTU0MSwgMHg1Mjg4NmRjNSksCisgIFdUQ1AoMHg2MTk3ZmQzZSwgMHg1MmQyNjg3NSksIFdUQ1AoMHg2MTU5MjVjOSwgMHg1MzFjM2M3NyksIFdUQ1AoMHg2MTFhMGYzOSwgMHg1MzY1ZTkzZSksIFdUQ1AoMHg2MGRhYjllMywgMHg1M2FmNmUzZSksCisgIFdUQ1AoMHg2MDliMjYyMSwgMHg1M2Y4Y2FlZCksIFdUQ1AoMHg2MDViNTQ0YywgMHg1NDQxZmVjMCksIFdUQ1AoMHg2MDFiNDRiZiwgMHg1NDhiMDkyZSksIFdUQ1AoMHg1ZmRhZjdkNSwgMHg1NGQzZTlhZSksCisgIFdUQ1AoMHg1ZjlhNmRlYiwgMHg1NTFjOWZiNyksIFdUQ1AoMHg1ZjU5YTc2MSwgMHg1NTY1MmFjMyksIFdUQ1AoMHg1ZjE4YTQ5NCwgMHg1NWFkOGE0ZCksIFdUQ1AoMHg1ZWQ3NjVlNiwgMHg1NWY1YmRjZCksCisgIFdUQ1AoMHg1ZTk1ZWJiOCwgMHg1NjNkYzRjMSksIFdUQ1AoMHg1ZTU0MzY2ZCwgMHg1Njg1OWVhMyksIFdUQ1AoMHg1ZTEyNDY2YSwgMHg1NmNkNGFmMyksIFdUQ1AoMHg1ZGQwMWMxMywgMHg1NzE0YzkyZCksCisgIFdUQ1AoMHg1ZDhkYjdjZiwgMHg1NzVjMThkMCksIFdUQ1AoMHg1ZDRiMWEwNSwgMHg1N2EzMzk1ZSksIFdUQ1AoMHg1ZDA4NDMxZSwgMHg1N2VhMmE1NiksIFdUQ1AoMHg1Y2M1MzM4NCwgMHg1ODMwZWIzYSksCisgIFdUQ1AoMHg1YzgxZWJhMCwgMHg1ODc3N2I4ZSksIFdUQ1AoMHg1YzNlNmJkZiwgMHg1OGJkZGFkNSksIFdUQ1AoMHg1YmZhYjRhZiwgMHg1OTA0MDg5MyksIFdUQ1AoMHg1YmI2YzY3YywgMHg1OTRhMDQ0ZiksCisgIFdUQ1AoMHg1YjcyYTFiNiwgMHg1OThmY2Q4ZSksIFdUQ1AoMHg1YjJlNDZjZSwgMHg1OWQ1NjNkOSksIFdUQ1AoMHg1YWU5YjYzNCwgMHg1YTFhYzZiOCksIFdUQ1AoMHg1YWE0ZjA1YSwgMHg1YTVmZjViNSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyMFtdID0KK3sKKyAgV1RDUCgweDdmZmY0YzU0LCAweDAwZDY3NmViKSwgV1RDUCgweDdmZjlhZjA0LCAweDAyODM1YjVhKSwgV1RDUCgweDdmZWU3NGEyLCAweDA0MzAyMzhmKSwgV1RDUCgweDdmZGQ5ZGFkLCAweDA1ZGNiY2JlKSwKKyAgV1RDUCgweDdmYzcyYWUyLCAweDA3ODkxNDE4KSwgV1RDUCgweDdmYWIxZDNkLCAweDA5MzUxNmQ0KSwgV1RDUCgweDdmODk3NWY5LCAweDBhZTBiMjJjKSwgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwKKyAgV1RDUCgweDdmMzU2MGI5LCAweDBlMzY2N2FkKSwgV1RDUCgweDdmMDJmNjZmLCAweDBmZTA1YzY0KSwgV1RDUCgweDdlY2FmOWU1LCAweDExODk5ZWQzKSwgV1RDUCgweDdlOGQ2ZDkxLCAweDEzMzIxYzUzKSwKKyAgV1RDUCgweDdlNGE1NDI2LCAweDE0ZDljMjQ1KSwgV1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwgV1RDUCgweDdkYjM4NjBmLCAweDE4MjYzZDM2KSwgV1RDUCgweDdkNWZkODAxLCAweDE5Y2FlZDI5KSwKKyAgV1RDUCgweDdkMDZhYTE2LCAweDFiNmU3YjdhKSwgV1RDUCgweDdjYTgwMDM4LCAweDFkMTBkNWMyKSwgV1RDUCgweDdjNDNkZThlLCAweDFlYjFlOWE3KSwgV1RDUCgweDdiZGE0OTdkLCAweDIwNTFhNGRkKSwKKyAgV1RDUCgweDdiNmI0NWE1LCAweDIxZWZmNTI4KSwgV1RDUCgweDdhZjZkN2U2LCAweDIzOGNjODVkKSwgV1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgV1RDUCgweDc5ZmRkMzVjLCAweDI2YzFhZjIyKSwKKyAgV1RDUCgweDc5Nzk0NzdkLCAweDI4NTk5ZWIwKSwgV1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwgV1RDUCgweDc4NjAzOTllLCAweDJiODQxY2FmKSwgV1RDUCgweDc3Y2JjM2YyLCAweDJkMTY4NzkyKSwKKyAgV1RDUCgweDc3MzIwZDBkLCAweDJlYTZmODI3KSwgV1RDUCgweDc2OTMxYmFlLCAweDMwMzU1Y2RkKSwgV1RDUCgweDc1ZWVmNmNlLCAweDMxYzFhNDNiKSwgV1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwKKyAgV1RDUCgweDc0OTcyZjkyLCAweDM0ZDM5NTdlKSwgV1RDUCgweDczZTM5YzQ5LCAweDM2NTkxY2VhKSwgV1RDUCgweDczMmFmM2E3LCAweDM3ZGM0MjBjKSwgV1RDUCgweDcyNmQzZGM2LCAweDM5NWNmM2U5KSwKKyAgV1RDUCgweDcxYWE4MmY3LCAweDNhZGIyMWExKSwgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgV1RDUCgweDcwMTYyMGY1LCAweDNkY2ZhZGIwKSwgV1RDUCgweDZmNDQ4YjdlLCAweDNmNDVlYWQ4KSwKKyAgV1RDUCgweDZlNmUxNDkyLCAweDQwYjk2MTdkKSwgV1RDUCgweDZkOTJjNTliLCAweDQyMmEwMTU0KSwgV1RDUCgweDZjYjJhODM3LCAweDQzOTdiYTMyKSwgV1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwKKyAgV1RDUCgweDZhZTQyOWFlLCAweDQ2NmEzNmY5KSwgV1RDUCgweDY5ZjVkY2QzLCAweDQ3Y2VkYjMxKSwgV1RDUCgweDY5MDJlYTFkLCAweDQ5MzA1OTBmKSwgV1RDUCgweDY4MGI1YzMzLCAweDRhOGVhMTExKSwKKyAgV1RDUCgweDY3MGYzZGYzLCAweDRiZTlhM2RiKSwgV1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwgV1RDUCgweDY1MDk3Y2RiLCAweDRlOTU5ZDA4KSwgV1RDUCgweDYzZmZmMGJhLCAweDRmZTY3NTZhKSwKKyAgV1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgV1RDUCgweDYxZGZiYjhhLCAweDUyN2Q5M2U2KSwgV1RDUCgweDYwYzkyYTVhLCAweDUzYzNiY2VhKSwgV1RDUCgweDVmYWU1YTU1LCAweDU1MDYzOTUxKSwKKyAgV1RDUCgweDVlOGY1N2UyLCAweDU2NDRmYWY0KSwgV1RDUCgweDVkNmMyZjk5LCAweDU3N2ZmM2RhKSwgV1RDUCgweDVjNDRlZTQwLCAweDU4YjcxNjMyKSwgV1RDUCgweDViMTlhMGM4LCAweDU5ZWE1NDU0KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjBbXSA9Cit7CisgIFdUQ1AoMHg3ZmZmZmZmZSwgMHgwMDAxN2I2ZiksIFdUQ1AoMHg3ZmZmZmZlZiwgMHgwMDA0MmQyZiksIFdUQ1AoMHg3ZmZmZmZiYiwgMHgwMDA4NDlkMCksIFdUQ1AoMHg3ZmZmZmYzNiwgMHgwMDBlMzQ5NCksCisgIFdUQ1AoMHg3ZmZmZmUwYywgMHgwMDE2NWVmZCksIFdUQ1AoMHg3ZmZmZmJhYywgMHgwMDIxNDliZSksIFdUQ1AoMHg3ZmZmZjcyZSwgMHgwMDJmODU0YyksIFdUQ1AoMHg3ZmZmZWYyNCwgMHgwMDQxYjIzNSksCisgIFdUQ1AoMHg3ZmZmZTE2NywgMHgwMDU4ODE0ZiksIFdUQ1AoMHg3ZmZmY2FjZCwgMHgwMDc0YjNhZiksIFdUQ1AoMHg3ZmZmYTZkMCwgMHgwMDk3MWE2NyksIFdUQ1AoMHg3ZmZmNmYxZSwgMHgwMGMwOTYwZSksCisgIFdUQ1AoMHg3ZmZmMWIxMiwgMHgwMGYyMTYwMiksIFdUQ1AoMHg3ZmZlOWYwYiwgMHgwMTJjOTc3NSksIFdUQ1AoMHg3ZmZkZWJiMiwgMHgwMTcxMjQyOCksIFdUQ1AoMHg3ZmZjZWQxYiwgMHgwMWMwZDBmNyksCisgIFdUQ1AoMHg3ZmZiODljMiwgMHgwMjFjYmMxMiksIFdUQ1AoMHg3ZmY5YTE3YywgMHgwMjg2MGIwNSksIFdUQ1AoMHg3ZmY3MGMzOSwgMHgwMmZkZTg3NSksIFdUQ1AoMHg3ZmYzOThiYywgMHgwMzg1ODFiMyksCisgIFdUQ1AoMHg3ZmVmMGIzYiwgMHgwNDFlMDQwYyksIFdUQ1AoMHg3ZmU5MWJmMywgMHgwNGM4OTlmNCksIFdUQ1AoMHg3ZmUxNzViYSwgMHgwNTg2NjgwMyksIFdUQ1AoMHg3ZmQ3YjQ5MywgMHgwNjU4ODlkNSksCisgIFdUQ1AoMHg3ZmNiNjQ1OSwgMHgwNzQwMGVkNCksIFdUQ1AoMHg3ZmJiZmY4MiwgMHgwODNkZjZlOSksIFdUQ1AoMHg3ZmE4ZWUwOSwgMHgwOTUzMmYzNyksIFdUQ1AoMHg3ZjkxODQ5YSwgMHgwYTgwOGVkMSksCisgIFdUQ1AoMHg3Zjc1MDNmMiwgMHgwYmM2ZDM4MSksIFdUQ1AoMHg3ZjUyOTg5YSwgMHgwZDI2OWViMCksIFdUQ1AoMHg3ZjI5NWFmNCwgMHgwZWEwNzI3MCksIFdUQ1AoMHg3ZWY4NGZiNiwgMHgxMDM0YWViNiksCisgIFdUQ1AoMHg3ZWJlNjhjNSwgMHgxMWUzOGVkMiksIFdUQ1AoMHg3ZTdhODY4NiwgMHgxM2FkMjczMyksIFdUQ1AoMHg3ZTJiNzlhMywgMHgxNTkxNjM2ZCksIFdUQ1AoMHg3ZGQwMDUzYywgMHgxNzkwMDRhNyksCisgIFdUQ1AoMHg3ZDY2ZTE4YiwgMHgxOWE4YTA1ZiksIFdUQ1AoMHg3Y2VlYmVmMCwgMHgxYmRhOWZhMiksIFdUQ1AoMHg3YzY2NDk1MywgMHgxZTI1M2VhMSksIFdUQ1AoMHg3YmNjMmJlOCwgMHgyMDg3OGNjZSksCisgIFdUQ1AoMHg3YjFmMTUyNiwgMHgyMzAwNmQ1ZCksIFdUQ1AoMHg3YTVkYmIwMSwgMHgyNThlOTg0OCksIFdUQ1AoMHg3OTg2ZGYzZSwgMHgyODMwOWJjNiksIFdUQ1AoMHg3ODk5NTNlMCwgMHgyYWU0ZGUzZSksCisgIFdUQ1AoMHg3NzkzZmY4OCwgMHgyZGE5YTBhOCksIFdUQ1AoMHg3Njc1ZTFjYywgMHgzMDdkMDE2MyksIFdUQ1AoMHg3NTNlMTc2MywgMHgzMzVjZmY3MiksIFdUQ1AoMHg3M2ViZGUxMCwgMHgzNjQ3N2UxZiksCisgIFdUQ1AoMHg3MjdlOTg0ZSwgMHgzOTNhNDhmMSksIFdUQ1AoMHg3MGY1ZDA5YiwgMHgzYzMzMTdmOSksIFdUQ1AoMHg2ZjUxM2M2MCwgMHgzZjJmOTQ1YyksIFdUQ1AoMHg2ZDkwYmU2MSwgMHg0MjJkNWQxOCksCisgIFdUQ1AoMHg2YmI0NjhiMSwgMHg0NTJhMGJmMyksIFdUQ1AoMHg2OWJjN2UxZSwgMHg0ODIzM2E4MSksIFdUQ1AoMHg2N2E5NzMxNywgMHg0YjE2ODczZSksIFdUQ1AoMHg2NTdiZWRmYSwgMHg0ZTAxOWE5ZCksCisgIFdUQ1AoMHg2MzM0YzZkMiwgMHg1MGUyMmMwYiksIFdUQ1AoMHg2MGQ1MDY4OSwgMHg1M2I2MDZjYiksIFdUQ1AoMHg1ZTVkZTU4OCwgMHg1NjdiMGVhNyksIFdUQ1AoMHg1YmQwYzljNiwgMHg1OTJmNDQ2MCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzUxMltdID0KK3sKKyAgV1RDUCgweDdmZmZmNjIxLCAweDAwMzI0M2Y1KSwgV1RDUCgweDdmZmZhNzJjLCAweDAwOTZjYmMxKSwgV1RDUCgweDdmZmYwOTQzLCAweDAwZmI1MzMwKSwgV1RDUCgweDdmZmUxYzY1LCAweDAxNWZkYTAzKSwKKyAgV1RDUCgweDdmZmNlMDkzLCAweDAxYzQ1ZmZlKSwgV1RDUCgweDdmZmI1NWNlLCAweDAyMjhlNGUyKSwgV1RDUCgweDdmZjk3YzE4LCAweDAyOGQ2ODcwKSwgV1RDUCgweDdmZjc1MzcwLCAweDAyZjFlYTZjKSwKKyAgV1RDUCgweDdmZjRkYmQ5LCAweDAzNTY2YTk2KSwgV1RDUCgweDdmZjIxNTUzLCAweDAzYmFlOGIyKSwgV1RDUCgweDdmZWVmZmUxLCAweDA0MWY2NDgwKSwgV1RDUCgweDdmZWI5Yjg1LCAweDA0ODNkZGMzKSwKKyAgV1RDUCgweDdmZTdlODQxLCAweDA0ZTg1NDNlKSwgV1RDUCgweDdmZTNlNjE2LCAweDA1NGNjN2IxKSwgV1RDUCgweDdmZGY5NTA4LCAweDA1YjEzN2RmKSwgV1RDUCgweDdmZGFmNTE5LCAweDA2MTVhNDhiKSwKKyAgV1RDUCgweDdmZDYwNjRjLCAweDA2N2EwZDc2KSwgV1RDUCgweDdmZDBjOGEzLCAweDA2ZGU3MjYyKSwgV1RDUCgweDdmY2IzYzIzLCAweDA3NDJkMzExKSwgV1RDUCgweDdmYzU2MGNmLCAweDA3YTcyZjQ1KSwKKyAgV1RDUCgweDdmYmYzNmFhLCAweDA4MGI4NmMyKSwgV1RDUCgweDdmYjhiZGI4LCAweDA4NmZkOTQ3KSwgV1RDUCgweDdmYjFmNWZjLCAweDA4ZDQyNjk5KSwgV1RDUCgweDdmYWFkZjdjLCAweDA5Mzg2ZTc4KSwKKyAgV1RDUCgweDdmYTM3YTNjLCAweDA5OWNiMGE3KSwgV1RDUCgweDdmOWJjNjQwLCAweDBhMDBlY2U4KSwgV1RDUCgweDdmOTNjMzhjLCAweDBhNjUyMmZlKSwgV1RDUCgweDdmOGI3MjI3LCAweDBhYzk1MmFhKSwKKyAgV1RDUCgweDdmODJkMjE0LCAweDBiMmQ3YmFmKSwgV1RDUCgweDdmNzllMzVhLCAweDBiOTE5ZGNmKSwgV1RDUCgweDdmNzBhNWZlLCAweDBiZjViOGNiKSwgV1RDUCgweDdmNjcxYTA1LCAweDBjNTljYzY4KSwKKyAgV1RDUCgweDdmNWQzZjc1LCAweDBjYmRkODY1KSwgV1RDUCgweDdmNTMxNjU1LCAweDBkMjFkYzg3KSwgV1RDUCgweDdmNDg5ZWFhLCAweDBkODVkODhmKSwgV1RDUCgweDdmM2RkODdjLCAweDBkZTljYzQwKSwKKyAgV1RDUCgweDdmMzJjM2QxLCAweDBlNGRiNzViKSwgV1RDUCgweDdmMjc2MGFmLCAweDBlYjE5OWE0KSwgV1RDUCgweDdmMWJhZjFlLCAweDBmMTU3MmRjKSwgV1RDUCgweDdmMGZhZjI1LCAweDBmNzk0MmM3KSwKKyAgV1RDUCgweDdmMDM2MGNiLCAweDBmZGQwOTI2KSwgV1RDUCgweDdlZjZjNDE4LCAweDEwNDBjNWJiKSwgV1RDUCgweDdlZTlkOTE0LCAweDEwYTQ3ODRiKSwgV1RDUCgweDdlZGM5ZmM2LCAweDExMDgyMDk2KSwKKyAgV1RDUCgweDdlY2YxODM3LCAweDExNmJiZTYwKSwgV1RDUCgweDdlYzE0MjcwLCAweDExY2Y1MTZhKSwgV1RDUCgweDdlYjMxZTc4LCAweDEyMzJkOTc5KSwgV1RDUCgweDdlYTRhYzU4LCAweDEyOTY1NjRkKSwKKyAgV1RDUCgweDdlOTVlYzFhLCAweDEyZjljN2FhKSwgV1RDUCgweDdlODZkZGM2LCAweDEzNWQyZDUzKSwgV1RDUCgweDdlNzc4MTY2LCAweDEzYzA4NzBhKSwgV1RDUCgweDdlNjdkNzAzLCAweDE0MjNkNDkyKSwKKyAgV1RDUCgweDdlNTdkZWE3LCAweDE0ODcxNWFlKSwgV1RDUCgweDdlNDc5ODViLCAweDE0ZWE0YTFmKSwgV1RDUCgweDdlMzcwNDJhLCAweDE1NGQ3MWFhKSwgV1RDUCgweDdlMjYyMjFmLCAweDE1YjA4YzEyKSwKKyAgV1RDUCgweDdlMTRmMjQyLCAweDE2MTM5OTE4KSwgV1RDUCgweDdlMDM3NGEwLCAweDE2NzY5ODdmKSwgV1RDUCgweDdkZjFhOTQyLCAweDE2ZDk4YTBjKSwgV1RDUCgweDdkZGY5MDM0LCAweDE3M2M2ZDgwKSwKKyAgV1RDUCgweDdkY2QyOTgxLCAweDE3OWY0MjlmKSwgV1RDUCgweDdkYmE3NTM0LCAweDE4MDIwOTJjKSwgV1RDUCgweDdkYTc3MzU5LCAweDE4NjRjMGVhKSwgV1RDUCgweDdkOTQyM2ZjLCAweDE4Yzc2OTliKSwKKyAgV1RDUCgweDdkODA4NzI4LCAweDE5MmEwMzA0KSwgV1RDUCgweDdkNmM5Y2U5LCAweDE5OGM4Y2U3KSwgV1RDUCgweDdkNTg2NTRkLCAweDE5ZWYwNzA3KSwgV1RDUCgweDdkNDNlMDVlLCAweDFhNTE3MTI4KSwKKyAgV1RDUCgweDdkMmYwZTJiLCAweDFhYjNjYjBkKSwgV1RDUCgweDdkMTllZWJmLCAweDFiMTYxNDc5KSwgV1RDUCgweDdkMDQ4MjI4LCAweDFiNzg0ZDMwKSwgV1RDUCgweDdjZWVjODczLCAweDFiZGE3NGY2KSwKKyAgV1RDUCgweDdjZDhjMWFlLCAweDFjM2M4YjhjKSwgV1RDUCgweDdjYzI2ZGU1LCAweDFjOWU5MGI4KSwgV1RDUCgweDdjYWJjZDI4LCAweDFkMDA4NDNkKSwgV1RDUCgweDdjOTRkZjgzLCAweDFkNjI2NWRkKSwKKyAgV1RDUCgweDdjN2RhNTA1LCAweDFkYzQzNTVlKSwgV1RDUCgweDdjNjYxZGJjLCAweDFlMjVmMjgyKSwgV1RDUCgweDdjNGU0OWI3LCAweDFlODc5ZDBkKSwgV1RDUCgweDdjMzYyOTA0LCAweDFlZTkzNGMzKSwKKyAgV1RDUCgweDdjMWRiYmIzLCAweDFmNGFiOTY4KSwgV1RDUCgweDdjMDUwMWQyLCAweDFmYWMyYWJmKSwgV1RDUCgweDdiZWJmYjcwLCAweDIwMGQ4ODhkKSwgV1RDUCgweDdiZDJhODllLCAweDIwNmVkMjk1KSwKKyAgV1RDUCgweDdiYjkwOTZiLCAweDIwZDAwODljKSwgV1RDUCgweDdiOWYxZGU2LCAweDIxMzEyYTY1KSwgV1RDUCgweDdiODRlNjFmLCAweDIxOTIzN2I1KSwgV1RDUCgweDdiNmE2MjI3LCAweDIxZjMzMDRmKSwKKyAgV1RDUCgweDdiNGY5MjBlLCAweDIyNTQxM2Y4KSwgV1RDUCgweDdiMzQ3NWU1LCAweDIyYjRlMjc0KSwgV1RDUCgweDdiMTkwZGJjLCAweDIzMTU5Yjg4KSwgV1RDUCgweDdhZmQ1OWE0LCAweDIzNzYzZWY3KSwKKyAgV1RDUCgweDdhZTE1OWFlLCAweDIzZDZjYzg3KSwgV1RDUCgweDdhYzUwZGVjLCAweDI0Mzc0M2ZhKSwgV1RDUCgweDdhYTg3NjZmLCAweDI0OTdhNTE3KSwgV1RDUCgweDdhOGI5MzQ4LCAweDI0ZjdlZmEyKSwKKyAgV1RDUCgweDdhNmU2NDhhLCAweDI1NTgyMzVmKSwgV1RDUCgweDdhNTBlYTQ3LCAweDI1Yjg0MDEyKSwgV1RDUCgweDdhMzMyNDkwLCAweDI2MTg0NTgxKSwgV1RDUCgweDdhMTUxMzc4LCAweDI2NzgzMzcwKSwKKyAgV1RDUCgweDc5ZjZiNzExLCAweDI2ZDgwOWE1KSwgV1RDUCgweDc5ZDgwZjZmLCAweDI3MzdjN2UzKSwgV1RDUCgweDc5YjkxY2E0LCAweDI3OTc2ZGYxKSwgV1RDUCgweDc5OTlkZWM0LCAweDI3ZjZmYjkyKSwKKyAgV1RDUCgweDc5N2E1NWUwLCAweDI4NTY3MDhkKSwgV1RDUCgweDc5NWE4MjBlLCAweDI4YjVjY2E1KSwgV1RDUCgweDc5M2E2MzYxLCAweDI5MTUwZmExKSwgV1RDUCgweDc5MTlmOWVjLCAweDI5NzQzOTQ2KSwKKyAgV1RDUCgweDc4Zjk0NWMzLCAweDI5ZDM0OTU4KSwgV1RDUCgweDc4ZDg0NmZiLCAweDJhMzIzZjllKSwgV1RDUCgweDc4YjZmZGE4LCAweDJhOTExYmRjKSwgV1RDUCgweDc4OTU2OWRmLCAweDJhZWZkZGQ4KSwKKyAgV1RDUCgweDc4NzM4YmIzLCAweDJiNGU4NTU4KSwgV1RDUCgweDc4NTE2MzNiLCAweDJiYWQxMjIxKSwgV1RDUCgweDc4MmVmMDhiLCAweDJjMGI4M2ZhKSwgV1RDUCgweDc4MGMzM2I4LCAweDJjNjlkYWE2KSwKKyAgV1RDUCgweDc3ZTkyY2Q5LCAweDJjYzgxNWVlKSwgV1RDUCgweDc3YzVkYzAxLCAweDJkMjYzNTk2KSwgV1RDUCgweDc3YTI0MTQ4LCAweDJkODQzOTY0KSwgV1RDUCgweDc3N2U1Y2MzLCAweDJkZTIyMTFlKSwKKyAgV1RDUCgweDc3NWEyZTg5LCAweDJlM2ZlYzhiKSwgV1RDUCgweDc3MzViNmFmLCAweDJlOWQ5YjcwKSwgV1RDUCgweDc3MTBmNTRjLCAweDJlZmIyZDk1KSwgV1RDUCgweDc2ZWJlYTc3LCAweDJmNThhMmJlKSwKKyAgV1RDUCgweDc2YzY5NjQ3LCAweDJmYjVmYWIyKSwgV1RDUCgweDc2YTBmOGQyLCAweDMwMTMzNTM5KSwgV1RDUCgweDc2N2IxMjMxLCAweDMwNzA1MjE3KSwgV1RDUCgweDc2NTRlMjc5LCAweDMwY2Q1MTE1KSwKKyAgV1RDUCgweDc2MmU2OWM0LCAweDMxMmEzMWY4KSwgV1RDUCgweDc2MDdhODI4LCAweDMxODZmNDg3KSwgV1RDUCgweDc1ZTA5ZGJkLCAweDMxZTM5ODg5KSwgV1RDUCgweDc1Yjk0YTljLCAweDMyNDAxZGM2KSwKKyAgV1RDUCgweDc1OTFhZWRkLCAweDMyOWM4NDAyKSwgV1RDUCgweDc1NjljYTk5LCAweDMyZjhjYjA3KSwgV1RDUCgweDc1NDE5ZGU3LCAweDMzNTRmMjliKSwgV1RDUCgweDc1MTkyOGUwLCAweDMzYjBmYTg0KSwKKyAgV1RDUCgweDc0ZjA2YjllLCAweDM0MGNlMjhiKSwgV1RDUCgweDc0Yzc2NjNhLCAweDM0NjhhYTc2KSwgV1RDUCgweDc0OWUxOGNkLCAweDM0YzQ1MjBkKSwgV1RDUCgweDc0NzQ4MzcxLCAweDM1MWZkOTE4KSwKKyAgV1RDUCgweDc0NGFhNjNmLCAweDM1N2IzZjVkKSwgV1RDUCgweDc0MjA4MTUwLCAweDM1ZDY4NGE2KSwgV1RDUCgweDczZjYxNGMwLCAweDM2MzFhOGI4KSwgV1RDUCgweDczY2I2MGE4LCAweDM2OGNhYjVjKSwKKyAgV1RDUCgweDczYTA2NTIyLCAweDM2ZTc4YzViKSwgV1RDUCgweDczNzUyMjQ5LCAweDM3NDI0YjdiKSwgV1RDUCgweDczNDk5ODM4LCAweDM3OWNlODg1KSwgV1RDUCgweDczMWRjNzBhLCAweDM3Zjc2MzQxKSwKKyAgV1RDUCgweDcyZjFhZWQ5LCAweDM4NTFiYjc3KSwgV1RDUCgweDcyYzU0ZmMxLCAweDM4YWJmMGVmKSwgV1RDUCgweDcyOThhOWRkLCAweDM5MDYwMzczKSwgV1RDUCgweDcyNmJiZDQ4LCAweDM5NWZmMmM5KSwKKyAgV1RDUCgweDcyM2U4YTIwLCAweDM5YjliZWJjKSwgV1RDUCgweDcyMTExMDdlLCAweDNhMTM2NzEyKSwgV1RDUCgweDcxZTM1MDgwLCAweDNhNmNlYjk2KSwgV1RDUCgweDcxYjU0YTQxLCAweDNhYzY0YzBmKSwKKyAgV1RDUCgweDcxODZmZGRlLCAweDNiMWY4ODQ4KSwgV1RDUCgweDcxNTg2Yjc0LCAweDNiNzhhMDA3KSwgV1RDUCgweDcxMjk5MzFmLCAweDNiZDE5MzE4KSwgV1RDUCgweDcwZmE3NGZjLCAweDNjMmE2MTQyKSwKKyAgV1RDUCgweDcwY2IxMTI4LCAweDNjODMwYTUwKSwgV1RDUCgweDcwOWI2N2MwLCAweDNjZGI4ZTA5KSwgV1RDUCgweDcwNmI3OGUzLCAweDNkMzNlYzM5KSwgV1RDUCgweDcwM2I0NGFkLCAweDNkOGMyNGE4KSwKKyAgV1RDUCgweDcwMGFjYjNjLCAweDNkZTQzNzFmKSwgV1RDUCgweDZmZGEwY2FlLCAweDNlM2MyMzY5KSwgV1RDUCgweDZmYTkwOTIxLCAweDNlOTNlOTUwKSwgV1RDUCgweDZmNzdjMGIzLCAweDNlZWI4ODljKSwKKyAgV1RDUCgweDZmNDYzMzgzLCAweDNmNDMwMTE5KSwgV1RDUCgweDZmMTQ2MWIwLCAweDNmOWE1MjkwKSwgV1RDUCgweDZlZTI0YjU3LCAweDNmZjE3Y2NhKSwgV1RDUCgweDZlYWZmMDk5LCAweDQwNDg3Zjk0KSwKKyAgV1RDUCgweDZlN2Q1MTkzLCAweDQwOWY1YWI2KSwgV1RDUCgweDZlNGE2ZTY2LCAweDQwZjYwZGZiKSwgV1RDUCgweDZlMTc0NzMwLCAweDQxNGM5OTJmKSwgV1RDUCgweDZkZTNkYzExLCAweDQxYTJmYzFhKSwKKyAgV1RDUCgweDZkYjAyZDI5LCAweDQxZjkzNjg5KSwgV1RDUCgweDZkN2MzYTk4LCAweDQyNGY0ODQ1KSwgV1RDUCgweDZkNDgwNDdlLCAweDQyYTUzMTFiKSwgV1RDUCgweDZkMTM4YWZiLCAweDQyZmFmMGQ0KSwKKyAgV1RDUCgweDZjZGVjZTJmLCAweDQzNTA4NzNjKSwgV1RDUCgweDZjYTljZTNiLCAweDQzYTVmNDFlKSwgV1RDUCgweDZjNzQ4YjNmLCAweDQzZmIzNzQ2KSwgV1RDUCgweDZjM2YwNTVkLCAweDQ0NTA1MDdlKSwKKyAgV1RDUCgweDZjMDkzY2I2LCAweDQ0YTUzZjkzKSwgV1RDUCgweDZiZDMzMTZhLCAweDQ0ZmEwNDUwKSwgV1RDUCgweDZiOWNlMzliLCAweDQ1NGU5ZTgwKSwgV1RDUCgweDZiNjY1MzZiLCAweDQ1YTMwZGYwKSwKKyAgV1RDUCgweDZiMmY4MGZiLCAweDQ1Zjc1MjZiKSwgV1RDUCgweDZhZjg2YzZjLCAweDQ2NGI2YmJlKSwgV1RDUCgweDZhYzExNWUyLCAweDQ2OWY1OWI0KSwgV1RDUCgweDZhODk3ZDdkLCAweDQ2ZjMxYzFhKSwKKyAgV1RDUCgweDZhNTFhMzYxLCAweDQ3NDZiMmJjKSwgV1RDUCgweDZhMTk4N2IwLCAweDQ3OWExZDY3KSwgV1RDUCgweDY5ZTEyYThjLCAweDQ3ZWQ1YmU2KSwgV1RDUCgweDY5YTg4YzE5LCAweDQ4NDA2ZTA4KSwKKyAgV1RDUCgweDY5NmZhYzc4LCAweDQ4OTM1Mzk3KSwgV1RDUCgweDY5MzY4YmNlLCAweDQ4ZTYwYzYyKSwgV1RDUCgweDY4ZmQyYTNkLCAweDQ5Mzg5ODM2KSwgV1RDUCgweDY4YzM4N2U5LCAweDQ5OGFmNmRmKSwKKyAgV1RDUCgweDY4ODlhNGY2LCAweDQ5ZGQyODJhKSwgV1RDUCgweDY4NGY4MTg2LCAweDRhMmYyYmU2KSwgV1RDUCgweDY4MTUxZGJlLCAweDRhODEwMWRlKSwgV1RDUCgweDY3ZGE3OWMzLCAweDRhZDJhOWUyKSwKKyAgV1RDUCgweDY3OWY5NWI3LCAweDRiMjQyM2JlKSwgV1RDUCgweDY3NjQ3MWMwLCAweDRiNzU2ZjQwKSwgV1RDUCgweDY3MjkwZTAyLCAweDRiYzY4YzM2KSwgV1RDUCgweDY2ZWQ2YWExLCAweDRjMTc3YTZlKSwKKyAgV1RDUCgweDY2YjE4N2MzLCAweDRjNjgzOWI3KSwgV1RDUCgweDY2NzU2NThjLCAweDRjYjhjOWRkKSwgV1RDUCgweDY2MzkwNDIyLCAweDRkMDkyYWIwKSwgV1RDUCgweDY1ZmM2M2E5LCAweDRkNTk1YmZlKSwKKyAgV1RDUCgweDY1YmY4NDQ3LCAweDRkYTk1ZDk2KSwgV1RDUCgweDY1ODI2NjIyLCAweDRkZjkyZjQ2KSwgV1RDUCgweDY1NDUwOTVmLCAweDRlNDhkMGRkKSwgV1RDUCgweDY1MDc2ZTI1LCAweDRlOTg0MjI5KSwKKyAgV1RDUCgweDY0Yzk5NDk4LCAweDRlZTc4MmZiKSwgV1RDUCgweDY0OGI3Y2UwLCAweDRmMzY5MzIwKSwgV1RDUCgweDY0NGQyNzIyLCAweDRmODU3MjY5KSwgV1RDUCgweDY0MGU5Mzg2LCAweDRmZDQyMGE0KSwKKyAgV1RDUCgweDYzY2ZjMjMxLCAweDUwMjI5ZGExKSwgV1RDUCgweDYzOTBiMzRhLCAweDUwNzBlOTJmKSwgV1RDUCgweDYzNTE2NmY5LCAweDUwYmYwMzFmKSwgV1RDUCgweDYzMTFkZDY0LCAweDUxMGNlYjQwKSwKKyAgV1RDUCgweDYyZDIxNmIzLCAweDUxNWFhMTYyKSwgV1RDUCgweDYyOTIxMzBjLCAweDUxYTgyNTU1KSwgV1RDUCgweDYyNTFkMjk4LCAweDUxZjU3NmVhKSwgV1RDUCgweDYyMTE1NTdlLCAweDUyNDI5NWYwKSwKKyAgV1RDUCgweDYxZDA5YmU1LCAweDUyOGY4MjM4KSwgV1RDUCgweDYxOGZhNWY3LCAweDUyZGMzYjkyKSwgV1RDUCgweDYxNGU3M2RhLCAweDUzMjhjMWQwKSwgV1RDUCgweDYxMGQwNWI3LCAweDUzNzUxNGMyKSwKKyAgV1RDUCgweDYwY2I1YmI3LCAweDUzYzEzNDM5KSwgV1RDUCgweDYwODk3NjAxLCAweDU0MGQyMDA1KSwgV1RDUCgweDYwNDc1NGJmLCAweDU0NThkN2Y5KSwgV1RDUCgweDYwMDRmODE5LCAweDU0YTQ1YmU2KSwKKyAgV1RDUCgweDVmYzI2MDM4LCAweDU0ZWZhYjljKSwgV1RDUCgweDVmN2Y4ZDQ2LCAweDU1M2FjNmVlKSwgV1RDUCgweDVmM2M3ZjZiLCAweDU1ODVhZGFkKSwgV1RDUCgweDVlZjkzNmQxLCAweDU1ZDA1ZmFhKSwKKyAgV1RDUCgweDVlYjViM2EyLCAweDU2MWFkY2I5KSwgV1RDUCgweDVlNzFmNjA2LCAweDU2NjUyNGFhKSwgV1RDUCgweDVlMmRmZTI5LCAweDU2YWYzNzUwKSwgV1RDUCgweDVkZTljYzMzLCAweDU2ZjkxNDdlKSwKKyAgV1RDUCgweDVkYTU2MDRmLCAweDU3NDJiYzA2KSwgV1RDUCgweDVkNjBiYWE3LCAweDU3OGMyZGJhKSwgV1RDUCgweDVkMWJkYjY1LCAweDU3ZDU2OTZkKSwgV1RDUCgweDVjZDZjMmI1LCAweDU4MWU2ZWYxKSwKKyAgV1RDUCgweDVjOTE3MGJmLCAweDU4NjczZTFiKSwgV1RDUCgweDVjNGJlNWIwLCAweDU4YWZkNmJkKSwgV1RDUCgweDVjMDYyMWIyLCAweDU4ZjgzOGE5KSwgV1RDUCgweDViYzAyNGYwLCAweDU5NDA2M2I1KSwKKyAgV1RDUCgweDViNzllZjk2LCAweDU5ODg1N2IyKSwgV1RDUCgweDViMzM4MWNlLCAweDU5ZDAxNDc1KSwgV1RDUCgweDVhZWNkYmM1LCAweDVhMTc5OWQxKSwgV1RDUCgweDVhYTVmZGE1LCAweDVhNWVlNzlhKSwKK307CisKKy8qIFRoZSB3aW5kb3cgY29lZmZpY2llbnRzIGFyZSBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKKyAqIE49RlJBTUVfTEVOX0xPTkdfTEQ0ODAKKyAqIHdpbltuXT1zaW4ocGkqKG4rMC41KS8oMipOKSkgICBmb3Igbj0wLC4uLE4tMSAqLworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c0ODBbNDgwXSA9Cit7CisgIFdUQ1AoMHg3ZmZmZjRjNSwgMHgwMDM1OWRkMiksIFdUQ1AoMHg3ZmZmOWFlZiwgMHgwMGEwZDk1MSksIFdUQ1AoMHg3ZmZlZTc0NCwgMHgwMTBjMTQ2MCksIFdUQ1AoMHg3ZmZkZDljNCwgMHgwMTc3NGViMiksCisgIFdUQ1AoMHg3ZmZjNzI2ZiwgMHgwMWUyODdmYyksIFdUQ1AoMHg3ZmZhYjE0NywgMHgwMjRkYmZmNCksIFdUQ1AoMHg3ZmY4OTY0ZCwgMHgwMmI4ZjY0ZSksIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksCisgIFdUQ1AoMHg3ZmYzNTJlOCwgMHgwMzhmNWNmYiksIFdUQ1AoMHg3ZmYwMmE4MiwgMHgwM2ZhOGNiOCksIFdUQ1AoMHg3ZmVjYTg1MSwgMHgwNDY1YjlhYSksIFdUQ1AoMHg3ZmU4Y2M1NywgMHgwNGQwZTM4NiksCisgIFdUQ1AoMHg3ZmU0OTY5OCwgMHgwNTNjMGEwMSksIFdUQ1AoMHg3ZmUwMDcxNiwgMHgwNWE3MmNjZiksIFdUQ1AoMHg3ZmRiMWRkNSwgMHgwNjEyNGJhNSksIFdUQ1AoMHg3ZmQ1ZGFkOCwgMHgwNjdkNjYzOSksCisgIFdUQ1AoMHg3ZmQwM2UyMywgMHgwNmU4N2MzZiksIFdUQ1AoMHg3ZmNhNDdiOSwgMHgwNzUzOGQ2YiksIFdUQ1AoMHg3ZmMzZjdhMCwgMHgwN2JlOTk3MyksIFdUQ1AoMHg3ZmJkNGRkYSwgMHgwODI5YTAwYyksCisgIFdUQ1AoMHg3ZmI2NGE2ZSwgMHgwODk0YTBlYSksIFdUQ1AoMHg3ZmFlZWQ1ZiwgMHgwOGZmOWJjMiksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFdUQ1AoMHg3ZjlmMjY3MSwgMHgwOWQ1N2UzNSksCisgIFdUQ1AoMHg3Zjk2YmM5YywgMHgwYTQwNjUzYSksIFdUQ1AoMHg3ZjhkZjkzYywgMHgwYWFiNDUwZCksIFdUQ1AoMHg3Zjg0ZGM1NSwgMHgwYjE2MWQ2MyksIFdUQ1AoMHg3ZjdiNjVlZiwgMHgwYjgwZWRmMSksCisgIFdUQ1AoMHg3ZjcxOTYxMSwgMHgwYmViYjY2YyksIFdUQ1AoMHg3ZjY3NmNjMCwgMHgwYzU2NzY4YSksIFdUQ1AoMHg3ZjVjZWEwNSwgMHgwY2MxMmRmZiksIFdUQ1AoMHg3ZjUyMGRlNiwgMHgwZDJiZGM4MCksCisgIFdUQ1AoMHg3ZjQ2ZDg2YywgMHgwZDk2ODFjMiksIFdUQ1AoMHg3ZjNiNDk5ZCwgMHgwZTAxMWQ3YyksIFdUQ1AoMHg3ZjJmNjE4MywgMHgwZTZiYWY2MSksIFdUQ1AoMHg3ZjIzMjAyNiwgMHgwZWQ2MzcyNyksCisgIFdUQ1AoMHg3ZjE2ODU4ZSwgMHgwZjQwYjQ4MyksIFdUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFdUQ1AoMHg3ZWZjNDRkMCwgMHgxMDE1OGVkNCksIFdUQ1AoMHg3ZWVlOWViZSwgMHgxMDdmZWIzMyksCisgIFdUQ1AoMHg3ZWUwOWY5NSwgMHgxMGVhM2JmZCksIFdUQ1AoMHg3ZWQyNDc2MSwgMHgxMTU0ODBlOSksIFdUQ1AoMHg3ZWMzOTYyYSwgMHgxMWJlYjlhYSksIFdUQ1AoMHg3ZWI0OGJmYiwgMHgxMjI4ZTVmOCksCisgIFdUQ1AoMHg3ZWE1MjhlMCwgMHgxMjkzMDU4NiksIFdUQ1AoMHg3ZTk1NmNlMSwgMHgxMmZkMTgwYiksIFdUQ1AoMHg3ZTg1NTgwYywgMHgxMzY3MWQzZCksIFdUQ1AoMHg3ZTc0ZWE2YSwgMHgxM2QxMTRkMCksCisgIFdUQ1AoMHg3ZTY0MjQwOCwgMHgxNDNhZmU3YiksIFdUQ1AoMHg3ZTUzMDRmMiwgMHgxNGE0ZDlmNCksIFdUQ1AoMHg3ZTQxOGQzMiwgMHgxNTBlYTZlZiksIFdUQ1AoMHg3ZTJmYmNkNiwgMHgxNTc4NjUyMiksCisgIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFdUQ1AoMHg3ZTBiMTI3YSwgMHgxNjRiYjQwYiksIFdUQ1AoMHg3ZGY4Mzg5NSwgMHgxNmI1NDQyYiksIFdUQ1AoMHg3ZGU1MDY0NiwgMHgxNzFlYzQ1YyksCisgIFdUQ1AoMHg3ZGQxN2I5YywgMHgxNzg4MzQ1MiksIFdUQ1AoMHg3ZGJkOThhNCwgMHgxN2YxOTNjNSksIFdUQ1AoMHg3ZGE5NWQ2YywgMHgxODVhZTI2OSksIFdUQ1AoMHg3ZDk0Y2EwMywgMHgxOGM0MWZmNiksCisgIFdUQ1AoMHg3ZDdmZGU3NiwgMHgxOTJkNGMyMSksIFdUQ1AoMHg3ZDZhOWFkNSwgMHgxOTk2NjZhMCksIFdUQ1AoMHg3ZDU0ZmYyZSwgMHgxOWZmNmYyYSksIFdUQ1AoMHg3ZDNmMGI5MCwgMHgxYTY4NjU3NSksCisgIFdUQ1AoMHg3ZDI4YzAwYywgMHgxYWQxNDkzOCksIFdUQ1AoMHg3ZDEyMWNiMCwgMHgxYjNhMWEyOCksIFdUQ1AoMHg3Y2ZiMjE4YywgMHgxYmEyZDdmYyksIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksCisgIFdUQ1AoMHg3Y2NjMjQzMCwgMHgxYzc0MTkyYSksIFdUQ1AoMHg3Y2I0MjIxNywgMHgxY2RjOWJmMiksIFdUQ1AoMHg3YzliYzg3YSwgMHgxZDQ1MGE3OCksIFdUQ1AoMHg3YzgzMTc2NywgMHgxZGFkNjQ3MyksCisgIFdUQ1AoMHg3YzZhMGVmMiwgMHgxZTE1YTk5YSksIFdUQ1AoMHg3YzUwYWYyYiwgMHgxZTdkZDlhNCksIFdUQ1AoMHg3YzM2ZjgyNCwgMHgxZWU1ZjQ0NyksIFdUQ1AoMHg3YzFjZTllZiwgMHgxZjRkZjkzYSksCisgIFdUQ1AoMHg3YzAyODQ5ZiwgMHgxZmI1ZTgzNiksIFdUQ1AoMHg3YmU3Yzg0NywgMHgyMDFkYzBlZiksIFdUQ1AoMHg3YmNjYjRmOCwgMHgyMDg1ODMxZiksIFdUQ1AoMHg3YmIxNGFjNSwgMHgyMGVkMmU3YiksCisgIFdUQ1AoMHg3Yjk1ODljMywgMHgyMTU0YzJiYiksIFdUQ1AoMHg3Yjc5NzIwNSwgMHgyMWJjM2Y5NyksIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFdUQ1AoMHg3YjQwM2VhMiwgMHgyMjhhZjFmZSksCisgIFdUQ1AoMHg3YjIzMjMyNSwgMHgyMmYyMjZmOCksIFdUQ1AoMHg3YjA1YjEzZCwgMHgyMzU5NDM2YyksIFdUQ1AoMHg3YWU3ZThmYywgMHgyM2MwNDcxMCksIFdUQ1AoMHg3YWM5Y2E3YSwgMHgyNDI3MzE5ZCksCisgIFdUQ1AoMHg3YWFiNTVjYSwgMHgyNDhlMDJjYiksIFdUQ1AoMHg3YThjOGIwMSwgMHgyNGY0YmE1MCksIFdUQ1AoMHg3YTZkNmEzNywgMHgyNTViNTdlNiksIFdUQ1AoMHg3YTRkZjM4MCwgMHgyNWMxZGI0NCksCisgIFdUQ1AoMHg3YTJlMjZmMiwgMHgyNjI4NDQyMiksIFdUQ1AoMHg3YTBlMDRhNCwgMHgyNjhlOTIzOCksIFdUQ1AoMHg3OWVkOGNhZCwgMHgyNmY0YzUzZSksIFdUQ1AoMHg3OWNjYmYyMiwgMHgyNzVhZGNlZSksCisgIFdUQ1AoMHg3OWFiOWMxYywgMHgyN2MwZDhmZSksIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFdUQ1AoMHg3OTY4NTVmOSwgMHgyODhjN2QyNCksIFdUQ1AoMHg3OTQ2MzMwYywgMHgyOGYyMjRhYiksCisgIFdUQ1AoMHg3OTIzYmIwMSwgMHgyOTU3YWY3NCksIFdUQ1AoMHg3OTAwZWRmMiwgMHgyOWJkMWQzYSksIFdUQ1AoMHg3OGRkY2JmNSwgMHgyYTIyNmRiNSksIFdUQ1AoMHg3OGJhNTUyNCwgMHgyYTg3YTA5ZCksCisgIFdUQ1AoMHg3ODk2ODk5OCwgMHgyYWVjYjVhYyksIFdUQ1AoMHg3ODcyNjk2YSwgMHgyYjUxYWM5YSksIFdUQ1AoMHg3ODRkZjRiMywgMHgyYmI2ODUyMiksIFdUQ1AoMHg3ODI5MmI4ZCwgMHgyYzFiM2VmYiksCisgIFdUQ1AoMHg3ODA0MGUxMiwgMHgyYzdmZDllMCksIFdUQ1AoMHg3N2RlOWM1YiwgMHgyY2U0NTU4OSksIFdUQ1AoMHg3N2I4ZDY4MywgMHgyZDQ4YjFiMSksIFdUQ1AoMHg3NzkyYmNhNSwgMHgyZGFjZWUxMSksCisgIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFdUQ1AoMHg3NzQ1OGQ0MCwgMHgyZTc1MDY1ZSksIFdUQ1AoMHg3NzFlNzdmMCwgMHgyZWQ4ZTFjMCksIFdUQ1AoMHg3NmY3MGYwNSwgMHgyZjNjOWM0MCksCisgIFdUQ1AoMHg3NmNmNTI5YywgMHgyZmEwMzU5OSksIFdUQ1AoMHg3NmE3NDJkMSwgMHgzMDAzYWQ4NSksIFdUQ1AoMHg3NjdlZGZiZSwgMHgzMDY3MDNiZiksIFdUQ1AoMHg3NjU2Mjk4MiwgMHgzMGNhMzgwMCksCisgIFdUQ1AoMHg3NjJkMjAzOCwgMHgzMTJkNGEwMyksIFdUQ1AoMHg3NjAzYzNmZCwgMHgzMTkwMzk4MiksIFdUQ1AoMHg3NWRhMTRlZiwgMHgzMWYzMDYzOCksIFdUQ1AoMHg3NWIwMTMyOSwgMHgzMjU1YWZlMCksCisgIFdUQ1AoMHg3NTg1YmVjYiwgMHgzMmI4MzYzNCksIFdUQ1AoMHg3NTViMTdmMiwgMHgzMzFhOThlZiksIFdUQ1AoMHg3NTMwMWViYiwgMHgzMzdjZDdjZCksIFdUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksCisgIFdUQ1AoMHg3NGQ5MzVhZSwgMHgzNDQwZThkYSksIFdUQ1AoMHg3NGFkNDYxNSwgMHgzNGEyYmE4MSksIFdUQ1AoMHg3NDgxMDQ5OSwgMHgzNTA0NjczNiksIFdUQ1AoMHg3NDU0NzE1OCwgMHgzNTY1ZWViNiksCisgIFdUQ1AoMHg3NDI3OGM3MiwgMHgzNWM3NTBiYyksIFdUQ1AoMHg3M2ZhNTYwNywgMHgzNjI4OGQwMyksIFdUQ1AoMHg3M2NjY2UzNiwgMHgzNjg5YTM0OCksIFdUQ1AoMHg3MzllZjUxZiwgMHgzNmVhOTM0NiksCisgIFdUQ1AoMHg3MzcwY2FlMiwgMHgzNzRiNWNiOSksIFdUQ1AoMHg3MzQyNGZhMCwgMHgzN2FiZmY1ZCksIFdUQ1AoMHg3MzEzODM3OSwgMHgzODBjN2FlZSksIFdUQ1AoMHg3MmU0NjY4ZiwgMHgzODZjY2YyYSksCisgIFdUQ1AoMHg3MmI0ZjkwMiwgMHgzOGNjZmJjYiksIFdUQ1AoMHg3Mjg1M2FmMywgMHgzOTJkMDA4ZiksIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFdUQ1AoMHg3MjI0Y2RkOCwgMHgzOWVjOTE3MiksCisgIFdUQ1AoMHg3MWY0MWYwZiwgMHgzYTRjMWQwOSksIFdUQ1AoMHg3MWMzMjA0YywgMHgzYWFiN2ZiNyksIFdUQ1AoMHg3MTkxZDFiMSwgMHgzYjBhYjkzNyksIFdUQ1AoMHg3MTYwMzM2MSwgMHgzYjY5Yzk0NyksCisgIFdUQ1AoMHg3MTJlNDU3ZiwgMHgzYmM4YWZhNSksIFdUQ1AoMHg3MGZjMDgyZCwgMHgzYzI3NmMwZCksIFdUQ1AoMHg3MGM5N2I5MCwgMHgzYzg1ZmUzZCksIFdUQ1AoMHg3MDk2OWZjYSwgMHgzY2U0NjVmMyksCisgIFdUQ1AoMHg3MDYzNzRmZiwgMHgzZDQyYTJlYyksIFdUQ1AoMHg3MDJmZmI1NCwgMHgzZGEwYjRlNyksIFdUQ1AoMHg2ZmZjMzJlYiwgMHgzZGZlOWJhMSksIFdUQ1AoMHg2ZmM4MWJlYSwgMHgzZTVjNTZkOCksCisgIFdUQ1AoMHg2ZjkzYjY3NiwgMHgzZWI5ZTY0YiksIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFdUQ1AoMHg2ZjJhMDBjNCwgMHgzZjc0ODBkZCksIFdUQ1AoMHg2ZWY0YjBkMSwgMHgzZmQxOGI3YSksCisgIFdUQ1AoMHg2ZWJmMTJmZiwgMHg0MDJlNjk0YyksIFdUQ1AoMHg2ZTg5Mjc3MiwgMHg0MDhiMWExMiksIFdUQ1AoMHg2ZTUyZWU1MiwgMHg0MGU3OWQ4YyksIFdUQ1AoMHg2ZTFjNjdjNCwgMHg0MTQzZjM3OSksCisgIFdUQ1AoMHg2ZGU1OTNlZSwgMHg0MWEwMWI5NyksIFdUQ1AoMHg2ZGFlNzJmNywgMHg0MWZjMTVhNiksIFdUQ1AoMHg2ZDc3MDUwNiwgMHg0MjU3ZTE2NiksIFdUQ1AoMHg2ZDNmNGE0MCwgMHg0MmIzN2U5NiksCisgIFdUQ1AoMHg2ZDA3NDJjZiwgMHg0MzBlZWNmNiksIFdUQ1AoMHg2Y2NlZWVkOCwgMHg0MzZhMmM0NSksIFdUQ1AoMHg2Yzk2NGU4MywgMHg0M2M1M2M0NCksIFdUQ1AoMHg2YzVkNjFmOSwgMHg0NDIwMWNiMiksCisgIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFdUQ1AoMHg2YmVhYTRlMiwgMHg0NGQ1NGRkZiksIFdUQ1AoMHg2YmIwZDRhNywgMHg0NTJmOWUxZSksIFdUQ1AoMHg2Yjc2YjhkNiwgMHg0NTg5YmRjZiksCisgIFdUQ1AoMHg2YjNjNTE5YSwgMHg0NWUzYWNiMSksIFdUQ1AoMHg2YjAxOWYxYSwgMHg0NjNkNmE4NyksIFdUQ1AoMHg2YWM2YTE4MCwgMHg0Njk2ZjcxMCksIFdUQ1AoMHg2YThiNThmNiwgMHg0NmYwNTIwZiksCisgIFdUQ1AoMHg2YTRmYzVhNiwgMHg0NzQ5N2I0NCksIFdUQ1AoMHg2YTEzZTdiOCwgMHg0N2EyNzI3MSksIFdUQ1AoMHg2OWQ3YmY1NywgMHg0N2ZiMzc1NyksIFdUQ1AoMHg2OTliNGNhZCwgMHg0ODUzYzliOSksCisgIFdUQ1AoMHg2OTVlOGZlNSwgMHg0OGFjMjk1NyksIFdUQ1AoMHg2OTIxODkyOSwgMHg0OTA0NTVmNCksIFdUQ1AoMHg2OGU0MzhhNCwgMHg0OTVjNGY1MiksIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksCisgIFdUQ1AoMHg2ODY4YmFlYywgMHg0YTBiYTc1YiksIFdUQ1AoMHg2ODJhOGUwZiwgMHg0YTYzMDU4YSksIFdUQ1AoMHg2N2VjMTgxNywgMHg0YWJhMmY4NCksIFdUQ1AoMHg2N2FkNTkyZiwgMHg0YjExMjUwYyksCisgIFdUQ1AoMHg2NzZlNTE4MywgMHg0YjY3ZTVlNCksIFdUQ1AoMHg2NzJmMDEzZiwgMHg0YmJlNzFkMSksIFdUQ1AoMHg2NmVmNjg5MSwgMHg0YzE0Yzg5NCksIFdUQ1AoMHg2NmFmODdhNCwgMHg0YzZhZTlmMiksCisgIFdUQ1AoMHg2NjZmNWVhNiwgMHg0Y2MwZDVhZSksIFdUQ1AoMHg2NjJlZWRjMywgMHg0ZDE2OGI4YiksIFdUQ1AoMHg2NWVlMzUyOSwgMHg0ZDZjMGI0ZSksIFdUQ1AoMHg2NWFkMzUwNSwgMHg0ZGMxNTRiYiksCisgIFdUQ1AoMHg2NTZiZWQ4NCwgMHg0ZTE2Njc5NSksIFdUQ1AoMHg2NTJhNWVkNiwgMHg0ZTZiNDNhMiksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFdUQ1AoMHg2NGE2NmNhNSwgMHg0ZjE0NTY2MiksCisgIFdUQ1AoMHg2NDY0MDk3ZiwgMHg0ZjY4OGNhMCksIFdUQ1AoMHg2NDIxNWZlNSwgMHg0ZmJjOGIyMiksIFdUQ1AoMHg2M2RlNzAwMywgMHg1MDEwNTFhZSksIFdUQ1AoMHg2MzliM2EwYiwgMHg1MDYzZTAwOCksCisgIFdUQ1AoMHg2MzU3YmUyYSwgMHg1MGI3MzVmOCksIFdUQ1AoMHg2MzEzZmM5MCwgMHg1MTBhNTM0MCksIFdUQ1AoMHg2MmNmZjU2YywgMHg1MTVkMzdhOSksIFdUQ1AoMHg2MjhiYThlZiwgMHg1MWFmZTJmNiksCisgIFdUQ1AoMHg2MjQ3MTc0OSwgMHg1MjAyNTRlZiksIFdUQ1AoMHg2MjAyNDBhOCwgMHg1MjU0OGQ1OSksIFdUQ1AoMHg2MWJkMjUzZiwgMHg1MmE2OGJmYiksIFdUQ1AoMHg2MTc3YzUzYywgMHg1MmY4NTA5YiksCisgIFdUQ1AoMHg2MTMyMjBkMiwgMHg1MzQ5ZGFmZiksIFdUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFdUQ1AoMHg2MGE2MGI4OCwgMHg1M2VjNDAzMiksIFdUQ1AoMHg2MDVmOWIwYiwgMHg1NDNkMWE4ZSksCisgIFdUQ1AoMHg2MDE4ZTZlYiwgMHg1NDhkYjljYiksIFdUQ1AoMHg1ZmQxZWY1OSwgMHg1NGRlMWRiMSksIFdUQ1AoMHg1ZjhhYjQ4NywgMHg1NTJlNDYwNSksIFdUQ1AoMHg1ZjQzMzZhNywgMHg1NTdlMzI5MiksCisgIFdUQ1AoMHg1ZWZiNzVlYSwgMHg1NWNkZTMxZSksIFdUQ1AoMHg1ZWIzNzI4NSwgMHg1NjFkNTc3MSksIFdUQ1AoMHg1ZTZiMmNhOCwgMHg1NjZjOGY1NSksIFdUQ1AoMHg1ZTIyYTQ4NywgMHg1NmJiOGE5MCksCisgIFdUQ1AoMHg1ZGQ5ZGE1NSwgMHg1NzBhNDhlYyksIFdUQ1AoMHg1ZDkwY2U0NSwgMHg1NzU4Y2EzMSksIFdUQ1AoMHg1ZDQ3ODA4YSwgMHg1N2E3MGUyOSksIFdUQ1AoMHg1Y2ZkZjE1NywgMHg1N2Y1MTQ5ZCksCisgIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFdUQ1AoMHg1YzZhMGY1OSwgMHg1ODkwNjgxYSksIFdUQ1AoMHg1YzFmYmNmNiwgMHg1OGRkYjRiOCksIFdUQ1AoMHg1YmQ1MjllYiwgMHg1OTJhYzJmNyksCisgIFdUQ1AoMHg1YjhhNTY2YywgMHg1OTc3OTJhMSksIFdUQ1AoMHg1YjNmNDJhZSwgMHg1OWM0MjM4MSksIFdUQ1AoMHg1YWYzZWVlNiwgMHg1YTEwNzU2MSksIFdUQ1AoMHg1YWE4NWI0OCwgMHg1YTVjODgwYSksCit9OworCisKKworCisKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCwgcmFzdGVyYW5kIHNoYXBlIG1hcHBpbmcgdG8gaW5kaXZpZHVhbCB3aW5kb3cgc2xvcGUgdGFibGVzLgorICogWzA6IHNpbmUgXVswOiByYWRpeDIgcmFzdGVyICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICA0ICAgIC4uIDEwMjQgXQorICogICAgICAgICAgIFsxOiAxMG1zIHJhc3RlciAgICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzLjI1IC4uICA5NjAgXQorICogICAgICAgICAgIFsyOiAzLzQgb2YgcmFkaXggMiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzICAgIC4uICA3NjggXQorICogWzE6IEtCRCAgXVswOiByYWRpeDIgcmFzdGVyICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggMTI4ICAgIC4uIDEwMjQgXQorICogICAgICAgICAgIFsxOiAxMG1zIHJhc3RlciAgICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggMTIwICAgIC4uICA5NjAgXQorICogICAgICAgICAgIFsyOiAzLzQgb2YgcmFkaXggMiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggIDk2ICAgIC4uICA3NjggXQorICovCitjb25zdCBGSVhQX1dUUCAqY29uc3Qgd2luZG93U2xvcGVzWzJdWzNdWzldID0KK3sKKyAgeyAvKiBTaW5lICovCisgICAgeyAvKiBSYWRpeCAyICovCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBTaW5lV2luZG93MzIsCisgICAgICBTaW5lV2luZG93NjQsCisgICAgICBTaW5lV2luZG93MTI4LAorICAgICAgTlVMTCwKKyAgICAgIFNpbmVXaW5kb3c1MTIsCisgICAgICBTaW5lV2luZG93MTAyNAorICAgIH0sCisgICAgeyAvKiAxMG1zIHJhc3RlciAqLworICAgICAgTlVMTCwgLyogMy4yNSAqLworICAgICAgTlVMTCwgLyogNy41ICovCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBTaW5lV2luZG93MTIwLCAKKyAgICAgIE5VTEwsCisgICAgICBTaW5lV2luZG93NDgwLAorICAgICAgU2luZVdpbmRvdzk2MAorICAgIH0sCisgICAgeyAvKiAzLzQgcmFkaXgyIHJhc3RlciAqLworICAgICAgTlVMTCwgLyogMyAqLworICAgICAgTlVMTCwgLyogNiAqLworI2lmZGVmIElOQ0xVREVfU2luZVdpbmRvdzEyCisgICAgICBTaW5lV2luZG93MTIsCisjZWxzZQorICAgICAgTlVMTCwKKyNlbmRpZgorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMCisgICAgfQorICB9LAorICB7IC8qIEtCRCAqLworICAgIHsgLyogUmFkaXggMiAqLworICAgICAgS0JEV2luZG93MTI4LAorICAgICAgTlVMTCwKKyAgICAgIFNpbmVXaW5kb3c1MTIsCisgICAgICBLQkRXaW5kb3cxMDI0CisgICAgfSwKKyAgICB7IC8qIDEwbXMgcmFzdGVyICovCisgICAgICBLQkRXaW5kb3cxMjAsCisgICAgICBOVUxMLAorICAgICAgU2luZVdpbmRvdzQ4MCwKKyAgICAgIEtCRFdpbmRvdzk2MAorICAgIH0sCisgICAgeyAvKiAzLzQgcmFkaXgyIHJhc3RlciAqLworICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgTlVMTAorICAgIH0KKyAgfQorfTsKKworY29uc3QgRklYUF9XVFAgKiBGREtnZXRXaW5kb3dTbG9wZShpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpCit7CisgIGNvbnN0IEZJWFBfV1RQICogdyA9IE5VTEw7CisgIGludCByYXN0ZXIsIGxkMl9sZW5ndGg7CisKKyAgLyogR2V0IGxkMiBvZiBsZW5ndGggLSAyICsgMQorICAgICAtMjogYmVjYXVzZSBmaXJzdCB0YWJsZSBlbnRyeSBpcyB3aW5kb3cgb2Ygc2l6ZSA0CisgICAgICsxOiBiZWNhdXNlIHdlIGFscmVhZHkgaW5jbHVkZSArMSBiZWNhdXNlIG9mIGNlaWwobG9nMihsZW5ndGgpKSAqLworICBsZDJfbGVuZ3RoID0gREZSQUNUX0JJVFMtMS1mTm9ybXooKEZJWFBfREJMKWxlbmd0aCkgLSAxOworCisgIC8qIEV4dHJhY3Qgc29ydCBvZiAiZWlnZW52YWx1ZSIgKHRoZSA0IGxlZnQgbW9zdCBiaXRzKSBvZiBsZW5ndGguICovCisgIHN3aXRjaCAoIChsZW5ndGgpID4+IChsZDJfbGVuZ3RoLTIpICkgeworICAgIGNhc2UgMHg4OiAvKiByYWRpeCAyICovCisgICAgICByYXN0ZXIgPSAwOworICAgICAgbGQyX2xlbmd0aC0tOyAvKiByZXZlcnQgKyAxIGJlY2F1c2Ugb2YgY2VpbChsb2cyKGxlbmd0aCkpIGZyb20gYWJvdmUuICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZjogLyogMTAgbXMgKi8KKyAgICAgIHJhc3RlciA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4YzogLyogMy80IG9mIHJhZGl4IDIgKi8KKyAgICAgIHJhc3RlciA9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmFzdGVyID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogVGhlIHRhYmxlIGZvciBzaW5lIHdpbmRvd3MgKHNoYXBlID09IDApIGlzIDUgZW50cmllcyBsb25nZXIuICovCisgIGlmIChzaGFwZSA9PSAxKSB7CisgICAgbGQyX2xlbmd0aC09NTsKKyAgfQorCisgIC8qIExvb2sgdXAgdGFibGUgKi8KKyAgdyA9IHdpbmRvd1Nsb3Blc1tzaGFwZSYxXVtyYXN0ZXJdW2xkMl9sZW5ndGhdOworCisgIEZES19BU1NFUlQodyAhPSBOVUxMKTsKKworICByZXR1cm4gdzsKK30KKworCisvKgorICogUU1GIGZpbHRlciBhbmQgdHdpZGRsZSB0YWJsZXMKKyAqLworCisjaWZkZWYgUU1GX0NPRUZGXzE2QklUCisjZGVmaW5lIFFGQyh4KSAgRlhfREJMMkZYQ09OU1RfU0dMKHgpCisjZGVmaW5lIFFUQ0ZMKHgpICBGTDJGWENPTlNUX1NHTCh4KQorI2RlZmluZSBRVEMoeCkgICAgRlhfREJMMkZYQ09OU1RfU0dMKHgpCisjZWxzZQorI2RlZmluZSBRRkMoeCkgKHgpCisjZGVmaW5lIFFUQ0ZMKHgpICBGTDJGWENPTlNUX0RCTCh4KQorI2RlZmluZSBRVEMoeCkgICh4KQorI2VuZGlmIC8qIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYgKi8KKworI2lmbmRlZiBMT1dfUE9XRVJfU0JSX09OTFkKKy8qIQorICBcbmFtZSBRTUYtVHdpZGRsZQorICBcYnJpZWYgUU1GIHR3aWRkbGUgZmFjdG9ycworCisgIEw9MzIsIGdhaW49Mi4wLCBhbmdsZSA9IDAuNzUKKyovCisKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyWzMyXSA9Cit7CisgIFFUQ0ZMKCAwLjk5OTMyMjM4NDU4ODM1ZiksUVRDRkwoIDAuOTkzOTA2OTcwMDAyMzZmKSxRVENGTCggMC45ODMxMDU0ODc0MzEyMmYpLFFUQ0ZMKCAwLjk2Njk3NjQ3MTA0NDg1ZiksCisgIFFUQ0ZMKCAwLjk0NTYwNzMyNTM4MDUyZiksUVRDRkwoIDAuOTE5MTEzODUxNjkwMDZmKSxRVENGTCggMC44ODc2Mzk2MjA0MDI4NWYpLFFUQ0ZMKCAwLjg1MTM1NTE5MzEwNTI3ZiksCisgIFFUQ0ZMKCAwLjgxMDQ1NzE5ODI1MjU5ZiksUVRDRkwoIDAuNzY1MTY3MjY1NjIyNDZmKSxRVENGTCggMC43MTU3MzA4MjUyODM4MmYpLFFUQ0ZMKCAwLjY2MjQxNTc3NzU5MDE3ZiksCisgIFFUQ0ZMKCAwLjYwNTUxMTA0MTQwNDMzZiksUVRDRkwoIDAuNTQ1MzI0OTg4NDIyMDVmKSxRVENGTCggMC40ODIxODM3NzIwNzkxMmYpLFFUQ0ZMKCAwLjQxNjQyOTU2MDA5NzY0ZiksCisgIFFUQ0ZMKCAwLjM0ODQxODY4MDI0OTQzZiksUVRDRkwoIDAuMjc4NTE5Njg5Mzg1MDVmKSxRVENGTCggMC4yMDcxMTEzNzYxOTIyMmYpLFFUQ0ZMKCAwLjEzNDU4MDcwODUwNzEzZiksCisgIFFUQ0ZMKCAwLjA2MTMyMDczNjMwMjIxZiksUVRDRkwoLTAuMDEyMjcxNTM4Mjg1NzJmKSxRVENGTCgtMC4wODU3OTczMTIzNDQ0NGYpLFFUQ0ZMKC0wLjE1ODg1ODE0MzMzMzg2ZiksCisgIFFUQ0ZMKC0wLjIzMTA1ODEwODI4MDY3ZiksUVRDRkwoLTAuMzAyMDA1OTQ5MzE5MjNmKSxRVENGTCgtMC4zNzEzMTcxOTM5NTE4NGYpLFFUQ0ZMKC0wLjQzODYxNjIzODUzODUzZiksCisgIFFUQ0ZMKC0wLjUwMzUzODM4MzcyNTcyZiksUVRDRkwoLTAuNTY1NzMxODEwNzgzNjFmKSxRVENGTCgtMC42MjQ4NTk0ODgxNDIzOWYpLFFUQ0ZMKC0wLjY4MDYwMDk5Nzc5NTQ1ZikKK307CisKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjMyWzMyXSA9Cit7CisgIFFUQ0ZMKCAwLjAzNjgwNzIyMjk0MTM2ZiksUVRDRkwoIDAuMTEwMjIyMjA3MjkzODhmKSxRVENGTCggMC4xODMwMzk4ODc5NTUxNGYpLFFUQ0ZMKCAwLjI1NDg2NTY1OTYwNDUxZiksCisgIFFUQ0ZMKCAwLjMyNTMxMDI5MjE2MjI2ZiksUVRDRkwoIDAuMzkzOTkyMDQwMDYxMDVmKSxRVENGTCggMC40NjA1Mzg3MTA5NTgyNGYpLFFUQ0ZMKCAwLjUyNDU4OTY4MjY3ODQ3ZiksCisgIFFUQ0ZMKCAwLjU4NTc5Nzg1NzQ1NjQ0ZiksUVRDRkwoIDAuNjQzODMxNTQyODg5NzlmKSxRVENGTCggMC42OTgzNzYyNDk0MDg5N2YpLFFUQ0ZMKCAwLjc0OTEzNjM5NDUyMzQ2ZiksCisgIFFUQ0ZMKCAwLjc5NTgzNjkwNDYwODg4ZiksUVRDRkwoIDAuODM4MjI0NzA1NTU0ODRmKSxRVENGTCggMC44NzYwNzAwOTQxOTU0MWYpLFFUQ0ZMKCAwLjkwOTE2Nzk4MzA5MDUyZiksCisgIFFUQ0ZMKCAwLjkzNzMzOTAxMTkxMjU3ZiksUVRDRkwoIDAuOTYwNDMwNTE5NDE1NTdmKSxRVENGTCggMC45NzgzMTczNzA3MTk2M2YpLFFUQ0ZMKCAwLjk5MDkwMjYzNTQyNzc4ZiksCisgIFFUQ0ZMKCAwLjk5ODExODExMjkwMDE1ZiksUVRDRkwoIDAuOTk5OTI0NzAxODM5MTRmKSxRVENGTCggMC45OTYzMTI2MTIxODI3OGYpLFFUQ0ZMKCAwLjk4NzMwMTQxODE1Nzg2ZiksCisgIFFUQ0ZMKCAwLjk3MjkzOTk1MjIwNTU2ZiksUVRDRkwoIDAuOTUzMzA2MDQwMzU0MTlmKSxRVENGTCggMC45Mjg1MDYwODA0NzMyMmYpLFFUQ0ZMKCAwLjg5ODY3NDQ2NTY5Mzk1ZiksCisgIFFUQ0ZMKCAwLjg2Mzk3Mjg1NjEyMTU5ZiksUVRDRkwoIDAuODI0NTg5MzAyNzg1MDNmKSxRVENGTCggMC43ODA3MzcyMjg1NzIwOWYpLFFUQ0ZMKCAwLjczMjY1NDI3MTY3MjQxZikKK307Citjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NFs2NF0gPSB7CisgIFFUQygweDdmZjYyMTgxKSwgUVRDKDB4N2ZhNzM2YjMpLCBRVEMoMHg3ZjA5OTFjMyksIFFUQygweDdlMWQ5M2U5KSwgUVRDKDB4N2NlM2NlYjEpLCBRVEMoMHg3YjVkMDM5ZCksIFFUQygweDc5OGEyM2IwKSwgUVRDKDB4Nzc2YzRlZGEpLAorICBRVEMoMHg3NTA0ZDM0NCksIFFUQygweDcyNTUyYzg0KSwgUVRDKDB4NmY1ZjAyYjEpLCBRVEMoMHg2YzI0Mjk1ZiksIFFUQygweDY4YTY5ZTgwKSwgUVRDKDB4NjRlODg5MjUpLCBRVEMoMHg2MGVjMzgyZiksIFFUQygweDVjYjQyMGRmKSwKKyAgUVRDKDB4NTg0MmRkNTQpLCBRVEMoMHg1MzliMmFlZiksIFFUQygweDRlYmZlOGE0KSwgUVRDKDB4NDliNDE1MzMpLCBRVEMoMHg0NDdhY2Q1MCksIFFUQygweDNmMTc0OWI3KSwgUVRDKDB4Mzk4Y2RkMzIpLCBRVEMoMHgzM2RlZjI4NyksCisgIFFUQygweDJlMTEwYTYyKSwgUVRDKDB4MjgyNmI5MjgpLCBRVEMoMHgyMjIzYTRjNSksIFFUQygweDFjMGI4MjZhKSwgUVRDKDB4MTVlMjE0NDQpLCBRVEMoMHgwZmFiMjcyYiksIFFUQygweDA5NmE5MDQ5KSwgUVRDKDB4MDMyNDJhYmYpLAorICBRVEMoMHhmY2RiZDU0MSksIFFUQygweGY2OTU2ZmI3KSwgUVRDKDB4ZjA1NGQ4ZDUpLCBRVEMoMHhlYTFkZWJiYyksIFFUQygweGUzZjQ3ZDk2KSwgUVRDKDB4ZGRkYzViM2IpLCBRVEMoMHhkN2Q5NDZkOCksIFFUQygweGQxZWVmNTllKSwKKyAgUVRDKDB4Y2MyMTBkNzkpLCBRVEMoMHhjNjczMjJjZSksIFFUQygweGMwZThiNjQ5KSwgUVRDKDB4YmI4NTMyYjApLCBRVEMoMHhiNjRiZWFjZCksIFFUQygweGIxNDAxNzVjKSwgUVRDKDB4YWM2NGQ1MTEpLCBRVEMoMHhhN2JkMjJhYyksCisgIFFUQygweGEzNGJkZjIxKSwgUVRDKDB4OWYxM2M3ZDEpLCBRVEMoMHg5YjE3NzZkYiksIFFUQygweDk3NTk2MTgwKSwgUVRDKDB4OTNkYmQ2YTEpLCBRVEMoMHg5MGEwZmQ0ZiksIFFUQygweDhkYWFkMzdjKSwgUVRDKDB4OGFmYjJjYmMpLAorICBRVEMoMHg4ODkzYjEyNiksIFFUQygweDg2NzVkYzUwKSwgUVRDKDB4ODRhMmZjNjMpLCBRVEMoMHg4MzFjMzE0ZiksIFFUQygweDgxZTI2YzE3KSwgUVRDKDB4ODBmNjZlM2QpLCBRVEMoMHg4MDU4Yzk0ZCksIFFUQygweDgwMDlkZTdmKQorfTsKKworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRbNjRdID0geworICBRVEMoMHgwMzI0MmFiZiksIFFUQygweDA5NmE5MDQ5KSwgUVRDKDB4MGZhYjI3MmIpLCBRVEMoMHgxNWUyMTQ0NCksIFFUQygweDFjMGI4MjZhKSwgUVRDKDB4MjIyM2E0YzUpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDJlMTEwYTYyKSwKKyAgUVRDKDB4MzNkZWYyODcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDNmMTc0OWI3KSwgUVRDKDB4NDQ3YWNkNTApLCBRVEMoMHg0OWI0MTUzMyksIFFUQygweDRlYmZlOGE0KSwgUVRDKDB4NTM5YjJhZWYpLCBRVEMoMHg1ODQyZGQ1NCksCisgIFFUQygweDVjYjQyMGRmKSwgUVRDKDB4NjBlYzM4MmYpLCBRVEMoMHg2NGU4ODkyNSksIFFUQygweDY4YTY5ZTgwKSwgUVRDKDB4NmMyNDI5NWYpLCBRVEMoMHg2ZjVmMDJiMSksIFFUQygweDcyNTUyYzg0KSwgUVRDKDB4NzUwNGQzNDQpLAorICBRVEMoMHg3NzZjNGVkYSksIFFUQygweDc5OGEyM2IwKSwgUVRDKDB4N2I1ZDAzOWQpLCBRVEMoMHg3Y2UzY2ViMSksIFFUQygweDdlMWQ5M2U5KSwgUVRDKDB4N2YwOTkxYzMpLCBRVEMoMHg3ZmE3MzZiMyksIFFUQygweDdmZjYyMTgxKSwKKyAgUVRDKDB4N2ZmNjIxODEpLCBRVEMoMHg3ZmE3MzZiMyksIFFUQygweDdmMDk5MWMzKSwgUVRDKDB4N2UxZDkzZTkpLCBRVEMoMHg3Y2UzY2ViMSksIFFUQygweDdiNWQwMzlkKSwgUVRDKDB4Nzk4YTIzYjApLCBRVEMoMHg3NzZjNGVkYSksCisgIFFUQygweDc1MDRkMzQ0KSwgUVRDKDB4NzI1NTJjODQpLCBRVEMoMHg2ZjVmMDJiMSksIFFUQygweDZjMjQyOTVmKSwgUVRDKDB4NjhhNjllODApLCBRVEMoMHg2NGU4ODkyNSksIFFUQygweDYwZWMzODJmKSwgUVRDKDB4NWNiNDIwZGYpLAorICBRVEMoMHg1ODQyZGQ1NCksIFFUQygweDUzOWIyYWVmKSwgUVRDKDB4NGViZmU4YTQpLCBRVEMoMHg0OWI0MTUzMyksIFFUQygweDQ0N2FjZDUwKSwgUVRDKDB4M2YxNzQ5YjcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDMzZGVmMjg3KSwKKyAgUVRDKDB4MmUxMTBhNjIpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MWMwYjgyNmEpLCBRVEMoMHgxNWUyMTQ0NCksIFFUQygweDBmYWIyNzJiKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwMzI0MmFiZikKK307CisKKy8vQH0KKworI2VuZGlmIC8qICNpZmRlZiBMT1dfUE9XRVJfU0JSX09OTFkgKi8KKworCisKKy8qIQorICBcbmFtZSBRTUYKKyAgXGJyaWVmICBRTUYtVGFibGUKKyAgICAgICAgICA2NCBjaGFubmVscywgTiA9IDY0MCwgb3B0aW1pemVkIGJ5IFBFIDAxMDUxNgorCisgIFRoZSBjb2VmZnMgYXJlIHJlYXJyYW5nZWQgY29tcGFyZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGluIHRoZSBmb2xsb3dpbmcKKyAgd2F5LCBleHBsb2l0aW5nIHN5bW1ldHJ5IDoKKyAgc2JyX3FtZl82NFs1XSA9IHBfNjRfNjQwX3FtZlswXTsKKyAgc2JyX3FtZl82NFs2XSA9IHBfNjRfNjQwX3FtZlsxMjhdOworICBzYnJfcW1mXzY0WzddID0gcF82NF82NDBfcW1mWzI1Nl07CisgIHNicl9xbWZfNjRbOF0gPSBwXzY0XzY0MF9xbWZbMzg0XTsKKyAgc2JyX3FtZl82NFs5XSA9IHBfNjRfNjQwX3FtZls1MTJdOworCisgIHNicl9xbWZfNjRbMTBdID0gcF82NF82NDBfcW1mWzFdOworICBzYnJfcW1mXzY0WzExXSA9IHBfNjRfNjQwX3FtZlsxMjldOworICBzYnJfcW1mXzY0WzEyXSA9IHBfNjRfNjQwX3FtZlsyNTddOworICBzYnJfcW1mXzY0WzEzXSA9IHBfNjRfNjQwX3FtZlszODVdOworICBzYnJfcW1mXzY0WzE0XSA9IHBfNjRfNjQwX3FtZls1MTNdOworICAuCisgIC4KKyAgLgorICBzYnJfcW1mXzY0XzY0MF9xbWZbMzE1XSA9IHBfNjRfNjQwX3FtZls2Ml07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTZdID0gcF82NF82NDBfcW1mWzE5MF07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTddID0gcF82NF82NDBfcW1mWzMxOF07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMThdID0gcF82NF82NDBfcW1mWzQ0Nl07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTldID0gcF82NF82NDBfcW1mWzU3NF07CisKKyAgc2JyX3FtZl82NF82NDBfcW1mWzMyMF0gPSBwXzY0XzY0MF9xbWZbNjNdOworICBzYnJfcW1mXzY0XzY0MF9xbWZbMzIxXSA9IHBfNjRfNjQwX3FtZlsxOTFdOworICBzYnJfcW1mXzY0XzY0MF9xbWZbMzIyXSA9IHBfNjRfNjQwX3FtZlszMTldOworICBzYnJfcW1mXzY0XzY0MF9xbWZbMzIzXSA9IHBfNjRfNjQwX3FtZls0NDddOworICBzYnJfcW1mXzY0XzY0MF9xbWZbMzI0XSA9IHBfNjRfNjQwX3FtZls1NzVdOworCisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTldID0gcF82NF82NDBfcW1mWzY0XTsKKyAgc2JyX3FtZl82NF82NDBfcW1mWzMxOF0gPSBwXzY0XzY0MF9xbWZbMTkyXTsKKyAgc2JyX3FtZl82NF82NDBfcW1mWzMxN10gPSBwXzY0XzY0MF9xbWZbMzIwXTsKKyAgc2JyX3FtZl82NF82NDBfcW1mWzMxNl0gPSBwXzY0XzY0MF9xbWZbNDQ4XTsKKyAgc2JyX3FtZl82NF82NDBfcW1mWzMxNV0gPSBwXzY0XzY0MF9xbWZbNTc2XTsKKworICBzYnJfcW1mXzY0XzY0MF9xbWZbMzE0XSA9IHBfNjRfNjQwX3FtZls2NV07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTNdID0gcF82NF82NDBfcW1mWzE5M107CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTJdID0gcF82NF82NDBfcW1mWzMyMV07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTFdID0gcF82NF82NDBfcW1mWzQ0OV07CisgIHNicl9xbWZfNjRfNjQwX3FtZlszMTBdID0gcF82NF82NDBfcW1mWzU3N107CisgIC4KKyAgLgorICAuCisgIHNicl9xbWZfNjRbOV0gPSBwXzY0XzY0MF9xbWZbMTI2XQorICBzYnJfcW1mXzY0WzhdID0gcF82NF82NDBfcW1mWzI1NF07CisgIHNicl9xbWZfNjRbN10gPSBwXzY0XzY0MF9xbWZbMzgyXTsKKyAgc2JyX3FtZl82NFs2XSA9IHBfNjRfNjQwX3FtZls1MTBdOworICBzYnJfcW1mXzY0WzVdID0gcF82NF82NDBfcW1mWzYzOF07CisKKyAgc2JyX3FtZl82NFs0XSA9IHBfNjRfNjQwX3FtZlsxMjddCisgIHNicl9xbWZfNjRbM10gPSBwXzY0XzY0MF9xbWZbMjU1XTsKKyAgc2JyX3FtZl82NFsyXSA9IHBfNjRfNjQwX3FtZlszODNdOworICBzYnJfcW1mXzY0WzFdID0gcF82NF82NDBfcW1mWzUxMV07CisgIHNicl9xbWZfNjRbMF0gPSBwXzY0XzY0MF9xbWZbNjM5XTsKKworICBNYXggc3VtIG9mIGFsbCBGSVIgZmlsdGVyIGFic29sdXRlIGNvZWZmaWNpZW50cyBpczogMHg3RkY1QjIwMQorICB0aHVzLCB0aGUgZmlsdGVyIG91dHB1dCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc2NhbGVkLgorCisgIFxzaG93aW5pdGlhbGl6ZXIKKyovCisvL0B7CisjaWYgUU1GX05PX1BPTFk9PTUKK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorUkFNX0FMSUdOCitjb25zdCBGSVhQX1BGVCBxbWZfNjRbUU1GNjQwX1BGVF9UQUJMRV9TSVpFK1FNRl9OT19QT0xZXSA9Cit7CisgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweGQxYzU4YWNlKSwgUUZDKDB4ZmU0ZDFiZTMpLAorICBRRkMoMHhmZmVkZTUwZSksIFFGQygweDAxZDc4YmZjKSwgUUZDKDB4MmZhYTIyMWMpLCBRRkMoMHhkMzMzN2IzZSksIFFGQygweGZlNzBiOGQxKSwKKyAgUUZDKDB4ZmZlZDk3OGEpLCBRRkMoMHgwMWZkM2JhMCksIFFGQygweDMxMWFmM2E0KSwgUUZDKDB4ZDQ5ZmQ1NWYpLCBRRkMoMHhmZTkzM2RjMCksCisgIFFGQygweGZmZWZjOWI5KSwgUUZDKDB4MDIyNDRhMjQpLCBRRkMoMHgzMjhjYzZmMCksIFFGQygweGQ2MGE0NmU2KSwgUUZDKDB4ZmViNDhkMGQpLAorICBRRkMoMHhmZmYwMDY1ZCksIFFGQygweDAyNGJmN2ExKSwgUUZDKDB4MzNmZjY3MGUpLCBRRkMoMHhkNzcyMmYwNCksIFFGQygweGZlZDRiZWMzKSwKKyAgUUZDKDB4ZmZlZmY2Y2EpLCBRRkMoMHgwMjc0YmE0MyksIFFGQygweDM1NzJlYzcwKSwgUUZDKDB4ZDhkN2YyMjApLCBRRkMoMHhmZWYzZjZhYiksCisgIFFGQygweGZmZWY3YjhiKSwgUUZDKDB4MDI5ZTM1YjQpLCBRRkMoMHgzNmU2OTY5MSksIFFGQygweGRhM2IxNzZhKSwgUUZDKDB4ZmYxMjBkNzApLAorICBRRkMoMHhmZmVlZGZhNCksIFFGQygweDAyYzg5OTAxKSwgUUZDKDB4Mzg1YTQ5YzMpLCBRRkMoMHhkYjliNWIxMiksIFFGQygweGZmMmVmNzI1KSwKKyAgUUZDKDB4ZmZlZTE2NTApLCBRRkMoMHgwMmYzZTQ4ZCksIFFGQygweDM5Y2UwNDc3KSwgUUZDKDB4ZGNmODk4ZmIpLCBRRkMoMHhmZjRhYWJjOCksCisgIFFGQygweGZmZWQ2NTFkKSwgUUZDKDB4MDMyMDExMTYpLCBRRkMoMHgzYjQxNTExNSksIFFGQygweGRlNTI5MDg3KSwgUUZDKDB4ZmY2NTQyZDEpLAorICBRRkMoMHhmZmVjYzMxYiksIFFGQygweDAzNGQwMWYxKSwgUUZDKDB4M2NiNDEyMTkpLCBRRkMoMHhkZmE5M2FiNSksIFFGQygweGZmN2VlM2YxKSwKKyAgUUZDKDB4ZmZlYmU3N2IpLCBRRkMoMHgwMzdhZDQzOCksIFFGQygweDNlMjViMTdlKSwgUUZDKDB4ZTBmYzQyMWUpLCBRRkMoMHhmZjk3NWMwMSksCisgIFFGQygweGZmZWI1MGIyKSwgUUZDKDB4MDNhOTY2YmIpLCBRRkMoMHgzZjk2MmZiOCksIFFGQygweGUyNGI4ZjY3KSwgUUZDKDB4ZmZhZWE1ZDYpLAorICBRRkMoMHhmZmVhOTE5MiksIFFGQygweDAzZDhhZmU2KSwgUUZDKDB4NDEwNThiYzUpLCBRRkMoMHhlMzk2YTQ1ZCksIFFGQygweGZmYzRlMzY1KSwKKyAgUUZDKDB4ZmZlOWNhNzYpLCBRRkMoMHgwNDA4M2ZlYyksIFFGQygweDQyNzJhMzg1KSwgUUZDKDB4ZTRkZTBjYjApLCBRRkMoMHhmZmRhMTdmMiksCisgIFFGQygweGZmZTk0MGY0KSwgUUZDKDB4MDQzODg5YzYpLCBRRkMoMHg0M2RlNjIwYSksIFFGQygweGU2MjBjNDc2KSwgUUZDKDB4ZmZlZTE4M2IpLAorICBRRkMoMHhmZmU4OGJhOCksIFFGQygweDA0Njk0MTAxKSwgUUZDKDB4NDU0N2RhZWEpLCBRRkMoMHhlNzVmOGJiOCksIFFGQygweDAwMDBlNzkwKSwKKyAgUUZDKDB4ZmZlODNhMDcpLCBRRkMoMHgwNDlhYTgyZiksIFFGQygweDQ2YWVhODU2KSwgUUZDKDB4ZTg5OTcxYjcpLCBRRkMoMHgwMDEzMWM3NSksCisgIFFGQygweGZmZTc5ZTE2KSwgUUZDKDB4MDRjYzJmY2YpLCBRRkMoMHg0ODEyZjg0OCksIFFGQygweGU5Y2VhODRhKSwgUUZDKDB4MDAyM2I5ODkpLAorICBRRkMoMHhmZmU3NzQ2ZSksIFFGQygweDA0ZmUyMGJlKSwgUUZDKDB4NDk3M2ZlZjEpLCBRRkMoMHhlYWZlZTdmMSksIFFGQygweDAwMzNiOTI3KSwKKyAgUUZDKDB4ZmZlNmQ0NjYpLCBRRkMoMHgwNTMwM2Y4OCksIFFGQygweDRhZDIzN2EyKSwgUUZDKDB4ZWMyYTNmNjApLCBRRkMoMHgwMDQyNmYzNiksCisgIFFGQygweGZmZTZhZmVkKSwgUUZDKDB4MDU2MjYyMDkpLCBRRkMoMHg0YzJjYTNkZiksIFFGQygweGVkNTBhMzFkKSwgUUZDKDB4MDA1MDRmNDEpLAorICBRRkMoMHhmZmU2NTQxNiksIFFGQygweDA1OTUwMTIyKSwgUUZDKDB4NGQ4Mzk3NmMpLCBRRkMoMHhlZTcxYjJmZSksIFFGQygweDAwNWQzNmRmKSwKKyAgUUZDKDB4ZmZlNjgxYzYpLCBRRkMoMHgwNWM3NmZlZCksIFFGQygweDRlZDYyYmUyKSwgUUZDKDB4ZWY4ZDRkN2IpLCBRRkMoMHgwMDY5MjhhMCksCisgIFFGQygweGZmZTY2ZGQwKSwgUUZDKDB4MDVmOWMwNTEpLCBRRkMoMHg1MDI0ZDcwZSksIFFGQygweGYwYTM5NTlmKSwgUUZDKDB4MDA3NDAwYjgpLAorICBRRkMoMHhmZmU2NmZhYiksIFFGQygweDA2MmJmNWVjKSwgUUZDKDB4NTE2ZWVmYjgpLCBRRkMoMHhmMWI0NjFhYiksIFFGQygweDAwN2UwMzkzKSwKKyAgUUZDKDB4ZmZlNjk0MjMpLCBRRkMoMHgwNjVkZDU2YSksIFFGQygweDUyYjQ0OWRkKSwgUUZDKDB4ZjJiZjZlYTQpLCBRRkMoMHgwMDg3MmM2MyksCisgIFFGQygweGZmZTZmZWQ0KSwgUUZDKDB4MDY4ZjhiNDQpLCBRRkMoMHg1M2Y0OTVhOSksIFFGQygweGYzYzRlODg3KSwgUUZDKDB4MDA4Zjg3YWEpLAorICBRRkMoMHhmZmU3NTM2MSksIFFGQygweDA2YzBmMGMwKSwgUUZDKDB4NTUyZjhmZjYpLCBRRkMoMHhmNGM0NzNjNiksIFFGQygweDAwOTZkY2MyKSwKKyAgUUZDKDB4ZmZlODA0MTQpLCBRRkMoMHgwNmYxODI1ZCksIFFGQygweDU2NjU0YmRjKSwgUUZDKDB4ZjViZTBmYTkpLCBRRkMoMHgwMDlkYTUyNiksCisgIFFGQygweGZmZTg1YjRhKSwgUUZDKDB4MDcyMWJmMjIpLCBRRkMoMHg1Nzk1MDVmNCksIFFGQygweGY2YjFmM2MzKSwgUUZDKDB4MDBhMzUwOGYpLAorICBRRkMoMHhmZmU5NTRkMCksIFFGQygweDA3NTExMmEyKSwgUUZDKDB4NThiZWZhY2MpLCBRRkMoMHhmNzlmYTEzYSksIFFGQygweDAwYTg1ZTk0KSwKKyAgUUZDKDB4ZmZlYTM1M2EpLCBRRkMoMHgwNzdmZWRiMyksIFFGQygweDU5ZTJmNjllKSwgUUZDKDB4Zjg4NzUwN2MpLCBRRkMoMHgwMGFjYmQyZiksCisgIFFGQygweGZmZWIzODQ5KSwgUUZDKDB4MDdhZDhjMjYpLCBRRkMoMHg1YjAwMWRiNyksIFFGQygweGY5NjkxNmY1KSwgUUZDKDB4MDBiMDZiNjgpLAorICBRRkMoMHhmZmVjODQwOSksIFFGQygweDA3ZGEyYjdmKSwgUUZDKDB4NWMxNmQwYWUpLCBRRkMoMHhmYTQ0YTA2OSksIFFGQygweDAwYjM2YWNkKSwKKyAgUUZDKDB4ZmZlZGM0MTgpLCBRRkMoMHgwODA2MTY3MSksIFFGQygweDVkMjZiZTliKSwgUUZDKDB4ZmIxOWI3YmQpLCBRRkMoMHgwMGI1OGM4ZCksCisgIFFGQygweGZmZWYyMzk1KSwgUUZDKDB4MDgzMDM4OTcpLCBRRkMoMHg1ZTJmNjM2NiksIFFGQygweGZiZThmNWJkKSwgUUZDKDB4MDBiNzNhYjApLAorICBRRkMoMHhmZmYwZTdlZiksIFFGQygweDA4NTk0ODg3KSwgUUZDKDB4NWYzMGZmNWUpLCBRRkMoMHhmY2IxZDc0MCksIFFGQygweDAwYjg1ZjcwKSwKKyAgUUZDKDB4ZmZmMjk0YzMpLCBRRkMoMHgwODgwZmZkZCksIFFGQygweDYwMmIwYzdlKSwgUUZDKDB4ZmQ3NDc1ZDgpLCBRRkMoMHgwMGI4YzZiMCksCisgIFFGQygweGZmZjQ4NzAwKSwgUUZDKDB4MDhhNzVkYTQpLCBRRkMoMHg2MTFkNThhMiksIFFGQygweGZlMzEwNjU3KSwgUUZDKDB4MDBiOGZlMGQpLAorICBRRkMoMHhmZmY2ODFkNiksIFFGQygweDA4Y2I0ZTIzKSwgUUZDKDB4NjIwN2YyMWYpLCBRRkMoMHhmZWU3MjNjNiksIFFGQygweDAwYjgzOTRiKSwKKyAgUUZDKDB4ZmZmOTFmYzkpLCBRRkMoMHgwOGVkZmVhYSksIFFGQygweDYyZWE2NDczKSwgUUZDKDB4ZmY5NmRiOGYpLCBRRkMoMHgwMGI3NGMzNyksCisgIFFGQygweGZmZmI0MmIwKSwgUUZDKDB4MDkwZWMxZmMpLCBRRkMoMHg2M2M0NTI0MyksIFFGQygweDAwNDBjNDk3KSwgUUZDKDB4MDBiNWM4NjcpLAorICBRRkMoMHhmZmZkZmEyNCksIFFGQygweDA5MmQ3OTcwKSwgUUZDKDB4NjQ5NjQwNjIpLCBRRkMoMHgwMGU0MmZhMiksIFFGQygweDAwYjNkMTVjKSwKKyAgUUZDKDB4MDAwMDcxMzQpLCBRRkMoMHgwOTQ5ZWFhYyksIFFGQygweDY1NWY2M2YxKSwgUUZDKDB4MDE4MTZlMDYpLCBRRkMoMHgwMGIxOTc4ZCksCisgIFFGQygweDAwMDM5NjA5KSwgUUZDKDB4MDk2M2VkNDYpLCBRRkMoMHg2NjFmZDZiNyksIFFGQygweDAyMTg2YTkyKSwgUUZDKDB4MDBhZjM3NGMpLAorICBRRkMoMHgwMDA2YjFjZiksIFFGQygweDA5N2MxZWU4KSwgUUZDKDB4NjZkNzY3MjQpLCBRRkMoMHgwMmE5OTA5NyksIFFGQygweDAwYWJlNzllKSwKKyAgUUZDKDB4MDAwOWFhM2YpLCBRRkMoMHgwOTkxNDBhNyksIFFGQygweDY3ODVjMjRjKSwgUUZDKDB4MDMzNDM1MzQpLCBRRkMoMHgwMGE4NzM5ZCksCisgIFFGQygweDAwMGQzMWI1KSwgUUZDKDB4MDlhM2UxNjMpLCBRRkMoMHg2ODJiMzlhMyksIFFGQygweDAzYjhmOGRjKSwgUUZDKDB4MDBhNTIwYmIpLAorICBRRkMoMHgwMDEwYmM2MyksIFFGQygweDA5YjNkNzdmKSwgUUZDKDB4NjhjNzI2OWIpLCBRRkMoMHgwNDM3ZmIwYSksIFFGQygweDAwYTEwMzljKSwKKyAgUUZDKDB4MDAxNDcxZjgpLCBRRkMoMHgwOWMwZTU5ZiksIFFGQygweDY5NTk3MDljKSwgUUZDKDB4MDRiMGFkY2IpLCBRRkMoMHgwMDlkMTBiZiksCisgIFFGQygweDAwMTg3MDNmKSwgUUZDKDB4MDljYWI5ZjIpLCBRRkMoMHg2OWUyOTc4MyksIFFGQygweDA1MjM3ZjlkKSwgUUZDKDB4MDA5OGI4NTUpLAorICBRRkMoMHgwMDFjMzU0OSksIFFGQygweDA5ZDE5Y2E5KSwgUUZDKDB4NmE2MTljNWUpLCBRRkMoMHgwNTkwYTY3ZCksIFFGQygweDAwOTQyNGM2KSwKKyAgUUZDKDB4MDAyMDY0ZjgpLCBRRkMoMHgwOWQ1MjcwOSksIFFGQygweDZhZDczZThkKSwgUUZDKDB4MDVmN2ZiOTApLCBRRkMoMHgwMDhmNGJmZCksCisgIFFGQygweDAwMjRkZDUwKSwgUUZDKDB4MDlkNTU2MGIpLCBRRkMoMHg2YjQyYTg2MyksIFFGQygweDA2NTkzOTEyKSwgUUZDKDB4MDA4YTdkZDcpLAorICBRRkMoMHgwMDI5MzcxOCksIFFGQygweDA5ZDFmYTIzKSwgUUZDKDB4NmJhNDYyOWUpLCBRRkMoMHgwNmI1NTljMyksIFFGQygweDAwODVjMjE3KSwKKyAgUUZDKDB4MDAyZDhlNDIpLCBRRkMoMHgwOWNhZWIwZiksIFFGQygweDZiZmJkZDk3KSwgUUZDKDB4MDcwYmJmNTgpLCBRRkMoMHgwMDgwNzk5NCksCisgIFFGQygweDAwMzI5YWI2KSwgUUZDKDB4MDljMDE4Y2UpLCBRRkMoMHg2YzQ5MjIxNiksIFFGQygweDA3NWNhOTBjKSwgUUZDKDB4MDA3YjM4NzUpLAorICBRRkMoMHgwMDM3NDVmOSksIFFGQygweDA5YjE4YTFkKSwgUUZDKDB4NmM4YzRjNzkpLCBRRkMoMHgwN2E4MTI3ZCksIFFGQygweDAwNzVmZGVkKSwKKyAgUUZDKDB4MDAzYzFmYTQpLCBRRkMoMHgwOTllYzNkYyksIFFGQygweDZjYzU5YmFhKSwgUUZDKDB4MDdlZTUwN2MpLCBRRkMoMHgwMDcwYzhhNSksCisgIFFGQygweDAwNDEwM2Y1KSwgUUZDKDB4MDk4ODFkYzUpLCBRRkMoMHg2Y2Y0MDczZCksIFFGQygweDA4MmY1NTJlKSwgUUZDKDB4MDA2YjQ3ZmEpLAorICBRRkMoMHgwMDQ2NTM0OCksIFFGQygweDA5NmQwZTIxKSwgUUZDKDB4NmQxODUyMGQpLCBRRkMoMHgwODZiMWVlYyksIFFGQygweDAwNjVmZGU1KSwKKyAgUUZDKDB4MDA0YjZjNDYpLCBRRkMoMHgwOTRkN2VjMiksIFFGQygweDZkMzI3MzBlKSwgUUZDKDB4MDhhMjQ4OTkpLCBRRkMoMHgwMDYwOTBjNCksCisgIFFGQygweDAwNTBiMTc3KSwgUUZDKDB4MDkyOTllYWQpLCBRRkMoMHg2ZDQxZDk2MyksIFFGQygweDA4ZDNlNDFiKSwgUUZDKDB4MDA1YjUzNzEpLAorICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweDA5MDE1NjUxKSwgUUZDKDB4NmQ0NzRlMWQpLCBRRkMoMHgwOTAxNTY1MSksIFFGQygweDAwNTVkYmExKSwKKyAgUUZDKDB4ZmU0ZDFiZTMpLCBRRkMoMHhkMWM1OGFjZSksIFFGQygweDJlM2E3NTMyKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgwMDAwMDAwMCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zX2Rvd25zYW1wMzJbXSA9Cit7CisgIFFUQygweDdmZDg4NzhlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3YzI5ZmJlZSksIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NWVkNzdjOGEpLAorICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgxMmM4MTA2ZiksIFFUQygweDA2NDdkOTdjKSwKKyAgUVRDKDB4ZjliODI2ODQpLCBRVEMoMHhlZDM3ZWY5MSksIFFUQygweGUwZTYwNjg1KSwgUVRDKDB4ZDRlMGNiMTUpLCBRVEMoMHhjOTQ1ZGZlYyksIFFUQygweGJlMzFlMTliKSwgUVRDKDB4YjNjMDIwMGMpLCBRVEMoMHhhYTBhNWIyZSksCisgIFFUQygweGExMjg4Mzc2KSwgUVRDKDB4OTkzMDdlZTApLCBRVEMoMHg5MjM1ZjJlYyksIFFUQygweDhjNGExNDJmKSwgUVRDKDB4ODc3YjdiZWMpLCBRVEMoMHg4M2Q2MDQxMiksIFFUQygweDgxNjJhYTA0KSwgUVRDKDB4ODAyNzc4NzIpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3Npbl9kb3duc2FtcDMyW10gPQoreworICBRVEMoMHgwNjQ3ZDk3YyksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgyYjFmMzRlYiksIFFUQygweDM2YmEyMDE0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHg0YzNmZGZmNCksIFFUQygweDU1ZjVhNGQyKSwKKyAgUVRDKDB4NWVkNzdjOGEpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDZkY2EwZDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg3ODg0ODQxNCksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3ZmQ4ODc4ZSksCisgIFFUQygweDdmZDg4NzhlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3YzI5ZmJlZSksIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NWVkNzdjOGEpLAorICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgxMmM4MTA2ZiksIFFUQygweDA2NDdkOTdjKSwKK307CisKKyNlbHNlIC8qIFFNRl9OT19QT0xZID09IDUgKi8KKyNlbmRpZiAvKiBRTUZfTk9fUE9MWT09NSAqLworCisKKworCisKKy8qCisgKiBMb3cgRGVsYXkgUU1GIGFrYSBDTERGQgorICovCisKKyNpZiBkZWZpbmVkKFFNRl9DT0VGRl8xNkJJVCkKKyNkZWZpbmUgUVRDRkxMRCh4KSAgRkwyRlhDT05TVF9TR0woeC8oZmxvYXQpKDE8PFFNRl9DTERGQl9QRlRfU0NBTEUpKQorI2RlZmluZSBRVENGTExEVCh4KSAgRkwyRlhDT05TVF9TR0woeCkKKyNlbHNlCisjZGVmaW5lIFFUQ0ZMTEQoeCkgIEZMMkZYQ09OU1RfREJMKHgvKGZsb2F0KSgxPDxRTUZfQ0xERkJfUEZUX1NDQUxFKSkKKyNkZWZpbmUgUVRDRkxMRFQoeCkgIEZMMkZYQ09OU1RfREJMKHgpCisjZW5kaWYKKworCisjaWZuZGVmIExPV19QT1dFUl9TQlJfT05MWQorLyohCisgIFxuYW1lIFFNRi1Ud2lkZGxlCisgIFxicmllZiBRTUYgdHdpZGRsZSBmYWN0b3JzCisKKyAgTD0zMiwgZ2Fpbj0yLjAsIGFuZ2xlID0gMC43NQorKi8KKy8qIHNpbi9jb3MgKGFuZ2xlKSAvIDIgKi8KK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiWzMyXSA9IHsKKyAgUVRDRkxMRFQoLTcuMDcxMDY3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDcwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3M2UtMDEpLAorICBRVENGTExEVCgtNy4wNzEwNjFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDgwZS0wMSksCisgIFFUQ0ZMTERUKC03LjA3MTA1NWUtMDEpLCBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCBRVENGTExEVCg3LjA3MTA1MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwKKyAgUVRDRkxMRFQoLTcuMDcxMDQ5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDg5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MmUtMDEpLAorICBRVENGTExEVCgtNy4wNzEwNDJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk4ZS0wMSksCisgIFFUQ0ZMTERUKC03LjA3MTAzNmUtMDEpLCBRVENGTExEVCg3LjA3MTEwMWUtMDEpLCBRVENGTExEVCg3LjA3MTAzM2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDRlLTAxKSwKKyAgUVRDRkxMRFQoLTcuMDcxMDMwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMWUtMDEpLAorICBRVENGTExEVCgtNy4wNzEwMjRlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTRlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE3ZS0wMSksCit9OworCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMl9jbGRmYlszMl0gPSB7CisgIFFUQ0ZMTERUKDcuMDcxMDY4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjJlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwNzVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1NmUtMDEpLAorICBRVENGTExEVCg3LjA3MTA4MWUtMDEpLCBRVENGTExEVCg3LjA3MTA1M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwODRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDUwZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDg3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDRlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwOTNlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzOGUtMDEpLAorICBRVENGTExEVCg3LjA3MTA5OWUtMDEpLCBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDMxZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMTA2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwOWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMjVlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzExMTJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxOWUtMDEpLAorfTsKKworCisvKiBzaW4vY29zIChhbmdsZSkgLyAxMjggKi8KK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0X2NsZGZiWzY0XSA9IHsKKyAgUVRDRkxMRFQoNy4wNzEwNjhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDY2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3MGUtMDEpLCBRVENGTExEVCg3LjA3MTA2NWUtMDEpLAorICBRVENGTExEVCg3LjA3MTA3MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDYxZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDc1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTdlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwODBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4MWUtMDEpLCBRVENGTExEVCg3LjA3MTA1M2UtMDEpLAorICBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwNTJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDg1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUwZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDg3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODllLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDZlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwOTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MmUtMDEpLCBRVENGTExEVCg3LjA3MTA0MmUtMDEpLAorICBRVENGTExEVCg3LjA3MTA5NWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM4ZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDk4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzVlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzExMDJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDMzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwM2UtMDEpLCBRVENGTExEVCg3LjA3MTAzMWUtMDEpLAorICBRVENGTExEVCg3LjA3MTEwNWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMTA5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjRlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzExMTNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDIyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExNWUtMDEpLCBRVENGTExEVCg3LjA3MTAyMGUtMDEpLAorICBRVENGTExEVCg3LjA3MTExN2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDE2ZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMTIwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMjJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMTNlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzExMjRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDExZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyNmUtMDEpLCBRVENGTExEVCg3LjA3MTAwOWUtMDEpLAorIH07CisgY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRfY2xkZmJbNjRdID0geworICBRVENGTExEVCg3LjA3MTA2N2UtMDEpLCBRVENGTExEVCg3LjA3MTA2OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDcxZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDczZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzVlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwNjBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3OGUtMDEpLAorICBRVENGTExEVCg3LjA3MTA1NmUtMDEpLCBRVENGTExEVCg3LjA3MTA4MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDgyZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDg0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwNDllLTAxKSwgUVRDRkxMRFQoNy4wNzEwODhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MGUtMDEpLAorICBRVENGTExEVCg3LjA3MTA0NWUtMDEpLCBRVENGTExEVCg3LjA3MTA5MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkzZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDQxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDk1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTdlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwMzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDM2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwMGUtMDEpLAorICBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCBRVENGTExEVCg3LjA3MTEwM2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMzJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA1ZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDMwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTA2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyOGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDhlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwMjdlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMmUtMDEpLAorICBRVENGTExEVCg3LjA3MTAyM2UtMDEpLCBRVENGTExEVCg3LjA3MTExNGUtMDEpLCBRVENGTExEVCgtNy4wNzEwMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksCisgIFFUQ0ZMTERUKDcuMDcxMDE5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTE3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMjBlLTAxKSwKKyAgUVRDRkxMRFQoNy4wNzEwMTVlLTAxKSwgUVRDRkxMRFQoNy4wNzExMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDEzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyM2UtMDEpLAorICBRVENGTExEVCg3LjA3MTAxMmUtMDEpLCBRVENGTExEVCg3LjA3MTEyNWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTI3ZS0wMSksCit9OworCisvL0B9CisKKyNlbmRpZiAvKiAjaWZkZWYgTE9XX1BPV0VSX1NCUl9PTkxZICovCisKKworCisvKiEKKyAgXG5hbWUgUU1GCisgIFxicmllZiAgUU1GLVRhYmxlCisgICAgICAgICAgNjQgY2hhbm5lbHMsIE4gPSA2NDAsIG9wdGltaXplZCBieSBQRSAwMTA1MTYKKworICBUaGUgY29lZmZzIGFyZSByZWFycmFuZ2VkIGNvbXBhcmVkIHdpdGggdGhlIHJlZmVyZW5jZSBpbiB0aGUgZm9sbG93aW5nCisgIHdheToKKyAgc2JyX3FtZl82NFswXSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzBdOworICBzYnJfcW1mXzY0WzFdID0gc2JyX3FtZl82NF9yZWZlcmVuY2VbMTI4XTsKKyAgc2JyX3FtZl82NFsyXSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzI1Nl07CisgIHNicl9xbWZfNjRbM10gPSBzYnJfcW1mXzY0X3JlZmVyZW5jZVszODRdOworICBzYnJfcW1mXzY0WzRdID0gc2JyX3FtZl82NF9yZWZlcmVuY2VbNTEyXTsKKworICBzYnJfcW1mXzY0WzVdID0gc2JyX3FtZl82NF9yZWZlcmVuY2VbMV07CisgIHNicl9xbWZfNjRbNl0gPSBzYnJfcW1mXzY0X3JlZmVyZW5jZVsxMjldOworICBzYnJfcW1mXzY0WzddID0gc2JyX3FtZl82NF9yZWZlcmVuY2VbMjU3XTsKKyAgc2JyX3FtZl82NFs4XSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzM4NV07CisgIHNicl9xbWZfNjRbOV0gPSBzYnJfcW1mXzY0X3JlZmVyZW5jZVs1MTNdOworICAuCisgIC4KKyAgLgorICBzYnJfcW1mXzY0WzYzNV0gPSBzYnJfcW1mXzY0X3JlZmVyZW5jZVsxMjddCisgIHNicl9xbWZfNjRbNjM2XSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzI1NV07CisgIHNicl9xbWZfNjRbNjM3XSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzM4M107CisgIHNicl9xbWZfNjRbNjM4XSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzUxMV07CisgIHNicl9xbWZfNjRbNjM5XSA9IHNicl9xbWZfNjRfcmVmZXJlbmNlWzYzOV07CisKKworICBTeW1tZXRyaWMgcHJvcGVydGllcyBvZiBxbWYgY29lZmZzOgorCisgICAgICAgVXNlIHBvaW50IHN5bW1ldHJ5OgorCisgIHNicl9xbWZfNjRfNjQwX3FtZlszMjAuLjYzNF0gPSBwXzY0XzY0MF9xbWZbMzE0Li4wXQorCisgIE1heCBzdW0gb2YgYWxsIEZJUiBmaWx0ZXIgYWJzb2x1dGUgY29lZmZpY2llbnRzIGlzOiAweDdGRjVCMjAxCisgIHRodXMsIHRoZSBmaWx0ZXIgb3V0cHV0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzY2FsZWQuCisKKyAgXHNob3dpbml0aWFsaXplcgorKi8KKy8vQHsKKworTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitSQU1fQUxJR04KK2NvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl82NDBbUU1GNjQwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9Cit7CisgIFFUQ0ZMTEQoNi41NzE3NjBlLTA3KSwgUVRDRkxMRCgtOC4wMTAwNzllLTA2KSwgUVRDRkxMRCgtMS4yNTA3NDNlLTAzKSwgUVRDRkxMRCg4Ljk5NjM3MWUtMDMpLCBRVENGTExEKDUuMTI4NTU3ZS0wMSksCisgIFFUQ0ZMTEQoNC4xMTgzNjBlLTA3KSwgUVRDRkxMRCgtMS40Njk5MzNlLTA1KSwgUVRDRkxMRCgtMS4xOTQ3NDNlLTAzKSwgUVRDRkxMRCg5LjY0MDI5OWUtMDMpLCBRVENGTExEKDUuMjk5NTEwZS0wMSksCisgIFFUQ0ZMTEQoOC4xMDk5NTJlLTA3KSwgUVRDRkxMRCg0Ljg0MDU3OGUtMDYpLCBRVENGTExEKC0xLjE1MTc5NmUtMDMpLCBRVENGTExEKDEuMDMzMTI2ZS0wMiksIFFUQ0ZMTEQoNS40NzA2NTJlLTAxKSwKKyAgUVRDRkxMRCg3LjA5OTYzM2UtMDcpLCBRVENGTExEKDcuMTY3MTAxZS0wNiksIFFUQ0ZMTEQoLTEuMDk5MDAxZS0wMyksIFFUQ0ZMTEQoMS4xMDY5NTllLTAyKSwgUVRDRkxMRCg1LjY0MTUyM2UtMDEpLAorICBRVENGTExEKDYuODM0MjEwZS0wNyksIFFUQ0ZMTEQoMS4wODgzMjVlLTA1KSwgUVRDRkxMRCgtMS4wNDc2NTVlLTAzKSwgUVRDRkxMRCgxLjE4NjIxMWUtMDIpLCBRVENGTExEKDUuODExOTkzZS0wMSksCisgIFFUQ0ZMTEQoNC4yOTI4NjJlLTA3KSwgUVRDRkxMRCgxLjAxMzI2MGUtMDUpLCBRVENGTExEKC05Ljg2MjAyN2UtMDQpLCBRVENGTExEKDEuMjcwNzQ3ZS0wMiksIFFUQ0ZMTEQoNS45ODE4NzdlLTAxKSwKKyAgUVRDRkxMRCgtNS40MjY1OTdlLTA5KSwgUVRDRkxMRCg1Ljg2OTcwN2UtMDYpLCBRVENGTExEKC05LjI5NDY2NWUtMDQpLCBRVENGTExEKDEuMzYxMDcyZS0wMiksIFFUQ0ZMTEQoNi4xNTEwMzFlLTAxKSwKKyAgUVRDRkxMRCg2LjM1NTMwM2UtMDgpLCBRVENGTExEKDEuMTI1MTM1ZS0wNSksIFFUQ0ZMTEQoLTkuNzY3NzA5ZS0wNCksIFFUQ0ZMTEQoMS40NTYyMDllLTAyKSwgUVRDRkxMRCg2LjMxOTI4NGUtMDEpLAorICBRVENGTExEKDUuNDkwNTcwZS0wNyksIFFUQ0ZMTEQoMi4wMTU0NDVlLTA1KSwgUVRDRkxMRCgtMS4wNDA1OThlLTAzKSwgUVRDRkxMRCgxLjU1Nzc1OWUtMDIpLCBRVENGTExEKDYuNDg2NDM4ZS0wMSksCisgIFFUQ0ZMTEQoMS42MjAxNzFlLTA2KSwgUVRDRkxMRCgyLjgwMDQ1NmUtMDUpLCBRVENGTExEKC0xLjE0NjI2OGUtMDMpLCBRVENGTExEKDEuNjY1MTg4ZS0wMiksIFFUQ0ZMTEQoNi42NTIzMDRlLTAxKSwKKyAgUVRDRkxMRCgtNi4wMjUxMTBlLTEwKSwgUVRDRkxMRCg4Ljk3NTk3OGUtMDYpLCBRVENGTExEKC0xLjI5Mjg2NmUtMDMpLCBRVENGTExEKDEuNzc4MjQ5ZS0wMiksIFFUQ0ZMTEQoNi44MTY2NjhlLTAxKSwKKyAgUVRDRkxMRCgtNi4zMjU2NjRlLTEwKSwgUVRDRkxMRCg4LjU2MzgyMGUtMDYpLCBRVENGTExEKC0xLjE5NjYzOGUtMDMpLCBRVENGTExEKDEuODk3NTA2ZS0wMiksIFFUQ0ZMTEQoNi45NzkzMzdlLTAxKSwKKyAgUVRDRkxMRCgtNC4wMTM1MjVlLTA5KSwgUVRDRkxMRCgxLjE2ODg5NWUtMDUpLCBRVENGTExEKC05LjcyNjY5OWUtMDQpLCBRVENGTExEKDIuMDIzNTI1ZS0wMiksIFFUQ0ZMTEQoNy4xNDAwODdlLTAxKSwKKyAgUVRDRkxMRCgtNC4yNDQwOTFlLTA5KSwgUVRDRkxMRCg3LjMwMDU4OWUtMDYpLCBRVENGTExEKC04LjAyOTYyMGUtMDQpLCBRVENGTExEKDIuMTU2MzA1ZS0wMiksIFFUQ0ZMTEQoNy4yOTg3NDZlLTAxKSwKKyAgUVRDRkxMRCgtMS44NDY1NDhlLTA4KSwgUVRDRkxMRCgzLjk2NTM2NGUtMDYpLCBRVENGTExEKC02Ljc1NDkzNmUtMDQpLCBRVENGTExEKDIuMjk2NDcxZS0wMiksIFFUQ0ZMTEQoNy40NTUxMTJlLTAxKSwKKyAgUVRDRkxMRCgtMy44NzA1MzdlLTA5KSwgUVRDRkxMRCgxLjM3NDg5NmUtMDYpLCBRVENGTExEKC01Ljc5MTE0NWUtMDQpLCBRVENGTExEKDIuNDQzNDM0ZS0wMiksIFFUQ0ZMTEQoNy42MDkwNTFlLTAxKSwKKyAgUVRDRkxMRCgtOC44ODM0OTllLTEwKSwgUVRDRkxMRCgzLjc5ODUyMGUtMDcpLCBRVENGTExEKC00LjczMzE0OGUtMDQpLCBRVENGTExEKDIuNTk3OTU3ZS0wMiksIFFUQ0ZMTEQoNy43NjAzODZlLTAxKSwKKyAgUVRDRkxMRCg1LjMwMzUyOGUtMDgpLCBRVENGTExEKDQuNDY5NzI5ZS0wNiksIFFUQ0ZMTEQoLTIuOTk4NzQwZS0wNCksIFFUQ0ZMTEQoMi43NjAwOTFlLTAyKSwgUVRDRkxMRCg3LjkwODk5NWUtMDEpLAorICBRVENGTExEKDcuMzkxOTc0ZS0wOCksIFFUQ0ZMTEQoMi40NjE4NzdlLTA1KSwgUVRDRkxMRCg3Ljg4MjYyMGUtMDUpLCBRVENGTExEKDIuOTMxNTI2ZS0wMiksIFFUQ0ZMTEQoOC4wNTQ3MDFlLTAxKSwKKyAgUVRDRkxMRCgxLjcyMzIxN2UtMDkpLCBRVENGTExEKDQuMDA1MjY5ZS0wNSksIFFUQ0ZMTEQoNC43MDgwMTBlLTA0KSwgUVRDRkxMRCgzLjExMDg2MWUtMDIpLCBRVENGTExEKDguMTk3Mzg3ZS0wMSksCisgIFFUQ0ZMTEQoMi40NDMwODVlLTA3KSwgUVRDRkxMRCg1LjI3Mjk4MmUtMDUpLCBRVENGTExEKDguMDg5ODEyZS0wNCksIFFUQ0ZMTEQoMy4yOTgxNTFlLTAyKSwgUVRDRkxMRCg4LjMzNjg2NGUtMDEpLAorICBRVENGTExEKDEuMzg3NTY3ZS0wOCksIFFUQ0ZMTEQoNC45MzkzOTJlLTA1KSwgUVRDRkxMRCgxLjEyNzE0MmUtMDMpLCBRVENGTExEKDMuNDkzMzAwZS0wMiksIFFUQ0ZMTEQoOC40NzI5ODdlLTAxKSwKKyAgUVRDRkxMRCgtNS42OTA1MzFlLTA2KSwgUVRDRkxMRCgtNC4yNTY0NDJlLTA1KSwgUVRDRkxMRCgxLjQxNzM2N2UtMDMpLCBRVENGTExEKDMuNjk2MzQzZS0wMiksIFFUQ0ZMTEQoOC42MDU1NDNlLTAxKSwKKyAgUVRDRkxMRCgzLjYyOTA2N2UtMDYpLCBRVENGTExEKDYuNTgyMzI4ZS0wNSksIFFUQ0ZMTEQoMS43MjUwMzBlLTAzKSwgUVRDRkxMRCgzLjkwNzEzOGUtMDIpLCBRVENGTExEKDguNzM0MzY3ZS0wMSksCisgIFFUQ0ZMTEQoLTUuMzkzNTU2ZS0wOCksIFFUQ0ZMTEQoNi40ODE5MjFlLTA1KSwgUVRDRkxMRCgxLjk0ODA2OWUtMDMpLCBRVENGTExEKDQuMTI1NTcwZS0wMiksIFFUQ0ZMTEQoOC44NTkyMzJlLTAxKSwKKyAgUVRDRkxMRCgxLjM0OTk0NGUtMDcpLCBRVENGTExEKDMuMzY3OTk4ZS0wNSksIFFUQ0ZMTEQoMi4wMzM0NjVlLTAzKSwgUVRDRkxMRCg0LjM1NTU2OGUtMDIpLCBRVENGTExEKDguOTc5OTU5ZS0wMSksCisgIFFUQ0ZMTEQoNy4zMjY2MTFlLTA5KSwgUVRDRkxMRCg0LjY5NDI1MmUtMDUpLCBRVENGTExEKDIuMjM5MTQzZS0wMyksIFFUQ0ZMTEQoNC41OTkwNjhlLTAyKSwgUVRDRkxMRCg5LjA5NjMxMWUtMDEpLAorICBRVENGTExEKDIuMzk5Njk2ZS0wNyksIFFUQ0ZMTEQoNi45MDQ0MTVlLTA1KSwgUVRDRkxMRCgyLjQ3MDQ1NmUtMDMpLCBRVENGTExEKDQuODQ5Mjg1ZS0wMiksIFFUQ0ZMTEQoOS4yMDgxOTVlLTAxKSwKKyAgUVRDRkxMRCgzLjMzMDk4MmUtMDcpLCBRVENGTExEKDUuNjQzMTAzZS0wNSksIFFUQ0ZMTEQoMi42MzA0NzJlLTAzKSwgUVRDRkxMRCg1LjEwNTYyMWUtMDIpLCBRVENGTExEKDkuMzE1NDQyZS0wMSksCisgIFFUQ0ZMTEQoNC43Njc3OTRlLTA3KSwgUVRDRkxMRCg3LjA5NTg4N2UtMDUpLCBRVENGTExEKDIuNzAzMDE5ZS0wMyksIFFUQ0ZMTEQoNS4zNjgzMTNlLTAyKSwgUVRDRkxMRCg5LjQxNzk3NmUtMDEpLAorICBRVENGTExEKDMuNDI4NjYxZS0wNyksIFFUQ0ZMTEQoNy44NzI1OTNlLTA1KSwgUVRDRkxMRCgyLjcyOTEzN2UtMDMpLCBRVENGTExEKDUuNjM3MjE5ZS0wMiksIFFUQ0ZMTEQoOS41MTU2NzVlLTAxKSwKKyAgUVRDRkxMRCg4LjY3Njg0OGUtMDYpLCBRVENGTExEKDIuNjY2NDQ1ZS0wNCksIFFUQ0ZMTEQoMi43MTk3NDllLTAzKSwgUVRDRkxMRCg1LjkxMTM2M2UtMDIpLCBRVENGTExEKDkuNjA4NTIwZS0wMSksCisgIFFUQ0ZMTEQoMi43MjIyOTZlLTA1KSwgUVRDRkxMRCg1LjgyMjIwMWUtMDQpLCBRVENGTExEKDIuNTMwOTA3ZS0wMyksIFFUQ0ZMTEQoNi4xOTI2OTNlLTAyKSwgUVRDRkxMRCg5LjY5NjQyNmUtMDEpLAorICBRVENGTExEKDMuNTc1NjUxZS0wNyksIFFUQ0ZMTEQoNy44NzAzNTVlLTA1KSwgUVRDRkxMRCgyLjIyNTUyNGUtMDMpLCBRVENGTExEKDYuNDgwNDQ5ZS0wMiksIFFUQ0ZMTEQoOS43Nzk0MDVlLTAxKSwKKyAgUVRDRkxMRCg2LjI5MzAwMmUtMDcpLCBRVENGTExEKDcuMjQ1MDk2ZS0wNSksIFFUQ0ZMTEQoMS44OTE5NzJlLTAzKSwgUVRDRkxMRCg2Ljc3MTY3NWUtMDIpLCBRVENGTExEKDkuODU3Mzg4ZS0wMSksCisgIFFUQ0ZMTEQoMS4wNzAyNDNlLTA2KSwgUVRDRkxMRCg3LjE5NDE1MWUtMDUpLCBRVENGTExEKDEuNTU3MTEyZS0wMyksIFFUQ0ZMTEQoNy4wNjQ5NDhlLTAyKSwgUVRDRkxMRCg5LjkzMDM4MGUtMDEpLAorICBRVENGTExEKC0zLjIyNTkxM2UtMDcpLCBRVENGTExEKC03LjY3OTk1NWUtMDUpLCBRVENGTExEKDEuMTk0NzMxZS0wMyksIFFUQ0ZMTEQoNy4zNjA1NTllLTAyKSwgUVRDRkxMRCg5Ljk5ODI4NmUtMDEpLAorICBRVENGTExEKC05LjU5NzUxNmUtMDkpLCBRVENGTExEKC02LjA5MzM3M2UtMDUpLCBRVENGTExEKDYuNDE1NDAyZS0wNCksIFFUQ0ZMTEQoNy42NTc2NTBlLTAyKSwgUVRDRkxMRCgxLjAwNjEwOWUrMDApLAorICBRVENGTExEKC04LjkwODA0MWUtMDgpLCBRVENGTExEKC0xLjcyMTM0N2UtMDUpLCBRVENGTExEKDEuMDkyNTI2ZS0wNCksIFFUQ0ZMTEQoNy45NTU1NzFlLTAyKSwgUVRDRkxMRCgxLjAxMTg2OGUrMDApLAorICBRVENGTExEKC0yLjI4NTU2M2UtMDUpLCBRVENGTExEKC04Ljg4MjMwNWUtMDUpLCBRVENGTExEKDIuOTM0ODc2ZS0wNCksIFFUQ0ZMTEQoOC4yNTE5NjJlLTAyKSwgUVRDRkxMRCgxLjAxNzEwMGUrMDApLAorICBRVENGTExEKDEuMDEzNTc1ZS0wNSksIFFUQ0ZMTEQoNi40MTg2NThlLTA1KSwgUVRDRkxMRCg1LjcyMTIyM2UtMDQpLCBRVENGTExEKDguNTQ3NzE2ZS0wMiksIFFUQ0ZMTEQoMS4wMjE3OTllKzAwKSwKKyAgUVRDRkxMRCgtMS43MDY5NDFlLTA1KSwgUVRDRkxMRCgxLjc2OTI2MmUtMDQpLCBRVENGTExEKDYuOTc2NTYxZS0wNCksIFFUQ0ZMTEQoOC44NDE4MTNlLTAyKSwgUVRDRkxMRCgxLjAyNTk2N2UrMDApLAorICBRVENGTExEKDEuMzU2NzI4ZS0wNiksIFFUQ0ZMTEQoMi4yMDYzNDFlLTA1KSwgUVRDRkxMRCg3LjM3NjEwMWUtMDQpLCBRVENGTExEKDkuMTMzNTkxZS0wMiksIFFUQ0ZMTEQoMS4wMjk2MDFlKzAwKSwKKyAgUVRDRkxMRCgtMS4zOTg5MTNlLTA4KSwgUVRDRkxMRCgtNi41Mzg4NzllLTA2KSwgUVRDRkxMRCg3LjE1NDEyNGUtMDQpLCBRVENGTExEKDkuNDIxNjI0ZS0wMiksIFFUQ0ZMTEQoMS4wMzI3MTNlKzAwKSwKKyAgUVRDRkxMRCgzLjU1Mjk5MmUtMDgpLCBRVENGTExEKC0xLjA1MjcwN2UtMDUpLCBRVENGTExEKDcuMTM5OTIwZS0wNCksIFFUQ0ZMTEQoOS43MDUyNDBlLTAyKSwgUVRDRkxMRCgxLjAzNTMxMmUrMDApLAorICBRVENGTExEKDQuMjExMTc3ZS0wNyksIFFUQ0ZMTEQoLTkuMDc1NDMxZS0wNiksIFFUQ0ZMTEQoNi45NDQxMjNlLTA0KSwgUVRDRkxMRCg5Ljk4Mjk1OGUtMDIpLCBRVENGTExEKDEuMDM3NDIyZSswMCksCisgIFFUQ0ZMTEQoNS40MzM3MTllLTA3KSwgUVRDRkxMRCgtMS43NDgyODVlLTA1KSwgUVRDRkxMRCg2Ljc2NjMyMGUtMDQpLCBRVENGTExEKDEuMDI1Mzk4ZS0wMSksIFFUQ0ZMTEQoMS4wMzkwNjJlKzAwKSwKKyAgUVRDRkxMRCg4LjIyNjYwMGUtMDgpLCBRVENGTExEKC0zLjQ5ODI4NmUtMDUpLCBRVENGTExEKDYuODg3Nzg0ZS0wNCksIFFUQ0ZMTEQoMS4wNTE2NDJlLTAxKSwgUVRDRkxMRCgxLjA0MDI2MmUrMDApLAorICBRVENGTExEKDEuMjcyNzA1ZS0wNyksIFFUQ0ZMTEQoLTQuNDg5NDkxZS0wNSksIFFUQ0ZMTEQoNi42NzMyNTBlLTA0KSwgUVRDRkxMRCgxLjA3Njk3MmUtMDEpLCBRVENGTExEKDEuMDQxMDQzZSswMCksCisgIFFUQ0ZMTEQoMi41NDI1OThlLTA3KSwgUVRDRkxMRCgtNS40NDk4MTZlLTA1KSwgUVRDRkxMRCg1Ljk3MDY5N2UtMDQpLCBRVENGTExEKDEuMTAxMjE2ZS0wMSksIFFUQ0ZMTEQoMS4wNDE0MzRlKzAwKSwKKyAgUVRDRkxMRCg2LjMyMjc3MGUtMDcpLCBRVENGTExEKC01Ljg3NDE5OWUtMDUpLCBRVENGTExEKDQuNzQ5OTMxZS0wNCksIFFUQ0ZMTEQoMS4xMjQyOTZlLTAxKSwgUVRDRkxMRCgxLjA0MTQ0M2UrMDApLAorICBRVENGTExEKDIuODAxODgyZS0wOCksIFFUQ0ZMTEQoLTcuOTM0NTEwZS0wNSksIFFUQ0ZMTEQoMy4xODkzMzZlLTA0KSwgUVRDRkxMRCgxLjE0NjA0MmUtMDEpLCBRVENGTExEKDEuMDQxMDg3ZSswMCksCisgIFFUQ0ZMTEQoNS44OTE5MDRlLTA3KSwgUVRDRkxMRCgtOC4wMzkyMzJlLTA1KSwgUVRDRkxMRCgxLjIxODIyNmUtMDQpLCBRVENGTExEKDEuMTY2Mzk5ZS0wMSksIFFUQ0ZMTEQoMS4wNDAzNTBlKzAwKSwKKyAgUVRDRkxMRCg3LjMwMTk1N2UtMDcpLCBRVENGTExEKC05LjkwNzYzMWUtMDUpLCBRVENGTExEKC0xLjMyNDI5MmUtMDQpLCBRVENGTExEKDEuMTg1MjQzZS0wMSksIFFUQ0ZMTEQoMS4wMzkyMjhlKzAwKSwKKyAgUVRDRkxMRCgtNC41MTg2MDNlLTA2KSwgUVRDRkxMRCgtMi4yMTcwMjVlLTA0KSwgUVRDRkxMRCgtNC4yNjg1NzVlLTA0KSwgUVRDRkxMRCgxLjIwMjU0NmUtMDEpLCBRVENGTExEKDEuMDM3NjgzZSswMCksCisgIFFUQ0ZMTEQoLTMuNTYxNTg1ZS0wNiksIFFUQ0ZMTEQoLTIuNDE1MTY2ZS0wNCksIFFUQ0ZMTEQoLTcuODA0NTQ2ZS0wNCksIFFUQ0ZMTEQoMS4yMTgxODRlLTAxKSwgUVRDRkxMRCgxLjAzNTY5NGUrMDApLAorICBRVENGTExEKC0xLjA3NDcxN2UtMDcpLCBRVENGTExEKC0yLjEyMzY3MmUtMDQpLCBRVENGTExEKC0xLjE1NjY4MGUtMDMpLCBRVENGTExEKDEuMjMyMTMyZS0wMSksIFFUQ0ZMTEQoMS4wMzMyMDZlKzAwKSwKKyAgUVRDRkxMRCgxLjMyMzI2OGUtMDYpLCBRVENGTExEKC0yLjA3ODI5OWUtMDQpLCBRVENGTExEKC0xLjUyNTgxOWUtMDMpLCBRVENGTExEKDEuMjQ0MjcwZS0wMSksIFFUQ0ZMTEQoMS4wMzAxOTllKzAwKSwKKyAgUVRDRkxMRCgzLjM3NzgxNWUtMDYpLCBRVENGTExEKC0xLjg4NTI4NmUtMDQpLCBRVENGTExEKC0xLjkxNDExNWUtMDMpLCBRVENGTExEKDEuMjU0NjA1ZS0wMSksIFFUQ0ZMTEQoMS4wMjY2MTZlKzAwKSwKKyAgUVRDRkxMRCg1LjE2MTYwN2UtMDYpLCBRVENGTExEKC0xLjcyODY3M2UtMDQpLCBRVENGTExEKC0yLjI5MjgxNGUtMDMpLCBRVENGTExEKDEuMjYyOTk2ZS0wMSksIFFUQ0ZMTEQoMS4wMjI0NzBlKzAwKSwKKyAgUVRDRkxMRCg1LjkyNDAwMWUtMDYpLCBRVENGTExEKC0xLjc0NDg0MmUtMDQpLCBRVENGTExEKC0yLjY1ODA0MmUtMDMpLCBRVENGTExEKDEuMjY5NDE2ZS0wMSksIFFUQ0ZMTEQoMS4wMTc3MjllKzAwKSwKKyAgUVRDRkxMRCg2LjMxMDIwOGUtMDYpLCBRVENGTExEKC0xLjc4NDE5M2UtMDQpLCBRVENGTExEKC0zLjAwMDQyM2UtMDMpLCBRVENGTExEKDEuMjczNjQ4ZS0wMSksIFFUQ0ZMTEQoMS4wMTI1MDhlKzAwKSwKKyAgUVRDRkxMRCgzLjM1NzIxOWUtMDYpLCBRVENGTExEKC0yLjEzMTQwNmUtMDQpLCBRVENGTExEKC0zLjMxODg1OGUtMDMpLCBRVENGTExEKDEuMjc1NTYxZS0wMSksIFFUQ0ZMTEQoMS4wMDY4OTNlKzAwKSwKKyAgUVRDRkxMRCg1LjE4OTA4N2UtMDYpLCBRVENGTExEKC0yLjA3ODg4NmUtMDQpLCBRVENGTExEKC0zLjU5NzQ3NmUtMDMpLCBRVENGTExEKDEuMjc0NTY4ZS0wMSksIFFUQ0ZMTEQoMS4wMDE0NjNlKzAwKSwKKyAgUVRDRkxMRCg0LjE3ODA1MGUtMDYpLCBRVENGTExEKC00LjY2Mzc3OGUtMDUpLCBRVENGTExEKC0zLjg3MDg1MmUtMDMpLCBRVENGTExEKDEuMjczNTkxZS0wMSksIFFUQ0ZMTEQoOS45Mjc1NDRlLTAxKSwKKyAgUVRDRkxMRCg1LjM2NDgwN2UtMDYpLCBRVENGTExEKC01Ljg4OTI3N2UtMDYpLCBRVENGTExEKC00LjEzNTEzMGUtMDMpLCBRVENGTExEKDEuMjcyNDk5ZS0wMSksIFFUQ0ZMTEQoOS44MDc2OTJlLTAxKSwKKyAgUVRDRkxMRCg0LjA4MzcxOWUtMDYpLCBRVENGTExEKC0xLjc3NDEwOGUtMDUpLCBRVENGTExEKC00LjM1MTY2OGUtMDMpLCBRVENGTExEKDEuMjY4MjgxZS0wMSksIFFUQ0ZMTEQoOS42OTAwMTdlLTAxKSwKKyAgUVRDRkxMRCgzLjU2NzU4MWUtMDYpLCBRVENGTExEKC0yLjU5OTQ2OGUtMDgpLCBRVENGTExEKC00LjUxNzE5MGUtMDMpLCBRVENGTExEKDEuMjYxMjYyZS0wMSksIFFUQ0ZMTEQoOS41Njg4ODZlLTAxKSwKKyAgUVRDRkxMRCgzLjI2Mjc1NGUtMDYpLCBRVENGTExEKDEuMjYwNjQwZS0wNSksIFFUQ0ZMTEQoLTQuNjM2MjI4ZS0wMyksIFFUQ0ZMTEQoMS4yNTE0NzdlLTAxKSwgUVRDRkxMRCg5LjQ0MzgwM2UtMDEpLAorICBRVENGTExEKDIuMDQxMTI4ZS0wNiksIFFUQ0ZMTEQoMi4zNjQ1MTllLTA1KSwgUVRDRkxMRCgtNC43MDQzMjFlLTAzKSwgUVRDRkxMRCgxLjIzODg2OWUtMDEpLCBRVENGTExEKDkuMzEzODc0ZS0wMSksCisgIFFUQ0ZMTEQoLTIuNTY3OTY1ZS0wOCksIFFUQ0ZMTEQoMi44MDY5NjNlLTA1KSwgUVRDRkxMRCgtNC43MjI1NjhlLTAzKSwgUVRDRkxMRCgxLjIyMzM3MWUtMDEpLCBRVENGTExEKDkuMTc5NjY2ZS0wMSksCisgIFFUQ0ZMTEQoMi43MTQ4NzllLTA3KSwgUVRDRkxMRCg0LjQ5MzkxNmUtMDUpLCBRVENGTExEKC00LjY2MzI3NmUtMDMpLCBRVENGTExEKDEuMjA0ODU0ZS0wMSksIFFUQ0ZMTEQoOS4wNDEyODZlLTAxKSwKKyAgUVRDRkxMRCgyLjE1MDg4NGUtMDYpLCBRVENGTExEKDUuNDA4MTU1ZS0wNSksIFFUQ0ZMTEQoLTQuNTU0ODExZS0wMyksIFFUQ0ZMTEQoMS4xODMyMzNlLTAxKSwgUVRDRkxMRCg4Ljg5OTQ3NGUtMDEpLAorICBRVENGTExEKDUuODE4NTk1ZS0wNiksIFFUQ0ZMTEQoMy43NTk2MzBlLTA1KSwgUVRDRkxMRCgtNC4zNjk1NTRlLTAzKSwgUVRDRkxMRCgxLjE1ODM1OWUtMDEpLCBRVENGTExEKDguNzU0NjQxZS0wMSksCisgIFFUQ0ZMTEQoLTEuNjg2MTM3ZS0wOSksIFFUQ0ZMTEQoMi41MTUxMThlLTA1KSwgUVRDRkxMRCgtNC4wOTEwMzNlLTAzKSwgUVRDRkxMRCgxLjEzMDE4MGUtMDEpLCBRVENGTExEKDguNjA3NDkyZS0wMSksCisgIFFUQ0ZMTEQoLTEuNzc1MTkxZS0wOSksIFFUQ0ZMTEQoMi40MDY1MTdlLTA1KSwgUVRDRkxMRCgtMy43OTQ0MjVlLTAzKSwgUVRDRkxMRCgxLjA5ODU1MWUtMDEpLCBRVENGTExEKDguNDU4NDUwZS0wMSksCisgIFFUQ0ZMTEQoLTIuMjIyMDcyZS0wOSksIFFUQ0ZMTEQoMy42Mjg1MTFlLTA1KSwgUVRDRkxMRCgtMy40NjAzNjNlLTAzKSwgUVRDRkxMRCgxLjA2MzQ1NWUtMDEpLCBRVENGTExEKDguMzA4MDQwZS0wMSksCisgIFFUQ0ZMTEQoLTEuMjgwNjc1ZS0wOCksIFFUQ0ZMTEQoMi4yNDE1NDZlLTA1KSwgUVRDRkxMRCgtMy4wNjQzMTFlLTAzKSwgUVRDRkxMRCgxLjAyNDgwNWUtMDEpLCBRVENGTExEKDguMTU2NTIzZS0wMSksCisgIFFUQ0ZMTEQoLTYuOTc3MDc4ZS0wOCksIFFUQ0ZMTEQoMS40OTkxNzBlLTA1KSwgUVRDRkxMRCgtMi42MjE1MzdlLTAzKSwgUVRDRkxMRCg5LjgyNjI1MWUtMDIpLCBRVENGTExEKDguMDA0MTY1ZS0wMSksCisgIFFUQ0ZMTEQoLTEuNDA5OTI3ZS0wOCksIFFUQ0ZMTEQoNS4wMDk5MTNlLTA2KSwgUVRDRkxMRCgtMi4xMjQ2NDhlLTAzKSwgUVRDRkxMRCg5LjM2ODY1MmUtMDIpLCBRVENGTExEKDcuODUxMDEyZS0wMSksCisgIFFUQ0ZMTEQoLTIuOTg2NDg5ZS0wOSksIFFUQ0ZMTEQoMS4yNzcxODRlLTA2KSwgUVRDRkxMRCgtMS41OTQ4NjFlLTAzKSwgUVRDRkxMRCg4Ljg3NTc1NmUtMDIpLCBRVENGTExEKDcuNjk3MDkzZS0wMSksCisgIFFUQ0ZMTEQoMS44NzYwMjJlLTA3KSwgUVRDRkxMRCgxLjU4MDE4OWUtMDUpLCBRVENGTExEKC0xLjA2MTQ5OWUtMDMpLCBRVENGTExEKDguMzQ3MTUxZS0wMiksIFFUQ0ZMTEQoNy41NDIyOTRlLTAxKSwKKyAgUVRDRkxMRCgxLjczNzI3N2UtMDcpLCBRVENGTExEKDUuNTMzOTUzZS0wNSksIFFUQ0ZMTEQoLTYuMTY5ODU1ZS0wNCksIFFUQ0ZMTEQoNy43ODMzMDBlLTAyKSwgUVRDRkxMRCg3LjM4NjUxNWUtMDEpLAorICBRVENGTExEKDMuODE4NTg5ZS0wOSksIFFUQ0ZMTEQoOC44NzAxODJlLTA1KSwgUVRDRkxMRCgtMi4wMDQ4MjNlLTA0KSwgUVRDRkxMRCg3LjE4NDA3NGUtMDIpLCBRVENGTExEKDcuMjI5NTk5ZS0wMSksCisgIFFUQ0ZMTEQoNS4xNDM2MTVlLTA3KSwgUVRDRkxMRCgxLjAzNTc4M2UtMDQpLCBRVENGTExEKDIuMDQ4NDk5ZS0wNCksIFFUQ0ZMTEQoNi41NTAyMDllLTAyKSwgUVRDRkxMRCg3LjA3MTQ0OGUtMDEpLAorICBRVENGTExEKDIuODIwMjkyZS0wOCksIFFUQ0ZMTEQoOS45OTA3NThlLTA1KSwgUVRDRkxMRCg1LjYyMTcyMWUtMDQpLCBRVENGTExEKDUuODgxMjk3ZS0wMiksIFFUQ0ZMTEQoNi45MTE5ODJlLTAxKSwKKyAgUVRDRkxMRCg0LjY3NzAxNmUtMDYpLCBRVENGTExEKDEuMTgxMDc4ZS0wNCksIFFUQ0ZMTEQoOS4zNzM5NzVlLTA0KSwgUVRDRkxMRCg1LjE3Nzk2NWUtMDIpLCBRVENGTExEKDYuNzUxMTk5ZS0wMSksCisgIFFUQ0ZMTEQoMy4zNjE2ODJlLTA2KSwgUVRDRkxMRCgyLjEyNjM2NWUtMDUpLCBRVENGTExEKDEuMzQ0NjU3ZS0wMyksIFFUQ0ZMTEQoNC40Mzk2ODRlLTAyKSwgUVRDRkxMRCg2LjU4OTE0OWUtMDEpLAorICBRVENGTExEKC00Ljg4MDg0NWUtMDgpLCBRVENGTExEKDUuODYxODAwZS0wNSksIFFUQ0ZMTEQoMS44MTIxNzZlLTAzKSwgUVRDRkxMRCgzLjY2Njk0M2UtMDIpLCBRVENGTExEKDYuNDI1OTQwZS0wMSksCisgIFFUQ0ZMTEQoMi4yNjc3MzFlLTA3KSwgUVRDRkxMRCg1LjAyMTkwNmUtMDUpLCBRVENGTExEKDIuMTcyODY2ZS0wMyksIFFUQ0ZMTEQoMi44NTc1MjhlLTAyKSwgUVRDRkxMRCg2LjI2MTcyNWUtMDEpLAorICBRVENGTExEKDUuMTU4MjEzZS0wOSksIFFUQ0ZMTEQoNC4xNTAwNzVlLTA1KSwgUVRDRkxMRCgxLjk4NTgyNWUtMDMpLCBRVENGTExEKDIuMDEyMjM3ZS0wMiksIFFUQ0ZMTEQoNi4wOTY2OTBlLTAxKSwKKyAgUVRDRkxMRCgtMi4wNjY5NjJlLTA3KSwgUVRDRkxMRCgzLjc5OTk3MmUtMDUpLCBRVENGTExEKDEuNjk3NjUzZS0wMyksIFFUQ0ZMTEQoMS4xMzIzMjRlLTAyKSwgUVRDRkxMRCg1LjkzMDk4MmUtMDEpLAorICBRVENGTExEKDQuODgzMzA1ZS0wNyksIFFUQ0ZMTEQoNi42MDY0NjJlLTA1KSwgUVRDRkxMRCgxLjQ3MTE2N2UtMDMpLCBRVENGTExEKDIuMTg0MjU3ZS0wMyksIFFUQ0ZMTEQoNS43NjQ3MzVlLTAxKSwKKyAgUVRDRkxMRCg4LjI1NDQzMGUtMDcpLCBRVENGTExEKDkuNzU1Njg1ZS0wNSksIFFUQ0ZMTEQoMS4yMzIxMzRlLTAzKSwgUVRDRkxMRCgtNy4yOTgxOThlLTAzKSwgUVRDRkxMRCg1LjU5ODA1MmUtMDEpLAorICBRVENGTExEKDkuNDY0NzgzZS0wNyksIFFUQ0ZMTEQoMS44MzExMjFlLTA0KSwgUVRDRkxMRCg4Ljk5MDI1NmUtMDQpLCBRVENGTExEKC0xLjcxMTMyNGUtMDIpLCBRVENGTExEKDUuNDMwOTkwZS0wMSksCisgIFFUQ0ZMTEQoLTEuMjMyNjkzZS0wNSksIFFUQ0ZMTEQoLTUuOTAxNjE4ZS0wNyksIFFUQ0ZMTEQoNi4xNTAzMTdlLTA0KSwgUVRDRkxMRCgtMi43MjY0ODRlLTAyKSwgUVRDRkxMRCg1LjI2MzU1NGUtMDEpLAorICBRVENGTExEKDMuODY3NDgzZS0wNSksIFFUQ0ZMTEQoLTMuNTk1MDU0ZS0wNCksIFFUQ0ZMTEQoNi4zMDc4NDFlLTA0KSwgUVRDRkxMRCgtMy43NzU5MjhlLTAyKSwgUVRDRkxMRCg1LjA5NTcyMWUtMDEpLAorICBRVENGTExEKC05Ljg3MDU0OGUtMDcpLCBRVENGTExEKC0xLjgxNTgzN2UtMDQpLCBRVENGTExEKDQuMzY2NDQ3ZS0wNCksIFFUQ0ZMTEQoLTQuODU5MDA2ZS0wMiksIFFUQ0ZMTEQoNC45Mjc0NjRlLTAxKSwKKyAgUVRDRkxMRCgtMS4wODk1MDFlLTA2KSwgUVRDRkxMRCgtOS4yMDQ4NzZlLTA1KSwgUVRDRkxMRCgxLjQ5ODIzMmUtMDQpLCBRVENGTExEKC01Ljk3Mzc0MmUtMDIpLCBRVENGTExEKDQuNzU4NzU0ZS0wMSksCisgIFFUQ0ZMTEQoLTEuNTY5MDAzZS0wNiksIFFUQ0ZMTEQoLTUuMTkyNDQ0ZS0wNSksIFFUQ0ZMTEQoLTkuMDk5NzIzZS0wNSksIFFUQ0ZMTEQoLTcuMTIwMzU3ZS0wMiksIFFUQ0ZMTEQoNC41ODk1ODNlLTAxKSwKKyAgUVRDRkxMRCgtMi43Nzg2MThlLTA3KSwgUVRDRkxMRCg2LjQ4Nzg4MGUtMDUpLCBRVENGTExEKC0zLjMzNzk2N2UtMDQpLCBRVENGTExEKC04LjI5ODEwM2UtMDIpLCBRVENGTExEKDQuNDIwMDE0ZS0wMSksCisgIFFUQ0ZMTEQoNi43NTcwMTVlLTA5KSwgUVRDRkxMRCg1LjM5NzA2NWUtMDUpLCBRVENGTExEKC01LjU5OTM0OGUtMDQpLCBRVENGTExEKC05LjUwNjk2N2UtMDIpLCBRVENGTExEKDQuMjUwMTQ0ZS0wMSksCisgIFFUQ0ZMTEQoMS40OTY0MzZlLTA3KSwgUVRDRkxMRCgyLjQ3MjAyNGUtMDUpLCBRVENGTExEKC03LjY3NzYzNGUtMDQpLCBRVENGTExEKC0xLjA3NDYzMWUtMDEpLCBRVENGTExEKDQuMDgwMTU1ZS0wMSksCisgIFFUQ0ZMTEQoMi4wNjgyOTdlLTA1KSwgUVRDRkxMRCg5LjcxMTY4MmUtMDUpLCBRVENGTExEKC05LjczMDQ2MGUtMDQpLCBRVENGTExEKC0xLjIwMTYyOWUtMDEpLCBRVENGTExEKDMuOTEwMjQ0ZS0wMSksCisgIFFUQ0ZMTEQoLTkuMzg4OTYzZS0wNiksIFFUQ0ZMTEQoNS4xNDQ5NjllLTA1KSwgUVRDRkxMRCgtMS4xMzE4NjBlLTAzKSwgUVRDRkxMRCgtMS4zMzE1NDVlLTAxKSwgUVRDRkxMRCgzLjc0MDY0NGUtMDEpLAorICBRVENGTExEKC0xLjQwMjkyNWUtMDUpLCBRVENGTExEKC0xLjAzOTI2NGUtMDQpLCBRVENGTExEKC0xLjI4MzI4MWUtMDMpLCBRVENGTExEKC0xLjQ2NDM4OWUtMDEpLCBRVENGTExEKDMuNTcxNTI4ZS0wMSksCisgIFFUQ0ZMTEQoLTIuNzU3NjExZS0wNiksIFFUQ0ZMTEQoMi44NTM0MzdlLTA2KSwgUVRDRkxMRCgtMS40ODA1NDNlLTAzKSwgUVRDRkxMRCgtMS42MDAwNjJlLTAxKSwgUVRDRkxMRCgzLjQwMzA3NGUtMDEpLAorICBRVENGTExEKDIuOTQ1MjM5ZS0wOCksIFFUQ0ZMTEQoMS4zMzQwOTFlLTA1KSwgUVRDRkxMRCgtMS42OTkxNjFlLTAzKSwgUVRDRkxMRCgtMS43Mzg1NDJlLTAxKSwgUVRDRkxMRCgzLjIzNTI5OWUtMDEpLAorICBRVENGTExEKC03Ljg3MzMwNGUtMDgpLCBRVENGTExEKDIuNDQzMTYxZS0wNSksIFFUQ0ZMTEQoLTEuOTI0ODQ1ZS0wMyksIFFUQ0ZMTEQoLTEuODc5NzEyZS0wMSksIFFUQ0ZMTEQoMy4wNjgxODdlLTAxKSwKKyAgUVRDRkxMRCgtOS44OTcxOTRlLTA3KSwgUVRDRkxMRCgzLjU2ODU1NWUtMDUpLCBRVENGTExEKC0yLjE1MjM4MGUtMDMpLCBRVENGTExEKC0yLjAyMzU0OGUtMDEpLCBRVENGTExEKDIuOTAxNDkxZS0wMSksCisgIFFUQ0ZMTEQoLTEuOTIyMDc0ZS0wNiksIFFUQ0ZMTEQoNi4xOTMzNzBlLTA1KSwgUVRDRkxMRCgtMi4zOTY0MDRlLTAzKSwgUVRDRkxMRCgtMi4xNjk5MjZlLTAxKSwgUVRDRkxMRCgyLjczNDk3N2UtMDEpLAorICBRVENGTExEKC0yLjc2NTY1MGUtMDcpLCBRVENGTExEKDEuMTc2MjM3ZS0wNCksIFFUQ0ZMTEQoLTIuNjUzODE5ZS0wMyksIFFUQ0ZMTEQoLTIuMzE4ODE1ZS0wMSksIFFUQ0ZMTEQoMi41NjgxNzZlLTAxKSwKKyAgUVRDRkxMRCgtNC42MzYxMDVlLTA3KSwgUVRDRkxMRCgxLjYzNTkwNmUtMDQpLCBRVENGTExEKC0yLjkyNzE1OWUtMDMpLCBRVENGTExEKC0yLjQ3MDA5OGUtMDEpLCBRVENGTExEKDIuNDAwNzY4ZS0wMSksCisgIFFUQ0ZMTEQoLTkuNjA3MDY5ZS0wNyksIFFUQ0ZMTEQoMi4wNjAzOTRlLTA0KSwgUVRDRkxMRCgtMy4yMDkwOTNlLTAzKSwgUVRDRkxMRCgtMi42MjM3NDllLTAxKSwgUVRDRkxMRCgyLjIzMjI3N2UtMDEpLAorICBRVENGTExEKC0xLjkwNzkyN2UtMDYpLCBRVENGTExEKDIuMzQ2OTgxZS0wNCksIFFUQ0ZMTEQoLTMuNTA1NTMxZS0wMyksIFFUQ0ZMTEQoLTIuNzc5NjM4ZS0wMSksIFFUQ0ZMTEQoMi4wNjI2MDVlLTAxKSwKKyAgUVRDRkxMRCgtMS41NTEyNTFlLTA4KSwgUVRDRkxMRCgyLjUyMDYwN2UtMDQpLCBRVENGTExEKC0zLjgxMTYxMmUtMDMpLCBRVENGTExEKC0yLjkzNzcyNWUtMDEpLCBRVENGTExEKDEuODkxNTkwZS0wMSksCisgIFFUQ0ZMTEQoLTEuNjUzNDY0ZS0wNiksIFFUQ0ZMTEQoMi41NTY0NTBlLTA0KSwgUVRDRkxMRCgtNC4xMzM2NDBlLTAzKSwgUVRDRkxMRCgtMy4wOTc4NjJlLTAxKSwgUVRDRkxMRCgxLjcxOTcyNmUtMDEpLAorICBRVENGTExEKC0yLjA0MzQ2NGUtMDYpLCBRVENGTExEKDMuMTU3NjY0ZS0wNCksIFFUQ0ZMTEQoLTQuNDQ4OTkzZS0wMyksIFFUQ0ZMTEQoLTMuMjU5OTk0ZS0wMSksIFFUQ0ZMTEQoMS41NDc0NjFlLTAxKSwKKyAgUVRDRkxMRCgxLjYyMjc4NmUtMDUpLCBRVENGTExEKDYuMjA1Njc2ZS0wNCksIFFUQ0ZMTEQoLTQuNzU0MTkyZS0wMyksIFFUQ0ZMTEQoLTMuNDIzOTQyZS0wMSksIFFUQ0ZMTEQoMS4zNzYxNTBlLTAxKSwKKyAgUVRDRkxMRCgxLjM5NTIyMWUtMDUpLCBRVENGTExEKDcuODQ3ODQwZS0wNCksIFFUQ0ZMTEQoLTUuMDYzODUxZS0wMyksIFFUQ0ZMTEQoLTMuNTg5NjI3ZS0wMSksIFFUQ0ZMTEQoMS4yMDY5MjRlLTAxKSwKKyAgUVRDRkxMRCg0LjU5MTAxMGUtMDcpLCBRVENGTExEKDkuMDE5MTI5ZS0wNCksIFFUQ0ZMTEQoLTUuMzk0NTcwZS0wMyksIFFUQ0ZMTEQoLTMuNzU2ODIyZS0wMSksIFFUQ0ZMTEQoMS4wNDIwMzNlLTAxKSwKKyAgUVRDRkxMRCgtNi4yNjE5NDRlLTA2KSwgUVRDRkxMRCgxLjA1NDk2M2UtMDMpLCBRVENGTExEKC01Ljc0MTEwM2UtMDMpLCBRVENGTExEKC0zLjkyNTQwOWUtMDEpLCBRVENGTExEKDguODI5NzQ1ZS0wMiksCisgIFFUQ0ZMTEQoLTEuNjA2MDUxZS0wNSksIFFUQ0ZMTEQoMS4wODk0MjllLTAzKSwgUVRDRkxMRCgtNi4xMDkxNzllLTAzKSwgUVRDRkxMRCgtNC4wOTUxNjBlLTAxKSwgUVRDRkxMRCg3LjMyNTk3OWUtMDIpLAorICBRVENGTExEKC0yLjQ2NDIyOGUtMDUpLCBRVENGTExEKDEuMTIyNTAzZS0wMyksIFFUQ0ZMTEQoLTYuNTAwNTAzZS0wMyksIFFUQ0ZMTEQoLTQuMjY1OTUwZS0wMSksIFFUQ0ZMTEQoNS45MTg2NzhlLTAyKSwKKyAgUVRDRkxMRCgtMi45NzY4MjRlLTA1KSwgUVRDRkxMRCgxLjE3NzUxNWUtMDMpLCBRVENGTExEKC02LjkyNTE0MWUtMDMpLCBRVENGTExEKC00LjQzNzUzMGUtMDEpLCBRVENGTExEKDQuNjM0Njk2ZS0wMiksCisgIFFUQ0ZMTEQoLTMuMTc3NDY4ZS0wNSksIFFUQ0ZMTEQoMS4yMjYxMTNlLTAzKSwgUVRDRkxMRCgtNy4zODA1NDRlLTAzKSwgUVRDRkxMRCgtNC42MDk4MjllLTAxKSwgUVRDRkxMRCgzLjQ1MDcxOWUtMDIpLAorICBRVENGTExEKC00LjM3MzMwMmUtMDUpLCBRVENGTExEKDEuMjYzNTY5ZS0wMyksIFFUQ0ZMTEQoLTcuODc2MzkzZS0wMyksIFFUQ0ZMTEQoLTQuNzgyNjUwZS0wMSksIFFUQ0ZMTEQoMi4zNTMwNjBlLTAyKSwKKyAgUVRDRkxMRCgtMy4yOTkwMDRlLTA1KSwgUVRDRkxMRCgxLjI4NzgxOWUtMDMpLCBRVENGTExEKC04LjQwNzc0OWUtMDMpLCBRVENGTExEKC00Ljk1NjE3NWUtMDEpLCBRVENGTExEKDEuMTI5NTgwZS0wMiksCit9OworCitSQU1fQUxJR04KK2NvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8zMjBbUU1GMzIwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9Cit7CitRVENGTExEKDUuMzQ1MDYwZS0wNyksIFFUQ0ZMTEQoLTEuMTM1NDcxZS0wNSksIFFUQ0ZMTEQoLTEuMjIyNzQzZS0wMyksIFFUQ0ZMTEQoOS4zMTgzMzVlLTAzKSwgUVRDRkxMRCg1LjIxNDAzM2UtMDEpLAorUVRDRkxMRCg3LjYwNDc5MmUtMDcpLCBRVENGTExEKDYuMDAzODM5ZS0wNiksIFFUQ0ZMTEQoLTEuMTI1Mzk4ZS0wMyksIFFUQ0ZMTEQoMS4wNzAwNDNlLTAyKSwgUVRDRkxMRCg1LjU1NjA4N2UtMDEpLAorUVRDRkxMRCg1LjU2MzUzNmUtMDcpLCBRVENGTExEKDEuMDUwNzkyZS0wNSksIFFUQ0ZMTEQoLTEuMDE2OTI5ZS0wMyksIFFUQ0ZMTEQoMS4yMjg0NzllLTAyKSwgUVRDRkxMRCg1Ljg5NjkzNWUtMDEpLAorUVRDRkxMRCgyLjkwNjMyMmUtMDgpLCBRVENGTExEKDguNTYwNTI3ZS0wNiksIFFUQ0ZMTEQoLTkuNTMxMTg3ZS0wNCksIFFUQ0ZMTEQoMS40MDg2NDBlLTAyKSwgUVRDRkxMRCg2LjIzNTE1N2UtMDEpLAorUVRDRkxMRCgxLjA4NDYxNGUtMDYpLCBRVENGTExEKDIuNDA3OTUxZS0wNSksIFFUQ0ZMTEQoLTEuMDkzNDMzZS0wMyksIFFUQ0ZMTEQoMS42MTE0NzRlLTAyKSwgUVRDRkxMRCg2LjU2OTM3MWUtMDEpLAorUVRDRkxMRCgtNi4xNzUzODdlLTEwKSwgUVRDRkxMRCg4Ljc2OTg5OWUtMDYpLCBRVENGTExEKC0xLjI0NDc1MmUtMDMpLCBRVENGTExEKDEuODM3ODc3ZS0wMiksIFFUQ0ZMTEQoNi44OTgwMDNlLTAxKSwKK1FUQ0ZMTEQoLTQuMTI4ODA4ZS0wOSksIFFUQ0ZMTEQoOS40OTQ3NjdlLTA2KSwgUVRDRkxMRCgtOC44NzgxNjBlLTA0KSwgUVRDRkxMRCgyLjA4OTkxNWUtMDIpLCBRVENGTExEKDcuMjE5NDE2ZS0wMSksCitRVENGTExEKC0xLjExNjgwMWUtMDgpLCBRVENGTExEKDIuNjcwMTMwZS0wNiksIFFUQ0ZMTEQoLTYuMjczMDQxZS0wNCksIFFUQ0ZMTEQoMi4zNjk5NTJlLTAyKSwgUVRDRkxMRCg3LjUzMjA4MmUtMDEpLAorUVRDRkxMRCgyLjYwNzM0N2UtMDgpLCBRVENGTExEKDIuNDI0NzkwZS0wNiksIFFUQ0ZMTEQoLTMuODY1OTQ0ZS0wNCksIFFUQ0ZMTEQoMi42NzkwMjRlLTAyKSwgUVRDRkxMRCg3LjgzNDY5MWUtMDEpLAorUVRDRkxMRCgzLjc4MjE0OGUtMDgpLCBRVENGTExEKDMuMjMzNTczZS0wNSksIFFUQ0ZMTEQoMi43NDgxMzZlLTA0KSwgUVRDRkxMRCgzLjAyMTE5M2UtMDIpLCBRVENGTExEKDguMTI2MDQ0ZS0wMSksCitRVENGTExEKDEuMjkwOTIxZS0wNyksIFFUQ0ZMTEQoNS4xMDYxODdlLTA1KSwgUVRDRkxMRCg5LjY4MDYxNWUtMDQpLCBRVENGTExEKDMuMzk1NzI2ZS0wMiksIFFUQ0ZMTEQoOC40MDQ5MjVlLTAxKSwKK1FUQ0ZMTEQoLTEuMDMwNzMyZS0wNiksIFFUQ0ZMTEQoMS4xNjI5NDNlLTA1KSwgUVRDRkxMRCgxLjU3MTE5OGUtMDMpLCBRVENGTExEKDMuODAxNzQwZS0wMiksIFFUQ0ZMTEQoOC42Njk5NTVlLTAxKSwKK1FUQ0ZMTEQoNC4wNTI5NDBlLTA4KSwgUVRDRkxMRCg0LjkyNDk2MGUtMDUpLCBRVENGTExEKDEuOTkwNzY3ZS0wMyksIFFUQ0ZMTEQoNC4yNDA1NjllLTAyKSwgUVRDRkxMRCg4LjkxOTU5NWUtMDEpLAorUVRDRkxMRCgxLjIzNjQ4MWUtMDcpLCBRVENGTExEKDUuNzk5MzMzZS0wNSksIFFUQ0ZMTEQoMi4zNTQ4MDBlLTAzKSwgUVRDRkxMRCg0LjcyNDE3N2UtMDIpLCBRVENGTExEKDkuMTUyMjUzZS0wMSksCitRVENGTExEKDQuMDQ5Mzg4ZS0wNyksIFFUQ0ZMTEQoNi4zNjk0OTZlLTA1KSwgUVRDRkxMRCgyLjY2Njc0NmUtMDMpLCBRVENGTExEKDUuMjM2OTY3ZS0wMiksIFFUQ0ZMTEQoOS4zNjY3MDllLTAxKSwKK1FUQ0ZMTEQoNC41MDk4NTdlLTA2KSwgUVRDRkxMRCgxLjcyNjg1MmUtMDQpLCBRVENGTExEKDIuNzI0NDQzZS0wMyksIFFUQ0ZMTEQoNS43NzQyOTFlLTAyKSwgUVRDRkxMRCg5LjU2MjA5N2UtMDEpLAorUVRDRkxMRCgxLjM3OTAyNmUtMDUpLCBRVENGTExEKDMuMzA0NjE5ZS0wNCksIFFUQ0ZMTEQoMi4zNzgyMTZlLTAzKSwgUVRDRkxMRCg2LjMzNjU3MWUtMDIpLCBRVENGTExEKDkuNzM3OTE2ZS0wMSksCitRVENGTExEKDguNDk3NzE1ZS0wNyksIFFUQ0ZMTEQoNy4yMTk2MjRlLTA1KSwgUVRDRkxMRCgxLjcyNDU0MmUtMDMpLCBRVENGTExEKDYuOTE4MzExZS0wMiksIFFUQ0ZMTEQoOS44OTM4ODNlLTAxKSwKK1FUQ0ZMTEQoLTEuNjYwOTQ0ZS0wNyksIFFUQ0ZMTEQoLTYuODg2NjY0ZS0wNSksIFFUQ0ZMTEQoOS4xODEzNTRlLTA0KSwgUVRDRkxMRCg3LjUwOTEwNWUtMDIpLCBRVENGTExEKDEuMDAyOTY5ZSswMCksCitRVENGTExEKC0xLjE0NzIzNWUtMDUpLCBRVENGTExEKC01LjMwMTgyNmUtMDUpLCBRVENGTExEKDIuMDEzNzAxZS0wNCksIFFUQ0ZMTEQoOC4xMDM3NjZlLTAyKSwgUVRDRkxMRCgxLjAxNDQ4NGUrMDApLAorUVRDRkxMRCgtMy40NjY4MjllLTA2KSwgUVRDRkxMRCgxLjIwNTU2NGUtMDQpLCBRVENGTExEKDYuMzQ4ODkyZS0wNCksIFFUQ0ZMTEQoOC42OTQ3NjVlLTAyKSwgUVRDRkxMRCgxLjAyMzg4M2UrMDApLAorUVRDRkxMRCg2LjcxMzY5MmUtMDcpLCBRVENGTExEKDcuNzYyMjY4ZS0wNiksIFFUQ0ZMTEQoNy4yNjUxMTJlLTA0KSwgUVRDRkxMRCg5LjI3NzYwOGUtMDIpLCBRVENGTExEKDEuMDMxMTU3ZSswMCksCitRVENGTExEKDIuMjgzMjM4ZS0wNyksIFFUQ0ZMTEQoLTkuODAxMjUzZS0wNiksIFFUQ0ZMTEQoNy4wNDIwMjJlLTA0KSwgUVRDRkxMRCg5Ljg0NDA5OWUtMDIpLCBRVENGTExEKDEuMDM2MzY3ZSswMCksCitRVENGTExEKDMuMTI4MTg5ZS0wNyksIFFUQ0ZMTEQoLTIuNjIzMjg1ZS0wNSksIFFUQ0ZMTEQoNi44MjcwNTJlLTA0KSwgUVRDRkxMRCgxLjAzODUyMGUtMDEpLCBRVENGTExEKDEuMDM5NjYyZSswMCksCitRVENGTExEKDEuOTA3NjUyZS0wNyksIFFUQ0ZMTEQoLTQuOTY5NjU0ZS0wNSksIFFUQ0ZMTEQoNi4zMjE5NzRlLTA0KSwgUVRDRkxMRCgxLjA4OTA5NGUtMDEpLCBRVENGTExEKDEuMDQxMjM5ZSswMCksCitRVENGTExEKDMuMzAxNDc5ZS0wNyksIFFUQ0ZMTEQoLTYuOTA0MzU0ZS0wNSksIFFUQ0ZMTEQoMy45Njk2MzRlLTA0KSwgUVRDRkxMRCgxLjEzNTE2OWUtMDEpLCBRVENGTExEKDEuMDQxMjY1ZSswMCksCitRVENGTExEKDYuNTk2OTMxZS0wNyksIFFUQ0ZMTEQoLTguOTczNDMxZS0wNSksIFFUQ0ZMTEQoLTUuMzAzMjYwZS0wNiksIFFUQ0ZMTEQoMS4xNzU4MjFlLTAxKSwgUVRDRkxMRCgxLjAzOTc4OWUrMDApLAorUVRDRkxMRCgtNC4wNDAwOTRlLTA2KSwgUVRDRkxMRCgtMi4zMTYwOTZlLTA0KSwgUVRDRkxMRCgtNi4wMzY1NjFlLTA0KSwgUVRDRkxMRCgxLjIxMDM2NWUtMDEpLCBRVENGTExEKDEuMDM2Njg5ZSswMCksCitRVENGTExEKDYuMDc4OTgwZS0wNyksIFFUQ0ZMTEQoLTIuMTAwOTg1ZS0wNCksIFFUQ0ZMTEQoLTEuMzQxMjQ5ZS0wMyksIFFUQ0ZMTEQoMS4yMzgyMDFlLTAxKSwgUVRDRkxMRCgxLjAzMTcwMmUrMDApLAorUVRDRkxMRCg0LjI2OTcxMWUtMDYpLCBRVENGTExEKC0xLjgwNjk3OWUtMDQpLCBRVENGTExEKC0yLjEwMzQ2NGUtMDMpLCBRVENGTExEKDEuMjU4ODAwZS0wMSksIFFUQ0ZMTEQoMS4wMjQ1NDNlKzAwKSwKK1FUQ0ZMTEQoNi4xMTcxMDVlLTA2KSwgUVRDRkxMRCgtMS43NjQ1MTdlLTA0KSwgUVRDRkxMRCgtMi44MjkyMzJlLTAzKSwgUVRDRkxMRCgxLjI3MTUzMmUtMDEpLCBRVENGTExEKDEuMDE1MTE5ZSswMCksCitRVENGTExEKDQuMjczMTUzZS0wNiksIFFUQ0ZMTEQoLTIuMTA1MTQ2ZS0wNCksIFFUQ0ZMTEQoLTMuNDU4MTY3ZS0wMyksIFFUQ0ZMTEQoMS4yNzUwNjRlLTAxKSwgUVRDRkxMRCgxLjAwNDE3OGUrMDApLAorUVRDRkxMRCg0Ljc3MTQyOGUtMDYpLCBRVENGTExEKC0yLjYyNjM1M2UtMDUpLCBRVENGTExEKC00LjAwMjk5MWUtMDMpLCBRVENGTExEKDEuMjczMDQ1ZS0wMSksIFFUQ0ZMTEQoOS44Njc2MThlLTAxKSwKK1FUQ0ZMTEQoMy44MjU2NTBlLTA2KSwgUVRDRkxMRCgtOC44ODM1NDBlLTA2KSwgUVRDRkxMRCgtNC40MzQ0MjllLTAzKSwgUVRDRkxMRCgxLjI2NDc3MWUtMDEpLCBRVENGTExEKDkuNjI5NDUxZS0wMSksCitRVENGTExEKDIuNjUxOTQxZS0wNiksIFFUQ0ZMTEQoMS44MTI1NzllLTA1KSwgUVRDRkxMRCgtNC42NzAyNzRlLTAzKSwgUVRDRkxMRCgxLjI0NTE3M2UtMDEpLCBRVENGTExEKDkuMzc4ODM5ZS0wMSksCitRVENGTExEKDEuMjI5MDQxZS0wNyksIFFUQ0ZMTEQoMy42NTA0NDBlLTA1KSwgUVRDRkxMRCgtNC42OTI5MjJlLTAzKSwgUVRDRkxMRCgxLjIxNDExM2UtMDEpLCBRVENGTExEKDkuMTEwNDc2ZS0wMSksCitRVENGTExEKDMuOTg0NzM5ZS0wNiksIFFUQ0ZMTEQoNC41ODM4OTJlLTA1KSwgUVRDRkxMRCgtNC40NjIxODNlLTAzKSwgUVRDRkxMRCgxLjE3MDc5NmUtMDEpLCBRVENGTExEKDguODI3MDU3ZS0wMSksCitRVENGTExEKC0xLjczMDY2NGUtMDkpLCBRVENGTExEKDIuNDYwODE4ZS0wNSksIFFUQ0ZMTEQoLTMuOTQyNzI5ZS0wMyksIFFUQ0ZMTEQoMS4xMTQzNjZlLTAxKSwgUVRDRkxMRCg4LjUzMjk3MWUtMDEpLAorUVRDRkxMRCgtNy41MTQ0MTNlLTA5KSwgUVRDRkxMRCgyLjkzNTAyOWUtMDUpLCBRVENGTExEKC0zLjI2MjMzN2UtMDMpLCBRVENGTExEKDEuMDQ0MTMwZS0wMSksIFFUQ0ZMTEQoOC4yMzIyODFlLTAxKSwKK1FUQ0ZMTEQoLTQuMTkzNTAzZS0wOCksIFFUQ0ZMTEQoMS4wMDAwODFlLTA1KSwgUVRDRkxMRCgtMi4zNzMwOTJlLTAzKSwgUVRDRkxMRCg5LjU5NzQ1MmUtMDIpLCBRVENGTExEKDcuOTI3NTg5ZS0wMSksCitRVENGTExEKDkuMjMwNzg2ZS0wOCksIFFUQ0ZMTEQoOC41Mzk1MzhlLTA2KSwgUVRDRkxMRCgtMS4zMjgxODBlLTAzKSwgUVRDRkxMRCg4LjYxMTQ1M2UtMDIpLCBRVENGTExEKDcuNjE5Njk0ZS0wMSksCitRVENGTExEKDguODc3MzEyZS0wOCksIFFUQ0ZMTEQoNy4yMDIwNjdlLTA1KSwgUVRDRkxMRCgtNC4wODczMzllLTA0KSwgUVRDRkxMRCg3LjQ4MzY4N2UtMDIpLCBRVENGTExEKDcuMzA4MDU4ZS0wMSksCitRVENGTExEKDIuNzEyODIyZS0wNyksIFFUQ0ZMTEQoMS4wMTc0MjllLTA0KSwgUVRDRkxMRCgzLjgzNTExMGUtMDQpLCBRVENGTExEKDYuMjE1NzUzZS0wMiksIFFUQ0ZMTEQoNi45OTE3MTVlLTAxKSwKK1FUQ0ZMTEQoNC4wMTkzNDllLTA2KSwgUVRDRkxMRCg2Ljk2ODU3MGUtMDUpLCBRVENGTExEKDEuMTQxMDI3ZS0wMyksIFFUQ0ZMTEQoNC44MDg4MjVlLTAyKSwgUVRDRkxMRCg2LjY3MDE3NGUtMDEpLAorUVRDRkxMRCg4Ljg5ODIzM2UtMDgpLCBRVENGTExEKDUuNDQxODUzZS0wNSksIFFUQ0ZMTEQoMS45OTI1MjFlLTAzKSwgUVRDRkxMRCgzLjI2MjIzNmUtMDIpLCBRVENGTExEKDYuMzQzODMzZS0wMSksCitRVENGTExEKC0xLjAwNzY5MGUtMDcpLCBRVENGTExEKDMuOTc1MDI0ZS0wNSksIFFUQ0ZMTEQoMS44NDE3MzllLTAzKSwgUVRDRkxMRCgxLjU3MjI4MWUtMDIpLCBRVENGTExEKDYuMDEzODM2ZS0wMSksCitRVENGTExEKDYuNTY4ODY4ZS0wNyksIFFUQ0ZMTEQoOC4xODEwNzRlLTA1KSwgUVRDRkxMRCgxLjM1MTY1MWUtMDMpLCBRVENGTExEKC0yLjU1Njk3MGUtMDMpLCBRVENGTExEKDUuNjgxMzkzZS0wMSksCitRVENGTExEKC01LjY5MDIyOGUtMDYpLCBRVENGTExEKDkuMTI2MDk4ZS0wNSksIFFUQ0ZMTEQoNy41NzAyODZlLTA0KSwgUVRDRkxMRCgtMi4yMTg5MDRlLTAyKSwgUVRDRkxMRCg1LjM0NzI3MmUtMDEpLAorUVRDRkxMRCgxLjg4NDM4OWUtMDUpLCBRVENGTExEKC0yLjcwNTQ0NmUtMDQpLCBRVENGTExEKDUuMzM3MTQ0ZS0wNCksIFFUQ0ZMTEQoLTQuMzE3NDY3ZS0wMiksIFFUQ0ZMTEQoNS4wMTE1OTNlLTAxKSwKK1FUQ0ZMTEQoLTEuMzI5MjUyZS0wNiksIFFUQ0ZMTEQoLTcuMTk4NjYwZS0wNSksIFFUQ0ZMTEQoMi45NDEyOTZlLTA1KSwgUVRDRkxMRCgtNi41NDcwNDllLTAyKSwgUVRDRkxMRCg0LjY3NDE2OGUtMDEpLAorUVRDRkxMRCgtMS4zNTU1MjRlLTA3KSwgUVRDRkxMRCg1Ljk0MjQ3MmUtMDUpLCBRVENGTExEKC00LjQ2ODY1N2UtMDQpLCBRVENGTExEKC04LjkwMjUzNWUtMDIpLCBRVENGTExEKDQuMzM1MDc5ZS0wMSksCitRVENGTExEKDEuMDQxNjMxZS0wNSksIFFUQ0ZMTEQoNi4wOTE4NTNlLTA1KSwgUVRDRkxMRCgtOC43MDQwNDdlLTA0KSwgUVRDRkxMRCgtMS4xMzgxMzBlLTAxKSwgUVRDRkxMRCgzLjk5NTIwMGUtMDEpLAorUVRDRkxMRCgtMS4xNzA5MTFlLTA1KSwgUVRDRkxMRCgtMi42MjM4MzNlLTA1KSwgUVRDRkxMRCgtMS4yMDc1NzBlLTAzKSwgUVRDRkxMRCgtMS4zOTc5NjdlLTAxKSwgUVRDRkxMRCgzLjY1NjA4NmUtMDEpLAorUVRDRkxMRCgtMS4zNjQwNzllLTA2KSwgUVRDRkxMRCg4LjA5NzE3M2UtMDYpLCBRVENGTExEKC0xLjU4OTg1MmUtMDMpLCBRVENGTExEKC0xLjY2OTMwMmUtMDEpLCBRVENGTExEKDMuMzE5MTg3ZS0wMSksCitRVENGTExEKC01LjM0MjI2MmUtMDcpLCBRVENGTExEKDMuMDA1ODU4ZS0wNSksIFFUQ0ZMTEQoLTIuMDM4NjEyZS0wMyksIFFUQ0ZMTEQoLTEuOTUxNjMwZS0wMSksIFFUQ0ZMTEQoMi45ODQ4MzllLTAxKSwKK1FUQ0ZMTEQoLTEuMDk5MzIwZS0wNiksIFFUQ0ZMTEQoOC45Nzc4NzFlLTA1KSwgUVRDRkxMRCgtMi41MjUxMTFlLTAzKSwgUVRDRkxMRCgtMi4yNDQzNzFlLTAxKSwgUVRDRkxMRCgyLjY1MTU3N2UtMDEpLAorUVRDRkxMRCgtNy4xMjE1ODdlLTA3KSwgUVRDRkxMRCgxLjg0ODE1MGUtMDQpLCBRVENGTExEKC0zLjA2ODEyNmUtMDMpLCBRVENGTExEKC0yLjU0NjkyNGUtMDEpLCBRVENGTExEKDIuMzE2NTIzZS0wMSksCitRVENGTExEKC05LjYxNzE5OWUtMDcpLCBRVENGTExEKDIuNDMzNzk0ZS0wNCksIFFUQ0ZMTEQoLTMuNjU4NTcyZS0wMyksIFFUQ0ZMTEQoLTIuODU4NjgxZS0wMSksIFFUQ0ZMTEQoMS45NzcwOThlLTAxKSwKK1FUQ0ZMTEQoLTEuODQ4NDY0ZS0wNiksIFFUQ0ZMTEQoMi44NTcwNTdlLTA0KSwgUVRDRkxMRCgtNC4yOTEzMTZlLTAzKSwgUVRDRkxMRCgtMy4xNzg5MjhlLTAxKSwgUVRDRkxMRCgxLjYzMzU5NGUtMDEpLAorUVRDRkxMRCgxLjUwOTAwNGUtMDUpLCBRVENGTExEKDcuMDI2NzU4ZS0wNCksIFFUQ0ZMTEQoLTQuOTA5MDIxZS0wMyksIFFUQ0ZMTEQoLTMuNTA2Nzg0ZS0wMSksIFFUQ0ZMTEQoMS4yOTE1MzdlLTAxKSwKK1FUQ0ZMTEQoLTIuOTAxNDIyZS0wNiksIFFUQ0ZMTEQoOS43ODQzODFlLTA0KSwgUVRDRkxMRCgtNS41Njc4MzdlLTAzKSwgUVRDRkxMRCgtMy44NDExMTZlLTAxKSwgUVRDRkxMRCg5LjYyNTAzOGUtMDIpLAorUVRDRkxMRCgtMi4wMzUxNDBlLTA1KSwgUVRDRkxMRCgxLjEwNTk2NmUtMDMpLCBRVENGTExEKC02LjMwNDg0MWUtMDMpLCBRVENGTExEKC00LjE4MDU1NWUtMDEpLCBRVENGTExEKDYuNjIyMzI4ZS0wMiksCitRVENGTExEKC0zLjA3NzE0NmUtMDUpLCBRVENGTExEKDEuMjAxODE0ZS0wMyksIFFUQ0ZMTEQoLTcuMTUyODQyZS0wMyksIFFUQ0ZMTEQoLTQuNTIzNjgwZS0wMSksIFFUQ0ZMTEQoNC4wNDI3MDdlLTAyKSwKK1FUQ0ZMTEQoLTMuODM2MTUzZS0wNSksIFFUQ0ZMTEQoMS4yNzU2OTRlLTAzKSwgUVRDRkxMRCgtOC4xNDIwNzFlLTAzKSwgUVRDRkxMRCgtNC44Njk0MTNlLTAxKSwgUVRDRkxMRCgxLjc0MTMyMGUtMDIpLAorfTsKKworCisKKworCisKKy8vQHsKKy8qIQorICBcbmFtZSBEQ1RfSUkgdHdpZGRsZSBmYWN0b3JzLCBMPTY0CisqLworLyohIHNpbiAoMy4xNDE1OTI2NTM1ODk3OTMyMyAvICgyKkwpICogbikgLCBMPTY0Ki8KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorUkFNX0FMSUdOCitjb25zdCBGSVhQX1dUUCBzaW5fdHdpZGRsZV9MNjRbXT0KK3sKKyAgV1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgV1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwKKyAgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgV1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgV1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwKKyAgV1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgV1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwKKyAgV1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgV1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwKKyAgV1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgV1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgV1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwKKyAgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgV1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwKKyAgV1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgV1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwKKyAgV1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgV1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgV1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwKKyAgV1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKQorICAsIFdUQ1AoMHg1ODQyZGQ1NCwgMHg1Y2I0MjBlMCksIFdUQ1AoMHg1NWY1YTRkMiwgMHg1ZWQ3N2M4YSksIFdUQ1AoMHg1MzliMmFmMCwgMHg2MGVjMzgzMCksCisgIFdUQ1AoMHg1MTMzY2M5NCwgMHg2MmYyMDFhYyksIFdUQ1AoMHg0ZWJmZThhNSwgMHg2NGU4ODkyNiksIFdUQ1AoMHg0YzNmZGZmNCwgMHg2NmNmODEyMCksIFdUQ1AoMHg0OWI0MTUzMywgMHg2OGE2OWU4MSksCisgIFdUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFdUQ1AoMHg0NDdhY2Q1MCwgMHg2YzI0Mjk2MCksIFdUQ1AoMHg0MWNlMWU2NSwgMHg2ZGNhMGQxNCksIFdUQ1AoMHgzZjE3NDliOCwgMHg2ZjVmMDJiMiksCisgIFdUQ1AoMHgzYzU2YmE3MCwgMHg3MGUyY2JjNiksIFdUQ1AoMHgzOThjZGQzMiwgMHg3MjU1MmM4NSksIFdUQ1AoMHgzNmJhMjAxNCwgMHg3M2I1ZWJkMSksIFdUQ1AoMHgzM2RlZjI4NywgMHg3NTA0ZDM0NSksCisgIFdUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCksIFdUQ1AoMHgyZTExMGE2MiwgMHg3NzZjNGVkYiksIFdUQ1AoMHgyYjFmMzRlYiwgMHg3ODg0ODQxNCksIFdUQ1AoMHgyODI2YjkyOCwgMHg3OThhMjNiMSksCisgIFdUQ1AoMHgyNTI4MGM1ZSwgMHg3YTdkMDU1YiksIFdUQ1AoMHgyMjIzYTRjNSwgMHg3YjVkMDM5ZSksIFdUQ1AoMHgxZjE5Zjk3YiwgMHg3YzI5ZmJlZSksIFdUQ1AoMHgxYzBiODI2YSwgMHg3Y2UzY2ViMiksCisgIFdUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCksIFdUQ1AoMHgxNWUyMTQ0NSwgMHg3ZTFkOTNlYSksIFdUQ1AoMHgxMmM4MTA2ZiwgMHg3ZTlkNTVmYyksIFdUQ1AoMHgwZmFiMjcyYiwgMHg3ZjA5OTFjNCksCisgIFdUQ1AoMHgwYzhiZDM1ZSwgMHg3ZjYyMzY4ZiksIFdUQ1AoMHgwOTZhOTA0OSwgMHg3ZmE3MzZiNCksIFdUQ1AoMHgwNjQ3ZDk3YywgMHg3ZmQ4ODc4ZSksIFdUQ1AoMHgwMzI0MmFiZiwgMHg3ZmY2MjE4MikKK307CisKK0xOS19TRUNUSU9OX0NPTlNUREFUQQorUkFNX0FMSUdOCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NjRbXSA9Cit7CisgIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFdUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFdUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksIFdUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksCisgIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksIFdUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFdUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksCisgIFdUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksIFdUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFdUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksCisgIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFdUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFdUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksIFdUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksCisgIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksIFdUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFdUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksCisgIFdUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksIFdUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFdUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksCisgIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFdUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFdUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksIFdUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksCisgIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksIFdUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFdUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksCit9OworCisKK0xOS19TRUNUSU9OX0NPTlNUREFUQQorUkFNX0FMSUdOCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MzJbXSA9Cit7CisgIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFdUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksCisgIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksCisgIFdUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksCisgIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFdUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksCit9OworCisKKworCisKKworCisKK2NvbnN0IFVTSE9SVCBzcXJ0X3RhYls0OV09eworMHg1YTgyLCAweDVkNGIsIDB4NjAwMCwgMHg2MmExLAorMHg2NTMxLCAweDY3YjEsIDB4NmEyMSwgMHg2Yzg0LAorMHg2ZWQ5LCAweDcxMjMsIDB4NzM2MCwgMHg3NTkzLAorMHg3N2JiLCAweDc5ZGEsIDB4N2JlZiwgMHg3ZGZiLAorMHg4MDAwLCAweDgxZmMsIDB4ODNmMCwgMHg4NWRkLAorMHg4N2MzLCAweDg5YTMsIDB4OGI3YywgMHg4ZDRlLAorMHg4ZjFiLCAweDkwZTIsIDB4OTJhNCwgMHg5NDYwLAorMHg5NjE3LCAweDk3Y2EsIDB4OTk3NywgMHg5YjIwLAorMHg5Y2M0LCAweDllNjQsIDB4YTAwMCwgMHhhMTk3LAorMHhhMzJiLCAweGE0YmEsIDB4YTY0NiwgMHhhN2NmLAorMHhhOTUzLCAweGFhZDUsIDB4YWM1MywgMHhhZGNkLAorMHhhZjQ1LCAweGIwYjksIDB4YjIyYiwgMHhiMzk5LAorMHhiNTA0fTsKKworTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs1MF09ICAvKiBUaGlzIGNvdWxkIGJlIDE2LWJpdCB3aWRlICovCit7CisgICAgMHgwMDAwMDAwMCwgMHg3ZmZmZmZmZiwgMHg0MDAwMDAwMCwgMHgyYWFhYWFhYiwgMHgyMDAwMDAwMCwKKyAgICAweDE5OTk5OTlhLCAweDE1NTU1NTU1LCAweDEyNDkyNDkyLCAweDEwMDAwMDAwLCAweDBlMzhlMzhlLAorICAgIDB4MGNjY2NjY2QsIDB4MGJhMmU4YmEsIDB4MGFhYWFhYWIsIDB4MDlkODlkOGEsIDB4MDkyNDkyNDksCisgICAgMHgwODg4ODg4OSwgMHgwODAwMDAwMCwgMHgwNzg3ODc4OCwgMHgwNzFjNzFjNywgMHgwNmJjYTFhZiwKKyAgICAweDA2NjY2NjY2LCAweDA2MTg2MTg2LCAweDA1ZDE3NDVkLCAweDA1OTBiMjE2LCAweDA1NTU1NTU1LAorICAgIDB4MDUxZWI4NTIsIDB4MDRlYzRlYzUsIDB4MDRiZGExMmYsIDB4MDQ5MjQ5MjUsIDB4MDQ2OWVlNTgsCisgICAgMHgwNDQ0NDQ0NCwgMHgwNDIxMDg0MiwgMHgwNDAwMDAwMCwgMHgwM2UwZjgzZSwgMHgwM2MzYzNjNCwKKyAgICAweDAzYTgzYTg0LCAweDAzOGUzOGU0LCAweDAzNzU5ZjIzLCAweDAzNWU1MGQ4LCAweDAzNDgzNDgzLAorICAgIDB4MDMzMzMzMzMsIDB4MDMxZjM4MzIsIDB4MDMwYzMwYzMsIDB4MDJmYTBiZTgsIDB4MDJlOGJhMmYsCisgICAgMHgwMmQ4MmQ4MywgMHgwMmM4NTkwYiwgMHgwMmI5MzEwNSwgMHgwMmFhYWFhYiwgMHgwMjljYmMxNQorfTsKKworCisvKgorICogQml0c3RyZWFtIGRhdGEgbGlzdHMKKyAqLworCisvKgorICogQU9UIHsyLDUsMjl9CisgKiBlcENvbmZpZyA9IC0xCisgKi8KKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19zY2VbXSA9IHsKKyAgYWR0c2NyY19zdGFydF9yZWcxLAorICBlbGVtZW50X2luc3RhbmNlX3RhZywKKyAgZ2xvYmFsX2dhaW4sCisgIGljc19pbmZvLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBwdWxzZSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgdG5zX2RhdGEsCisgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgIC8qIGdhaW5fY29udHJvbF9kYXRhLCAqLworICBzcGVjdHJhbF9kYXRhLAorICBhZHRzY3JjX2VuZF9yZWcxLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX3NjZSA9IHsKKyAgZWxfYWFjX3NjZSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlW10gPSB7CisgIGFkdHNjcmNfc3RhcnRfcmVnMSwKKyAgZWxlbWVudF9pbnN0YW5jZV90YWcsCisgIGNvbW1vbl93aW5kb3csCisgIGxpbmtfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMFtdID0KK3sKKyAgLypjb21tb25fd2luZG93ID0gMCovCisgIGdsb2JhbF9nYWluLAorICBpY3NfaW5mbywKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKworICBhZHRzY3JjX3N0YXJ0X3JlZzIsCisgIGdsb2JhbF9nYWluLAorICBpY3NfaW5mbywKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgIHNwZWN0cmFsX2RhdGEsCisgIGFkdHNjcmNfZW5kX3JlZzEsCisgIGFkdHNjcmNfZW5kX3JlZzIsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUxW10gPQoreworICAvKiBjb21tb25fd2luZG93ID0gMSAqLworICBpY3NfaW5mbywKKyAgbXMsCisKKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHB1bHNlLAorICB0bnNfZGF0YV9wcmVzZW50LAorICB0bnNfZGF0YSwKKyAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICBzcGVjdHJhbF9kYXRhLAorICBuZXh0X2NoYW5uZWwsCisKKyAgYWR0c2NyY19zdGFydF9yZWcyLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgIHNwZWN0cmFsX2RhdGEsCisgIGFkdHNjcmNfZW5kX3JlZzEsCisgIGFkdHNjcmNfZW5kX3JlZzIsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMCA9IHsKKyAgZWxfYWFjX2NwZTAsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxID0geworICBlbF9hYWNfY3BlMSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBlbGVtZW50X2xpc3RfdCBub2RlX2FhY19jcGUgPSB7CisgIGVsX2FhY19jcGUsCisgIHsgJm5vZGVfYWFjX2NwZTAsICZub2RlX2FhY19jcGUxIH0KK307CisKKyNkZWZpbmUgZWxfbXBlZ3NyZXNfc2NlICZlbF9hYWNfc2NlWzJdCisKK3N0YXRpYyBjb25zdCBlbGVtZW50X2xpc3RfdCBub2RlX21wZWdzcmVzX3NjZSA9IHsKKyAgZWxfbXBlZ3NyZXNfc2NlLAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGVsZW1lbnRfbGlzdF90IG5vZGVfbXBlZ3NyZXNfY3BlID0geworICBlbF9hYWNfY3BlMSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKKworLyoKKyAqIEFPVCBDLSB7MTcsMjN9CisgKiBlcENvbmZpZyA9IDAsMQorICovCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX3NjZV9lcGMwW10gPSB7CisgIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAorICBnbG9iYWxfZ2FpbiwKKyAgaWNzX2luZm8sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHB1bHNlLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICBnYWluX2NvbnRyb2xfZGF0YSwKKyAgZXNjMV9oY3IsICAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgdG5zX2RhdGEsCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzAgPSB7CisgIGVsX2FhY19zY2VfZXBjMCwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfc2NlX2VwYzFbXSA9IHsKKyAgZWxlbWVudF9pbnN0YW5jZV90YWcsCisgIGdsb2JhbF9nYWluLAorICBpY3NfaW5mbywKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgZXNjMV9oY3IsICAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgdG5zX2RhdGEsCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzEgPSB7CisgIGVsX2FhY19zY2VfZXBjMSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMF9lcGMwW10gPSB7CisgIC8qIGNvbW1vbl93aW5kb3cgPSAwICovCisgIC8qIEVTQyAxOiAqLworICBnbG9iYWxfZ2FpbiwKKyAgaWNzX2luZm8sCisgIC8qIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgIGx0cF9kYXRhLAorICAqLworICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBwdWxzZSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgLyogRVNDIDI6ICovCisgIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgIC8qIEVTQyAzOiAqLworICB0bnNfZGF0YSwKKyAgLyogRVNDIDQ6ICovCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKworICAvKiBFU0MgMTogKi8KKyAgZ2xvYmFsX2dhaW4sCisgIGljc19pbmZvLAorICAvKiBsdHBfZGF0YV9wcmVzZW50LAorICAgICBsdHBfZGF0YSwKKyAgKi8KKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgZXNjMV9oY3IsICAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICAvKiBFU0MgMjogKi8KKyAgZXNjMl9ydmxjLCAgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgIC8qIEVTQyAzOiAqLworICB0bnNfZGF0YSwKKyAgLyogRVNDIDQ6ICovCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUxX2VwYzBbXSA9IHsKKyAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KKyAgLyogRVNDIDA6ICovCisgIGljc19pbmZvLAorICAvKiBsdHBfZGF0YV9wcmVzZW50LAorICAgICBsdHBfZGF0YSwKKyAgICAgbmV4dF9jaGFubmVsLAorICAgICBsdHBfZGF0YV9wcmVzZW50LAorICAgICBsdHBfZGF0YSwKKyAgICAgbmV4dF9jaGFubmVsLAorICAqLworICBtcywKKworICAvKiBFU0MgMTogKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHB1bHNlLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgIGVzYzFfaGNyLCAgIC8qIGxlbmd0aF9vZl9yZW9yZGVyZWRfc3BlY3RyYWxfZGF0YSwgbGVuZ3RoX29mX2xvbmdlc3RfY29kZXdvcmQgKi8KKyAgLyogRVNDIDI6ICovCisgIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAvKiBFU0MgMzogKi8KKyAgdG5zX2RhdGEsCisgIC8qIEVTQyA0OiAqLworICBzcGVjdHJhbF9kYXRhLAorICBuZXh0X2NoYW5uZWwsCisKKyAgLyogRVNDIDE6ICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBwdWxzZSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICBlc2MxX2hjciwgICAvKiBsZW5ndGhfb2ZfcmVvcmRlcmVkX3NwZWN0cmFsX2RhdGEsIGxlbmd0aF9vZl9sb25nZXN0X2NvZGV3b3JkICovCisgIC8qIEVTQyAyOiAqLworICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgLyogRVNDIDM6ICovCisgIHRuc19kYXRhLAorICAvKiBFU0MgNDogKi8KKyAgc3BlY3RyYWxfZGF0YSwKKyAgZW5kX29mX3NlcXVlbmNlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUwX2VwYzAgPSB7CisgIGVsX2FhY19jcGUwX2VwYzAsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxX2VwYzAgPSB7CisgIGVsX2FhY19jcGUxX2VwYzAsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgZWxlbWVudF9saXN0X3Qgbm9kZV9hYWNfY3BlX2VwYzAgPSB7CisgIGVsX2FhY19jcGUsCisgIHsgJm5vZGVfYWFjX2NwZTBfZXBjMCwgJm5vZGVfYWFjX2NwZTFfZXBjMCB9Cit9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTBfZXBjMVtdID0geworICBnbG9iYWxfZ2FpbiwKKyAgaWNzX2luZm8sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHB1bHNlLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgIG5leHRfY2hhbm5lbCwKKyAgZ2xvYmFsX2dhaW4sCisgIGljc19pbmZvLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBwdWxzZSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICBuZXh0X2NoYW5uZWwsCisgIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICBuZXh0X2NoYW5uZWwsCisgIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICBuZXh0X2NoYW5uZWwsCisgIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICBuZXh0X2NoYW5uZWwsCisgIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKyAgc3BlY3RyYWxfZGF0YSwKKyAgZW5kX29mX3NlcXVlbmNlCit9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTFfZXBjMVtdID0geworICBpY3NfaW5mbywKKyAgbXMsCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgbmV4dF9jaGFubmVsLAorCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgcHVsc2UsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgbmV4dF9jaGFubmVsLAorICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgbmV4dF9jaGFubmVsLAorICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgbmV4dF9jaGFubmVsLAorICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgbmV4dF9jaGFubmVsLAorICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKworICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKyAgc3BlY3RyYWxfZGF0YSwKKyAgZW5kX29mX3NlcXVlbmNlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUwX2VwYzEgPSB7CisgIGVsX2FhY19jcGUwX2VwYzEsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxX2VwYzEgPSB7CisgIGVsX2FhY19jcGUxX2VwYzEsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgZWxlbWVudF9saXN0X3Qgbm9kZV9hYWNfY3BlX2VwYzEgPSB7CisgIGVsX2FhY19jcGUsCisgIHsgJm5vZGVfYWFjX2NwZTBfZXBjMSwgJm5vZGVfYWFjX2NwZTFfZXBjMSB9Cit9OworCisKKworLyoKKyAqIEFPVCA9IDM5CisgKiBlcENvbmZpZyA9IDAKKyAqLworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2VsZF9zY2VfZXBjMFtdID0geworICBnbG9iYWxfZ2FpbiwKKyAgaWNzX2luZm8sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBlc2MxX2hjciwKKyAgZXNjMl9ydmxjLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX3NjZV9lcGMwID0geworICBlbF9lbGRfc2NlX2VwYzAsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCisjZGVmaW5lIG5vZGVfZWxkX3NjZV9lcGMxIG5vZGVfZWxkX3NjZV9lcGMwCisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9lbGRfY3BlX2VwYzBbXSA9IHsKKyAgaWNzX2luZm8sCisgIG1zLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgdG5zX2RhdGEsCisgIGVzYzFfaGNyLAorICBlc2MyX3J2bGMsCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIHRuc19kYXRhLAorICBlc2MxX2hjciwKKyAgZXNjMl9ydmxjLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9lbGRfY3BlX2VwYzFbXSA9IHsKKyAgaWNzX2luZm8sCisgIG1zLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbmV4dF9jaGFubmVsLAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YSwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YSwKKyAgbmV4dF9jaGFubmVsLAorICBlc2MxX2hjciwKKyAgZXNjMl9ydmxjLAorICBzcGVjdHJhbF9kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIGVzYzFfaGNyLAorICBlc2MyX3J2bGMsCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9lbGRfY3BlX2VwYzAgPSB7CisgIGVsX2VsZF9jcGVfZXBjMCwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX2NwZV9lcGMxID0geworICBlbF9lbGRfY3BlX2VwYzEsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCisKK2NvbnN0IGVsZW1lbnRfbGlzdF90ICogZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTQ0hBUiBlcENvbmZpZywgVUNIQVIgbkNoYW5uZWxzLCBVQ0hBUiBsYXllcikKK3sKKyAgc3dpdGNoIChhb3QpIHsKKyAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgY2FzZSBBT1RfU0JSOgorICAgIGNhc2UgQU9UX1BTOgorICAgICAgRkRLX0FTU0VSVChlcENvbmZpZyA9PSAtMSk7CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgcmV0dXJuICZub2RlX2FhY19zY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJm5vZGVfYWFjX2NwZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgaWYgKGVwQ29uZmlnID09IDApIHsKKyAgICAgICAgICByZXR1cm4gJm5vZGVfYWFjX3NjZV9lcGMwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAmbm9kZV9hYWNfc2NlX2VwYzE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcENvbmZpZyA9PSAwKQorICAgICAgICAgIHJldHVybiAmbm9kZV9hYWNfY3BlX2VwYzA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gJm5vZGVfYWFjX2NwZV9lcGMxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICBpZiAoZXBDb25maWcgPD0gMCkKKyAgICAgICAgICByZXR1cm4gJm5vZGVfZWxkX3NjZV9lcGMwOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICZub2RlX2VsZF9zY2VfZXBjMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQorICAgICAgICAgIHJldHVybiAmbm9kZV9lbGRfY3BlX2VwYzA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gJm5vZGVfZWxkX2NwZV9lcGMxOworICAgICAgfQorICAgIGNhc2UgQU9UX01QRUdTX1JFU0lEVUFMUzoKKyAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICByZXR1cm4gJm5vZGVfbXBlZ3NyZXNfc2NlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICZub2RlX21wZWdzcmVzX2NwZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9GREtfdHJpZ0ZjdHMuY3BwIGIvYWFjL2xpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNhMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcApAQCAtMCwwICsxLDMzMCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSGFyaWNoYXJhbiBMYWtzaG1hbiwgTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIGZpeGVkIHBvaW50IGZyYWN0aW9uYWwgaW1wbGVtZW50YXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgorCisjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgorCisKKworCisjZGVmaW5lIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kgIDEgIC8vIDAgLS0+IDU5IGRCIFNOUiAgICAgMSAtLT4gNjUgZEIgU05SCisjZGVmaW5lIE1JTlNGVEFCICA3CisjZGVmaW5lIE1BWFNGVEFCIDI1CisKKyNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZl9hdGFuX2V4cGFuZF9yYW5nZVtNQVhTRlRBQi0oTUlOU0ZUQUItMSldICA9Cit7CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgVGFibGUgaG9sZHMgZml4cF9hdGFuKCkgb3V0cHV0IHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSBvZiBpbnB1dCByYW5nZQorICAgKiAgb2YgZml4cF9hdGFuKCkgdG8gaW1wcm92ZSBTTlIgb2YgZml4cF9hdGFuMigpLgorICAgKgorICAgKiAgVGhpcyBUYWJsZSBtaWdodCBhbHNvIGJlIHVzZWQgaW4gZml4cF9hdGFuKCkgW3RvZG9dIHNvIHRoZXJlIGEgd2lkZXIgaW5wdXQKKyAgICogIHJhbmdlIGNhbiBiZSBjb3ZlcmVkLCB0b28uCisgICAqCisgICAqICBNYXRsYWIgKGdlbmVyYXRlIHRhYmxlKToKKyAgICogICAgZm9yIHNjbCA9IDc6MjUgICAgICAgICAgICAlIE1JTlNGVEFCIC4uIE1BWFNGVEFCCisgICAqICAgICAgYXQ9YXRhbigwLjUgKigyXnNjbCkpOyAgJSAwLjUgYmVjYXVzZSBnZXQgaW4gJ21pZGRsZScgYXJlYSBvZiBjdXJyZW50IHNjYWxlIGxldmVsICdzY2wnCisgICAqICAgICAgYXQvMiAgICAgICAgICAgICAgICAgICAgJSBkaXYgYXQgYnkgQVRPX1NDQUxFCisgICAqICAgIGVuZAorICAgKgorICAgKiAgVGFibGUgZGl2aWRlZCBieSAyPUFUT19TQ0FMRSAgPC0tICBTRj1BVE9fU0YKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRkwyRlhDT05TVF9EQkwoNy43NzU4NjI5OTA4NzIwOTllLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODE0OTE5OTI4NjczOTc4ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3LjgzNDQ1MDQ4MzMxNDY0OGUtMDAxKSwKKyAgIEZMMkZYQ09OU1RfREJMKDcuODQ0MjE2MDIxMzkyMDg5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg0OTA5ODgyMzAyNjY4N2UtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTE1NDAyMjc5MTg1MDllLTAwMSksCisgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mjc2MDkzMDg3MzczN2UtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTMzNzEyODI0MTUwMTVlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzNjc2NDU4MTkzNjEyZS0wMDEpLAorICAgRkwyRlhDT05TVF9EQkwoNy44NTM4MjkwNDYwODM5MDZlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTA1MzQwMDI5MTc3ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk0MzQ4NzAwMTgyOGUtMDAxKSwKKyAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTYyNTYwNDg4MTU1ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3MjA5NzIzMTMxOWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5NzY4NjU2MDI5MDFlLTAwMSksCisgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3OTI0OTc4ODY5MmUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5ODA0NDE4ODE1ODdlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTgxMDM3OTI4MDM1ZS0wMDEpLAorICAgRkwyRlhDT05TVF9EQkwoNy44NTM5ODEzMzU5NTEyNTllLTAwMSkKKyAgIC8vICAgICBwaS80ID0gMC43ODUzOTgxNjMzOTc0NDggPSBwaS8yL0FUT19TQ0FMRQorfTsKKyNlbmRpZgorCitGSVhQX0RCTCBmaXhwX2F0YW4yKEZJWFBfREJMIHksIEZJWFBfREJMIHgpCit7CisgICAgRklYUF9EQkwgcTsKKyAgICBGSVhQX0RCTCBhdDsgIC8vIGF0YW4gIG91dAorICAgIEZJWFBfREJMIGF0MjsgLy8gYXRhbjIgb3V0CisgICAgRklYUF9EQkwgcmV0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIElOVCBzZixzZm8sc3RmOworCisgICAgLy8gLS0tIGRpdmlzaW9uCisKKyAgICBpZiAgICAgICh5ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgeworICAgICAgICBpZiAgICAgICh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gIGZEaXZOb3JtSGlnaFByZWMoIHksIHgsICZzZik7IC8vIGJvdGggcG9zLgorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAtZkRpdk5vcm1IaWdoUHJlYyggeSwteCwgJnNmKTsgLy8geCBuZWcuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7Ly8oeCA9PUZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAgRkwyRlhDT05TVF9EQkwoKzEuMGYpOyAgLy8geS94ID0gcG9zL3plcm8gPSArSW5mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHkgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICB7CisgICAgICAgIGlmICAgICAgKHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAtZkRpdk5vcm1IaWdoUHJlYygteSwgeCwgJnNmKTsgLy8geSBuZWcuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9ICBmRGl2Tm9ybUhpZ2hQcmVjKC15LC14LCAmc2YpOyAvLyBib3RoIG5lZy4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsvLyh4ID09RkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9ICBGTDJGWENPTlNUX0RCTCgtMS4wZik7ICAvLyB5L3ggPSBuZWcvemVybyA9IC1JbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7IC8vICh5ID09RkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgIHEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgc2YgPSAwOworICAgIH0KKyAgICBzZm8gPSBzZjsKKworICAgIC8vIC0tLSBhdGFuKCkKKworICAgIGlmICAoIHNmbyA+IEFUSV9TRiApIHsKKyAgICAgICAgLy8gLS0tIGNvdWxkIG5vdCBjYWxjIGZpeHBfYXRhbigpIGhlcmUgYmVjIG9mIGlucHV0IGRhdGEgb3V0IG9mIHJhbmdlCisgICAgICAgIC8vICAgICA9PT4gdGhlcmVmb3JlIGdpdmUgYmFjayBib3VuZGFyeSB2YWx1ZXMKKworICAgICAgICAjaWYgSU1QUk9WRV9BVEFOMl9BQ0NVUkFDWQorICAgICAgICBpZiAoc2ZvID4gTUFYU0ZUQUIpIHNmbyA9IE1BWFNGVEFCOworICAgICAgICAjZW5kaWYKKworICAgICAgICBpZiAgICAgICggIHEgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKKyAgICAgICAgICAgI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKKyAgICAgICAgICAgIGF0ID0gK2ZfYXRhbl9leHBhbmRfcmFuZ2Vbc2ZvLUFUSV9TRi0xXTsKKyAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGF0ID0gRkwyRlhDT05TVF9EQkwoICtNX1BJLzIgLyBBVE9fU0NBTEUpOworICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggIHEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKKyAgICAgICAgICAgI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKKyAgICAgICAgICAgIGF0ID0gLWZfYXRhbl9leHBhbmRfcmFuZ2Vbc2ZvLUFUSV9TRi0xXTsKKyAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGF0ID0gRkwyRlhDT05TVF9EQkwoIC1NX1BJLzIgLyBBVE9fU0NBTEUpOworICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgIC8vIHE9PSBGTDJGWENPTlNUX0RCTCgwLjBmKQorICAgICAgICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCggMC4wZiApOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIC8vIC0tLSBjYWxjIG9mIGZpeHBfYXRhbigpIGlzIHBvc3NpYmxlOyBpbnB1dCBkYXRhIHdpdGhpbiByYW5nZQorICAgICAgICAvLyAgICAgPT0+IHNldCBxIG9uIGZpeGVkIHNjYWxlIGxldmVsIGFzIGRlc2lyZWQgZnJvbSBmaXhwX2F0YW4oKQorICAgICAgICBzdGYgPSBzZm8gLSBBVElfU0Y7CisgICAgICAgIGlmIChzdGYgPiAwKSAgcSA9IHEgPDwgKElOVClmTWluKCBzdGYsREZSQUNUX0JJVFMtMSk7CisgICAgICAgIGVsc2UgICAgICAgICAgcSA9IHEgPj4gKElOVClmTWluKC1zdGYsREZSQUNUX0JJVFMtMSk7CisgICAgICAgIGF0ID0gZml4cF9hdGFuKHEpOyAgLy8gQVRPX1NGCisgICAgfQorCisgICAgLy8gLS0tIGF0YW4yKCkKKworICAgIGF0MiA9IGF0ID4+IChBVDJPX1NGIC0gQVRPX1NGKTsgLy8gbm93IEFUMk9fU0YgZm9yIGF0YW4yCisgICAgaWYgICAgICAoICB4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgICAgIHJldCA9IGF0MjsKKyAgICB9CisgICAgZWxzZSBpZiAoICB4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgICAgIGlmICggIHkgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgICAgICAgICByZXQgPSBhdDIgKyBGTDJGWENPTlNUX0RCTCggTV9QSSAvIEFUMk9fU0NBTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gYXQyIC0gRkwyRlhDT05TVF9EQkwoIE1fUEkgLyBBVDJPX1NDQUxFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8geCA9PSAwCisgICAgICAgIGlmICAgICAgKCB5ID4gIEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeworICAgICAgICAgICAgcmV0ID0gRkwyRlhDT05TVF9EQkwoICtNX1BJLzIgLyBBVDJPX1NDQUxFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggeSA8ICBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKKyAgICAgICAgICAgIHJldCA9IEZMMkZYQ09OU1RfREJMKCAtTV9QSS8yIC8gQVQyT19TQ0FMRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHkgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgICAgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK0ZJWFBfREJMIGZpeHBfYXRhbihGSVhQX0RCTCB4KQoreworICAgIElOVCBzaWduOworICAgIEZJWFBfREJMIHJlc3VsdCwgdGVtcDsKKworICAgIC8vIFNOUiBvZiBmaXhwX2F0YW4oKSA9IDU2IGRCCisgICAgRklYUF9EQkwgT05FQlkzUDU2ICA9IChGSVhQX0RCTCkweDI2ODAwMDAwOyAvLyAxLjAvMy41NiBpbiBxMzEKKyAgICBGSVhQX0RCTCBQMjgxICAgICAgID0gKEZJWFBfREJMKTB4MDAwMTMwMDA7IC8vIDAuMjgxIGluIHExOAorICAgIEZJWFBfREJMIE9ORVA1NzEgICAgPSAoRklYUF9EQkwpMHg2NDg3ZWYwMDsgLy8gMS41NzEgaW4gcTMwCisKKyAgICBpZiAoeCA8IEZJWFBfREJMKDApKSB7CisgICAgICBzaWduID0gMTsKKyAgICAgIHggPSAtIHggOworICAgIH0gZWxzZSB7CisgICAgICBzaWduID0gMDsKKyAgICB9CisKKyAgICAvKiBjYWxjIG9mIGFyY3RhbiAqLworICAgIGlmKHggPCAoIFEoUV9BVEFOSU5QKS1GTDJGWENPTlNUX0RCTCgwLjAwMzk1KSkgKQorICAgIHsKKyAgICAgICAgSU5UIHJlc19lOworCisgICAgICAgIHRlbXAgPSBmUG93Mih4KTsgICAgICAgICAgICAvLyBxMjUgKiBxMjUgLSAoREZSQUNUX0JJVFMtMSkgPSBxMTkKKyAgICAgICAgdGVtcCA9IGZNdWx0KHRlbXAsIE9ORUJZM1A1Nik7ICAgICAgLy8gcTE5ICogcTMxIC0gKERGUkFDVF9CSVRTLTEpID0gcTE5CisgICAgICAgIHRlbXAgPSB0ZW1wICsgUSgxOSk7ICAgICAgICAgICAgICAgIC8vIHExOSArIHExOSA9IHExOQorICAgICAgICByZXN1bHQgPSBmRGl2Tm9ybSh4LCB0ZW1wLCAmcmVzX2UpOworICAgICAgICByZXN1bHQgPSBzY2FsZVZhbHVlKHJlc3VsdCwgKFFfQVRBTk9VVC1RX0FUQU5JTlArMTktREZSQUNUX0JJVFMrMSkgKyByZXNfZSAgKTsKKyAgICB9CisgICAgZWxzZSBpZiggeCA8IEZMMkZYQ09OU1RfREJMKDEuMjgvNjQuMCkgKQorICAgIHsKKyAgICAgICAgRklYUF9EQkwgZGVsdGFfZml4OworICAgICAgICBGSVhQX0RCTCBQSV9CWV80ID0gRkwyRlhDT05TVF9EQkwoMy4xNDE1OTI2LzQuMCkgPj4gMTsgLyogcGkvNCBpbiBxMzAgKi8KKworICAgICAgICBkZWx0YV9maXggPSAoeCAtIEZMMkZYQ09OU1RfREJMKDEuMC82NC4wKSkgPDwgNTsgLyogcTMwICovCisgICAgICAgIHJlc3VsdCA9IFBJX0JZXzQgKyAoZGVsdGFfZml4ID4+IDEpIC0gKGZQb3cyRGl2MihkZWx0YV9maXgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgSU5UIHJlc19lOworCisgICAgICAgIHRlbXAgPSBmUG93MkRpdjIoeCk7ICAgICAgICAvLyBxMjUgKiBxMjUgLSAoREZSQUNUX0JJVFMtMSkgLSAxID0gcTE4CisgICAgICAgIHRlbXAgPSB0ZW1wICsgUDI4MTsgICAgICAgICAgICAgICAgIC8vIHExOCArIHExOCA9IHExOAorICAgICAgICByZXN1bHQgPSBmRGl2Tm9ybSh4LCB0ZW1wLCAmcmVzX2UpOworICAgICAgICByZXN1bHQgPSBzY2FsZVZhbHVlKHJlc3VsdCwgKFFfQVRBTk9VVC1RX0FUQU5JTlArMTgtREZSQUNUX0JJVFMrMSkgKyByZXNfZSApOworICAgICAgICByZXN1bHQgPSBPTkVQNTcxIC0gcmVzdWx0OyAgICAgICAgICAvLyBxMzAgKyBxMzAgPSBxMzAKKyAgICB9CisgICAgaWYgKHNpZ24pIHsKKyAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuKHJlc3VsdCk7Cit9CisKKworCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCitGSVhQX0RCTCBmaXhwX2NvcyhGSVhQX0RCTCB4LCBpbnQgc2NhbGUpCit7CisgICAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yLCBzaW5lLCBjb3NpbmU7CisgICAgCisgICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgICAgZXJyb3IgPSBmTXVsdChzaW5lLCByZXNpZHVhbCk7CisKKyAgICByZXR1cm4gY29zaW5lIC0gZXJyb3I7Cit9CisKK0ZJWFBfREJMIGZpeHBfc2luKEZJWFBfREJMIHgsIGludCBzY2FsZSkKK3sKKyAgICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IsIHNpbmUsIGNvc2luZTsKKyAgICAKKyAgICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeCwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgICBlcnJvciA9IGZNdWx0KGNvc2luZSwgcmVzaWR1YWwpOworCisgICAgcmV0dXJuIHNpbmUgKyBlcnJvcjsKK30KKwordm9pZCBmaXhwX2Nvc19zaW4gKEZJWFBfREJMIHgsIGludCBzY2FsZSwgRklYUF9EQkwgKmNvcywgRklYUF9EQkwgKnNpbikKK3sKKyAgICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IwLCBlcnJvcjEsIHNpbmUsIGNvc2luZTsKKyAgICAKKyAgICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeCwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgICBlcnJvcjAgPSBmTXVsdChzaW5lLCByZXNpZHVhbCk7CisgICAgZXJyb3IxID0gZk11bHQoY29zaW5lLCByZXNpZHVhbCk7CisgICAgKmNvcyAgPSBjb3NpbmUgLSBlcnJvcjA7CisgICAgKnNpbiAgPSBzaW5lICsgZXJyb3IxOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL2FybS9hdXRvY29ycjJuZC5jcHAgYi9hYWMvbGliRkRLL3NyYy9hcm0vYXV0b2NvcnIybmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzZlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9hcm0vYXV0b2NvcnIybmQuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIHNlY29uZCBvcmRlciBhdXRvY29ycmVsYXRpb24KKyAqCisgKi8KKworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9hcm0vZGN0X2FybS5jcHAgYi9hYWMvbGliRkRLL3NyYy9hcm0vZGN0X2FybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliNzczZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL2FybS9kY3RfYXJtLmNwcApAQCAtMCwwICsxLDQ1NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworCisjaWZkZWYgRlVOQ1RJT05fZGN0X0lWX2Z1bmMxCisKKy8qCisgICBOb3RlOiBUaGlzIGFzc2VtYmxlciByb3V0aW5lIGlzIGhlcmUsIGJlY2F1c2UgdGhlIEFSTTkyNiBjb21waWxlciBkb2VzCisgICAgICAgICBub3QgZW5jb2RlIHRoZSBpbmxpbmUgYXNzZW1ibGVyIHdpdGggb3B0aW1hbCBzcGVlZC4KKyAgICAgICAgIFdpdGggdGhpcyB2ZXJzaW9uLCB3ZSBzYXZlIDIgY3ljbGVzIHBlciBsb29wIGl0ZXJhdGlvbi4KKyovCisKK19fYXNtICB2b2lkIGRjdF9JVl9mdW5jMSgKKyAgICBpbnQgaSwKKyAgICBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEpCit7CisgICAgLyogUmVnaXN0ZXIgbWFwOgorICAgICAgIHIwICAgaQorICAgICAgIHIxICAgdHdpZGRsZQorICAgICAgIHIyICAgcERhdF8wCisgICAgICAgcjMgICBwRGF0XzEKKyAgICAgICByNCAgIGFjY3UxCisgICAgICAgcjUgICBhY2N1MgorICAgICAgIHI2ICAgYWNjdTMKKyAgICAgICByNyAgIGFjY3U0CisgICAgICAgcjggICB2YWxfdHcKKyAgICAgICByOSAgIGFjY3VYCisgICAgKi8KKyAgICBQVVNIICAgIHtyNC1yOX0KKworICAgICAvKiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KK2RjdF9JVl9sb29wMV9zdGFydAorLyogIEZpcnN0IGl0ZXJhdGlvbiAqLworICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKys7CisgICAgTERSICAgICByNSwgW3IyLCAjMF0gICAgLy8gYWNjdTIgPSBwRGF0XzBbMF0KKyAgICBMRFIgICAgIHI0LCBbcjMsICMwXSAgICAvLyBhY2N1MSA9IHBEYXRfMVswXQorCisgICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgLy8gYWNjdVggPSBhY2N1Mip2YWxfdHcubAorICAgIFNNVUxXQiAgcjUsIHI1LCByOCAgICAgIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmgKKyAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAvLyBhY2N1WCA9LWFjY3UyKnZhbF90dy5sCisgICAgU01MQVdUICByNSwgcjQsIHI4LCByNSAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaCArIGFjY3UxKnZhbF90dy5sCisgICAgU01MQVdCICByNCwgcjQsIHI4LCByOSAgLy8gYWNjdTEgPSBhY2N1MSp2YWxfdHcuaCAtIGFjY3UyKnZhbF90dy5sCisKKyAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOworICAgIExEUiAgICAgcjcsIFtyMywgIy00XSAgIC8vIGFjY3U0ID0gcERhdF8xWy0xXQorICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgIC8vIGFjY3UzID0gcERhdF8wWzFdCisKKyAgICBTTVVMV0IgIHI5LCByNywgcjggICAgICAvLyBhY2N1WCA9IGFjY3U0KnZhbF90dy5oCisgICAgU01VTFdUICByNywgcjcsIHI4ICAgICAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubAorICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgIC8vIGFjY3VYID0tYWNjdTQqdmFsX3R3LmgKKyAgICBTTUxBV0IgIHI3LCByNiwgcjgsIHI3ICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sK2FjY3UzKnZhbF90dy5oCisgICAgU01MQVdUICByNiwgcjYsIHI4LCByOSAgLy8gYWNjdTMgPSBhY2N1Myp2YWxfdHcubC1hY2N1NCp2YWxfdHcuaAorCisgICAgU1RSICAgICByNSwgW3IyXSwgIzQgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKKyAgICBTVFIgICAgIHI0LCBbcjJdLCAjNCAgICAvLyAqcERhdF8wKysgPSBhY2N1MQorICAgIFNUUiAgICAgcjYsIFtyM10sICMtNCAgIC8vICpwRGF0XzEtLSA9IGFjY3UzCisgICAgU1RSICAgICByNywgW3IzXSwgIy00ICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKworLyogIFNlY29uZCBpdGVyYXRpb24gKi8KKyAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOworICAgIExEUiAgICAgcjUsIFtyMiwgIzBdICAgIC8vIGFjY3UyID0gcERhdF8wWzBdCisgICAgTERSICAgICByNCwgW3IzLCAjMF0gICAgLy8gYWNjdTEgPSBwRGF0XzFbMF0KKworICAgIFNNVUxXVCAgcjksIHI1LCByOCAgICAgIC8vIGFjY3VYID0gYWNjdTIqdmFsX3R3LmwKKyAgICBTTVVMV0IgIHI1LCByNSwgcjggICAgICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oCisgICAgUlNCICAgICByOSwgcjksICMwICAgICAgLy8gYWNjdVggPS1hY2N1Mip2YWxfdHcubAorICAgIFNNTEFXVCAgcjUsIHI0LCByOCwgcjUgIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmggKyBhY2N1MSp2YWxfdHcubAorICAgIFNNTEFXQiAgcjQsIHI0LCByOCwgcjkgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmggLSBhY2N1Mip2YWxfdHcubAorCisgICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKKyAgICBMRFIgICAgIHI3LCBbcjMsICMtNF0gICAvLyBhY2N1NCA9IHBEYXRfMVstMV0KKyAgICBMRFIgICAgIHI2LCBbcjIsICM0XSAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorCisgICAgU01VTFdCICByOSwgcjcsIHI4ICAgICAgLy8gYWNjdVggPSBhY2N1NCp2YWxfdHcuaAorICAgIFNNVUxXVCAgcjcsIHI3LCByOCAgICAgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwKKyAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAvLyBhY2N1WCA9LWFjY3U0KnZhbF90dy5oCisgICAgU01MQVdCICByNywgcjYsIHI4LCByNyAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubCthY2N1Myp2YWxfdHcuaAorICAgIFNNTEFXVCAgcjYsIHI2LCByOCwgcjkgIC8vIGFjY3UzID0gYWNjdTMqdmFsX3R3LmwtYWNjdTQqdmFsX3R3LmgKKworICAgIFNUUiAgICAgcjUsIFtyMl0sICM0ICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgU1RSICAgICByNCwgW3IyXSwgIzQgICAgLy8gKnBEYXRfMCsrID0gYWNjdTEKKyAgICBTVFIgICAgIHI2LCBbcjNdLCAjLTQgICAvLyAqcERhdF8xLS0gPSBhY2N1MworICAgIFNUUiAgICAgcjcsIFtyM10sICMtNCAgIC8vICpwRGF0XzEtLSA9IGFjY3U0CisKKyAgICBTVUJTICAgIHIwLCByMCwgIzEKKyAgICBCTkUgICAgIGRjdF9JVl9sb29wMV9zdGFydAorCisgICAgUE9QICAgICB7cjQtcjl9CisKKyAgICBCWCAgICAgIGxyCit9CisKKyNlbmRpZiAvKiBGVU5DVElPTl9kY3RfSVZfZnVuYzEgKi8KKworCisjaWZkZWYgRlVOQ1RJT05fZGN0X0lWX2Z1bmMyCisKK0ZES19JTkxJTkUKKy8qIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgKi8KK3N0YXRpYyB2b2lkIGRjdF9JVl9mdW5jMigKKyAgICBpbnQgaSwKKyAgICBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICBGSVhQX0RCTCAqcERhdF8wLAorICAgIEZJWFBfREJMICpwRGF0XzEsCisgICAgaW50IGluYykKK3sKKyAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3VYOworICBMT05HIHZhbF90dzsKKworICBhY2N1MSA9IHBEYXRfMVstMl07CisgIGFjY3UyID0gcERhdF8xWy0xXTsKKworICAqLS1wRGF0XzEgPSAtKHBEYXRfMFsxXT4+MSk7CisgICpwRGF0XzArKyA9IChwRGF0XzBbMF0+PjEpOworCisgIHR3aWRkbGUgKz0gaW5jOworCitfX2FzbQorICB7CisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisgICAgQiAgICAgICBkY3RfSVZfbG9vcDJfMm5kX3BhcnQKKworICAgIC8qIDQyIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjEgY3ljbGVzL2l0ZXJhdGlvbiAqLworZGN0X0lWX2xvb3AyOgorICAgIFNNVUxXVCAgYWNjdVgsIGFjY3UyLCB2YWxfdHcKKyAgICBTTVVMV0IgIGFjY3UyLCBhY2N1MiwgdmFsX3R3CisgICAgUlNCICAgICBhY2N1WCwgYWNjdVgsICMwCisgICAgU01MQVdCICBhY2N1WCwgYWNjdTEsIHZhbF90dywgYWNjdVgKKyAgICBTTUxBV1QgIGFjY3UyLCBhY2N1MSwgdmFsX3R3LCBhY2N1MgorICAgIFNUUiAgICAgYWNjdVgsIFtwRGF0XzBdLCAjNAorICAgIFNUUiAgICAgYWNjdTIsIFtwRGF0XzEsICMtNF0gIQorCisgICAgTERSICAgICBhY2N1NCwgW3BEYXRfMCwgIzRdCisgICAgTERSICAgICBhY2N1MywgW3BEYXRfMF0KKyAgICBTTVVMV0IgIGFjY3VYLCBhY2N1NCwgdmFsX3R3CisgICAgU01VTFdUICBhY2N1NCwgYWNjdTQsIHZhbF90dworICAgIFJTQiAgICAgYWNjdVgsIGFjY3VYLCAjMAorICAgIFNNTEFXVCAgYWNjdVgsIGFjY3UzLCB2YWxfdHcsIGFjY3VYCisgICAgU01MQVdCICBhY2N1NCwgYWNjdTMsIHZhbF90dywgYWNjdTQKKworICAgIExEUiAgICAgYWNjdTEsIFtwRGF0XzEsICMtOF0KKyAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xLCAjLTRdCisKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKKworICAgIFNUUiAgICAgYWNjdVgsIFtwRGF0XzEsICMtNF0gIQorICAgIFNUUiAgICAgYWNjdTQsIFtwRGF0XzBdLCAjNAorCitkY3RfSVZfbG9vcDJfMm5kX3BhcnQ6CisgICAgU01VTFdUICBhY2N1WCwgYWNjdTIsIHZhbF90dworICAgIFNNVUxXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcKKyAgICBSU0IgICAgIGFjY3VYLCBhY2N1WCwgIzAKKyAgICBTTUxBV0IgIGFjY3VYLCBhY2N1MSwgdmFsX3R3LCBhY2N1WAorICAgIFNNTEFXVCAgYWNjdTIsIGFjY3UxLCB2YWxfdHcsIGFjY3UyCisgICAgU1RSICAgICBhY2N1WCwgW3BEYXRfMF0sICM0CisgICAgU1RSICAgICBhY2N1MiwgW3BEYXRfMSwgIy00XSAhCisKKyAgICBMRFIgICAgIGFjY3U0LCBbcERhdF8wLCAjNF0KKyAgICBMRFIgICAgIGFjY3UzLCBbcERhdF8wXQorICAgIFNNVUxXQiAgYWNjdVgsIGFjY3U0LCB2YWxfdHcKKyAgICBTTVVMV1QgIGFjY3U0LCBhY2N1NCwgdmFsX3R3CisgICAgUlNCICAgICBhY2N1WCwgYWNjdVgsICMwCisgICAgU01MQVdUICBhY2N1WCwgYWNjdTMsIHZhbF90dywgYWNjdVgKKyAgICBTTUxBV0IgIGFjY3U0LCBhY2N1MywgdmFsX3R3LCBhY2N1NAorCisgICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy04XQorICAgIExEUiAgICAgYWNjdTIsIFtwRGF0XzEsICMtNF0KKworICAgIFNUUiAgICAgYWNjdVgsIFtwRGF0XzEsICMtNF0gIQorICAgIFNUUiAgICAgYWNjdTQsIFtwRGF0XzBdLCAjNAorCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisKKyAgICBTVUJTICAgIGksIGksICMxCisgICAgQk5FICAgICBkY3RfSVZfbG9vcDIKKyAgfQorCisgIC8qIExhc3QgU2luIGFuZCBDb3MgdmFsdWUgcGFpciBhcmUgdGhlIHNhbWUgKi8KKyAgYWNjdTEgPSBmTXVsdERpdjIoYWNjdTEsIFdUQygweDVhODI3OTlhKSk7CisgIGFjY3UyID0gZk11bHREaXYyKGFjY3UyLCBXVEMoMHg1YTgyNzk5YSkpOworCisgICotLXBEYXRfMSA9IGFjY3UxICsgYWNjdTI7CisgICpwRGF0XzArKyA9IGFjY3UxIC0gYWNjdTI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZGN0X0lWX2Z1bmMyICovCisKKworI2lmZGVmIEZVTkNUSU9OX2RzdF9JVl9mdW5jMQorCitfX2FzbSB2b2lkIGRzdF9JVl9mdW5jMSgKKyAgICBpbnQgaSwKKyAgICBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICBGSVhQX0RCTCAqcERhdF8wLAorICAgIEZJWFBfREJMICpwRGF0XzEpCit7CisgICAgLyogUmVnaXN0ZXIgbWFwOgorICAgICAgIHIwICAgaQorICAgICAgIHIxICAgdHdpZGRsZQorICAgICAgIHIyICAgcERhdF8wCisgICAgICAgcjMgICBwRGF0XzEKKyAgICAgICByNCAgIGFjY3UxCisgICAgICAgcjUgICBhY2N1MgorICAgICAgIHI2ICAgYWNjdTMKKyAgICAgICByNyAgIGFjY3U0CisgICAgICAgcjggICB2YWxfdHcKKyAgICAgICByOSAgIGFjY3VYCisgICAgKi8KKyAgICBQVVNIICAgIHtyNC1yOX0KKworZHN0X0lWX2xvb3AxCisgICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgICAgICAgICAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCisgICAgTERSICAgICByNSwgW3IyXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMFswXQorICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKyAgICBSU0IgICAgIHI1LCByNSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gLWFjY3UyCisgICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1WCA9ICgtYWNjdTIpKnZhbF90dy5sCisgICAgTERSICAgICByNCwgW3IzLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICByOSwgcjQsIHI4LCByOSAgICAgICAgICAgICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01VTFdUICByNCwgcjQsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCisgICAgTERSICAgICByNywgW3IzLCAjLThdICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMVstMl0KKyAgICBTTUxBV0IgIHI1LCByNSwgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKKyAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICBTVFIgICAgIHI1LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgU1RSICAgICByOSwgW3IyXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MSAoYWNjdVgpCisgICAgUlNCICAgICByNywgcjcsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IC1hY2N1NAorICAgIFNNVUxXQiAgcjUsIHI3LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAorICAgIFNNVUxXQiAgcjQsIHI2LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAorICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI1ICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIHI3LCByNywgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTVFIgICAgIHI2LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3UzCisgICAgU1RSICAgICByNywgW3IzLCAjLTRdICEgICAgICAgICAgICAvLyAqLS1wRGF0XzEgPSBhY2N1NAorCisgICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgICAgICAgICAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCisgICAgTERSICAgICByNSwgW3IyXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMFswXQorICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKyAgICBSU0IgICAgIHI1LCByNSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gLWFjY3UyCisgICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1WCA9ICgtYWNjdTIpKnZhbF90dy5sCisgICAgTERSICAgICByNCwgW3IzLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICByOSwgcjQsIHI4LCByOSAgICAgICAgICAgICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01VTFdUICByNCwgcjQsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCisgICAgTERSICAgICByNywgW3IzLCAjLThdICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMVstMl0KKyAgICBTTUxBV0IgIHI1LCByNSwgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKKyAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICBTVFIgICAgIHI1LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgU1RSICAgICByOSwgW3IyXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MSAoYWNjdVgpCisgICAgUlNCICAgICByNywgcjcsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IC1hY2N1NAorICAgIFNNVUxXQiAgcjUsIHI3LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAorICAgIFNNVUxXQiAgcjQsIHI2LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAorICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI1ICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIHI3LCByNywgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTVFIgICAgIHI2LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3UzCisgICAgU1RSICAgICByNywgW3IzLCAjLTRdICEgICAgICAgICAgICAvLyAqLS1wRGF0XzEgPSBhY2N1NAorCisgICAgU1VCUyAgICByMCwgcjAsICM0ICAgICAgICAgICAgICAgICAvLyBpLT0gNAorICAgIEJORSAgICAgZHN0X0lWX2xvb3AxCisKKyAgICBQT1AgICAgIHtyNC1yOX0KKyAgICBCWCAgICAgIGxyCit9CisjZW5kaWYgLyogRlVOQ1RJT05fZHN0X0lWX2Z1bmMxICovCisKKyNpZmRlZiBGVU5DVElPTl9kc3RfSVZfZnVuYzIKKworRkRLX0lOTElORQorLyogX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSAqLworc3RhdGljIHZvaWQgZHN0X0lWX2Z1bmMyKAorICAgIGludCBpLAorICAgIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAsCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSwKKyAgICBpbnQgaW5jKQoreworICBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MyxhY2N1NDsKKyAgTE9ORyB2YWxfdHc7CisKKyAgYWNjdTQgPSBwRGF0XzBbMF07CisgIGFjY3UzID0gcERhdF8wWzFdOworICBhY2N1NCA+Pj0gMTsKKyAgYWNjdTMgPj49IDE7CisgIGFjY3U0ID0gLWFjY3U0OworCisgIGFjY3UxID0gcERhdF8xWy0xXTsKKyAgYWNjdTIgPSBwRGF0XzFbMF07CisKKyAgKnBEYXRfMCsrID0gYWNjdTM7CisgICpwRGF0XzEtLSA9IGFjY3U0OworCisKKyAgX19hc20KKyAgeworICAgIEIgICAgICAgZHN0X0lWX2xvb3AyXzJuZF9wYXJ0CisKKyAgICAvKiA1MCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDI1IGN5Y2xlcy9pdGVyYXRpb24gKi8KKworZHN0X0lWX2xvb3AyOgorCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisKKyAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC1hY2N1MgorICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLWFjY3UxCisgICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAorICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAgICAgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UxKSp2YWxfdHcubCsoLWFjY3UyKSp2YWxfdHcuaAorICAgIFNUUiAgICAgYWNjdTEsIFtwRGF0XzFdLCAjLTQgICAgICAgICAgICAgIC8vICpwRGF0XzEtLSA9IGFjY3UxCisgIAlTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MgorCisgIAlMRFIgICAgIGFjY3U0LCBbcERhdF8wXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMFswXQorICAJTERSICAgICBhY2N1MywgW3BEYXRfMCwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKworICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0CisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTMKKworICAgIFNNVUxXQiAgYWNjdTEsIGFjY3UzLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UxID0gKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTVVMV1QgIGFjY3UyLCBhY2N1MywgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1MiA9ICgtYWNjdTMpKnZhbF90dy5sCisgICAgUlNCICAgICBhY2N1MSwgYWNjdTEsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIGFjY3UzLCBhY2N1NCwgdmFsX3R3LCBhY2N1MSAgICAgICAvLyBhY2N1MyA9ICgtYWNjdTQpKnZhbF90dy5sLSgtYWNjdTMpKnZhbF90dy5oCisgICAgU01MQVdCICBhY2N1NCwgYWNjdTQsIHZhbF90dywgYWNjdTIgICAgICAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAorCisgICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy00XSAgICAgICAgICAgICAgLy8gYWNjdTEgPSBwRGF0XzFbLTFdCisgICAgTERSICAgICBhY2N1MiwgW3BEYXRfMV0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KKworICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UzCisgICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgICAgICAgICAgICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKworZHN0X0lWX2xvb3AyXzJuZF9wYXJ0OgorCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisKKyAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC1hY2N1MgorICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLWFjY3UxCisgICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAorICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAgICAgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UxKSp2YWxfdHcubCsoLWFjY3UyKSp2YWxfdHcuaAorICAgIFNUUiAgICAgYWNjdTEsIFtwRGF0XzFdLCAjLTQgICAgICAgICAgICAgIC8vICpwRGF0XzEtLSA9IGFjY3UxCisgIAlTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MgorCisgIAlMRFIgICAgIGFjY3U0LCBbcERhdF8wXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMFswXQorICAJTERSICAgICBhY2N1MywgW3BEYXRfMCwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKworICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0CisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTMKKworICAgIFNNVUxXQiAgYWNjdTEsIGFjY3UzLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UxID0gKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTVVMV1QgIGFjY3UyLCBhY2N1MywgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1MiA9ICgtYWNjdTMpKnZhbF90dy5sCisgICAgUlNCICAgICBhY2N1MSwgYWNjdTEsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIGFjY3UzLCBhY2N1NCwgdmFsX3R3LCBhY2N1MSAgICAgICAvLyBhY2N1MyA9ICgtYWNjdTQpKnZhbF90dy5sLSgtYWNjdTMpKnZhbF90dy5oCisgICAgU01MQVdCICBhY2N1NCwgYWNjdTQsIHZhbF90dywgYWNjdTIgICAgICAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAorCisgICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy00XSAgICAgICAgICAgICAgLy8gYWNjdTEgPSBwRGF0XzFbLTFdCisgICAgTERSICAgICBhY2N1MiwgW3BEYXRfMV0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KKworICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UzCisgICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgICAgICAgICAgICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKworICAgIFNVQlMgICAgaSwgaSwgIzEKKyAgICBCTkUgICAgIGRzdF9JVl9sb29wMgorICB9CisKKyAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLworICBhY2N1MSA9IGZNdWx0RGl2MigtYWNjdTEsIFdUQygweDVhODI3OTlhKSk7CisgIGFjY3UyID0gZk11bHREaXYyKC1hY2N1MiwgV1RDKDB4NWE4Mjc5OWEpKTsKKworICAqcERhdF8wID0gYWNjdTEgKyBhY2N1MjsKKyAgKnBEYXRfMSA9IGFjY3UxIC0gYWNjdTI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZHN0X0lWX2Z1bmMyICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9hcm0vZmZ0X3JhZDJfYXJtLmNwcCBiL2FhYy9saWJGREsvc3JjL2FybS9mZnRfcmFkMl9hcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTJlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9hcm0vZmZ0X3JhZDJfYXJtLmNwcApAQCAtMCwwICsxLDMyMSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisgICBEZXNjcmlwdGlvbjogZGl0X2ZmdCBBUk0gYXNzZW1ibGVyIHJlcGxhY2VtZW50cy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBORU9OIG9wdGltaXplZCBGRlQgY3VycmVudGx5IGJ1aWxkcyBvbmx5IHdpdGggUlZDVCB0b29sY2hhaW4gKi8KKworI2lmbmRlZiBGVU5DVElPTl9kaXRfZmZ0CisKKy8qIElmIGRpdF9mZnQgd2FzIG5vdCB5ZXQgZGVmaW5lZCBieSBBUk0tQ29ydGV4IC4uLiAqLworCisjaWYgZGVmaW5lZChTSU5FVEFCTEVfMTZCSVQpCisKKyNkZWZpbmUgRlVOQ1RJT05fZGl0X2ZmdAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgZGF0ZTogICAyOC4wNy4yMDA1ICAgc3JsCisKKyAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOiBkaXQtdHVrZXktRkZULWFsZ29yaXRobQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX2RpdF9mZnQpCisKKwordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpCit7CisgICAgY29uc3QgSU5UIG49MTw8bGRuOworICAgIElOVCBpOworCisgICAgc2NyYW1ibGUoeCxuKTsKKyAgICAvKgorICAgICAqIDErMiBzdGFnZSByYWRpeCA0CisgICAgICovCisKKyAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQorICAgIHsKKyAgICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKKyAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCisgICAgICBhMTAgPSAoeFtpICsgNF0gKyB4W2kgKyA2XSk+PjE7ICAvKiBSZSBDICsgUmUgRCAqLworICAgICAgYTIwID0gKHhbaSArIDFdICsgeFtpICsgM10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KKyAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgIC8qIEltIEMgKyBJbSBEICovCisKKyAgICAgIHhbaSArIDBdID0gYTAwICsgYTEwOyAgICAgICAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KKyAgICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAgICAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAgICAgICAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KKyAgICAgIHhbaSArIDVdID0gYTIwIC0gYTMwOyAgICAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKworICAgICAgYTAwID0gYTAwIC0geFtpICsgMl07ICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgICBhMTAgPSBhMTAgLSB4W2kgKyA2XTsgICAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgICAgIGEyMCA9IGEyMCAtIHhbaSArIDNdOyAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICAgICAgYTMwID0gYTMwIC0geFtpICsgN107ICAgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgICAgIHhbaSArIDJdID0gYTAwICsgYTMwOyAgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgICAgIHhbaSArIDZdID0gYTAwIC0gYTMwOyAgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KKyAgICAgIHhbaSArIDNdID0gYTIwIC0gYTEwOyAgICAgICAvKiBJbSBCJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KKyAgICAgIHhbaSArIDddID0gYTIwICsgYTEwOyAgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KKyAgICB9CisKKyAgICBJTlQgbWggPSAxIDw8IDE7CisgICAgSU5UIGxkbSA9IGxkbiAtIDI7CisgICAgSU5UIHRyaWdzdGVwID0gdHJpZ0RhdGFTaXplOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGNvbnN0IEZJWFBfU1RQICpwVHJpZ0RhdGEgPSB0cmlnZGF0YTsKKyAgICAgICAgSU5UIGo7CisKKyAgICAgICAgbWggPDw9IDE7CisgICAgICAgIHRyaWdzdGVwID4+PSAxOworCisgICAgICAgIEZES19BU1NFUlQodHJpZ3N0ZXAgPiAwKTsKKworICAgICAgICAvKiBEbyBmaXJzdCBpdGVyYXRpb24gd2l0aCBjPTEuMCBhbmQgcz0wLjAgc2VwYXJhdGVseSB0byBhdm9pZCBsb29zaW5nIHRvIG11Y2ggcHJlY2lzaW9uLgorICAgICAgICAgICBCZXdhcmU6IFRoZSBpbXBhY3Qgb24gdGhlIG92ZXJhbCBGRlQgcHJlY2lzaW9uIGlzIHJhdGhlciBsYXJnZS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHg7CisgICAgICAgICAgICBpbnQgciA9IG47CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oPDwxKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDEgPSB4KyAoKHIpPDwxKTsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oPDwxKTsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOyAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICAgICAgICAgIHZpID0geHQyWzFdPj4xOworICAgICAgICAgICAgICAgIHZyID0geHQyWzBdPj4xOworCisgICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOworICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeHQxICs9IG1oOworICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKKworICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgKEZJWFBfU0dMKTEuMCwgKEZJWFBfU0dMKTAuMCk7CisgICAgICAgICAgICAgICAgdnIgPSB4dDJbMV0+PjE7CisgICAgICAgICAgICAgICAgdmkgPSB4dDJbMF0+PjE7CisKKyAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKKworICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7CisgICAgICAgICAgICAgICAgeHQyWzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4dDEgPSB4dDIgKyBtaDsKKyAgICAgICAgICAgIH0gd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGo9NDsgajxtaDsgais9NCkKKyAgICAgICAgeworICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHggKyAoaj4+MSk7CisgICAgICAgICAgICBGSVhQX1NQSyBjczsKKyAgICAgICAgICAgIGludCByID0gbjsKKworICAgICAgICAgICAgcFRyaWdEYXRhICs9IHRyaWdzdGVwOworICAgICAgICAgICAgY3MgPSAqcFRyaWdEYXRhOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOworICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4dDJbMV0sIHh0MlswXSwgY3MpOworCisgICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOworICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeHQxICs9IG1oOworICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKKworICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeHQyWzFdLCB4dDJbMF0sIGNzKTsKKworICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOworICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOworCisgICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7CisKKyAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCisgICAgICAgICAgICAgICAgeHQxID0geHQxIC0gKGopOworICAgICAgICAgICAgICAgIHh0MiA9IHh0MSArIChtaDw8MSk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlswXSwgeHQyWzFdLCBjcyk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKKworICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7CisgICAgICAgICAgICAgICAgeHQyWzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4dDEgKz0gbWg7CisgICAgICAgICAgICAgICAgeHQyICs9IG1oOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMF0sIHh0MlsxXSwgY3MpOworCisgICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4dDFbMF0gPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aS12aTsKKworICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpK3ZpOworCisgICAgICAgICAgICAgICAgeHQxID0geHQyICsgKGopOworICAgICAgICAgICAgfSAgd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHggKyAobWg+PjEpOworICAgICAgICAgICAgaW50IHIgPSBuOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOworICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4dDJbMV0sIHh0MlswXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOworCisgICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOworICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeHQxICs9IG1oOworICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKKworICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeHQyWzFdLCB4dDJbMF0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKKworICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOworICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOworCisgICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7CisKKyAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHh0MSA9IHh0MiArIG1oOworICAgICAgICAgICAgfSAgd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgtLWxkbSAhPSAwKTsKK30KKworI2VuZGlmIC8qIGlmIGRlZmluZWQoRlVOQ1RJT05fZGl0X2ZmdCkgICovCisKKyNlbmRpZiAvKiBpZiBkZWZpbmVkKFNJTkVUQUJMRV8xNkJJVCkgKi8KKworI2VuZGlmIC8qIGlmbmRlZiBGVU5DVElPTl9kaXRfZmZ0ICovCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9hcm0vcW1mX2FybS5jcHAgYi9hYWMvbGliRkRLL3NyYy9hcm0vcW1mX2FybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwY2U4MAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL2FybS9xbWZfYXJtLmNwcApAQCAtMCwwICsxLDc2NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAoUU1GX05PX1BPTFk9PTUpCisKKyNkZWZpbmUgRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQKKworI2lmZGVmIEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkCitzdGF0aWMgdm9pZAorcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpyU3ViYmFuZCApICAgICAgICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCit7CisgIGludCBpOworICBpbnQgTCA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7CisgIGludCBNID0gTD4+MTsKKyAgaW50IHNoaWZ0ID0gKGFuYVFtZi0+bm9fY2hhbm5lbHM+PjYpICsgMTsKKyAgaW50IHJTdWJiYW5kX2UgPSAwOworCisgIEZJWFBfUU1GICpyU3ViYmFuZFB0cjAgPSAmclN1YmJhbmRbTSswXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLworICBGSVhQX1FNRiAqclN1YmJhbmRQdHIxID0gJnJTdWJiYW5kW00tMV07ICAgICAgICAgICAgICAgIC8qIHJ1bnMgd2l0aCBkZWNyZW1lbnQgKi8KKyAgRklYUF9RTUYgKnRpbWVJbjAgPSAoRklYUF9EQkwgKikgJnRpbWVJblswXTsgICAgICAgICAgICAvKiBydW5zIHdpdGggaW5jcmVtZW50ICovCisgIEZJWFBfUU1GICp0aW1lSW4xID0gKEZJWFBfREJMICopICZ0aW1lSW5bTF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLworICBGSVhQX1FNRiAqdGltZUluMiA9IChGSVhQX0RCTCAqKSAmdGltZUluW0wtMV07ICAgICAgICAgIC8qIHJ1bnMgd2l0aCBkZWNyZW1lbnQgKi8KKyAgRklYUF9RTUYgKnRpbWVJbjMgPSAoRklYUF9EQkwgKikgJnRpbWVJblsyKkwtMV07ICAgICAgICAvKiBydW5zIHdpdGggZGVjcmVtZW50ICovCisKKyAgZm9yIChpID0gMDsgaSA8IE07IGkrKykKKyAgeworICAgICpyU3ViYmFuZFB0cjArKyA9ICgqdGltZUluMi0tID4+IDEpIC0gKCp0aW1lSW4wKysgPj4gc2hpZnQpOworICAgICpyU3ViYmFuZFB0cjEtLSA9ICgqdGltZUluMSsrID4+IDEpICsgKCp0aW1lSW4zLS0gPj4gc2hpZnQpOworICB9CisKKyAgZGN0X0lWKHJTdWJiYW5kLEwsICZyU3ViYmFuZF9lKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCAqLworCisKKy8qIE5FT04gb3B0aW1pemVkIFFNRiBjdXJyZW50bHkgYnVpbHRzIG9ubHkgd2l0aCBSVkNUIHRvb2xjaGFpbiAqLworCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKQorCisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQorI2RlZmluZSBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90CisjZW5kaWYKKworI2lmZGVmIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QKKworI2lmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKworaW5saW5lIElOVCBTTVVMQkIgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKK3sKKyAgSU5UIHJlc3VsdCA7CisgIF9fYXNtX18gKCJzbXVsYmIgJTAsICUxLCAlMiIKKyAgICAgOiAiPXIiIChyZXN1bHQpCisgICAgIDogInIiIChhKSwgInIiIChiKSkgOworICByZXR1cm4gcmVzdWx0IDsKK30KK2lubGluZSBJTlQgU01VTEJUIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCit7CisgIElOVCByZXN1bHQgOworICBfX2FzbV9fICgic211bGJ0ICUwLCAlMSwgJTIiCisgICAgIDogIj1yIiAocmVzdWx0KQorICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKKyAgcmV0dXJuIHJlc3VsdCA7Cit9CisKK2lubGluZSBJTlQgU01MQUJCKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQoreworICBJTlQgcmVzdWx0IDsKKyAgX19hc21fXyAoInNtbGFiYiAlMCwgJTEsICUyLCUzIgorICAgICA6ICI9ciIgKHJlc3VsdCkKKyAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIgKGFjY3UpKSA7CisgIHJldHVybiByZXN1bHQ7Cit9CitpbmxpbmUgSU5UIFNNTEFCVChjb25zdCBMT05HIGFjY3UsIGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKK3sKKyAgSU5UIHJlc3VsdCA7CisgIF9fYXNtX18gKCJzbWxhYnQgJTAsICUxLCAlMiwlMyIKKyAgICAgOiAiPXIiIChyZXN1bHQpCisgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSkgOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIGNvbXBpbGVyIHNlbGVjdGlvbiAgKi8KKworCit2b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3QoIEZJWFBfUU1GICphbmFseXNpc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBjaGFubmVscyBvZiBhbmFseXNpcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgcF9zdHJpZGUsICAgICAgICAgICAgICAgIC8qITwgU3RpZGUgb2YgYW5hbHlzaXMgZmlsdGVyICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUUFTICpSRVNUUklDVCBwRmlsdGVyU3RhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBMT05HICpwX2ZsdCA9IChMT05HICopIHBfZmlsdGVyOworICBMT05HIGZsdDsKKyAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzAgPSBhbmFseXNpc0J1ZmZlciArIDIqbm9fY2hhbm5lbHMgLSAxOworICBGSVhQX1FNRiAqUkVTVFJJQ1QgcERhdGFfMSA9IGFuYWx5c2lzQnVmZmVyOworCisgIEZJWFBfUUFTICpSRVNUUklDVCBzdGFfMCA9IChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXM7CisgIEZJWFBfUUFTICpSRVNUUklDVCBzdGFfMSA9IChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXMgKyAoMipRTUZfTk9fUE9MWSpub19jaGFubmVscykgLSAxOworCisgIEZJWFBfREJMIGFjY3UwLCBhY2N1MTsKKyAgRklYUF9RQVMgc3RhMCwgc3RhMTsKKworICBpbnQgc3RhU3RlcDEgPSAgbm9fY2hhbm5lbHM8PDE7CisgIGludCBzdGFTdGVwMiA9IChub19jaGFubmVsczw8MykgLSAxOyAvKiBSZXdpbmQgb25lIGxlc3MgKi8KKworICBpZiAocF9zdHJpZGUgPT0gMSkKKyAgeworICAgIC8qIEZJUiBmaWx0ZXIgMCAqLworICAgIGZsdCA9ICpwX2ZsdCsrOworICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CisgICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgIGZsdCA9ICpwX2ZsdCsrOworICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CisgICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgIGZsdCA9ICpwX2ZsdCsrOworICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSArPSBzdGFTdGVwMjsKKyAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CisgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOworCisgICAgLyogRklSIGZpbHRlcnMgMS4uNjMgMTI3Li42NSBvciAxLi4zMSA2My4uMzMgKi8KKyAgICBub19jaGFubmVscyA+Pj0gMTsKKyAgICBmb3IgKDsgLS1ub19jaGFubmVsczsgKQorICAgIHsKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMSwzLDUsIC4uLiAyOS82MSAqLworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1MCA9IFNNVUxCVCggICAgICAgIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNVUxCVCggICAgICAgIHN0YTEsIGZsdCk7CisKKyAgICAgIGZsdCA9ICpwX2ZsdCsrOworICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICAgZmx0ID0gKnBfZmx0Kys7CisgICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOworICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCAtPSBzdGFTdGVwMjsKKyAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xICs9IHN0YVN0ZXAyOworICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CisgICAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CisKKyAgICAgIC8qIFNhbWUgc2VxdWVuY2UgYXMgYWJvdmUsIGJ1dCBtaXggQj1ib3R0b20gd2l0aCBUPVRvcCAqLworCisgICAgICBmbHQgPSAqcF9mbHQrKzsKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMiw0LDYsIC4uLiAzMC82MiAqLworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CisKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICAgIGZsdCA9ICpwX2ZsdCsrOworICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICAgZmx0ID0gKnBfZmx0Kys7CisgICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCAtPSBzdGFTdGVwMjsKKyAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xICs9IHN0YVN0ZXAyOworICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CisgICAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CisgICAgfQorCisgICAgLyogRklSIGZpbHRlciAzMS82MyBhbmQgMzMvNjUgKi8KKyAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MCA9IFNNVUxCVCggICAgICAgIHN0YTAsIGZsdCk7CisgICAgYWNjdTEgPSBTTVVMQlQoICAgICAgICBzdGExLCBmbHQpOworCisgICAgZmx0ID0gKnBfZmx0Kys7CisgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICBmbHQgPSAqcF9mbHQrKzsKKyAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7CisgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgKz0gc3RhU3RlcDI7CisgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKKyAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CisKKyAgICAvKiBGSVIgZmlsdGVyIDMyLzY0ICovCisgICAgZmx0ID0gKnBfZmx0Kys7CisgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOworICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKKworICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICBmbHQgPSAqcF9mbHQrKzsKKyAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgIGZsdCA9ICpwX2ZsdDsKKyAgICBzdGEwID0gKnN0YV8wOworICAgIHN0YTEgPSAqc3RhXzE7CisgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKKworICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKKyAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaW50IHBmbHRTdGVwID0gUU1GX05PX1BPTFkgKiAocF9zdHJpZGUtMSk7CisKKyAgICBmbHQgPSBwX2ZsdFswXTsKKyAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOworICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICBmbHQgPSBwX2ZsdFsxXTsKKyAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOworICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICBmbHQgPSBwX2ZsdFsyXTsgcF9mbHQgKz0gcGZsdFN0ZXA7CisgICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOworICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKKyAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CisKKyAgICAvKiBGSVIgZmlsdGVycyAxLi42MyAxMjcuLjY1IG9yIDEuLjMxIDYzLi4zMyAqLworICAgIGZvciAoOyAtLW5vX2NoYW5uZWxzOyApCisgICAgeworICAgICAgZmx0ID0gcF9mbHRbMF07CisgICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOworICAgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOworICAgICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOworCisgICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOworICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOworICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOworCisgICAgICBmbHQgPSBwX2ZsdFsxXTsKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICAgIGZsdCA9IHBfZmx0WzJdOyBwX2ZsdCArPSBwZmx0U3RlcDsKKyAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOworICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgKz0gc3RhU3RlcDI7CisgICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CisgICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CisKKyAgICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKKyAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKKyAgICB9CisKKyAgICAvKiBGSVIgZmlsdGVyIDMyLzY0ICovCisgICAgZmx0ID0gcF9mbHRbMF07CisgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOworICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKKworICAgIGZsdCA9IHBfZmx0WzFdOworICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CisKKyAgICBmbHQgPSBwX2ZsdFsyXTsKKyAgICBzdGEwID0gKnN0YV8wOworICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKKyAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90ICovCisjZW5kaWYgLyogI2lmIGRlZmluZWQoX19DQ19BUk0pICYmIGRlZmluZWQoX19BUk1fQVJDSF82X18pICovCisKKyNpZiAoIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgJiYgKFNBTVBMRV9CSVRTID09IDE2KSApICYmICFkZWZpbmVkKFFNRl9UQUJMRV9GVUxMKQorCisjZGVmaW5lIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QKKworI2lmIGRlZmluZWQoRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdCkKKworI2lmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKworaW5saW5lIElOVCBTTVVMV0IgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQoreworICBJTlQgcmVzdWx0IDsKKyAgX19hc21fXyAoInNtdWx3YiAlMCwgJTEsICUyIgorICAgIDogIj1yIiAocmVzdWx0KQorICAgIDogInIiIChhKSwgInIiIChiKSkgOworCisgIHJldHVybiByZXN1bHQgOworfQoraW5saW5lIElOVCBTTVVMV1QgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQoreworICBJTlQgcmVzdWx0IDsKKyAgX19hc21fXyAoInNtdWx3dCAlMCwgJTEsICUyIgorICAgIDogIj1yIiAocmVzdWx0KQorICAgIDogInIiIChhKSwgInIiIChiKSkgOworCisgIHJldHVybiByZXN1bHQgOworfQorCitpbmxpbmUgSU5UIFNNTEFXQihjb25zdCBMT05HIGFjY3UsIGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQoreworICBJTlQgcmVzdWx0OworICBhc20oInNtbGF3YiAlMCwgJTEsICUyLCAlMyAiCisgICAgICAgIDogIj1yIiAocmVzdWx0KQorICAgICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkgKTsKKyAgcmV0dXJuIHJlc3VsdCA7Cit9CisKK2lubGluZSBJTlQgU01MQVdUKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCit7CisgIElOVCByZXN1bHQ7CisgIGFzbSgic21sYXd0ICUwLCAlMSwgJTIsICUzICIKKyAgICAgICAgOiAiPXIiIChyZXN1bHQpCisgICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSApOworICByZXR1cm4gcmVzdWx0IDsKK30KKworI2VuZGlmIC8qIEFSTSBjb21waWxlciBzZWxlY3RvciAqLworCisKK3N0YXRpYyB2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3QxX2ZpbHRlcihGSVhQX1FNRiAqUkVTVFJJQ1QgcmVhbFNsb3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FTUyAqUkVTVFJJQ1Qgc3RhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwTXlUaW1lT3V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMpCit7CisgIC8qIFRoaXMgY29kZSB3YXMgdGhlIGJhc2UgZm9yIHRoZSBhYm92ZSBsaXN0ZWQgYXNzZW1ibGVyIHNlcXVlbmNlICovCisgIC8qIEl0IGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvciBmdXJ0aGVyIG9wdGltaXphdGlvbnMgICovCisgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwX2ZsdG0gPSBwX2ZsdCArIDE1NTsKKworICBkbworICB7CisgICAgIEZJWFBfREJMIHJlc3VsdDsKKyAgICAgRklYUF9EQkwgQSwgQiwgcmVhbCwgaW1hZywgc3RhMDsKKworICAgICByZWFsID0gKi0tcmVhbFNsb3Q7CisgICAgIGltYWcgPSAqLS1pbWFnU2xvdDsKKyAgICAgQiA9IHBfZmx0WzRdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bOF0gVG9wPVs5XSAgICAgKi8KKyAgICAgQSA9IHBfZmx0bVszXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE2XSBUb3A9WzMxN10gKi8KKyAgICAgc3RhMCA9IHN0YVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgc3RhdGVbMF0gICAgICAgICAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTkuLi4uLi4uLi4uLjMxOSAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxNi4uLi4uLi4uLi4uNiAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTgsMTgsICAgIC4uLjMxOCAgKi8KKyAgICAgQiA9IHBfZmx0WzNdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bNl0gVG9wPVs3XSAgICAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxNy4uLi4uLi4uLi4uNyAgKi8KKyAgICAgQSA9IHBfZmx0bVs0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE4XSBUb3A9WzMxOV0gKi8KKyAgICAgKnN0YSsrID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTcuLi4uLi4uLi4uLjMxNyAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxOC4uLi4uLi4uLi4uOCAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTYuLi4uLi4uLi4uLjMxNiAgKi8KKyAgICAgQiA9IHBfZmx0WzJdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bWF0gVG9wPVs1XSAgICAgKi8KKyAgICAgKnN0YSsrID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTkuLi4uLi4uLi4uLjMxOSAgKi8KKyAgICAgQSA9IHBfZmx0bVsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bWF0gVG9wPVszMTVdICAgKi8KKyAgICAgKnN0YSsrID0gICAgICAgICBTTVVMV1QoIGltYWcsIEIgKTsgIC8qIGluZGV4PTUsMTUsIC4uLiAgIDMxNSAgKi8KKyAgICAgcmVzdWx0ID0gU01MQVdUKCBzdGEwLCAgIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxNS4uLi4uLi4uLi4uNSAgKi8KKworICAgICAqcE15VGltZU91dCsrID0gcmVzdWx0OworCisgICAgIHJlYWwgPSAqLS1yZWFsU2xvdDsKKyAgICAgaW1hZyA9ICotLWltYWdTbG90OworICAgICBBID0gcF9mbHRtWzBdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTBdIFRvcD1bMzExXSAqLworICAgICBCID0gcF9mbHRbN107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxNF0gIFRvcD1bMTVdICAqLworICAgICByZXN1bHQgPSBTTUxBV0IoIHN0YVswXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEwLi4uLi4uLi4uLi4wICAqLworICAgICAqc3RhKysgPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTQuLi4uLi4uLi4uMzI0ICAqLworICAgICAqcE15VGltZU91dCsrID0gcmVzdWx0OworICAgICBCID0gcF9mbHRbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMl0gIFRvcD1bMTNdICAqLworICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzExLi4uLi4uLi4uLi4xICAqLworICAgICBBID0gcF9mbHRtWzFdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTJdIFRvcD1bMzEzXSAqLworICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTMuLi4uLi4uLi4uMzIzICAqLworICAgICAqc3RhKysgPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEyLi4uLi4uLi4uLi4yICAqLworICAgICAqc3RhKysgPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTIuLi4uLi4uLi4uMzIyICAqLworICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEzLi4uLi4uLi4uLi4zICAqLworICAgICBBID0gcF9mbHRtWzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTRdIFRvcD1bMzE1XSAqLworICAgICBCID0gcF9mbHRbNV07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMF0gIFRvcD1bMTFdICAqLworICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTEuLi4uLi4uLi4uMzIxICAqLworICAgICAqc3RhKysgPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzE0Li4uLi4uLi4uLi40ICAqLworICAgICAqc3RhKysgPSAgICAgICAgIFNNVUxXQiggaW1hZywgQiApOyAgLyogaW5kZXg9MTAuLi4uLi4uLi4uMzIwICAqLworCisKKyAgICAgcF9mbHQgICAgKz0gNTsKKyAgICAgcF9mbHRtICAgLT0gNTsKKyAgfSAKKyAgd2hpbGUgKCgtLW5vX2NoYW5uZWxzKSAhPSAwKTsKKworfQorCisKKworSU5UIHFtZlN5blByb3RvdHlwZUZpclNsb3QyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqUkVTVFJJQ1QgdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICBzdHJpZGUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgb3V0cHV0IGJ1ZmZlciBzdHJpZGUgZmFjdG9yKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSAoRklYUF9RU1MqKXFtZi0+RmlsdGVyU3RhdGVzOworICBpbnQgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOworICBpbnQgc2NhbGUgPSAoKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IpOworCisgIC8qIFdlIG1hcCBhbiBhcnJ5IG9mIDE2LWJpdCB2YWx1ZXMgdXBvbiBhbiBhcnJheSBvZiAyKjE2LWJpdCB2YWx1ZXMgdG8gcmVhZCAyIHZhbHVlcyBpbiBvbmUgc2hvdCAqLworICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHQgID0gKEZJWFBfREJMICopIHFtZi0+cF9maWx0ZXI7ICAgICAgICAgICAvKiBsb3c9WzBdLCAgIGhpZ2g9WzFdICAgKi8KKyAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0bSA9IChGSVhQX0RCTCAqKSBxbWYtPnBfZmlsdGVyICsgMTU1OyAgICAgLyogbG93PVszMTBdLCBoaWdoPVszMTFdICovCisKKyAgRkRLX0FTU0VSVChTQU1QTEVfQklUUy0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7IC8vICAgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7CisgIEZES19BU1NFUlQocW1mLT5wX3N0cmlkZT09MiAmJiBxbWYtPm5vX2NoYW5uZWxzID09IDMyKTsKKworICBGREtfQVNTRVJUKChub19jaGFubmVscyYzKSA9PSAwKTsgIC8qIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KKworICByZWFsU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyB+fiJ+fgorICBpbWFnU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyBub19jaGFubmVscy0xIC4uIDAKKworICBGSVhQX0RCTCBNeVRpbWVPdXRbMzJdOworICBGSVhQX0RCTCAqcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07CisKKyAgZm9yIChub19jaGFubmVscyA9IG5vX2NoYW5uZWxzOyBub19jaGFubmVscy0tOykKKyAgeworICAgICBGSVhQX0RCTCByZXN1bHQ7CisgICAgIEZJWFBfREJMIEEsIEIsIHJlYWwsIGltYWc7CisKKyAgICAgcmVhbCA9ICpyZWFsU2xvdC0tOworICAgICBpbWFnID0gKmltYWdTbG90LS07CisgICAgIEEgPSBwX2ZsdG1bMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMF0gVG9wPVszMTFdICovCisgICAgIEIgPSBwX2ZsdFs3XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzE0XSAgVG9wPVsxNV0gICovCisgICAgIHJlc3VsdCA9IFNNTEFXQiggc3RhWzBdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTAuLi4uLi4uLi4uLjAgICovCisgICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xNC4uLi4uLi4uLi4zMjQgICovCisgICAgIEIgPSBwX2ZsdFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEyXSAgVG9wPVsxM10gICovCisgICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTEuLi4uLi4uLi4uLjEgICovCisgICAgIEEgPSBwX2ZsdG1bMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMl0gVG9wPVszMTNdICovCisgICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMy4uLi4uLi4uLi4zMjMgICovCisgICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTIuLi4uLi4uLi4uLjIgICovCisgICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMi4uLi4uLi4uLi4zMjIgICovCisgICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTMuLi4uLi4uLi4uLjMgICovCisgICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNF0gVG9wPVszMTVdICovCisgICAgIEIgPSBwX2ZsdFs1XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEwXSAgVG9wPVsxMV0gICovCisgICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMS4uLi4uLi4uLi4zMjEgICovCisgICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTQuLi4uLi4uLi4uLjQgICovCisgICAgICpzdGErKyA9ICAgICAgICAgU01VTFdCKCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMC4uLi4uLi4uLi4zMjAgICovCisKKyAgICAgKnBNeVRpbWVPdXQrKyA9IHJlc3VsdDsKKworICAgICBwX2ZsdG0gICAtPSA1OworICAgICBwX2ZsdCAgICArPSA1OworICB9CisKKyAgcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KSAgICAgIAorICBjb25zdCBGSVhQX0RCTCBtYXhfcG9zID0gKEZJWFBfREJMKSAweDAwMDA3RkZGIDw8IHNjYWxlOworICBjb25zdCBGSVhQX0RCTCBtYXhfbmVnID0gKEZJWFBfREJMKSAweEZGRkY4MDAxIDw8IHNjYWxlOworI2Vsc2UKKyAgc2NhbGUgPSAtc2NhbGU7CisgIGNvbnN0IEZJWFBfREJMIG1heF9wb3MgPSAoRklYUF9EQkwpIDB4N0ZGRkZGRkYgPj4gc2NhbGU7CisgIGNvbnN0IEZJWFBfREJMIG1heF9uZWcgPSAoRklYUF9EQkwpIDB4ODAwMDAwMDEgPj4gc2NhbGU7ICAKKyNlbmRpZgorICBjb25zdCBGSVhQX0RCTCBhZGRfbmVnID0gKDEgPDwgc2NhbGUpIC0gMTsKKworICBub19jaGFubmVscyA9IHFtZi0+bm9fY2hhbm5lbHM7CisKKyAgdGltZU91dCArPSBub19jaGFubmVscypzdHJpZGU7CisKKyAgRkRLX0FTU0VSVChzY2FsZSA+PSAwKTsKKworICBpZiAocW1mLT5vdXRHYWluICE9IDB4ODAwMDAwMDApCisgIHsKKyAgICBGSVhQX0RCTCBnYWluID0gcW1mLT5vdXRHYWluOworICAgIGZvciAobm9fY2hhbm5lbHM+Pj0yOyBub19jaGFubmVscy0tOykKKyAgICB7CisgICAgICBGSVhQX0RCTCByZXN1bHQxLCByZXN1bHQyOworCisgICAgICByZXN1bHQxID0gKnBNeVRpbWVPdXQrKzsKKyAgICAgIHJlc3VsdDIgPSAqcE15VGltZU91dCsrOworCisgICAgICByZXN1bHQxID0gZk11bHQocmVzdWx0MSxnYWluKTsKKyAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOworICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOworICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7CisgICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKKyNlbHNlCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKKyNlbmRpZgorCisgICAgICByZXN1bHQyID0gZk11bHQocmVzdWx0MixnYWluKTsKKyAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOworICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOworICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7CisgICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKKyNlbHNlCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKKyNlbmRpZgorCisgICAgICByZXN1bHQxID0gKnBNeVRpbWVPdXQrKzsKKyAgICAgIHJlc3VsdDIgPSAqcE15VGltZU91dCsrOworCisgICAgICByZXN1bHQxID0gZk11bHQocmVzdWx0MSxnYWluKTsKKyAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOworICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOworICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7CisgICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKKyNlbHNlCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKKyNlbmRpZgorCisgICAgICByZXN1bHQyID0gZk11bHQocmVzdWx0MixnYWluKTsKKyAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOworICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOworICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7CisgICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKKyNlbHNlCisgICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKKyNlbmRpZgorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCisgICAgeworICAgICAgRklYUF9EQkwgcmVzdWx0MSwgcmVzdWx0MjsKKyAgICAgIHJlc3VsdDEgPSAqcE15VGltZU91dCsrOworICAgICAgcmVzdWx0MiA9ICpwTXlUaW1lT3V0Kys7CisgICAgICB0aW1lT3V0IC09IHN0cmlkZTsKKyAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKKyAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOworICAgICAgaWYgKHJlc3VsdDEgPiBtYXhfcG9zKSAgcmVzdWx0MSA9IG1heF9wb3M7CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQorICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CisjZWxzZQorICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7CisjZW5kaWYKKyAgICAgIAorICAgICAgdGltZU91dCAtPSBzdHJpZGU7CisgICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CisgICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKKyAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOworI2lmIChTQU1QTEVfQklUUyA9PSAxNikKKyAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOworI2Vsc2UKKyAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOworI2VuZGlmCisgICAgICAKKyAgICAgIHJlc3VsdDEgPSAqcE15VGltZU91dCsrOworICAgICAgcmVzdWx0MiA9ICpwTXlUaW1lT3V0Kys7CisgICAgICB0aW1lT3V0IC09IHN0cmlkZTsKKyAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKKyAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOworICAgICAgaWYgKHJlc3VsdDEgPiBtYXhfcG9zKSAgcmVzdWx0MSA9IG1heF9wb3M7CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQorICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CisjZWxzZQorICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7CisjZW5kaWYKKyAgICAgIAorICAgICAgdGltZU91dCAtPSBzdHJpZGU7CisgICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CisgICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKKyAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOworI2lmIChTQU1QTEVfQklUUyA9PSAxNikKKyAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOworI2Vsc2UKKyAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMKK3ZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaW1hZ1Nsb3QsICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiAjTUFYX1NZTlRIRVNJU19DSEFOTkVMUyBvZiBpbnB1dCBkYXRhIGFuZAorICBnZW5lcmF0ZXMgI01BWF9TWU5USEVTSVNfQ0hBTk5FTFMgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMuCisqLworCitzdGF0aWMKK3ZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaW1hZ1Nsb3QsICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIElOVCBlcnIgPSAtMTsKKworICAgIHN3aXRjaCAocW1mLT5wX3N0cmlkZSkgeworICAgIGNhc2UgMjoKKyAgICAgIGVyciA9IHFtZlN5blByb3RvdHlwZUZpclNsb3QyKHFtZiwgcmVhbFNsb3QsIGltYWdTbG90LCB0aW1lT3V0LCBzdHJpZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IC0xOworICAgIH0KKworICAgIC8qIGZhbGxiYWNrIGlmIGNvbmZpZ3VyYXRpb24gbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgKi8KKyAgICBpZihlcnIhPTApIHsKKyAgICAgICAgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayhxbWYsIHJlYWxTbG90LCBpbWFnU2xvdCwgdGltZU91dCwgc3RyaWRlKTsKKyAgICB9Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdCAqLworCisjZW5kaWYgIC8qICAoIGRlZmluZWQoX19DQ19BUk0pICYmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgJiYgKFNBTVBMRV9CSVRTID09IDE2KSApICYmICFkZWZpbmVkKFFNRl9UQUJMRV9GVUxMKSAqLworCisKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKworCisjZW5kaWYgIC8qIChRTUZfTk9fUE9MWT09NSkgKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvYXJtL3NjYWxlX2FybS5jcHAgYi9hYWMvbGliRkRLL3NyYy9hcm0vc2NhbGVfYXJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjgzN2VmCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvYXJtL3NjYWxlX2FybS5jcHAKQEAgLTAsMCArMSwxNzMgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiBBcnRodXIgVHJpdHRoYXJ0CisgICBEZXNjcmlwdGlvbjogU2NhbGluZyBvcGVyYXRpb25zIGZvciBBUk0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBwcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbiB3aXRoIHJlLWRlZmluaXRpb25zICovCisjaWZuZGVmIF9fSU5DTFVERV9TQ0FMRV9BUk1fXworI2RlZmluZSBfX0lOQ0xVREVfU0NBTEVfQVJNX18KKworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMCisKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoCisgICAgICAgIEZJWFBfREJMICp2ZWN0b3IsCisgICAgICAgIEZJWFBfREJMIGZhY3RvciwKKyAgICAgICAgSU5UIGxlbiwKKyAgICAgICAgSU5UIHNjYWxlZmFjdG9yCisgICAgICAgICkKK3sKKyAgLyogVGhpcyBjb2RlIGNvbWJpbmVzIHRoZSBmTXVsdCB3aXRoIHRoZSBzY2FsaW5nICAgICAgICAgICAgICovCisgIC8qIEl0IHBlcmZvcm1zIGEgZk11bHREaXYyIGFuZCBpbmNyZW1lbnRzIHNoaWZ0IGJ5IDEgICAgICAgICAqLworICBpbnQgc2hpZnQgPSBzY2FsZWZhY3RvciArIDE7CisgIEZJWFBfREJMICpteVNwZWMgPSB2ZWN0b3I7CisKKyAgc2hpZnQgPSBmaXhtaW5fSShzaGlmdCwoSU5UKURGUkFDVF9CSVRTLTEpOworCisgIGlmIChzaGlmdCA+PSAwKQorICB7CisgICAgZm9yIChpbnQgaT0wOyBpPChsZW4+PjIpOyBpKyspCisgICAgeworICAgICAgRklYUF9EQkwgdG1wMCA9IG15U3BlY1swXTsKKyAgICAgIEZJWFBfREJMIHRtcDEgPSBteVNwZWNbMV07CisgICAgICBGSVhQX0RCTCB0bXAyID0gbXlTcGVjWzJdOworICAgICAgRklYUF9EQkwgdG1wMyA9IG15U3BlY1szXTsKKyAgICAgIHRtcDAgPSBmTXVsdERpdjIodG1wMCwgZmFjdG9yKTsKKyAgICAgIHRtcDEgPSBmTXVsdERpdjIodG1wMSwgZmFjdG9yKTsKKyAgICAgIHRtcDIgPSBmTXVsdERpdjIodG1wMiwgZmFjdG9yKTsKKyAgICAgIHRtcDMgPSBmTXVsdERpdjIodG1wMywgZmFjdG9yKTsKKyAgICAgIHRtcDAgPDw9IHNoaWZ0OworICAgICAgdG1wMSA8PD0gc2hpZnQ7CisgICAgICB0bXAyIDw8PSBzaGlmdDsKKyAgICAgIHRtcDMgPDw9IHNoaWZ0OworICAgICAgKm15U3BlYysrID0gdG1wMDsKKyAgICAgICpteVNwZWMrKyA9IHRtcDE7CisgICAgICAqbXlTcGVjKysgPSB0bXAyOworICAgICAgKm15U3BlYysrID0gdG1wMzsKKyAgICB9CisgICAgZm9yIChpbnQgaT1sZW4mMzsgaS0tOykKKyAgICB7CisgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOworICAgICAgdG1wMCA9IGZNdWx0RGl2Mih0bXAwLCBmYWN0b3IpOworICAgICAgdG1wMCA8PD0gc2hpZnQ7CisgICAgICAqbXlTcGVjKysgPSB0bXAwOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzaGlmdCA9IC1zaGlmdDsKKyAgICBmb3IgKGludCBpPTA7IGk8KGxlbj4+Mik7IGkrKykKKyAgICB7CisgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOworICAgICAgRklYUF9EQkwgdG1wMSA9IG15U3BlY1sxXTsKKyAgICAgIEZJWFBfREJMIHRtcDIgPSBteVNwZWNbMl07CisgICAgICBGSVhQX0RCTCB0bXAzID0gbXlTcGVjWzNdOworICAgICAgdG1wMCA9IGZNdWx0RGl2Mih0bXAwLCBmYWN0b3IpOworICAgICAgdG1wMSA9IGZNdWx0RGl2Mih0bXAxLCBmYWN0b3IpOworICAgICAgdG1wMiA9IGZNdWx0RGl2Mih0bXAyLCBmYWN0b3IpOworICAgICAgdG1wMyA9IGZNdWx0RGl2Mih0bXAzLCBmYWN0b3IpOworICAgICAgdG1wMCA+Pj0gc2hpZnQ7CisgICAgICB0bXAxID4+PSBzaGlmdDsKKyAgICAgIHRtcDIgPj49IHNoaWZ0OworICAgICAgdG1wMyA+Pj0gc2hpZnQ7CisgICAgICAqbXlTcGVjKysgPSB0bXAwOworICAgICAgKm15U3BlYysrID0gdG1wMTsKKyAgICAgICpteVNwZWMrKyA9IHRtcDI7CisgICAgICAqbXlTcGVjKysgPSB0bXAzOworICAgIH0KKyAgICBmb3IgKGludCBpPWxlbiYzOyBpLS07KQorICAgIHsKKyAgICAgIEZJWFBfREJMIHRtcDAgPSBteVNwZWNbMF07CisgICAgICB0bXAwID0gZk11bHREaXYyKHRtcDAsIGZhY3Rvcik7CisgICAgICB0bXAwID4+PSBzaGlmdDsKKyAgICAgICpteVNwZWMrKyA9IHRtcDA7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fSU5DTFVERV9TQ0FMRV9BUk1fXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwIGIvYWFjL2xpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWFlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9hdXRvY29ycjJuZC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKyAgIERlc2NyaXB0aW9uOiBhdXRvLWNvcnJlbGF0aW9uIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgorCisKKworLyogIElmIHRoZSBhY2N1bXVsYXRvciBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBvdmVyZmxvdyBiaXRzLAorICAgIHByb2R1Y3RzIGhhdmUgdG8gYmUgc2hpZnRlZCBkb3duIGluIHRoZSBhdXRvY29ycmVsYXRpb24gYmVsb3cuICovCisjZGVmaW5lIFNISUZUX0ZBQ1RPUiAoNSkKKyNkZWZpbmUgU0hJRlQgPj4gKFNISUZUX0ZBQ1RPUikKKworCisjaWYgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9hdXRvY29ycjJuZC5jcHAiCisjZW5kaWYKKworCisvKiEKKyAqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIHNlY29uZCBvcmRlciBhdXRvY29ycmVsYXRpb24gdXNpbmcgMiBhY2N1bXVsYXRvcnMKKyAqCisgKi8KKyNpZiAhZGVmaW5lZChGVU5DVElPTl9hdXRvQ29ycjJuZF9yZWFsKQorSU5UCithdXRvQ29ycjJuZF9yZWFsIChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gY29lZmZzICovCisgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbiAgICAgICAgICAgICAvKiE8IE51bWJlciBpbnB1dCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50ICAgaiwgYXV0b0NvcnJTY2FsaW5nLCBtU2NhbGU7CisKKyAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3U1OworCisgIGNvbnN0IEZJWFBfREJMICpwUmVCdWY7CisKKyAgY29uc3QgRklYUF9EQkwgKnJlYWxCdWYgPSByZUJ1ZmZlcjsKKworICAvKgorICAgIHIxMXIscjIycgorICAgIHIwMXIscjEycgorICAgIHIwMnIKKyAgKi8KKyAgcFJlQnVmID0gcmVhbEJ1Zi0yOworICBhY2N1NSA9ICggKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsyXSkgKworICAgICAgICAgICAgIGZNdWx0RGl2MihwUmVCdWZbMV0sIHBSZUJ1ZlszXSkpIFNISUZUKTsKKyAgcFJlQnVmKys7CisKKyAgLy9sZW4gbXVzdCBiZSBldmVuCisgIGFjY3UxID0gZlBvdzJEaXYyKHBSZUJ1ZlswXSkgU0hJRlQ7CisgIGFjY3UzID0gZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzFdKSBTSElGVDsKKyAgcFJlQnVmKys7CisKKyAgZm9yICggaiA9IChsZW4gLSAyKT4+MTsgaiAhPSAwOyBqLS0scFJlQnVmKz0yICkgeworCisgICAgYWNjdTEgKz0gKCAoZlBvdzJEaXYyKHBSZUJ1ZlswXSkgKworICAgICAgICAgICAgICAgIGZQb3cyRGl2MihwUmVCdWZbMV0pKSBTSElGVCk7CisKKyAgICBhY2N1MyArPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMV0pICsKKyAgICAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbMl0pKSBTSElGVCk7CisKKyAgICBhY2N1NSArPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMl0pICsKKyAgICAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbM10pKSBTSElGVCk7CisKKyAgfQorCisgIGFjY3UyID0gKGZQb3cyRGl2MihyZWFsQnVmWy0yXSkgU0hJRlQpOworICBhY2N1MiArPSBhY2N1MTsKKworICBhY2N1MSArPSAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuIC0gMl0pIFNISUZUKTsKKworICBhY2N1NCAgPSAoZk11bHREaXYyKHJlYWxCdWZbLTFdLHJlYWxCdWZbLTJdKSBTSElGVCk7CisgIGFjY3U0ICs9IGFjY3UzOworCisgIGFjY3UzICs9IChmTXVsdERpdjIocmVhbEJ1ZltsZW4gLSAxXSxyZWFsQnVmW2xlbiAtIDJdKSBTSElGVCk7CisKKyAgbVNjYWxlID0gQ250TGVhZGluZ1plcm9zKCAoYWNjdTEgfCBhY2N1MiB8IGZBYnMoYWNjdTMpIHwgZkFicyhhY2N1NCkgfCBmQWJzKGFjY3U1KSkgKSAtIDE7CisgIGF1dG9Db3JyU2NhbGluZyA9IG1TY2FsZSAtIDEgLSBTSElGVF9GQUNUT1I7IC8qIC0xIGJlY2F1c2Ugb2YgZk11bHREaXYyKi8KKworICAvKiBTY2FsZSB0byBjb21tb24gc2NhbGUgZmFjdG9yICovCisgIGFjLT5yMTFyID0gYWNjdTEgPDwgbVNjYWxlOworICBhYy0+cjIyciA9IGFjY3UyIDw8IG1TY2FsZTsKKyAgYWMtPnIwMXIgPSBhY2N1MyA8PCBtU2NhbGU7CisgIGFjLT5yMTJyID0gYWNjdTQgPDwgbVNjYWxlOworICBhYy0+cjAyciA9IGFjY3U1IDw8IG1TY2FsZTsKKworICBhYy0+ZGV0ID0gKGZNdWx0RGl2MihhYy0+cjExcixhYy0+cjIycikgLSBmTXVsdERpdjIoYWMtPnIxMnIsYWMtPnIxMnIpKSA7CisgIG1TY2FsZSAgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoYWMtPmRldCkpOworCisgIGFjLT5kZXQgICAgIDw8PSBtU2NhbGU7CisgIGFjLT5kZXRfc2NhbGUgPSBtU2NhbGUgLSAxOworCisgIHJldHVybiBhdXRvQ29yclNjYWxpbmc7Cit9CisjZW5kaWYKKworI2lmbmRlZiBMT1dfUE9XRVJfU0JSX09OTFkKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9hdXRvQ29ycjJuZF9jcGx4KQorSU5UCithdXRvQ29ycjJuZF9jcGx4IChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIHJlYWwgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqaW1CdWZmZXIsICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBwYXJ0IG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgKQoreworCisgIGludCAgIGosIGF1dG9Db3JyU2NhbGluZywgbVNjYWxlLCBsZW5fc2NhbGU7CisKKyAgRklYUF9EQkwgYWNjdTAsIGFjY3UxLGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3U1LCBhY2N1NiwgYWNjdTcsIGFjY3U4OworCisgIGNvbnN0IEZJWFBfREJMICpwUmVCdWYsICpwSW1CdWY7CisKKyAgY29uc3QgRklYUF9EQkwgKnJlYWxCdWYgPSByZUJ1ZmZlcjsKKyAgY29uc3QgRklYUF9EQkwgKmltYWdCdWYgPSBpbUJ1ZmZlcjsKKworICAobGVuPjY0KSA/IChsZW5fc2NhbGUgPSA2KSA6IChsZW5fc2NhbGUgPSA1KTsKKyAgLyoKKyAgICByMDByLAorICAgIHIxMXIscjIycgorICAgIHIwMXIscjEycgorICAgIHIwMWkscjEyaQorICAgIHIwMnIscjAyaQorICAqLworICBhY2N1MSA9IGFjY3UzID0gYWNjdTUgPSBhY2N1NyA9IGFjY3U4ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgcFJlQnVmICA9IHJlYWxCdWYtMiwgcEltQnVmICA9IGltYWdCdWYtMjsKKyAgYWNjdTcgKz0gKCAoZk11bHREaXYyKHBSZUJ1ZlsyXSwgcFJlQnVmWzBdKSArIGZNdWx0RGl2MihwSW1CdWZbMl0sIHBJbUJ1ZlswXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U4ICs9ICggKGZNdWx0RGl2MihwSW1CdWZbMl0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOworCisgIHBSZUJ1ZiA9IHJlYWxCdWYtMSwgcEltQnVmID0gaW1hZ0J1Zi0xOworICBmb3IgKCBqID0gKGxlbiAtIDEpOyBqICE9IDA7IGotLSxwUmVCdWYrKyxwSW1CdWYrKyApeworICAgIGFjY3UxICs9ICggKGZQb3cyRGl2MihwUmVCdWZbMF0gICAgICAgICAgICkgKyBmUG93MkRpdjIocEltQnVmWzBdICAgICAgICAgICApKSA+PiBsZW5fc2NhbGUpOworICAgIGFjY3UzICs9ICggKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsxXSkgKyBmTXVsdERpdjIocEltQnVmWzBdLCBwSW1CdWZbMV0pKSA+PiBsZW5fc2NhbGUpOworICAgIGFjY3U1ICs9ICggKGZNdWx0RGl2MihwSW1CdWZbMV0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzFdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOworICAgIGFjY3U3ICs9ICggKGZNdWx0RGl2MihwUmVCdWZbMl0sIHBSZUJ1ZlswXSkgKyBmTXVsdERpdjIocEltQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOworICAgIGFjY3U4ICs9ICggKGZNdWx0RGl2MihwSW1CdWZbMl0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOworICB9CisKKyAgYWNjdTIgPSAoIChmUG93MkRpdjIocmVhbEJ1ZlstMl0pICsgZlBvdzJEaXYyKGltYWdCdWZbLTJdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTIgKz0gYWNjdTE7CisKKyAgYWNjdTEgKz0gKCAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuLTJdKSArCisgICAgICAgICAgICAgIGZQb3cyRGl2MihpbWFnQnVmW2xlbi0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3UwID0gKCAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuLTFdKSArCisgICAgICAgICAgICAgZlBvdzJEaXYyKGltYWdCdWZbbGVuLTFdKSkgPj4gbGVuX3NjYWxlKSAtCisgICAgICAgICAgKCAoZlBvdzJEaXYyKHJlYWxCdWZbLTFdKSArCisgICAgICAgICAgICAgZlBvdzJEaXYyKGltYWdCdWZbLTFdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTAgKz0gYWNjdTE7CisKKyAgYWNjdTQgPSAoIChmTXVsdERpdjIocmVhbEJ1ZlstMV0sIHJlYWxCdWZbLTJdKSArCisgICAgICAgICAgICAgZk11bHREaXYyKGltYWdCdWZbLTFdLCBpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U0ICs9IGFjY3UzOworCisgIGFjY3UzICs9ICggKGZNdWx0RGl2MihyZWFsQnVmW2xlbi0xXSwgcmVhbEJ1ZltsZW4tMl0pICsKKyAgICAgICAgICAgICAgZk11bHREaXYyKGltYWdCdWZbbGVuLTFdLCBpbWFnQnVmW2xlbi0yXSkpID4+IGxlbl9zY2FsZSk7CisKKyAgYWNjdTYgPSAoIChmTXVsdERpdjIoaW1hZ0J1ZlstMV0sIHJlYWxCdWZbLTJdKSAtCisgICAgICAgICAgICAgZk11bHREaXYyKHJlYWxCdWZbLTFdLCBpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U2ICs9IGFjY3U1OworCisgIGFjY3U1ICs9ICggKGZNdWx0RGl2MihpbWFnQnVmW2xlbiAtIDFdLCByZWFsQnVmW2xlbiAtIDJdKSAtCisgICAgICAgICAgICAgIGZNdWx0RGl2MihyZWFsQnVmW2xlbiAtIDFdLCBpbWFnQnVmW2xlbiAtIDJdKSkgPj4gbGVuX3NjYWxlKTsKKworICBtU2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoIChhY2N1MCB8IGFjY3UxIHwgYWNjdTIgfCBmQWJzKGFjY3UzKSB8IGZBYnMoYWNjdTQpIHwgZkFicyhhY2N1NSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzKGFjY3U2KSB8IGZBYnMoYWNjdTcpIHwgZkFicyhhY2N1OCkpICkgLSAxOworICBhdXRvQ29yclNjYWxpbmcgPSBtU2NhbGUgLSAxIC0gbGVuX3NjYWxlOyAvKiAtMSBiZWNhdXNlIG9mIGZNdWx0RGl2MiovCisKKyAgLyogU2NhbGUgdG8gY29tbW9uIHNjYWxlIGZhY3RvciAqLworICBhYy0+cjAwciA9IChGSVhQX0RCTClhY2N1MCA8PCBtU2NhbGU7CisgIGFjLT5yMTFyID0gKEZJWFBfREJMKWFjY3UxIDw8IG1TY2FsZTsKKyAgYWMtPnIyMnIgPSAoRklYUF9EQkwpYWNjdTIgPDwgbVNjYWxlOworICBhYy0+cjAxciA9IChGSVhQX0RCTClhY2N1MyA8PCBtU2NhbGU7CisgIGFjLT5yMTJyID0gKEZJWFBfREJMKWFjY3U0IDw8IG1TY2FsZTsKKyAgYWMtPnIwMWkgPSAoRklYUF9EQkwpYWNjdTUgPDwgbVNjYWxlOworICBhYy0+cjEyaSA9IChGSVhQX0RCTClhY2N1NiA8PCBtU2NhbGU7CisgIGFjLT5yMDJyID0gKEZJWFBfREJMKWFjY3U3IDw8IG1TY2FsZTsKKyAgYWMtPnIwMmkgPSAoRklYUF9EQkwpYWNjdTggPDwgbVNjYWxlOworCisgIGFjLT5kZXQgPSAoIGZNdWx0RGl2MihhYy0+cjExcixhYy0+cjIycikgPj4gMSApIC0KKyAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy0+cjEycixhYy0+cjEycikgKyBmTXVsdERpdjIoYWMtPnIxMmksYWMtPnIxMmkpKSA+PiAxICk7CisgIG1TY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhhYy0+ZGV0KSk7CisKKyAgYWMtPmRldCA8PD0gbVNjYWxlOworICBhYy0+ZGV0X3NjYWxlID0gbVNjYWxlIC0gMjsKKworICByZXR1cm4gYXV0b0NvcnJTY2FsaW5nOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2F1dG9Db3JyMm5kX2NwbHggKi8KKyNlbmRpZiAvKiBMT1dfUE9XRVJfU0JSX09OTFkgKi8KKworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9kY3QuY3BwIGIvYWFjL2xpYkZESy9zcmMvZGN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc1NWJkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvZGN0LmNwcApAQCAtMCwwICsxLDU0MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZSAgIGRjdC5jcHAKKyAgXGJyaWVmICBEQ1QgSW1wbGVtZW50YXRpb25zICAgCisgIExpYnJhcnkgZnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBzdGFuZGFyZCBEQ1RzLiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgYmUgcmVwbGFjZWQgYnkgaGFuZC1vcHRpbWl6ZWQKKyAgZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3Nvci4KKworICBUaHJlZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBkY3QgdHlwZSBJSSBhbmQgdGhlIGRjdCB0eXBlIElJSSB0cmFuc2Zvcm1zIGFyZSBwcm92aWRlZC4KKworICBCeSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgYmFzZWQgb24gYSBzaW5nbGUsIHN0YW5kYXJkIGNvbXBsZXggRkZULWtlcm5lbCBhcmUgdXNlZCAoZGN0SUlfZigpIGFuZCBkY3RJSUlfZigpKS4KKyAgVGhlc2UgYXJlIHNwZWNpZmljYWxseSBoZWxwZnVsIGluIGNhc2VzIHdoZXJlIG9wdGltaXplZCBGRlQgbGlicmFyaWVzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4gVGhlIEZGVCB1c2VkIGluIHRoZXNlCisgIGltcGxlbWVudGF0aW9uIGlzIEZGVCByYWQyIGZyb20gRkRLX3Rvb2xzLgorCisgIE9mIGNvdXJzZSwgb25lIG1pZ2h0IGFsc28gdXNlIERDVC1saWJyYXJpZXMgc2hvdWxkIHRoZXkgYmUgYXZhaWxhYmxlLiBUaGUgRENUIGFuZCBEU1QKKyAgdHlwZSBJViBpbXBsZW1lbnRhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgdmVyc2lvbiBiYXNlZCBvbiBhIGNvbXBsZXggRkZUIGtlcm5lbC4KKyovCisKKyNpbmNsdWRlICJkY3QuaCIKKworCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgImZmdC5oIgorCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSAiYXJtL2RjdF9hcm0uY3BwIgorI2VuZGlmCisKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RjdF9JSUkpCit2b2lkIGRjdF9JSUkoRklYUF9EQkwgKnBEYXQsIC8qITwgcG9pbnRlciB0byBpbnB1dC9vdXRwdXQgKi8KKyAgICAgICAgICAgICBGSVhQX0RCTCAqdG1wLCAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgICAgICAgaW50IEwsICAgICAgICAgIC8qITwgbGVuZ2h0IG9mIHRyYW5zZm9ybSAqLworICAgICAgICAgICAgIGludCAqcERhdF9lCisgICAgICAgICAgICAgKQoreworICBGREtfQVNTRVJUKEwgPT0gNjQgfHwgTCA9PSAzMik7CisgIGludCAgaTsKKyAgRklYUF9EQkwgeHIsIGFjY3UxLCBhY2N1MjsKKyAgaW50IGluYzsKKyAgaW50IE0gPSBMPj4xOworICBpbnQgbGRfTTsKKworICBpZiAoTCA9PSA2NCkgIGxkX00gPSA1OworICBlbHNlICAgICAgICAgIGxkX00gPSA0OworCisgIC8qIFRoaXMgbG9vcCBwZXJmb3JtcyBtdWx0aXBsaWNhdGlvbiBmb3IgaW5kZXggaSAoaSppbmMpICovCisgIGluYyA9ICg2NC8yKSA+PiBsZF9NOyAvKiA2NC9MICovCisKKyAgRklYUF9EQkwgKnBUbXBfMCA9ICZ0bXBbMl07CisgIEZJWFBfREJMICpwVG1wXzEgPSAmdG1wWyhNLTEpKjJdOworCisgIGZvcihpPTE7IGk8TT4+MTsgaSsrLHBUbXBfMCs9MixwVG1wXzEtPTIpIHsKKworICAgIEZJWFBfREJMIGFjY3UzLGFjY3U0LGFjY3U1LGFjY3U2OworCisgICAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSBpXSwgcERhdFtpXSwgc2luX3R3aWRkbGVfTDY0W2kqaW5jXSk7CisgICAgY3BseE11bHREaXYyKCZhY2N1NCwgJmFjY3UzLCBwRGF0W00raV0sIHBEYXRbTS1pXSwgc2luX3R3aWRkbGVfTDY0WyhNLWkpKmluY10pOworICAgIGFjY3UzID4+PSAxOyBhY2N1NCA+Pj0gMTsKKworICAgIC8qIFRoaXMgbWV0aG9kIGlzIGJldHRlciBmb3IgQVJNOTI2LCB0aGF0IHVzZXMgb3BlcmFuZDIgc2hpZnRlZCByaWdodCBieSAxIGFsd2F5cyAqLworICAgIGNwbHhNdWx0RGl2MigmYWNjdTYsICZhY2N1NSwgKGFjY3UzIC0gKGFjY3UxPj4xKSksICgoYWNjdTI+PjEpICsgYWNjdTQpLCBzaW5fdHdpZGRsZV9MNjRbKDQqaSkqaW5jXSk7CisgICAgeHIgPSAoYWNjdTE+PjEpICsgYWNjdTM7CisgICAgcFRtcF8wWzBdID0gKHhyPj4xKSAtIGFjY3U1OworICAgIHBUbXBfMVswXSA9ICh4cj4+MSkgKyBhY2N1NTsKKworICAgIHhyID0gKGFjY3UyPj4xKSAtIGFjY3U0OworICAgIHBUbXBfMFsxXSA9ICAoeHI+PjEpIC0gYWNjdTY7CisgICAgcFRtcF8xWzFdID0gLSgoeHI+PjEpICsgYWNjdTYpOworCisgIH0KKworICB4ciAgICAgPSBmTXVsdERpdjIocERhdFtNXSwgc2luX3R3aWRkbGVfTDY0WzY0LzJdLnYucmUgKTsvKiBjb3MoKFBJLygyKkwpKSpNKTsgKi8KKyAgdG1wWzBdID0gKChwRGF0WzBdPj4xKSArIHhyKT4+MTsKKyAgdG1wWzFdID0gKChwRGF0WzBdPj4xKSAtIHhyKT4+MTsKKworICBjcGx4TXVsdERpdjIoJmFjY3UyLCAmYWNjdTEsIHBEYXRbTCAtIChNLzIpXSwgcERhdFtNLzJdLCBzaW5fdHdpZGRsZV9MNjRbNjQvNF0pOworICB0bXBbTV0gICA9IGFjY3UxPj4xOworICB0bXBbTSsxXSA9IGFjY3UyPj4xOworCisgIC8qIGRpdF9mZnQgZXhwZWN0cyAxIGJpdCBzY2FsZWQgaW5wdXQgdmFsdWVzICovCisgIGZmdChNLCB0bXAsIHBEYXRfZSk7CisKKyAgLyogQVJNOTI2OiAxMiBjeWNsZXMgcGVyIDItaXRlcmF0aW9uLCBubyBvdmVyaGVhZCBjb2RlIGJ5IGNvbXBpbGVyICovCisgIHBUbXBfMSA9ICZ0bXBbTF07CisgIGZvciAoaSA9IE0+PjE7IGktLTspCisgIHsKKyAgICBGSVhQX0RCTCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgIHRtcDEgPSAqdG1wKys7CisgICAgdG1wMiA9ICp0bXArKzsKKyAgICB0bXAzID0gKi0tcFRtcF8xOworICAgIHRtcDQgPSAqLS1wVG1wXzE7CisgICAgKnBEYXQrKyA9IHRtcDE7CisgICAgKnBEYXQrKyA9IHRtcDM7CisgICAgKnBEYXQrKyA9IHRtcDI7CisgICAgKnBEYXQrKyA9IHRtcDQ7CisgIH0KKworICAqcERhdF9lICs9IDI7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RjdF9JSSkKK3ZvaWQgZGN0X0lJKEZJWFBfREJMICpwRGF0LCAvKiE8IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0ICovCisgICAgICAgICAgICBGSVhQX0RCTCAqdG1wLCAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgICAgICBpbnQgTCwgICAgICAgICAgLyohPCBsZW5naHQgb2YgdHJhbnNmb3JtICovCisgICAgICAgICAgICBpbnQgKnBEYXRfZQorICAgICAgICAgICAgKQoreworICAgIEZES19BU1NFUlQoTCA9PSA2NCB8fCBMID09IDMyKTsKKyAgICBGSVhQX0RCTCBhY2N1MSxhY2N1MjsKKyAgICBGSVhQX0RCTCAqcFRtcF8wLCAqcFRtcF8xOworCisgICAgaW50IGk7CisgICAgaW50IGluYzsKKyAgICBpbnQgTSA9ICBMPj4xOworICAgIGludCBsZF9NOworCisgICAgRkRLX0FTU0VSVChMID09IDY0IHx8IEwgPT0gMzIpOworICAgIGxkX00gPSA0ICsgKEwgPj4gNik7ICAvKiBMPTY0OiA1LCAgTD0zMjogNCAqLworCisgICAgaW5jID0gKDY0LzIpID4+IGxkX007IC8qIEw9NjQ6IDEsICBMPTMyOiAyICovCisKKyAgICBGSVhQX0RCTCAqcGRhdCAgPSAmcERhdFswXTsKKyAgICBGSVhQX0RCTCBhY2N1MywgYWNjdTQ7CisgICAgcFRtcF8wID0gJnRtcFswXTsKKyAgICBwVG1wXzEgPSAmdG1wW0wtMV07CisgICAgZm9yIChpID0gTT4+MTsgaS0tOyApCisgICAgeworICAgICAgYWNjdTEgPSAqcGRhdCsrOworICAgICAgYWNjdTIgPSAqcGRhdCsrOworICAgICAgYWNjdTMgPSAqcGRhdCsrOworICAgICAgYWNjdTQgPSAqcGRhdCsrOworICAgICAgYWNjdTEgPj49IDE7CisgICAgICBhY2N1MiA+Pj0gMTsKKyAgICAgIGFjY3UzID4+PSAxOworICAgICAgYWNjdTQgPj49IDE7CisgICAgICAqcFRtcF8wKysgPSBhY2N1MTsKKyAgICAgICpwVG1wXzArKyA9IGFjY3UzOworICAgICAgKnBUbXBfMS0tID0gYWNjdTI7CisgICAgICAqcFRtcF8xLS0gPSBhY2N1NDsKKyAgICB9CisKKworICAgIGZmdChNLCB0bXAsIHBEYXRfZSk7CisKKyAgICBwVG1wXzAgPSAmdG1wWzJdOworICAgIHBUbXBfMSA9ICZ0bXBbKE0tMSkqMl07CisKKyAgICBmb3IgKGk9MTsgaTxNPj4xOyBpKysscFRtcF8wKz0yLHBUbXBfMS09MikgeworCisgICAgICBGSVhQX0RCTCBhMSxhMjsKKyAgICAgIEZJWFBfREJMIGFjY3UzLCBhY2N1NDsKKworICAgICAgYTEgPSAoKHBUbXBfMFsxXT4+MSkgKyAocFRtcF8xWzFdPj4xKSk7CisgICAgICBhMiA9ICgocFRtcF8xWzBdPj4xKSAtIChwVG1wXzBbMF0+PjEpKTsKKworICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhMiwgYTEsIHNpbl90d2lkZGxlX0w2NFsoNCppKSppbmNdKTsKKyAgICAgIGFjY3UxPDw9MTsgYWNjdTI8PD0xOworCisgICAgICBhMSA9ICgocFRtcF8wWzBdPj4xKSArIChwVG1wXzFbMF0+PjEpKTsKKyAgICAgIGEyID0gKChwVG1wXzBbMV0+PjEpIC0gKHBUbXBfMVsxXT4+MSkpOworCisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIChhMSArIGFjY3UyKSwgLShhY2N1MSArIGEyKSwgc2luX3R3aWRkbGVfTDY0W2kqaW5jXSk7CisgICAgICBwRGF0W0wgLSBpXSA9IGFjY3U0OworICAgICAgcERhdFtpXSAgICAgPSBhY2N1MzsKKworICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgLSBhY2N1MiksIC0oYWNjdTEgLSBhMiksIHNpbl90d2lkZGxlX0w2NFsoTS1pKSppbmNdKTsKKyAgICAgIHBEYXRbTSArIGldID0gYWNjdTQ7CisgICAgICBwRGF0W00gLSBpXSA9IGFjY3UzOworCisgICAgfQorCisgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCB0bXBbTV0sIHRtcFtNKzFdLCBzaW5fdHdpZGRsZV9MNjRbKE0vMikqaW5jXSk7CisgICAgcERhdFtMIC0gKE0vMildID0gYWNjdTI7CisgICAgcERhdFtNLzJdICAgICAgID0gYWNjdTE7CisKKyAgICBwRGF0WzBdID0gKHRtcFswXT4+MSkrKHRtcFsxXT4+MSk7CisgICAgcERhdFtNXSA9ICBmTXVsdCgoKHRtcFswXT4+MSktKHRtcFsxXT4+MSkpLCBzaW5fdHdpZGRsZV9MNjRbNjQvMl0udi5yZSk7LyogY29zKChQSS8oMipMKSkqTSk7ICovCisKKyAgICAqcERhdF9lICs9IDI7Cit9CisjZW5kaWYKKworc3RhdGljCit2b2lkIGdldFRhYmxlcyhjb25zdCBGSVhQX1dUUCAqKnR3aWRkbGUsIGNvbnN0IEZJWFBfU1RQICoqc2luX3R3aWRkbGUsIGludCAqc2luX3N0ZXAsIGludCBsZW5ndGgpCit7CisgIGludCBsZDJfbGVuZ3RoOworCisgLyogR2V0IGxkMiBvZiBsZW5ndGggLSAyICsgMQorICAgICAtMjogYmVjYXVzZSBmaXJzdCB0YWJsZSBlbnRyeSBpcyB3aW5kb3cgb2Ygc2l6ZSA0CisgICAgICsxOiBiZWNhdXNlIHdlIGFscmVhZHkgaW5jbHVkZSArMSBiZWNhdXNlIG9mIGNlaWwobG9nMihsZW5ndGgpKSAqLworICBsZDJfbGVuZ3RoID0gREZSQUNUX0JJVFMtMS1mTm9ybXooKEZJWFBfREJMKWxlbmd0aCkgLSAxOworCisgIC8qIEV4dHJhY3Qgc29ydCBvZiAiZWlnZW52YWx1ZSIgKHRoZSA0IGxlZnQgbW9zdCBiaXRzKSBvZiBsZW5ndGguICovCisgIHN3aXRjaCAoIChsZW5ndGgpID4+IChsZDJfbGVuZ3RoLTEpICkgeworICAgIGNhc2UgMHg0OiAvKiByYWRpeCAyICovCisgICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGU1MTI7CisgICAgICAqc2luX3N0ZXAgPSAxPDwoOSAtIGxkMl9sZW5ndGgpOworICAgICAgKnR3aWRkbGUgPSB3aW5kb3dTbG9wZXNbMF1bMF1bbGQyX2xlbmd0aC0xXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg3OiAvKiAxMCBtcyAqLworICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlNDgwOworICAgICAgKnNpbl9zdGVwID0gMTw8KDggLSBsZDJfbGVuZ3RoKTsKKyAgICAgICp0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzFdW2xkMl9sZW5ndGhdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpzaW5fdHdpZGRsZSA9IE5VTEw7CisgICAgICAqc2luX3N0ZXAgPSAwOworICAgICAgKnR3aWRkbGUgPSBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBGREtfQVNTRVJUKCp0d2lkZGxlICE9IE5VTEwpOworCisgIEZES19BU1NFUlQoKnNpbl9zdGVwID4gMCk7CisKK30KKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RjdF9JVikKKwordm9pZCBkY3RfSVYoRklYUF9EQkwgKnBEYXQsCisgICAgICAgICAgICBpbnQgTCwKKyAgICAgICAgICAgIGludCAqcERhdF9lKQoreworICBpbnQgc2luX3N0ZXAgPSAwOworICBpbnQgTSA9IEwgPj4gMTsKKworICBjb25zdCBGSVhQX1dUUCAqdHdpZGRsZTsKKyAgY29uc3QgRklYUF9TVFAgKnNpbl90d2lkZGxlOworCisgIEZES19BU1NFUlQoTCA+PSA0KTsKKworICBnZXRUYWJsZXMoJnR3aWRkbGUsICZzaW5fdHdpZGRsZSwgJnNpbl9zdGVwLCBMKTsKKworI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMQorICBpZiAoTT49NCAmJiAoTSYzKSA9PSAwKSB7CisgICAgIC8qIEFSTTkyNjogNDQgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMiBjeWNsZXMvaXRlcmF0aW9uICovCisgICAgZGN0X0lWX2Z1bmMxKE0+PjIsIHR3aWRkbGUsICAmcERhdFswXSwgJnBEYXRbTC0xXSk7CisgIH0gZWxzZQorI2VuZGlmIC8qIEZVTkNUSU9OX2RjdF9JVl9mdW5jMSAqLworICB7CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCA9ICZwRGF0WzBdOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEgPSAmcERhdFtMIC0gMl07CisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAvKiAyOSBjeWNsZXMgb24gQVJNOTI2ICovCisgICAgZm9yIChpID0gMDsgaSA8IE0tMTsgaSs9MixwRGF0XzArPTIscERhdF8xLT0yKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworCisgICAgICBhY2N1MSA9IHBEYXRfMVsxXTsgYWNjdTIgPSBwRGF0XzBbMF07CisgICAgICBhY2N1MyA9IHBEYXRfMFsxXTsgYWNjdTQgPSBwRGF0XzFbMF07CisKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTQsIGFjY3UzLCB0d2lkZGxlW2krMV0pOworCisgICAgICBwRGF0XzBbMF0gPSBhY2N1MjsgcERhdF8wWzFdID0gYWNjdTE7CisgICAgICBwRGF0XzFbMF0gPSBhY2N1NDsgcERhdF8xWzFdID0gLWFjY3UzOworICAgIH0KKyAgICBpZiAoTSYxKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIEZJWFBfREJMIGFjY3UxLGFjY3UyOworCisgICAgICBhY2N1MSA9IHBEYXRfMVsxXTsgYWNjdTIgPSBwRGF0XzBbMF07CisKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKKworICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOworICAgIH0KKyAgfQorCisgIGZmdChNLCBwRGF0LCBwRGF0X2UpOworCisjaWZkZWYgRlVOQ1RJT05fZGN0X0lWX2Z1bmMyCisgIGlmIChNPj00ICYmIChNJjMpID09IDApIHsKKyAgICAgLyogQVJNOTI2OiA0MiBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIxIGN5Y2xlcy9pdGVyYXRpb24gKi8KKyAgICBkY3RfSVZfZnVuYzIoTT4+Miwgc2luX3R3aWRkbGUsICZwRGF0WzBdLCAmcERhdFtMXSwgc2luX3N0ZXApOworICB9IGVsc2UKKyNlbmRpZiAvKiBGVU5DVElPTl9kY3RfSVZfZnVuYzIgKi8KKyAgeworICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAgPSAmcERhdFswXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xID0gJnBEYXRbTCAtIDJdOworICAgIHJlZ2lzdGVyIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworICAgIGludCBpZHgsIGk7CisKKyAgICAvKiBTaW4gYW5kIENvcyB2YWx1ZXMgYXJlIDAuMGYgYW5kIDEuMGYgKi8KKyAgICBhY2N1MSA9IHBEYXRfMVswXTsKKyAgICBhY2N1MiA9IHBEYXRfMVsxXTsKKworICAgIHBEYXRfMVsxXSA9IC0ocERhdF8wWzFdPj4xKTsKKyAgICBwRGF0XzBbMF0gPSAocERhdF8wWzBdPj4xKTsKKworCisgICAgLyogMjggY3ljbGVzIGZvciBBUk05MjYgKi8KKyAgICBmb3IgKGlkeCA9IHNpbl9zdGVwLGk9MTsgaTwoTSsxKT4+MTsgaSsrLCBpZHgrPXNpbl9zdGVwKQorICAgIHsKKyAgICAgIEZJWFBfU1RQIHR3ZCA9IHNpbl90d2lkZGxlW2lkeF07CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3UxLCBhY2N1MiwgdHdkKTsKKyAgICAgIHBEYXRfMFsxXSA9ICBhY2N1MzsKKyAgICAgIHBEYXRfMVswXSA9ICBhY2N1NDsKKworICAgICAgcERhdF8wKz0yOworICAgICAgcERhdF8xLT0yOworCisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBEYXRfMFsxXSwgcERhdF8wWzBdLCB0d2QpOworCisgICAgICBhY2N1MSA9IHBEYXRfMVswXTsKKyAgICAgIGFjY3UyID0gcERhdF8xWzFdOworCisgICAgICBwRGF0XzFbMV0gPSAtYWNjdTM7CisgICAgICBwRGF0XzBbMF0gPSAgYWNjdTQ7CisgICAgfQorCisgICAgaWYgKCAoTSYxKSA9PSAwICkKKyAgICB7CisgICAgICAvKiBMYXN0IFNpbiBhbmQgQ29zIHZhbHVlIHBhaXIgYXJlIHRoZSBzYW1lICovCisgICAgICBhY2N1MSA9IGZNdWx0RGl2MihhY2N1MSwgV1RDKDB4NWE4Mjc5OWEpKTsKKyAgICAgIGFjY3UyID0gZk11bHREaXYyKGFjY3UyLCBXVEMoMHg1YTgyNzk5YSkpOworCisgICAgICBwRGF0XzFbMF0gPSBhY2N1MSArIGFjY3UyOworICAgICAgcERhdF8wWzFdID0gYWNjdTEgLSBhY2N1MjsKKyAgICB9CisgIH0KKworICAvKiBBZGQgdHdpZGRlbGluZyBzY2FsZS4gKi8KKyAgKnBEYXRfZSArPSAyOworfQorI2VuZGlmIC8qIGRlZmluZWQgKEZVTkNUSU9OX2RjdF9JVikgKi8KKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RzdF9JVikKK3ZvaWQgZHN0X0lWKEZJWFBfREJMICpwRGF0LAorICAgICAgICAgICAgaW50IEwsCisgICAgICAgICAgICBpbnQgKnBEYXRfZSApCit7CisgIGludCBzaW5fc3RlcCA9IDA7CisgIGludCBNID0gTCA+PiAxOworCisgIGNvbnN0IEZJWFBfV1RQICp0d2lkZGxlOworICBjb25zdCBGSVhQX1NUUCAqc2luX3R3aWRkbGU7CisKKyNpZmRlZiBEU1RJVjJfRU5BQkxFCisgIGlmIChMID09IDIpIHsKKyAgICBjb25zdCBGSVhQX1NUUCB0YWIgPSBTVENQKDB4NzY0MUFGM0QsIDB4MzBGQjk0NTIpOworICAgIEZJWFBfREJMIHRtcDEsIHRtcDI7CisKKyAgICBjcGx4TXVsdERpdjIoJnRtcDIsICZ0bXAxLCBwRGF0WzBdLCBwRGF0WzFdLCB0YWIpOworCisgICAgcERhdFswXSA9IHRtcDE7CisgICAgcERhdFsxXSA9IHRtcDI7CisKKyAgICAqcERhdF9lICs9IDE7CisKKyAgICByZXR1cm47CisgIH0KKyNlbHNlCisgIEZES19BU1NFUlQoTCA+PSA0KTsKKyNlbmRpZgorCisgIGdldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOworCisjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMxCisgIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKKyAgICBkc3RfSVZfZnVuYzEoTSwgdHdpZGRsZSwgJnBEYXRbMF0sICZwRGF0W0xdKTsKKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAgPSAmcERhdFswXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xID0gJnBEYXRbTCAtIDJdOworCisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAvKiAzNCBjeWNsZXMgb24gQVJNOTI2ICovCisgICAgZm9yIChpID0gMDsgaSA8IE0tMTsgaSs9MixwRGF0XzArPTIscERhdF8xLT0yKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworCisgICAgICBhY2N1MSA9ICBwRGF0XzFbMV07IGFjY3UyID0gLXBEYXRfMFswXTsKKyAgICAgIGFjY3UzID0gIHBEYXRfMFsxXTsgYWNjdTQgPSAtcERhdF8xWzBdOworCisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGFjY3UxLCBhY2N1MiwgdHdpZGRsZVtpXSk7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3U0LCBhY2N1MywgdHdpZGRsZVtpKzFdKTsKKworICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOworICAgICAgcERhdF8xWzBdID0gYWNjdTQ7IHBEYXRfMVsxXSA9IC1hY2N1MzsKKyAgICB9CisgICAgaWYgKE0mMSkKKyAgICB7CisgICAgICByZWdpc3RlciBGSVhQX0RCTCBhY2N1MSxhY2N1MjsKKworICAgICAgYWNjdTEgPSAgcERhdF8xWzFdOyBhY2N1MiA9IC1wRGF0XzBbMF07CisKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKKworICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOworICAgIH0KKyAgfQorCisgIGZmdChNLCBwRGF0LCBwRGF0X2UpOworCisjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMyCisgIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKKyAgICBkc3RfSVZfZnVuYzIoTT4+Miwgc2luX3R3aWRkbGUgKyBzaW5fc3RlcCwgJnBEYXRbMF0sICZwRGF0W0wgLSAxXSwgc2luX3N0ZXApOworICB9IGVsc2UKKyNlbmRpZiAvKiBGVU5DVElPTl9kc3RfSVZfZnVuYzIgKi8KKyAgeworICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzA7CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMTsKKyAgICByZWdpc3RlciBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MyxhY2N1NDsKKyAgICBpbnQgaWR4LCBpOworCisgICAgcERhdF8wID0gJnBEYXRbMF07CisgICAgcERhdF8xID0gJnBEYXRbTCAtIDJdOworCisgICAgLyogU2luIGFuZCBDb3MgdmFsdWVzIGFyZSAwLjBmIGFuZCAxLjBmICovCisgICAgYWNjdTEgPSBwRGF0XzFbMF07CisgICAgYWNjdTIgPSBwRGF0XzFbMV07CisKKyAgICBwRGF0XzFbMV0gPSAtKHBEYXRfMFswXT4+MSk7CisgICAgcERhdF8wWzBdID0gKHBEYXRfMFsxXT4+MSk7CisKKyAgICBmb3IgKGlkeCA9IHNpbl9zdGVwLGk9MTsgaTwoTSsxKT4+MTsgaSsrLCBpZHgrPXNpbl9zdGVwKQorICAgIHsKKyAgICAgIEZJWFBfU1RQIHR3ZCA9IHNpbl90d2lkZGxlW2lkeF07CisKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTEsIGFjY3UyLCB0d2QpOworICAgICAgcERhdF8xWzBdID0gIC1hY2N1MzsKKyAgICAgIHBEYXRfMFsxXSA9ICAtYWNjdTQ7CisKKyAgICAgIHBEYXRfMCs9MjsKKyAgICAgIHBEYXRfMS09MjsKKworICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwRGF0XzBbMV0sIHBEYXRfMFswXSwgdHdkKTsKKworICAgICAgYWNjdTEgPSBwRGF0XzFbMF07CisgICAgICBhY2N1MiA9IHBEYXRfMVsxXTsKKworICAgICAgcERhdF8wWzBdID0gIGFjY3UzOworICAgICAgcERhdF8xWzFdID0gLWFjY3U0OworICAgIH0KKworICAgIGlmICggKE0mMSkgPT0gMCApCisgICAgeworICAgICAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLworICAgICAgYWNjdTEgPSBmTXVsdERpdjIoYWNjdTEsIFdUQygweDVhODI3OTlhKSk7CisgICAgICBhY2N1MiA9IGZNdWx0RGl2MihhY2N1MiwgV1RDKDB4NWE4Mjc5OWEpKTsKKworICAgICAgcERhdF8wWzFdID0gLSBhY2N1MSAtIGFjY3UyOworICAgICAgcERhdF8xWzBdID0gICBhY2N1MiAtIGFjY3UxOworICAgIH0KKyAgfQorCisgIC8qIEFkZCB0d2lkZGVsaW5nIHNjYWxlLiAqLworICAqcERhdF9lICs9IDI7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fZHN0X0lWKSAqLworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL2ZmdC5jcHAgYi9hYWMvbGliRkRLL3NyYy9mZnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2E3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9mZnQuY3BwCkBAIC0wLDAgKzEsMTQwMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBEU1AgU29sdXRpb25zCisgICBEZXNjcmlwdGlvbjogRml4IHBvaW50IEZGVAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZnQuaCIKKworI2luY2x1ZGUgImZmdF9yYWQyLmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCisKKworCisKKyNkZWZpbmUgRjNDKHgpIFNUQyh4KQorCisjZGVmaW5lICAgICBDMzEgICAgICAgKEYzQygweDkxMjYxNDY4KSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCgtMC44NjYwMjU0MCkgICAqLworCisvKiBQZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCAzIGFjY29yZGluZyB0byB0aGUgYWxnb3JpdGhtIGFmdGVyIHdpbm9ncmFkLgorICAgTm8gc2NhbGluZyBvZiB0aGUgaW5wdXQgdmVjdG9yIGJlY2F1c2UgdGhlIHNjYWxpbmcgaXMgYWxyZWFkeSBkb25lIGluIHRoZSByb3RhdGlvbiB2ZWN0b3IuICovCitzdGF0aWMgRk9SQ0VJTkxJTkUgdm9pZCBmZnQzKEZJWFBfREJMICpSRVNUUklDVCBwRGF0KQoreworICBGSVhQX0RCTCByMSxyMjsKKyAgRklYUF9EQkwgczEsczI7CisgIC8qIHJlYWwgcGFydCAqLworICByMSAgICAgID0gcERhdFsyXSArIHBEYXRbNF07CisgIHIyICAgICAgPSBmTXVsdCgocERhdFsyXSAtIHBEYXRbNF0pLCBDMzEpOworICBwRGF0WzBdID0gcERhdFswXSArIHIxOworICByMSAgICAgID0gcERhdFswXSAtIHIxIC0gKHIxPj4xKTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICBzMSAgICAgID0gcERhdFszXSArIHBEYXRbNV07CisgIHMyICAgICAgPSBmTXVsdCgocERhdFszXSAtIHBEYXRbNV0pLCBDMzEpOworICBwRGF0WzFdID0gcERhdFsxXSArIHMxOworICBzMSAgICAgID0gcERhdFsxXSAtIHMxIC0gKHMxPj4xKTsKKworICAvKiBjb21iaW5hdGlvbiAqLworICBwRGF0WzJdID0gcjEgLSBzMjsKKyAgcERhdFs0XSA9IHIxICsgczI7CisgIHBEYXRbM10gPSBzMSArIHIyOworICBwRGF0WzVdID0gczEgLSByMjsKK30KKworCisjZGVmaW5lIEY1Qyh4KSBTVEMoeCkKKworI2RlZmluZSAgICAgQzUxICAgICAgIChGNUMoMHg3OWJjMzg1NCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoIDAuOTUxMDU2NTIpICAgKi8KKyNkZWZpbmUgICAgIEM1MiAgICAgICAoRjVDKDB4OWQ4MzlkYjApKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjUzODg0MTgwLzIpICovCisjZGVmaW5lICAgICBDNTMgICAgICAgKEY1QygweGQxODA1M2NlKSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCgtMC4zNjMyNzEyNikgICAqLworI2RlZmluZSAgICAgQzU0ICAgICAgIChGNUMoMHg0NzhkZGU2NCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoIDAuNTU5MDE2OTkpICAgKi8KKyNkZWZpbmUgICAgIEM1NSAgICAgICAoRjVDKDB4YjAwMDAwMDEpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjI1LzIpICAgICAgICovCisKKy8qIHBlcmZvcm1zIHRoZSBGRlQgb2YgbGVuZ3RoIDUgYWNjb3JkaW5nIHRvIHRoZSBhbGdvcml0aG0gYWZ0ZXIgd2lub2dyYWQgKi8KK3N0YXRpYyBGT1JDRUlOTElORSB2b2lkIGZmdDUoRklYUF9EQkwgKlJFU1RSSUNUIHBEYXQpCit7CisgIEZJWFBfREJMIHIxLHIyLHIzLHI0OworICBGSVhQX0RCTCBzMSxzMixzMyxzNDsKKyAgRklYUF9EQkwgdDsKKworICAvKiByZWFsIHBhcnQgKi8KKyAgcjEgICAgICA9IHBEYXRbMl0gKyBwRGF0WzhdOworICByNCAgICAgID0gcERhdFsyXSAtIHBEYXRbOF07CisgIHIzICAgICAgPSBwRGF0WzRdICsgcERhdFs2XTsKKyAgcjIgICAgICA9IHBEYXRbNF0gLSBwRGF0WzZdOworICB0ICAgICAgID0gZk11bHQoKHIxLXIzKSwgQzU0KTsKKyAgcjEgICAgICA9IHIxICsgcjM7CisgIHBEYXRbMF0gPSBwRGF0WzBdICsgcjE7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgcjEgICAgICA9IHBEYXRbMF0gKyAoZk11bHREaXYyKHIxLCBDNTUpIDw8KDIpKTsKKyAgcjMgICAgICA9IHIxIC0gdDsKKyAgcjEgICAgICA9IHIxICsgdDsKKyAgdCAgICAgICA9IGZNdWx0KChyNCArIHIyKSwgQzUxKTsKKyAgLyogQml0IHNoaWZ0IGxlZnQgYmVjYXVzZSBvZiB0aGUgY29uc3RhbnQgQzU1IHdoaWNoIHdhcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDAuNSBiZWNhdXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBvZgorICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLworICByNCAgICAgID0gdCArIChmTXVsdERpdjIocjQsIEM1MikgPDwoMikpOworICByMiAgICAgID0gdCArIGZNdWx0KHIyLCBDNTMpOworCisgIC8qIGltYWdpbmFyeSBwYXJ0ICovCisgIHMxICAgICAgPSBwRGF0WzNdICsgcERhdFs5XTsKKyAgczQgICAgICA9IHBEYXRbM10gLSBwRGF0WzldOworICBzMyAgICAgID0gcERhdFs1XSArIHBEYXRbN107CisgIHMyICAgICAgPSBwRGF0WzVdIC0gcERhdFs3XTsKKyAgdCAgICAgICA9IGZNdWx0KChzMSAtIHMzKSwgQzU0KTsKKyAgczEgICAgICA9IHMxICsgczM7CisgIHBEYXRbMV0gPSBwRGF0WzFdICsgczE7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgczEgICAgICA9IHBEYXRbMV0gKyAoZk11bHREaXYyKHMxLCBDNTUpIDw8KDIpKTsKKyAgczMgICAgICA9IHMxIC0gdDsKKyAgczEgICAgICA9IHMxICsgdDsKKyAgdCAgICAgICA9IGZNdWx0KChzNCArIHMyKSwgQzUxKTsKKyAgLyogQml0IHNoaWZ0IGxlZnQgYmVjYXVzZSBvZiB0aGUgY29uc3RhbnQgQzU1IHdoaWNoIHdhcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDAuNSBiZWNhdXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBvZgorICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLworICBzNCAgICAgID0gdCArIChmTXVsdERpdjIoczQsIEM1MikgPDwoMikpOworICBzMiAgICAgID0gdCArIGZNdWx0KHMyLCBDNTMpOworCisgIC8qIGNvbWJpbmF0aW9uICovCisgIHBEYXRbMl0gPSByMSArIHMyOworICBwRGF0WzhdID0gcjEgLSBzMjsKKyAgcERhdFs0XSA9IHIzIC0gczQ7CisgIHBEYXRbNl0gPSByMyArIHM0OworCisgIHBEYXRbM10gPSBzMSAtIHIyOworICBwRGF0WzldID0gczEgKyByMjsKKyAgcERhdFs1XSA9IHMzICsgcjQ7CisgIHBEYXRbN10gPSBzMyAtIHI0OworfQorCisKKworCisjZGVmaW5lIE4zICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE41ICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE42ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE4xNSAgICAgICAgICAgICAgICAgICAxNQorCisvKiBQZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCAxNS4gSXQgaXMgc3BsaXQgaW50byBGRlRzIG9mIGxlbmd0aCAzIGFuZCBsZW5ndGggNS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQxNShGSVhQX0RCTCAqcElucHV0KQoreworICBGSVhQX0RCTCAgYURzdFsyKk4xNV07CisgIEZJWFBfREJMICBhRHN0MVsyKk4xNV07CisgIGludCAgICBpLGssbDsKKworICAvKiBTb3J0IGlucHV0IHZlY3RvciBmb3IgZmZ0J3Mgb2YgbGVuZ3RoIDMKKyAgaW5wdXQzKDA6MikgICA9IFtpbnB1dCgwKSBpbnB1dCg1KSBpbnB1dCgxMCldOworICBpbnB1dDMoMzo1KSAgID0gW2lucHV0KDMpIGlucHV0KDgpIGlucHV0KDEzKV07CisgIGlucHV0Myg2OjgpICAgPSBbaW5wdXQoNikgaW5wdXQoMTEpIGlucHV0KDEpXTsKKyAgaW5wdXQzKDk6MTEpICA9IFtpbnB1dCg5KSBpbnB1dCgxNCkgaW5wdXQoNCldOworICBpbnB1dDMoMTI6MTQpID0gW2lucHV0KDEyKSBpbnB1dCgyKSBpbnB1dCg3KV07ICovCisgIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IHBJbnB1dDsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdCA9IGFEc3Q7CisgICAgLyogTWVyZ2UgMyBsb29wcyBpbnRvIG9uZSwgc2tpcCBjYWxsIG9mIGZmdDMgKi8KKyAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjU7IGkrKywgays9NikKKyAgICB7CisgICAgICBwRHN0W2srMF0gPSBwU3JjW2xdOworICAgICAgcERzdFtrKzFdID0gcFNyY1tsKzFdOworICAgICAgbCArPSAyKk41OworICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKKyAgICAgICAgICBsIC09ICgyKk4xNSk7CisKKyAgICAgIHBEc3RbaysyXSA9IHBTcmNbbF07CisgICAgICBwRHN0W2srM10gPSBwU3JjW2wrMV07CisgICAgICBsICs9IDIqTjU7CisgICAgICBpZiAobCA+PSAoMipOMTUpKQorICAgICAgICAgIGwgLT0gKDIqTjE1KTsKKyAgICAgIHBEc3Rbays0XSA9IHBTcmNbbF07CisgICAgICBwRHN0W2srNV0gPSBwU3JjW2wrMV07CisgICAgICBsICs9ICgyKk41KSArICgyKk4zKTsKKyAgICAgIGlmIChsID49ICgyKk4xNSkpCisgICAgICAgICAgbCAtPSAoMipOMTUpOworCisgICAgICAvKiBmZnQzIG1lcmdlZCB3aXRoIHNoaWZ0IHJpZ2h0IGJ5IDIgbG9vcCAqLworICAgICAgRklYUF9EQkwgcjEscjIscjM7CisgICAgICBGSVhQX0RCTCBzMSxzMjsKKyAgICAgIC8qIHJlYWwgcGFydCAqLworICAgICAgcjEgICAgICA9IHBEc3RbaysyXSArIHBEc3Rbays0XTsKKyAgICAgIHIyICAgICAgPSBmTXVsdCgocERzdFtrKzJdIC0gcERzdFtrKzRdKSwgQzMxKTsKKyAgICAgIHMxICAgICAgPSBwRHN0W2srMF07CisgICAgICBwRHN0W2srMF0gPSAoczEgKyByMSk+PjI7CisgICAgICByMSAgICAgID0gczEgLSAocjE+PjEpOworCisgICAgICAvKiBpbWFnaW5hcnkgcGFydCAqLworICAgICAgczEgICAgICA9IHBEc3RbayszXSArIHBEc3Rbays1XTsKKyAgICAgIHMyICAgICAgPSBmTXVsdCgocERzdFtrKzNdIC0gcERzdFtrKzVdKSwgQzMxKTsKKyAgICAgIHIzICAgICAgPSBwRHN0W2srMV07CisgICAgICBwRHN0W2srMV0gPSAocjMgKyBzMSk+PjI7CisgICAgICBzMSAgICAgID0gcjMgLSAoczE+PjEpOworCisgICAgICAvKiBjb21iaW5hdGlvbiAqLworICAgICAgcERzdFtrKzJdID0gKHIxIC0gczIpPj4yOworICAgICAgcERzdFtrKzRdID0gKHIxICsgczIpPj4yOworICAgICAgcERzdFtrKzNdID0gKHMxICsgcjIpPj4yOworICAgICAgcERzdFtrKzVdID0gKHMxIC0gcjIpPj4yOworICAgIH0KKyAgfQorICAvKiBTb3J0IGlucHV0IHZlY3RvciBmb3IgZmZ0J3Mgb2YgbGVuZ3RoIDUKKyAgaW5wdXQ1KDA6NCkgICA9IFtvdXRwdXQzKDApIG91dHB1dDMoMykgb3V0cHV0Myg2KSBvdXRwdXQzKDkpIG91dHB1dDMoMTIpXTsKKyAgaW5wdXQ1KDU6OSkgICA9IFtvdXRwdXQzKDEpIG91dHB1dDMoNCkgb3V0cHV0Myg3KSBvdXRwdXQzKDEwKSBvdXRwdXQzKDEzKV07CisgIGlucHV0NSgxMDoxNCkgPSBbb3V0cHV0MygyKSBvdXRwdXQzKDUpIG91dHB1dDMoOCkgb3V0cHV0MygxMSkgb3V0cHV0MygxNCldOyAqLworICAvKiBNZXJnZSAyIGxvb3BzIGludG8gb25lLCBicmluZ3MgYWJvdXQgMTAlICovCisgIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IGFEc3Q7CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgPSBhRHN0MTsKKyAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjM7IGkrKywgays9MTApCisgICAgeworICAgICAgbCA9IDIqaTsKKyAgICAgIHBEc3RbayswXSA9IHBTcmNbbCswXTsKKyAgICAgIHBEc3RbaysxXSA9IHBTcmNbbCsxXTsKKyAgICAgIHBEc3RbaysyXSA9IHBTcmNbbCswKygyKk4zKV07CisgICAgICBwRHN0W2srM10gPSBwU3JjW2wrMSsoMipOMyldOworICAgICAgcERzdFtrKzRdID0gcFNyY1tsKzArKDQqTjMpXTsKKyAgICAgIHBEc3Rbays1XSA9IHBTcmNbbCsxKyg0Kk4zKV07CisgICAgICBwRHN0W2srNl0gPSBwU3JjW2wrMCsoNipOMyldOworICAgICAgcERzdFtrKzddID0gcFNyY1tsKzErKDYqTjMpXTsKKyAgICAgIHBEc3Rbays4XSA9IHBTcmNbbCswKyg4Kk4zKV07CisgICAgICBwRHN0W2srOV0gPSBwU3JjW2wrMSsoOCpOMyldOworICAgICAgZmZ0NSgmcERzdFtrXSk7CisgICAgfQorICB9CisgIC8qIFNvcnQgb3V0cHV0IHZlY3RvciBvZiBsZW5ndGggMTUKKyAgb3V0cHV0ID0gW291dDUoMCkgIG91dDUoNikgIG91dDUoMTIpIG91dDUoMykgIG91dDUoOSkKKyAgICAgICAgICAgIG91dDUoMTApIG91dDUoMSkgIG91dDUoNykgIG91dDUoMTMpIG91dDUoNCkKKyAgICAgICAgICAgIG91dDUoNSkgIG91dDUoMTEpIG91dDUoMikgIG91dDUoOCkgIG91dDUoMTQpXTsgKi8KKyAgLyogb3B0aW1pemUgY2x1bXN5IGxvb3AsIGJyaW5ncyBhYm91dCA1JSAqLworICB7CisgICAgY29uc3QgRklYUF9EQkwgKnBTcmMgPSBhRHN0MTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdCA9IHBJbnB1dDsKKyAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjM7IGkrKywgays9MTApCisgICAgeworICAgICAgcERzdFtrKzBdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbaysxXSA9IHBTcmNbbCsxXTsKKyAgICAgIGwgKz0gKDIqTjYpOworICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKKyAgICAgICAgICBsIC09ICgyKk4xNSk7CisgICAgICBwRHN0W2srMl0gPSBwU3JjW2xdOworICAgICAgcERzdFtrKzNdID0gcFNyY1tsKzFdOworICAgICAgbCArPSAoMipONik7CisgICAgICBpZiAobCA+PSAoMipOMTUpKQorICAgICAgICAgIGwgLT0gKDIqTjE1KTsKKyAgICAgIHBEc3Rbays0XSA9IHBTcmNbbF07CisgICAgICBwRHN0W2srNV0gPSBwU3JjW2wrMV07CisgICAgICBsICs9ICgyKk42KTsKKyAgICAgIGlmIChsID49ICgyKk4xNSkpCisgICAgICAgICAgbCAtPSAoMipOMTUpOworICAgICAgcERzdFtrKzZdID0gcFNyY1tsXTsKKyAgICAgIHBEc3Rbays3XSA9IHBTcmNbbCsxXTsKKyAgICAgIGwgKz0gKDIqTjYpOworICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKKyAgICAgICAgICBsIC09ICgyKk4xNSk7CisgICAgICBwRHN0W2srOF0gPSBwU3JjW2xdOworICAgICAgcERzdFtrKzldID0gcFNyY1tsKzFdOworICAgICAgbCArPSAyOyAgICAvKiBubyBtb2R1bG8gY2hlY2sgbmVlZGVkLCBpdCBjYW5ub3Qgb2NjdXIgKi8KKyAgICB9CisgIH0KK30KKworI2RlZmluZSBXX1BpRk9VUlRIIFNUQygweDVhODI3OTlhKQorI2lmbmRlZiBTVU1ESUZGX1BJRk9VUlRICisjZGVmaW5lIFNVTURJRkZfUElGT1VSVEgoZGlmZixzdW0sYSxiKSBcCisgIHsgXAorICAgIEZJWFBfREJMIHdhLCB3YjtcCisgICAgd2EgPSBmTXVsdERpdjIoYSwgV19QaUZPVVJUSCk7XAorICAgIHdiID0gZk11bHREaXYyKGIsIFdfUGlGT1VSVEgpO1wKKyAgICBkaWZmID0gd2IgLSB3YTtcCisgICAgc3VtICA9IHdiICsgd2E7XAorICB9CisjZW5kaWYKKworLyogVGhpcyB2ZXJzaW9uIGlzIG1vcmUgb3ZlcmZsb3cgc2F2ZSwgYnV0IGxlc3MgY3ljbGUgb3B0aW1hbC4gKi8KKyNkZWZpbmUgU1VNRElGRl9FSUdUSCh4LCB5LCBpeCwgaXksIHZyLCB2aSwgdXIsIHVpKSBcCisgIHZyID0gKHhbIDAgKyBpeF0+PjEpICsgKHhbMTYgKyBpeF0+PjEpOyAgLyogUmUgQSArIFJlIEIgKi8gXAorICB2aSA9ICh4WyA4ICsgaXhdPj4xKSArICh4WzI0ICsgaXhdPj4xKTsgICAgIC8qIFJlIEMgKyBSZSBEICovIFwKKyAgdXIgPSAoeFsgMSArIGl4XT4+MSkgKyAoeFsxNyArIGl4XT4+MSk7ICAvKiBJbSBBICsgSW0gQiAqLyBcCisgIHVpID0gKHhbIDkgKyBpeF0+PjEpICsgKHhbMjUgKyBpeF0+PjEpOyAgICAgLyogSW0gQyArIEltIEQgKi8gXAorICB5WyAwICsgaXldID0gdnIgKyB2aTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8gICAgXAorICB5WyA0ICsgaXldID0gdnIgLSB2aTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLyAgXAorICB5WyAxICsgaXldID0gdXIgKyB1aTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovICAgICAgXAorICB5WyA1ICsgaXldID0gdXIgLSB1aTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8gXAorICB2ciAtPSB4WzE2ICsgaXhdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8gXAorICB2aSA9IHZpIC0geFsyNCArIGl4XTsgICAgICAgICAgLyogUmUgQyAtIFJlIEQgKi8gXAorICB1ciAtPSB4WzE3ICsgaXhdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8gXAorICB1aSA9IHVpIC0geFsyNSArIGl4XTsgICAgICAgICAgLyogSW0gQyAtIEltIEQgKi8gXAorICB5WyAyICsgaXldID0gdWkgKyB2cjsgICAgICAgICAgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLyBcCisgIHlbIDYgKyBpeV0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovIFwKKyAgeVsgMyArIGl5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLyAgXAorICB5WyA3ICsgaXldID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworc3RhdGljIGNvbnN0IEZJWFBfU1RQIGZmdDE2X3cxNlsyXSA9ICB7IFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCkgfTsKKworTE5LX1NFQ1RJT05fQ09ERV9MMQoraW5saW5lIHZvaWQgZmZ0XzE2KEZJWFBfREJMICpSRVNUUklDVCB4KQoreworICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKKyAgRklYUF9EQkwgeVszMl07CisKKyAgU1VNRElGRl9FSUdUSCh4LCB5LCAwLCAgMCwgdnIsIHZpLCB1ciwgdWkpOworICBTVU1ESUZGX0VJR1RIKHgsIHksIDQsICA4LCB2ciwgdmksIHVyLCB1aSk7CisgIFNVTURJRkZfRUlHVEgoeCwgeSwgMiwgMTYsIHZyLCB2aSwgdXIsIHVpKTsKKyAgU1VNRElGRl9FSUdUSCh4LCB5LCA2LCAyNCwgdnIsIHZpLCB1ciwgdWkpOworCisvLyB4dDEgPSAgMAorLy8geHQyID0gIDgKKyAgdnIgPSB5WyA4XTsKKyAgdmkgPSB5WyA5XTsKKyAgdXIgPSB5WyAwXT4+MTsKKyAgdWkgPSB5WyAxXT4+MTsKKyAgeFsgMF0gPSB1ciArICh2cj4+MSk7CisgIHhbIDFdID0gdWkgKyAodmk+PjEpOworICB4WyA4XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFsgOV0gPSB1aSAtICh2aT4+MSk7CisKKy8vIHh0MSA9ICA0CisvLyB4dDIgPSAxMgorICB2ciA9IHlbMTNdOworICB2aSA9IHlbMTJdOworICB1ciA9IHlbIDRdPj4xOworICB1aSA9IHlbIDVdPj4xOworICB4WyA0XSA9IHVyICsgKHZyPj4xKTsKKyAgeFsgNV0gPSB1aSAtICh2aT4+MSk7CisgIHhbMTJdID0gdXIgLSAodnI+PjEpOworICB4WzEzXSA9IHVpICsgKHZpPj4xKTsKKworLy8geHQxID0gMTYKKy8vIHh0MiA9IDI0CisgIHZyID0geVsyNF07CisgIHZpID0geVsyNV07CisgIHVyID0geVsxNl0+PjE7CisgIHVpID0geVsxN10+PjE7CisgIHhbMTZdID0gdXIgKyAodnI+PjEpOworICB4WzE3XSA9IHVpICsgKHZpPj4xKTsKKyAgeFsyNF0gPSB1ciAtICh2cj4+MSk7CisgIHhbMjVdID0gdWkgLSAodmk+PjEpOworCisvLyB4dDEgPSAyMAorLy8geHQyID0gMjgKKyAgdnIgPSB5WzI5XTsKKyAgdmkgPSB5WzI4XTsKKyAgdXIgPSB5WzIwXT4+MTsKKyAgdWkgPSB5WzIxXT4+MTsKKyAgeFsyMF0gPSB1ciArICh2cj4+MSk7CisgIHhbMjFdID0gdWkgLSAodmk+PjEpOworICB4WzI4XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFsyOV0gPSB1aSArICh2aT4+MSk7CisKKyAgLy8geHQxID0gIDIKKy8vIHh0MiA9IDEwCisgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB5WzEwXSwgeVsxMV0pCisgIC8vdnIgPSBmTXVsdERpdjIoKHlbMTFdICsgeVsxMF0pLFdfUGlGT1VSVEgpOworICAvL3ZpID0gZk11bHREaXYyKCh5WzExXSAtIHlbMTBdKSxXX1BpRk9VUlRIKTsKKyAgdXIgPSB5WyAyXTsKKyAgdWkgPSB5WyAzXTsKKyAgeFsgMl0gPSAodXI+PjEpICsgdnI7CisgIHhbIDNdID0gKHVpPj4xKSArIHZpOworICB4WzEwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFsxMV0gPSAodWk+PjEpIC0gdmk7CisKKy8vIHh0MSA9ICA2CisvLyB4dDIgPSAxNAorICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeVsxNF0sIHlbMTVdKQorICB1ciA9IHlbIDZdOworICB1aSA9IHlbIDddOworICB4WyA2XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsgN10gPSAodWk+PjEpIC0gdmk7CisgIHhbMTRdID0gKHVyPj4xKSAtIHZyOworICB4WzE1XSA9ICh1aT4+MSkgKyB2aTsKKworLy8geHQxID0gMTgKKy8vIHh0MiA9IDI2CisgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB5WzI2XSwgeVsyN10pCisgIHVyID0geVsxOF07CisgIHVpID0geVsxOV07CisgIHhbMThdID0gKHVyPj4xKSArIHZyOworICB4WzE5XSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsyNl0gPSAodXI+PjEpIC0gdnI7CisgIHhbMjddID0gKHVpPj4xKSAtIHZpOworCisvLyB4dDEgPSAyMgorLy8geHQyID0gMzAKKyAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHlbMzBdLCB5WzMxXSkKKyAgdXIgPSB5WzIyXTsKKyAgdWkgPSB5WzIzXTsKKyAgeFsyMl0gPSAodXI+PjEpICsgdnI7CisgIHhbMjNdID0gKHVpPj4xKSAtIHZpOworICB4WzMwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFszMV0gPSAodWk+PjEpICsgdmk7CisKKy8vIHh0MSA9ICAwCisvLyB4dDIgPSAxNgorICB2ciA9IHhbMTZdOworICB2aSA9IHhbMTddOworICB1ciA9IHhbIDBdPj4xOworICB1aSA9IHhbIDFdPj4xOworICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKKyAgeFsgMV0gPSB1aSArICh2aT4+MSk7CisgIHhbMTZdID0gdXIgLSAodnI+PjEpOworICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKKworLy8geHQxID0gIDgKKy8vIHh0MiA9IDI0CisgIHZpID0geFsyNF07CisgIHZyID0geFsyNV07CisgIHVyID0geFsgOF0+PjE7CisgIHVpID0geFsgOV0+PjE7CisgIHhbIDhdID0gdXIgKyAodnI+PjEpOworICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKKyAgeFsyNF0gPSB1ciAtICh2cj4+MSk7CisgIHhbMjVdID0gdWkgKyAodmk+PjEpOworCisvLyB4dDEgPSAgMgorLy8geHQyID0gMTgKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDE2X3cxNlswXSk7CisgIHVyID0geFsgMl07CisgIHVpID0geFsgM107CisgIHhbIDJdID0gKHVyPj4xKSArIHZyOworICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsxOF0gPSAodXI+PjEpIC0gdnI7CisgIHhbMTldID0gKHVpPj4xKSAtIHZpOworCisvLyB4dDEgPSAxMAorLy8geHQyID0gMjYKKyAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzI3XSwgeFsyNl0sIGZmdDE2X3cxNlswXSk7CisgIHVyID0geFsxMF07CisgIHVpID0geFsxMV07CisgIHhbMTBdID0gKHVyPj4xKSArIHZyOworICB4WzExXSA9ICh1aT4+MSkgLSB2aTsKKyAgeFsyNl0gPSAodXI+PjEpIC0gdnI7CisgIHhbMjddID0gKHVpPj4xKSArIHZpOworCisvLyB4dDEgPSAgNAorLy8geHQyID0gMjAKKyAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbMjBdLCB4WzIxXSkKKyAgdXIgPSB4WyA0XTsKKyAgdWkgPSB4WyA1XTsKKyAgeFsgNF0gPSAodXI+PjEpICsgdnI7CisgIHhbIDVdID0gKHVpPj4xKSArIHZpOworICB4WzIwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFsyMV0gPSAodWk+PjEpIC0gdmk7CisKKy8vIHh0MSA9IDEyCisvLyB4dDIgPSAyOAorICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFsyOF0sIHhbMjldKQorICB1ciA9IHhbMTJdOworICB1aSA9IHhbMTNdOworICB4WzEyXSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxM10gPSAodWk+PjEpIC0gdmk7CisgIHhbMjhdID0gKHVyPj4xKSAtIHZyOworICB4WzI5XSA9ICh1aT4+MSkgKyB2aTsKKworLy8geHQxID0gIDYKKy8vIHh0MiA9IDIyCisgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsyM10sIHhbMjJdLCBmZnQxNl93MTZbMV0pOworICB1ciA9IHhbIDZdOworICB1aSA9IHhbIDddOworICB4WyA2XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsgN10gPSAodWk+PjEpICsgdmk7CisgIHhbMjJdID0gKHVyPj4xKSAtIHZyOworICB4WzIzXSA9ICh1aT4+MSkgLSB2aTsKKworLy8geHQxID0gMTQKKy8vIHh0MiA9IDMwCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFszMV0sIHhbMzBdLCBmZnQxNl93MTZbMV0pOworICB1ciA9IHhbMTRdOworICB1aSA9IHhbMTVdOworICB4WzE0XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxNV0gPSAodWk+PjEpIC0gdmk7CisgIHhbMzBdID0gKHVyPj4xKSAtIHZyOworICB4WzMxXSA9ICh1aT4+MSkgKyB2aTsKK30KKworI2lmbmRlZiBGVU5DVElPTl9mZnRfMzIKK3N0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQzMl93MzJbNl0gPQoreworICBTVENQICgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDMwZmJjNTRkLCAweDc2NDFhZjNkKSwgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwKKyAgU1RDUCAoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFNUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCkKK307CisKK0xOS19TRUNUSU9OX0NPREVfTDEKK2lubGluZSB2b2lkIGZmdF8zMihGSVhQX0RCTCAqeCkKK3sKKworI2RlZmluZSBXX1BpRk9VUlRIIFNUQygweDVhODI3OTlhKQorCisgIEZJWFBfREJMIHZyLHZpLHVyLHVpOworICBGSVhQX0RCTCB5WzY0XTsKKworICAvKgorICAgKiAxKzIgc3RhZ2UgcmFkaXggNAorICAgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvLyBpID0gMAorICB2ciA9ICh4WyAwXSArIHhbMzJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCisgIHZpID0gKHhbMTZdICsgeFs0OF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KKyAgdXIgPSAoeFsgMV0gKyB4WzMzXSk+PjE7ICAvKiBJbSBBICsgSW0gQiAqLworICB1aSA9ICh4WzE3XSArIHhbNDldKTsgICAgIC8qIEltIEMgKyBJbSBEICovCisKKyAgeVsgMF0gPSB2ciArICh2aT4+MSk7ICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgIHlbIDRdID0gdnIgLSAodmk+PjEpOyAgICAgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgIHlbIDFdID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgeVsgNV0gPSB1ciAtICh1aT4+MSk7ICAgICAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCisKKyAgdnIgLT0geFszMl07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICB2aSA9ICh2aT4+MSkgLSB4WzQ4XTsgICAgIC8qIFJlIEMgLSBSZSBEICovCisgIHVyIC09IHhbMzNdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgdWkgPSAodWk+PjEpIC0geFs0OV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLworCisgIHlbIDJdID0gdWkgKyB2cjsgICAgICAgICAgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICB5WyA2XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgeVsgM10gPSB1ciAtIHZpOyAgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKyAgeVsgN10gPSB2aSArIHVyOyAgICAgICAgICAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgIC8vaT04CisgIHZyID0gKHhbIDhdICsgeFs0MF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsyNF0gKyB4WzU2XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WyA5XSArIHhbNDFdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMjVdICsgeFs1N10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WyA4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVsxMl0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVsgOV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzEzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzQwXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNTZdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFs0MV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzU3XTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVsxMF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbMTRdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzExXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzE1XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy9pPTE2CisgIHZyID0gKHhbIDRdICsgeFszNl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsyMF0gKyB4WzUyXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WyA1XSArIHhbMzddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMjFdICsgeFs1M10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzE2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVsyMF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVsxN10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzIxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzM2XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNTJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFszN107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzUzXTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVsxOF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbMjJdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzE5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzIzXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy9pPTI0CisgIHZyID0gKHhbMTJdICsgeFs0NF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsyOF0gKyB4WzYwXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WzEzXSArIHhbNDVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMjldICsgeFs2MV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzI0XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVsyOF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVsyNV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzI5XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzQ0XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNjBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFs0NV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzYxXTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVsyNl0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbMzBdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzI3XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzMxXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy8gaSA9IDMyCisgIHZyID0gKHhbIDJdICsgeFszNF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsxOF0gKyB4WzUwXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WyAzXSArIHhbMzVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMTldICsgeFs1MV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzMyXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVszNl0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVszM10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzM3XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzM0XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNTBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFszNV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzUxXTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVszNF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbMzhdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzM1XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzM5XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy9pPTQwCisgIHZyID0gKHhbMTBdICsgeFs0Ml0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsyNl0gKyB4WzU4XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WzExXSArIHhbNDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMjddICsgeFs1OV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzQwXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVs0NF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVs0MV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzQ1XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzQyXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNThdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFs0M107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzU5XTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVs0Ml0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbNDZdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzQzXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzQ3XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy9pPTQ4CisgIHZyID0gKHhbIDZdICsgeFszOF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFsyMl0gKyB4WzU0XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WyA3XSArIHhbMzldKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMjNdICsgeFs1NV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzQ4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVs1Ml0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVs0OV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzUzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzM4XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNTRdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFszOV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzU1XTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVs1MF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbNTRdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzUxXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzU1XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgLy9pPTU2CisgIHZyID0gKHhbMTRdICsgeFs0Nl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KKyAgdmkgPSAoeFszMF0gKyB4WzYyXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLworICB1ciA9ICh4WzE1XSArIHhbNDddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgIHVpID0gKHhbMzFdICsgeFs2M10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KKworICB5WzU2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeVs2MF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeVs1N10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB5WzYxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICB2ciAtPSB4WzQ2XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpPj4xKSAtIHhbNjJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFs0N107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aT4+MSkgLSB4WzYzXTsgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgeVs1OF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHlbNjJdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB5WzU5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB5WzYzXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKworICBGSVhQX0RCTCAqeHQgPSAmeFswXTsKKyAgRklYUF9EQkwgKnl0ID0gJnlbMF07CisKKyAgaW50IGogPSA0OworICBkbworICB7CisgICAgdnIgPSB5dFs4XTsKKyAgICB2aSA9IHl0WzldOworICAgIHVyID0geXRbMF0+PjE7CisgICAgdWkgPSB5dFsxXT4+MTsKKyAgICB4dFsgMF0gPSB1ciArICh2cj4+MSk7CisgICAgeHRbIDFdID0gdWkgKyAodmk+PjEpOworICAgIHh0WyA4XSA9IHVyIC0gKHZyPj4xKTsKKyAgICB4dFsgOV0gPSB1aSAtICh2aT4+MSk7CisKKyAgICB2ciA9IHl0WzEzXTsKKyAgICB2aSA9IHl0WzEyXTsKKyAgICB1ciA9IHl0WzRdPj4xOworICAgIHVpID0geXRbNV0+PjE7CisgICAgeHRbIDRdID0gdXIgKyAodnI+PjEpOworICAgIHh0WyA1XSA9IHVpIC0gKHZpPj4xKTsKKyAgICB4dFsxMl0gPSB1ciAtICh2cj4+MSk7CisgICAgeHRbMTNdID0gdWkgKyAodmk+PjEpOworCisgICAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHl0WzEwXSwgeXRbMTFdKQorICAgIHVyID0geXRbMl07CisgICAgdWkgPSB5dFszXTsKKyAgICB4dFsgMl0gPSAodXI+PjEpICsgdnI7CisgICAgeHRbIDNdID0gKHVpPj4xKSArIHZpOworICAgIHh0WzEwXSA9ICh1cj4+MSkgLSB2cjsKKyAgICB4dFsxMV0gPSAodWk+PjEpIC0gdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeXRbMTRdLCB5dFsxNV0pCisgICAgdXIgPSB5dFs2XTsKKyAgICB1aSA9IHl0WzddOworCisgICAgeHRbIDZdID0gKHVyPj4xKSArIHZyOworICAgIHh0WyA3XSA9ICh1aT4+MSkgLSB2aTsKKyAgICB4dFsxNF0gPSAodXI+PjEpIC0gdnI7CisgICAgeHRbMTVdID0gKHVpPj4xKSArIHZpOworICAgIHh0ICs9IDE2OworICAgIHl0ICs9IDE2OworICB9IHdoaWxlICgtLWogIT0gMCk7CisKKyAgdnIgPSB4WzE2XTsKKyAgdmkgPSB4WzE3XTsKKyAgdXIgPSB4WyAwXT4+MTsKKyAgdWkgPSB4WyAxXT4+MTsKKyAgeFsgMF0gPSB1ciArICh2cj4+MSk7CisgIHhbIDFdID0gdWkgKyAodmk+PjEpOworICB4WzE2XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFsxN10gPSB1aSAtICh2aT4+MSk7CisKKyAgdmkgPSB4WzI0XTsKKyAgdnIgPSB4WzI1XTsKKyAgdXIgPSB4WyA4XT4+MTsKKyAgdWkgPSB4WyA5XT4+MTsKKyAgeFsgOF0gPSB1ciArICh2cj4+MSk7CisgIHhbIDldID0gdWkgLSAodmk+PjEpOworICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFsyNV0gPSB1aSArICh2aT4+MSk7CisKKyAgdnIgPSB4WzQ4XTsKKyAgdmkgPSB4WzQ5XTsKKyAgdXIgPSB4WzMyXT4+MTsKKyAgdWkgPSB4WzMzXT4+MTsKKyAgeFszMl0gPSB1ciArICh2cj4+MSk7CisgIHhbMzNdID0gdWkgKyAodmk+PjEpOworICB4WzQ4XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFs0OV0gPSB1aSAtICh2aT4+MSk7CisKKyAgdmkgPSB4WzU2XTsKKyAgdnIgPSB4WzU3XTsKKyAgdXIgPSB4WzQwXT4+MTsKKyAgdWkgPSB4WzQxXT4+MTsKKyAgeFs0MF0gPSB1ciArICh2cj4+MSk7CisgIHhbNDFdID0gdWkgLSAodmk+PjEpOworICB4WzU2XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFs1N10gPSB1aSArICh2aT4+MSk7CisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDMyX3czMlswXSk7CisgIHVyID0geFsgMl07CisgIHVpID0geFsgM107CisgIHhbIDJdID0gKHVyPj4xKSArIHZyOworICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsxOF0gPSAodXI+PjEpIC0gdnI7CisgIHhbMTldID0gKHVpPj4xKSAtIHZpOworCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFsyN10sIHhbMjZdLCBmZnQzMl93MzJbMF0pOworICB1ciA9IHhbMTBdOworICB1aSA9IHhbMTFdOworICB4WzEwXSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxMV0gPSAodWk+PjEpIC0gdmk7CisgIHhbMjZdID0gKHVyPj4xKSAtIHZyOworICB4WzI3XSA9ICh1aT4+MSkgKyB2aTsKKworICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNTFdLCB4WzUwXSwgZmZ0MzJfdzMyWzBdKTsKKyAgdXIgPSB4WzM0XTsKKyAgdWkgPSB4WzM1XTsKKyAgeFszNF0gPSAodXI+PjEpICsgdnI7CisgIHhbMzVdID0gKHVpPj4xKSArIHZpOworICB4WzUwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs1MV0gPSAodWk+PjEpIC0gdmk7CisKKyAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMlswXSk7CisgIHVyID0geFs0Ml07CisgIHVpID0geFs0M107CisgIHhbNDJdID0gKHVyPj4xKSArIHZyOworICB4WzQzXSA9ICh1aT4+MSkgLSB2aTsKKyAgeFs1OF0gPSAodXI+PjEpIC0gdnI7CisgIHhbNTldID0gKHVpPj4xKSArIHZpOworCisgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzIwXSwgeFsyMV0pCisgIHVyID0geFsgNF07CisgIHVpID0geFsgNV07CisgIHhbIDRdID0gKHVyPj4xKSArIHZyOworICB4WyA1XSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsyMF0gPSAodXI+PjEpIC0gdnI7CisgIHhbMjFdID0gKHVpPj4xKSAtIHZpOworCisgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzI4XSwgeFsyOV0pCisgIHVyID0geFsxMl07CisgIHVpID0geFsxM107CisgIHhbMTJdID0gKHVyPj4xKSArIHZyOworICB4WzEzXSA9ICh1aT4+MSkgLSB2aTsKKyAgeFsyOF0gPSAodXI+PjEpIC0gdnI7CisgIHhbMjldID0gKHVpPj4xKSArIHZpOworCisgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzUyXSwgeFs1M10pCisgIHVyID0geFszNl07CisgIHVpID0geFszN107CisgIHhbMzZdID0gKHVyPj4xKSArIHZyOworICB4WzM3XSA9ICh1aT4+MSkgKyB2aTsKKyAgeFs1Ml0gPSAodXI+PjEpIC0gdnI7CisgIHhbNTNdID0gKHVpPj4xKSAtIHZpOworCisgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzYwXSwgeFs2MV0pCisgIHVyID0geFs0NF07CisgIHVpID0geFs0NV07CisgIHhbNDRdID0gKHVyPj4xKSArIHZyOworICB4WzQ1XSA9ICh1aT4+MSkgLSB2aTsKKyAgeFs2MF0gPSAodXI+PjEpIC0gdnI7CisgIHhbNjFdID0gKHVpPj4xKSArIHZpOworCisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzIzXSwgeFsyMl0sIGZmdDMyX3czMlsxXSk7CisgIHVyID0geFsgNl07CisgIHVpID0geFsgN107CisgIHhbIDZdID0gKHVyPj4xKSArIHZyOworICB4WyA3XSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsyMl0gPSAodXI+PjEpIC0gdnI7CisgIHhbMjNdID0gKHVpPj4xKSAtIHZpOworCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFszMV0sIHhbMzBdLCBmZnQzMl93MzJbMV0pOworICB1ciA9IHhbMTRdOworICB1aSA9IHhbMTVdOworICB4WzE0XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxNV0gPSAodWk+PjEpIC0gdmk7CisgIHhbMzBdID0gKHVyPj4xKSAtIHZyOworICB4WzMxXSA9ICh1aT4+MSkgKyB2aTsKKworICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzFdKTsKKyAgdXIgPSB4WzM4XTsKKyAgdWkgPSB4WzM5XTsKKyAgeFszOF0gPSAodXI+PjEpICsgdnI7CisgIHhbMzldID0gKHVpPj4xKSArIHZpOworICB4WzU0XSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs1NV0gPSAodWk+PjEpIC0gdmk7CisKKyAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYzXSwgeFs2Ml0sIGZmdDMyX3czMlsxXSk7CisgIHVyID0geFs0Nl07CisgIHVpID0geFs0N107CisKKyAgeFs0Nl0gPSAodXI+PjEpICsgdnI7CisgIHhbNDddID0gKHVpPj4xKSAtIHZpOworICB4WzYyXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs2M10gPSAodWk+PjEpICsgdmk7CisKKyAgdnIgPSB4WzMyXTsKKyAgdmkgPSB4WzMzXTsKKyAgdXIgPSB4WyAwXT4+MTsKKyAgdWkgPSB4WyAxXT4+MTsKKyAgeFsgMF0gPSB1ciArICh2cj4+MSk7CisgIHhbIDFdID0gdWkgKyAodmk+PjEpOworICB4WzMyXSA9IHVyIC0gKHZyPj4xKTsKKyAgeFszM10gPSB1aSAtICh2aT4+MSk7CisKKyAgdmkgPSB4WzQ4XTsKKyAgdnIgPSB4WzQ5XTsKKyAgdXIgPSB4WzE2XT4+MTsKKyAgdWkgPSB4WzE3XT4+MTsKKyAgeFsxNl0gPSB1ciArICh2cj4+MSk7CisgIHhbMTddID0gdWkgLSAodmk+PjEpOworICB4WzQ4XSA9IHVyIC0gKHZyPj4xKTsKKyAgeFs0OV0gPSB1aSArICh2aT4+MSk7CisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM1XSwgeFszNF0sIGZmdDMyX3czMlsyXSk7CisgIHVyID0geFsgMl07CisgIHVpID0geFsgM107CisgIHhbIDJdID0gKHVyPj4xKSArIHZyOworICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKKyAgeFszNF0gPSAodXI+PjEpIC0gdnI7CisgIHhbMzVdID0gKHVpPj4xKSAtIHZpOworCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1MV0sIHhbNTBdLCBmZnQzMl93MzJbMl0pOworICB1ciA9IHhbMThdOworICB1aSA9IHhbMTldOworICB4WzE4XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxOV0gPSAodWk+PjEpIC0gdmk7CisgIHhbNTBdID0gKHVyPj4xKSAtIHZyOworICB4WzUxXSA9ICh1aT4+MSkgKyB2aTsKKworICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzddLCB4WzM2XSwgZmZ0MzJfdzMyWzBdKTsKKyAgdXIgPSB4WyA0XTsKKyAgdWkgPSB4WyA1XTsKKyAgeFsgNF0gPSAodXI+PjEpICsgdnI7CisgIHhbIDVdID0gKHVpPj4xKSArIHZpOworICB4WzM2XSA9ICh1cj4+MSkgLSB2cjsKKyAgeFszN10gPSAodWk+PjEpIC0gdmk7CisKKyAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUzXSwgeFs1Ml0sIGZmdDMyX3czMlswXSk7CisgIHVyID0geFsyMF07CisgIHVpID0geFsyMV07CisgIHhbMjBdID0gKHVyPj4xKSArIHZyOworICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKKyAgeFs1Ml0gPSAodXI+PjEpIC0gdnI7CisgIHhbNTNdID0gKHVpPj4xKSArIHZpOworCisgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFszOV0sIHhbMzhdLCBmZnQzMl93MzJbM10pOworICB1ciA9IHhbIDZdOworICB1aSA9IHhbIDddOworICB4WyA2XSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsgN10gPSAodWk+PjEpICsgdmk7CisgIHhbMzhdID0gKHVyPj4xKSAtIHZyOworICB4WzM5XSA9ICh1aT4+MSkgLSB2aTsKKworICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzNdKTsKKyAgdXIgPSB4WzIyXTsKKyAgdWkgPSB4WzIzXTsKKyAgeFsyMl0gPSAodXI+PjEpICsgdnI7CisgIHhbMjNdID0gKHVpPj4xKSAtIHZpOworICB4WzU0XSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs1NV0gPSAodWk+PjEpICsgdmk7CisKKyAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbNDBdLCB4WzQxXSkKKyAgdXIgPSB4WyA4XTsKKyAgdWkgPSB4WyA5XTsKKyAgeFsgOF0gPSAodXI+PjEpICsgdnI7CisgIHhbIDldID0gKHVpPj4xKSArIHZpOworICB4WzQwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs0MV0gPSAodWk+PjEpIC0gdmk7CisKKyAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbNTZdLCB4WzU3XSkKKyAgdXIgPSB4WzI0XTsKKyAgdWkgPSB4WzI1XTsKKyAgeFsyNF0gPSAodXI+PjEpICsgdnI7CisgIHhbMjVdID0gKHVpPj4xKSAtIHZpOworICB4WzU2XSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs1N10gPSAodWk+PjEpICsgdmk7CisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQzXSwgeFs0Ml0sIGZmdDMyX3czMls0XSk7CisgIHVyID0geFsxMF07CisgIHVpID0geFsxMV07CisKKyAgeFsxMF0gPSAodXI+PjEpICsgdnI7CisgIHhbMTFdID0gKHVpPj4xKSArIHZpOworICB4WzQyXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs0M10gPSAodWk+PjEpIC0gdmk7CisKKyAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMls0XSk7CisgIHVyID0geFsyNl07CisgIHVpID0geFsyN107CisgIHhbMjZdID0gKHVyPj4xKSArIHZyOworICB4WzI3XSA9ICh1aT4+MSkgLSB2aTsKKyAgeFs1OF0gPSAodXI+PjEpIC0gdnI7CisgIHhbNTldID0gKHVpPj4xKSArIHZpOworCisgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs0NV0sIHhbNDRdLCBmZnQzMl93MzJbMV0pOworICB1ciA9IHhbMTJdOworICB1aSA9IHhbMTNdOworICB4WzEyXSA9ICh1cj4+MSkgKyB2cjsKKyAgeFsxM10gPSAodWk+PjEpICsgdmk7CisgIHhbNDRdID0gKHVyPj4xKSAtIHZyOworICB4WzQ1XSA9ICh1aT4+MSkgLSB2aTsKKworICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNjFdLCB4WzYwXSwgZmZ0MzJfdzMyWzFdKTsKKyAgdXIgPSB4WzI4XTsKKyAgdWkgPSB4WzI5XTsKKyAgeFsyOF0gPSAodXI+PjEpICsgdnI7CisgIHhbMjldID0gKHVpPj4xKSAtIHZpOworICB4WzYwXSA9ICh1cj4+MSkgLSB2cjsKKyAgeFs2MV0gPSAodWk+PjEpICsgdmk7CisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQ3XSwgeFs0Nl0sIGZmdDMyX3czMls1XSk7CisgIHVyID0geFsxNF07CisgIHVpID0geFsxNV07CisgIHhbMTRdID0gKHVyPj4xKSArIHZyOworICB4WzE1XSA9ICh1aT4+MSkgKyB2aTsKKyAgeFs0Nl0gPSAodXI+PjEpIC0gdnI7CisgIHhbNDddID0gKHVpPj4xKSAtIHZpOworCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbNV0pOworICB1ciA9IHhbMzBdOworICB1aSA9IHhbMzFdOworICB4WzMwXSA9ICh1cj4+MSkgKyB2cjsKKyAgeFszMV0gPSAodWk+PjEpIC0gdmk7CisgIHhbNjJdID0gKHVyPj4xKSAtIHZyOworICB4WzYzXSA9ICh1aT4+MSkgKyB2aTsKK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX2ZmdF8zMiAqLworCisKKy8qKgorICogXGJyaWVmIEFwcGx5IHJvdGF0aW9uIHZlY3RvcnMgdG8gYSBkYXRhIGJ1ZmZlci4KKyAqIFxwYXJhbSBjbCBsZW5ndGggb2YgZWFjaCByb3cgb2YgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBsIHRvdGFsIGxlbmd0aCBvZiBpbnB1dCBkYXRhLgorICogXHBhcmFtIHBWZWNSZSByZWFsIHBhcnQgb2Ygcm90YXRpb24gY2VvZmZpY2llbnQgdmVjdG9yLgorICogXHBhcmFtIHBWZWNJbSBpbWFnaW5hcnkgcGFydCBvZiByb3RhdGlvbiBjZW9mZmljaWVudCB2ZWN0b3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnRfYXBwbHlfcm90X3ZlY3RvcihGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdGEsIGNvbnN0IGludCBjbCwgY29uc3QgaW50IGwsIGNvbnN0IEZJWFBfU1RCICpwVmVjUmUsIGNvbnN0IEZJWFBfU1RCICpwVmVjSW0pCit7CisgIEZJWFBfREJMIHJlLCBpbTsKKyAgRklYUF9TVEIgdnJlLCB2aW07CisKKyAgaW50IGksIGM7CisKKyAgZm9yKGk9MDsgaTxjbDsgaSsrKSB7CisgICAgcmUgID0gcERhdGFbMippXTsKKyAgICBpbSAgPSBwRGF0YVsyKmkrMV07CisKKyAgICBwRGF0YVsyKmldICAgPSByZT4+MjsgLyogKiAwLjI1ICovCisgICAgcERhdGFbMippKzFdID0gaW0+PjI7IC8qICogMC4yNSAqLworICB9CisgIGZvcig7IGk8bDsgaSs9Y2wpCisgIHsKKyAgICByZSAgPSBwRGF0YVsyKmldOworICAgIGltICA9IHBEYXRhWzIqaSsxXTsKKworICAgIHBEYXRhWzIqaV0gICA9IHJlPj4yOyAvKiAqIDAuMjUgKi8KKyAgICBwRGF0YVsyKmkrMV0gPSBpbT4+MjsgLyogKiAwLjI1ICovCisKKyAgICBmb3IgKGM9aSsxOyBjPGkrY2w7IGMrKykKKyAgICB7CisgICAgICByZSAgPSBwRGF0YVsyKmNdPj4xOworICAgICAgaW0gID0gcERhdGFbMipjKzFdPj4xOworICAgICAgdnJlID0gKnBWZWNSZSsrOworICAgICAgdmltID0gKnBWZWNJbSsrOworCisgICAgICBjcGx4TXVsdERpdjIoJnBEYXRhWzIqYysxXSwgJnBEYXRhWzIqY10sIGltLCByZSwgdnJlLCB2aW0pOworICAgIH0KKyAgfQorfQorCisjZGVmaW5lIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCisKKworI2lmZGVmIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCisKKyNkZWZpbmUgZmZ0TjIocElucHV0LCBsZW5ndGgsIGRpbTEsIGRpbTIsIGZmdF9mdW5jMSwgZmZ0X2Z1bmMyLCBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKSBcCit7IFwKKyAgaW50ICAgICAgIGksIGo7IFwKKyBcCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0LCBGSVhQX0RCTCwgbGVuZ3RoKjIpOyBcCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0MiwgRklYUF9EQkwsIGRpbTIqMik7IFwKKyBcCisgIEZES19BU1NFUlQobGVuZ3RoID09IGRpbTEqZGltMik7IFwKKyBcCisgIC8qIFBlcmZvcm0gZGltMiB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgcFNyYyBhbmQgdGhlIFwKKyAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBEc3QuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgaXMgYnVpbHQgXAorICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBwU3JjLCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5LiBcCisgICovIFwKKyAgeyBcCisgICAgY29uc3QgRklYUF9EQkwqIHBTcmMgPSBwSW5wdXQ7IFwKKyAgICBGSVhQX0RCTCAgKlJFU1RSSUNUIHBEc3QgPSBhRHN0OyBcCisgICAgXAorICAgIGZvcihpPTA7IGk8ZGltMjsgaSsrKSBcCisgICAgeyBcCisgICAgICBmb3Ioaj0wOyBqPGRpbTE7IGorKykgXAorICAgICAgeyBcCisgICAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMl07IFwKKyAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0yKzFdOyBcCisgICAgICB9IFwKKyAgICAgIFwKKyAgICAgIGZmdF9mdW5jMShwRHN0KTsgXAorICAgICAgcFNyYyArPSAyOyBcCisgICAgICBwRHN0ID0gcERzdCArIDIqZGltMTsgXAorICAgIH0gXAorICB9IFwKKyAgXAorICAvKiBQZXJmb3JtIHRoZSBtb2R1bGF0aW9uIG9mIHRoZSBvdXRwdXQgb2YgdGhlIGZmdCBvZiBsZW5ndGggZGltMSAqLyBcCisgIGZmdF9hcHBseV9yb3RfdmVjdG9yKGFEc3QsIGRpbTEsIGxlbmd0aCwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZyk7IFwKKyAgXAorICAvKiBQZXJmb3JtIGRpbTEgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMi4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIGFEc3QgYW5kIHRoZSBcCisgIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIgaXMgYnVpbHQgXAorICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzIFwKKyAgb2YgcElucHV0LiBcCisgICovIFwKKyAgeyBcCisgICAgY29uc3QgRklYUF9EQkwqIHBTcmMgICAgICAgPSBhRHN0OyBcCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgICAgPSBhRHN0MjsgXAorICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0T3V0ID0gcElucHV0OyBcCisgICAgXAorICAgIGZvcihpPTA7IGk8ZGltMTsgaSsrKSBcCisgICAgeyBcCisgICAgICBmb3Ioaj0wOyBqPGRpbTI7IGorKykgXAorICAgICAgeyBcCisgICAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMV07IFwKKyAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0xKzFdOyBcCisgICAgICB9IFwKKyAgICAgIFwKKyAgICAgIGZmdF9mdW5jMihwRHN0KTsgXAorICAgICAgXAorICAgICAgZm9yKGo9MDsgajxkaW0yOyBqKyspIFwKKyAgICAgIHsgXAorICAgICAgICBwRHN0T3V0WzIqaipkaW0xXSAgID0gcERzdFsyKmpdOyBcCisgICAgICAgIHBEc3RPdXRbMipqKmRpbTErMV0gPSBwRHN0WzIqaisxXTsgXAorICAgICAgfSBcCisgICAgICBwU3JjICs9IDI7IFwKKyAgICAgIHBEc3RPdXQgKz0gMjsgXAorICAgIH0gXAorICB9IFwKKyAgXAorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsgXAorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7IFwKK30gXAorCisjZWxzZSAvKiBGRlRfVFdPX1NUQUdFX01BQ1JPX0VOQUJMRSAqLworCisvKiBzZWxlY3QgZWl0aGVyIHN3aXRjaCBjYXNlIG9mIGZ1bmN0aW9uIHBvaW50ZXIuICovCisvLyNkZWZpbmUgRkZUX1RXT19TVEFHRV9TV0lUQ0hfQ0FTRQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0TjIoCisgICAgICAgIEZJWFBfREJMICpwSW5wdXQsCisgICAgICAgIGNvbnN0IGludCBsZW5ndGgsCisgICAgICAgIGNvbnN0IGludCBkaW0xLAorICAgICAgICBjb25zdCBpbnQgZGltMiwKKyAgICAgICAgdm9pZCAoKiBjb25zdCBmZnQxKShGSVhQX0RCTCAqKSwKKyAgICAgICAgdm9pZCAoKiBjb25zdCBmZnQyKShGSVhQX0RCTCAqKSwKKyAgICAgICAgY29uc3QgRklYUF9TVEIgKlJvdFZlY3RvclJlYWwsCisgICAgICAgIGNvbnN0IEZJWFBfU1RCICpSb3RWZWN0b3JJbWFnCisgICAgICAgICkKK3sKKyAgLyogVGhlIHJlYWwgcGFydCBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3NlcyB3aXRoIGV2ZW4gaW5kaWNlcyBhbmQgdGhlIGltYWdpbmFyeQorICBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggb2RkIGluZGljZXMuIFRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkCisgIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dAorICAqLworICBGSVhQX0RCTCAgKnBTcmMsICpwRHN0LCAqcERzdE91dDsKKyAgaW50ICAgICAgIGksIGo7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0MiwgRklYUF9EQkwsIGRpbTIqMik7CisgICAgIAorICBGREtfQVNTRVJUKGxlbmd0aCA9PSBkaW0xKmRpbTIpOworCisgIC8qIFBlcmZvcm0gZGltMiB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgcFNyYyBhbmQgdGhlCisgIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwRHN0LiBUaGUgaW5wdXQgdmVjdG9yIGZvciB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xIGlzIGJ1aWx0CisgIG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIHBTcmMsIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkuCisgICovCisgIHBTcmMgPSBwSW5wdXQ7CisgIHBEc3QgPSBhRHN0OworICBmb3IoaT0wOyBpPGxlbmd0aC9kaW0xOyBpKyspCisgIHsKKyAgICBmb3Ioaj0wOyBqPGxlbmd0aC9kaW0yOyBqKyspCisgICAgeworICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0yXTsKKyAgICAgIHBEc3RbMipqKzFdID0gcFNyY1syKmoqZGltMisxXTsKKyAgICB9CisKKyAgICAvKiBmZnQgb2Ygc2l6ZSBkaW0xICovCisjaWZuZGVmIEZGVF9UV09fU1RBR0VfU1dJVENIX0NBU0UKKyAgICBmZnQxKHBEc3QpOworI2Vsc2UKKyAgICBzd2l0Y2ggKGRpbTEpIHsKKyAgICAgIGNhc2UgMzogZmZ0MyhwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDQ6IGZmdF80KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgNTogZmZ0NShwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgMTU6IGZmdDE1KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgMTY6IGZmdF8xNihwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDMyOiBmZnRfMzIocERzdCk7IGJyZWFrOworICAgICAgLypjYXNlIDY0OiBmZnRfNjQocERzdCk7IGJyZWFrOyovCisgICAgICBjYXNlIDEyODogZmZ0XzEyOChwRHN0KTsgYnJlYWs7CisgICAgfQorI2VuZGlmCisgICAgcFNyYyArPSAyOworICAgIHBEc3QgPSBwRHN0ICsgMipsZW5ndGgvZGltMjsKKyAgfQorCisgIC8qIFBlcmZvcm0gdGhlIG1vZHVsYXRpb24gb2YgdGhlIG91dHB1dCBvZiB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xICovCisgIHBTcmM9YURzdDsKKyAgZmZ0X2FwcGx5X3JvdF92ZWN0b3IocFNyYywgbGVuZ3RoL2RpbTIsIGxlbmd0aCwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZyk7CisKKyAgLyogUGVyZm9ybSBkaW0xIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBhRHN0IGFuZCB0aGUKKyAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0IHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMiBpcyBidWlsdAorICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzCisgIG9mIHBJbnB1dC4KKyAgKi8KKyAgcFNyYyAgICA9IGFEc3Q7CisgIHBEc3QgICAgPSBhRHN0MjsKKyAgcERzdE91dCA9IHBJbnB1dDsKKyAgZm9yKGk9MDsgaTxsZW5ndGgvZGltMjsgaSsrKQorICB7CisgICAgZm9yKGo9MDsgajxsZW5ndGgvZGltMTsgaisrKQorICAgIHsKKyAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMV07CisgICAgICBwRHN0WzIqaisxXSA9IHBTcmNbMipqKmRpbTErMV07CisgICAgfQorCisjaWZuZGVmIEZGVF9UV09fU1RBR0VfU1dJVENIX0NBU0UKKyAgICBmZnQyKHBEc3QpOworI2Vsc2UKKyAgICBzd2l0Y2ggKGRpbTIpIHsKKyAgICAgIGNhc2UgMzogZmZ0MyhwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDQ6IGZmdF80KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgNTogZmZ0NShwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgMTU6IGZmdDE1KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgMTY6IGZmdF8xNihwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDMyOiBmZnRfMzIocERzdCk7IGJyZWFrOworICAgICAgLypjYXNlIDY0OiBmZnRfNjQocERzdCk7IGJyZWFrOyovCisgICAgICBjYXNlIDEyODogZmZ0XzEyOChwRHN0KTsgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBmb3Ioaj0wOyBqPGxlbmd0aC9kaW0xOyBqKyspCisgICAgeworICAgICAgcERzdE91dFsyKmoqZGltMV0gICA9IHBEc3RbMipqXTsKKyAgICAgIHBEc3RPdXRbMipqKmRpbTErMV0gPSBwRHN0WzIqaisxXTsKKyAgICB9CisgICAgcFNyYyArPSAyOworICAgIHBEc3RPdXQgKz0gMjsKKyAgfQorCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdDIsIEZJWFBfREJMLCBkaW0yKjIpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7Cit9CisKKyNlbmRpZiAvKiBGRlRfVFdPX1NUQUdFX01BQ1JPX0VOQUJMRSAqLworCisKKworCisKKworCisKKworCisKKworI2RlZmluZSBTQ0FMRUZBQ1RPUjYwICAgICAgICAgNQorLyoqCitUaGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZmdCBvZiBsZW5ndGggNjAuIEl0IGlzIHNwbGl0dGV0IGludG8gZmZ0J3Mgb2YgbGVuZ3RoIDQgYW5kIGZmdCdzIG9mCitsZW5ndGggMTUuIEJldHdlZW4gdGhlIGZmdCdzIGEgbW9kb2xhdGlvbiBpcyBjYWxjdWxhdGVkLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQ2MChGSVhQX0RCTCAqcElucHV0LCBJTlQgKnBTY2FsZWZhY3RvcikKK3sKKyAgZmZ0TjIoCisgICAgICAgICAgcElucHV0LCA2MCwgNCwgMTUsIAorICAgICAgICAgIGZmdF80LCBmZnQxNSwKKyAgICAgICAgICBSb3RWZWN0b3JSZWFsNjAsIFJvdFZlY3RvckltYWc2MAorICAgICAgICAgICk7CisgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I2MDsKK30KKworCisKKy8qIEZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIGNhc2Ugb2Ygbm8gYmV0dGVyIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZS4gKi8KKworI2RlZmluZSBTQ0FMRUZBQ1RPUjI0MCAgICAgICAgNworCisvKioKK1RoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZmZ0IG9mIGxlbmd0aCAyNDAuIEl0IGlzIHNwbGl0dGV0IGludG8gZmZ0J3Mgb2YgbGVuZ3RoIDE2IGFuZCBmZnQncyBvZgorbGVuZ3RoIDE1LiBCZXR3ZWVuIHRoZSBmZnQncyBhIG1vZHVsYXRpb24gaXMgY2FsY3VsYXRlZC4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MjQwKEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQoreworICBmZnROMigKKyAgICAgICAgICBwSW5wdXQsIDI0MCwgMTYsIDE1LCAKKyAgICAgICAgICBmZnRfMTYsIGZmdDE1LAorICAgICAgICAgIFJvdFZlY3RvclJlYWwyNDAsIFJvdFZlY3RvckltYWcyNDAKKyAgICAgICAgICApOworICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMjQwOworfQorCisKKyNkZWZpbmUgU0NBTEVGQUNUT1I0ODAgICAgICAgIDgKKyNkZWZpbmUgTjMyICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFRBQkxFX1NJWkVfMTYgICAgICAgICgzMi8yKQorCisvKioKK1RoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZmZ0IG9mIGxlbmd0aCA0ODAuIEl0IGlzIHNwbGl0dGV0IGludG8gZmZ0J3Mgb2YgbGVuZ3RoIDMyIGFuZCBmZnQncyBvZgorbGVuZ3RoIDE1LiBCZXR3ZWVuIHRoZSBmZnQncyBhIG1vZHVsYXRpb24gaXMgY2FsY3VsYXRlZC4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0NDgwKEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQoreworICBmZnROMigKKyAgICAgICAgICBwSW5wdXQsIDQ4MCwgMzIsIDE1LCAKKyAgICAgICAgICBmZnRfMzIsIGZmdDE1LAorICAgICAgICAgIFJvdFZlY3RvclJlYWw0ODAsIFJvdFZlY3RvckltYWc0ODAKKyAgICAgICAgICApOworICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNDgwOworfQorCit2b2lkIGZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnBTY2FsZWZhY3RvcikKK3sKKyAgaWYgKGxlbmd0aCA9PSAzMikKKyAgeworICAgICAgZmZ0XzMyKHBJbnB1dCk7CisgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMzI7CisgIH0KKyAgZWxzZQorICB7CisgIAorICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGNhc2UgMTY6CisgICAgICBmZnRfMTYocElucHV0KTsKKyAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIGZmdF84KHBJbnB1dCk7CisgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGZmdDMocElucHV0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGZmdF80KHBJbnB1dCk7CisgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIGZmdDUocElucHV0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICBmZnQxNShwSW5wdXQpOworICAgICAgKnBTY2FsZWZhY3RvciArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2MDoKKyAgICAgIGZmdDYwKHBJbnB1dCwgcFNjYWxlZmFjdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBkaXRfZmZ0KHBJbnB1dCwgNiwgU2luZVRhYmxlNTEyLCA1MTIpOworICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDA6CisgICAgICBmZnQyNDAocElucHV0LCBwU2NhbGVmYWN0b3IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTY6CisgICAgICBkaXRfZmZ0KHBJbnB1dCwgOCwgU2luZVRhYmxlNTEyLCA1MTIpOworICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI1NjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwOgorICAgICAgZmZ0NDgwKHBJbnB1dCwgcFNjYWxlZmFjdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgZGl0X2ZmdChwSW5wdXQsIDksIFNpbmVUYWJsZTUxMiwgNTEyKTsKKyAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I1MTI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsgLyogRkZUIGxlbmd0aCBub3Qgc3VwcG9ydGVkISAqLworICAgICAgYnJlYWs7CisgIH0KKyAgfQorfQorCisKK3ZvaWQgaWZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnNjYWxlZmFjdG9yKQoreworICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOyAvKiBJRkZUIGxlbmd0aCBub3Qgc3VwcG9ydGVkISAqLworICAgICAgYnJlYWs7CisgIH0KK30KKworCmRpZmYgLS1naXQgYS9hYWMvbGliRkRLL3NyYy9mZnRfcmFkMi5jcHAgYi9hYWMvbGliRkRLL3NyYy9mZnRfcmFkMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYWRiNQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL2ZmdF9yYWQyLmNwcApAQCAtMCwwICsxLDUxMiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZmdF9yYWQyLmgiCisKKyNpbmNsdWRlICJzY3JhbWJsZS5oIgorCisjZGVmaW5lIF9fRkZUX1JBRDJfQ1BQX18KKworI2lmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2luY2x1ZGUgImFybS9mZnRfcmFkMl9hcm0uY3BwIgorCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fbWlwc19kc3ApCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL2ZmdF9yYWQyX21pcHMuY3BwIgorCisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBkaXRfZmZ0IChhbmFseXNpcykKKyAgICBkZXNjcmlwdGlvbjogIGRpdC10dWtleS1hbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgIHNjcmFtYmxlcyBkYXRhIGF0IGVudHJ5CisgICAgICAgICAgICAgICAgICBpLmUuIGxvb3AgaXMgbWFkZSB3aXRoIHNjcmFtYmxlZCBkYXRhCisgICAgcmV0dXJuczoKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZVTkNUSU9OX2RpdF9mZnQKKwordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpCit7CisgICAgY29uc3QgSU5UIG49MTw8bGRuOworICAgIElOVCB0cmlnc3RlcCxpLGxkbTsKKworICAgIHNjcmFtYmxlKHgsbik7CisgICAgLyoKKyAgICAgKiAxKzIgc3RhZ2UgcmFkaXggNAorICAgICAqLworCisgICAgZm9yIChpPTA7aTxuKjI7aSs9OCkKKyAgICB7CisgICAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzA7CisgICAgICBhMDAgPSAoeFtpICsgMF0gKyB4W2kgKyAyXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLworICAgICAgYTEwID0gKHhbaSArIDRdICsgeFtpICsgNl0pPj4xOyAgLyogUmUgQyArIFJlIEQgKi8KKyAgICAgIGEyMCA9ICh4W2kgKyAxXSArIHhbaSArIDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCisgICAgICBhMzAgPSAoeFtpICsgNV0gKyB4W2kgKyA3XSk+PjE7ICAvKiBJbSBDICsgSW0gRCAqLworCisgICAgICB4W2kgKyAwXSA9IGEwMCArIGExMDsgICAgICAgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCisgICAgICB4W2kgKyA0XSA9IGEwMCAtIGExMDsgICAgICAgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCisgICAgICB4W2kgKyAxXSA9IGEyMCArIGEzMDsgICAgICAgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCisgICAgICB4W2kgKyA1XSA9IGEyMCAtIGEzMDsgICAgICAgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCisKKyAgICAgIGEwMCA9IGEwMCAtIHhbaSArIDJdOyAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICAgICAgYTEwID0gYTEwIC0geFtpICsgNl07ICAgICAgIC8qIFJlIEMgLSBSZSBEICovCisgICAgICBhMjAgPSBhMjAgLSB4W2kgKyAzXTsgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICAgIGEzMCA9IGEzMCAtIHhbaSArIDddOyAgICAgICAvKiBJbSBDIC0gSW0gRCAqLworCisgICAgICB4W2kgKyAyXSA9IGEwMCArIGEzMDsgICAgICAgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCisgICAgICB4W2kgKyA2XSA9IGEwMCAtIGEzMDsgICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCisgICAgICB4W2kgKyAzXSA9IGEyMCAtIGExMDsgICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCisgICAgICB4W2kgKyA3XSA9IGEyMCArIGExMDsgICAgICAgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCisgICAgfQorCisgICAgZm9yKGxkbT0zOyBsZG08PWxkbjsgKytsZG0pCisgICAgeworICAgICAgICBJTlQgbT0oMTw8bGRtKTsKKyAgICAgICAgSU5UIG1oPShtPj4xKTsKKyAgICAgICAgSU5UIGoscjsKKworICAgICAgICB0cmlnc3RlcD0oKHRyaWdEYXRhU2l6ZSA8PCAyKT4+bGRtKTsKKworICAgICAgICBGREtfQVNTRVJUKHRyaWdzdGVwID4gMCk7CisKKyAgICAgICAgLyogRG8gZmlyc3QgaXRlcmF0aW9uIHdpdGggYz0xLjAgYW5kIHM9MC4wIHNlcGFyYXRlbHkgdG8gYXZvaWQgbG9vc2luZyB0byBtdWNoIHByZWNpc2lvbi4KKyAgICAgICAgICAgQmV3YXJlOiBUaGUgaW1wYWN0IG9uIHRoZSBvdmVyYWwgRkZUIHByZWNpc2lvbiBpcyByYXRoZXIgbGFyZ2UuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworCisgICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSU5UIHQxID0gKHIraik8PDE7CisgICAgICAgICAgICAgICAgSU5UIHQyID0gdDEgKyAobWg8PDEpOworICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOworCisgICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKKyAgICAgICAgICAgICAgICB2aSA9IHhbdDIrMV0+PjE7CisgICAgICAgICAgICAgICAgdnIgPSB4W3QyXT4+MTsKKworICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOworCisgICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CisKKyAgICAgICAgICAgICAgICB0MSArPSBtaDsKKyAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CisKKyAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICAgICAgICAgIHZyID0geFt0MisxXT4+MTsKKyAgICAgICAgICAgICAgICB2aSA9IHhbdDJdPj4xOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3Ioaj0xOyBqPG1oLzQ7ICsraikKKyAgICAgICAgeworICAgICAgICAgICAgRklYUF9TVFAgY3M7CisKKyAgICAgICAgICAgIGNzID0gdHJpZ2RhdGFbaip0cmlnc3RlcF07CisKKyAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKKyAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCBjcyk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgdDEgKz0gbWg7CisgICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgY3MpOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCisgICAgICAgICAgICAgICAgdDEgPSAocittaC8yLWopPDwxOworICAgICAgICAgICAgICAgIHQyID0gdDEgKyAobWg8PDEpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgY3MpOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHQxICs9IG1oOworICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKKworICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIGNzKTsKKworICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOworCisgICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aS12aTsKKworICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWkrdmk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgaiA9IG1oLzQ7CisKKyAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKKyAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgdDEgKz0gbWg7CisgICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBkaXRfaWZmdCAoc3ludGhlc2lzKQorICAgIGRlc2NyaXB0aW9uOiAgZGl0LXR1a2V5LWFsZ29yaXRobQorICAgICAgICAgICAgICAgICAgc2NyYW1ibGVzIGRhdGEgYXQgZW50cnkKKyAgICAgICAgICAgICAgICAgIGkuZS4gbG9vcCBpcyBtYWRlIHdpdGggc2NyYW1ibGVkIGRhdGEKKyAgICByZXR1cm5zOgorICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9kaXRfaWZmdCkKK3ZvaWQgZGl0X2lmZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkKK3sKKyAgICBjb25zdCBJTlQgbj0xPDxsZG47CisgICAgSU5UIHRyaWdzdGVwLGksbGRtOworCisgICAgc2NyYW1ibGUoeCxuKTsKKworICAgIC8qCisgICAgICAxKzIgc3RhZ2UgcmFkaXggNAorICAgICovCisKKyAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQorICAgIHsKKyAgICAgIEZJWFBfREJMIGEwLCBhMSwgYTIsIGEzLCBhMDAsIGExMCwgYTIwLCBhMzA7CisKKyAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgICAvKiBSZSBBICsgUmUgQiAqLworICAgICAgYTEwID0gKHhbaSArIDRdICsgeFtpICsgNl0pPj4xOyAgIC8qIFJlIEMgKyBSZSBEICovCisgICAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSk+PjE7ICAgLyogSW0gQSArIEltIEIgKi8KKyAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgICAvKiBJbSBDICsgSW0gRCAqLworICAgICAgYTAgID0gKHhbaSArIDBdIC0geFtpICsgMl0pPj4xOyAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgICBhMiAgPSAoeFtpICsgNF0gLSB4W2kgKyA2XSk+PjE7ICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgICAgIGEzICA9ICh4W2kgKyAxXSAtIHhbaSArIDNdKT4+MTsgICAvKiBJbSBBIC0gSW0gQiAqLworICAgICAgYTEgID0gKHhbaSArIDVdIC0geFtpICsgN10pPj4xOyAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgICAgIHhbaSArIDBdID0gYTAwICsgYTEwOyAgICAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KKyAgICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAgICAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KKyAgICAgIHhbaSArIDVdID0gYTIwIC0gYTMwOyAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKyAgICAgIHhbaSArIDJdID0gYTAgLSBhMTsgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KKyAgICAgIHhbaSArIDZdID0gYTAgKyBhMTsgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgICAgIHhbaSArIDNdID0gYTMgKyBhMjsgICAgICAvKiBJbSBCJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KKyAgICAgIHhbaSArIDddID0gYTMgLSBhMjsgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KKyAgICB9CisKKyAgICBmb3IobGRtPTM7IGxkbTw9bGRuOyArK2xkbSkKKyAgICB7CisgICAgICAgIGNvbnN0IElOVCBtPSgxPDxsZG0pOworICAgICAgICBjb25zdCBJTlQgbWg9KG0+PjEpOworCisgICAgICAgIElOVCBqLHI7CisKKyAgICAgICAgdHJpZ3N0ZXA9KCh0cmlnRGF0YVNpemUgPDwgMik+PmxkbSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IDA7CisKKyAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKKyAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CisgICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7CisKKyAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIEZMMkZYQ09OU1RfU0dMKDEuMCksIChGSVhQX1NHTCkwLjApOworICAgICAgICAgICAgICAgIHZpID0geFt0MisxXT4+MTsKKyAgICAgICAgICAgICAgICB2ciA9IHhbdDJdPj4xOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKKworICAgICAgICAgICAgICAgIHQxICs9IG1oOworICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKKworICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgRkwyRlhDT05TVF9TR0woMS4wKSwgRkwyRlhDT05TVF9TR0woMC4wKSk7CisgICAgICAgICAgICAgICAgdnIgPSB4W3QyKzFdPj4xOworICAgICAgICAgICAgICAgIHZpID0geFt0Ml0+PjE7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihqPTE7IGo8bWgvNDsgKytqKQorICAgICAgICB7CisgICAgICAgICAgICBGSVhQX1NUUCBjczsKKworICAgICAgICAgICAgY3MgPSB0cmlnZGF0YVtqKnRyaWdzdGVwXTsKKworICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOworICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKKworICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIGNzKTsKKworICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOworCisgICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CisKKyAgICAgICAgICAgICAgICB0MSArPSBtaDsKKyAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDJdLCB4W3QyKzFdLCBjcyk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KKyAgICAgICAgICAgICAgICB0MSA9IChyK21oLzItaik8PDE7CisgICAgICAgICAgICAgICAgdDIgPSB0MSArIChtaDw8MSk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCBjcyk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgdDEgKz0gbWg7CisgICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOworCisgICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyKzFdLCB4W3QyXSwgY3MpOworCisgICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKKyAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisKKyAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7CisgICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOworCisgICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBqID0gbWgvNDsKKyAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJTlQgdDEgPSAocittaC8yLWopPDwxOworICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKKworICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKKworICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CisgICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOworCisgICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOworICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKKworICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CisKKyAgICAgICAgICAgICAgICB0MSArPSBtaDsKKyAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CisKKyAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDJdLCB4W3QyKzFdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7CisKKyAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOworICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKworICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKKyAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CisKKyAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CisgICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL2ZpeHBvaW50X21hdGguY3BwIGIvYWFjL2xpYkZESy9zcmMvZml4cG9pbnRfbWF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyODNmZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL2ZpeHBvaW50X21hdGguY3BwCkBAIC0wLDAgKzEsODk1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBHYXllcgorICAgRGVzY3JpcHRpb246IEZpeGVkIHBvaW50IHNwZWNpZmljIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgorCisKKyNkZWZpbmUgTUFYX0xEX1BSRUNJU0lPTiAxMAorI2RlZmluZSBMRF9QUkVDSVNJT04gICAgIDEwCisKKy8qIFRheWxvciBzZXJpZXMgY29lZmZjaWVudHMgZm9yIGxuKDEteCksIGNlbnRlcmVkIGF0IDAgKE1hY0xhdXJpbiBwb2xpbm9taWFsKS4gKi8KKyNpZm5kZWYgTERDT0VGRl8xNkJJVAorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbGRDb2VmZltNQVhfTERfUFJFQ0lTSU9OXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzIuMCksCisgICAgRkwyRlhDT05TVF9EQkwoLTEuMC8zLjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNC4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzUuMCksCisgICAgRkwyRlhDT05TVF9EQkwoLTEuMC82LjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNy4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzguMCksCisgICAgRkwyRlhDT05TVF9EQkwoLTEuMC85LjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMTAuMCkKK307CisjZWxzZQorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9TR0wgbGRDb2VmZltNQVhfTERfUFJFQ0lTSU9OXSA9IHsKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzIuMCksCisgICAgRkwyRlhDT05TVF9TR0woLTEuMC8zLjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvNC4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzUuMCksCisgICAgRkwyRlhDT05TVF9TR0woLTEuMC82LjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvNy4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzguMCksCisgICAgRkwyRlhDT05TVF9TR0woLTEuMC85LjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvMTAuMCkKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgZnVuY3Rpb25uYW1lOiBDYWxjTGREYXRhCisgIGRlc2NyaXB0aW9uOiAgRGVsaXZlcnMgdGhlIExvZ2FyaXRobSBEdWFsaXMgbGQob3ApL0xEX0RBVEFfU0NBTElORyB3aXRoIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4KKyAgaW5wdXQ6ICAgICAgICBJbnB1dCBvcCBpcyBhc3N1bWVkIHRvIGJlIGRvdWJsZSBwcmVjaXNpb24gZnJhY3Rpb25hbCAwIDwgb3AgPCAxLjAKKyAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBuZWdhdGl2ZSB2YWx1ZXMuCisgIG91dHB1dDogICAgICAgRm9yIG9wID09IDAsIHRoZSByZXN1bHQgaXMgc2F0dXJhdGVkIHRvIC0xLjAKKyAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBwb3NpdGl2ZSB2YWx1ZXMgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgorICAgICAgICAgICAgICAgIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaW5wdXQgYW4gaW50ZWdlciB2YWx1ZSBpbnRvIHRoaXMgZnVuY3Rpb24gKGFuZCBleHBlY3QgYSBwb3NpdGl2ZSBvdXRwdXQgdmFsdWUpCisgICAgICAgICAgICAgICAgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorRklYUF9EQkwgQ2FsY0xkRGF0YShGSVhQX0RCTCBvcCkKK3sKKyAgcmV0dXJuIGZMb2cyKG9wLCAwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZnVuY3Rpb25uYW1lOiBMZERhdGFWZWN0b3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE5LX1NFQ1RJT05fQ09ERV9MMQordm9pZCBMZERhdGFWZWN0b3IoICBGSVhQX0RCTCAgICAqc3JjVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqZGVzdFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbikKK3sKKyAgICBJTlQgaTsKKyAgICBmb3IgKCBpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgIGRlc3RWZWN0b3JbaV0gPSBDYWxjTGREYXRhKHNyY1ZlY3RvcltpXSk7CisgICAgfQorfQorCisKKworI2RlZmluZSBNQVhfUE9XMl9QUkVDSVNJT04gOAorI2lmbmRlZiBTSU5FVEFCTEVfMTZCSVQKKwkjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIE1BWF9QT1cyX1BSRUNJU0lPTgorI2Vsc2UKKwkjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIDUKKyNlbmRpZgorCisvKgorICBUYXlsb3Igc2VyaWVzIGNvZWZmaWNpZW50cyBvZiB0aGUgZnVuY3Rpb24geF4yLiBUaGUgZmlyc3QgY29lZmZpY2llbnQgaXMKKyAgb21taXRlZCAoZXF1YWwgdG8gMS4wKS4KKworICBwb3cyQ29lZmZbaS0xXSA9ICgxL2khKSBkXmkoMl54KS9keF5pLCBpPTEuLk1BWF9QT1cyX1BSRUNJU0lPTgorICBUbyBldmFsdWF0ZSB0aGUgdGF5bG9yIHNlcmllcyBhcm91bmQgeCA9IDAsIHRoZSBjb2VmZmljaWVudHMgYXJlOiAxLyFpICogbG4oMileaQorICovCisjaWZuZGVmIFBPVzJDT0VGRl8xNkJJVAorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcG93MkNvZWZmW01BWF9QT1cyX1BSRUNJU0lPTl0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzcpLCAgICAvKiBsbigyKV4xIC8xISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KKyAgICBGTDJGWENPTlNUX0RCTCgwLjA1NTUwNDEwODY2NDgyMTU3OTk1MzE0MjI2Mzc2ODYyMTgpLCAgIC8qIGxuKDIpXjMgLzMhICovCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDk2MTgxMjkxMDc2Mjg0NzcxNjE5NzkwNzE1NzM2NTg4NyksICAvKiBsbigyKV40IC80ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KKyAgICBGTDJGWENPTlNUX0RCTCgxLjU0MDM1MzAzOTMzODE2MDk5NTQ0MzcwOTczMzI3NDIzZS00KSwgIC8qIGxuKDIpXjYgLzYhICovCisgICAgRkwyRlhDT05TVF9EQkwoMS41MjUyNzMzODA0MDU5ODQwMjgwMDI1NDM5MDEyMDA5NmUtNSksICAvKiBsbigyKV43IC83ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KK307CisjZWxzZQorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9TR0wgcG93MkNvZWZmW01BWF9QT1cyX1BSRUNJU0lPTl0gPSB7CisgICAgRkwyRlhDT05TVF9TR0woMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzcpLCAgICAvKiBsbigyKV4xIC8xISAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjA1NTUwNDEwODY2NDgyMTU3OTk1MzE0MjI2Mzc2ODYyMTgpLCAgIC8qIGxuKDIpXjMgLzMhICovCisgICAgRkwyRlhDT05TVF9TR0woMC4wMDk2MTgxMjkxMDc2Mjg0NzcxNjE5NzkwNzE1NzM2NTg4NyksICAvKiBsbigyKV40IC80ISAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgxLjU0MDM1MzAzOTMzODE2MDk5NTQ0MzcwOTczMzI3NDIzZS00KSwgIC8qIGxuKDIpXjYgLzYhICovCisgICAgRkwyRlhDT05TVF9TR0woMS41MjUyNzMzODA0MDU5ODQwMjgwMDI1NDM5MDEyMDA5NmUtNSksICAvKiBsbigyKV43IC83ISAqLworICAgIEZMMkZYQ09OU1RfU0dMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KK307CisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBtdWxfZGJsX3NnbF9ybmQKKyAgICBkZXNjcmlwdGlvbjogIE11bHRpcGx5IHdpdGggcm91bmQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZm9yIHJvdW5kaW5nIGEgZGZyYWN0IHRvIGZyYWN0ICovCisjZGVmaW5lIEFDQ1VfUiAoTE9ORykgMHgwMDAwODAwMAorCitMTktfU0VDVElPTl9DT0RFX0wxCitGSVhQX0RCTCBtdWxfZGJsX3NnbF9ybmQgKGNvbnN0IEZJWFBfREJMIG9wMSwgY29uc3QgRklYUF9TR0wgb3AyKQoreworICBGSVhQX0RCTCBwcm9kOworICBMT05HIHYgPSAoTE9ORykob3AxKTsKKyAgU0hPUlQgdSA9IChTSE9SVCkob3AyKTsKKworICBMT05HIGxvdyA9IHUqKHYmU0dMX01BU0spOworICBsb3cgPSAobG93KyhBQ0NVX1I+PjEpKSA+PiAoRlJBQ1RfQklUUy0xKTsgIC8qIHJvdW5kICovCisgIExPTkcgaGlnaCA9IHUgKiAoKHY+PkZSQUNUX0JJVFMpPDwxKTsKKworICBwcm9kID0gKExPTkcpKGhpZ2grbG93KTsKKworICByZXR1cm4oKEZJWFBfREJMKXByb2QpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIGZ1bmN0aW9ubmFtZTogQ2FsY0ludkxkRGF0YQorICBkZXNjcmlwdGlvbjogIERlbGl2ZXJzIHRoZSBpbnZlcnNlIG9mIGZ1bmN0aW9uIENhbGNMZERhdGEoKS4KKyAgICAgICAgICAgICAgICBEZWxpdmVycyAyXihvcCpMRF9EQVRBX1NDQUxJTkcpCisgIGlucHV0OiAgICAgICAgSW5wdXQgb3AgaXMgYXNzdW1lZCB0byBiZSBmcmFjdGlvbmFsIC0xLjAgPCBvcCA8IDEuMAorICBvdXRwdXQ6ICAgICAgIEZvciBvcCA9PSAwLCB0aGUgcmVzdWx0IGlzIE1BWFZBTF9EQkwgKGFsbW9zdCAxLjApLgorICAgICAgICAgICAgICAgIEZvciBuZWdhdGl2ZSBpbnB1dCB2YWx1ZXMgdGhlIG91dHB1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHBvc2l0aXZlIGZyYWN0aW9uYWwgdmFsdWUuCisgICAgICAgICAgICAgICAgRm9yIHBvc2l0aXZlIGlucHV0IHZhbHVlcyB0aGUgb3V0cHV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG91dHB1dCBuZWdhdGl2ZSB2YWx1ZXMuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE5LX1NFQ1RJT05fQ09ERV9MMQorLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLworLyogeCBpbiByYW5nZSBbMC4uLjEuMFsgaW4gc3RlcHMgb2YgMS8zMiAqLworTE5LX1NFQ1RJT05fREFUQV9MMSBzdGF0aWMgY29uc3QgVUlOVCBleHAyX3RhYl9sb25nWzMyXT17CisweDQwMDAwMDAwLDB4NDE2NkMzNEMsMHg0MkQ1NjFCNCwweDQ0NEMwNzQwLAorMHg0NUNBRTBGMiwweDQ3NTIxQ0M2LDB4NDhFMUU5QkEsMHg0QTdBNzdENCwKKzB4NEMxQkY4MjksMHg0REM2OUNERCwweDRGN0E5OTMwLDB4NTEzODIxODIsCisweDUyRkY2QjU1LDB4NTREMEFENUEsMHg1NkFDMUY3NSwweDU4OTFGQUMxLAorMHg1QTgyNzk5QSwweDVDN0REN0E0LDB4NUU4NDUxRDAsMHg2MDk2MjY2NSwKKzB4NjJCMzk1MDksMHg2NERDREVDMywweDY3MTI0NjBCLDB4Njk1NDBFQzksCisweDZCQTI3RTY1LDB4NkRGRERCQ0MsMHg3MDY2NkY3NiwweDcyREM4Mzc0LAorMHg3NTYwNjM3NCwweDc3RjI1Q0NFLDB4N0E5MkJFOEIsMHg3RDQxRDk2RQorLy8gMHg4MDAwMDAwMAorfTsKKworLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLworLyogeCBpbiByYW5nZSBbMC4uLjEvMzJbIGluIHN0ZXBzIG9mIDEvMTAyNCAqLworTE5LX1NFQ1RJT05fREFUQV9MMSBzdGF0aWMgY29uc3QgVUlOVCBleHAyd190YWJfbG9uZ1szMl09eworMHg0MDAwMDAwMCwweDQwMEIxODE4LDB4NDAxNjMyMUIsMHg0MDIxNEUwQywKKzB4NDAyQzZCRTksMHg0MDM3OEJCNCwweDQwNDJBRDZELDB4NDA0REQxMTMsCisweDQwNThGNkE4LDB4NDA2NDFFMkIsMHg0MDZGNDc5RSwweDQwN0E3MzAwLAorMHg0MDg1QTA1MSwweDQwOTBDRjkyLDB4NDA5QzAwQzQsMHg0MEE3MzNFNiwKKzB4NDBCMjY4RkEsMHg0MEJEOUZGRiwweDQwQzhEOEY1LDB4NDBENDEzREQsCisweDQwREY1MEI4LDB4NDBFQThGODYsMHg0MEY1RDA0NiwweDQxMDExMkZBLAorMHg0MTBDNTdBMiwweDQxMTc5RTNELDB4NDEyMkU2Q0QsMHg0MTJFMzE1MiwKKzB4NDEzOTdEQ0MsMHg0MTQ0Q0MzQiwweDQxNTAxQ0EwLDB4NDE1QjZFRkIsCisvLyAweDQxNjZDMzRDLAorfTsKKy8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KKy8qIHggaW4gcmFuZ2UgWzAuLi4xLzEwMjRbIGluIHN0ZXBzIG9mIDEvMzI3NjggKi8KK0xOS19TRUNUSU9OX0RBVEFfTDEgc3RhdGljIGNvbnN0IFVJTlQgZXhwMnhfdGFiX2xvbmdbMzJdPXsKKzB4NDAwMDAwMDAsMHg0MDAwNThCOSwweDQwMDBCMTczLDB4NDAwMTBBMkQsCisweDQwMDE2MkU4LDB4NDAwMUJCQTMsMHg0MDAyMTQ1RiwweDQwMDI2RDFCLAorMHg0MDAyQzVEOCwweDQwMDMxRTk1LDB4NDAwMzc3NTIsMHg0MDAzRDAxMSwKKzB4NDAwNDI4Q0YsMHg0MDA0ODE4RSwweDQwMDREQTRFLDB4NDAwNTMzMEUsCisweDQwMDU4QkNFLDB4NDAwNUU0OEYsMHg0MDA2M0Q1MSwweDQwMDY5NjEzLAorMHg0MDA2RUVENSwweDQwMDc0Nzk4LDB4NDAwN0EwNUIsMHg0MDA3RjkxRiwKKzB4NDAwODUxRTQsMHg0MDA4QUFBOCwweDQwMDkwMzZFLDB4NDAwOTVDMzMsCisweDQwMDlCNEZBLDB4NDAwQTBEQzAsMHg0MDBBNjY4OCwweDQwMEFCRjRGLAorLy8weDQwMEIxODE4Cit9OworCitMTktfU0VDVElPTl9DT0RFX0wxIEZJWFBfREJMIENhbGNJbnZMZERhdGEoRklYUF9EQkwgeCkKK3sKKyAgaW50IHNldF96ZXJvID0gKHggPCAgRkwyRlhDT05TVF9EQkwoLTMxLjAvNjQuMCkpPyAwIDogMTsKKyAgaW50IHNldF9tYXggID0gKHggPj0gRkwyRlhDT05TVF9EQkwoIDMxLjAvNjQuMCkpIHwgKHggPT0gRkwyRlhDT05TVF9EQkwoMC4wKSk7CisKKyAgRklYUF9TR0wgZnJhYyA9IChGSVhQX1NHTCkoTE9ORykoeCAmIDB4M0ZGKTsKKyAgVUlOVCBpbmRleDMgPSAoVUlOVCkoTE9ORykoeCA+PiAxMCkgJiAweDFGOworICBVSU5UIGluZGV4MiA9IChVSU5UKShMT05HKSh4ID4+IDE1KSAmIDB4MUY7IAorICBVSU5UIGluZGV4MSA9IChVSU5UKShMT05HKSh4ID4+IDIwKSAmIDB4MUY7CisgIGludCBleHAgID0gKHggPiAgRkwyRlhDT05TVF9EQkwoMC4wZikpID8gKDMxIC0gKGludCkoeD4+MjUpKSA6IChpbnQpKC0oeD4+MjUpKTsKKworICBVSU5UIGxvb2t1cDEgPSBleHAyX3RhYl9sb25nW2luZGV4MV0qc2V0X3plcm87CisgIFVJTlQgbG9va3VwMiA9IGV4cDJ3X3RhYl9sb25nW2luZGV4Ml07CisgIFVJTlQgbG9va3VwMyA9IGV4cDJ4X3RhYl9sb25nW2luZGV4M107CisgIFVJTlQgbG9va3VwM2YgPSBsb29rdXAzICsgKFVJTlQpKExPTkcpZk11bHREaXYyKChGSVhQX0RCTCkoMHgwMDE2MzAyRiksKEZJWFBfU0dMKWZyYWMpOworICAKKyAgVUlOVCBsb29rdXAxMiA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxLCAgKEZJWFBfREJMKSBsb29rdXAyKTsKKyAgVUlOVCBsb29rdXAgICA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxMiwgKEZJWFBfREJMKSBsb29rdXAzZik7CisKKyAgRklYUF9EQkwgcmV0VmFsID0gKGxvb2t1cDw8MykgPj4gZXhwOworCisgIGlmIChzZXRfbWF4KQorICAgIHJldFZhbD1GTDJGWENPTlNUX0RCTCgxLjBmKTsKKworICByZXR1cm4gcmV0VmFsOworfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIGZ1bmN0aW9ubmFtZTogSW5pdExkSW50IGFuZCBDYWxjTGRJbnQKKyAgICBkZXNjcmlwdGlvbjogIENyZWF0ZSBhbmQgYWNjZXNzIHRhYmxlIHdpdGggaW50ZWdlciBMZERhdGEgKDAgdG8gMTkzKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAgIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBsZEludENvZWZmW10gPSB7CisgICAgICAweDgwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAzMmI4MDM0LCAweDA0MDAwMDAwLCAweDA0YTRkM2MyLCAweDA1MmI4MDM0LCAweDA1OWQ1ZGEwLAorICAgICAgMHgwNjAwMDAwMCwgMHgwNjU3MDA2OSwgMHgwNmE0ZDNjMiwgMHgwNmViM2E5ZiwgMHgwNzJiODAzNCwgMHgwNzY2YTAwOSwgMHgwNzlkNWRhMCwgMHgwN2QwNTNmNywKKyAgICAgIDB4MDgwMDAwMDAsIDB4MDgyY2M3ZWUsIDB4MDg1NzAwNjksIDB4MDg3ZWYwNWIsIDB4MDhhNGQzYzIsIDB4MDhjOGRkZDQsIDB4MDhlYjNhOWYsIDB4MDkwYzEwNTAsCisgICAgICAweDA5MmI4MDM0LCAweDA5NDlhNzg1LCAweDA5NjZhMDA5LCAweDA5ODI4MDlkLCAweDA5OWQ1ZGEwLCAweDA5Yjc0OTQ5LCAweDA5ZDA1M2Y3LCAweDA5ZTg4YzZiLAorICAgICAgMHgwYTAwMDAwMCwgMHgwYTE2YmFkMywgMHgwYTJjYzdlZSwgMHgwYTQyMzE2MiwgMHgwYTU3MDA2OSwgMHgwYTZiM2Q3OSwgMHgwYTdlZjA1YiwgMHgwYTkyMjAzZCwKKyAgICAgIDB4MGFhNGQzYzIsIDB4MGFiNzExMGUsIDB4MGFjOGRkZDQsIDB4MGFkYTNmNjAsIDB4MGFlYjNhOWYsIDB4MGFmYmQ0MmIsIDB4MGIwYzEwNTAsIDB4MGIxYmYzMTIsCisgICAgICAweDBiMmI4MDM0LCAweDBiM2FiYjQwLCAweDBiNDlhNzg1LCAweDBiNTg0ODIyLCAweDBiNjZhMDA5LCAweDBiNzRiMWZkLCAweDBiODI4MDlkLCAweDBiOTAwZTYxLAorICAgICAgMHgwYjlkNWRhMCwgMHgwYmFhNzA4ZiwgMHgwYmI3NDk0OSwgMHgwYmMzZTljYSwgMHgwYmQwNTNmNywgMHgwYmRjODk5YiwgMHgwYmU4OGM2YiwgMHgwYmY0NWUwOSwKKyAgICAgIDB4MGMwMDAwMDAsIDB4MGMwYjczY2IsIDB4MGMxNmJhZDMsIDB4MGMyMWQ2NzEsIDB4MGMyY2M3ZWUsIDB4MGMzNzkwODUsIDB4MGM0MjMxNjIsIDB4MGM0Y2FiYTgsCisgICAgICAweDBjNTcwMDY5LCAweDBjNjEzMGFmLCAweDBjNmIzZDc5LCAweDBjNzUyN2I5LCAweDBjN2VmMDViLCAweDBjODg5ODNmLCAweDBjOTIyMDNkLCAweDBjOWI4OTI2LAorICAgICAgMHgwY2E0ZDNjMiwgMHgwY2FlMDBkMiwgMHgwY2I3MTEwZSwgMHgwY2MwMDUyYiwgMHgwY2M4ZGRkNCwgMHgwY2QxOWJiMCwgMHgwY2RhM2Y2MCwgMHgwY2UyYzk3ZCwKKyAgICAgIDB4MGNlYjNhOWYsIDB4MGNmMzkzNTUsIDB4MGNmYmQ0MmIsIDB4MGQwM2ZkYTksIDB4MGQwYzEwNTAsIDB4MGQxNDBjYTAsIDB4MGQxYmYzMTIsIDB4MGQyM2M0MWQsCisgICAgICAweDBkMmI4MDM0LCAweDBkMzMyN2M3LCAweDBkM2FiYjQwLCAweDBkNDIzYjA4LCAweDBkNDlhNzg1LCAweDBkNTEwMTE4LCAweDBkNTg0ODIyLCAweDBkNWY3Y2ZmLAorICAgICAgMHgwZDY2YTAwOSwgMHgwZDZkYjE5NywgMHgwZDc0YjFmZCwgMHgwZDdiYTE5MCwgMHgwZDgyODA5ZCwgMHgwZDg5NGY3NSwgMHgwZDkwMGU2MSwgMHgwZDk2YmRhZCwKKyAgICAgIDB4MGQ5ZDVkYTAsIDB4MGRhM2VlN2YsIDB4MGRhYTcwOGYsIDB4MGRiMGU0MTIsIDB4MGRiNzQ5NDksIDB4MGRiZGEwNzIsIDB4MGRjM2U5Y2EsIDB4MGRjYTI1OGUsCisgICAgICAweDBkZDA1M2Y3LCAweDBkZDY3NTNlLCAweDBkZGM4OTliLCAweDBkZTI5MTQzLCAweDBkZTg4YzZiLCAweDBkZWU3YjQ3LCAweDBkZjQ1ZTA5LCAweDBkZmEzNGUxLAorICAgICAgMHgwZTAwMDAwMCwgMHgwZTA1YmY5NCwgMHgwZTBiNzNjYiwgMHgwZTExMWNkMiwgMHgwZTE2YmFkMywgMHgwZTFjNGRmYiwgMHgwZTIxZDY3MSwgMHgwZTI3NTQ2MCwKKyAgICAgIDB4MGUyY2M3ZWUsIDB4MGUzMjMxNDMsIDB4MGUzNzkwODUsIDB4MGUzY2U1ZDgsIDB4MGU0MjMxNjIsIDB4MGU0NzczNDYsIDB4MGU0Y2FiYTgsIDB4MGU1MWRhYTgsCisgICAgICAweDBlNTcwMDY5LCAweDBlNWMxZDBiLCAweDBlNjEzMGFmLCAweDBlNjYzYjc0LCAweDBlNmIzZDc5LCAweDBlNzAzNmRiLCAweDBlNzUyN2I5LCAweDBlN2ExMDMwLAorICAgICAgMHgwZTdlZjA1YiwgMHgwZTgzYzg1NywgMHgwZTg4OTgzZiwgMHgwZThkNjAyZSwgMHgwZTkyMjAzZCwgMHgwZTk2ZDg4OCwgMHgwZTliODkyNiwgMHgwZWEwMzIzMiwKKyAgICAgIDB4MGVhNGQzYzIsIDB4MGVhOTZkZjAsIDB4MGVhZTAwZDIsIDB4MGViMjhjN2YsIDB4MGViNzExMGUsIDB4MGViYjhlOTYsIDB4MGVjMDA1MmIsIDB4MGVjNDc0ZTQsCisgICAgICAweDBlYzhkZGQ0LCAweDBlY2Q0MDEyLCAweDBlZDE5YmIwLCAweDBlZDVmMGM0LCAweDBlZGEzZjYwLCAweDBlZGU4Nzk3LCAweDBlZTJjOTdkLCAweDBlZTcwNTI1LAorICAgICAgMHgwZWViM2E5ZiwgMHgwZWVmNjlmZiwgMHgwZWYzOTM1NSwgMHgwZWY3YjZiNCwgMHgwZWZiZDQyYiwgMHgwZWZmZWJjZCwgMHgwZjAzZmRhOSwgMHgwZjA4MDljZiwKKyAgICAgIDB4MGYwYzEwNTAsIDB4MGYxMDExM2IsIDB4MGYxNDBjYTAsIDB4MGYxODAyOGQsIDB4MGYxYmYzMTIsIDB4MGYxZmRlM2QsIDB4MGYyM2M0MWQsIDB4MGYyN2E0YzAsCisgICAgICAweDBmMmI4MDM0CisgICAgfTsKKworCisgIExOS19TRUNUSU9OX0lOSVRDT0RFCisgIHZvaWQgSW5pdExkSW50KCkKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8hIFVzZSBwcmVpbml0aWFsaXplZCBsb2dhcml0aG0gdGFibGUgKi8KKyAgfQorCisKKworTE5LX1NFQ1RJT05fQ09ERV9MMQorRklYUF9EQkwgQ2FsY0xkSW50KElOVCBpKQoreworICAvKiBjYWxjdWxhdGVzIGxkKG9wKS9MRF9EQVRBX1NDQUxJTkcgKi8KKyAgLyogb3AgaXMgYXNzdW1lZCB0byBiZSBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gMSBhbmQgMTkzICovCisKKyAgRkRLX0FTU0VSVCgoMTkzPjApICYmICgoRklYUF9EQkwpbGRJbnRDb2VmZlswXT09KEZJWFBfREJMKTB4ODAwMDAwMDEpKTsgLyogdGFiIGhhcyB0byBiZSBpbml0aWFsaXplZCAqLworCisgIGlmICgoaT4wKSYmKGk8MTkzKSkKKyAgICByZXR1cm4gbGRJbnRDb2VmZltpXTsKKyAgZWxzZQorICB7CisgICAgcmV0dXJuICgwKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBpbnZTcXJ0Tm9ybTIKKyAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVUCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTUVJUX0JJVFMgICAgICAgICAgIDcKKyNkZWZpbmUgU1FSVF9WQUxVRVMgICAgICAgMTI4CisjZGVmaW5lIFNRUlRfQklUU19NQVNLICAgMHg3ZgorCitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0VGFiW1NRUlRfVkFMVUVTXSA9IHsKKyAgMHg1YTgyNzk5OSwgMHg1YTI4N2UwMywgMHg1OWNmOGNiYiwgMHg1OTc3YTBhYiwgMHg1OTIwYjRkZSwgMHg1OGNhYzQ4MCwgMHg1ODc1Y2FkZSwgMHg1ODIxYzM2NCwKKyAgMHg1N2NlYTk5YywgMHg1NzdjNzkyZiwgMHg1NzJiMmRkZiwgMHg1NmRhYzM4ZCwgMHg1NjhiMzYzMSwgMHg1NjNjODFkZiwgMHg1NWVlYTJjMywgMHg1NWExOTUyMSwKKyAgMHg1NTU1NTU1NSwgMHg1NTA5ZGZkMCwgMHg1NGJmMzExYSwgMHg1NDc1NDVkMCwgMHg1NDJjMWFhMywgMHg1M2UzYWM1YSwgMHg1MzliZjdjYywgMHg1MzU0ZjllNiwKKyAgMHg1MzBlYWZhNCwgMHg1MmM5MTYxNywgMHg1Mjg0MmE1ZSwgMHg1MjNmZTlhYiwgMHg1MWZjNTEzZiwgMHg1MWI5NWU2YiwgMHg1MTc3MGU4ZSwgMHg1MTM1NWYxOSwKKyAgMHg1MGY0NGQ4OCwgMHg1MGIzZDc2OCwgMHg1MDczZmE0ZiwgMHg1MDM0YjNlNiwgMHg0ZmY2MDFkZiwgMHg0ZmI3ZTFmOSwgMHg0ZjdhNTIwMSwgMHg0ZjNkNGZjZSwKKyAgMHg0ZjAwZDk0MywgMHg0ZWM0ZWM0ZSwgMHg0ZTg5ODZlOSwgMHg0ZTRlYTcxOCwgMHg0ZTE0NGFlOCwgMHg0ZGRhNzA3MiwgMHg0ZGExMTVkOSwgMHg0ZDY4Mzk0OCwKKyAgMHg0ZDJmZDhmNCwgMHg0Y2Y3ZjMxYiwgMHg0Y2MwODYwNCwgMHg0Yzg5OGZmZiwgMHg0YzUzMGY2NCwgMHg0YzFkMDI5MywgMHg0YmU3NjdmNSwgMHg0YmIyM2RmOSwKKyAgMHg0YjdkODMxNywgMHg0YjQ5MzVjZSwgMHg0YjE1NTRhNiwgMHg0YWUxZGUyYSwgMHg0YWFlZDBmMCwgMHg0YTdjMmI5MiwgMHg0YTQ5ZWNiMywgMHg0YTE4MTJmYSwKKyAgMHg0OWU2OWQxNiwgMHg0OWI1ODliYiwgMHg0OTg0ZDdhNCwgMHg0OTU0ODU5MSwgMHg0OTI0OTI0OSwgMHg0OGY0ZmM5NiwgMHg0OGM1YzM0YSwgMHg0ODk2ZTUzYywKKyAgMHg0ODY4NjE0NywgMHg0ODNhMzY0YywgMHg0ODBjNjMzMSwgMHg0N2RlZTZlMCwgMHg0N2IxYzA0OSwgMHg0Nzg0ZWU1ZiwgMHg0NzU4NzAxYywgMHg0NzJjNDQ3YywKKyAgMHg0NzAwNmE4MCwgMHg0NmQ0ZTEzMCwgMHg0NmE5YTc5MywgMHg0NjdlYmNiOSwgMHg0NjU0MWZiMywgMHg0NjI5Y2Y5OCwgMHg0NWZmY2I4MCwgMHg0NWQ2MTI4OSwKKyAgMHg0NWFjYTNkNSwgMHg0NTgzN2U4OCwgMHg0NTVhYTFjYSwgMHg0NTMyMGNjOCwgMHg0NTA5YmViMCwgMHg0NGUxYjZiNCwgMHg0NGI5ZjQwYiwgMHg0NDkyNzVlYywKKyAgMHg0NDZiM2I5NSwgMHg0NDQ0NDQ0NCwgMHg0NDFkOGYzYiwgMHg0M2Y3MWJiZSwgMHg0M2QwZTkxNywgMHg0M2FhZjY4ZSwgMHg0Mzg1NDM3MywgMHg0MzVmY2YxNCwKKyAgMHg0MzNhOThjNSwgMHg0MzE1OWZkYiwgMHg0MmYwZTNhZSwgMHg0MmNjNjM5NywgMHg0MmE4MWVmNSwgMHg0Mjg0MTUyNywgMHg0MjYwNDU4ZCwgMHg0MjNjYWY4YywKKyAgMHg0MjE5NTI4YiwgMHg0MWY2MmRmMSwgMHg0MWQzNDEyYSwgMHg0MWIwOGJhMSwgMHg0MThlMGNjNywgMHg0MTZiYzQwZCwgMHg0MTQ5YjBlNCwgMHg0MTI3ZDJjMywKKyAgMHg0MTA2MjkyMCwgMHg0MGU0YjM3NCwgMHg0MGMzNzEzYSwgMHg0MGEyNjFlZiwgMHg0MDgxODUxMSwgMHg0MDYwZGEyMSwgMHg0MDQwNjBhMSwgMHg0MDIwMTgxNAorfTsKKworTE5LX1NFQ1RJT05fSU5JVENPREUKK3ZvaWQgSW5pdEludlNxcnRUYWIoKQoreworICAvKiBub3RoaW5nIHRvIGRvICEKKyAgICAgdXNlIHByZWluaXRpYWxpemVkIHNxdWFyZSByb290IHRhYmxlCisgICovCit9CisKKworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05faW52U3FydE5vcm0yKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVULAorICBpLmUuIHRoZSBkZW5vcm1hbGl6ZWQgcmVzdWx0IGlzIDEvc3FydChvcCkgPSBpbnZTcXJ0Tm9ybShvcCkgKiAyXihzaGlmdCkKKyAgdXNlcyBOZXd0b24taXRlcmF0aW9uIGZvciBhcHByb3hpbWF0aW9uCisgICAgICBRKG4rMSkgPSBRKG4pICsgUShuKSAqICgwLjUgLSAyICogViAqIFEobileMikKKyAgICAgIHdpdGggUSA9IDAuNSogViBeLTAuNTsgMC41IDw9IFYgPCAxLjAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KQoreworCisgIEZJWFBfREJMIHZhbCA9IG9wIDsKKyAgRklYUF9EQkwgcmVnMSwgcmVnMiwgcmVndG1wIDsKKworICBpZiAodmFsID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKKyAgICAqc2hpZnQgPSAxIDsKKyAgICByZXR1cm4oKExPTkcpMSk7ICAvKiBtaW5pbXVtIHBvc2l0aXZlIHZhbHVlICovCisgIH0KKworCisgIC8qIG5vcm1hbGl6ZSBpbnB1dCwgY2FsY3VsYXRlIHNoaWZ0IHZhbHVlICovCisgIEZES19BU1NFUlQodmFsID4gRkwyRlhDT05TVF9EQkwoMC4wKSk7CisgICpzaGlmdCA9IGZOb3Jteih2YWwpIC0gMTsgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCisgIHZhbCA8PD0qc2hpZnQgOyAgLyogbm9ybWFsaXplZCBpbnB1dCBWICovCisgICpzaGlmdCs9MiA7ICAgICAgLyogYmlhcyBmb3IgZXhwb25lbnQgKi8KKworICAvKiBOZXd0b24gaXRlcmF0aW9uIG9mIDEvc3FydChWKSAqLworICByZWcxID0gaW52U3FydFRhYlsgKElOVCkodmFsPj4oREZSQUNUX0JJVFMtMS0oU1FSVF9CSVRTKzEpKSkgJiBTUVJUX0JJVFNfTUFTSyBdOworICByZWcyID0gRkwyRlhDT05TVF9EQkwoMC4wNjI1Zik7ICAgLyogMC41ID4+IDMgKi8KKworICByZWd0bXA9IGZQb3cyRGl2MihyZWcxKTsgICAgICAgICAgICAgIC8qIGEgPSBRXjIgKi8KKyAgcmVndG1wPSByZWcyIC0gZk11bHREaXYyKHJlZ3RtcCwgdmFsKTsgICAgICAvKiBiID0gMC41IC0gMiAqIFYgKiBRXjIgKi8KKyAgcmVnMSArPSAoZk11bHREaXYyKHJlZ3RtcCwgcmVnMSk8PDQpOyAgICAgICAvKiBRID0gUSArIFEqYiAqLworCisgIC8qIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGV4cG9uZW50ID0gaW5wdXQgZXhwLzIgKi8KKyAgaWYgKCpzaGlmdCAmIDB4MDAwMDAwMDEpIHsgLyogb2RkIHNoaWZ0IHZhbHVlcyA/ICovCisgICAgcmVnMiA9IEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5Zik7IC8qIDEvc3FydCgyKTsgKi8KKyAgICByZWcxID0gZk11bHREaXYyKHJlZzEsIHJlZzIpIDw8IDI7CisgIH0KKworICAqc2hpZnQgPSAqc2hpZnQ+PjE7CisKKyAgcmV0dXJuKHJlZzEpOworfQorI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX2ludlNxcnROb3JtMikgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IHNxcnRGaXhwCisgICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyBzcXJ0KG9wKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKQoreworICBJTlQgdG1wX2V4cCA9IDA7CisgIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKTsKKworICBGREtfQVNTRVJUKHRtcF9leHAgPiAwKSA7CisgIHJldHVybiggKEZJWFBfREJMKSAoIGZNdWx0RGl2MiggKG9wPDwodG1wX2V4cC0xKSksIHRtcF9pbnYgKSA8PCAyICkpOworfQorCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogc2NodXJfZGl2CisgICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyBvcDEvb3AyIHdpdGggb3AzLWJpdCBhY2N1cmFjeQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQoreworICAgIElOVCBMX251bSAgID0gKExPTkcpbnVtPj4xOworICAgIElOVCBMX2RlbnVtID0gKExPTkcpZGVudW0+PjE7CisgICAgSU5UIGRpdiAgICAgPSAwOworICAgIElOVCBrICAgICAgID0gY291bnQ7CisKKyAgICBGREtfQVNTRVJUIChudW0+PShGSVhQX0RCTCkwKTsKKyAgICBGREtfQVNTRVJUIChkZW51bT4oRklYUF9EQkwpMCk7CisgICAgRkRLX0FTU0VSVCAobnVtIDw9IGRlbnVtKTsKKworICAgIGlmIChMX251bSAhPSAwKQorICAgICAgICB3aGlsZSAoLS1rKQorICAgICAgICB7CisgICAgICAgICAgICBkaXYgICA8PD0gMTsKKyAgICAgICAgICAgIExfbnVtIDw8PSAxOworICAgICAgICAgICAgaWYgKExfbnVtID49IExfZGVudW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTF9udW0gLT0gTF9kZW51bTsKKyAgICAgICAgICAgICAgICBkaXYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHJldHVybiAoRklYUF9EQkwpKGRpdiA8PCAoREZSQUNUX0JJVFMgLSBjb3VudCkpOworfQorCisKKyNlbmRpZiAvKiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpICovCisKKworI2lmbmRlZiBGVU5DVElPTl9mTXVsdE5vcm0KK0ZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIsIElOVCAqcmVzdWx0X2UpCit7CisgICAgSU5UICAgIHByb2R1Y3QgPSAwOworICAgIElOVCAgICBub3JtX2YxLCBub3JtX2YyOworCisgICAgaWYgKCAgKGYxID09IChGSVhQX0RCTCkwKSB8fCAoZjIgPT0gKEZJWFBfREJMKTApICkgeworICAgICAgICAqcmVzdWx0X2UgPSAwOworICAgICAgICByZXR1cm4gKEZJWFBfREJMKTA7CisgICAgfQorICAgIG5vcm1fZjEgPSBDb3VudExlYWRpbmdCaXRzKGYxKTsKKyAgICBmMSA9IGYxIDw8IG5vcm1fZjE7CisgICAgbm9ybV9mMiA9IENvdW50TGVhZGluZ0JpdHMoZjIpOworICAgIGYyID0gZjIgPDwgbm9ybV9mMjsKKworICAgIHByb2R1Y3QgPSBmTXVsdChmMSwgZjIpOworICAgICpyZXN1bHRfZSAgPSAtIChub3JtX2YxICsgbm9ybV9mMik7CisKKyAgICByZXR1cm4gKEZJWFBfREJMKXByb2R1Y3Q7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybQorRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgTF9udW0sIEZJWFBfREJMIExfZGVudW0sIElOVCAqcmVzdWx0X2UpCit7CisgICAgRklYUF9EQkwgZGl2OworICAgIElOVCBub3JtX251bSwgbm9ybV9kZW47CisKKyAgICBGREtfQVNTRVJUIChMX251bSAgID49IChGSVhQX0RCTCkwKTsKKyAgICBGREtfQVNTRVJUIChMX2RlbnVtID4gIChGSVhQX0RCTCkwKTsKKworICAgIGlmKExfbnVtID09IChGSVhQX0RCTCkwKQorICAgIHsKKyAgICAgICAgKnJlc3VsdF9lID0gMDsKKyAgICAgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7CisgICAgfQorCisgICAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKExfbnVtKTsKKyAgICBMX251bSA9IExfbnVtIDw8IG5vcm1fbnVtOworICAgIExfbnVtID0gTF9udW0gPj4gMTsKKyAgICAqcmVzdWx0X2UgPSAtIG5vcm1fbnVtICsgMTsKKworICAgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhMX2RlbnVtKTsKKyAgICBMX2RlbnVtID0gTF9kZW51bSA8PCBub3JtX2RlbjsKKyAgICAqcmVzdWx0X2UgLT0gLSBub3JtX2RlbjsKKworICAgIGRpdiA9IHNjaHVyX2RpdihMX251bSwgTF9kZW51bSwgRlJBQ1RfQklUUyk7CisKKyAgICByZXR1cm4gZGl2OworfQorI2VuZGlmIC8qICFGVU5DVElPTl9mRGl2Tm9ybSAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtCitGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKQoreworICAgIElOVCBlOworICAgIEZJWFBfREJMIHJlczsKKworICAgIEZES19BU1NFUlQgKGRlbm9tID49IG51bSk7CisKKyAgICByZXMgPSBmRGl2Tm9ybShudW0sIGRlbm9tLCAmZSk7CisKKyAgICAvKiBBdm9pZCBvdmVyZmxvdyBzaW5jZSB3ZSBtdXN0IG91dHB1dCBhIHZhbHVlIHdpdGggZXhwb25lbnQgMAorICAgICAgIHRoZXJlIGlzIG5vIG90aGVyIGNob2ljZSB0aGFuIHNhdHVyYXRpbmcgdG8gYWxtb3N0IDEuMGYgKi8KKyAgICBpZihyZXMgPT0gKEZJWFBfREJMKSgxPDwoREZSQUNUX0JJVFMtMikpICYmIGUgPT0gMSkKKyAgICB7CisgICAgICAgIHJlcyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXMgPSBzY2FsZVZhbHVlKHJlcywgZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKyNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm0gKi8KKworI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybUhpZ2hQcmVjCitGSVhQX0RCTCBmRGl2Tm9ybUhpZ2hQcmVjKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIElOVCAqcmVzdWx0X2UpCit7CisgICAgRklYUF9EQkwgZGl2OworICAgIElOVCBub3JtX251bSwgbm9ybV9kZW47CisKKyAgICBGREtfQVNTRVJUIChudW0gICA+PSAoRklYUF9EQkwpMCk7CisgICAgRkRLX0FTU0VSVCAoZGVub20gPiAgKEZJWFBfREJMKTApOworCisgICAgaWYobnVtID09IChGSVhQX0RCTCkwKQorICAgIHsKKyAgICAgICAgKnJlc3VsdF9lID0gMDsKKyAgICAgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7CisgICAgfQorCisgICAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKG51bSk7CisgICAgbnVtID0gbnVtIDw8IG5vcm1fbnVtOworICAgIG51bSA9IG51bSA+PiAxOworICAgICpyZXN1bHRfZSA9IC0gbm9ybV9udW0gKyAxOworCisgICAgbm9ybV9kZW4gPSBDb3VudExlYWRpbmdCaXRzKGRlbm9tKTsKKyAgICBkZW5vbSA9IGRlbm9tIDw8IG5vcm1fZGVuOworICAgICpyZXN1bHRfZSAtPSAgLSBub3JtX2RlbjsKKworICAgIGRpdiA9IHNjaHVyX2RpdihudW0sIGRlbm9tLCAzMSk7CisgICAgcmV0dXJuIGRpdjsKK30KKyNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm1IaWdoUHJlYyAqLworCisKKworRklYUF9EQkwgQ2FsY0xvZzIoRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBJTlQgKnJlc3VsdF9lKQoreworICByZXR1cm4gZkxvZzIoYmFzZV9tLCBiYXNlX2UsIHJlc3VsdF9lKTsKK30KKworRklYUF9EQkwgZjJQb3coCisgICAgICAgIGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UsCisgICAgICAgIElOVCAqcmVzdWx0X2UKKyAgICAgICAgKQoreworICBGSVhQX0RCTCBmcmFjX3BhcnQsIHJlc3VsdF9tOworICBJTlQgaW50X3BhcnQ7CisKKyAgaWYgKGV4cF9lID4gMCkKKyAgeworICAgICAgSU5UIGV4cF9iaXRzID0gREZSQUNUX0JJVFMtMSAtIGV4cF9lOworICAgICAgaW50X3BhcnQgPSBleHBfbSA+PiBleHBfYml0czsKKyAgICAgIGZyYWNfcGFydCA9IGV4cF9tIC0gKEZJWFBfREJMKShpbnRfcGFydCA8PCBleHBfYml0cyk7CisgICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgPDwgZXhwX2U7CisgIH0KKyAgZWxzZQorICB7CisgICAgICBpbnRfcGFydCA9IDA7CisgICAgICBmcmFjX3BhcnQgPSBleHBfbSA+PiAtZXhwX2U7CisgIH0KKworICAvKiBCZXN0IGFjY3VyYWN5IGlzIGFyb3VuZCAwLCBzbyB0cnkgdG8gZ2V0IHRoZXJlIHdpdGggdGhlIGZyYWN0aW9uYWwgcGFydC4gKi8KKyAgaWYoIGZyYWNfcGFydCA+IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKKyAgeworICAgICAgaW50X3BhcnQgPSBpbnRfcGFydCArIDE7CisgICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgKyBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgIH0KKyAgaWYoIGZyYWNfcGFydCA8IEZMMkZYQ09OU1RfREJMKC0wLjVmKSApCisgIHsKKyAgICAgIGludF9wYXJ0ID0gaW50X3BhcnQgLSAxOworICAgICAgZnJhY19wYXJ0ID0gLShGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBmcmFjX3BhcnQpOworICB9CisKKyAgLyogRXZhbHVhdGUgdGF5bG9yIHBvbHlub21pYWwgd2hpY2ggYXBwcm94aW1hdGVzIDJeeCAqLworICB7CisgICAgRklYUF9EQkwgcDsKKworICAgIC8qIHJlc3VsdF9tIH49IDJeZnJhY19wYXJ0ICovCisgICAgcCA9IGZyYWNfcGFydDsKKyAgICAvKiBGaXJzdCB0YXlsb3Igc2VyaWVzIGNvZWZmaWNpZW50IGFfMCA9IDEuMCwgc2NhbGVkIGJ5IDAuNSBkdWUgdG8gZk11bHREaXYyKCkuICovCisgICAgcmVzdWx0X20gPSBGTDJGWENPTlNUX0RCTCgxLjBmLzIuMGYpOworICAgIGZvciAoSU5UIGkgPSAwOyBpIDwgUE9XMl9QUkVDSVNJT047IGkrKykgeworICAgICAgLyogbmV4dCB0YXlsb3Igc2VyaWVzIHRlcm06IGFfaSAqIHheaSwgeD0wICovCisgICAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgcG93MkNvZWZmW2ldLCBwKTsKKyAgICAgIHAgID0gZk11bHQocCwgZnJhY19wYXJ0KTsKKyAgICB9CisgIH0KKworICAvKiAiKyAxIiBjb21wZW5zYXRlcyBmTXVsdEFkZERpdjIoKSBvZiB0aGUgcG9seW5vbWlhbCBldmFsdWF0aW9uIGFib3ZlLiAqLworICAqcmVzdWx0X2UgPSBpbnRfcGFydCArIDE7CisKKyAgcmV0dXJuIHJlc3VsdF9tOworfQorCitGSVhQX0RCTCBmMlBvdygKKyAgICAgICAgY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZQorICAgICAgICApCit7CisgIEZJWFBfREJMIHJlc3VsdF9tOworICBJTlQgcmVzdWx0X2U7CisKKyAgcmVzdWx0X20gPSBmMlBvdyhleHBfbSwgZXhwX2UsICZyZXN1bHRfZSk7CisgIHJlc3VsdF9lID0gZml4TWluKERGUkFDVF9CSVRTLTEsZml4TWF4KC0oREZSQUNUX0JJVFMtMSkscmVzdWx0X2UpKTsKKworICByZXR1cm4gc2NhbGVWYWx1ZShyZXN1bHRfbSwgcmVzdWx0X2UpOworfQorCitGSVhQX0RCTCBmUG93KAorICAgICAgICBGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsCisgICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsCisgICAgICAgIElOVCAqcmVzdWx0X2UKKyAgICAgICAgKQoreworICAgIElOVCBhbnNfbGcyX2UsIGJhc2VsZzJfZTsKKyAgICBGSVhQX0RCTCBiYXNlX2xnMiwgYW5zX2xnMiwgcmVzdWx0OworCisgICAgLyogQ2FsYyBsb2cyIG9mIGJhc2UgKi8KKyAgICBiYXNlX2xnMiA9IGZMb2cyKGJhc2VfbSwgYmFzZV9lLCAmYmFzZWxnMl9lKTsKKworICAgIC8qIFByZXBhcmUgZXhwICovCisgICAgeworICAgICAgSU5UIGxlYWRpbmdCaXRzOworCisgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOworICAgICAgZXhwX20gPSBleHBfbSA8PCBsZWFkaW5nQml0czsKKyAgICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOworICAgIH0KKworICAgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCisgICAgYW5zX2xnMiA9IGZNdWx0KGJhc2VfbGcyLCBleHBfbSk7CisgICAgYW5zX2xnMl9lID0gZXhwX2UgKyBiYXNlbGcyX2U7CisKKyAgICAvKiBDYWxjIGFudGlsb2cgKi8KKyAgICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZJWFBfREJMIGZMZFBvdygKKyAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sCisgICAgICAgIElOVCBiYXNlTGRfZSwKKyAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKKyAgICAgICAgSU5UICpyZXN1bHRfZQorICAgICAgICApCit7CisgICAgSU5UIGFuc19sZzJfZTsKKyAgICBGSVhQX0RCTCBhbnNfbGcyLCByZXN1bHQ7CisKKyAgICAvKiBQcmVwYXJlIGV4cCAqLworICAgIHsKKyAgICAgIElOVCBsZWFkaW5nQml0czsKKworICAgICAgbGVhZGluZ0JpdHMgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoZXhwX20pKTsKKyAgICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7CisgICAgICBleHBfZSAtPSBsZWFkaW5nQml0czsKKyAgICB9CisKKyAgICAvKiBDYWxjIGJhc2UgcG93IGV4cCAqLworICAgIGFuc19sZzIgPSBmTXVsdChiYXNlTGRfbSwgZXhwX20pOworICAgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZUxkX2U7CisKKyAgICAvKiBDYWxjIGFudGlsb2cgKi8KKyAgICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZJWFBfREJMIGZMZFBvdygKKyAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKKyAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZQorICAgICAgICApCit7CisgIEZJWFBfREJMIHJlc3VsdF9tOworICBpbnQgcmVzdWx0X2U7CisKKyAgcmVzdWx0X20gPSBmTGRQb3coYmFzZUxkX20sIGJhc2VMZF9lLCBleHBfbSwgZXhwX2UsICZyZXN1bHRfZSk7CisKKyAgcmV0dXJuIFNBVFVSQVRFX1NISUZUKHJlc3VsdF9tLCAtcmVzdWx0X2UsIERGUkFDVF9CSVRTKTsKK30KKworRklYUF9EQkwgZlBvd0ludCgKKyAgICAgICAgRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLAorICAgICAgICBJTlQgZXhwLAorICAgICAgICBJTlQgKnBSZXN1bHRfZQorICAgICAgICApCit7CisgIEZJWFBfREJMIHJlc3VsdDsKKworICBpZiAoZXhwICE9IDApIHsKKyAgICBJTlQgcmVzdWx0X2UgPSAwOworCisgICAgaWYgKGJhc2VfbSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgeworICAgICAgICBJTlQgbGVhZGluZ0JpdHM7CisgICAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyggYmFzZV9tICk7CisgICAgICAgIGJhc2VfbSA8PD0gbGVhZGluZ0JpdHM7CisgICAgICAgIGJhc2VfZSAtPSBsZWFkaW5nQml0czsKKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gYmFzZV9tOworCisgICAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZkFicyhleHApOyBpKyspIHsKKyAgICAgICAgICByZXN1bHQgPSBmTXVsdChyZXN1bHQsIGJhc2VfbSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGV4cCA8IDApIHsKKyAgICAgICAgLyogMS4wIC8gYW5zICovCisgICAgICAgIHJlc3VsdCA9IGZEaXZOb3JtKCBGTDJGWENPTlNUX0RCTCgwLjVmKSwgcmVzdWx0LCAmcmVzdWx0X2UgKTsKKyAgICAgICAgcmVzdWx0X2UrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhbnNTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoIHJlc3VsdCApOworICAgICAgICByZXN1bHQgPDw9IGFuc1NjYWxlOworICAgICAgICByZXN1bHRfZSAtPSBhbnNTY2FsZTsKKyAgICAgIH0KKworICAgICAgcmVzdWx0X2UgKz0gZXhwICogYmFzZV9lOworCisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IChGSVhQX0RCTCkwOworICAgIH0KKyAgICAqcFJlc3VsdF9lID0gcmVzdWx0X2U7CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gIEZMMkZYQ09OU1RfREJMKDAuNWYpOworICAgICpwUmVzdWx0X2UgPSAxOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lLCBJTlQgKnJlc3VsdF9lKQoreworICBGSVhQX0RCTCByZXN1bHRfbTsKKworICAvKiBTaG9ydCBjdXQgZm9yIHplcm8gYW5kIG5lZ2F0aXZlIG51bWJlcnMuICovCisgIGlmICggeF9tIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeworICAgICpyZXN1bHRfZSA9IERGUkFDVF9CSVRTLTE7CisgICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBsb2cyKCkgKi8KKyAgeworICAgIEZJWFBfREJMIHB4Ml9tLCB4Ml9tOworCisgICAgLyogTW92ZSBpbnB1dCB2YWx1ZSB4X20gKiAyXnhfZSB0b3dhcmQgMS4wLCB3aGVyZSB0aGUgdGF5bG9yIGFwcHJveGltYXRpb24KKyAgICAgICBvZiB0aGUgZnVuY3Rpb24gbG9nKDEteCkgY2VudGVyZWQgYXQgMCBpcyBtb3N0IGFjY3VyYXRlLiAqLworICAgIHsKKyAgICAgIElOVCBiX25vcm07CisKKyAgICAgIGJfbm9ybSA9IGZOb3Jteih4X20pLTE7CisgICAgICB4Ml9tID0geF9tIDw8IGJfbm9ybTsKKyAgICAgIHhfZSA9IHhfZSAtIGJfbm9ybTsKKyAgICB9CisKKyAgICAvKiBtYXAgeCBmcm9tIGxvZyh4KSBkb21haW4gdG8gbG9nKDEteCkgZG9tYWluLiAqLworICAgIHgyX20gPSAtICh4Ml9tICsgRkwyRlhDT05TVF9EQkwoLTEuMCkgKTsKKworICAgIC8qIFRheWxvciBwb2xpbm9taWFsIGFwcHJveGltYXRpb24gb2YgbG4oMS14KSAqLworICAgIHJlc3VsdF9tICA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgICAgcHgyX20gPSB4Ml9tOworICAgIGZvciAoaW50IGk9MDsgaTxMRF9QUkVDSVNJT047IGkrKykgeworICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIGxkQ29lZmZbaV0sIHB4Ml9tKTsKKyAgICAgIHB4Ml9tID0gZk11bHQocHgyX20sIHgyX20pOworICAgIH0KKyAgICAvKiBNdWx0aXBseSByZXN1bHQgd2l0aCAxL2xuKDIpID0gMS4wICsgMC40NDI2OTUwNDA4ODggKGdldCBsb2cyKHgpIGZyb20gbG4oeCkgcmVzdWx0KS4gKi8KKyAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgcmVzdWx0X20sIEZMMkZYQ09OU1RfREJMKDIuMCowLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkyNDY4MTAwMTkpKTsKKworICAgIC8qIEFkZCBleHBvbmVudCBwYXJ0LiBsb2cyKHhfbSAqIDJeeF9lKSA9IGxvZzIoeF9tKSArIHhfZSAqLworICAgIGlmICh4X2UgIT0gMCkKKyAgICB7CisgICAgICBpbnQgZW5vcm07CisKKyAgICAgIGVub3JtID0gREZSQUNUX0JJVFMgLSBmTm9ybSgoRklYUF9EQkwpeF9lKTsKKyAgICAgIC8qIFRoZSAtMSBpbiB0aGUgcmlnaHQgc2hpZnQgb2YgcmVzdWx0X20gY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9saW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KKyAgICAgIHJlc3VsdF9tID0gKHJlc3VsdF9tID4+IChlbm9ybS0xKSkgKyAoKEZJWFBfREJMKXhfZSA8PCAoREZSQUNUX0JJVFMtMS1lbm9ybSkpOworCisgICAgICAqcmVzdWx0X2UgPSBlbm9ybTsKKyAgICB9IGVsc2UgeworICAgICAgLyogMSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUgaW4gdGhlIHRheWxvciBwb2xpbm9taWFsIGV2YWx1YXRpb24gbG9vcC4qLworICAgICAgKnJlc3VsdF9lID0gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0X207Cit9CisKK0ZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSkKK3sKKyAgaWYgKCB4X20gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgeF9tID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICB9CisgIGVsc2UgeworICAgIElOVCByZXN1bHRfZTsKKyAgICB4X20gPSBmTG9nMih4X20sIHhfZSwgJnJlc3VsdF9lKTsKKyAgICB4X20gPSBzY2FsZVZhbHVlKHhfbSwgcmVzdWx0X2UtTERfREFUQV9TSElGVCk7CisgIH0KKyAgcmV0dXJuICB4X207Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL21kY3QuY3BwIGIvYWFjL2xpYkZESy9zcmMvbWRjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyOWFhMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL21kY3QuY3BwCkBAIC0wLDAgKzEsMzg1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBNRENUIHJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm1kY3QuaCIKKworCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKworCit2b2lkIG1kY3RfaW5pdCggSF9NRENUIGhNZGN0LAorICAgICAgICAgICAgICAgIEZJWFBfREJMICpvdmVybGFwLAorICAgICAgICAgICAgICAgIElOVCBvdmVybGFwQnVmZmVyU2l6ZSApCit7CisgIGhNZGN0LT5vdmVybGFwLmZyZXEgPSBvdmVybGFwOworICAvL0ZES21lbWNsZWFyKG92ZXJsYXAsIG92ZXJsYXBCdWZmZXJTaXplKnNpemVvZihGSVhQX0RCTCkpOworICBoTWRjdC0+cHJldl9mciA9IDA7CisgIGhNZGN0LT5wcmV2X25yID0gMDsKKyAgaE1kY3QtPnByZXZfdGwgPSAwOworICBoTWRjdC0+b3Zfc2l6ZSA9IG92ZXJsYXBCdWZmZXJTaXplOworfQorCisKK3ZvaWQgaW1kY3RfZ2FpbihGSVhQX0RCTCAqcEdhaW5fbSwgaW50ICpwR2Fpbl9lLCBpbnQgdGwpCit7CisgIEZJWFBfREJMIGdhaW5fbSA9ICpwR2Fpbl9tOworICBpbnQgZ2Fpbl9lID0gKnBHYWluX2U7CisgIGludCBsb2cyX3RsOworCisgIGxvZzJfdGwgPSBERlJBQ1RfQklUUy0xLWZOb3JteigoRklYUF9EQkwpdGwpOworCisgIGdhaW5fZSArPSAtTURDVF9PVVRQVVRfR0FJTiAtIGxvZzJfdGwgLSBNRENUX09VVF9IRUFEUk9PTSArIDE7CisKKyAgLyogRGV0ZWN0IG5vbi1yYWRpeCAyIHRyYW5zZm9ybSBsZW5ndGggYW5kIGFkZCBhbXBsaXR1ZGUgY29tcGVuc2F0aW9uIGZhY3RvcgorICAgICB3aGljaCBjYW5ub3QgYmUgaW5jbHVkZWQgaW50byB0aGUgZXhwb25lbnQgYWJvdmUgKi8KKyAgc3dpdGNoICggKHRsKSA+PiAobG9nMl90bCAtIDIpICkgeworICAgIGNhc2UgMHg3OiAvKiAxMCBtcywgMS90bCA9IDEuMC8oRkRLcG93KDIuMCwgLWxvZzJfdGwpICogMC41MzMzMzMzMzMzMzMzMzMzMzMzMykgKi8KKyAgICAgIGlmIChnYWluX20gPT0gKEZJWFBfREJMKTApIHsKKyAgICAgICAgZ2Fpbl9tID0gRkwyRlhDT05TVF9EQkwoMC41MzMzMzMzMzMzMzMzMzMzMzMzM2YpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2Fpbl9tID0gZk11bHQoZ2Fpbl9tLCBGTDJGWENPTlNUX0RCTCgwLjUzMzMzMzMzMzMzMzMzMzMzMzMzZikpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY6IC8qIDMvNCBvZiByYWRpeCAyLCAxL3RsID0gMS4wLyhGREtwb3coMi4wLCAtbG9nMl90bCkgKiAyLjAvMy4wKSAqLworICAgICAgaWYgKGdhaW5fbSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgICBnYWluX20gPSBGTDJGWENPTlNUX0RCTCgyLjAvMy4wZik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnYWluX20gPSBmTXVsdChnYWluX20sIEZMMkZYQ09OU1RfREJMKDIuMC8zLjBmKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDoKKyAgICAgIC8qIHJhZGl4IDIsIG5vdGhpbmcgdG8gZG8uICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogdW5zdXBwb3J0ZWQgKi8KKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgfQorCisgICpwR2Fpbl9tID0gZ2Fpbl9tOworICAqcEdhaW5fZSA9IGdhaW5fZTsKK30KKworSU5UIGltZGN0X2RyYWluKAorICAgICAgICBIX01EQ1QgaE1kY3QsCisgICAgICAgIEZJWFBfREJMICpvdXRwdXQsCisgICAgICAgIElOVCBuclNhbXBsZXNSb29tCisgICAgICAgICkKK3sKKyAgaW50IGJ1ZmZlcmVkX3NhbXBsZXMgPSAwOworCisgIGlmIChuclNhbXBsZXNSb29tID4gMCkgeworICAgIGJ1ZmZlcmVkX3NhbXBsZXMgPSBoTWRjdC0+b3Zfb2Zmc2V0OworCisgICAgRkRLX0FTU0VSVChidWZmZXJlZF9zYW1wbGVzIDw9IG5yU2FtcGxlc1Jvb20pOworCisgICAgaWYgKGJ1ZmZlcmVkX3NhbXBsZXMgPiAwKSAgeworICAgICAgRkRLbWVtY3B5KG91dHB1dCwgaE1kY3QtPm92ZXJsYXAudGltZSwgYnVmZmVyZWRfc2FtcGxlcypzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIGhNZGN0LT5vdl9vZmZzZXQgPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gYnVmZmVyZWRfc2FtcGxlczsKK30KKworSU5UIGltZGN0X2NvcHlfb3ZfYW5kX25yKAorICAgICAgICBIX01EQ1QgaE1kY3QsCisgICAgICAgIEZJWFBfREJMICogcFRpbWVEYXRhLAorICAgICAgICBJTlQgbnJTYW1wbGVzCisgICAgICAgICkKK3sKKyAgRklYUF9EQkwgKnBPdmw7CisgIGludCBudCwgbmYsIGk7CisKKyAgbnQgPSBmTWluKGhNZGN0LT5vdl9vZmZzZXQsIG5yU2FtcGxlcyk7CisgIG5yU2FtcGxlcyAtPSBudDsKKyAgbmYgPSBmTWluKGhNZGN0LT5wcmV2X25yLCBuclNhbXBsZXMpOworICBuclNhbXBsZXMgLT0gbmY7CisgIEZES21lbWNweShwVGltZURhdGEsIGhNZGN0LT5vdmVybGFwLnRpbWUsIG50KnNpemVvZihGSVhQX0RCTCkpOworICBwVGltZURhdGEgKz0gbnQ7CisKKyAgcE92bCA9IGhNZGN0LT5vdmVybGFwLmZyZXEgKyBoTWRjdC0+b3Zfc2l6ZSAtIDE7CisgIGZvciAoaT0wOyBpPG5mOyBpKyspIHsKKyAgICBGSVhQX0RCTCB4ID0gLSAoKnBPdmwtLSk7CisgICAgKnBUaW1lRGF0YSA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICBwVGltZURhdGEgKys7CisgIH0KKworICByZXR1cm4gKG50K25mKTsKK30KKwordm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsIGNvbnN0IEZJWFBfV1RQICp3bHMsIGludCBub091dFNhbXBsZXMpCit7CisgIGludCBmbCA9ICpwZmwsIG5sID0gKnBubDsKKyAgaW50IHdpbmRvd19kaWZmLCB1c2VfY3VycmVudCA9IDAsIHVzZV9wcmV2aW91cyA9IDA7CisgIGlmIChoTWRjdC0+cHJldl90bCA9PSAwKSB7CisgICAgaE1kY3QtPnByZXZfd3JzICAgID0gd2xzOworICAgIGhNZGN0LT5wcmV2X2ZyICAgICA9IGZsOworICAgIGhNZGN0LT5wcmV2X25yICAgICA9IChub091dFNhbXBsZXMtZmwpPj4xOworICAgIGhNZGN0LT5wcmV2X3RsICAgICA9IG5vT3V0U2FtcGxlczsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ICAgPSAwOworICAgIHVzZV9jdXJyZW50ID0gMTsKKyAgfQorCisgIHdpbmRvd19kaWZmID0gKGhNZGN0LT5wcmV2X2ZyIC0gZmwpPj4xOworCisgIC8qIGNoZWNrIGlmIHRoZSBwcmV2aW91cyB3aW5kb3cgc2xvcGUgY2FuIGJlIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBjdXJyZW50IHdpbmRvdyBzbG9wZSAqLworICBpZiAoaE1kY3QtPnByZXZfbnIgKyB3aW5kb3dfZGlmZiA+IDApIHsKKyAgICB1c2VfY3VycmVudCA9IDE7CisgIH0KKyAgLyogY2hlY2sgaWYgdGhlIGN1cnJlbnQgd2luZG93IHNsb3BlIGNhbiBiZSBhZGp1c3RlZCB0byBtYXRjaCB0aGUgcHJldmlvdXMgd2luZG93IHNsb3BlICovCisgIGlmIChubCAtIHdpbmRvd19kaWZmID4gMCApIHsKKyAgICB1c2VfcHJldmlvdXMgPSAxOworICB9CisKKyAgLyogaWYgYm90aCBpcyBwb3NzaWJsZSBjaG9vc2UgdGhlIGxhcmdlciBvZiBib3RoIHdpbmRvdyBzbG9wZSBsZW5ndGhzICovCisgIGlmICh1c2VfY3VycmVudCAmJiB1c2VfcHJldmlvdXMpIHsKKyAgICBpZiAoZmwgPCBoTWRjdC0+cHJldl9mcikgeworICAgICAgdXNlX2N1cnJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICB1c2VfcHJldmlvdXMgPSAwOworICAgIH0KKyAgfQorICAvKgorICAgKiBJZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIGJsb2NrIGlzIGJpZyBlbm91Z2gsIGVubGFyZ2UgcHJldmlvdXMgd2luZG93IG92ZXJsYXAsCisgICAqIGlmIG5vdCwgdGhlbiBzaHJpbmsgY3VycmVudCB3aW5kb3cgb3ZlcmxhcC4KKyAgICovCisgIGlmICh1c2VfY3VycmVudCkgeworICAgIGhNZGN0LT5wcmV2X25yICs9IHdpbmRvd19kaWZmOworICAgIGhNZGN0LT5wcmV2X2ZyID0gZmw7CisgICAgaE1kY3QtPnByZXZfd3JzID0gd2xzOworICB9IGVsc2UgeworICAgIG5sIC09IHdpbmRvd19kaWZmOworICAgIGZsID0gaE1kY3QtPnByZXZfZnI7CisgIH0KKworICAqcGZsID0gZmw7CisgICpwbmwgPSBubDsKK30KKworSU5UICBpbWRjdF9ibG9jaygKKyAgICAgICAgSF9NRENUIGhNZGN0LAorICAgICAgICBGSVhQX0RCTCAqb3V0cHV0LAorICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgIGNvbnN0IFNIT1JUIHNjYWxlZmFjdG9yW10sCisgICAgICAgIGNvbnN0IElOVCBuU3BlYywKKyAgICAgICAgY29uc3QgSU5UIG5vT3V0U2FtcGxlcywKKyAgICAgICAgY29uc3QgSU5UIHRsLAorICAgICAgICBjb25zdCBGSVhQX1dUUCAqd2xzLAorICAgICAgICBJTlQgZmwsCisgICAgICAgIGNvbnN0IEZJWFBfV1RQICp3cnMsCisgICAgICAgIGNvbnN0IElOVCBmciwKKyAgICAgICAgRklYUF9EQkwgZ2FpbgorICAgICAgICApCit7CisgIEZJWFBfREJMICpwT3ZsOworICBGSVhQX0RCTCAqcE91dDAgPSBvdXRwdXQsICpwT3V0MTsKKyAgSU5UIG5sLCBucjsKKyAgaW50IHcsIGksIG5yU2FtcGxlcyA9IDAsIHNwZWNTaGlmdFNjYWxlLCB0cmFuc2Zvcm1fZ2Fpbl9lID0gMDsKKworICAvKiBEZXJpdmUgTlIgYW5kIE5MICovCisgIG5yID0gKHRsIC0gZnIpPj4xOworICBubCA9ICh0bCAtIGZsKT4+MTsKKworICAvKiBJbmNsdWRlIDIvTiBJTURDVCBnYWluIGludG8gZ2FpbiBmYWN0b3IgYW5kIGV4cG9uZW50LiAqLworICBpbWRjdF9nYWluKCZnYWluLCAmdHJhbnNmb3JtX2dhaW5fZSwgdGwpOworCisgIC8qIERldGVjdCBGUnByZXZpb3VzIC8gRkwgbWlzbWF0Y2hlcyBhbmQgb3ZlcnJpZGUgcGFyYW1ldGVycyBhY2NvcmRpbmdseSAqLworICBpZiAoaE1kY3QtPnByZXZfZnIgIT0gZmwpIHsKKyAgICBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKGhNZGN0LCAmZmwsICZubCwgdGwsIHdscywgbm9PdXRTYW1wbGVzKTsKKyAgfQorCisgIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSAxOworCisgIGlmICggbm9PdXRTYW1wbGVzID4gbnJTYW1wbGVzICkgeworICAgIC8qIFB1cmdlIGJ1ZmZlcmVkIG91dHB1dC4gKi8KKyAgICBmb3IgKGk9MDsgaTxoTWRjdC0+b3Zfb2Zmc2V0OyBpKyspIHsKKyAgICAgICpwT3V0MCA9IGhNZGN0LT5vdmVybGFwLnRpbWVbaV07CisgICAgICBwT3V0MCArKzsKKyAgICB9CisgICAgbnJTYW1wbGVzID0gaE1kY3QtPm92X29mZnNldDsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKKyAgfQorCisgIGZvciAodz0wOyB3PG5TcGVjOyB3KyspCisgIHsKKyAgICBGSVhQX0RCTCAqcFNwZWMsICpwQ3VycjsKKyAgICBjb25zdCBGSVhQX1dUUCAqcFdpbmRvdzsKKworICAgIHNwZWNTaGlmdFNjYWxlID0gdHJhbnNmb3JtX2dhaW5fZTsKKworICAgIC8qIFNldHVwIHdpbmRvdyBwb2ludGVycyAqLworICAgIHBXaW5kb3cgPSBoTWRjdC0+cHJldl93cnM7CisKKyAgICAvKiBDdXJyZW50IHNwZWN0cnVtICovCisgICAgcFNwZWMgPSBzcGVjdHJ1bSt3KnRsOworCisgICAgLyogRENUIElWIG9mIGN1cnJlbnQgc3BlY3RydW0uICovCisgICAgZGN0X0lWKHBTcGVjLCB0bCwgJnNwZWNTaGlmdFNjYWxlKTsKKworICAgIC8qIE9wdGlvbmFsIHNjYWxpbmcgb2YgdGltZSBkb21haW4gLSBubyB5ZXQgd2luZG93ZWQgLSBvZiBjdXJyZW50IHNwZWN0cnVtICovCisgICAgLyogYW5kIGRlLXNjYWxlIGN1cnJlbnQgc3BlY3RydW0gc2lnbmFsICh0aW1lIGRvbWFpbiwgbm8geWV0IHdpbmRvd2VkKSAqLwkKKyAgICBpZiAoZ2FpbiAhPSAoRklYUF9EQkwpMCkgeworICAgICAgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKHBTcGVjLCBnYWluLCB0bCwgc2NhbGVmYWN0b3Jbd10gKyBzcGVjU2hpZnRTY2FsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNjYWxlVmFsdWVzKHBTcGVjLCB0bCwgc2NhbGVmYWN0b3Jbd10gKyBzcGVjU2hpZnRTY2FsZSk7CisgICAgfQorCisgICAgaWYgKCBub091dFNhbXBsZXMgPD0gbnJTYW1wbGVzICkgeworICAgICAgLyogRGl2ZXJ0IG91dHB1dCBmaXJzdCBoYWxmIHRvIG92ZXJsYXAgYnVmZmVyIGlmIHdlIGFscmVhZHkgZ290IGVub3VnaCBvdXRwdXQgc2FtcGxlcy4gKi8KKyAgICAgIHBPdXQwID0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQ7CisgICAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGhNZGN0LT5wcmV2X25yICsgZmwvMjsKKyAgICB9IGVsc2UgeworICAgICAgLyogQWNjb3VudCBvdXRwdXQgc2FtcGxlcyAqLworICAgICAgbnJTYW1wbGVzICs9IGhNZGN0LT5wcmV2X25yICsgZmwvMjsKKyAgICB9CisKKyAgICAvKiBOUiBvdXRwdXQgc2FtcGxlcyAwIC4uIE5SLiAtb3ZlcmxhcFtUTC8yLi5UTC8yLU5SXSAqLworICAgIGZvciAoaT0wOyBpPGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAtICgqcE92bC0tKTsKKyAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBPdXQwICsrOworICAgIH0KKworICAgIGlmICggbm9PdXRTYW1wbGVzIDw9IG5yU2FtcGxlcyApIHsKKyAgICAgIC8qIERpdmVydCBvdXRwdXQgc2Vjb25kIGhhbGYgdG8gb3ZlcmxhcCBidWZmZXIgaWYgd2UgYWxyZWFkeSBnb3QgZW5vdWdoIG91dHB1dCBzYW1wbGVzLiAqLworICAgICAgcE91dDEgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldCArIGZsLzIgLSAxOworICAgICAgaE1kY3QtPm92X29mZnNldCArPSBmbC8yICsgbmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHBPdXQxID0gcE91dDAgKyAoZmwgLSAxKTsKKyAgICAgIG5yU2FtcGxlcyArPSBmbC8yICsgbmw7CisgICAgfQorCisgICAgLyogb3V0cHV0IHNhbXBsZXMgYmVmb3JlIHdpbmRvdyBjcm9zc2luZyBwb2ludCBOUiAuLiBUTC8yLiAtb3ZlcmxhcFtUTC8yLU5SLi5UTC8yLU5SLUZMLzJdICsgY3VycmVudFtOUi4uVEwvMl0gKi8KKyAgICAvKiBvdXRwdXQgc2FtcGxlcyBhZnRlciB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgVEwvMiAuLiBUTC8yK0ZMLzIuIC1vdmVybGFwWzAuLkZMLzJdIC0gY3VycmVudFtUTC8yLi5GTC8yXSAqLworICAgIHBDdXJyID0gcFNwZWMgKyB0bCAtIGZsLzI7CisgICAgZm9yIChpPTA7IGk8ZmwvMjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4MCwgeDE7CisKKyAgICAgIGNwbHhNdWx0KCZ4MSwgJngwLCAqcEN1cnIrKywgLSAqcE92bC0tLCBwV2luZG93W2ldKTsKKyAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4MCk7CisgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoLXgxKTsKKyAgICAgIHBPdXQwICsrOworICAgICAgcE91dDEgLS07CisgICAgfQorICAgIHBPdXQwICs9IChmbC8yKTsKKworICAgIC8qIE5MIG91dHB1dCBzYW1wbGVzIFRMLzIrRkwvMi4uVEwuIC0gY3VycmVudFtGTC8yLi4wXSAqLworICAgIHBPdXQxICs9IChmbC8yKSArIDE7CisgICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwvMiAtIDE7CisgICAgZm9yIChpPTA7IGk8bmw7IGkrKykgeworICAgICAgRklYUF9EQkwgeCA9IC0gKCpwQ3Vyci0tKTsKKyAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBPdXQxICsrOworICAgIH0KKworICAgIC8qIFNldCBvdmVybGFwIHNvdXJjZSBwb2ludGVyIGZvciBuZXh0IHdpbmRvdyBwT3ZsID0gcFNwZWMgKyB0bC8yIC0gMTsgKi8KKyAgICBwT3ZsID0gcFNwZWMgKyB0bC8yIC0gMTsKKworICAgIC8qIFByZXZpb3VzIHdpbmRvdyB2YWx1ZXMuICovCisgICAgaE1kY3QtPnByZXZfbnIgPSBucjsKKyAgICBoTWRjdC0+cHJldl9mciA9IGZyOworICAgIGhNZGN0LT5wcmV2X3RsID0gdGw7CisgICAgaE1kY3QtPnByZXZfd3JzID0gd3JzOworICB9CisKKyAgLyogU2F2ZSBvdmVybGFwICovCisgIAorICBwT3ZsID0gaE1kY3QtPm92ZXJsYXAuZnJlcSArIGhNZGN0LT5vdl9zaXplIC0gdGwvMjsKKyAgRkRLX0FTU0VSVChwT3ZsID49IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0KTsKKyAgRkRLX0FTU0VSVCh0bC8yIDw9IGhNZGN0LT5vdl9zaXplKTsKKyAgZm9yIChpPTA7IGk8dGwvMjsgaSsrKSB7CisgICAgcE92bFtpXSA9IHNwZWN0cnVtW2krKG5TcGVjLTEpKnRsXTsKKyAgfQorCisgIHJldHVybiBuclNhbXBsZXM7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL21pcHMvZmZ0X3JhZDJfbWlwcy5jcHAgYi9hYWMvbGliRkRLL3NyYy9taXBzL2ZmdF9yYWQyX21pcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2VlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliRkRLL3NyYy9taXBzL2ZmdF9yYWQyX21pcHMuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBkaXRfZmZ0IE1JUFMgYXNzZW1ibGVyIHJlcGxhY2VtZW50cy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChNSVBTX0RTUF9MSUIpCisKKyNpbmNsdWRlICJkc3BsaWJfdXRpbC5oIgorI2luY2x1ZGUgImRzcGxpYl9kc3AuaCIKKworI2RlZmluZSBGVU5DVElPTl9kaXRfZmZ0CisKKyNpZmRlZiBGVU5DVElPTl9kaXRfZmZ0CisKKyNpbmNsdWRlICJtaXBzX2ZmdF90d2lkZGxlcy5jcHAiCisKK3ZvaWQgZGl0X2ZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLCBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKQoreworICAgIGludCBpOworCisgICAgaW50MzJjICpkaW4gPSAoaW50MzJjKil4OworICAgIGludDMyYyAqZG91dCA9IChpbnQzMmMqKXg7CisKKyAgICBpbnQzMmMgc2NyYXRjaFsxMDI0XTsKKyAgICBpbnQzMmMgKnR3aWRkbGVzOworCisgICAgc3dpdGNoIChsZG4pIHsKKyAgICAgICAgICAgIGNhc2UgNDogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzE2OyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMzI7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl82NDsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzEyODsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjU2OyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6IHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzEwMjQ7IGJyZWFrOworICAgICAgICAgICAgLy9jYXNlIDExOiB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8yMDQ4OyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IEZES19BU1NFUlQoMCk7IGJyZWFrOworICAgIH0KKworICAgIG1pcHNfZmZ0MzIoZG91dCwgZGluLCB0d2lkZGxlcywgc2NyYXRjaCwgbGRuKTsKKworICAgIGZvcihpPTA7aTwoMTw8bGRuKTtpKyspIHsKKyAgICAgICAgeFsyKmldICAgPSBkb3V0W2ldLnJlPDwxOworICAgICAgICB4WzIqaSsxXSA9IGRvdXRbaV0uaW08PDE7CisgICAgfQorfQorI2VuZGlmCisKKworI2VuZGlmIC8qIGRlZmluZWQoTUlQU19EU1BfTElCKSAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvbWlwcy9taXBzX2ZmdF90d2lkZGxlcy5jcHAgYi9hYWMvbGliRkRLL3NyYy9taXBzL21pcHNfZmZ0X3R3aWRkbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVhMDliCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvbWlwcy9taXBzX2ZmdF90d2lkZGxlcy5jcHAKQEAgLTAsMCArMSw1NzkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xNltdID0KK3sKKygweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKQorfTsKKworc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMzJbXSA9Cit7CisoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLAorKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MzcwMDAwMDApLCAoMHgwMDAwODBBMyksCisoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCkKK307CisKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzY0W10gPQoreworKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwKKygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyNTI4MEMwNSksICgweDg1ODJGQThDKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksCisoMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLAorKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGRjdCMDAwMCksICgweDJFODA1MEYxKSwgKDB4MTAyMTQ0ODIpLCAoMHgxQkEwMDAwNSksICgweDAwMDBDMEZGKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApCit9OworCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMjhbXSA9Cit7CisoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLAorKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwKKygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksCisoMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLAorKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwKKygweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksCisoMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLAorKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKygweDAwMDAwMDAwKSwgKDB4QTQzNzAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgyRTgwNTBGMSksICgweDFBMjE0NDYyKSwgKDB4MDRENkQ1ODMpLCAoMHg0MDAzMTI4MiksICgweDY0NjlBNzM1KSwgKDB4MEI0Qzk5QTMpLCAoMHgwQUY4ODU5NCksICgweEY5MDk2OUQ3KSwgKDB4OTYxMzFDOTIpLCAoMHgwMjVFRUExMCksICgweDNBMUZFNDIxKSwgKDB4NjE0RkYzOTApLAorKDB4MUNGREMzMjcpLCAoMHhDMTc3RTA0RiksICgweEY0RDg3RTgyKSwgKDB4NzgyNTNGMzkpLCAoMHhCQjgzOUY5NCksICgweDk5OEIzRUIxKSwgKDB4MENCQ0MwMjEpLCAoMHg0MUJFQzg0MyksICgweEFDMEVFMTIxKSwgKDB4NTI3MTk2NDMpLCAoMHg5MDlBMkIxRCksICgweEYzODkzMUUxKSwgKDB4RjQxMzI3RkYpLCAoMHhGNjA5OTg0NyksICgweEE3MEQyMTlDKSwgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwKKygweDNGQUYzQTI0KSwgKDB4RTRCMkM0MjEpLCAoMHhCOTlEMTQ1MyksICgweDI3NDFFMjY0KSwgKDB4MjIzOTgxM0EpLCAoMHgyOTQ0REEyMCksICgweDQ0MUVGN0M0KSwgKDB4MEJEMEI3MjApLCAoMHhFRDg0RUEyNiksICgweDczRTBDMEQyKSwgKDB4Njc4RTMwMzkpLCAoMHgyMTQyMDEwOSksICgweDg2MDc0OTJFKSwgKDB4MjhDRUY0NDApLCAoMHgwMjI3NjhDOCksICgweEY2OEUzNjExKSwgKDB4ODRFODRENTUpLCAoMHg3MzAwNEMwNCksCisoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksICgweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksICgweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLAorKDB4QUIzNzM1RDMpLCAoMHgwMDAwMDA4MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKQorfTsKKworCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8yNTZbXSA9Cit7CisoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGNjIxODEpLCAoMHhGQ0RCRDU0MCksICgweDdGRDg4NzhDKSwgKDB4RjlCODI2ODEpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLAorKDB4N0NFM0NFQjApLCAoMHhFM0Y0N0Q5NSksICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksICgweDc5OEEyM0E4KSwgKDB4RDdEOTQ2QzMpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3NTA0RDM0QyksICgweENDMjEwRDhCKSwKKygweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MjU1MkM3OSksICgweEM2NzMyMkI5KSwgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OEE2OUU3MiksICgweEI2NEJFQUI5KSwgKDB4NjZDRjgxMDMpLCAoMHhCM0MwMUZFOSksCisoMHg2NEU4ODk0QSksICgweEIxNDAxNzhDKSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksICgweDYwRUMzODNBKSwgKDB4QUM2NEQ1MUYpLCAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NUNCNDIwQ0QpLCAoMHhBN0JEMjI5QSksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1ODQyREQ3RSksICgweEEzNEJERjRCKSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksICgweDUzOUIyQUZCKSwgKDB4OUYxM0M3REMpLAorKDB4NTEzM0NDOEYpLCAoMHg5RDBERkU1MiksICgweDRFQkZFODhGKSwgKDB4OUIxNzc2Q0IpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NDlCNDE1NjIpLCAoMHg5NzU5NjFBMiksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksICgweDNGMTc0OTlGKSwgKDB4OTBBMEZENDIpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwKKygweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwgKDB4MzNERUYyMUYpLCAoMHg4QUZCMkM4RSksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNTI4MEMwNSksICgweDg1ODJGQThDKSwgKDB4MjIyM0E0RDIpLCAoMHg4NEEyRkM2OCksCisoMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUMwQjgyNEUpLCAoMHg4MzFDMzE0QSksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MDk2QTkwQUIpLCAoMHg4MDU4Qzk1NSksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLAorKDB4MDMyNDJBRjYpLCAoMHg4MDA5REU4MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RjlCODI2RkIpLCAoMHg4MDI3Nzg2RSksICgweEY2OTU2Rjk5KSwgKDB4ODA1OEM5NTApLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQTFERUI0QSksICgweDgxRTI2QzJDKSwKKygweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFM0Y0N0RGNSksICgweDgzMUMzMTNCKSwgKDB4RTBFNjA2NTMpLCAoMHg4M0Q2MDQyMCksICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhEMUVFRjU4MSksICgweDg4OTNCMTMyKSwgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksCisoMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksICgweEM2NzMyMjY1KSwgKDB4OERBQUQzQjIpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCQjg1MzIwNSksICgweDkzREJENzBFKSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI2NEJFQUQ1KSwgKDB4OTc1OTYxN0IpLAorKDB4QjNDMDFGOUQpLCAoMHg5OTMwN0YzNSksICgweEIxNDAxODBDKSwgKDB4OUIxNzc2NTIpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUM2NEQ0RDgpLCAoMHg5RjEzQzgwMyksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLCAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweEEzNEJERUIyKSwgKDB4QTdCRDIzMjIpLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwKKygweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLCAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OUIxNzc2NDIpLCAoMHhCMTQwMTgyMCksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5NzU5NjE2QyksICgweEI2NEJFQUVBKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MjM1RjJGQyksICgweEJFMzFFMTg0KSwgKDB4OTBBMEZEMTQpLCAoMHhDMEU4QjZCMiksCisoMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OERBQUQzQTYpLCAoMHhDNjczMjI3QyksICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLAorKDB4ODRBMkZDNEYpLCAoMHhERERDNUI4OCksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHg4MDU4QzkzQiksICgweEY2OTU3MEIyKSwKKygweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHg4MDA5REU3RSksICgweEZDREJENTY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGMUZGN0EwMCksICgweEUyM0E4MDUwKSwgKDB4ODQxQTIxMTQpLCAoMHhDNTg4REE3NSksICgweDAyNDAwMTQzKSwgKDB4QUVENkFBRDcpLCAoMHg5NEMyNTQ1QiksICgweDNFNDYxNTZDKSwgKDB4MDVCRkRGMjcpLCAoMHhCMDgyMjA3NSksCisoMHhEMjRDN0JDNCksICgweDYyMTIyMDU0KSwgKDB4OENDNDFDNDkpLCAoMHgyQzQxNDk3MiksICgweDcxOEQ3QzVFKSwgKDB4REVFMkEzRDgpLCAoMHg0NTQ0QzEzNSksICgweDY0MjkyNTczKSwgKDB4NzZCNTFGOEEpLCAoMHg0QjdENjU1NyksICgweDg3MTY0OTA3KSwgKDB4RjU5REJGRUMpLCAoMHgwNENFRTlERSksICgweEI0QkM0QzkwKSwgKDB4OUFGQ0NEMzApLCAoMHg4QzdBMzE2RiksICgweDkwRkRBQ0E3KSwgKDB4NEUwRDYzODMpLAorKDB4QUVGMTZDMEIpLCAoMHgwNjIyMDIwQSksICgweDM3QjZBNzM4KSwgKDB4RkZCQjdENzEpLCAoMHg1RkVERDEyRiksICgweEVFNDdGREM4KSwgKDB4M0RDNzkxM0YpLCAoMHhFQUVFRjdGRCksICgweDIxOURBREVDKSwgKDB4RjlFNTNGNUYpLCAoMHhCM0Q4MkQ5RSksICgweEJCQjc5QkNCKSwgKDB4NDNBRDJBQUIpLCAoMHgwRTdBREJDMCksICgweEFCQkQwOTUyKSwgKDB4MUE2RUY0M0EpLCAoMHhDRDlCMkE5RCksICgweDcyMjJCMzY2KSwKKygweDk3OUU4OUU5KSwgKDB4MDJDOTExM0YpLCAoMHgxRDUxMTQ2NiksICgweDU3QTkyMjA2KSwgKDB4NEE0MTIwNzUpLCAoMHhGRDMxRDc4MyksICgweEE3NTQyRUZDKSwgKDB4MjRCNzY5NzUpLCAoMHhCOTk5NjJDNyksICgweDE5RjFEMzU2KSwgKDB4OUQxMkMzQ0IpLCAoMHg2RDM3RDU0MiksICgweDI5RTcyMTREKSwgKDB4ODkwMEY2NDUpLCAoMHhCMTU0QUQ0QSksICgweEYwNDdEOTg4KSwgKDB4M0YyRTVFNzcpLCAoMHhBRkI2OEM0OSksCisoMHhDOUYxOUU1MSksICgweDYxOTJGNTNBKSwgKDB4NUFFM0QwODApLCAoMHgxREE2QzY3NyksICgweEQ0ODVENTBDKSwgKDB4OUFBN0U4QjIpLCAoMHhGNTVFRTFENSksICgweEMwMEI2OTMyKSwgKDB4ODVBQ0U5MTIpLCAoMHg4MjA4QjFCOSksICgweDgwRTE0MTcwKSwgKDB4QTFENjdDM0YpLCAoMHgwNTgwMzVCMyksICgweEE0RkUzNkNBKSwgKDB4QkVFNTQ3RTQpLCAoMHhFRjI3NjA1MiksICgweDQyQUE0Mzg4KSwgKDB4OUMxMUEyRUQpLAorKDB4MTAyMDI1NDEpLCAoMHgyRDQ4MDkxMCksICgweEIwOUIxQUM0KSwgKDB4MTlFN0QxN0QpLCAoMHg1MjA4MjQ1MCksICgweDNFRUQxNzA1KSwgKDB4RjIwRkY4QTEpLCAoMHg4OUY2RTE3RiksICgweDE3RDdEQzAwKSwgKDB4MDlCOUYyQzMpLCAoMHg2Mzc4OTY4QyksICgweEFGMDYwN0Y2KSwgKDB4RkRGREUwQzkpLCAoMHgzQ0UzREZFRSksICgweDUxNjgyMjlFKSwgKDB4N0NGNzk3MzQpLCAoMHhGNUZGRjU2RiksICgweDMwNzAwMDkzKSwKKygweDEzNUY1Qzc1KSwgKDB4RTZENzNFRUUpLCAoMHg2RTQwMERGOSksICgweDU4MjUyQUNCKSwgKDB4NTU3MzExQ0EpLCAoMHg1NTM5QjMwMyksICgweDU2NTU3MzU1KSwgKDB4QjZCREFDRUYpLCAoMHg1OUY5NDI4RCksICgweDlBRTYzMDIwKSwgKDB4NTU4RkY3RTcpLCAoMHg3OTU1ODA2RCksICgweDA5RDU0OUYzKSwgKDB4NjAzQkY1QjcpLCAoMHgzMTM0NDEzQiksICgweEJDQTdDMUFBKSwgKDB4QTk4RDEzMzkpLCAoMHg1N0IyOUM5NyksCisoMHg1MEYxRkYwNyksICgweEU0QTEzOTgwKSwgKDB4RDA4ODFBMjEpLCAoMHhDMUZGRTMwQSksICgweEIwQTY2QzE5KSwgKDB4MTg0MTY0OTApLCAoMHgxNjBFMDIxNCksICgweEE1ODRDQkI1KSwgKDB4MDJBQUE4MkEpLCAoMHg3Mzk4MTM0MCksICgweDk2NEEyNERFKSwgKDB4NkU4MjlGQzQpLCAoMHhERkQ2MjM2MCksICgweDRDM0JGMTUyKSwgKDB4Mzg3MjE1NzQpLCAoMHhENDZCQzkxMiksICgweDFFQjdGREQ4KSwgKDB4MUNBNkNCQzApLAorKDB4QkJDQkMxMTEpLCAoMHhBNkZEMTQwMyksICgweDc2QzY4OEQ5KSwgKDB4QjQ3MTg2Q0IpLCAoMHg1RTk4OTM2RCksICgweDlCQkY3RTJFKSwgKDB4OEI3RkJDRUMpLCAoMHg5REFGN0VGNSksICgweDdFM0E3OUYxKSwgKDB4OUM4OTZBQ0QpLCAoMHg2MjhGMjQ5QSksICgweERENkU1MUFGKSwgKDB4QUY3Mzk5NEIpLCAoMHg1OTY2OTk1RCksICgweEI3NjIwNTk3KSwgKDB4MzY5QjFFNTQpLCAoMHg3Q0VEQzc4NyksICgweEU3QjE1QjFGKSwKKygweEIzNkY1RjdEKSwgKDB4QjVCNzNFRjYpLCAoMHhENzZFRUVFMiksICgweDE0RTg2MTg2KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLCAoMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLCAoMHgxMTc4MzcxOSksICgweDc3QkIxMEIwKSwgKDB4RkNERjgzNTApLCAoMHhEMzRBN0M2NSksICgweEVGNkU1N0JCKSwgKDB4RUNENTZDNjgpLCAoMHg4RUI3Q0EzNiksCisoMHgyRjI2QjEzNiksICgweDU1NjMxMjY5KSwgKDB4RUYxMjEzRTEpLCAoMHhBNTZBQjg0NCksICgweEFBNEIxRDY0KSwgKDB4NjQzNDFFQTkpLCAoMHgwQ0U5REI0OCksICgweDQ2MEMyMTQ0KSwgKDB4QURDNTAyMDUpLCAoMHg1MTVDNDcyRiksICgweDMwNEMyOUJEKSwgKDB4NzZBRjg3MTEpLCAoMHg1NTdDQURCNyksICgweDJBOUJCQzhFKSwgKDB4RTUwRTE0NUIpLCAoMHg5QzIwMzFGRCksICgweEQ5MTIxQThDKSwgKDB4RjUxQTk2RkQpLAorKDB4NDVDQ0JFQkYpLCAoMHg1Rjg4NDg3MSksICgweDY2REFFMjkxKSwgKDB4OTVBREM5RTUpLCAoMHgzM0NGMzA0RCksICgweDIzQzg3RENFKSwgKDB4QTcwMTRGQjMpLCAoMHhGQjM1MUU3MSksICgweDhENjBGNjZGKSwgKDB4QkZENkRERDUpLCAoMHgxNTFGRTZGMSksICgweERDQzc5MzVBKSwgKDB4MENBQ0ZCRjApLCAoMHhFRTU1QTM3MSksICgweEJFNDZCNzU1KSwgKDB4MEY3OURDRDIpLCAoMHgyM0RGRjc2RCksICgweDgzREU3NkQ3KSwKKygweDhCMEUzQUVFKSwgKDB4QjAxQkZCNDQpLCAoMHg0RTM2MTlGQSksICgweEExOUY5RTY0KSwgKDB4QkQ0OTJBRDkpLCAoMHgwODk5RTQ1RiksICgweDgxNTZFNDFEKSwgKDB4NURBNTM5QkEpLCAoMHgwQUYzNUIyQyksICgweERCODlCQUFFKSwgKDB4QTEyOEM5NjYpLCAoMHhBMDJDRUFFRSksICgweEM1QTFCMjkxKSwgKDB4MDhDQkE5M0UpLCAoMHg5MEZEODg3QSksICgweDYwMzA0Mzg2KSwgKDB4NkE1OUYxRUEpLCAoMHhBNDYxRTY3QiksCisoMHhDMTYyMkI3NiksICgweDZGQTJGOTA2KSwgKDB4QUEzQTQwMUEpLCAoMHhCNjhFQTQ3QiksICgweEM2MTdBODg5KSwgKDB4NjAyNEE1N0IpLCAoMHgyREQ1MzU1NSksICgweEYxRkZFQTMwKSwgKDB4ODEzQTgwNTApLCAoMHg4RDFBMjFCNCksICgweEZGRTcyQ0Y3KSwgKDB4QTM3NDE1RTEpLCAoMHgzMEEyQzgzMCksICgweEEzQTFDQTI4KSwgKDB4NEM1RTM1ODYpLCAoMHgzMDk4NjFCOSksICgweDFGNDk4NTBEKSwgKDB4NjE2NEM3NDgpLAorKDB4OUQ3MDQ4RTUpLCAoMHhDMTI0NTY5RSksICgweENDQjBFMTExKSwgKDB4MTVCMkJCODYpLCAoMHgxODM3MUQ5QyksICgweEIyQUJEOTREKSwgKDB4OEVDNjU2QjMpLCAoMHhCRjAxMDk5NSkKK307CisKKworCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTJbXSA9Cit7CisoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGRDg4NTkpLCAoMHhGRTZERTJFMCksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkU5Q0JCRSksICgweEZCNDlFNkEzKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGQzI1NTk1KSwgKDB4RjgyNkE0NjQpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y4NzJCRjIpLCAoMHhGNTA0OTgwMCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLAorKDB4N0YzODU3RjQpLCAoMHhGMUU0M0QxQyksICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RUQ1RTVDNiksICgweEVFQzYwRjNDKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdFNUZFNDkwKSwgKDB4RUJBQTg5NDQpLCAoMHg3RTFEOTNFQSksICgweEVBMURFQkM2KSwgKDB4N0RENjY2OEQpLCAoMHhFODkyMjYyMSksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3RDM5ODBFRCksICgweEU1N0Q1RkU0KSwKKygweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Qzg5NEJEQSksICgweEUyNkNCMDEwKSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksCisoMHg3OTA5QTkzNSksICgweEQ2NUMzQjk4KSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLCAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4NzZEOTQ5ODMpLCAoMHhEMDc4QUQ5MyksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0NUY5REQzKSwgKDB4Q0FCMjZGQjIpLAorKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDczMDdDM0M5KSwgKDB4QzdEQjZDNDUpLCAoMHg3MjU1MkM3OSksICgweEM2NzMyMkI5KSwgKDB4NzE5RTJDREUpLCAoMHhDNTBEMTE2NCksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg3MDIzMTA5QyksICgweEMyNDdDRDYyKSwgKDB4NkY1RjAyQ0YpLCAoMHhDMEU4QjY3RSksICgweDZFOTZBOTk1KSwgKDB4QkY4QzBERDgpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwKKygweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkI0QUYyNTgpLCAoMHhCQTMyQ0E0MiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OThDMjQ4NyksICgweEI3OTYxOUM2KSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY3QkQwRkNDKSwgKDB4QjUwNDkzODApLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksCisoMHg2NEU4ODk0QSksICgweEIxNDAxNzhDKSwgKDB4NjNFRjMyODYpLCAoMHhCMDA0OUFBOSksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MUYxMDAyNyksICgweEFEOTZFRDc3KSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksICgweDVGRTNCMzY2KSwgKDB4QUIzNUY1OEMpLCAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLAorKDB4NUI5RDExNjYpLCAoMHhBNjlCOUI3RCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1OTY0NjQ5QiksICgweEE0NjJFRUIyKSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU3MURFRUVEKSwgKDB4QTIzODYyN0IpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksICgweDUzOUIyQUZCKSwgKDB4OUYxM0M3REMpLCAoMHg1MjY5MTI0MSksICgweDlFMEVGRjlEKSwKKygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksCisoMHg0NUNEMzU2RiksICgweDk0QjUwRDc0KSwgKDB4NDQ3QUNENUQpLCAoMHg5M0RCRDZBQSksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4NDA3M0YyNDUpLCAoMHg5MTY5NTY3RCksICgweDNGMTc0OTlGKSwgKDB4OTBBMEZENDIpLCAoMHgzREI4MzI0QyksICgweDhGRENFRjM3KSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNBRjJFRUJBKSwgKDB4OEU2MUQzMzEpLAorKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM4MjQ5NDEzKSwgKDB4OENGODNDNjIpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwgKDB4MzU0RDkwMzMpLCAoMHg4QkEwNjIyMSksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLCAoMHgzMjZFNTUwNSksICgweDhBNUE3QTREKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDJGODc1MjE2KSwgKDB4ODkyNkI2NUEpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwKKygweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDIzQTY4OEQzKSwgKDB4ODUxMDlDRjcpLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksCisoMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxQTgyOUZDMCksICgweDgyQzY3RjAwKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDE3NkREOUUxKSwgKDB4ODIyOTk5NzQpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLAorKDB4MTEzOUYwQTcpLCAoMHg4MTJBMUEzNiksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwRTFCQzMyNiksICgweDgwQzdBODEzKSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDBBRkI2N0IyKSwgKDB4ODA3OEQ0MDcpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwgKDB4MDdEOTVCQjYpLCAoMHg4MDNEQUE2RCksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLCAoMHgwNEI2MThERiksICgweDgwMTYzNDNEKSwKKygweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMTkyMUQwQyksICgweDgwMDI3N0E3KSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksCisoMHhGNTA0OTc5MyksICgweDgwNzhENDE4KSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQkFBODkyNyksICgweDgxQTAxQjc1KSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksICgweEU4OTIyNjYyKSwgKDB4ODIyOTk5NjcpLAorKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEU1N0Q1Rjg5KSwgKDB4ODJDNjdGMjcpLCAoMHhFM0Y0N0RGNSksICgweDgzMUMzMTNCKSwgKDB4RTI2Q0IwMzEpLCAoMHg4Mzc2QjQxRSksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhERjYwOEY2OSksICgweDg0M0ExRDkyKSwgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweERDNTk3NzZFKSwgKDB4ODUxMDlDRTQpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwKKygweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhEMzY3MDQ2RiksICgweDg4MDU0NjZBKSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQwNzhBRDNDKSwgKDB4ODkyNkI2QTApLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksCisoMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwgKDB4Q0FCMjcwMEIpLCAoMHg4QkEwNjIwNCksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDN0RCNkMyQSksICgweDhDRjgzQzQ0KSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEM1MEQxMDlGKSwgKDB4OEU2MUQzODgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLAorKDB4QkY4QzBERjYpLCAoMHg5MTY5NTY1QSksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCQ0RBM0U1RSksICgweDkzMDZDQjQ5KSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksICgweEJBMzJDQjM1KSwgKDB4OTRCNTBEMDkpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4Qjc5NjE5RTIpLCAoMHg5NjczREI2NiksICgweEI2NEJFQUQ1KSwgKDB4OTc1OTYxN0IpLCAoMHhCNTA0OTMzNCksICgweDk4NDJGMDZCKSwKKygweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMjdFOUM5MiksICgweDlBMjIwNEIwKSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksCisoMHhBOEUyMTFBMiksICgweEEyMzg2MUY1KSwgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTQ2MkVFNzApLCAoMHhBNjlCOUJBOCksICgweEEzNEJERUIyKSwgKDB4QTdCRDIzMjIpLCAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwMUM0Q0M3KSwgKDB4QUIzNUY1NTkpLAorKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksICgweDlFMEVGRkIzKSwgKDB4QUQ5NkVEQTUpLCAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OUMxMENEMDUpLCAoMHhCMDA0OUIzQiksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLCAoMHg5QTIyMDRBMSksICgweEIyN0U5Q0E2KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk4NDJGMDVDKSwgKDB4QjUwNDkzNDkpLCAoMHg5NzU5NjE2QyksICgweEI2NEJFQUVBKSwKKygweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MzA2Q0IzQyksICgweEJDREEzRTc0KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkxNjk1NjREKSwgKDB4QkY4QzBFMEMpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksCisoMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OEU2MUQzN0MpLCAoMHhDNTBEMTBCNiksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4Q0Y4M0MzOSksICgweEM3REI2QzQxKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhCQTA2MUY5KSwgKDB4Q0FCMjcwMjIpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLAorKDB4ODkyNkI2OTcpLCAoMHhEMDc4QUQ1MyksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4ODA1NDY2MSksICgweEQzNjcwNDg3KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg2RjY1NjhFKSwgKDB4RDY1QzNDNEEpLCAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODVGQTExODApLCAoMHhEOTU3RERGMSksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLCAoMHg4NTEwOUNERCksICgweERDNTk3Nzg3KSwKKygweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MjI5OTk2MiksICgweEU4OTIyNjdDKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksCisoMHg4MUEwMUI0OCksICgweEVCQUE4QTNEKSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLCAoMHg4MEY2NkU0NCksICgweEYwNTREOEE2KSwgKDB4ODBDN0E4MDkpLCAoMHhGMUU0M0QzOCksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHg4MDc4RDNGRiksICgweEY1MDQ5OEFCKSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwM0RBQTc3KSwgKDB4RjgyNkEzQTgpLAorKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDgwMTYzNDQzKSwgKDB4RkI0OUU2N0YpLCAoMHg4MDA5REU3RSksICgweEZDREJENTY4KSwgKDB4ODAwMjc3QTYpLCAoMHhGRTZERTM1MiksICgweDQ2NTIyMEJCKSwgKDB4QzY2RTFGRkMpLCAoMHgyQzYxRDM1NiksICgweEFGRkIxNzZEKSwgKDB4ODgwNjdFMjMpLCAoMHgzNzk2RjAwOCksICgweEM4RDEyOEYzKSwgKDB4QjY2MUE1RkEpLCAoMHhGMTlDRTRGMCksICgweDNGN0QwMzQ1KSwKKygweEU5N0U2MDMwKSwgKDB4NEFCQTkxQ0YpLCAoMHhERUVEQUIwQyksICgweDM1RkQxRDc3KSwgKDB4REQ2MzY0MzkpLCAoMHgyRjhCNzk0QyksICgweDc2NEUxRDMyKSwgKDB4N0E4RDBCMUIpLCAoMHg4RUFDQjI3RiksICgweDU3N0FENjdCKSwgKDB4MkIzRkUyQzUpLCAoMHg4QUNEMDI0QSksICgweEVERjVDNDJDKSwgKDB4RjFDQTk1MUMpLCAoMHhCOThCNkQwNCksICgweDZEMTJCODY0KSwgKDB4NTBFNzREMDgpLCAoMHg3M0QxNTAzQiksCisoMHhDN0QzRjZBOSksICgweDFGMzY1RTk3KSwgKDB4RTEzNDBFNTkpLCAoMHg4OUQyMUI5RCksICgweDlCNzU2NzMzKSwgKDB4OTAyNENENTApLCAoMHhFMkM3RkY1MiksICgweEQ5RjA2MUVGKSwgKDB4NzcxNTEzOTIpLCAoMHhBMEU0QTAwNCksICgweDYwQkU4MjBGKSwgKDB4Qzc2MDNCQUYpLCAoMHhBNjJFM0RBOSksICgweEE0MDBFMTFGKSwgKDB4MTU1MTExRDQpLCAoMHg5MDMwQTM3NCksICgweDE0MTg1MTI0KSwgKDB4OEQwNDNBMDApLAorKDB4NTA5NDUyNTgpLCAoMHgyMEE2NjUzRSksICgweEExOUJBOEI5KSwgKDB4M0NGQkU2OTIpLCAoMHg5MTQ3MUQ5OCksICgweDBCOUQwM0ZGKSwgKDB4QTVCQThFMjkpLCAoMHhGRkM4RUIyMiksICgweDE0MkNCMUIwKSwgKDB4NTUzMTczMTkpLCAoMHgzM0FEQzc3QyksICgweEY2OUJBRENFKSwgKDB4Nzg0MjNEM0MpLCAoMHhCRTY3QkJGMCksICgweDdEODhCRDE1KSwgKDB4MUU5RUY2NzMpLCAoMHg1MTIwOThCMyksICgweDMyNkEzRDNEKSwKKygweDE2MUVGM0I2KSwgKDB4MEU0QzRFRDUpLCAoMHg0RTlGOTk4MiksICgweEQwQUI2QTM2KSwgKDB4RjE3REQzNzcpLCAoMHg1RTUzRjMxQyksICgweEJFOTExMkVBKSwgKDB4M0RFMUIwRkYpLCAoMHhEN0YzOUFFNyksICgweEEzNEI5NjM1KSwgKDB4NDlDRkVFNkMpLCAoMHg4QTA2M0FDNiksICgweEJBNzlCQzBEKSwgKDB4NkE1ODg3ODIpLCAoMHg0MzlCRTU5MyksICgweDBBNUY3RThEKSwgKDB4RDJGQzI1NjEpLCAoMHg0Njk4QUM4RiksCisoMHgyNDdDM0JDMiksICgweDU4MjY1MjNEKSwgKDB4NEQyQkQ3NTMpLCAoMHg0QjhCQ0MxNyksICgweDlCNzQzNTAzKSwgKDB4OUY4NEU0MzQpLCAoMHg4Qjk3QjQxQSksICgweDNDRkNFNzVGKSwgKDB4MzJEMkQ0ODcpLCAoMHgzRTgwQjRBRiksICgweDQyRjhCMEVBKSwgKDB4RUMwQzgxRUUpLCAoMHgxNzI3OTMwOSksICgweDY4MUZBMEYzKSwgKDB4OEJBRDIwOEUpLCAoMHhEMTE3OTJDNiksICgweEYxRkYwN0IzKSwgKDB4MjEzMzgwNTApLAorKDB4OEExQTIxQTQpLCAoMHhGRjAzNThEOCksICgweDQxNkMxM0MxKSwgKDB4NDYzNDg4NTgpLCAoMHg4MzgyMDUxOSksICgweEFCQzA4ODIyKSwgKDB4NkExQTUyMDApLCAoMHgwQzgzMTIyQSksICgweEE2N0ZERjA2KSwgKDB4MDYyOUY5NzApLCAoMHhFRkFBMjc0MyksICgweDBDMDBBRDk1KSwgKDB4RkYwOUY1Q0YpLCAoMHhDNzg0REI4QiksICgweENCMDBCQTdEKSwgKDB4NjIyMDkwOUYpLCAoMHg3MTQ5QjdERiksICgweDVCRDNFQkVDKSwKKygweDA0ODVFRjcxKSwgKDB4MDdGRTIzQjEpLCAoMHg4MDczNzY2OCksICgweDQyQTMyNjQ1KSwgKDB4RDZFREJCMTgpLCAoMHg0MDdFNzJDNSksICgweDkwMTQwMkUwKSwgKDB4MEMxQjc5MDUpLCAoMHgwMUNFMTFGQyksICgweDAwQzY0OTE0KSwgKDB4MzAzNzk3OEEpLCAoMHhGQUJDOTE5MCksICgweDQzQTBBQzg5KSwgKDB4Qjk5OTgzNzApLCAoMHhENkQ2OTIwOSksICgweEYxMzI0NTVFKSwgKDB4OURBRkY0ODIpLCAoMHhBMkQ2MzVDMiksCisoMHhCRDk3NkI1RSksICgweDc5RUQ5M0VEKSwgKDB4N0Q0MkNBMjIpLCAoMHgyRTIzRjlDMSksICgweENGMEU3NTIxKSwgKDB4OTZEODhBQzEpLCAoMHg0MjBDMjg0NSksICgweDFFMTk1NzNEKSwgKDB4RjhGRTkyNzkpLCAoMHhDMTQ5NTEwMCksICgweDIwMTI0OUMyKSwgKDB4OEIxODM3MjMpLCAoMHg0NTA2MTVBNSksICgweDAwNEMwMTEyKSwgKDB4ODVFQjUyMzUpLCAoMHgxQkQ4QkQ0OCksICgweEEyOTE0RjAzKSwgKDB4NTE0MjBFQUMpLAorKDB4Q0U3ODg0NzApLCAoMHgwNTA4MDMwQiksICgweEE0Q0QyQTZDKSwgKDB4OTYyNkMwNjIpLCAoMHhGODhEMkRFNSksICgweEE5RDZCMzk5KSwgKDB4QjNDNTdCRkQpLCAoMHhDQjFFOUM0QyksICgweDAwNEE1MDk0KSwgKDB4RDBDQkM0MkEpLCAoMHgzQkUxQTY5NCksICgweDNDMzUzRkE3KSwgKDB4QTU2OTdDNTcpLCAoMHhGRTk2MTY2NSksICgweEVENkI3QzdEKSwgKDB4NDMzRENGOEQpLCAoMHhEQTdENkMyNCksICgweDQwNzExMkMxKSwKKygweDRCOUQyODVEKSwgKDB4NkM5QTJGNTcpLCAoMHgxQkY5RkFFRiksICgweDRFRTNFMkU5KSwgKDB4RTVBRTdFOTIpLCAoMHg2MEExMUQzRiksICgweDRCNDQxQjYzKSwgKDB4Qzg0MTlCQjEpLCAoMHgyQzRGNkRERCksICgweENFQzNDRjZEKSwgKDB4MzI1QTY1Q0EpLCAoMHg4MThGQzZBNCksICgweEM1NUU1RTVCKSwgKDB4Mjc3NDQ1QTMpLCAoMHg2QjMyODlGNyksICgweDA5MTQ3RDU1KSwgKDB4NEYzNzhENTMpLCAoMHg1ODhCMERDOCksCisoMHhGNzBCQTM0NyksICgweENCQzQzRkFFKSwgKDB4RDk4RTY2MzkpLCAoMHgwN0FGOUVEMCksICgweEUyRTYzMDVBKSwgKDB4NUUwMDM1NzEpLCAoMHgxODUyM0U3QSksICgweEY3MEQxRTI3KSwgKDB4RDcyODg5NTApLCAoMHgxMkMxMTEzMiksICgweEZGMUM5RDE3KSwgKDB4MzE4MDUwRjEpLCAoMHgxQTIxOTgyMSksICgweEJGMjE5OThBKSwgKDB4NkMxM0MxRkYpLCAoMHg4QzYwNTg2MSksICgweDBBMTgzOTU0KSwgKDB4N0JFNEMxQjYpLAorKDB4QTJDQkM0MTApLCAoMHg3Q0MwMEE1NSksICgweDVFNThBOTczKSwgKDB4MTEyMkVGODYpLCAoMHg4MDU2OEUzOSksICgweDIzMTBDMzAwKSwgKDB4MEUxNTJEMEUpLCAoMHg5RTAxN0MxQyksICgweDg1MURGQzI2KSwgKDB4RDFCMUU2NjIpLCAoMHg4MUJBMTBCMCksICgweDk2QzJFOTc3KSwgKDB4ODY4OEU0MTkpLCAoMHg5N0M5NDk4OSksICgweDI1MEQ1MzVFKSwgKDB4MzVGREU3MzIpLCAoMHgxNDdBRDE4MyksICgweENGOUQ3NUMwKSwKKygweDZCMkMxODNDKSwgKDB4MUQzMjY0ODkpLCAoMHhDMDgwN0Q5OCksICgweEMwODE2MjJFKSwgKDB4MTVDODdCODcpLCAoMHg3NDA0NTk4QyksICgweEZDM0M3RkE2KSwgKDB4MjhCQThDRjUpLCAoMHhFMzExRUE5QiksICgweEVBQkZENEE1KSwgKDB4ODc2ODgzNEEpLCAoMHgwRjdENzQ0MCksICgweDQwNTkzMTUyKSwgKDB4Q0YxRThCRjUpLCAoMHhFMzIwMTdCNiksICgweDM5RTY2MDcwKSwgKDB4NTYwRUNFOUQpLCAoMHhGNDEzMkM3NyksCisoMHg3MjI5NDVDMSksICgweDk2RUNCNUQ1KSwgKDB4MEMxMDBDMDYpLCAoMHgzMEU5NkMwMiksICgweEUwQjAxNTlCKSwgKDB4MTYzQTQwQ0IpLCAoMHgxQjI4Qjc1MCksICgweDExNDIwRTExKSwgKDB4MzREQzU5ODEpLCAoMHhEMjc2OUMzQyksICgweDU2OTQwMkQwKSwgKDB4RTRGMTU3QzApLCAoMHgxMjBERjI0QyksICgweDQwRDg2MTUzKSwgKDB4MTk0MkNEMTEpLCAoMHgyMjQ4NEMzQiksICgweDhCMjk5MTQ0KSwgKDB4NThGMUFBRjgpLAorKDB4QjJDRDQ3NzcpLCAoMHg0QTUzQUIwMiksICgweDU1QTVEQUQ0KSwgKDB4QzhENThENzkpLCAoMHg2Q0FFQzAxMSksICgweDFDOTU1Qzg0KSwgKDB4REUwOEE2QzYpLCAoMHhENDAyQUY3RCksICgweDY5NUU2RkE0KSwgKDB4NERBODYzQjkpLCAoMHg1MTE4MDcwQyksICgweDVBOTdFRjFDKSwgKDB4ODg4MEIzODgpLCAoMHg0RDU5NkIyRCksICgweDM3RDc0RENGKSwgKDB4NTgxMzhCMzgpLCAoMHg1QjdCQ0Q0RSksICgweEFFNkM0NDIyKSwKKygweDRFNUQxQUYxKSwgKDB4REU3Mzk2QTUpLCAoMHhCNDQyRjIxNyksICgweDBERjdBMDA2KSwgKDB4OTZFRUY4QTIpLCAoMHhFMjg0N0IyNiksICgweDY4QjlGNjdCKSwgKDB4OEZFMUZBNjUpLCAoMHhFMEE4N0U1NiksICgweDFCRThGQzRDKSwgKDB4QkJENjVGOUQpLCAoMHhFNkYwMkM5RCksICgweDg2N0M2RUVDKSwgKDB4NDNGQUI3MjUpLCAoMHhBNDE0NDQxOSksICgweDY5QkI2QUFGKSwgKDB4Q0UyN0I3NDQpLCAoMHgwMjIyNDFBOSksCisoMHhDMDVERjE0RSksICgweDgwNTBGMUZGKSwgKDB4MjE4QzIxMzEpLCAoMHhCRTI1OTQxQSksICgweDkwNDFDRDA2KSwgKDB4MUVFOEE5QzApLCAoMHhENTMwRkVERCksICgweDc0OTVDODA4KSwgKDB4MDUwOTE4QTYpLCAoMHgzQ0U3MzJFOSksICgweEY4NzI2MkZDKSwgKDB4MDFCODEyRjEpLCAoMHgxRkJBNDg0MiksICgweDNFODZDN0YyKSwgKDB4MjcwREIzNTgpLCAoMHhGOUQyMjgzNCksICgweDc0RDRGNDY5KSwgKDB4OUE2RTg3RDIpLAorKDB4OENCQjBBNTApLCAoMHhDMDc4NEI5MiksICgweDI3OERBNTgxKSwgKDB4OTIyMUE3RDUpLCAoMHhERTgwMUI1NCksICgweDRCNTMxRkRBKSwgKDB4QzhCOTFGOTEpLCAoMHg3QTkwREE0MCksICgweDI5NjdBNDI5KSwgKDB4NTBDQzFEOEQpLCAoMHg5QUU5MTEwRSksICgweDUwRjI1MEVFKSwgKDB4RDY5NUIwNzIpLCAoMHhGQzdBNTcxOCksICgweDFGMUEyNkU2KSwgKDB4N0Q1QURENEQpLCAoMHhDODk3ODU5NyksICgweEVCMzI2REMzKSwKKygweDM4NEU5ODI0KSwgKDB4QzNCOUQ3OEMpLCAoMHhEOEQyRTIxNCksICgweEVGRkJCMDQ4KSwgKDB4MDBBQjc3MTQpLCAoMHg5RDg5Q0ExMyksICgweEY3MDY4OEQwKSwgKDB4QUREQTNBMzcpLCAoMHg1RkJFNTk0MyksICgweDRFRDlENjEzKSwgKDB4OEE5RENDOTMpLCAoMHgxOTgxNDIzNiksICgweDA5QTY4QkNDKSwgKDB4Q0VBQzMzQUMpLCAoMHgwQkE3MEJCMyksICgweDMyNjI3MkUxKSwgKDB4MkE4QzZEMjApLCAoMHgyMzA4M0QwQiksCisoMHhGQTgwOUMwMiksICgweDU4MjVDNkMyKSwgKDB4MDYxQjQ2OTUpLCAoMHg4REI5Nzc0OCksICgweDUwNzFFNTg0KSwgKDB4MDg3NjA5NTkpLCAoMHg0NEVBOEQwNCksICgweDVDRTZFMkFBKSwgKDB4MDA5QUQxNzYpLCAoMHhBRUM2NEYxOSksICgweENBRERBNjMyKSwgKDB4OEQ3OTU0NDUpLCAoMHgxNkUzRUEyNCksICgweEYxMjY0OENBKSwgKDB4RDVDQzM1MEMpLCAoMHg2MTVFQkFENyksICgweDRFNzY5RkI2KSwgKDB4NkM1RUIzODApLAorKDB4NUJCNDY0MjUpLCAoMHhFQUI2Qzc3QyksICgweDEwOTQ1NDA4KSwgKDB4QzEyOTFCODYpLCAoMHg5MTNCNzFBNSksICgweDAwM0JBMzI5KSwgKDB4OTE4MTI4NTQpLCAoMHhFMjAwQ0IxMiksICgweDdBNDY5NkE4KSwgKDB4NzZFNTVEMjUpLCAoMHhENkQzQzU3NyksICgweDhCMUI3OUIxKSwgKDB4Mjk2QjA0Q0QpLCAoMHhBMDI0Q0MzNSksICgweDMzNDFBNDc3KSwgKDB4OEVDMTIzNTgpLCAoMHhGNTk4MkIyRiksICgweDM2RjEyMEM5KSwKKygweDc5REJFNzk5KSwgKDB4RUQ3NEYwOTIpLCAoMHhBMTAzMUFFMyksICgweEIyRDk4QzZCKSwgKDB4MzU4Q0FCNzMpLCAoMHg0MTE1M0MxOSksICgweDQ3NEQ0NTQ4KSwgKDB4QTdFODM0QTkpLCAoMHg5OTk3MzhBRSksICgweDUwRjFGRkU4KSwgKDB4ODg2MTJGODApLCAoMHhGRDkzMUEyMSksICgweDIzODM5QUJEKSwgKDB4QkU2MDQ3MDEpLCAoMHg4MTIyNzRCOSksICgweDRDQTlFQTMyKSwgKDB4RTVGMkQyMDcpLCAoMHhDMUNGNDY1MyksCisoMHg0MzU2MUIyMyksICgweDUzQjJFMjc3KSwgKDB4NEYyQjAwRUMpLCAoMHhGMkIzQkE4MCksICgweEZDNzA4Q0M1KSwgKDB4RTdGNjNGMDApLCAoMHgyNjEyMDM0MiksICgweDFBNDlDN0E4KSwgKDB4QTkzNTBBN0MpLCAoMHhFNTMwQTA2QyksICgweDVDQjlFNTUwKSwgKDB4QjE2NzI5MTMpLCAoMHg2NUZBNzZGOSksICgweEM5RjkyRENBKSwgKDB4N0Q0RTkxOTUpLCAoMHg0REJCODI2NSksICgweDIwMzZFMjZDKSwgKDB4RURDMDI2RTYpLAorKDB4QjlBNjE3RTApLCAoMHg2NDY5RjBFRSksICgweEU5REFBQkIyKSwgKDB4MjYwNjMyMTApLCAoMHhBQzU0NURGNCksICgweDEzNEUwMzVBKSwgKDB4MjE2RURFMTApLCAoMHhFQzgxMTU4RCksICgweDEyMkEyQ0FFKSwgKDB4QTI2M0QwRTEpLCAoMHg2Q0ExRkIyOCksICgweEJFMjg3REYwKSwgKDB4NTQ4MTA0RTgpLCAoMHgzNTk4N0Q5MyksICgweEJDM0U1NDlDKSwgKDB4M0FDRUZENjQpLCAoMHgzMzQ4Q0Q5MiksICgweDkxNDQ3MkZEKSwKKygweDgwRjI4MDk4KSwgKDB4REYzRkFCQ0QpLCAoMHgyNEQ4NDBBQyksICgweEJBOTUzMjFDKSwgKDB4REMyMTFEMjApLCAoMHgxNTA0MTk0MiksICgweDYxODU4QUJEKSwgKDB4NTQ2MDg0QTEpLCAoMHhDRURDMDdGNCksICgweEVBQjJERTAwKSwgKDB4MDQ1QkMxRTgpLCAoMHg4MkIyQUU4NiksICgweEU0QkYyODIzKSwgKDB4OUEwMUI0N0EpLCAoMHgxNzY5NDM4RSksICgweDAxNUM3OTg2KSwgKDB4NUZERkY5N0QpLCAoMHg1RjI4RDYyQyksCisoMHg4M0M4NEM4QyksICgweERCQUM2MDFBKSwgKDB4MUFFMjg0NEYpLCAoMHg3OUY5REMxQyksICgweDAxQzNBQjVDKSwgKDB4Qzk3MUQ4MzkpLCAoMHg0NERFQTM5OCksICgweEMwQTY0RUExKSwgKDB4Mzg3RTI0QTUpLCAoMHgwNjAwRDU5RiksICgweDUxNjlCMzcxKSwgKDB4RUM3ODJCNkIpLCAoMHhGN0ZGNzY5RCksICgweDMxN0IwQUU4KSwgKDB4RTMzODQ2QzcpLCAoMHgyRkUwNTg0OSksICgweDAzMjczODUzKSwgKDB4MkVEMjdBODgpLAorKDB4MjRERjQzNDMpLCAoMHhGQjAzQzcwRiksICgweDgyNzgzMjMxKSwgKDB4RDMxQzBEMjkpLCAoMHhBREM1QkQ4QiksICgweDdEMDI0RjFCKSwgKDB4OTFDMThEMTkpLCAoMHhBOEVFNThFMiksICgweDRDMjNBNTlGKSwgKDB4QzYxRENBOUYpLCAoMHgwM0JDOTFFQyksICgweDUxOTg2MTQ3KSwgKDB4MDVCOEJFMjQpLCAoMHg4NzJBQzkxOCksICgweDgwNTBGMUZGKSwgKDB4MjE4NDgxMkYpLCAoMHhCMjBEOTQxQSksICgweDkxNDFDQjBDKSwKKygweEY2MDBBMzQwKSwgKDB4ODBFODJBQzIpLCAoMHg2NjAyODYzMSksICgweDEyMEZGQTQ1KSwgKDB4ODg5RjI0Q0IpLCAoMHg4MUYwQkIyNyksICgweDMxMDBENTFBKSwgKDB4MjMwOUEwQjMpLCAoMHhBRTAwNDcxOCksICgweEFBNTg0QThEKSwgKDB4OTQzMkREMkUpLCAoMHhERDBFOTNGQSksICgweEMxMjk5M0E2KSwgKDB4NkUyODAzNUQpLCAoMHg5QkY3NzcyQiksICgweDFENjA4QzMyKQorfTsKKworCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMDI0W10gPQoreworKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRkY2MjE1KSwgKDB4RkYzNkYwNzgpLCAoMHg3RkZEODg1OSksICgweEZFNkRFMkUwKSwgKDB4N0ZGQTcyRDApLCAoMHhGREE0RDkyOSksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkYwOTQ3NiksICgweEZDMTJEOTFCKSwgKDB4N0ZFOUNCQkUpLCAoMHhGQjQ5RTZBMyksICgweDdGRTFDNzZBKSwgKDB4RkE4MEZGQ0UpLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwKKygweDdGQ0UwQzNEKSwgKDB4RjhFRjVDQkMpLCAoMHg3RkMyNTU5NSksICgweEY4MjZBNDY0KSwgKDB4N0ZCNTYzQjIpLCAoMHhGNzVERkY2QiksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3Rjk3Q0VCQiksICgweEY1Q0NGNzNFKSwgKDB4N0Y4NzJCRjIpLCAoMHhGNTA0OTgwMCksICgweDdGNzU0RTdFKSwgKDB4RjQzQzUzQ0IpLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0Y0REU0NTApLCAoMHhGMkFDMjQ3MyksCisoMHg3RjM4NTdGNCksICgweEYxRTQzRDFDKSwgKDB4N0YyMTkxQjIpLCAoMHhGMTFDNzg5NSksICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RUYwNTg2MCksICgweEVGOEQ1RkM4KSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksICgweDdFQkEzQTM4KSwgKDB4RURGRUU5MzApLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0U3RjM5NTQpLCAoMHhFQzcxMjQ0QSksICgweDdFNUZFNDkwKSwgKDB4RUJBQTg5NDQpLAorKDB4N0UzRjU4MDApLCAoMHhFQUU0MjA4QSksICgweDdFMUQ5M0VBKSwgKDB4RUExREVCQzYpLCAoMHg3REZBOThBNyksICgweEU5NTdFRDAwKSwgKDB4N0RENjY2OEQpLCAoMHhFODkyMjYyMSksICgweDdEQjBGREY1KSwgKDB4RTdDQzk5MTIpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0Q2MjhBQzcpLCAoMHhFNjQyMzQxQyksICgweDdEMzk4MEVEKSwgKDB4RTU3RDVGRTQpLCAoMHg3RDBGNDIxNyksICgweEU0QjhDRDE2KSwKKygweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Q0I3MjcyMSksICgweEUzMzA3MzQ3KSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksICgweDdDNUEzRDUyKSwgKDB4RTFBOTM1RjEpLCAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0JGODg4MzApLCAoMHhFMDIzMjNFQSksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QjkyMEI4NiksICgweERFOUU0QzVCKSwgKDB4N0I1RDAzQTEpLCAoMHhERERDNUI0RiksCisoMHg3QjI2Q0I0OSksICgweEREMUFCRTQxKSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBQjZDQjlBKSwgKDB4REI5ODg4OEUpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4N0E0MjEwREUpLCAoMHhEQTE3QkE2MyksICgweDdBMDVFRUE4KSwgKDB4RDk1N0RFNkYpLCAoMHg3OUM4OUY3MSksICgweEQ4OTg2MjFBKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc5NEE3QzExKSwgKDB4RDcxQThFQkEpLAorKDB4NzkwOUE5MzUpLCAoMHhENjVDM0I5OCksICgweDc4QzdBQjlFKSwgKDB4RDU5RTRFRjkpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzg0MDMzMjEpLCAoMHhENDIzQjE4MSksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLCAoMHg3N0I0MTdENCksICgweEQyQUFDNEVCKSwgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc3MjM1RjM1KSwgKDB4RDEzMzk3RkEpLCAoMHg3NkQ5NDk4MyksICgweEQwNzhBRDkzKSwKKygweDc2OEUwRUE5KSwgKDB4Q0ZCRTM4QUQpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzVGNDJDMEIpLCAoMHhDRTRBQjVBNiksICgweDc1QTU4NUQ5KSwgKDB4Q0Q5MUFCNTUpLCAoMHg3NTU1QkQ0NyksICgweENDRDkxRDM3KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0QjJDODdCKSwgKDB4Q0I2OTdEQTApLCAoMHg3NDVGOUREMyksICgweENBQjI2RkIyKSwgKDB4NzQwQjUzRUQpLCAoMHhDOUZCRTUwRSksCisoMHg3M0I1RUJDRiksICgweEM5NDVERkVCKSwgKDB4NzM1RjY2MkYpLCAoMHhDODkwNjFEMSksICgweDczMDdDM0M5KSwgKDB4QzdEQjZDNDUpLCAoMHg3MkFGMDVBQiksICgweEM3MjcwMTdBKSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksICgweDcxRkEzOTQ4KSwgKDB4QzVCRkQyMzIpLCAoMHg3MTlFMkNERSksICgweEM1MEQxMTY0KSwgKDB4NzE0MTA4MDApLCAoMHhDNDVBRTFEMSksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLAorKDB4NzA4Mzc4RjQpLCAoMHhDMkY4M0UxQiksICgweDcwMjMxMDlDKSwgKDB4QzI0N0NENjIpLCAoMHg2RkMxOTM3NiksICgweEMxOTdGNEJCKSwgKDB4NkY1RjAyQ0YpLCAoMHhDMEU4QjY3RSksICgweDZFRkI1RjFEKSwgKDB4QzAzQTEzN0UpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkUzMEUzMkYpLCAoMHhCRURFQTczQSksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2RDYyMjdGQSksICgweEJEODVCRTMzKSwKKygweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2QzhGMzUzOCksICgweEJDMkY2NTQ0KSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZCQjgxMkM1KSwgKDB4QkFEQkE5MzQpLCAoMHg2QjRBRjI1OCksICgweEJBMzJDQTQyKSwgKDB4NkFEQ0M5NzYpLCAoMHhCOThBOTdGNiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OUZENjEzMiksICgweEI4M0MzREIxKSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksCisoMHg2OTE5RTMyNiksICgweEI2RjBBODFEKSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY4MzI1Nzg2KSwgKDB4QjVBN0UzMzEpLCAoMHg2N0JEMEZDQyksICgweEI1MDQ5MzgwKSwgKDB4Njc0NkM3RDEpLCAoMHhCNDYxRkM2QSksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLCAoMHg2NjU3M0NENSksICgweEIzMUVGRkYwKSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksICgweDY1NjNCRjdFKSwgKDB4QjFERUY5RDIpLAorKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksICgweDY0NkM1OUNDKSwgKDB4QjBBMUY3MzApLCAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjM3MTE0QUIpLCAoMHhBRjY4MDM3QiksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MjcxRkE2OSksICgweEFFMzEyQjk0KSwgKDB4NjFGMTAwMjcpLCAoMHhBRDk2RUQ3NyksICgweDYxNkYxNDhFKSwgKDB4QUNGRDdCMTMpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwKKygweDYwNjg2Q0MwKSwgKDB4QUJDQ0ZENzUpLCAoMHg1RkUzQjM2NiksICgweEFCMzVGNThDKSwgKDB4NUY1RTBEQzgpLCAoMHhBQTlGQkYzOCksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1RTUwMDE0MCksICgweEE5NzVDQjM5KSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVEM0U1MjNFKSwgKDB4QTg0RjJEQjQpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwgKDB4NUMyOTBBQTApLCAoMHhBNzJCRjE0OCksCisoMHg1QjlEMTE2NiksICgweEE2OUI5QjdEKSwgKDB4NUIxMDM1QzcpLCAoMHhBNjBDMjFFOCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1OUYzREUzMCksICgweEE0RUZDQTUxKSwgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksICgweDU4RDQwRTc1KSwgKDB4QTNENkY1MUYpLCAoMHg1ODQyREQ3RSksICgweEEzNEJERjRCKSwgKDB4NTdCMEQyNjUpLCAoMHhBMkMxQUREQSksICgweDU3MURFRUVEKSwgKDB4QTIzODYyN0IpLAorKDB4NTY4QTM0ODIpLCAoMHhBMUFGRkU4MSksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLCAoMHg1NTYwNDBFMiksICgweEEwQTFGMjRGKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksICgweDU0MzMwMkE1KSwgKDB4OUY5NzkzNTYpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTMwMjg1MDcpLCAoMHg5RTkwRUI4OCksICgweDUyNjkxMjQxKSwgKDB4OUUwRUZGOUQpLCAoMHg1MUNFRDQ4NiksICgweDlEOEUwNUFEKSwKKygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg1MDk3RkMzQyksICgweDlDOEVFQjFBKSwgKDB4NEZGQjY1NzIpLCAoMHg5QzEwQ0Q5MCksICgweDRGNUUwOEVCKSwgKDB4OUI5M0E2NDkpLCAoMHg0RUJGRTg4RiksICgweDlCMTc3NkNCKSwgKDB4NEUyMTA1RTQpLCAoMHg5QTlDNDA0OCksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0Q0UxMDAyQiksICgweDk5QThDMzQwKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksCisoMHg0QjlFMDNCMSksICgweDk4QjkzODQzKSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDRBNTgxQzgzKSwgKDB4OTdDREE4NDQpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDkwRjU3RkYpLCAoMHg5NkU2MUNFRCksICgweDQ4NjlFNjU3KSwgKDB4OTY3M0RCOEMpLCAoMHg0N0MzQzIwMiksICgweDk2MDI5RTk5KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ2NzU2ODI3KSwgKDB4OTUyMzM2OUQpLAorKDB4NDVDRDM1NkYpLCAoMHg5NEI1MEQ3NCksICgweDQ1MjQ1NkU5KSwgKDB4OTQ0N0VENEQpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDNEMDlBRDkpLCAoMHg5MzcwQ0FEQSksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLCAoMHg0MjdBNDE3RCksICgweDkyOUREN0Q1KSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksICgweDQxMjE1OEUzKSwgKDB4OTFDRjFDRTMpLCAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwKKygweDNGQzVFQ0EwKSwgKDB4OTEwNEEwRjQpLCAoMHgzRjE3NDk5RiksICgweDkwQTBGRDQyKSwgKDB4M0U2ODBBRjMpLCAoMHg5MDNFNkM1RCksICgweDNEQjgzMjRDKSwgKDB4OEZEQ0VGMzcpLCAoMHgzRDA3QzIzQyksICgweDhGN0M4NzNBKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNCQTUxRTREKSwgKDB4OEVCRUY4MTApLCAoMHgzQUYyRUVCQSksICgweDhFNjFEMzMxKSwgKDB4M0E0MDJEQjQpLCAoMHg4RTA1QzZBQSksCisoMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzhEOEZFMzIpLCAoMHg4RDUwRkEyQiksICgweDM4MjQ5NDEzKSwgKDB4OENGODNDNjIpLCAoMHgzNzZGOUU4OCksICgweDhDQTA5OUZCKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDM2MDQxQUQ3KSwgKDB4OEJGNEFDMDYpLCAoMHgzNTREOTAzMyksICgweDhCQTA2MjIxKSwgKDB4MzQ5NjgyMEEpLCAoMHg4QjREMzc1RiksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLAorKDB4MzMyNkUzMjMpLCAoMHg4QUFBNDJFMCksICgweDMyNkU1NTA1KSwgKDB4OEE1QTdBNEQpLCAoMHgzMUI1NEE3OSksICgweDhBMEJENDAzKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDMwNDFDNzM3KSwgKDB4ODk3MUYxNEIpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwgKDB4MkVDQzY3QUYpLCAoMHg4OERDQTBBOSksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLCAoMHgyRDU1M0IzNSksICgweDg4NEJFODM4KSwKKygweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQkRDNEU2MyksICgweDg3QkZDQ0Q1KSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDJBNjFCMEFGKSwgKDB4ODczODU0NDMpLCAoMHgyOUEzQzQwRiksICgweDg2RjY1NkFDKSwgKDB4MjhFNTcxQTMpLCAoMHg4NkI1ODQwRSksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNzY3OUUwNiksICgweDg2Mzc2MDlBKSwgKDB4MjZBODIxNzQpLCAoMHg4NUZBMTE0RiksCisoMHgyNUU4NDU4MSksICgweDg1QkRFRjE5KSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDI0Njc3N0QwKSwgKDB4ODU0OTM0ODIpLCAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjJFNTQxRTApLCAoMHg4NEQ5MzRDMCksICgweDIyMjNBNEQyKSwgKDB4ODRBMkZDNjgpLCAoMHgyMTYxQjM4OSksICgweDg0NkRGNDcyKSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksICgweDFGRENEQkJCKSwgKDB4ODQwNzc3QjkpLAorKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDFFNTZDQTZFKSwgKDB4ODNBNUMyQzUpLCAoMHgxRDkzNTAxMSksICgweDgzNzZCNDJFKSwgKDB4MUNDRjhDQkIpLCAoMHg4MzQ4RDhERiksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxQjQ3MzJBRSksICgweDgyRjBCRERCKSwgKDB4MUE4MjlGQzApLCAoMHg4MkM2N0YwMCksICgweDE5QkRDQzYzKSwgKDB4ODI5RDc1NTMpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwKKygweDE4MzM2NzEwKSwgKDB4ODI0RjAyMTEpLCAoMHgxNzZERDlFMSksICgweDgyMjk5OTc0KSwgKDB4MTZBODEyRTMpLCAoMHg4MjA1Njc1NCksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxNTFCREYxOSksICgweDgxQzBBN0YxKSwgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEzOEVEQkY4KSwgKDB4ODE4MEM2QjYpLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwgKDB4MTIwMTE2RDIpLCAoMHg4MTQ1QzVDOCksCisoMHgxMTM5RjBBNyksICgweDgxMkExQTM2KSwgKDB4MTA3MjlGRkIpLCAoMHg4MTBGQTc5OCksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwRUUzODdDRCksICgweDgwREU2RTVBKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksICgweDBENTNEQkFGKSwgKDB4ODBCMjFCQjQpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MEJDM0FDMDcpLCAoMHg4MDhBQjE3RSksICgweDBBRkI2N0IyKSwgKDB4ODA3OEQ0MDcpLAorKDB4MEEzMzA4NDQpLCAoMHg4MDY4MzEzQiksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLCAoMHgwOEEyMDBENyksICgweDgwNEE5QzUzKSwgKDB4MDdEOTVCQjYpLCAoMHg4MDNEQUE2RCksICgweDA3MTBBMzM3KSwgKDB4ODAzMUYzQzMpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4MDU3RUZGREMpLCAoMHg4MDFFMzg5MiksICgweDA0QjYxOERGKSwgKDB4ODAxNjM0M0QpLCAoMHgwM0VEMjc0MyksICgweDgwMEY2QjhEKSwKKygweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMjVCMjZFOSksICgweDgwMDU4RDMxKSwgKDB4MDE5MjFEMEMpLCAoMHg4MDAyNzdBNyksICgweDAwQzkwRjRGKSwgKDB4ODAwMDlERUIpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RkYzNkYwRjUpLCAoMHg4MDAwOURFQiksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGREE0RDk1QiksICgweDgwMDU4RDJGKSwgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksCisoMHhGQzEyRDkwMiksICgweDgwMEY2QjhBKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEZBODBGRjY5KSwgKDB4ODAxRTM4OUEpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjhFRjVEMEUpLCAoMHg4MDMxRjNCRiksICgweEY4MjZBNDhFKSwgKDB4ODAzREFBNjkpLCAoMHhGNzVERkY2RCksICgweDgwNEE5QzRFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEY1Q0NGNzAxKSwgKDB4ODA2ODMxNEEpLAorKDB4RjUwNDk3OTMpLCAoMHg4MDc4RDQxOCksICgweEY0M0M1NDNEKSwgKDB4ODA4QUIxNzcpLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjJBQzI0OTUpLCAoMHg4MEIyMUJBRCksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLCAoMHhGMTFDNzg3NyksICgweDgwREU2RTUyKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksICgweEVGOEQ1RjRCKSwgKDB4ODEwRkE3QjApLCAoMHhFRUM2MEY5RCksICgweDgxMkExQTJEKSwKKygweEVERkVFOTcyKSwgKDB4ODE0NUM1QkUpLCAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUM3MTI0NEMpLCAoMHg4MTgwQzZBQiksICgweEVCQUE4OTI3KSwgKDB4ODFBMDFCNzUpLCAoMHhFQUU0MjAyRCksICgweDgxQzBBODEwKSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksICgweEU5NTdFRDYxKSwgKDB4ODIwNTY3NDgpLCAoMHhFODkyMjY2MiksICgweDgyMjk5OTY3KSwgKDB4RTdDQzk5MzMpLCAoMHg4MjRGMDIwNCksCisoMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4RTY0MjMzRTApLCAoMHg4MjlENzU0NSksICgweEU1N0Q1Rjg5KSwgKDB4ODJDNjdGMjcpLCAoMHhFNEI4Q0M5QiksICgweDgyRjBCRTAzKSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUzMzA3Mzg4KSwgKDB4ODM0OEQ4RDApLCAoMHhFMjZDQjAzMSksICgweDgzNzZCNDFFKSwgKDB4RTFBOTM1RDQpLCAoMHg4M0E1QzJCNSksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLAorKDB4RTAyMzIzOEYpLCAoMHg4NDA3NzdFOCksICgweERGNjA4RjY5KSwgKDB4ODQzQTFEOTIpLCAoMHhERTlFNENCOSksICgweDg0NkRGNDYwKSwgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweEREMUFCRTYyKSwgKDB4ODREOTM0QUUpLCAoMHhEQzU5Nzc2RSksICgweDg1MTA5Q0U0KSwgKDB4REI5ODg4NzIpLCAoMHg4NTQ5MzQ2RSksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhEQTE3QkFDMSksICgweDg1QkRFRjA1KSwKKygweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEODk4NjIzQiksICgweDg2Mzc2MDg1KSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ3MUE4RTlEKSwgKDB4ODZCNTgzRjgpLCAoMHhENjVDM0I0MCksICgweDg2RjY1NkU5KSwgKDB4RDU5RTRFQTApLCAoMHg4NzM4NTQ4MSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhENDIzQjFERCksICgweDg3QkZDQ0JEKSwgKDB4RDM2NzA0NkYpLCAoMHg4ODA1NDY2QSksCisoMHhEMkFBQzUwQSksICgweDg4NEJFODIwKSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQxMzM5N0EyKSwgKDB4ODhEQ0EwRUUpLCAoMHhEMDc4QUQzQyksICgweDg5MjZCNkEwKSwgKDB4Q0ZCRTM5MDgpLCAoMHg4OTcxRjEzMiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDRTRBQjVDNiksICgweDhBMEJEM0U4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksICgweENDRDkxRDFDKSwgKDB4OEFBQTQyQzUpLAorKDB4Q0MyMTBEMzUpLCAoMHg4QUZCMkNEQiksICgweENCNjk3RDRCKSwgKDB4OEI0RDM3QUMpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4QzlGQkU1NjcpLCAoMHg4QkY0QUJFOSksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDODkwNjFCNiksICgweDhDQTA5OURFKSwgKDB4QzdEQjZDMkEpLCAoMHg4Q0Y4M0M0NCksICgweEM3MjcwMTI2KSwgKDB4OEQ1MEZBN0YpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwKKygweEM1QkZEMUE1KSwgKDB4OEUwNUM2RkYpLCAoMHhDNTBEMTA5RiksICgweDhFNjFEMzg4KSwgKDB4QzQ1QUUxMEQpLCAoMHg4RUJFRjg2OCksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMkY4M0VFMSksICgweDhGN0M4NkEwKSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMxOTdGNTQ4KSwgKDB4OTAzRTZDM0IpLCAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwgKDB4QzAzQTEzOUIpLCAoMHg5MTA0QTBEMiksCisoMHhCRjhDMERGNiksICgweDkxNjk1NjVBKSwgKDB4QkVERUE3NTgpLCAoMHg5MUNGMUNDMCksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCRDg1QkRFMiksICgweDkyOUREODM3KSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksICgweEJDMkY2NDg3KSwgKDB4OTM3MENCM0QpLCAoMHhCQjg1MzIwNSksICgweDkzREJENzBFKSwgKDB4QkFEQkE4NzkpLCAoMHg5NDQ3RURCMyksICgweEJBMzJDQjM1KSwgKDB4OTRCNTBEMDkpLAorKDB4Qjk4QTk4N0QpLCAoMHg5NTIzMzYzMSksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhCODNDM0UzNyksICgweDk2MDI5RTczKSwgKDB4Qjc5NjE5RTIpLCAoMHg5NjczREI2NiksICgweEI2RjBBODM5KSwgKDB4OTZFNjFDQzYpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjVBN0UzNEQpLCAoMHg5N0NEQTg2NyksICgweEI1MDQ5MzM0KSwgKDB4OTg0MkYwNkIpLCAoMHhCNDYxRkMxRiksICgweDk4QjkzODY2KSwKKygweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMzFFRkYzRiksICgweDk5QThDM0IwKSwgKDB4QjI3RTlDOTIpLCAoMHg5QTIyMDRCMCksICgweEIxREVGOTIyKSwgKDB4OUE5QzQxMDkpLCAoMHhCMTQwMTgwQyksICgweDlCMTc3NjUyKSwgKDB4QjBBMUY3QUYpLCAoMHg5QjkzQTVDRiksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRjY4MDNGOSksICgweDlDOEVFQUVGKSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksCisoMHhBRTMxMkJBRSksICgweDlEOEUwNTgxKSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFDRkQ3QUNDKSwgKDB4OUU5MEVCQUYpLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUJDQ0ZEMkUpLCAoMHg5Rjk3OTM3RCksICgweEFCMzVGNTQ1KSwgKDB4QTAxQzRDRDgpLCAoMHhBQTlGQkU5MiksICgweEEwQTFGMkNDKSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE5NzVDQzBGKSwgKDB4QTFBRkZERkMpLAorKDB4QThFMjExQTIpLCAoMHhBMjM4NjFGNSksICgweEE4NEYyRTJBKSwgKDB4QTJDMUFENTMpLCAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTcyQkYxQkMpLCAoMHhBM0Q2RjRGMCksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLCAoMHhBNjBDMjIwMCksICgweEE0RUZDQTIxKSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweEE0RUZDQTBGKSwgKDB4QTYwQzIyMTMpLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwKKygweEEzRDZGNERFKSwgKDB4QTcyQkYxQ0YpLCAoMHhBMzRCREVCMiksICgweEE3QkQyMzIyKSwgKDB4QTJDMUFENDIpLCAoMHhBODRGMkUzRCksICgweEEyMzg2MUU0KSwgKDB4QThFMjExQjUpLCAoMHhBMUFGRkY0NSksICgweEE5NzVDQUE5KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwQTFGMkJCKSwgKDB4QUE5RkJFQTUpLCAoMHhBMDFDNENDNyksICgweEFCMzVGNTU5KSwgKDB4OUY5NzkzNkMpLCAoMHhBQkNDRkQ0MSksCisoMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUU5MEVCOUUpLCAoMHhBQ0ZEN0FERiksICgweDlFMEVGRkIzKSwgKDB4QUQ5NkVEQTUpLCAoMHg5RDhFMDU3MSksICgweEFFMzEyQkMyKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlDOEVFQURGKSwgKDB4QUY2ODA0MEQpLCAoMHg5QzEwQ0QwNSksICgweEIwMDQ5QjNCKSwgKDB4OUI5M0E1QkYpLCAoMHhCMEExRjdDMyksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLAorKDB4OUE5QzQwRjkpLCAoMHhCMURFRjkzNiksICgweDlBMjIwNEExKSwgKDB4QjI3RTlDQTYpLCAoMHg5OUE4QzNBMSksICgweEIzMUVGRjU0KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk4QjkzODU3KSwgKDB4QjQ2MUZDMzMpLCAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTdDREE4NTgpLCAoMHhCNUE3RTM2MiksICgweDk3NTk2MTZDKSwgKDB4QjY0QkVBRUEpLCAoMHg5NkU2MUNCOCksICgweEI2RjBBODRFKSwKKygweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NjAyOUU2NCksICgweEI4M0MzRTRDKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDk1MjMzNjIzKSwgKDB4Qjk4QTk4OTMpLCAoMHg5NEI1MEUxMyksICgweEJBMzJDOTlFKSwgKDB4OTQ0N0VEQTUpLCAoMHhCQURCQTg4RiksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MzcwQ0IzMCksICgweEJDMkY2NDlEKSwgKDB4OTMwNkNCM0MpLCAoMHhCQ0RBM0U3NCksCisoMHg5MjlERDgyOSksICgweEJEODVCREY4KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkxQ0YxQ0IzKSwgKDB4QkVERUE3NkUpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTEwNEEwQzUpLCAoMHhDMDNBMTNCMiksICgweDkwQTBGRDE0KSwgKDB4QzBFOEI2QjIpLCAoMHg5MDNFNkMyRiksICgweEMxOTdGNTVGKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksICgweDhGN0M4Njk0KSwgKDB4QzJGODNFRjgpLAorKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhFQkVGODVDKSwgKDB4QzQ1QUUxMjMpLCAoMHg4RTYxRDM3QyksICgweEM1MEQxMEI2KSwgKDB4OEUwNUM2RjQpLCAoMHhDNUJGRDFCQyksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4RDUwRkE3MyksICgweEM3MjcwMTNEKSwgKDB4OENGODNDMzkpLCAoMHhDN0RCNkM0MSksICgweDhDQTA5OUQzKSwgKDB4Qzg5MDYxQ0QpLCAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwKKygweDhCRjRBQkRGKSwgKDB4QzlGQkU1N0UpLCAoMHg4QkEwNjFGOSksICgweENBQjI3MDIyKSwgKDB4OEI0RDM3MzgpLCAoMHhDQjY5N0U0QyksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4QUFBNDI1NCksICgweENDRDkxRTFFKSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDhBMEJENDQyKSwgKDB4Q0U0QUI0RjEpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODk3MUYxODgpLCAoMHhDRkJFMzgzMyksCisoMHg4OTI2QjY5NyksICgweEQwNzhBRDUzKSwgKDB4ODhEQ0EwRTQpLCAoMHhEMTMzOTdCQSksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4ODRCRTgxNyksICgweEQyQUFDNTIyKSwgKDB4ODgwNTQ2NjEpLCAoMHhEMzY3MDQ4NyksICgweDg3QkZDQ0I1KSwgKDB4RDQyM0IxRjUpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODczODU0MjQpLCAoMHhENTlFNEZBQSksICgweDg2RjY1NjhFKSwgKDB4RDY1QzNDNEEpLAorKDB4ODZCNTgzOUUpLCAoMHhENzFBOEZBOCksICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NjM3NjBDQyksICgweEQ4OTg2MTYwKSwgKDB4ODVGQTExODApLCAoMHhEOTU3RERGMSksICgweDg1QkRFRjQ5KSwgKDB4REExN0I5RTUpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODU0OTM0NjcpLCAoMHhEQjk4ODg4QSksICgweDg1MTA5Q0REKSwgKDB4REM1OTc3ODcpLCAoMHg4NEQ5MzRBNyksICgweEREMUFCRTdBKSwKKygweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDZERjQ1QSksICgweERFOUU0Q0QyKSwgKDB4ODQzQTFENEIpLCAoMHhERjYwOTA3QSksICgweDg0MDc3N0EyKSwgKDB4RTAyMzI0QTApLCAoMHg4M0Q2MDNEQyksICgweEUwRTYwNzY0KSwgKDB4ODNBNUMyRUMpLCAoMHhFMUE5MzRGNCksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzQ4RDkwNCksICgweEUzMzA3MkE3KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksCisoMHg4MkYwQkRGRSksICgweEU0QjhDQ0I0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyOUQ3NTQwKSwgKDB4RTY0MjMzRjkpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODI0RjAyMDApLCAoMHhFN0NDOTk0QyksICgweDgyMjk5OTYyKSwgKDB4RTg5MjI2N0MpLCAoMHg4MjA1Njc0MyksICgweEU5NTdFRDdBKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksICgweDgxQzBBN0UxKSwgKDB4RUFFNDIxNDMpLAorKDB4ODFBMDFCNDgpLCAoMHhFQkFBOEEzRCksICgweDgxODBDNkNGKSwgKDB4RUM3MTIzNjgpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODE0NUM1REYpLCAoMHhFREZFRTg4RSksICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLCAoMHg4MTBGQTdBRCksICgweEVGOEQ1RjY1KSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwREU2RTRGKSwgKDB4RjExQzc4OTEpLCAoMHg4MEM3QTgwOSksICgweEYxRTQzRDM4KSwKKygweDgwQjIxQkFBKSwgKDB4RjJBQzI0QUYpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA4QUIxNzUpLCAoMHhGNDNDNTQ1NiksICgweDgwNzhEM0ZGKSwgKDB4RjUwNDk4QUIpLCAoMHg4MDY4MzEzNCksICgweEY1Q0NGODE5KSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwNEE5QzVFKSwgKDB4Rjc1REZFODcpLCAoMHg4MDNEQUE3NyksICgweEY4MjZBM0E4KSwgKDB4ODAzMUYzQ0IpLCAoMHhGOEVGNUMyOCksCisoMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4ODAxRTM4OTkpLCAoMHhGQTgwRkY4MiksICgweDgwMTYzNDQzKSwgKDB4RkI0OUU2N0YpLCAoMHg4MDBGNkI4QSksICgweEZDMTJEOTFCKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksICgweDgwMDU4RDJGKSwgKDB4RkRBNEQ5NzUpLCAoMHg4MDAyNzdBNiksICgweEZFNkRFMzUyKSwgKDB4ODAwMDlERUEpLCAoMHhGRjM2RjEwRiksICgweDY1NkRCQ0M4KSwgKDB4N0E5MTA4Q0EpLAorKDB4QkEzNjcwRjApLCAoMHg2OTkxOTVBMiksICgweDE3MkQyRkQwKSwgKDB4QkUzODZENTEpLCAoMHhDNEFFQTUxQyksICgweDJBQTc3RDdEKSwgKDB4OEI1MUQzQjQpLCAoMHhDRjQ5MEZEOSksICgweDRBN0JFQkNBKSwgKDB4OTEwNzJFMDQpLCAoMHhBMTc1ODcyRCksICgweDU0NDY0QTlFKSwgKDB4NjdBNkNEMDIpLCAoMHg5RTgyMDRBOCksICgweDEwQzE0QkY2KSwgKDB4NzVBQ0RBMTYpLCAoMHhGNzhEN0IzRSksICgweDZBQjNDRjY5KSwKKygweEE0RDhDNzU2KSwgKDB4Q0I4RkNEMjQpLCAoMHg3NUNDNTcxMyksICgweEMxM0U1QUUzKSwgKDB4QThDMzE3NkQpLCAoMHg1RUU2RDQxNiksICgweDgwQzVEQTBFKSwgKDB4RDg0QTAwN0MpLCAoMHg3MTlFNzNDMCksICgweDc2NTAxNEIwKSwgKDB4MEEzOTFCQzgpLCAoMHg2MEE3MDIyMyksICgweDU0Q0RBNDZCKSwgKDB4NDYwNkQ0NTUpLCAoMHhBNjA2RkIyQSksICgweEU0Q0UxNTU3KSwgKDB4NzMyNDA4MjApLCAoMHg4MDM3QThCNCksCisoMHhBMUQ4ODAzMiksICgweDc1QTNGMUM3KSwgKDB4MzJCQjAzNzApLCAoMHg1Rjg1MDI0MiksICgweDg1RUM4RjVCKSwgKDB4OEFBMkIzM0MpLCAoMHg5MUIzNzBDMiksICgweDkzOEU5RERCKSwgKDB4RTZCNjk4M0UpLCAoMHg0OTYwMkFBOSksICgweDZDMkQ5OTY1KSwgKDB4NUIxNkFFNzIpLCAoMHg2OTU3OUI2QiksICgweENEM0FCNDE1KSwgKDB4NUI3Q0YwM0MpLCAoMHhEN0IyNzYzNyksICgweDJENjlCNzlBKSwgKDB4MzIzN0I0NjgpLAorKDB4NUY5NEQ2NTApLCAoMHhBQjM3MTA2RCksICgweDBCODMxNDU3KSwgKDB4QUZEODAzMzQpLCAoMHhCNUEwQjI3QiksICgweDE2Qjc2M0U5KSwgKDB4M0I0NTQ3NTYpLCAoMHgzMTY3Q0Q5OCksICgweDcwNzIzOUFGKSwgKDB4MEE0RjEzMkEpLCAoMHgyNzgyQzhDQSksICgweDFBQzFERDRFKSwgKDB4MTIxQ0FERkUpLCAoMHg5QTkxMUQ5MCksICgweDAxNTdBREQ2KSwgKDB4MTU1OUJCOTUpLCAoMHgyODU0Qzg0QSksICgweEQ5N0UzNjg1KSwKKygweDc2MzA4QUEwKSwgKDB4ODA1MEYxRkYpLCAoMHgyMTgwNjEyRiksICgweEZGRkI4QTFBKSwgKDB4MEJDMUZGRkYpLCAoMHgxMDMyODQ2QyksICgweDAwMkEzMEMyKSwgKDB4NjU0QzU4RjIpLCAoMHhBNThBQkFDQyksICgweEMzRTk4MzFDKSwgKDB4Mjc1MzFCOEMpLCAoMHhBREJCODY5OCksICgweDA2ODAxQzEyKSwgKDB4QUZBRUVDOEUpLCAoMHhDMzI2OTI5MSksICgweDVDMkUwMUEwKSwgKDB4NEE2MTA4N0MpLCAoMHg2MEYyMUU3QiksCisoMHg2QjkyQzY3MCksICgweEM5ODcyMzY0KSwgKDB4NDg0NjRDOTcpLCAoMHgzNDJFNjQ5OSksICgweEE2ODQ5QTQ4KSwgKDB4RjAzNDAwMkQpLCAoMHg0NDJCNDQ4OCksICgweDE2MEIwNDQyKSwgKDB4RUQ1MkNGNTApLCAoMHg0RDQzNkMwNSksICgweDY4NDFDNjAyKSwgKDB4QTE0RjhBODIpLCAoMHg5QUMyMERERSksICgweDVCOTI1MUVFKSwgKDB4OEVEOTk4RDUpLCAoMHg5MkI2RUEyMiksICgweDVCMTM2QzRCKSwgKDB4OTdDMEE0NUIpLAorKDB4NDU5Qzk0QTQpLCAoMHhDRDk1ODNDMCksICgweDZDNTg5REY4KSwgKDB4M0M5QTE3Q0QpLCAoMHg5MDY2MDFCRiksICgweDg0RDYxMkUxKSwgKDB4NjcxNzZGNUYpLCAoMHhFNDdENUE0NCksICgweDM3Mzg2RDVFKSwgKDB4OTJBNEQ2MUIpLCAoMHgyOEM1MTNGQiksICgweDZFOTE1OTlBKSwgKDB4NjUzREExNkQpLCAoMHhBMTlDMzlDMCksICgweDQyNzY5MEFEKSwgKDB4NzAwNTQ2MUMpLCAoMHhBQjZDMUVFNCksICgweDgwQkFDQzJEKSwKKygweDc4MEExOEM1KSwgKDB4ODIyREM3NzQpLCAoMHhCNjA0MzAzNiksICgweDAwNzg5QzE4KSwgKDB4MTA2Qzk1MDcpLCAoMHg0MTAzQTg2NCksICgweEM1MTE1ODVCKSwgKDB4RjNFOUI3RjgpLCAoMHgyNEQ3OUM0RCksICgweDMxQjIwRUI1KSwgKDB4QjFDMDQ4M0UpLCAoMHhFMjVDNTZCOSksICgweDk2OTkxMDk2KSwgKDB4N0NENDEyMUYpLCAoMHg4QTNCODNGNCksICgweDcwNDI3MUMyKSwgKDB4QjVDMjZBQ0MpLCAoMHgyQjEzMUFGMCksCisoMHg1NDlDQjE2QyksICgweDc0NjQ5RTY5KSwgKDB4RDhENDhBREUpLCAoMHgxMjUzQUVERCksICgweDgwNDEwRkQyKSwgKDB4NUIzNjg4OUQpLCAoMHg4ODBDRTFFNyksICgweDU2QzQ5OEU3KSwgKDB4RkEyQkFBQjIpLCAoMHhENDE1NEY1QyksICgweDc5NTE2RUVEKSwgKDB4QTQyRkRBN0QpLCAoMHgyNzhEMjg3MyksICgweDE5MTIxNTM1KSwgKDB4OUM2RUM2QzcpLCAoMHg0MDIzNDBDQiksICgweDVBNkEzMkIzKSwgKDB4RTQzNDVGMjcpLAorKDB4OERDMkQ5MDEpLCAoMHgwMkU3Rjg4RSksICgweDdCM0M2QkVCKSwgKDB4RTA5NDZBNEYpLCAoMHg5NDUyODg2QyksICgweEZGMkY2MTg3KSwgKDB4MkY4MDUwRjEpLCAoMHgyQTIxN0M2MSksICgweDBBQjIxNTk0KSwgKDB4ODAxMTQ1QzQpLCAoMHgxQ0YyMDBBNSksICgweDgyQzU0NEYxKSwgKDB4Q0YzQzUwQjApLCAoMHhENTc3RkVGNyksICgweDYwQUQzQzZFKSwgKDB4OTFBRkY3OUUpLCAoMHgwNzA3MjNCMyksICgweDU4NzBFQ0Y2KSwKKygweDY0QzIyNEUyKSwgKDB4MjRGQjFFQzgpLCAoMHhDMzQ4MTA0OCksICgweDE1MUFCRjNDKSwgKDB4MTM2QUMyMTkpLCAoMHg0NzE2Q0VEMSksICgweEM4QjhDRTRFKSwgKDB4MUQxNjgyMTApLCAoMHg5MjMzNEE4MSksICgweDkwREM5MTBDKSwgKDB4NDlBMDAyMjApLCAoMHhFNUYyQzgzMSksICgweEI2N0RDNzg1KSwgKDB4M0M0OTUxNzQpLCAoMHgwRDFGNEMyQSksICgweDNBRDc4N0ZEKSwgKDB4RTlDOUZCMjcpLCAoMHg3REZDMjcxMyksCisoMHhFQjM5QzRCMyksICgweDk2Rjc1RjE4KSwgKDB4ODgzQ0NDNDcpLCAoMHg5MTM5MEJEMSksICgweDBFRTI1RjZEKSwgKDB4NkI2ODhFRjApLCAoMHgyQzg1NTdEQyksICgweEU4MEM5MTcyKSwgKDB4REU2M0RFMDYpLCAoMHgzRTFCNzA3QiksICgweEIyQ0YyRTc2KSwgKDB4NDkwRDFERjMpLCAoMHhDRDFCNTFFMSksICgweEMyMjhGMEY5KSwgKDB4RUVFMkEwMEEpLCAoMHgwODFEODM0QSksICgweDFEMkMxNDAzKSwgKDB4MDgzRkU5NDApLAorKDB4NzYxNEVEQTApLCAoMHg4MjgyMDk1QSksICgweEE3QzA4ODIxKSwgKDB4NENENDdEMjApLCAoMHgzMjI5OTE5MSksICgweDUyQTAzMEU2KSwgKDB4REY3Q0I3NkUpLCAoMHgyMzJFRDQ0QiksICgweDhEQUExNTBBKSwgKDB4MUI1OTNDNTEpLCAoMHg0NDlDQkE4MiksICgweEFCRTZEM0M0KSwgKDB4Q0NGNkY1QzMpLCAoMHg5MDY0QzFDMiksICgweDAzMUZGNTlDKSwgKDB4NDE1OUZFNEUpLCAoMHg0MjE0ODJDMCksICgweDIwRjZGMDBBKSwKKygweEI4NjZDQTQ5KSwgKDB4NzVBNjZGQUEpLCAoMHg1NDUzNTE1RiksICgweEI1NDVENDg2KSwgKDB4ODg1RDk0OTMpLCAoMHhFRUM0RUVCNCksICgweDg4RjlDODkzKSwgKDB4QkJBQTM4QjQpLCAoMHg1QTU3QkE4MyksICgweDEyRTg0OENDKSwgKDB4MkZCNjIxNjApLCAoMHg4NDBBMUE1NCksICgweDJBN0FFREQ2KSwgKDB4ODlBRjJEQkQpLCAoMHhDOEJBQUUyRSksICgweDU2RUVCRDc1KSwgKDB4RTU5NUI4NkQpLCAoMHhFRUIxMjNDNiksCisoMHgzRjk0RUJDMSksICgweDc4Q0ZCRUUyKSwgKDB4Q0Y5MDFGMTEpLCAoMHg1QTM1QTM1MCksICgweERBMjJDQjU4KSwgKDB4QkU0QjgyODcpLCAoMHgyNUUwNzhDMCksICgweDJCRDRGMEQzKSwgKDB4NkE0NjRCOTkpLCAoMHg0ODg0QjE1NiksICgweEYxRkY3NjMwKSwgKDB4QzEzMjgwNTApLCAoMHhEODRDMjE2QyksICgweDg0QTREOTQyKSwgKDB4MjE1N0EwQTApLCAoMHhGMzBBMTQxMiksICgweDU0QUY2MDExKSwgKDB4MDBENzA1NDIpLAorKDB4QkRBQkU3REIpLCAoMHgxRkYzNTM0QyksICgweEQ4NjcyQjRFKSwgKDB4N0JFM0JCM0EpLCAoMHhDNTU5NTU0MCksICgweDE2MUUxQkZGKSwgKDB4RDQzNzIzMDkpLCAoMHg3QkMyRUQ1MiksICgweEMxQzYzNkVEKSwgKDB4NEREMzJBQTQpLCAoMHg4NjE2MzI0NiksICgweDYxNEVGNjg4KSwgKDB4NEVCNDQyNzApLCAoMHg4OEVEMDc3QyksICgweDJGMjI5NDY2KSwgKDB4MUE1ODUyMDEpLCAoMHg2NUJCMkVFMiksICgweERCQURBMEREKSwKKygweEU1MDk5NUNCKSwgKDB4Q0ExRTI3NjApLCAoMHg1ODNGRDgxRiksICgweEU0OEQ0ODU5KSwgKDB4QzIwMDYxNTIpLCAoMHg4RjFGNzcwQyksICgweDI3Q0FBODZGKSwgKDB4OTYxMEI4NDUpLCAoMHhGQzI1QkNFMyksICgweDM3QjhCMzlGKSwgKDB4MTBEQ0NERDEpLCAoMHhENTdBNENBQiksICgweDdENTQzREU4KSwgKDB4NkY0NUI5NTgpLCAoMHgxMkYwQjk3OSksICgweDgxOEU3OUY5KSwgKDB4QjRCMkIwMUYpLCAoMHhGMzAzNTkwMSksCisoMHgzNzJGN0JEOSksICgweDVENTkyRTY3KSwgKDB4REI1QTU1MkYpLCAoMHg2RTYxRTYyNSksICgweDRFOEE2QTQyKSwgKDB4MjQ1OEFEQjgpLCAoMHg1RjEyNTI4QyksICgweDI3MkIzQURFKSwgKDB4REU2NjZBODMpLCAoMHg3RjE4Q0ZENyksICgweDJGODc3REQ4KSwgKDB4RDczRkZGQjYpLCAoMHg3OTg2Nzk1NiksICgweDRFMDVGQ0FEKSwgKDB4MTlFNzhFRUUpLCAoMHhFMUJBNjUxMiksICgweDk5RjZGMDkxKSwgKDB4OTE2OTA1MTYpLAorKDB4MTZBRTQwNDEpLCAoMHgwNEI5NjgwNSksICgweDdDQTA1MkZDKSwgKDB4QTREMDVFRkQpLCAoMHg0MTNEMUYwNCksICgweDUzRTkxQ0MwKSwgKDB4NkY4N0EwODIpLCAoMHg2MDRGRDIwMiksICgweDBCMzY4RDlGKSwgKDB4RDVGMjJFNUMpLCAoMHgyQkU1QTc0RSksICgweDJGNjlFQURFKSwgKDB4OEJFNTM3RTEpLCAoMHg5Njk3NTc4OSksICgweDM2NzVBM0EwKSwgKDB4MEEyNzJCNzEpLCAoMHg3NTRCMUQ2MSksICgweDk4NjAwNTgxKSwKKygweDY1OUEyQkUzKSwgKDB4QjIxQkVGNTQpLCAoMHhGMjYzNTFCMCksICgweDFDNTk5NTczKSwgKDB4NkI0MjNCNTkpLCAoMHhFQTM3MUM5NiksICgweEM5QkRBNDk5KSwgKDB4RERGMjVGMzcpLCAoMHhGQkNBQzRBRCksICgweDQwQ0E3ODhCKSwgKDB4MTNCQzM5ODEpLCAoMHg0MTc2REE1OCksICgweEQ4NDhEQTc0KSwgKDB4OTQ3NDA2NDIpLCAoMHg1NEZENTQ3OSksICgweDcxNTAyMzYyKSwgKDB4MjVFODFDRjkpLCAoMHg1MzI0OTU2MiksCisoMHg1MjgxNDgyNyksICgweDU1REM1RjJDKSwgKDB4ODgyNUJDNTApLCAoMHg4RTREMDREOSksICgweDgwNTBGMUZGKSwgKDB4MjEyQ0MxM0UpLCAoMHgwMEMwRDg0QyksICgweDA3NzExMDAzKSwgKDB4NDA2QTVGNDUpLCAoMHhFRDBBOThERSksICgweDhBNjE5NzMxKSwgKDB4Nzk2QTNCMDQpLCAoMHg3RUFFQ0Y3MSksICgweDdERjNEQUJFKSwgKDB4MkIwRkZCNEEpLCAoMHhCQThBM0ZCOCksICgweDYyMDJGOEYyKSwgKDB4NjMyQzM3QjIpLAorKDB4MjA1MjcxQUEpLCAoMHhCQTFDNDM4QyksICgweEFBMUMxMTgyKSwgKDB4RTY0NDJBNjUpLCAoMHhENzM2RTA0MyksICgweDk1NzE1QzVDKSwgKDB4M0Q2MDRDMjgpLCAoMHhEMjFEMEQ3NCksICgweEExRkIwQzIxKSwgKDB4Q0U4RjA2NUQpLCAoMHhCOEIzNjQ2MyksICgweDdGNzg4QzMzKSwgKDB4ODRBQjUzQTUpLCAoMHg0QjMzQUY0NiksICgweDQwQzI3MzZBKSwgKDB4MEQ2NTcxQjcpLCAoMHhGQzhEODI5MiksICgweDlEMUM1MTgyKSwKKygweEY3QjY3MEUyKSwgKDB4QkIyQjlFOTEpLCAoMHgxMzc4NTFENSksICgweEJDRjg3Q0E4KSwgKDB4RTA4MkE3QTYpLCAoMHg1MDI0MDRFNSksICgweDUwMjVBNkUwKSwgKDB4MjU0OTRFQTYpLCAoMHg1QTZBOEExNCksICgweEUzMDFBNjg5KSwgKDB4NzBDQkVFNkIpLCAoMHhDODA2NDRDMSksICgweEU5OTE0Q0U2KSwgKDB4OTQ4MUYxRTYpLCAoMHhCOUU0REEzNCksICgweDU4NEIxRUQ4KSwgKDB4QUNDMzk2NDgpLCAoMHgzMUVGQ0Q2MiksCisoMHgwN0M4MkFFOSksICgweEVFOUQ5MEU1KSwgKDB4NTlCQUVDNzUpLCAoMHg0MDE3OEIwRSksICgweDlGREMxQzlDKSwgKDB4RjNBNjQ4OEYpLCAoMHg0QjZDMTM2NyksICgweDlGN0RGMTA5KSwgKDB4Q0JERjhFREYpLCAoMHhCQTc2RUQzMyksICgweEYxNURCQjlGKSwgKDB4RDQ4QTE5N0YpLCAoMHhGMTFFNzVFRSksICgweEE3NkI0NzlCKSwgKDB4NzA2REU3OEIpLCAoMHg2NTU5QUM2NSksICgweEMwMTNDMTgyKSwgKDB4NDYxRTkzQzcpLAorKDB4QTk4OUVBRjEpLCAoMHg1OTQ0OEMwMCksICgweDcyMUZBQzM4KSwgKDB4NTQ2REVBNzkpLCAoMHgyMjNGNjdDMCksICgweDU0MzQ2NDdDKSwgKDB4QjNFRjRGMEEpLCAoMHhENEZBRjFGMSksICgweDBCRDRFMzhBKSwgKDB4RkY2MTUyN0UpLCAoMHhENkVBNUREMiksICgweDY0NEM3MTA1KSwgKDB4MzFBRTIxODkpLCAoMHgxMUVDMEExQSksICgweDE4QjNBRDgwKSwgKDB4NDdEMEU4MEEpLCAoMHg3NzNEOEJCMiksICgweEVGQTY3NDdFKSwKKygweEYyM0RFOEIwKSwgKDB4MDI2QkIxRTcpLCAoMHgwM0MxNDA2MCksICgweEMxOTk3REY3KSwgKDB4OTU5ODZCOUMpLCAoMHg4QTVENjE3MCksICgweDU0REIzQTU2KSwgKDB4MjI5NjFENDEpLCAoMHg0NjgxMzQ3MSksICgweEFCRUQxNkE0KSwgKDB4RDFGODNFOEMpLCAoMHgyNTk0QUNBQyksICgweDFENTU2MEVBKSwgKDB4MDQzMkVGRjQpLCAoMHhBMzg5RDdFOCksICgweEFGRTkyQzYyKSwgKDB4RkJCQUYxRTcpLCAoMHg0MkQwRDBBMSksCisoMHhBMkMzRUNCMiksICgweDYwM0RENjM1KSwgKDB4RUJCQzU5MTUpLCAoMHg1QjBDN0NFMCksICgweDhEMDM2NDBDKSwgKDB4MjJFMjk4REIpLCAoMHgzOENFM0JEQyksICgweDIxRTZCNkI0KSwgKDB4Qzk3NDJDM0YpLCAoMHg0QkRGNzQ0OCksICgweEJBRDA5RDAwKSwgKDB4RUQ2QTgzOTcpLCAoMHhGNkY4MDAxQSksICgweDMxRTM1OTFFKSwgKDB4QUVDMzdFRkUpLCAoMHgyMkQ5QUQwNiksICgweDVFMjU0QUVDKSwgKDB4RDg1MkQzMkUpLAorKDB4RTFDOTY4QUUpLCAoMHhBM0MzQzI2NSksICgweEQ2N0JENzhBKSwgKDB4RjFGRjlEOEMpLCAoMHhDMDNBODA1MCksICgweDg0N0EyMUZDKSwgKDB4ODEwRURBNUQpLCAoMHg2MzgwODk1MSksICgweEM4RkU5RTlFKSwgKDB4RkI2REQzRTUpLCAoMHg3N0JEN0EwMyksICgweDZEQzE0Njc3KSwgKDB4RkY4MUQ4MzEpLCAoMHg0MzIwMTEwMCksICgweEE3OEUxNkZFKSwgKDB4MzkzQ0QwQTApLCAoMHg1MTRGNkRERCksICgweDQyN0JBNEJDKSwKKygweEVCRTdBNjc2KSwgKDB4Qjc3MTYzOUIpLCAoMHg4REFCQjlFNyksICgweDgxMkZBNUFEKSwgKDB4M0YxMDIxMjApLCAoMHg2MEU0MjQ1NCksICgweEVGRkJGRkM1KSwgKDB4QkVCMUQ1REQpLCAoMHg3QTU5RERGRCksICgweEU4OTY4RDdBKSwgKDB4OEFBRDM0NjIpLCAoMHhBQjY1MzI3RCksICgweDBDRjJFQ0ZCKSwgKDB4RkEzMjQ5QTQpLCAoMHg5N0ZDM0E0MiksICgweDMxNEE3MDg5KSwgKDB4Mjk5MUU2REMpLCAoMHhBOTg2OTNDNCksCisoMHg2NUVCMjAxMSksICgweENCNEQ4NTk0KSwgKDB4MUFBRkYxNEUpLCAoMHgxRDBEMDQ5MiksICgweDJFNUE3ODREKSwgKDB4QUU0RUM3MzgpLCAoMHhGMTZENjY3QSksICgweEIwQzI2MDMwKSwgKDB4QURBM0RGQzkpLCAoMHg0RUQ4NzRFNSksICgweEQ0NDFBNkFFKSwgKDB4MTlFM0FDMDUpLCAoMHhDNkI4NjVEQyksICgweEU4RTQyODVBKSwgKDB4OTkyNDhDMkIpLCAoMHhDMjk4MTEyMiksICgweDFCMDE0Mjg4KSwgKDB4NDQyQTA1ODApLAorKDB4ODRBMEExQzEpLCAoMHgyMTZGMDI0OCksICgweDIwMkU1NjAyKSwgKDB4RUFFQkFBQ0EpLCAoMHhERDVBQkVFNyksICgweDhCOUM0QjQzKSwgKDB4NUQ1RDQ2RDcpLCAoMHg4RkJFN0MxRCksICgweDZGOUNBQjg3KSwgKDB4QjBBQjBBQUUpLCAoMHg5OEJDNzkzNiksICgweEYyNTFCOTExKSwgKDB4NDQ2OUYyRDEpLCAoMHhBOTA5OTA4OCksICgweEQyMTlCRDY2KSwgKDB4NzQ5MEFFMjIpLCAoMHhCQzBBOTgyMCksICgweDExOUQwMTM2KSwKKygweDg1OTI2NjFDKSwgKDB4MjYwQzBEMTgpLCAoMHhCOUExQzVCMSksICgweEE2ODU5MUU0KSwgKDB4RkNCRDRGMjkpLCAoMHg1OTY1QTNDNyksICgweDdEMUVENjY0KSwgKDB4OUJEREVFRTMpLCAoMHg5MjIzN0Q1QSksICgweEI3MzMyREE2KSwgKDB4RUE1NjMyRTUpLCAoMHg5QkZFMTYyNCksICgweDZBMkJCMThBKSwgKDB4OEMwREQ3MkMpLCAoMHg0RjMxOUY1NiksICgweEVFOEI1QjAzKSwgKDB4NjA5NjdCQzgpLCAoMHhCNDkxOEY3NSksCisoMHhGMjk1RDVGNiksICgweDY1MkFEODBEKSwgKDB4MENDRTk1NTIpLCAoMHgwQkNBQTBBNiksICgweDNDRjJEMjhFKSwgKDB4MTg1Mzk1NkUpLCAoMHg3QjM4REVBQSksICgweEVBQUI5NzBCKSwgKDB4NjQwODZEMUYpLCAoMHgzRTc2NDVERCksICgweDk4NkYxMzQyKSwgKDB4QkJCMEUxODgpLCAoMHg3RDZENTY0MiksICgweDY4MjE4MjdEKSwgKDB4RkNCQzQ3MjkpLCAoMHgzRDExNEZCOSksICgweDJEMjU0MkU1KSwgKDB4NjU0Q0MxRjApLAorKDB4MDRGMUI3NUUpLCAoMHgyOTBCNTRBRiksICgweDdENzlBQjFBKSwgKDB4RjM0RTMxQTIpLCAoMHg3M0E5RjMwMCksICgweDdBQkNBODlFKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLCAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksICgweDIxQzhFMDNBKSwgKDB4QjE1NTg0MUEpLCAoMHgzMDcxNjY4NSksICgweDBBMkI0OEFDKSwKKygweDcwNDFDNDBBKSwgKDB4MTA0QzQ0RDApLCAoMHgxRjUxQjYxOCksICgweEYwRDRGMzlCKSwgKDB4RkNBRUJBNTIpLCAoMHgzMEVBNjJDRCksICgweEEyOTRCNzcyKSwgKDB4MjIxRTA0MTcpLCAoMHhBQThFRjE5MiksICgweDNFNTY4Qzc4KSwgKDB4RDM4NkVGOUEpLCAoMHgxM0I1NEZCMSksICgweDg0ODE4RUMzKSwgKDB4Qjg3NjY5RjgpLCAoMHhDRDkwNTY1QSksICgweDczRDdDODc2KSwgKDB4RDYxOTE1MTIpLCAoMHhBQzIyODcwNCksCisoMHhBNzc4NUQ0OCksICgweDE3Q0YzNEREKSwgKDB4OEFGNUFCNDApLCAoMHgzNjVDNkFGQSksICgweDE3REZENTlFKSwgKDB4QjkyNEMyNkUpLCAoMHhFOURFNTg0NCksICgweDNEQ0REQ0Q5KSwgKDB4Q0RBMkRGQjQpLCAoMHg4QTVCNTM0RSksICgweEEyRDlEQUNBKSwgKDB4MTE2Nzk1NjkpLCAoMHhBRUY2RTdFOSksICgweEM5RDI0MTdDKSwgKDB4NTE1REM5QzMpLCAoMHgxNTdBNUIxMiksICgweDRDOTYwREQ2KSwgKDB4RDQxM0NDMDEpLAorKDB4NjUzMTk1NDUpLCAoMHg2Q0YxMzA5RCksICgweDAwMDMzOEM3KSwgKDB4NDYwQUE3RkMpLCAoMHhDMUZBNDQ0MCksICgweDBFM0FFMDQ4KSwgKDB4RjRCMjEyQjUpLCAoMHhDNzg5NUQyQiksICgweDY3NkFGQUYzKSwgKDB4RUY0MDRGNzUpLCAoMHhCRkNEQjE3QyksICgweEEzN0ZFNkM2KSwgKDB4MjAxMjNERDUpLCAoMHhFRTk2QkQzQiksICgweDNFQjhBNjJFKSwgKDB4MDY4ODQ1RTEpLCAoMHhDNDk2MDIxNiksICgweDdCQjExRDhEKSwKKygweDJENjU3NDY3KSwgKDB4RkM2RkFDQzUpLCAoMHhDMjFBQUQzMSksICgweDY0Mjc0NUY0KSwgKDB4NDUwN0UxMzkpLCAoMHhGNzM2OURDOSksICgweDYxOThBREVCKSwgKDB4NjNCOThCMTApLCAoMHhERUU1ODVBQiksICgweEEzOEVGRkFDKSwgKDB4MzBBRTFFNDEpLCAoMHg4MjA2NjdBOSksICgweDZCNzdBMDA3KSwgKDB4MjQwMDQwQTcpLCAoMHhCNzdBN0Q5NSksICgweDIwODg5M0NBKSwgKDB4MDg1QjQ2MTApLCAoMHgxNDIzNDg1NCksCisoMHhBQzAyMjc4NiksICgweDJENTczNDZGKSwgKDB4QjY0QTFBNjcpLCAoMHg2MDVENDVCMiksICgweEUwNTFDMDAxKSwgKDB4OTE3NkMxMUQpLCAoMHgyM0JCRTk0NSksICgweDJDMDNFMjZBKSwgKDB4QzI4MTFCQUQpLCAoMHgxREQ4MTRENCksICgweDNDNjc0QjY4KSwgKDB4MjhFQzMzQzcpLCAoMHhEOUVERTVFNCksICgweDVDNDZDMjQ4KSwgKDB4NDA5ODg5OEYpLCAoMHg1QkE5NjI4MCksICgweEVGRjc3QjkxKSwgKDB4MzMzMkNBNUIpLAorKDB4NjYxQ0FGNkIpLCAoMHg2RTBENTY0RSksICgweEI3MEQwODYzKSwgKDB4MjQwMjg1QzApLCAoMHhCQkJEM0VBNyksICgweENBMkU1NjhEKSwgKDB4RDFEM0Y2MTIpLCAoMHhDOTE2MTE1RSksICgweEI3RkMwQTZDKSwgKDB4MTk2MUFFOUEpLCAoMHhCNURGMzk2NSksICgweEMxQjk1MDY1KSwgKDB4ODlFMjk2NjUpLCAoMHgzRjI5RkJFRCksICgweDNGMUJFRDczKSwgKDB4QzE1NUJFMUQpLCAoMHg3MjU2QUU0QyksICgweDRBNTk3OTdCKSwKKygweDYwMDlEMTNCKSwgKDB4OTE4NTAzODUpLCAoMHhFNDU0NTkyMCksICgweDE1RUNDREExKSwgKDB4RkZDN0JBMjApLCAoMHgyQjgwNTBGMSksICgweDFBMjFENEMwKSwgKDB4MzAwOEJFODkpLCAoMHg2QzBGRjMxNyksICgweDc0NDREODUyKSwgKDB4MDU4NDE0MTEpLCAoMHg4NEM4MDAyMiksICgweDA3QzYzMEUwKSwgKDB4N0U2RjhGQTMpLCAoMHhGM0JERjNDNyksICgweDRDNTVERkY3KSwgKDB4RTBCMUM4RDEpLCAoMHhDM0Y1Q0Y0RCksCisoMHgxQzIyQTgzNiksICgweEIyOUQzMzE1KSwgKDB4RDQ5NjY1NDEpLCAoMHg0NUM4NTgwMCksICgweEFEOERCRDQ2KSwgKDB4MkMxOUNGQUEpLCAoMHg1NDBGQTY3NCksICgweEMzQzkxM0Q4KSwgKDB4RDIxODM3NTMpLCAoMHhDQjlGQ0YyNiksICgweDgzNDZGQzg5KSwgKDB4QTM0MDgwNzgpLCAoMHhDRkQ4NENDMSksICgweEY1ODBGMDM1KSwgKDB4N0ZEMDY3QTcpLCAoMHg4N0U3RkNCOCksICgweDA5QzA5NDA2KSwgKDB4RERCQjMxMzEpLAorKDB4RkY3OUZGRTEpLCAoMHhFQUZCRUVGMSksICgweEI2NjBCQ0U4KSwgKDB4OTk4OTlDMzEpLCAoMHg5RkVCMjJDMSksICgweEM3NUVGNjhGKSwgKDB4MTM4MDBCOTkpLCAoMHhDRDdGMzEwMCksICgweDA5NTAyQURDKSwgKDB4MTAxRTAwRTgpLCAoMHg0MDZDQjk0NSksICgweDgyMEExQjJCKSwgKDB4NjhBMEIwODIpLCAoMHgwQzFCMTg2NCksICgweEIzNjkwMzU0KSwgKDB4NjNDNUI1QTMpLCAoMHg1MzVFQjRDOCksICgweEY3RDg2OTE4KSwKKygweEQxQkE1OEZDKSwgKDB4RjQyOTEwRkEpLCAoMHhGQkRCMTkyOSksICgweEM3QzBDMkE0KSwgKDB4RDIwNzQ3NTIpLCAoMHhCOTY4MDNCNCksICgweDg0MDY1RTM4KSwgKDB4ODE5QUY0OEUpLCAoMHhFOTg2NEZGMyksICgweEE2RTQxRDBFKSwgKDB4NTBFNzQ0MkIpLCAoMHhDNzU3NEQ3QiksICgweDE5NkI2QUIzKSwgKDB4MDQxRDU4NTQpLCAoMHg2MjkxNjJEMyksICgweDA0MjcxM0UwKSwgKDB4OUFFMzEyOTcpLCAoMHg0QjJGNEUzNiksCisoMHhDQjhDRTBFMCksICgweEIyRjA2ODJBKSwgKDB4QUIzM0Q2RjUpLCAoMHgyRjUzRDgyRSksICgweDY2QTQzODE1KSwgKDB4NDQzM0FBQTgpLCAoMHg4MkVBMEVENSksICgweDQ1Nzg3NkYyKSwgKDB4RDMwQkQzNkMpLCAoMHg4RDQ5RDI4QyksICgweDBFNjgyNjBFKSwgKDB4RDA1NjUxMkMpLCAoMHg3Qjg2REIxMSksICgweDY0NjMzNjYxKSwgKDB4ODI2NUZGMjUpLCAoMHg2RDJCNzE0OCksICgweDUyOURBMEQ4KSwgKDB4QkMxODAwMTcpLAorKDB4MTlBQjgwM0IpLCAoMHg4M0YwMDAyMCksICgweDUwRjFGRjA3KSwgKDB4RDRDMDJEODApLCAoMHhGQzg4MUEyMSksICgweEMxQkYwMTAwKSwgKDB4NTg0MTY4MEIpLCAoMHgxMDNCMkNDMCksICgweEIwNDJDMjhBKSwgKDB4MjMyNEU4QTgpLCAoMHgzMTUzMTQzMCksICgweEVGNzFERDBFKSwgKDB4N0MxQjlEOEUpLCAoMHgwOTk4QzIyOCksICgweEQ5RUM2NTQ4KSwgKDB4OEVFRjg0NDgpLCAoMHgwQzU2MUNBRiksICgweDRCQTM5REZEKSwKKygweDU4OTQ3RkUyKSwgKDB4OTU5QjEyQTIpLCAoMHg2RDUyRUFFQyksICgweDFEOTVEREQ1KSwgKDB4MzEwQzIyMkIpLCAoMHg2MzYzNEIxOCksICgweDRERTZDNUI4KSwgKDB4NTI2QzkxMDYpLCAoMHg0OUI1RThDQyksICgweEMzQzMzMDA0KSwgKDB4NjA1Q0QyODcpLCAoMHgwOUE2MzkwQyksICgweDM1MEMzM0JDKSwgKDB4OTUzMDUwQ0MpLCAoMHg5NjA1NTJBMyksICgweDU0RjAxMTg2KSwgKDB4MEU4RDdDRkUpLCAoMHg0NTlBMDAyMiksCisoMHhDMzU3Njk2NiksICgweEIwRDZGNkU4KSwgKDB4QjhGMTNBQUMpLCAoMHhFNDQwMDM0QyksICgweDM2MTE4ODUxKSwgKDB4RjUxQkU3MjcpLCAoMHgyRTE2ODlBMCksICgweEU4MkNDRjU1KSwgKDB4NkRGNEUzQ0IpLCAoMHhFQTY2NTY2MyksICgweEMyRTUzRDZGKSwgKDB4OURDMUYwNkIpLCAoMHhGQ0MyRTg3OCksICgweDQyOTJEMTYyKSwgKDB4NDg0MEM0MzMpLCAoMHhCNjE4REI0MyksICgweDA2MDkyQzE1KSwgKDB4NTAwMTM0QzEpLAorKDB4QTZEQjg5NTUpLCAoMHhENUU4QTVCQiksICgweDE0MkI3ODI5KSwgKDB4NzVGNDI5MzkpLCAoMHgwRUJGNEQxMCksICgweDFBMkIwNzhDKSwgKDB4N0MyQTVBNDYpLCAoMHgzRUExQjlBNyksICgweDMxQUFDODk4KSwgKDB4MTMyN0I4NTIpLCAoMHgyNzdDNjVBMSksICgweDUyODBDRTI3KSwgKDB4RkY1MTIyMTMpLCAoMHgzOUI0N0VCRiksICgweDE1NENBMDAwKSwgKDB4MTA2RTdEQTIpLCAoMHhBRkE0QzkyNSksICgweEM0OENFMzc5KSwKKygweEFCMkU0NTczKSwgKDB4NUU0NEI4RkQpLCAoMHhFQ0QyQTQyNCksICgweDhDNTMwMEFBKSwgKDB4RTQyNUExODApLCAoMHg2RDVEMEQzQiksICgweEE3MDU0MEE4KSwgKDB4RjhFQ0Y0MzIpLCAoMHg4ODQ2OTZCMCksICgweEI3OTc1NUJGKSwgKDB4NjJDQUQ0MTkpLCAoMHg0QkJCMzhCNiksICgweENENUM3OUQ3KSwgKDB4ODJENEUyOUIpLCAoMHg2REQ0OEU5MSksICgweEExMjhBM0E5KSwgKDB4RjJFRDY3MjYpLCAoMHgzMzlBNjNGNiksCisoMHgzNUQ2RjRFQSksICgweDhEQzhCNDkxKSwgKDB4Q0EwNEQwOUMpLCAoMHhGRjA3NEZEMCksICgweDJEODA1MEYxKSwgKDB4MUEyMUQ4ODApLCAoMHgxOTAwRkU4OCksICgweDZDMDlEMUJGKSwgKDB4NTY0ODMwMDEpLCAoMHhDMjBBMUEyOSksICgweDQ0OTE4MEEzKSwgKDB4MDI4QzUxNjApLCAoMHg3NUZBRUNERCksICgweDYyNTA3MDVCKSwgKDB4ODlFQTAxMEEpLCAoMHg3QjlGOTg1MSksICgweDlENkM1OTk0KSwgKDB4ODYwMkMzRTQpLAorKDB4MDNEMEU4NjMpLCAoMHgwNDMyMjI1MSksICgweDExNjA5NUI3KSwgKDB4Nzg5Mjc2Q0EpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwOTc4KSwgKDB4ODAwMEM2ODgpLCAoMHg4MDAwQkNEOCksICgweDgwMDEwMDAwKSwgKDB4OUZDM0Y3QjgpLCAoMHhERTQ3QkMxQiksICgweEU2MEZCNEY4KSwgKDB4RUEyNzQ2OUQpLCAoMHhDQ0ExRTY2RCksICgweDhGRkY3MDEwKSwgKDB4ODAwMEJDRDgpLCAoMHgwMDAwMDBEMCksICgweDgwMDBCNEIwKSwKKygweDhGRkZGQjI0KSwgKDB4OUZDM0Y3QjgpLCAoMHgwMDAwMDAwMCksICgweDgwMDBCNDE4KSwgKDB4OEZGRjcwMTApLCAoMHg4MDAwQzY4OCksICgweDAwMDAwMEQwKSwgKDB4OUZDM0ZEM0MpLCAoMHhENjI1RjhDMCksICgweDQ3OEQ4MzJBKSwgKDB4RjY5M0Q5MjIpLCAoMHgzNjE3RDgxNiksICgweDgwMDAwNjQ4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMyksICgweDAwMDAwMDEyKSwgKDB4OUZDNDk5NjQpLCAoMHg0NjE0MTkyNCksCisoMHg0RDgzNDIwNSksICgweDE2Qjc5OUE2KSwgKDB4QTM5NDk0QTYpLCAoMHhDQ0YyM0M2MCksICgweDAwMDAwMDAxKSwgKDB4OUZDNDc0NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDcyKSwgKDB4MDAwMDgwMDEpLCAoMHg4RkZGRkI1OCksICgweDAwMDAwMDAzKSwgKDB4NDAyQzc0MTMpLCAoMHgwMDAwMDAxNiksICgweDQwMkM3NDEzKSwgKDB4OUZDNDg0OTgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDEpLAorKDB4MDAwMDAwNzIpLCAoMHg5RkM0NzgzQyksICgweDgwMDBDNjkwKSwgKDB4MDM1OENERDUpLCAoMHgwMDAwMDAwMCksICgweDAwMDA4MDAxKSwgKDB4MDAwMDAwNzIpLCAoMHg4MDAwMDY0OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwQkQ0MCksICgweDFBMTlGOEQ4KSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwMDNDMCksICgweDAwMDAwMDAzKSwgKDB4OUZDNDI4Q0MpLCAoMHhGNjE5MjAxNSksICgweEZCQjc3RjkyKSwKKygweDhGMkM4QkZDKSwgKDB4M0MzOTE5MjMpLCAoMHg0MDE0NDI4QyksICgweDE0MDA0NUFFKSwgKDB4RkZGRDJCQjYpLCAoMHgyRDgwNTBGMSksICgweDgwMDBCRDQwKSwgKDB4MDAwMDAwMDMpLCAoMHgwMDAwMDAwMCksICgweDJDQzA1ODExKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwMDNDMCksICgweDgwMDAwNjQ4KSwgKDB4ODAwMDA2NDgpLCAoMHg5RkM0MjA2QyksICgweDhGRkZGRDc4KSwgKDB4OEZGRkZFRUMpLCAoMHg4MDAwQzY2OCksCisoMHg4MDAwMDY0OCksICgweDhGRkZGRDc4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMzA0MCksICgweDgwMDBGRkMwKSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMDAwMCksICgweDlGQzNGN0I4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMkNDMCksICgweDgwMDEzMzQwKSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMEZEMCksICgweDgwMDEyNTQ4KQorfTsKKworLy9zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8yMDQ4W10gPQorLy97CisvLygweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkZGRDg4NCksICgweEZGOUI3ODFEKSwgKDB4N0ZGRjYyMTUpLCAoMHhGRjM2RjA3OCksICgweDdGRkU5Q0IxKSwgKDB4RkVEMjY5NTApLCAoMHg3RkZEODg1OSksICgweEZFNkRFMkUwKSwgKDB4N0ZGQzI1MEUpLCAoMHhGRTA5NUQ2QSksICgweDdGRkE3MkQwKSwgKDB4RkRBNEQ5MjkpLCAoMHg3RkY4NzFBMCksICgweEZENDA1NjVEKSwgKDB4N0ZGNjIxODEpLCAoMHhGQ0RCRDU0MCksCisvLygweDdGRjM4MjcyKSwgKDB4RkM3NzU2MTcpLCAoMHg3RkYwOTQ3NiksICgweEZDMTJEOTFCKSwgKDB4N0ZFRDU3OEYpLCAoMHhGQkFFNUU4QyksICgweDdGRTlDQkJFKSwgKDB4RkI0OUU2QTMpLCAoMHg3RkU1RjEwNyksICgweEZBRTU3MUEyKSwgKDB4N0ZFMUM3NkEpLCAoMHhGQTgwRkZDRSksICgweDdGREQ0RUVCKSwgKDB4RkExQzkxNTcpLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwgKDB4N0ZEMzcxNTEpLCAoMHhGOTUzQkY5NCksCisvLygweDdGQ0UwQzNEKSwgKDB4RjhFRjVDQkMpLCAoMHg3RkM4NTg1MiksICgweEY4OEFGRTNGKSwgKDB4N0ZDMjU1OTUpLCAoMHhGODI2QTQ2NCksICgweDdGQkMwNDA5KSwgKDB4RjdDMjRGNjEpLCAoMHg3RkI1NjNCMiksICgweEY3NURGRjZCKSwgKDB4N0ZBRTc0OTMpLCAoMHhGNkY5QjRDOCksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3RjlGQUExMyksICgweEY2MzEzMDc0KSwgKDB4N0Y5N0NFQkIpLCAoMHhGNUNDRjczRSksCisvLygweDdGOEZBNEFGKSwgKDB4RjU2OEM0NjMpLCAoMHg3Rjg3MkJGMiksICgweEY1MDQ5ODAwKSwgKDB4N0Y3RTY0OEIpLCAoMHhGNEEwNzI2NCksICgweDdGNzU0RTdFKSwgKDB4RjQzQzUzQ0IpLCAoMHg3RjZCRTlEMyksICgweEYzRDgzQzc0KSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdGNTgzNEI2KSwgKDB4RjMxMDI0OTIpLCAoMHg3RjRERTQ1MCksICgweEYyQUMyNDczKSwgKDB4N0Y0MzQ1NjIpLCAoMHhGMjQ4MkM4RCksCisvLygweDdGMzg1N0Y0KSwgKDB4RjFFNDNEMUMpLCAoMHg3RjJEMUMwQyksICgweEYxODA1NjYwKSwgKDB4N0YyMTkxQjIpLCAoMHhGMTFDNzg5NSksICgweDdGMTVCOEVEKSwgKDB4RjBCOEE0MDkpLCAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VGRDFDM0IpLCAoMHhFRkYxMTc1NSksICgweDdFRjA1ODYwKSwgKDB4RUY4RDVGQzgpLCAoMHg3RUUzNDYzNCksICgweEVGMjlCMjQxKSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksCisvLygweDdFQzgzNzE3KSwgKDB4RUU2Mjc2QjcpLCAoMHg3RUJBM0EzOCksICgweEVERkVFOTMwKSwgKDB4N0VBQkVGMjkpLCAoMHhFRDlCNjZBNSksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLCAoMHg3RThFNkVCMiksICgweEVDRDQ4NDE0KSwgKDB4N0U3RjM5NTQpLCAoMHhFQzcxMjQ0QSksICgweDdFNkZCNUY0KSwgKDB4RUMwREQwQjApLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwgKDB4N0U0RkM1M0QpLCAoMHhFQjQ3NEU4MyksCisvLygweDdFM0Y1ODAwKSwgKDB4RUFFNDIwOEEpLCAoMHg3RTJFOUNERCksICgweEVBODBGRjc3KSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksICgweDdFMEMzRDI2KSwgKDB4RTlCQUU1NzUpLCAoMHg3REZBOThBNyksICgweEU5NTdFRDAwKSwgKDB4N0RFOEE2NkMpLCAoMHhFOEY1MDI2NiksICgweDdERDY2NjhEKSwgKDB4RTg5MjI2MjEpLCAoMHg3REMzRDkwRSksICgweEU4MkY1ODUxKSwgKDB4N0RCMEZERjUpLCAoMHhFN0NDOTkxMiksCisvLygweDdEOURENTVBKSwgKDB4RTc2OUU4RTApLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0Q3NjlCQjQpLCAoMHhFNkE0QjYxOSksICgweDdENjI4QUM3KSwgKDB4RTY0MjM0MUMpLCAoMHg3RDRFMkM3QyksICgweEU1REZDMUUyKSwgKDB4N0QzOTgwRUQpLCAoMHhFNTdENUZFNCksICgweDdEMjQ4ODE4KSwgKDB4RTUxQjBFMjIpLCAoMHg3RDBGNDIxNyksICgweEU0QjhDRDE2KSwgKDB4N0NGOUFFRUMpLCAoMHhFNDU2OUNCRSksCisvLygweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Q0NEQTE2QSksICgweEUzOTI2RkI5KSwgKDB4N0NCNzI3MjEpLCAoMHhFMzMwNzM0NyksICgweDdDQTA1RkYxKSwgKDB4RTJDRTg4QkEpLCAoMHg3Qzg5NEJEQSksICgweEUyNkNCMDEwKSwgKDB4N0M3MUVBRjcpLCAoMHhFMjBBRTlDMyksICgweDdDNUEzRDUyKSwgKDB4RTFBOTM1RjEpLCAoMHg3QzQyNDJGMCksICgweEUxNDc5NEI3KSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksCisvLygweDdDMTE2ODRGKSwgKDB4RTA4NDhCNzcpLCAoMHg3QkY4ODgzMCksICgweEUwMjMyM0VBKSwgKDB4N0JERjVCOEYpLCAoMHhERkMxQ0ZFNSksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QkFDMUQzMyksICgweERFRkY2NDAwKSwgKDB4N0I5MjBCODYpLCAoMHhERTlFNEM1QiksICgweDdCNzdBREEwKSwgKDB4REUzRDQ5NEMpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0I0MjBENzkpLCAoMHhERDdCODIyMiksCisvLygweDdCMjZDQjQ5KSwgKDB4REQxQUJFNDEpLCAoMHg3QjBCM0QzMyksICgweERDQkExMDI0KSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBRDMzRDQxKSwgKDB4REJGOEY0RjApLCAoMHg3QUI2Q0I5QSksICgweERCOTg4ODhFKSwgKDB4N0E5QTBFNTMpLCAoMHhEQjM4MzJERSksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3QTVGQjBEMSksICgweERBNzdDQjUwKSwgKDB4N0E0MjEwREUpLCAoMHhEQTE3QkE2MyksCisvLygweDdBMjQyNTZGKSwgKDB4RDlCN0MwOUEpLCAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4NzlFNzZDOUMpLCAoMHhEOEY4MTQxRCksICgweDc5Qzg5RjcxKSwgKDB4RDg5ODYyMUEpLCAoMHg3OUE5ODcxMyksICgweEQ4MzhDODJBKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc5NkE3NTVBKSwgKDB4RDc3OURFNUQpLCAoMHg3OTRBN0MxMSksICgweEQ3MUE4RUJBKSwgKDB4NzkyQTM3RjgpLCAoMHhENkJCNTg1MCksCisvLygweDc5MDlBOTM1KSwgKDB4RDY1QzNCOTgpLCAoMHg3OEU4Q0ZCNCksICgweEQ1RkQzODU0KSwgKDB4NzhDN0FCOUUpLCAoMHhENTlFNEVGOSksICgweDc4QTYzRDA3KSwgKDB4RDUzRjdGQzMpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzg2MjgwQkUpLCAoMHhENDgyMzBFQSksICgweDc4NDAzMzIxKSwgKDB4RDQyM0IxODEpLCAoMHg3ODFEOUI2RCksICgweEQzQzU0RDYyKSwgKDB4NzdGQUI5OEEpLCAoMHhEMzY3MDQ0RiksCisvLygweDc3RDc4REE2KSwgKDB4RDMwOEQ2QkUpLCAoMHg3N0I0MTdENCksICgweEQyQUFDNEVCKSwgKDB4Nzc5MDU4NDIpLCAoMHhEMjRDQ0Y0OSksICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NzQ3RkJDNSksICgweEQxOTEzODVCKSwgKDB4NzcyMzVGMzUpLCAoMHhEMTMzOTdGQSksICgweDc2RkU3OTBGKSwgKDB4RDBENjE0M0EpLCAoMHg3NkQ5NDk4MyksICgweEQwNzhBRDkzKSwgKDB4NzZCM0QwQTYpLCAoMHhEMDFCNjQzRCksCisvLygweDc2OEUwRUE5KSwgKDB4Q0ZCRTM4QUQpLCAoMHg3NjY4MDM3MyksICgweENGNjEyQUE3KSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDc2MUIxMjE4KSwgKDB4Q0VBNzY5MDcpLCAoMHg3NUY0MkMwQiksICgweENFNEFCNUE2KSwgKDB4NzVDQ0ZEM0IpLCAoMHhDREVFMjBFRiksICgweDc1QTU4NUQ5KSwgKDB4Q0Q5MUFCNTUpLCAoMHg3NTdEQzVDRCksICgweENEMzU1NDlDKSwgKDB4NzU1NUJENDcpLCAoMHhDQ0Q5MUQzNyksCisvLygweDc1MkQ2QzYwKSwgKDB4Q0M3RDA1NjEpLCAoMHg3NTA0RDM0QyksICgweENDMjEwRDhCKSwgKDB4NzREQkYxRUUpLCAoMHhDQkM1MzU3QSksICgweDc0QjJDODdCKSwgKDB4Q0I2OTdEQTApLCAoMHg3NDg5NTcyNSksICgweENCMERFNjcyKSwgKDB4NzQ1RjlERDMpLCAoMHhDQUIyNkZCMiksICgweDc0MzU5Q0I4KSwgKDB4Q0E1NzE5RDMpLCAoMHg3NDBCNTNFRCksICgweEM5RkJFNTBFKSwgKDB4NzNFMEMzQTkpLCAoMHhDOUEwRDFENCksCisvLygweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MzhBQ0M5NCksICgweEM4RUIwRkM0KSwgKDB4NzM1RjY2MkYpLCAoMHhDODkwNjFEMSksICgweDczMzNCODg0KSwgKDB4QzgzNUQ1RDYpLCAoMHg3MzA3QzNDOSksICgweEM3REI2QzQ1KSwgKDB4NzJEQjg4MTkpLCAoMHhDNzgxMjU1NiksICgweDcyQUYwNUFCKSwgKDB4QzcyNzAxN0EpLCAoMHg3MjgyM0M2MyksICgweEM2Q0QwMDc1KSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksCisvLygweDcyMjdENjI0KSwgKDB4QzYxOTY4QjYpLCAoMHg3MUZBMzk0OCksICgweEM1QkZEMjMyKSwgKDB4NzFDQzU2MUUpLCAoMHhDNTY2NUY5QiksICgweDcxOUUyQ0RFKSwgKDB4QzUwRDExNjQpLCAoMHg3MTZGQkQ2QyksICgweEM0QjNFNzUxKSwgKDB4NzE0MTA4MDApLCAoMHhDNDVBRTFEMSksICgweDcxMTIwQ0I3KSwgKDB4QzQwMjAxMUMpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NzBCMzQ1MjMpLCAoMHhDMzUwQUYyNiksCisvLygweDcwODM3OEY0KSwgKDB4QzJGODNFMUIpLCAoMHg3MDUzNjc3QyksICgweEMyOUZGMkVDKSwgKDB4NzAyMzEwOUMpLCAoMHhDMjQ3Q0Q2MiksICgweDZGRjI3NDkwKSwgKDB4QzFFRkNERUEpLCAoMHg2RkMxOTM3NiksICgweEMxOTdGNEJCKSwgKDB4NkY5MDZENkIpLCAoMHhDMTQwNDIwQSksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RjJENTM0MCksICgweEMwOTE1MTZFKSwgKDB4NkVGQjVGMUQpLCAoMHhDMDNBMTM3RSksCisvLygweDZFQzkyNjg0KSwgKDB4QkZFMkZDRTUpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkU2M0U4NkUpLCAoMHhCRjM1NDY4RSksICgweDZFMzBFMzJGKSwgKDB4QkVERUE3M0EpLCAoMHg2REZEOUEzOCksICgweEJFODgzMDgyKSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksICgweDZEOTYzQzVEKSwgKDB4QkREQkJCOTIpLCAoMHg2RDYyMjdGQSksICgweEJEODVCRTMzKSwgKDB4NkQyREQwMUUpLCAoMHhCRDJGRTlENSksCisvLygweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2Q0M0NTY3QSksICgweEJDODRCQ0YyKSwgKDB4NkM4RjM1MzgpLCAoMHhCQzJGNjU0NCksICgweDZDNTlEMEJDKSwgKDB4QkJEQTM2RkQpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkJFRTNGNjEpLCAoMHhCQjMwNThDMSksICgweDZCQjgxMkM1KSwgKDB4QkFEQkE5MzQpLCAoMHg2QjgxQTNCNyksICgweEJBODcyNDRFKSwgKDB4NkI0QUYyNTgpLCAoMHhCQTMyQ0E0MiksCisvLygweDZCMTNGRjExKSwgKDB4QjlERTlCQjApLCAoMHg2QURDQzk3NiksICgweEI5OEE5N0Y2KSwgKDB4NkFBNTUxRjApLCAoMHhCOTM2QkZCMiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2QTM1OURBQyksICgweEI4OEY5MjVCKSwgKDB4NjlGRDYxMzIpLCAoMHhCODNDM0RCMSksICgweDY5QzRFMzU4KSwgKDB4QjdFOTE1NEEpLCAoMHg2OThDMjQ4NyksICgweEI3OTYxOUM2KSwgKDB4Njk1MzI0NTMpLCAoMHhCNzQzNEE4MiksCisvLygweDY5MTlFMzI2KSwgKDB4QjZGMEE4MUQpLCAoMHg2OEUwNjEyNSksICgweEI2OUUzMkM5KSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY4NkM5QjMxKSwgKDB4QjVGOUQwMjEpLCAoMHg2ODMyNTc4NiksICgweEI1QTdFMzMxKSwgKDB4NjdGN0QzREYpLCAoMHhCNTU2MjQ4NiksICgweDY3QkQwRkNDKSwgKDB4QjUwNDkzODApLCAoMHg2NzgyMEJCQiksICgweEI0QjMzMEJDKSwgKDB4Njc0NkM3RDEpLCAoMHhCNDYxRkM2QSksCisvLygweDY3MEI0NDMyKSwgKDB4QjQxMEY2QkUpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjY5MzdFQjUpLCAoMHhCMzZGNzg4MyksICgweDY2NTczQ0Q1KSwgKDB4QjMxRUZGRjApLCAoMHg2NjFBQkJEMyksICgweEIyQ0VCNkNCKSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksICgweDY1QTBGRDAzKSwgKDB4QjIyRUIzOEEpLCAoMHg2NTYzQkY3RSksICgweEIxREVGOUQyKSwgKDB4NjUyNjQzNkYpLCAoMHhCMThGNzA0QiksCisvLygweDY0RTg4OTRBKSwgKDB4QjE0MDE3OEMpLCAoMHg2NEFBOTA5OCksICgweEIwRjBFRUZDKSwgKDB4NjQ2QzU5Q0MpLCAoMHhCMEExRjczMCksICgweDY0MkRFNTBGKSwgKDB4QjA1MzMwNUEpLCAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjNCMDQyNTcpLCAoMHhBRkI2MzY0RSksICgweDYzNzExNEFCKSwgKDB4QUY2ODAzN0IpLCAoMHg2MzMxQTlGOCksICgweEFGMUEwMkMxKSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksCisvLygweDYyQjIxQzg3KSwgKDB4QUU3RTk2NkMpLCAoMHg2MjcxRkE2OSksICgweEFFMzEyQjk0KSwgKDB4NjIzMTlCOTEpLCAoMHhBREUzRjMzMyksICgweDYxRjEwMDI3KSwgKDB4QUQ5NkVENzcpLCAoMHg2MUIwMjg1MiksICgweEFENEExQTkyKSwgKDB4NjE2RjE0OEUpLCAoMHhBQ0ZEN0IxMyksICgweDYxMkRDNDVEKSwgKDB4QUNCMTBFNjcpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwgKDB4NjBBQTcwNEUpLCAoMHhBQzE4Q0Y2OSksCisvLygweDYwNjg2Q0MwKSwgKDB4QUJDQ0ZENzUpLCAoMHg2MDI2MkRCQiksICgweEFCODE1RjcxKSwgKDB4NUZFM0IzNjYpLCAoMHhBQjM1RjU4QyksICgweDVGQTBGRTQwKSwgKDB4QUFFQUMwNTQpLCAoMHg1RjVFMERDOCksICgweEFBOUZCRjM4KSwgKDB4NUYxQUUyN0MpLCAoMHhBQTU0RjJDNiksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1RTkzREMwRSksICgweEE5QkZGODk5KSwgKDB4NUU1MDAxNDApLCAoMHhBOTc1Q0IzOSksCisvLygweDVFMEJFQzQ0KSwgKDB4QTkyQkQzM0MpLCAoMHg1REM3OUQ5QyksICgweEE4RTIxMTJDKSwgKDB4NUQ4MzE0QzQpLCAoMHhBODk4ODQ3QiksICgweDVEM0U1MjNFKSwgKDB4QTg0RjJEQjQpLCAoMHg1Q0Y5NTYzMiksICgweEE4MDYwRDA1KSwgKDB4NUNCNDIwQ0QpLCAoMHhBN0JEMjI5QSksICgweDVDNkVCMjM4KSwgKDB4QTc3NDZFQTIpLCAoMHg1QzI5MEFBMCksICgweEE3MkJGMTQ4KSwgKDB4NUJFMzJBODYpLCAoMHhBNkUzQUIxNSksCisvLygweDVCOUQxMTY2KSwgKDB4QTY5QjlCN0QpLCAoMHg1QjU2QkZDMiksICgweEE2NTNDMzBBKSwgKDB4NUIxMDM1QzcpLCAoMHhBNjBDMjFFOCksICgweDVBQzk3M0EwKSwgKDB4QTVDNEI4NDMpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NUEzQjQ3RDYpLCAoMHhBNTM2OEM3OCksICgweDU5RjNERTMwKSwgKDB4QTRFRkNBNTEpLCAoMHg1OUFDM0QwRSksICgweEE0QTk0MDU2KSwgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksCisvLygweDU5MUM1NTA0KSwgKDB4QTQxQ0Q1OTEpLCAoMHg1OEQ0MEU3NSksICgweEEzRDZGNTFGKSwgKDB4NTg4QjkxMUIpLCAoMHhBMzkxNEQ4NyksICgweDU4NDJERDdFKSwgKDB4QTM0QkRGNEIpLCAoMHg1N0Y5RjMxNCksICgweEEzMDZBOUU1KSwgKDB4NTdCMEQyNjUpLCAoMHhBMkMxQUREQSksICgweDU3Njc3QjlFKSwgKDB4QTI3Q0VCNTMpLCAoMHg1NzFERUVFRCksICgweEEyMzg2MjdCKSwgKDB4NTZENDJDN0YpLCAoMHhBMUY0MTM3QyksCisvLygweDU2OEEzNDgyKSwgKDB4QTFBRkZFODEpLCAoMHg1NjQwMDc4MSksICgweEExNkMyNDA5KSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksICgweDU1QUIwRDU0KSwgKDB4QTBFNTFEOUIpLCAoMHg1NTYwNDBFMiksICgweEEwQTFGMjRGKSwgKDB4NTUxNTNGQzYpLCAoMHhBMDVGMDFENyksICgweDU0Q0EwQTJFKSwgKDB4QTAxQzRDNUMpLCAoMHg1NDdFQTA0OSksICgweDlGRDlEMjA3KSwgKDB4NTQzMzAyQTUpLCAoMHg5Rjk3OTM1NiksCisvLygweDUzRTczMEIxKSwgKDB4OUY1NThGQzkpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTM0RUYxQjMpLCAoMHg5RUQyM0JCOSksICgweDUzMDI4NTA3KSwgKDB4OUU5MEVCODgpLCAoMHg1MkI1RTUyNiksICgweDlFNEZENzcxKSwgKDB4NTI2OTEyNDEpLCAoMHg5RTBFRkY5RCksICgweDUyMUMwQ0U4KSwgKDB4OURDRTY0ODUpLCAoMHg1MUNFRDQ4NiksICgweDlEOEUwNUFEKSwgKDB4NTE4MTY5QUUpLCAoMHg5RDRERTM4RiksCisvLygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg1MEU1RkQ1OSksICgweDlDQ0U1NjFFKSwgKDB4NTA5N0ZDM0MpLCAoMHg5QzhFRUIxQSksICgweDUwNDlDOTY4KSwgKDB4OUM0RkJENkUpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEZBQ0NGQzEpLCAoMHg5QkQyMUIwNiksICgweDRGNUUwOEVCKSwgKDB4OUI5M0E2NDkpLCAoMHg0RjBGMTExRiksICgweDlCNTU2RjdFKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksCisvLygweDRFNzA4RjZCKSwgKDB4OUFEOUJDNTcpLCAoMHg0RTIxMDVFNCksICgweDlBOUM0MDQ4KSwgKDB4NEREMTRDOTEpLCAoMHg5QTVGMDMxMiksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0RDMxNDk1MSksICgweDk5RTU0NDQxKSwgKDB4NENFMTAwMkIpLCAoMHg5OUE4QzM0MCksICgweDRDOTA4Nzk5KSwgKDB4OTk2QzgxNUYpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NEJFRjA5NUUpLCAoMHg5OEY0QkJFMiksCisvLygweDRCOUUwM0IxKSwgKDB4OThCOTM4NDMpLCAoMHg0QjRDQ0Y2MCksICgweDk4N0RGNDU5KSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDRBQTlEQjk2KSwgKDB4OTgwODJDMzUpLCAoMHg0QTU4MUM4MyksICgweDk3Q0RBODQ0KSwgKDB4NEEwNjJGOTMpLCAoMHg5NzkzNjQ5OSksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0OTYxQ0Q1MyksICgweDk3MUY5RUVGKSwgKDB4NDkwRjU3RkYpLCAoMHg5NkU2MUNFRCksCisvLygweDQ4QkNCNTlBKSwgKDB4OTZBQ0RCQzEpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwgKDB4NDgxNkVBNjgpLCAoMHg5NjNCMUM3MyksICgweDQ3QzNDMjAyKSwgKDB4OTYwMjlFOTkpLCAoMHg0NzcwNkRDMSksICgweDk1Q0E2MjY3KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ2Qzk0MDZCKSwgKDB4OTU1QUFFMjMpLCAoMHg0Njc1NjgyNyksICgweDk1MjMzNjlEKSwgKDB4NDYyMTY0NkMpLCAoMHg5NEVDMDEwMiksCisvLygweDQ1Q0QzNTZGKSwgKDB4OTRCNTBENzQpLCAoMHg0NTc4REI2MyksICgweDk0N0U1QzE2KSwgKDB4NDUyNDU2RTkpLCAoMHg5NDQ3RUQ0RCksICgweDQ0Q0ZBNzVDKSwgKDB4OTQxMUMwQjEpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDQyNUM5MjApLCAoMHg5M0E2MkY1NyksICgweDQzRDA5QUQ5KSwgKDB4OTM3MENBREEpLCAoMHg0MzdCNDJCRSksICgweDkzM0JBOTU0KSwgKDB4NDMyNUMxMDIpLCAoMHg5MzA2Q0FFNyksCisvLygweDQyRDAxNURCKSwgKDB4OTJEMjJGQjEpLCAoMHg0MjdBNDE3RCksICgweDkyOUREN0Q1KSwgKDB4NDIyNDQ0MUQpLCAoMHg5MjY5QzM3MiksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHg0MTc3RDAwOSksICgweDkyMDI2NjFCKSwgKDB4NDEyMTU4RTMpLCAoMHg5MUNGMUNFMyksICgweDQwQ0FCOTkwKSwgKDB4OTE5QzE3QTQpLCAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwgKDB4NDAxRDAzMzkpLCAoMHg5MTM2RDk4RCksCisvLygweDNGQzVFQ0EwKSwgKDB4OTEwNEEwRjQpLCAoMHgzRjZFQUVCMCksICgweDkwRDJBQ0QxKSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNFQkZCREE0KSwgKDB4OTA2RjkyNjcpLCAoMHgzRTY4MEFGMyksICgweDkwM0U2QzVEKSwgKDB4M0UxMDMxQzQpLCAoMHg5MDBEOEI0MyksICgweDNEQjgzMjRDKSwgKDB4OEZEQ0VGMzcpLCAoMHgzRDYwMENDMSksICgweDhGQUM5ODU3KSwgKDB4M0QwN0MyM0MpLCAoMHg4RjdDODczQSksCisvLygweDNDQUY1MTMwKSwgKDB4OEY0Q0JCMEIpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4M0JGREZGMDIpLCAoMHg4RUVERjM1OSksICgweDNCQTUxRTREKSwgKDB4OEVCRUY4MTApLCAoMHgzQjRDMThDRSksICgweDhFOTA0MkE0KSwgKDB4M0FGMkVFQkEpLCAoMHg4RTYxRDMzMSksICgweDNBOTlBMDRBKSwgKDB4OEUzM0E5RDUpLCAoMHgzQTQwMkRCNCksICgweDhFMDVDNkFBKSwgKDB4MzlFNjk3MkYpLCAoMHg4REQ4MjlDRSksCisvLygweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzOTMyRkYzNyksICgweDhEN0RDMzczKSwgKDB4MzhEOEZFMzIpLCAoMHg4RDUwRkEyQiksICgweDM4N0VEQTFDKSwgKDB4OEQyNDc3QTIpLCAoMHgzODI0OTQxMyksICgweDhDRjgzQzYyKSwgKDB4MzdDQTJBODIpLCAoMHg4Q0NDNDdBNyksICgweDM3NkY5RTg4KSwgKDB4OENBMDk5RkIpLCAoMHgzNzE0RjA1QiksICgweDhDNzUzMzdCKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksCisvLygweDM2NUYyRTRCKSwgKDB4OEMxRjNDNjYpLCAoMHgzNjA0MUFENyksICgweDhCRjRBQzA2KSwgKDB4MzVBOEU2MTIpLCAoMHg4QkNBNjMzQyksICgweDM1NEQ5MDMzKSwgKDB4OEJBMDYyMjEpLCAoMHgzNEYyMTk3MyksICgweDhCNzZBOENFKSwgKDB4MzQ5NjgyMEEpLCAoMHg4QjREMzc1RiksICgweDM0M0FDQTMwKSwgKDB4OEIyNDBERUMpLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwgKDB4MzM4MkZBRjkpLCAoMHg4QUQyOTNDNyksCisvLygweDMzMjZFMzIzKSwgKDB4OEFBQTQyRTApLCAoMHgzMkNBQUJCRSksICgweDhBODIzQTVBKSwgKDB4MzI2RTU1MDUpLCAoMHg4QTVBN0E0RCksICgweDMyMTFERjMxKSwgKDB4OEEzMzAyRDMpLCAoMHgzMUI1NEE3OSksICgweDhBMEJENDAzKSwgKDB4MzE1ODk3MTgpLCAoMHg4OUU0RURGNSksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgzMDlFRDUzRSksICgweDg5OTdGQzgyKSwgKDB4MzA0MUM3MzcpLCAoMHg4OTcxRjE0QiksCisvLygweDJGRTQ5QjZDKSwgKDB4ODk0QzJGMzYpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwgKDB4MkYyOUVCNkUpLCAoMHg4OTAxODZDRSksICgweDJFQ0M2N0FGKSwgKDB4ODhEQ0EwQTkpLCAoMHgyRTZFQzgwMCksICgweDg4QjgwNDVFKSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksICgweDJEQjMzMTEyKSwgKDB4ODg2RkE3RTEpLCAoMHgyRDU1M0IzNSksICgweDg4NEJFODM4KSwgKDB4MkNGNzI5NjIpLCAoMHg4ODI4NzI2NiksCisvLygweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQzNBQjJCRiksICgweDg3RTI2NDlGKSwgKDB4MkJEQzRFNjMpLCAoMHg4N0JGQ0NENSksICgweDJCN0RDRUZBKSwgKDB4ODc5RDdGMzgpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MkFDMDdGRTUpLCAoMHg4NzU5QzJEQSksICgweDJBNjFCMEFGKSwgKDB4ODczODU0NDMpLCAoMHgyQTAyQzc1NCksICgweDg3MTczMDJEKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksCisvLygweDI5NDRBODBEKSwgKDB4ODZENUM4MjgpLCAoMHgyOEU1NzFBMyksICgweDg2QjU4NDBFKSwgKDB4Mjg4NjIyMDApLCAoMHg4Njk1OEFDNSksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyN0M3MzdGNyksICgweDg2NTY3OEY4KSwgKDB4Mjc2NzlFMDYpLCAoMHg4NjM3NjA5QSksICgweDI3MDdFQkM3KSwgKDB4ODYxODkzNUIpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjY0ODNGNDkpLCAoMHg4NURCREE4OCksCisvLygweDI1RTg0NTgxKSwgKDB4ODVCREVGMTkpLCAoMHgyNTg4MzQ1NiksICgweDg1QTA0RjE0KSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDI0QzdDQ0M4KSwgKDB4ODU2NUYxOTIpLCAoMHgyNDY3NzdEMCksICgweDg1NDkzNDgyKSwgKDB4MjQwNzBCNkUpLCAoMHg4NTJDQzJEQSksICgweDIzQTY4OEQzKSwgKDB4ODUxMDlDRjcpLCAoMHgyMzQ1RjAzQiksICgweDg0RjRDMkU4KSwgKDB4MjJFNTQxRTApLCAoMHg4NEQ5MzRDMCksCisvLygweDIyODQ3REZGKSwgKDB4ODRCREYyOTApLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MjFDMkI2OTcpLCAoMHg4NDg4NTI1OCksICgweDIxNjFCMzg5KSwgKDB4ODQ2REY0NzIpLCAoMHgyMTAwOUJFMyksICgweDg0NTNFMkM1KSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksICgweDIwM0UyRkMwKSwgKDB4ODQyMEE0NTkpLCAoMHgxRkRDREJCQiksICgweDg0MDc3N0I5KSwgKDB4MUY3Qjc0MEYpLCAoMHg4M0VFOTc5MiksCisvLygweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLCAoMHgxRUI4NkJBOSksICgweDgzQkRCRDI4KSwgKDB4MUU1NkNBNkUpLCAoMHg4M0E1QzJDNSksICgweDFERjUxNjdEKSwgKDB4ODM4RTE1MTgpLCAoMHgxRDkzNTAxMSksICgweDgzNzZCNDJFKSwgKDB4MUQzMTc3NjcpLCAoMHg4MzVGQTAxNyksICgweDFDQ0Y4Q0JCKSwgKDB4ODM0OEQ4REYpLCAoMHgxQzZEOTA0OSksICgweDgzMzI1RTk2KSwgKDB4MUMwQjgyNEUpLCAoMHg4MzFDMzE0QSksCisvLygweDFCQTk2MzA2KSwgKDB4ODMwNjUxMDcpLCAoMHgxQjQ3MzJBRSksICgweDgyRjBCRERCKSwgKDB4MUFFNEYxODIpLCAoMHg4MkRCNzdENSksICgweDFBODI5RkMwKSwgKDB4ODJDNjdGMDApLCAoMHgxQTIwM0RBMyksICgweDgyQjFEMzZBKSwgKDB4MTlCRENDNjMpLCAoMHg4MjlENzU1MyksICgweDE5NUI0QTQ4KSwgKDB4ODI4OTY0NjApLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MTg5NjE3NjEpLCAoMHg4MjYyMkFCMyksCisvLygweDE4MzM2NzEwKSwgKDB4ODI0RjAyMTEpLCAoMHgxN0QwQTdEMSksICgweDgyM0MyNkY4KSwgKDB4MTc2REQ5RTEpLCAoMHg4MjI5OTk3NCksICgweDE3MEFGRDdEKSwgKDB4ODIxNzU5OEUpLCAoMHgxNkE4MTJFMyksICgweDgyMDU2NzU0KSwgKDB4MTY0NTFBNEUpLCAoMHg4MUYzQzJDRiksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxNTdGMDAyRCksICgweDgxRDE2MzEzKSwgKDB4MTUxQkRGMTkpLCAoMHg4MUMwQTdGMSksCisvLygweDE0QjhCMTAxKSwgKDB4ODFCMDNBQUYpLCAoMHgxNDU1NzcxRCksICgweDgxQTAxQjgwKSwgKDB4MTNGMjJGQjEpLCAoMHg4MTkwNEExQyksICgweDEzOEVEQkY4KSwgKDB4ODE4MEM2QjYpLCAoMHgxMzJCN0MyRSksICgweDgxNzE5MTU4KSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDEyNjQ5OTVEKSwgKDB4ODE1NDEwRDgpLCAoMHgxMjAxMTZEMiksICgweDgxNDVDNUM4KSwgKDB4MTE5RDg5MkIpLCAoMHg4MTM3QzhFNSksCisvLygweDExMzlGMEE3KSwgKDB4ODEyQTFBMzYpLCAoMHgxMEQ2NEQ4MiksICgweDgxMUNCOUM0KSwgKDB4MTA3MjlGRkIpLCAoMHg4MTBGQTc5OCksICgweDEwMEVFODRFKSwgKDB4ODEwMkUzQjkpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEY0NzVDNzgpLCAoMHg4MEVBNDcyMiksICgweDBFRTM4N0NEKSwgKDB4ODBERTZFNUEpLCAoMHgwRTdGQTlGMiksICgweDgwRDJFM0ZEKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksCisvLygweDBEQjdEM0E1KSwgKDB4ODBCQ0JBQTMpLCAoMHgwRDUzREJBRiksICgweDgwQjIxQkI0KSwgKDB4MENFRkRCODApLCAoMHg4MEE3Q0I0QyksICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwQzI3QzM2RSksICgweDgwOTQxNjJCKSwgKDB4MEJDM0FDMDcpLCAoMHg4MDhBQjE3RSksICgweDBCNUY4RDVGKSwgKDB4ODA4MTlCNzApLCAoMHgwQUZCNjdCMiksICgweDgwNzhENDA3KSwgKDB4MEE5NzNCM0YpLCAoMHg4MDcwNUI0OSksCisvLygweDBBMzMwODQ0KSwgKDB4ODA2ODMxM0IpLCAoMHgwOUNFQ0ZGRSksICgweDgwNjA1NUY1KSwgKDB4MDk2QTkwQUIpLCAoMHg4MDU4Qzk1NSksICgweDA5MDY0QjhBKSwgKDB4ODA1MThCNzIpLCAoMHgwOEEyMDBENyksICgweDgwNEE5QzUzKSwgKDB4MDgzREIwRDEpLCAoMHg4MDQzRkJGQSksICgweDA3RDk1QkI2KSwgKDB4ODAzREFBNkQpLCAoMHgwNzc1MDFDMyksICgweDgwMzdBN0FFKSwgKDB4MDcxMEEzMzcpLCAoMHg4MDMxRjNDMyksCisvLygweDA2QUM0MDRGKSwgKDB4ODAyQzhFQUQpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4MDVFMzZFNjMpLCAoMHg4MDIyQjExMiksICgweDA1N0VGRkRDKSwgKDB4ODAxRTM4OTIpLCAoMHgwNTFBOERGMSksICgweDgwMUEwRUY1KSwgKDB4MDRCNjE4REYpLCAoMHg4MDE2MzQzRCksICgweDA0NTFBMUU2KSwgKDB4ODAxMkE4NzUpLCAoMHgwM0VEMjc0MyksICgweDgwMEY2QjhEKSwgKDB4MDM4OEFBMzMpLCAoMHg4MDBDN0Q5MCksCisvLygweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMkJGQTlDOSksICgweDgwMDc4RTYxKSwgKDB4MDI1QjI2RTkpLCAoMHg4MDA1OEQzMSksICgweDAxRjZBMjk2KSwgKDB4ODAwM0RBRjIpLCAoMHgwMTkyMUQwQyksICgweDgwMDI3N0E3KSwgKDB4MDEyRDk2OEIpLCAoMHg4MDAxNjM0RiksICgweDAwQzkwRjRGKSwgKDB4ODAwMDlERUIpLCAoMHgwMDY0ODc5NyksICgweDgwMDAyNzdDKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksCisvLygweEZGOUI3N0FEKSwgKDB4ODAwMDI3N0MpLCAoMHhGRjM2RjBGNSksICgweDgwMDA5REVCKSwgKDB4RkVEMjY5QkEpLCAoMHg4MDAxNjM0RSksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGRTA5NURBRiksICgweDgwMDNEQUYxKSwgKDB4RkRBNEQ5NUIpLCAoMHg4MDA1OEQyRiksICgweEZENDA1NjdDKSwgKDB4ODAwNzhFNUYpLCAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkM3NzU2MTEpLCAoMHg4MDBDN0Q4RSksCisvLygweEZDMTJEOTAyKSwgKDB4ODAwRjZCOEEpLCAoMHhGQkFFNUU1RSksICgweDgwMTJBODcyKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEZBRTU3MTU0KSwgKDB4ODAxQTBFRkQpLCAoMHhGQTgwRkY2OSksICgweDgwMUUzODlBKSwgKDB4RkExQzkwRTEpLCAoMHg4MDIyQjExQiksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGOTUzQkZGNiksICgweDgwMkM4RUE5KSwgKDB4RjhFRjVEMEUpLCAoMHg4MDMxRjNCRiksCisvLygweEY4OEFGRTgxKSwgKDB4ODAzN0E3QUEpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4RjdDMjRGNzMpLCAoMHg4MDQzRkJGNiksICgweEY3NURGRjZEKSwgKDB4ODA0QTlDNEUpLCAoMHhGNkY5QjRCQiksICgweDgwNTE4QjZFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEY2MzEzMDQ2KSwgKDB4ODA2MDU1RjApLCAoMHhGNUNDRjcwMSksICgweDgwNjgzMTRBKSwgKDB4RjU2OEM0MDUpLCAoMHg4MDcwNUI1OSksCisvLygweEY1MDQ5NzkzKSwgKDB4ODA3OEQ0MTgpLCAoMHhGNEEwNzFFNiksICgweDgwODE5QjgxKSwgKDB4RjQzQzU0M0QpLCAoMHg4MDhBQjE3NyksICgweEYzRDgzQ0Q2KSwgKDB4ODA5NDE2MjQpLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjMxMDI0QzQpLCAoMHg4MEE3Q0I0NSksICgweEYyQUMyNDk1KSwgKDB4ODBCMjFCQUQpLCAoMHhGMjQ4MkM5RiksICgweDgwQkNCQTlDKSwgKDB4RjFFNDNEMUUpLCAoMHg4MEM3QTgwQyksCisvLygweEYxODA1NjUyKSwgKDB4ODBEMkUzRjUpLCAoMHhGMTFDNzg3NyksICgweDgwREU2RTUyKSwgKDB4RjBCOEEzQ0MpLCAoMHg4MEVBNDcxQSksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLCAoMHhFRkYxMTZGOCksICgweDgxMDJFM0QxKSwgKDB4RUY4RDVGNEIpLCAoMHg4MTBGQTdCMCksICgweEVGMjlCMkMyKSwgKDB4ODExQ0I5QkIpLCAoMHhFRUM2MEY5RCksICgweDgxMkExQTJEKSwgKDB4RUU2Mjc3MTgpLCAoMHg4MTM3QzhEQiksCisvLygweEVERkVFOTcyKSwgKDB4ODE0NUM1QkUpLCAoMHhFRDlCNjZFNiksICgweDgxNTQxMENFKSwgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVDRDQ4NDE2KSwgKDB4ODE3MTkxNEQpLCAoMHhFQzcxMjQ0QyksICgweDgxODBDNkFCKSwgKDB4RUMwREQwOTIpLCAoMHg4MTkwNEExMSksICgweEVCQUE4OTI3KSwgKDB4ODFBMDFCNzUpLCAoMHhFQjQ3NEU0NiksICgweDgxQjAzQUNEKSwgKDB4RUFFNDIwMkQpLCAoMHg4MUMwQTgxMCksCisvLygweEVBODBGRjFBKSwgKDB4ODFEMTYzMzMpLCAoMHhFQTFERUI0QSksICgweDgxRTI2QzJDKSwgKDB4RTlCQUU1RjUpLCAoMHg4MUYzQzJDMyksICgweEU5NTdFRDYxKSwgKDB4ODIwNTY3NDgpLCAoMHhFOEY1MDJDNiksICgweDgyMTc1OTgyKSwgKDB4RTg5MjI2NjIpLCAoMHg4MjI5OTk2NyksICgweEU4MkY1ODcyKSwgKDB4ODIzQzI2RUMpLCAoMHhFN0NDOTkzMyksICgweDgyNEYwMjA0KSwgKDB4RTc2OUU4RTIpLCAoMHg4MjYyMkFBNiksCisvLygweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFNkE0QjVGQiksICgweDgyODk2NDUyKSwgKDB4RTY0MjMzRTApLCAoMHg4MjlENzU0NSksICgweEU1REZDMUE1KSwgKDB4ODJCMUQzOTApLCAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTUxQjBEQzYpLCAoMHg4MkRCNzdGQyksICgweEU0QjhDQzlCKSwgKDB4ODJGMEJFMDMpLCAoMHhFNDU2OUQzRCksICgweDgzMDY1MEY4KSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksCisvLygweEUzOTI2RkZBKSwgKDB4ODMzMjVFODcpLCAoMHhFMzMwNzM4OCksICgweDgzNDhEOEQwKSwgKDB4RTJDRTg4REIpLCAoMHg4MzVGQTAwNyksICgweEUyNkNCMDMxKSwgKDB4ODM3NkI0MUUpLCAoMHhFMjBBRTlDNSksICgweDgzOEUxNTA4KSwgKDB4RTFBOTM1RDQpLCAoMHg4M0E1QzJCNSksICgweEUxNDc5NDlBKSwgKDB4ODNCREJEMTcpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4RTA4NDhCM0IpLCAoMHg4M0VFOTdDMCksCisvLygweEUwMjMyMzhGKSwgKDB4ODQwNzc3RTgpLCAoMHhERkMxQ0Y4QSksICgweDg0MjBBNDg4KSwgKDB4REY2MDhGNjkpLCAoMHg4NDNBMUQ5MiksICgweERFRkY2NDVGKSwgKDB4ODQ1M0UyQjQpLCAoMHhERTlFNENCOSksICgweDg0NkRGNDYwKSwgKDB4REUzRDQ5QUIpLCAoMHg4NDg4NTI0NiksICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhERDdCODI0MyksICgweDg0QkRGMjdFKSwgKDB4REQxQUJFNjIpLCAoMHg4NEQ5MzRBRSksCisvLygweERDQkExMDA3KSwgKDB4ODRGNEMyRDYpLCAoMHhEQzU5Nzc2RSksICgweDg1MTA5Q0U0KSwgKDB4REJGOEY0RDMpLCAoMHg4NTJDQzJDNyksICgweERCOTg4ODcyKSwgKDB4ODU0OTM0NkUpLCAoMHhEQjM4MzI4NSksICgweDg1NjVGMUM4KSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweERBNzdDQUY2KSwgKDB4ODVBMDRGNEIpLCAoMHhEQTE3QkFDMSksICgweDg1QkRFRjA1KSwgKDB4RDlCN0MwRjgpLCAoMHg4NURCREE3MyksCisvLygweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEOEY4MTQ3QSksICgweDg2MTg5MzQ2KSwgKDB4RDg5ODYyM0IpLCAoMHg4NjM3NjA4NSksICgweEQ4MzhDODRBKSwgKDB4ODY1Njc4RTMpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwgKDB4RDc3OURFNDEpLCAoMHg4Njk1OEFCMCksICgweEQ3MUE4RTlEKSwgKDB4ODZCNTgzRjgpLCAoMHhENkJCNTgzNCksICgweDg2RDVDODEyKSwgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksCisvLygweEQ1RkQzN0ZCKSwgKDB4ODcxNzMwNkIpLCAoMHhENTlFNEVBMCksICgweDg3Mzg1NDgxKSwgKDB4RDUzRjdGNkEpLCAoMHg4NzU5QzMxOSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhENDgyMzE0NyksICgweDg3OUQ3RjIwKSwgKDB4RDQyM0IxREQpLCAoMHg4N0JGQ0NCRCksICgweEQzQzU0RDgyKSwgKDB4ODdFMjY0ODgpLCAoMHhEMzY3MDQ2RiksICgweDg4MDU0NjZBKSwgKDB4RDMwOEQ2REUpLCAoMHg4ODI4NzI0RiksCisvLygweEQyQUFDNTBBKSwgKDB4ODg0QkU4MjApLCAoMHhEMjRDQ0YyRCksICgweDg4NkZBN0M4KSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQxOTEzODNGKSwgKDB4ODhCODA0NDYpLCAoMHhEMTMzOTdBMiksICgweDg4RENBMEVFKSwgKDB4RDBENjEzRTMpLCAoMHg4OTAxODcxMyksICgweEQwNzhBRDNDKSwgKDB4ODkyNkI2QTApLCAoMHhEMDFCNjNFNiksICgweDg5NEMyRjdEKSwgKDB4Q0ZCRTM5MDgpLCAoMHg4OTcxRjEzMiksCisvLygweENGNjEyQjAxKSwgKDB4ODk5N0ZDNjgpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0VBNzY5MjcpLCAoMHg4OUU0RUREQiksICgweENFNEFCNUM2KSwgKDB4OEEwQkQzRTgpLCAoMHhDREVFMjEwRSksICgweDhBMzMwMkI4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksICgweENEMzU1NDgwKSwgKDB4OEE4MjNBM0YpLCAoMHhDQ0Q5MUQxQyksICgweDhBQUE0MkM1KSwgKDB4Q0M3RDA1NDUpLCAoMHg4QUQyOTNBQyksCisvLygweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLCAoMHhDQkM1MzUyNCksICgweDhCMjQwRTM4KSwgKDB4Q0I2OTdENEIpLCAoMHg4QjREMzdBQyksICgweENCMERFNkNCKSwgKDB4OEI3NkE4QjIpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4Q0E1NzFBMkMpLCAoMHg4QkNBNjMxRiksICgweEM5RkJFNTY3KSwgKDB4OEJGNEFCRTkpLCAoMHhDOUEwRDFGMyksICgweDhDMUYzQzQ5KSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksCisvLygweEM4RUIwRkUzKSwgKDB4OEM3NTMzNUQpLCAoMHhDODkwNjFCNiksICgweDhDQTA5OURFKSwgKDB4QzgzNUQ1QkIpLCAoMHg4Q0NDNDc4OSksICgweEM3REI2QzJBKSwgKDB4OENGODNDNDQpLCAoMHhDNzgxMjUzQiksICgweDhEMjQ3N0Y1KSwgKDB4QzcyNzAxMjYpLCAoMHg4RDUwRkE3RiksICgweEM2Q0QwMDIxKSwgKDB4OEQ3REMzQzcpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwgKDB4QzYxOTY4MkEpLCAoMHg4REQ4MkEyMyksCisvLygweEM1QkZEMUE1KSwgKDB4OEUwNUM2RkYpLCAoMHhDNTY2NUYwRiksICgweDhFMzNBQTJBKSwgKDB4QzUwRDEwOUYpLCAoMHg4RTYxRDM4OCksICgweEM0QjNFNjhDKSwgKDB4OEU5MDQyRkIpLCAoMHhDNDVBRTEwRCksICgweDhFQkVGODY4KSwgKDB4QzQwMjAwNTgpLCAoMHg4RUVERjNCMSksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMzUwQUZFRSksICgweDhGNENCQTcxKSwgKDB4QzJGODNFRTEpLCAoMHg4RjdDODZBMCksCisvLygweEMyOUZGMzdCKSwgKDB4OEZBQzk4MzYpLCAoMHhDMjQ3Q0RGMCksICgweDhGRENFRjE2KSwgKDB4QzFFRkNFNzgpLCAoMHg5MDBEOEIyMSksICgweEMxOTdGNTQ4KSwgKDB4OTAzRTZDM0IpLCAoMHhDMTQwNDI5OCksICgweDkwNkY5MjQ1KSwgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEMwOTE1MThCKSwgKDB4OTBEMkFDQUYpLCAoMHhDMDNBMTM5QiksICgweDkxMDRBMEQyKSwgKDB4QkZFMkZEMDIpLCAoMHg5MTM2RDk2QiksCisvLygweEJGOEMwREY2KSwgKDB4OTE2OTU2NUEpLCAoMHhCRjM1NDZBQiksICgweDkxOUMxNzgxKSwgKDB4QkVERUE3NTgpLCAoMHg5MUNGMUNDMCksICgweEJFODgzMDMyKSwgKDB4OTIwMjY1RjgpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkREQkJCNDIpLCAoMHg5MjY5QzNEMyksICgweEJEODVCREUyKSwgKDB4OTI5REQ4MzcpLCAoMHhCRDJGRTk4NSksICgweDkyRDIzMDEzKSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksCisvLygweEJDODRCQ0EyKSwgKDB4OTMzQkE5QjcpLCAoMHhCQzJGNjQ4NyksICgweDkzNzBDQjNEKSwgKDB4QkJEQTM2NDEpLCAoMHg5M0E2MkZCQiksICgweEJCODUzMjA1KSwgKDB4OTNEQkQ3MEUpLCAoMHhCQjMwNTgwNiksICgweDk0MTFDMTE2KSwgKDB4QkFEQkE4NzkpLCAoMHg5NDQ3RURCMyksICgweEJBODcyNTQyKSwgKDB4OTQ3RTVCQUIpLCAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwgKDB4QjlERTlDMzgpLCAoMHg5NEVDMDA5NyksCisvLygweEI5OEE5ODdEKSwgKDB4OTUyMzM2MzEpLCAoMHhCOTM2QzAzOSksICgweDk1NUFBREI2KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI4OEY5MkUyKSwgKDB4OTVDQTYxRkEpLCAoMHhCODNDM0UzNyksICgweDk2MDI5RTczKSwgKDB4QjdFOTE1RDApLCAoMHg5NjNCMUM0RCksICgweEI3OTYxOUUyKSwgKDB4OTY3M0RCNjYpLCAoMHhCNzQzNEE5RSksICgweDk2QUNEQjlBKSwgKDB4QjZGMEE4MzkpLCAoMHg5NkU2MUNDNiksCisvLygweEI2OUUzMkU1KSwgKDB4OTcxRjlFQzgpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjVGOUQwM0MpLCAoMHg5NzkzNjRCQyksICgweEI1QTdFMzREKSwgKDB4OTdDREE4NjcpLCAoMHhCNTU2MjQzOSksICgweDk4MDgyQzU4KSwgKDB4QjUwNDkzMzQpLCAoMHg5ODQyRjA2QiksICgweEI0QjMzMDcwKSwgKDB4OTg3REY0N0MpLCAoMHhCNDYxRkMxRiksICgweDk4QjkzODY2KSwgKDB4QjQxMEY2NzIpLCAoMHg5OEY0QkMwNiksCisvLygweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMzZGNzdEMSksICgweDk5NkM4MUQwKSwgKDB4QjMxRUZGM0YpLCAoMHg5OUE4QzNCMCksICgweEIyQ0VCNjFBKSwgKDB4OTlFNTQ0QjIpLCAoMHhCMjdFOUM5MiksICgweDlBMjIwNEIwKSwgKDB4QjIyRUIyREEpLCAoMHg5QTVGMDM4NCksICgweEIxREVGOTIyKSwgKDB4OUE5QzQxMDkpLCAoMHhCMThGNzEzMCksICgweDlBRDlCQkRGKSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksCisvLygweEIwRjBFRjdCKSwgKDB4OUI1NTZGMDQpLCAoMHhCMEExRjdBRiksICgweDlCOTNBNUNGKSwgKDB4QjA1MzMwRDgpLCAoMHg5QkQyMUE4QyksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRkI2MzZDRCksICgweDlDNEZCRDQzKSwgKDB4QUY2ODAzRjkpLCAoMHg5QzhFRUFFRiksICgweEFGMUEwMkRDKSwgKDB4OUNDRTU1RjMpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUU3RTk2ODYpLCAoMHg5RDRERTM2MyksCisvLygweEFFMzEyQkFFKSwgKDB4OUQ4RTA1ODEpLCAoMHhBREUzRjM0RCksICgweDlEQ0U2NDU5KSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFENEExQUFDKSwgKDB4OUU0RkQ3OTgpLCAoMHhBQ0ZEN0FDQyksICgweDlFOTBFQkFGKSwgKDB4QUNCMTBFMjApLCAoMHg5RUQyM0JFMCksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQzE4Q0YyMiksICgweDlGNTU4RkYwKSwgKDB4QUJDQ0ZEMkUpLCAoMHg5Rjk3OTM3RCksCisvLygweEFCODE1RjJBKSwgKDB4OUZEOUQyODMpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwgKDB4QUFFQUJGQUUpLCAoMHhBMDVGMDI1MyksICgweEFBOUZCRTkyKSwgKDB4QTBBMUYyQ0MpLCAoMHhBQTU0RjIyMSksICgweEEwRTUxRTE4KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE5QkZGN0Y1KSwgKDB4QTE2QzI0ODcpLCAoMHhBOTc1Q0MwRiksICgweEExQUZGREZDKSwgKDB4QTkyQkQ0MTEpLCAoMHhBMUY0MTJGNyksCisvLygweEE4RTIxMUEyKSwgKDB4QTIzODYxRjUpLCAoMHhBODk4ODRGMSksICgweEEyN0NFQUNEKSwgKDB4QTg0RjJFMkEpLCAoMHhBMkMxQUQ1MyksICgweEE4MDYwRDdBKSwgKDB4QTMwNkE5NUUpLCAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTc3NDZGMTcpLCAoMHhBMzkxNEQ1NyksICgweEE3MkJGMUJDKSwgKDB4QTNENkY0RjApLCAoMHhBNkUzQUIyRCksICgweEE0MUNENTYyKSwgKDB4QTY5QjlCOTYpLCAoMHhBNDYyRUU4MiksCisvLygweEE2NTNDMzIzKSwgKDB4QTRBOTQwMjYpLCAoMHhBNjBDMjIwMCksICgweEE0RUZDQTIxKSwgKDB4QTVDNEI4NUIpLCAoMHhBNTM2OEM0OCksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBNTM2OEMzNiksICgweEE1QzRCODZEKSwgKDB4QTRFRkNBMEYpLCAoMHhBNjBDMjIxMyksICgweEE0QTk0MDE0KSwgKDB4QTY1M0MzMzUpLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwgKDB4QTQxQ0Q1NTApLCAoMHhBNkUzQUIzRiksCisvLygweEEzRDZGNERFKSwgKDB4QTcyQkYxQ0YpLCAoMHhBMzkxNEQ0NiksICgweEE3NzQ2RjI5KSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksICgweEEzMDZBOTREKSwgKDB4QTgwNjBEOEQpLCAoMHhBMkMxQUQ0MiksICgweEE4NEYyRTNEKSwgKDB4QTI3Q0VBQkIpLCAoMHhBODk4ODUwNCksICgweEEyMzg2MUU0KSwgKDB4QThFMjExQjUpLCAoMHhBMUY0MTJFNiksICgweEE5MkJENDI0KSwgKDB4QTFBRkZGNDUpLCAoMHhBOTc1Q0FBOSksCisvLygweEExNkMyNDc2KSwgKDB4QTlCRkY4MDgpLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwgKDB4QTBFNTFFMDcpLCAoMHhBQTU0RjIzNCksICgweEEwQTFGMkJCKSwgKDB4QUE5RkJFQTUpLCAoMHhBMDVGMDI0MiksICgweEFBRUFCRkMxKSwgKDB4QTAxQzRDQzcpLCAoMHhBQjM1RjU1OSksICgweDlGRDlEMjcyKSwgKDB4QUI4MTVGM0UpLCAoMHg5Rjk3OTM2QyksICgweEFCQ0NGRDQxKSwgKDB4OUY1NThGREYpLCAoMHhBQzE4Q0YzNSksCisvLygweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLCAoMHg5RUQyM0JDRiksICgweEFDQjEwRTMzKSwgKDB4OUU5MEVCOUUpLCAoMHhBQ0ZEN0FERiksICgweDlFNEZENzg3KSwgKDB4QUQ0QTFBQzApLCAoMHg5RTBFRkZCMyksICgweEFEOTZFREE1KSwgKDB4OURDRTY0NDkpLCAoMHhBREUzRjM2MCksICgweDlEOEUwNTcxKSwgKDB4QUUzMTJCQzIpLCAoMHg5RDRERTM1MyksICgweEFFN0U5NjlBKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksCisvLygweDlDQ0U1NUUzKSwgKDB4QUYxQTAyRUYpLCAoMHg5QzhFRUFERiksICgweEFGNjgwNDBEKSwgKDB4OUM0RkJEMzMpLCAoMHhBRkI2MzZFMSksICgweDlDMTBDRDA1KSwgKDB4QjAwNDlCM0IpLCAoMHg5QkQyMUE3QyksICgweEIwNTMzMEVDKSwgKDB4OUI5M0E1QkYpLCAoMHhCMEExRjdDMyksICgweDlCNTU2RUY0KSwgKDB4QjBGMEVGOTApLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwgKDB4OUFEOUJEMDkpLCAoMHhCMThGNkZCMCksCisvLygweDlBOUM0MEY5KSwgKDB4QjFERUY5MzYpLCAoMHg5QTVGMDM3NSksICgweEIyMkVCMkVFKSwgKDB4OUEyMjA0QTEpLCAoMHhCMjdFOUNBNiksICgweDk5RTU0NEEzKSwgKDB4QjJDRUI2MkUpLCAoMHg5OUE4QzNBMSksICgweEIzMUVGRjU0KSwgKDB4OTk2QzgxQzApLCAoMHhCMzZGNzdFNSksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5OEY0QkJGNiksICgweEI0MTBGNjg3KSwgKDB4OThCOTM4NTcpLCAoMHhCNDYxRkMzMyksCisvLygweDk4N0RGNDZEKSwgKDB4QjRCMzMwODUpLCAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTgwODJDNDkpLCAoMHhCNTU2MjQ0RSksICgweDk3Q0RBODU4KSwgKDB4QjVBN0UzNjIpLCAoMHg5NzkzNjRBRCksICgweEI1RjlEMDUxKSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksICgweDk3MUY5RUI5KSwgKDB4QjY5RTMyRkEpLCAoMHg5NkU2MUNCOCksICgweEI2RjBBODRFKSwgKDB4OTZBQ0RCOEIpLCAoMHhCNzQzNEFCMyksCisvLygweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NjNCMUMzRiksICgweEI3RTkxNUU1KSwgKDB4OTYwMjlFNjQpLCAoMHhCODNDM0U0QyksICgweDk1Q0E2MUVCKSwgKDB4Qjg4RjkyRjcpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTU1QUFEQTgpLCAoMHhCOTM2QzA0RSksICgweDk1MjMzNjIzKSwgKDB4Qjk4QTk4OTMpLCAoMHg5NEVDMDA4OSksICgweEI5REU5QzREKSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksCisvLygweDk0N0U1Q0IzKSwgKDB4QkE4NzIzQTkpLCAoMHg5NDQ3RURBNSksICgweEJBREJBODhGKSwgKDB4OTQxMUMxMDkpLCAoMHhCQjMwNTgxQiksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5M0E2MkZBRCksICgweEJCREEzNjU3KSwgKDB4OTM3MENCMzApLCAoMHhCQzJGNjQ5RCksICgweDkzM0JBOUFBKSwgKDB4QkM4NEJDQjgpLCAoMHg5MzA2Q0IzQyksICgweEJDREEzRTc0KSwgKDB4OTJEMjMwMDYpLCAoMHhCRDJGRTk5QiksCisvLygweDkyOUREODI5KSwgKDB4QkQ4NUJERjgpLCAoMHg5MjY5QzNDNiksICgweEJEREJCQjU4KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkyMDI2NUVCKSwgKDB4QkU4ODMwNDgpLCAoMHg5MUNGMUNCMyksICgweEJFREVBNzZFKSwgKDB4OTE5QzE3NzQpLCAoMHhCRjM1NDZDMSksICgweDkxNjk1NjREKSwgKDB4QkY4QzBFMEMpLCAoMHg5MTM2RDk1RSksICgweEJGRTJGRDE4KSwgKDB4OTEwNEEwQzUpLCAoMHhDMDNBMTNCMiksCisvLygweDkwRDJBQ0EyKSwgKDB4QzA5MTUxQTIpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwgKDB4OTA2RjkyMzkpLCAoMHhDMTQwNDJBRSksICgweDkwM0U2QzJGKSwgKDB4QzE5N0Y1NUYpLCAoMHg5MDBEOEIxNSksICgweEMxRUZDRThFKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksICgweDhGQUM5ODI5KSwgKDB4QzI5RkYzOTEpLCAoMHg4RjdDODY5NCksICgweEMyRjgzRUY4KSwgKDB4OEY0Q0JBNjUpLCAoMHhDMzUwQjAwNCksCisvLygweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4RUVERjNBNSksICgweEM0MDIwMDZGKSwgKDB4OEVCRUY4NUMpLCAoMHhDNDVBRTEyMyksICgweDhFOTA0MkVGKSwgKDB4QzRCM0U2QTMpLCAoMHg4RTYxRDM3QyksICgweEM1MEQxMEI2KSwgKDB4OEUzM0FBMUYpLCAoMHhDNTY2NUYyNiksICgweDhFMDVDNkY0KSwgKDB4QzVCRkQxQkMpLCAoMHg4REQ4MkExNyksICgweEM2MTk2ODQwKSwgKDB4OERBQUQzQTYpLCAoMHhDNjczMjI3QyksCisvLygweDhEN0RDM0JCKSwgKDB4QzZDRDAwMzgpLCAoMHg4RDUwRkE3MyksICgweEM3MjcwMTNEKSwgKDB4OEQyNDc3RTkpLCAoMHhDNzgxMjU1MiksICgweDhDRjgzQzM5KSwgKDB4QzdEQjZDNDEpLCAoMHg4Q0NDNDc3RSksICgweEM4MzVENUQyKSwgKDB4OENBMDk5RDMpLCAoMHhDODkwNjFDRCksICgweDhDNzUzMzUyKSwgKDB4QzhFQjBGRkEpLCAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwgKDB4OEMxRjNDM0UpLCAoMHhDOUEwRDIwQSksCisvLygweDhCRjRBQkRGKSwgKDB4QzlGQkU1N0UpLCAoMHg4QkNBNjMxNCksICgweENBNTcxQTQzKSwgKDB4OEJBMDYxRjkpLCAoMHhDQUIyNzAyMiksICgweDhCNzZBOEE3KSwgKDB4Q0IwREU2RTIpLCAoMHg4QjREMzczOCksICgweENCNjk3RTRDKSwgKDB4OEIyNDBEQzUpLCAoMHhDQkM1MzYyNSksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4QUQyOTMzQSksICgweENDN0QwNjQ3KSwgKDB4OEFBQTQyNTQpLCAoMHhDQ0Q5MUUxRSksCisvLygweDhBODIzQTlBKSwgKDB4Q0QzNTUzQUQpLCAoMHg4QTVBN0E4RCksICgweENEOTFBQTY2KSwgKDB4OEEzMzAzMTIpLCAoMHhDREVFMjAzQSksICgweDhBMEJENDQyKSwgKDB4Q0U0QUI0RjEpLCAoMHg4OUU0RUUzNCksICgweENFQTc2ODUyKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg5OTdGQ0JGKSwgKDB4Q0Y2MTJBMkMpLCAoMHg4OTcxRjE4OCksICgweENGQkUzODMzKSwgKDB4ODk0QzJGNzMpLCAoMHhEMDFCNjNGRSksCisvLygweDg5MjZCNjk3KSwgKDB4RDA3OEFENTMpLCAoMHg4OTAxODcwQSksICgweEQwRDYxM0ZCKSwgKDB4ODhEQ0EwRTQpLCAoMHhEMTMzOTdCQSksICgweDg4QjgwNDNDKSwgKDB4RDE5MTM4NTcpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODg2RkE3QkYpLCAoMHhEMjRDQ0Y0NSksICgweDg4NEJFODE3KSwgKDB4RDJBQUM1MjIpLCAoMHg4ODI4NzI0NiksICgweEQzMDhENkY2KSwgKDB4ODgwNTQ2NjEpLCAoMHhEMzY3MDQ4NyksCisvLygweDg3RTI2NDdGKSwgKDB4RDNDNTREOUEpLCAoMHg4N0JGQ0NCNSksICgweEQ0MjNCMUY1KSwgKDB4ODc5RDdGMTgpLCAoMHhENDgyMzE1RiksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLCAoMHg4NzU5QzJCQSksICgweEQ1M0Y4MDc0KSwgKDB4ODczODU0MjQpLCAoMHhENTlFNEZBQSksICgweDg3MTczMDBFKSwgKDB4RDVGRDM5MDUpLCAoMHg4NkY2NTY4RSksICgweEQ2NUMzQzRBKSwgKDB4ODZENUM3QjcpLCAoMHhENkJCNTkzRiksCisvLygweDg2QjU4MzlFKSwgKDB4RDcxQThGQTgpLCAoMHg4Njk1OEFGOSksICgweEQ3NzlERDY2KSwgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg2NTY3OTJBKSwgKDB4RDgzOEM3NkYpLCAoMHg4NjM3NjBDQyksICgweEQ4OTg2MTYwKSwgKDB4ODYxODkzOEQpLCAoMHhEOEY4MTM5RiksICgweDg1RkExMTgwKSwgKDB4RDk1N0RERjEpLCAoMHg4NURCREFCOCksICgweEQ5QjdDMDFDKSwgKDB4ODVCREVGNDkpLCAoMHhEQTE3QjlFNSksCisvLygweDg1QTA0RjQzKSwgKDB4REE3N0NCMEYpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODU2NUYxQzEpLCAoMHhEQjM4MzI5RCksICgweDg1NDkzNDY3KSwgKDB4REI5ODg4OEEpLCAoMHg4NTJDQzJDMCksICgweERCRjhGNEVDKSwgKDB4ODUxMDlDREQpLCAoMHhEQzU5Nzc4NyksICgweDg0RjRDMkNGKSwgKDB4RENCQTEwMjApLCAoMHg4NEQ5MzRBNyksICgweEREMUFCRTdBKSwgKDB4ODRCREYyNzcpLCAoMHhERDdCODI1QyksCisvLygweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDg4NTIzRiksICgweERFM0Q0OUMzKSwgKDB4ODQ2REY0NUEpLCAoMHhERTlFNENEMiksICgweDg0NTNFMkFEKSwgKDB4REVGRjY0NzgpLCAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODQyMEE0NDEpLCAoMHhERkMxRDA5QiksICgweDg0MDc3N0EyKSwgKDB4RTAyMzI0QTApLCAoMHg4M0VFOTc3QSksICgweEUwODQ4QzRDKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksCisvLygweDgzQkRCQ0Q0KSwgKDB4RTE0Nzk1QUIpLCAoMHg4M0E1QzJFQyksICgweEUxQTkzNEY0KSwgKDB4ODM4RTE1M0UpLCAoMHhFMjBBRThFNSksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzVGQTAzQyksICgweEUyQ0U4N0ZCKSwgKDB4ODM0OEQ5MDQpLCAoMHhFMzMwNzJBNyksICgweDgzMzI1RUJBKSwgKDB4RTM5MjZGMTkpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODMwNjUxMkEpLCAoMHhFNDU2OUM1QyksCisvLygweDgyRjBCREZFKSwgKDB4RTRCOENDQjQpLCAoMHg4MkRCNzdGNyksICgweEU1MUIwRERGKSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyQjFEMzhCKSwgKDB4RTVERkMxQkUpLCAoMHg4MjlENzU0MCksICgweEU2NDIzM0Y5KSwgKDB4ODI4OTY0NEQpLCAoMHhFNkE0QjYxNCksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MjYyMkFBMSksICgweEU3NjlFOEZCKSwgKDB4ODI0RjAyMDApLCAoMHhFN0NDOTk0QyksCisvLygweDgyM0MyNkU3KSwgKDB4RTgyRjU4OEMpLCAoMHg4MjI5OTk2MiksICgweEU4OTIyNjdDKSwgKDB4ODIxNzU5N0QpLCAoMHhFOEY1MDJERiksICgweDgyMDU2NzQzKSwgKDB4RTk1N0VEN0EpLCAoMHg4MUYzQzJCRiksICgweEU5QkFFNjBFKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksICgweDgxRDE2MzAzKSwgKDB4RUE4MTAwMzApLCAoMHg4MUMwQTdFMSksICgweEVBRTQyMTQzKSwgKDB4ODFCMDNBQTApLCAoMHhFQjQ3NEY1QyksCisvLygweDgxQTAxQjQ4KSwgKDB4RUJBQThBM0QpLCAoMHg4MTkwNEEzNSksICgweEVDMERDRkFGKSwgKDB4ODE4MEM2Q0YpLCAoMHhFQzcxMjM2OCksICgweDgxNzE5MTcwKSwgKDB4RUNENDgzMzIpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODE1NDEwRUYpLCAoMHhFRDlCNjYwMiksICgweDgxNDVDNURGKSwgKDB4RURGRUU4OEUpLCAoMHg4MTM3QzhGQiksICgweEVFNjI3NjM0KSwgKDB4ODEyQTFBNEMpLCAoMHhFRUM2MEVCOSksCisvLygweDgxMUNCOURBKSwgKDB4RUYyOUIxREQpLCAoMHg4MTBGQTdBRCksICgweEVGOEQ1RjY1KSwgKDB4ODEwMkUzQ0UpLCAoMHhFRkYxMTcxMSksICgweDgwRjY2RTQ0KSwgKDB4RjA1NEQ4QTYpLCAoMHg4MEVBNDcxNyksICgweEYwQjhBM0U1KSwgKDB4ODBERTZFNEYpLCAoMHhGMTFDNzg5MSksICgweDgwRDJFM0YyKSwgKDB4RjE4MDU2NkIpLCAoMHg4MEM3QTgwOSksICgweEYxRTQzRDM4KSwgKDB4ODBCQ0JBOTkpLCAoMHhGMjQ4MkNCOCksCisvLygweDgwQjIxQkFBKSwgKDB4RjJBQzI0QUYpLCAoMHg4MEE3Q0I0MiksICgweEYzMTAyNERFKSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDgwOTQxNjIyKSwgKDB4RjNEODNDRUYpLCAoMHg4MDhBQjE3NSksICgweEY0M0M1NDU2KSwgKDB4ODA4MTlCNjgpLCAoMHhGNEEwNzJGRiksICgweDgwNzhEM0ZGKSwgKDB4RjUwNDk4QUIpLCAoMHg4MDcwNUI0MiksICgweEY1NjhDNTFFKSwgKDB4ODA2ODMxMzQpLCAoMHhGNUNDRjgxOSksCisvLygweDgwNjA1NURCKSwgKDB4RjYzMTMxNUYpLCAoMHg4MDU4QzkzQiksICgweEY2OTU3MEIyKSwgKDB4ODA1MThCN0UpLCAoMHhGNkY5QjNENSksICgweDgwNEE5QzVFKSwgKDB4Rjc1REZFODcpLCAoMHg4MDQzRkMwNSksICgweEY3QzI0RThEKSwgKDB4ODAzREFBNzcpLCAoMHhGODI2QTNBOCksICgweDgwMzdBN0I4KSwgKDB4Rjg4QUZEOUIpLCAoMHg4MDMxRjNDQiksICgweEY4RUY1QzI4KSwgKDB4ODAyQzhFQjUpLCAoMHhGOTUzQkYxMCksCisvLygweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHg4MDIyQjExOSksICgweEZBMUM5MEZCKSwgKDB4ODAxRTM4OTkpLCAoMHhGQTgwRkY4MiksICgweDgwMUEwRUZDKSwgKDB4RkFFNTcxNkQpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAxMkE4NzIpLCAoMHhGQkFFNUU3OCksICgweDgwMEY2QjhBKSwgKDB4RkMxMkQ5MUIpLCAoMHg4MDBDN0Q4RCksICgweEZDNzc1NjJBKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksCisvLygweDgwMDc4RTVGKSwgKDB4RkQ0MDU2OTUpLCAoMHg4MDA1OEQyRiksICgweEZEQTREOTc1KSwgKDB4ODAwM0RBRjEpLCAoMHhGRTA5NURDOCksICgweDgwMDI3N0E2KSwgKDB4RkU2REUzNTIpLCAoMHg4MDAxNjM0RSksICgweEZFRDI2OUQzKSwgKDB4ODAwMDlERUEpLCAoMHhGRjM2RjEwRiksICgweDgwMDAyNzdCKSwgKDB4RkY5Qjc4QzcpLCAoMHgwMDAwMDAwOSksICgweDlGQzVBQzI4KSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDIwMCksCisvLygweDAwMDAwNDAwKSwgKDB4ODAwMEZGRDApLCAoMHgwMDAwMDAwQSksICgweDAwMDAwMDA5KSwgKDB4OUZDNUUxRDgpLCAoMHg5RkM1NkRDQyksICgweDgwMDAyMkQ4KSwgKDB4OUZDMkNDRUMpLCAoMHg4MDAwRkZEMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwQTApLCAoMHg4MDAwRkY2OCksICgweDAwMDAwMDAwKSwgKDB4RkZGRkZGRkYpLCAoMHg4RkZGRkM2MCksICgweDAwMDAwNDAwKSwgKDB4ODAwMTJCMDgpLCAoMHg4MDAwRkZEMCksCisvLygweDgwMDBGM0EwKSwgKDB4ODAwMTI5OTApLCAoMHg5RkM1N0ZDQyksICgweDlGQzE4MUU4KSwgKDB4MDAwMDAwMDQpLCAoMHg4MDAwRjNDNCksICgweDgwMDEyN0Q5KSwgKDB4ODAwMTBGRDApLCAoMHgwMDAwMDAwOSksICgweEZGRkZGRkZGKSwgKDB4ODAwMTIwRTgpLCAoMHg5RkMwRTlFMCksICgweDgwMDBGM0M4KSwgKDB4MDAwMDAwMDIpLCAoMHg4MDAxMjM3OCksICgweDgwMDBGM0M0KSwgKDB4ODAwMEYzQTApLCAoMHhGRkZGRkZGRiksCisvLygweDgwMDBDNzc0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzEzNEE0KSwgKDB4MDAwMDAwMDIpLCAoMHg5RkM1QUMyOCksICgweDgwMDBGM0EwKSwgKDB4MDAwMDAwMDIpLCAoMHg4MDAwMjJEOCksICgweDAwMDAwMDAxKSwgKDB4ODAwMEYzQTApLCAoMHgwMDAwMDAwMCksICgweDgwMDEyQUY4KSwgKDB4MDAwMDAwMDIpLCAoMHgwMDAwMDAwMSksICgweDlGQzBEM0JDKSwgKDB4ODAwMEM3NzQpLCAoMHg5RkMwNzYwMCksCisvLygweDAwMDAwMDAzKSwgKDB4OEZGRkZDQjApLCAoMHgwMDAwMDAwMiksICgweDgwMDBDOUEwKSwgKDB4OEZGRkZDMDApLCAoMHgwMDAwMDAwMCksICgweDAxMDEwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwRjQyMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDBGRkM4KSwgKDB4MDAwMDAwMDcpLCAoMHg4MDAwRjNFOCksICgweDgwMDA0MkQ4KSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzc2QyksCisvLygweDgwMDBGM0EwKSwgKDB4ODAwMEM3NzQpLCAoMHgwMDAwMDAwMCksICgweDAwMDEwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHg4MDAwMjJEOCksICgweDgwMDAwNTQ4KSwgKDB4OUZDMDZFMTgpLCAoMHg5RkMwNjM4MCksICgweDAwMDAwMDAwKSwgKDB4ODAwMDIyRDgpLCAoMHgwMDAwMDAwMSksICgweDgwMDBGM0EwKSwgKDB4OEZGRkZENjApLCAoMHg4MDAwRjNBMCksICgweDgwMDBDNzYwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMDY0OCksCisvLygweDgwMDBGM0EwKSwgKDB4OEZGRkZGODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAyMDAwKSwgKDB4ODAwMDQyRDgpLCAoMHg4MDAwMjJEOCksICgweDlGQzAzODZDKSwgKDB4OUZDMDM4NUMpLCAoMHgwMDAwMDAwNSksICgweDhGRkZGRjg4KSwgKDB4OUZDNjBCOTkpLCAoMHg4MDAwMDU0OCksICgweDgwMDAyMTA4KSwgKDB4ODAwMDIxMDApLCAoMHg4MDAwMjEwNCksICgweDhGRkZGRUU4KSwgKDB4ODAwMDA2NDgpLCAoMHg5RkMzRkQzQyksCisvLygweDAwMDAwMDAwKSwgKDB4ODAwMDE2OTgpLCAoMHg5RkM0N0Q0MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDQpLCAoMHg4MDAwMThDMCksICgweDhGRkZGRTAwKSwgKDB4ODAwMDE4QzQpLCAoMHg5RkM2MEE1MCksICgweDAxMDQwMjAwKSwgKDB4MkUzNDJFMzEpLCAoMHgwMDAwMDAzMiksICgweDAwMDAwMDExKSwgKDB4OEZGRkZFMDApLCAoMHg5RkM1Mjk4NCksICgweDlGQzYwQTVDKSwgKDB4MDAwMDAwMDApLCAoMHg4RkZGRkUwMCksCisvLygweDlGQzUyOTc4KSwgKDB4MDEwNDA0MDApLCAoMHgyRTM0MkUzMSksICgweDlGQzYwMDM0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzUyOTg0KSwgKDB4OUZDNTI5OTApLCAoMHgwMDAxRjMxRiksICgweDlGQzYzMEM0KSwgKDB4OUZDNDk1MjQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjMxMEMpLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM0QTIxNCksICgweDgwMDAxOEMwKSwgKDB4MDAwMDAwMDEpLCAoMHg5RkM0NzQ2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweDhGRkZGRUM4KSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMTk3OCksCisvLygweDlGQzQ3RDQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM0NzgzQyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMTk3OCksICgweDAwMDAwMDAzKSwgKDB4OUZDNjMwMzApLCAoMHg5RkM2MDAwMCksICgweDAwMDAwMDAwKSwgKDB4MTAwMDAwMDApLCAoMHg4MDAwMTYxNCksICgweDgwMDAxNjk4KSwgKDB4OUZDNDhCMDgpLCAoMHg5RkM2MzAxMCksCisvLygweDlGQzYzMDdDKSwgKDB4OUZDNjMwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM2MzcyQyksICgweDAwMDAwMDA3KSwgKDB4ODAwMEJENjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDA1KSwgKDB4OEZGRkZGODgpLCAoMHgwMDAwMDAwMCksICgweDlGQzRENUVDKSwgKDB4MDAwMDAwMDApLCAoMHgxMDAwMDAwMCksCisvLygweDlGQzQ5MjY0KSwgKDB4OUZDNDkyNTgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAxKSwgKDB4RkZGRkZGRkYpLCAoMHgwMDAwMDAwNSksICgweDhGRkZGRjg4KSwgKDB4MDAwMDAwMDApLCAoMHgxMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MjAwMDAwMDApLCAoMHg5RkMwMTRCQyksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDhGRkZGRkExKSwgKDB4OEZGRkZGREQpLCAoMHg4RkZGRkZFMSksICgweDhGRkZGRkY0KSwgKDB4OEZGRkZGRjgpLCAoMHgwMDAwMDAwMCksICgweDZGNjgyRjAwKSwgKDB4NkMyRjY1NkQpLCAoMHg2RDJGNjg2RiksICgweDUzMkY3NDZFKSwgKDB4NzMyRjRFNTYpLCAoMHg0MzJGNjU2NCksCisvLygweDY4NUY0QjQ0KSwgKDB4NjM2MTYxNjUpLCAoMHgyRjYzNjU2NCksICgweDJGNkU2OTYyKSwgKDB4NDQ2MzYxNjEpLCAoMHg2NDZGNjM2NSksICgweDczNUY3MjY1KSwgKDB4NEM1RjY1NjQpLCAoMHg3ODc1NkU2OSksICgweDY2NjkyRDAwKSwgKDB4NjU2ODc0MDApLCAoMHg3NDczNjU3NCksICgweDVGMzEzNDM0KSwgKDB4NjEyRTYzNkMpLCAoMHgwMDczNzQ2NCksICgweDAwNjY2RjJEKSwgKDB4MkU3MDZENzQpLCAoMHgwMDc2NjE3NyksCisvLygweDhGQjQwMDYwKSwgKDB4MTAwMDAwMDgpLCAoMHg4RkI1MDA2NCksICgweDAyNDAzMDIxKSwgKDB4MEZGMTNFNDIpLCAoMHgwMjYwMzgyMSksICgweDAwNDBBMDIxKSwgKDB4MDA2MEE4MjEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MTUwMDAwMDcpLCAoMHgwMDAwMDAwMCksCisvLygweDEwNkIwMDA3KSwgKDB4MDAwMDAwMDApLCAoMHgwQkYxNDM3OSksICgweDAwMDAwMDAwKSwgKDB4MTA4MEZGRjcpLCAoMHgwMDAwMDAwMCksICgweDAyRTAzODIxKSwgKDB4MDJDMDIwMjEpLCAoMHgxNDQwRkY5NiksICgweDAyRTAyODIxKSwgKDB4MDI4MDIwMjEpLCAoMHgxMDAwRkY5MyksICgweDAyQTAyODIxKSwgKDB4OEZBNjAwMjgpLCAoMHg4RkE2MDAyOCksICgweDhGQTcwMDJDKSwgKDB4MDA0MDIwMjEpLCAoMHgwMDYwMjgyMSksCisvLygweDAwNDA5MDIxKSwgKDB4MDA2MDk4MjEpLCAoMHhBRkEyMDA2MCksICgweDBGRjE0MUVFKSwgKDB4OENDNDJENDgpLCAoMHg4Q0M1MkQ0QyksICgweDBGRjE0NEFFKSwgKDB4MjQwNjAwMzYpLCAoMHg4RkE0MDA2OCksICgweDhGQTUwMDZDKSwgKDB4MDA0MDMwMjEpLCAoMHgwMDYwMzgyMSksICgweDhGQjIwMDQwKSwgKDB4OEZCMTAwM0MpLCAoMHg4RkIwMDAzOCksICgweDAwODAxMDIxKSwgKDB4MDBBMDE4MjEpLCAoMHgwM0UwMDAwOCksCisvLygweDI3QkQwMDYwKSwgKDB4MDAwMDI4MjEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzY2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NTIwODI0NTApLCAoMHgzRUVEMTcwNSksICgweEYyMEZGOEExKSwgKDB4ODlGNkUxN0YpLCAoMHgxN0Q3REMwMCksICgweDA5QjlGMkMzKSwgKDB4NjM3ODk2OEMpLCAoMHhBRjA2MDdGNiksCisvLygweEZERkRFMEM5KSwgKDB4M0NFM0RGRUUpLCAoMHg1MTY4MjI5RSksICgweDdDRjc5NzM0KSwgKDB4RjVGRkY1NkYpLCAoMHgzMDcwMDA5MyksICgweDEzNUY1Qzc1KSwgKDB4RTZENzNFRUUpLCAoMHg2RTQwMERGOSksICgweDU4MjUyQUNCKSwgKDB4NTU3MzExQ0EpLCAoMHg1NTM5QjMwMyksICgweDU2NTU3MzU1KSwgKDB4QjZCREFDRUYpLCAoMHg1OUY5NDI4RCksICgweDlBRTYzMDIwKSwgKDB4NTU4RkY3RTcpLCAoMHg3OTU1ODA2RCksCisvLygweDA5RDU0OUYzKSwgKDB4NjAzQkY1QjcpLCAoMHgzMTM0NDEzQiksICgweEJDQTdDMUFBKSwgKDB4QTk4RDEzMzkpLCAoMHg1N0IyOUM5NyksICgweDUwRjFGRjA3KSwgKDB4RTRBMTM5ODApLCAoMHhEMDg4MUEyMSksICgweEMxRkZFMzBBKSwgKDB4QjBBNjZDMTkpLCAoMHgxODQxNjQ5MCksICgweDE2MEUwMjE0KSwgKDB4QTU4NENCQjUpLCAoMHgwMkFBQTgyQSksICgweDczOTgxMzQwKSwgKDB4OTY0QTI0REUpLCAoMHg2RTgyOUZDNCksCisvLygweERGRDYyMzYwKSwgKDB4NEMzQkYxNTIpLCAoMHgzODcyMTU3NCksICgweEQ0NkJDOTEyKSwgKDB4QkJENjVGOUQpLCAoMHhFNkYwMkM5RCksICgweDg2N0M2RUVDKSwgKDB4NDNGQUI3MjUpLCAoMHhBNDE0NDQxOSksICgweDY5QkI2QUFGKSwgKDB4Q0UyN0I3NDQpLCAoMHgwMjIyNDFBOSksICgweDFFQjdGREQ4KSwgKDB4MUNBNkNCQzApLCAoMHhCQkNCQzExMSksICgweEE2RkQxNDAzKSwgKDB4NzZDNjg4RDkpLCAoMHhCNDcxODZDQiksCisvLygweDVFOTg5MzZEKSwgKDB4OUJCRjdFMkUpLCAoMHg4QjdGQkNFQyksICgweDlEQUY3RUY1KSwgKDB4N0UzQTc5RjEpLCAoMHg5Qzg5NkFDRCksICgweDYyOEYyNDlBKSwgKDB4REQ2RTUxQUYpLCAoMHhBRjczOTk0QiksICgweDU5NjY5OTVEKSwgKDB4Qjc2MjA1OTcpLCAoMHgzNjlCMUU1NCksICgweDdDRURDNzg3KSwgKDB4RTdCMTVCMUYpLCAoMHhCMzZGNUY3RCksICgweEI1QjczRUY2KSwgKDB4RDc2RUVFRTIpLCAoMHgxNEU4NjE4NiksCisvLygweEMwNURGMTRFKSwgKDB4ODA1MEYxRkYpLCAoMHgyMThDMjEzMSksICgweEJFMjU5NDFBKSwgKDB4OTA0MUNEMDYpLCAoMHgxRUU4QTlDMCksICgweEQ1MzBGRUREKSwgKDB4NzQ5NUM4MDgpLCAoMHhDQzE1OTI5MSksICgweDRFQzg1Q0EzKSwgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksICgweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksICgweDExNzgzNzE5KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgzNzAwMDAwMCksICgweDAwMDA4MEEzKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4Qzg3MkYyNCksICgweDBGRjExQjEzKSwgKDB4MDIwMDIwMjEpLCAoMHgzQzA2OUZDNiksCisvLygweDAwNjAyODIxKSwgKDB4MDA2MEE4MjEpLCAoMHgyNEMzMkQ0OCksICgweDhDNjYwMDAwKSwgKDB4MDA4MDMwMjEpLCAoMHgwRkYxM0FBMCksICgweDAwQTAzODIxKSwgKDB4MTAwMEZGRUMpLCAoMHgwMDQwMjAyMSksICgweDhGQTYwMDY4KSwgKDB4MEZGMTNFNDIpLCAoMHg4RkE3MDA2QyksICgweDAyMDAyMDIxKSwgKDB4MDA2MDI4MjEpLCAoMHgwRkYxNDFFRSksICgweDAwNjA4ODIxKSwgKDB4MDQ0MDAwMTYpLCAoMHgwMjAwMjAyMSksCisvLygweDNDMDU5RkM2KSwgKDB4OENBNjJFNzgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NUM1RDRBN0YpLCAoMHg1QzgwMTZGRiksICgweDVDQTJDQTdGKSwgKDB4NUNDNTc1RkYpLCAoMHg1Q0U4MEZGRiksICgweDVEMEE5OTdGKSwgKDB4NUQyRDFBRkYpLCAoMHg1RDRGOEI3RiksCisvLygweDhGODc4MTVDKSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0JEMCksICgweDAwNjAyODIxKSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0U0NSksICgweDAwNjAyODIxKSwgKDB4MDI3NjIwMkEpLCAoMHgwMDRCNTAwQiksICgweDI0MDMwMDAxKSwgKDB4MTU0M0ZGRTkpLCAoMHg3MTRCNTgyMCksICgweDAwMEYzRDAwKSwgKDB4MDAwMDMwMjEpLCAoMHgwMEMwMTAyMSksICgweDAzRTAwMDA4KSwgKDB4MDE0QjY4MjUpLCAoMHgwMDA4NjBDMCksCisvLygweDAwMDA3MDIxKSwgKDB4MDAwMDc4MjEpLCAoMHgwMDAwNTAyMSksICgweDEwMDAwMDEzKSwgKDB4M0MwQjAwNDApLCAoMHgwMDhDMTgyQiksICgweDhGRkY3NTcwKSwgKDB4QUUyOTAwOTQpLCAoMHhBRTExMDBBOCksICgweDE1MDcwMDIzKSwgKDB4OEZGRjc1ODApLCAoMHg4RTBGMDA5OCksICgweDhERTUwMDIwKSwgKDB4NTBBMDAwMjApLCAoMHhBRkIyMDAyMCksICgweEFGQjEwMDFDKSwgKDB4QUZCRjAwMjgpLCAoMHhBRkIwMDAxOCksCisvLygweDhDOTAwMDIwKSwgKDB4MDBBMDg4MjEpLCAoMHg4RTAyMDAwOCksICgweDhDQTUwMDA4KSwgKDB4MEZGMDAzQTQpLCAoMHgwMDAwMzAyMSksICgweDA0NDAwMDMxKSwgKDB4MjQwMzAwMUQpLCAoMHg4RTI2MDAwOCksICgweDhFMjUwMDBDKSwgKDB4QUUwNjAwMDgpLCAoMHhBRTA1MDAwQyksICgweDBGRjEyM0FCKSwgKDB4MDAwMDAwMDApLCAoMHgwMDQwOTAyMSksICgweDhFMkEwMDEwKSwgKDB4MkU0OTAwMDEpLCAoMHgwMDBBNDAyQiksCisvLygweDEwMDBGRkVBKSwgKDB4MDEwOTEwMjQpLCAoMHg4RTI0MDAwOCksICgweDhFMjUwMDBDKSwgKDB4OEU2NjAwMTgpLCAoMHhBRTA1MDAwQyksICgweEFFMDQwMDA4KSwgKDB4OEUwNzAwMEMpLCAoMHg4Q0MzMDA5NCksICgweDAwNjc1ODJBKSwgKDB4OEZCRjAwMjgpLCAoMHhBQ0M0MDA5MCksICgweEFDQzUwMDk0KSwgKDB4MDI0MDE4MjEpLCAoMHg4RkJGMDAyOCksICgweDhGQjMwMDI0KSwgKDB4OEZCMjAwMjApLCAoMHg4RkIxMDAxQyksCisvLygweDI3QTQwMDcwKSwgKDB4MTIwMDAwMDUpLCAoMHg4RkEyMDA5NCksICgweDBGRjExQ0RCKSwgKDB4MDAwMDAwMDApLCAoMHhBQzUwMDAwMCksICgweDI0MDJGRkZGKSwgKDB4OEZCRjAwQkMpLCAoMHgwMDAwMDAwMCksICgweDEwMDAwMDA5KSwgKDB4OEU0MzAwMDApLCAoMHgxMjIwMDAwNiksICgweDAwMDAwMDAwKSwgKDB4OTY0RTAwMTApLCAoMHgyNDAzRkZGRiksICgweDM1Q0QwMDQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGN0IwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxMDIxNDQ4MiksICgweDFCQTAwMDA1KSwgKDB4MDAwMEMwRkYpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgyNDYzRkZGOCksICgweDEwNjAwMDBFKSwgKDB4MjcwNzAzRkYpLCAoMHgwMDYwMTAyNyksICgweDAwNjkyODA0KSwgKDB4MDA0ODEwMDYpLCAoMHgwMDY4MjAwNCksICgweDAwMDIxMDQyKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLCAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RkZGNkY1MCksICgweDU0NDE0QzIwKSwgKDB4NzU3MzIwNEQpLCAoMHg3MjZGNzA3MCksICgweDhGRkY2RjYwKSwgKDB4MDAwMDAwMEEpLCAoMHgyRDJEMjAyQSksICgweDU3NDE1MjIwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDA2MDI4MjEpLCAoMHgwMjQwMzAyMSksICgweDBGRjEzRDAxKSwgKDB4MDI2MDM4MjEpLCAoMHgxMDAwRkVFRiksICgweDAwNDAyMDIxKSwgKDB4MDIwMDIwMjEpLCAoMHgwMjIwMjgyMSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgyRTgwNTBGMSksICgweDFBMjE0NDYyKSwgKDB4MDRENkQ1ODMpLCAoMHg0MDAzMTI4MiksCisvLygweDY0NjlBNzM1KSwgKDB4MEI0Qzk5QTMpLCAoMHgwQUY4ODU5NCksICgweEY5MDk2OUQ3KSwgKDB4OTYxMzFDOTIpLCAoMHgwMjVFRUExMCksICgweDNBMUZFNDIxKSwgKDB4NjE0RkYzOTApLCAoMHgxQ0ZEQzMyNyksICgweEMxNzdFMDRGKSwgKDB4RjREODdFODIpLCAoMHg3ODI1M0YzOSksICgweEJCODM5Rjk0KSwgKDB4OTk4QjNFQjEpLCAoMHg4MEYyODA5OCksICgweERGM0ZBQkNEKSwgKDB4MjREODQwQUMpLCAoMHhCQTk1MzIxQyksCisvLygweERDMjExRDIwKSwgKDB4MTUwNDE5NDIpLCAoMHg2MTg1OEFCRCksICgweDU0NjA4NEExKSwgKDB4QTcwRDIxOUMpLCAoMHg3QkQ1MjEzNSksICgweDc4MDYwRjcxKSwgKDB4RUEzQzg3RDgpLCAoMHgzRkFGM0EyNCksICgweEU0QjJDNDIxKSwgKDB4Qjk5RDE0NTMpLCAoMHgyNzQxRTI2NCksICgweDIyMzk4MTNBKSwgKDB4Mjk0NERBMjApLCAoMHg0NDFFRjdDNCksICgweDBCRDBCNzIwKSwgKDB4RUQ4NEVBMjYpLCAoMHg3M0UwQzBEMiksCisvLygweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLCAoMHg4NjA3NDkyRSksICgweDI4Q0VGNDQwKSwgKDB4MDIyNzY4QzgpLCAoMHhGNjhFMzYxMSksICgweDg0RTg0RDU1KSwgKDB4NzMwMDRDMDQpLCAoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksICgweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksCisvLygweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLCAoMHhBQjM3MzVEMyksICgweDAwMDAwMDgwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RDA2MkY5MCksICgweDhEMDcyRjk0KSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0QwMSksCisvLygweDAwNjAyODIxKSwgKDB4MDA0MDMwMjEpLCAoMHgwMjAwMjAyMSksICgweDAyMjAyODIxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEYxRkY3QTAwKSwgKDB4RTIzQTgwNTApLCAoMHg4NDFBMjExNCksICgweEM1ODhEQTc1KSwgKDB4MDI0MDAxNDMpLCAoMHhBRUQ2QUFENyksICgweDk0QzI1NDVCKSwgKDB4M0U0NjE1NkMpLCAoMHgwNUJGREYyNyksICgweEIwODIyMDc1KSwgKDB4RDI0QzdCQzQpLCAoMHg2MjEyMjA1NCksCisvLygweDhDQzQxQzQ5KSwgKDB4MkM0MTQ5NzIpLCAoMHg4MEM1REEwRSksICgweEQ4NEEwMDdDKSwgKDB4NzE5RTczQzApLCAoMHg3NjUwMTRCMCksICgweDBBMzkxQkM4KSwgKDB4NjBBNzAyMjMpLCAoMHg1NENEQTQ2QiksICgweDQ2MDZENDU1KSwgKDB4MzdCNkE3MzgpLCAoMHhGRkJCN0Q3MSksICgweDVGRUREMTJGKSwgKDB4RUU0N0ZEQzgpLCAoMHgzREM3OTEzRiksICgweEVBRUVGN0ZEKSwgKDB4MjE5REFERUMpLCAoMHhGOUU1M0Y1RiksCisvLygweEIzRDgyRDlFKSwgKDB4QkJCNzlCQ0IpLCAoMHg0M0FEMkFBQiksICgweDBFN0FEQkMwKSwgKDB4QUJCRDA5NTIpLCAoMHgxQTZFRjQzQSksICgweENEOUIyQTlEKSwgKDB4NzIyMkIzNjYpLCAoMHg5NzlFODlFOSksICgweDAyQzkxMTNGKSwgKDB4MUQ1MTE0NjYpLCAoMHg1N0E5MjIwNiksICgweDRBNDEyMDc1KSwgKDB4RkQzMUQ3ODMpLCAoMHhBNzU0MkVGQyksICgweDI0Qjc2OTc1KSwgKDB4Qjk5OTYyQzcpLCAoMHgxOUYxRDM1NiksCisvLygweDlEMTJDM0NCKSwgKDB4NkQzN0Q1NDIpLCAoMHgyOUU3MjE0RCksICgweDg5MDBGNjQ1KSwgKDB4QjE1NEFENEEpLCAoMHhGMDQ3RDk4OCksICgweEY1NUVFMUQ1KSwgKDB4QzAwQjY5MzIpLCAoMHg4NUFDRTkxMiksICgweDgyMDhCMUI5KSwgKDB4ODBFMTQxNzApLCAoMHhBMUQ2N0MzRiksICgweDA1ODAzNUIzKSwgKDB4QTRGRTM2Q0EpLCAoMHhBNThBQkFDQyksICgweEMzRTk4MzFDKSwgKDB4Mjc1MzFCOEMpLCAoMHhBREJCODY5OCksCisvLygweDA2ODAxQzEyKSwgKDB4QUZBRUVDOEUpLCAoMHhDMzI2OTI5MSksICgweDVDMkUwMUEwKSwgKDB4NEE2MTA4N0MpLCAoMHg2MEYyMUU3QiksICgweDZCOTJDNjcwKSwgKDB4Qzk4NzIzNjQpLCAoMHg0ODQ2NEM5NyksICgweDM0MkU2NDk5KSwgKDB4QTY4NDlBNDgpLCAoMHhGMDM0MDAyRCksICgweDQ0MkI0NDg4KSwgKDB4MTYwQjA0NDIpLCAoMHhFRDUyQ0Y1MCksICgweDRENDM2QzA1KSwgKDB4Njg0MUM2MDIpLCAoMHhBMTRGOEE4MiksCisvLygweDlBQzIwRERFKSwgKDB4NUI5MjUxRUUpLCAoMHg4RUQ5OThENSksICgweDkyQjZFQTIyKSwgKDB4NUIxMzZDNEIpLCAoMHg5N0MwQTQ1QiksICgweDQ1OUM5NEE0KSwgKDB4Q0Q5NTgzQzApLCAoMHg2QzU4OURGOCksICgweDNDOUExN0NEKSwgKDB4OTA2NjAxQkYpLCAoMHg4NEQ2MTJFMSksICgweDY3MTc2RjVGKSwgKDB4RTQ3RDVBNDQpLCAoMHgzNzM4NkQ1RSksICgweDkyQTRENjFCKSwgKDB4MjhDNTEzRkIpLCAoMHg2RTkxNTk5QSksCisvLygweDY1M0RBMTZEKSwgKDB4QTE5QzM5QzApLCAoMHg0Mjc2OTBBRCksICgweDcwMDU0NjFDKSwgKDB4QUI2QzFFRTQpLCAoMHg4MEJBQ0MyRCksICgweDc4MEExOEM1KSwgKDB4ODIyREM3NzQpLCAoMHhCNjA0MzAzNiksICgweDAwNzg5QzE4KSwgKDB4MTA2Qzk1MDcpLCAoMHg0MTAzQTg2NCksICgweEM1MTE1ODVCKSwgKDB4RjNFOUI3RjgpLCAoMHgyNEQ3OUM0RCksICgweDMxQjIwRUI1KSwgKDB4QjFDMDQ4M0UpLCAoMHhFMjVDNTZCOSksCisvLygweDk2OTkxMDk2KSwgKDB4N0NENDEyMUYpLCAoMHg4QTNCODNGNCksICgweDcwNDI3MUMyKSwgKDB4QjVDMjZBQ0MpLCAoMHgyQjEzMUFGMCksICgweDhCN0ZCQ0VDKSwgKDB4OURBRjdFRjUpLCAoMHg3RTNBNzlGMSksICgweDlDODk2QUNEKSwgKDB4NjI4RjI0OUEpLCAoMHhERDZFNTFBRiksICgweEFGNzM5OTRCKSwgKDB4NTk2Njk5NUQpLCAoMHhCNzYyMDU5NyksICgweDM2OUIxRTU0KSwgKDB4N0NFREM3ODcpLCAoMHhFN0IxNUIxRiksCisvLygweEIzNkY1RjdEKSwgKDB4QjVCNzNFRjYpLCAoMHhENzZFRUVFMiksICgweDE0RTg2MTg2KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLCAoMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLCAoMHgxMTc4MzcxOSksICgweDc3QkIxMEIwKSwgKDB4RkNERjgzNTApLCAoMHhEMzRBN0M2NSksICgweEVGNkU1N0JCKSwgKDB4RUNENTZDNjgpLCAoMHg4RUI3Q0EzNiksCisvLygweDJGMjZCMTM2KSwgKDB4NTU2MzEyNjkpLCAoMHhFRjEyMTNFMSksICgweEE1NkFCODQ0KSwgKDB4QUE0QjFENjQpLCAoMHg2NDM0MUVBOSksICgweDBDRTlEQjQ4KSwgKDB4NDYwQzIxNDQpLCAoMHhBREM1MDIwNSksICgweDUxNUM0NzJGKSwgKDB4MTM2QUMyMTkpLCAoMHg0NzE2Q0VEMSksICgweEM4QjhDRTRFKSwgKDB4MUQxNjgyMTApLCAoMHg5MjMzNEE4MSksICgweDkwREM5MTBDKSwgKDB4NDlBMDAyMjApLCAoMHhFNUYyQzgzMSksCisvLygweEI2N0RDNzg1KSwgKDB4M0M0OTUxNzQpLCAoMHgwRDFGNEMyQSksICgweDNBRDc4N0ZEKSwgKDB4RTlDOUZCMjcpLCAoMHg3REZDMjcxMyksICgweEVCMzlDNEIzKSwgKDB4OTZGNzVGMTgpLCAoMHhBQ0MzQjQxMCksICgweDBGRjEyN0MzKSwgKDB4MDAwMDAwMDApLCAoMHg4RTJBQjNGQyksICgweDAwMEE0ODI3KSwgKDB4MDA0QTQwMjEpLCAoMHgwMTA5MjgyNCksICgweDAwQTI4ODIzKSwgKDB4QUZCRjAwMzQpLCAoMHhBRkI3MDAyQyksCisvLygweEFGQjYwMDI4KSwgKDB4QUZCNTAwMjQpLCAoMHhBRkI0MDAyMCksICgweEFGQjMwMDFDKSwgKDB4QUZCMjAwMTgpLCAoMHgzQzFFOUZDNiksICgweDAwNkI1MDJCKSwgKDB4NTE0MDAwMDIpLCAoMHhBRTIzQkRBMCksICgweDI0MTIwMDE2KSwgKDB4MEZGMDA3RTgpLCAoMHgwMjgwMjAyMSksICgweDEyNDAwMDA1KSwgKDB4MDIwMDEwMjEpLCAoMHgwMjExODAyMSksICgweDBGRjEyN0MzKSwgKDB4MDIwMDIwMjEpLCAoMHgyNDA3RkZGRiksCisvLygweDAwNTAyMDIxKSwgKDB4MTA0NzAwMDQpLCAoMHgwMDAwMjgyMSksICgweDNDMEI4MDAxKSwgKDB4OEM2MzAwMDQpLCAoMHhBQzg2MDAwMCksICgweDAwQzAyMDIxKSwgKDB4MTAwMEZGRUIpLCAoMHg4Q0M2MDAwMCksICgweEFDODAwMDAwKSwgKDB4MEZGMEZEMjUpLCAoMHgyNDA0MDAwMiksICgweDFDMEI4MjYwKSwgKDB4MDAwMDAwMDApLCAoMHgzM0M3Rjc4MCksICgweDMzRjVFODQwKSwgKDB4MzQyM0Q5NDApLCAoMHgzNDUxQjk0MCksCisvLygweDM0N0Y5OTQwKSwgKDB4MzRBRDY4ODApLCAoMHg4RTA4MDAwOCksICgweEFFMDgwMDA0KSwgKDB4OTYwQzAwMTApLCAoMHhBRTA0MDAwMCksICgweDM1OEEwMDAyKSwgKDB4MzE0QkZGRkYpLCAoMHgzMTY5MTAwMCksICgweDMxNjQwMDA4KSwgKDB4OTYwRDAwMTApLCAoMHgzMUE0RkZGNyksICgweEE2MDQwMDEwKSwgKDB4OTYwRjAwMTApLCAoMHgzMUVFRUZGRiksICgweEE2MEUwMDEwKSwgKDB4OEZCRjAwMTQpLCAoMHg4RkIwMDAxMCksCisvLygweDk2NEUwMDEwKSwgKDB4OEU0QTAwMDApLCAoMHgxNTQwMDAxRiksICgweDAwQzA4ODIxKSwgKDB4OEU1MzAwMDgpLCAoMHhBRTUzMDAwNCksICgweEFFNDYwMDAwKSwgKDB4ODY0NDAwMTIpLCAoMHgxMDAwMDAxMyksICgweEE2NEQwMDEwKSwgKDB4OEU0MzAwMDApLCAoMHg4RTUxMDAwNCksICgweDI0NjJGRkZGKSwgKDB4QUU0MjAwMDApLCAoMHhBMjM0MDAwMCksICgweDk2NUYwMDEwKSwgKDB4NTI5REEwRDgpLCAoMHhCQzE4MDAxNyksCisvLygweDE5QUI4MDNCKSwgKDB4ODNGMDAwMjApLCAoMHg1MEYxRkYwNyksICgweEQ0QzAyRDgwKSwgKDB4RkM4ODFBMjEpLCAoMHhDMUJGMDEwMCksICgweDU4NDE2ODBCKSwgKDB4MTAzQjJDQzApLCAoMHhCMDQyQzI4QSksICgweDIzMjRFOEE4KSwgKDB4MzE1MzE0MzApLCAoMHhFRjcxREQwRSksICgweDdDMUI5RDhFKSwgKDB4MDk5OEMyMjgpLCAoMHg4RkZGNzZGMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDhGRkY3NzAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDNFMDAwMDgpLCAoMHgyNDAyRkZGRiksICgweDE1ODBGRkZEKSwgKDB4MDAwMDAwMDApLCAoMHgwQkYxNDM3OSksICgweDAwMDAwMDAwKSwgKDB4M0MwRjdGRkYpLCAoMHgzNUVGRkZGRiksICgweDEyMDAwMDI0KSwgKDB4OEZBQTA0OUMpLCAoMHgyN0E0MDAyMCksICgweDhGQjUwNDk4KSwgKDB4MDI0NDk4MjMpLCAoMHgwMkIzMjgyMSksCisvLygweDMxMTEwMDA4KSwgKDB4MTIyMDAwMEMpLCAoMHhCNTZEQTk3NCksICgweENBQ0RCMDdDKSwgKDB4NEVFMUFERDQpLCAoMHhFRjg1OUIzNCksICgweDg5RjQ3QjQ3KSwgKDB4NTE1QzE1NUEpLCAoMHgzOEQwNjc1NyksICgweDgwNTBGMUZGKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDhGRkY3NkIwKSwgKDB4MDA2MDEwMjEpLCAoMHgwM0UwMDAwOCksICgweDI3QkQwMDI4KSwgKDB4OEZGRjc2QzApLCAoMHgwMEEwNDAyMSksICgweDAwQzAzODIxKSwgKDB4MTQ2MDAwM0EpLCAoMHg4RkI0MDAyMCksICgweDhGQjMwMDFDKSwgKDB4OEZCMjAwMTgpLCAoMHg4RkIxMDAxNCksICgweDhGQjAwMDEwKSwgKDB4MDNFMDAwMDgpLCAoMHgyN0JEMDAyOCksICgweDI3QkRGRkUwKSwgKDB4MDI0MDIwMjEpLCAoMHgwMjYwMjgyMSksCisvLygweDBGRjAxMTc4KSwgKDB4MjYzMUZGRkYpLCAoMHgxNjIwRkZGOSksICgweDI2MTAwMDA4KSwgKDB4MjY5NDAwMDEpLCAoMHgyQTgzMDAwQyksICgweDgwMDAwOTQ4KSwgKDB4M0ZGRkZGRkYpLCAoMHg3RkZGRkZGRCksICgweDgwMDAwNzQ4KSwgKDB4OUZDNURGQzgpLCAoMHg3NjQyMzBGQyksICgweDMwRkM3NjQyKSwgKDB4MDAwMDAwMDApLCAoMHg4RkIzMDRFQyksICgweDI2QjIwMDAzKSwgKDB4MjY3MTAwMDEpLCAoMHgyNDE0RkZGQyksCisvLygweDAyNTQ4MDI0KSwgKDB4QUZCMTA0RUMpLCAoMHg5MjMyMDAwMCksICgweDhFMDYwMDAwKSwgKDB4NzBDM0Y4MDIpLCAoMHgyNDU5MDAwMSksICgweEFGQjkwNEVDKSwgKDB4MDNGMkMwMjEpLCAoMHg5MzMyMDAwMCksICgweDI2NUVGRkQwKSwgKDB4MkZENzAwMEEpLCAoMHgxNkUwRkZGNyksICgweDlGQzQwOURDKSwgKDB4OUZDNDFBRTQpLCAoMHg5RkM0MUFFNCksICgweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLCAoMHg5RkM0MUFFNCksCisvLygweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLCAoMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwgKDB4MTQ2MEZGRTkpLCAoMHgwMkEwMjAyMSksICgweDBGRjAxMjFFKSwgKDB4MDI0MDIwMjEpLCAoMHgwRkYwMTE4QyksICgweDAwMDAyMDIxKSwgKDB4OEZBNTQwMTgpLCAoMHgwRkYxNDQ1RSksCisvLygweDAwMDA0ODEyKSwgKDB4MDAwMDg4MTApLCAoMHgwMDBENkFDMCksICgweDAwODMwMDE5KSwgKDB4MDFBODgwMjUpLCAoMHgwMDEwNjAwMiksICgweDAwMDAzODEwKSwgKDB4MDAwMDEwMTIpLCAoMHg3MTgzMDAwMSksICgweDAxNjI1MDIxKSwgKDB4MDE0RTI4MjEpLCAoMHgwMDAwODgxMiksICgweDAxNEI0MDJCKSwgKDB4MDBBQTMwMkIpLCAoMHgwMDBGNzAwMiksICgweDAwMDA1MDEwKSwgKDB4QkEzNjcwRjApLCAoMHg2OTkxOTVBMiksCisvLygweDE3MkQyRkQwKSwgKDB4QkUzODZENTEpLCAoMHhDNEFFQTUxQyksICgweDJBQTc3RDdEKSwgKDB4OEI1MUQzQjQpLCAoMHhDRjQ5MEZEOSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4ODgwQjM4OCksICgweDRENTk2QjJEKSwgKDB4MzdENzREQ0YpLCAoMHg1ODEzOEIzOCksCisvLygweDVCN0JDRDRFKSwgKDB4QUU2QzQ0MjIpLCAoMHg0RTVEMUFGMSksICgweERFNzM5NkE1KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAxMDBGRUY3KSwgKDB4MDAwMDAwQzgpLCAoMHg4MDAwQzBDMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweDAwMDAyMUIyKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjMwN0MpLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDYwMDAxKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDgwMDBDMEQwKSwgKDB4ODAwMEMwMDgpLCAoMHgwMDAwMDAwMCksICgweDczNkU2RjYzKSwgKDB4MDA2NTZDNkYpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMEM4KSwgKDB4ODAwMEMxODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDQwMjAyMSksICgweDAwNjAyODIxKSwgKDB4MDJDMDMwMjEpLCAoMHgwRkYxMUFCRiksCisvLygweDAyRTAzODIxKSwgKDB4MDA0MDgwMjEpLCAoMHgzQzAyOUZDNiksICgweDhDNDYyRTcwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEM2NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDUyMDgyNDUwKSwgKDB4M0VFRDE3MDUpLCAoMHhGMjBGRjhBMSksICgweDg5RjZFMTdGKSwgKDB4MTdEN0RDMDApLCAoMHgwOUI5RjJDMyksCisvLygweDYzNzg5NjhDKSwgKDB4QUYwNjA3RjYpLCAoMHhGREZERTBDOSksICgweDNDRTNERkVFKSwgKDB4NTE2ODIyOUUpLCAoMHg3Q0Y3OTczNCksICgweEY1RkZGNTZGKSwgKDB4MzA3MDAwOTMpLCAoMHgxMzVGNUM3NSksICgweEU2RDczRUVFKSwgKDB4NkU0MDBERjkpLCAoMHg1ODI1MkFDQiksICgweDU1NzMxMUNBKSwgKDB4NTUzOUIzMDMpLCAoMHg1NjU1NzM1NSksICgweEI2QkRBQ0VGKSwgKDB4NTlGOTQyOEQpLCAoMHg5QUU2MzAyMCksCisvLygweDgwMDBDMEQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDc5NzQ3NCksICgweDI0MDMwMDAxKSwgKDB4MDEwMEZFRjcpLCAoMHgwMDAwMDBDOCksICgweDgwMDBDMjUwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDIxQjIpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM2MzA3QyksICgweDAwMDAwMDAwKSwgKDB4MDAwODAwMDEpLCAoMHgwMDAwMDAwMSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzE5OCksICgweDAwMDAwMDAwKSwgKDB4MzA3OTc0NzQpLCAoMHgxMDQ3MDAwMCksCisvLygweDAxMDBGRUY3KSwgKDB4MDAwMDA0MDgpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4NzdCQjEwQjApLCAoMHhGQ0RGODM1MCksICgweEQzNEE3QzY1KSwgKDB4RUY2RTU3QkIpLCAoMHhFQ0Q1NkM2OCksICgweDhFQjdDQTM2KSwgKDB4MkYyNkIxMzYpLCAoMHg1NTYzMTI2OSksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MzcwMDAwMDApLCAoMHgwMDAwODBBMyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OEM4NzJGMjQpLCAoMHgwRkYxMUIxMyksCisvLygweDAyMDAyMDIxKSwgKDB4M0MwNjlGQzYpLCAoMHgwMDYwMjgyMSksICgweDAwNjBBODIxKSwgKDB4MjRDMzJENDgpLCAoMHg4QzY2MDAwMCksICgweDAwODAzMDIxKSwgKDB4MEZGMTNBQTApLCAoMHgwMEEwMzgyMSksICgweDEwMDBGRkVDKSwgKDB4MDA0MDIwMjEpLCAoMHg4RkE2MDA2OCksICgweDBGRjEzRTQyKSwgKDB4OEZBNzAwNkMpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAxKSwgKDB4MTA4MDAwMDQpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMTY4KSwgKDB4ODAwMTI1MzgpLCAoMHg4MDAxMjU0OCksICgweDgwMDEyNjQ4KSwgKDB4ODAwMTI3NDgpLCAoMHg4MDAxMEZEMCksICgweDgwMDEwRkQwKSwgKDB4ODAwMTExRDApLCAoMHg4MDAxMTNEMCksICgweDgwMDExNUQwKSwgKDB4ODAwMTE3RDApLCAoMHg4MDAxMTlEMCksICgweDgwMDExQkQwKSwgKDB4ODAwMTFERDApLCAoMHg4MDAxMjdDOCksCisvLygweDgwMDEyN0Q5KSwgKDB4ODAwMTI5N0EpLCAoMHg4MDAxMjk4NSksICgweDgwMDBGRjc4KSwgKDB4ODAwMEZGMDgpLCAoMHg4MDAxMUZFMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDM3MDAwMDAwKSwgKDB4MDAwMDgwQTMpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDhFMDQwMDAwKSwgKDB4OENFNTAwMDApLCAoMHg4Q0U2MDAwNCksICgweDBGRjAwM0EyKSwgKDB4MjQxMjAwMDUpLCAoMHgwMDQwMjAyMSksICgweDEwNDAwMDA0KSwgKDB4MDIyMDI4MjEpLCAoMHgwRkYxMjNBQiksICgweDAwMDAwMDAwKSwgKDB4MDA0MDkwMjEpLCAoMHg4RTJBMDAxMCksCisvLygweDJFNDkwMDAxKSwgKDB4MDAwQTQwMkIpLCAoMHgxMDAwRkZFQSksICgweDAxMDkxMDI0KSwgKDB4OEUyNDAwMDgpLCAoMHg4RTI1MDAwQyksICgweDhFNjYwMDE4KSwgKDB4QUUwNTAwMEMpLCAoMHhBRTA0MDAwOCksICgweDhFMDcwMDBDKSwgKDB4OENDMzAwOTQpLCAoMHgwMDY3NTgyQSksICgweDhGQkYwMDI4KSwgKDB4QUNDNDAwOTApLCAoMHhBQ0M1MDA5NCksICgweDAyNDAxODIxKSwgKDB4OEZCRjAwMjgpLCAoMHg4RkIzMDAyNCksCisvLygweDhGQjIwMDIwKSwgKDB4OEZCMTAwMUMpLCAoMHgyN0E0MDA3MCksICgweDEyMDAwMDA1KSwgKDB4OEZBMjAwOTQpLCAoMHgwRkYxMUNEQiksICgweDAwMDAwMDAwKSwgKDB4QUM1MDAwMDApLCAoMHgyNDAyRkZGRiksICgweDhGQkYwMEJDKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgwMjIwMzgyMSksICgweDBGRjEzQkQwKSwgKDB4MDA2MDI4MjEpLCAoMHgzQzA0OUZDNiksICgweDhDODYyRjQwKSwgKDB4OEM4NzJGNDQpLCAoMHgwMDYwMjgyMSksICgweDBGRjEzRDAxKSwgKDB4OEZGRjZGNTApLCAoMHg1NDQxNEMyMCksICgweDc1NzMyMDREKSwgKDB4NzI2RjcwNzApLCAoMHg4RkZGNkY2MCksICgweDAwMDAwMDBBKSwgKDB4MkQyRDIwMkEpLCAoMHg1NzQxNTIyMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLCAoMHg4NjA3NDkyRSksICgweDI4Q0VGNDQwKSwgKDB4MDIyNzY4QzgpLCAoMHhGNjhFMzYxMSksICgweDg0RTg0RDU1KSwgKDB4NzMwMDRDMDQpLCAoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksCisvLygweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksICgweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLCAoMHhBQjM3MzVEMyksICgweDAwMDAwMDgwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RjFGRjdBMDApLCAoMHhFMjNBODA1MCksICgweDg0MUEyMTE0KSwgKDB4QzU4OERBNzUpLCAoMHgwMjQwMDE0MyksICgweEFFRDZBQUQ3KSwgKDB4OTRDMjU0NUIpLCAoMHgzRTQ2MTU2QyksICgweDA1QkZERjI3KSwgKDB4QjA4MjIwNzUpLCAoMHhEMjRDN0JDNCksICgweDYyMTIyMDU0KSwgKDB4Q0VEQzA3RjQpLCAoMHhFQUIyREUwMCksCisvLygweDA0NUJDMUU4KSwgKDB4ODJCMkFFODYpLCAoMHhFNEJGMjgyMyksICgweDlBMDFCNDdBKSwgKDB4MTc2OTQzOEUpLCAoMHgwMTVDNzk4NiksICgweEE3MEQyMTlDKSwgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwgKDB4M0ZBRjNBMjQpLCAoMHhFNEIyQzQyMSksICgweEI5OUQxNDUzKSwgKDB4Mjc0MUUyNjQpLCAoMHgyMjM5ODEzQSksICgweDI5NDREQTIwKSwgKDB4NDQxRUY3QzQpLCAoMHgwQkQwQjcyMCksCisvLygweEVEODRFQTI2KSwgKDB4NzNFMEMwRDIpLCAoMHg2NzhFMzAzOSksICgweDIxNDIwMTA5KSwgKDB4ODYwNzQ5MkUpLCAoMHgyOENFRjQ0MCksICgweDAyMjc2OEM4KSwgKDB4RjY4RTM2MTEpLCAoMHg4NEU4NEQ1NSksICgweDczMDA0QzA0KSwgKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLCAoMHhBQkM3NTM3QyksICgweDgyQ0ZEQkNCKSwgKDB4MTAwQzYzQTIpLCAoMHg4NzZENzVCQSksCisvLygweEM2ODNGODg4KSwgKDB4MENEQzFFMUUpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4QTYwNkZCMkEpLCAoMHhFNENFMTU1NyksICgweDczMjQwODIwKSwgKDB4ODAzN0E4QjQpLCAoMHhBMUQ4ODAzMiksICgweDc1QTNGMUM3KSwgKDB4MzJCQjAzNzApLCAoMHg1Rjg1MDI0MiksICgweDM3QjZBNzM4KSwgKDB4RkZCQjdENzEpLCAoMHg1RkVERDEyRiksICgweEVFNDdGREM4KSwgKDB4M0RDNzkxM0YpLCAoMHhFQUVFRjdGRCksCisvLygweDIxOURBREVDKSwgKDB4RjlFNTNGNUYpLCAoMHhCM0Q4MkQ5RSksICgweEJCQjc5QkNCKSwgKDB4NDNBRDJBQUIpLCAoMHgwRTdBREJDMCksICgweEFCQkQwOTUyKSwgKDB4MUE2RUY0M0EpLCAoMHhDRDlCMkE5RCksICgweDcyMjJCMzY2KSwgKDB4OTc5RTg5RTkpLCAoMHgwMkM5MTEzRiksICgweDFENTExNDY2KSwgKDB4NTdBOTIyMDYpLCAoMHg0QTQxMjA3NSksICgweEZEMzFENzgzKSwgKDB4QTc1NDJFRkMpLCAoMHgyNEI3Njk3NSksCisvLygweEI5OTk2MkM3KSwgKDB4MTlGMUQzNTYpLCAoMHg5RDEyQzNDQiksICgweDZEMzdENTQyKSwgKDB4MjlFNzIxNEQpLCAoMHg4OTAwRjY0NSksICgweEIxNTRBRDRBKSwgKDB4RjA0N0Q5ODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDEwMTAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzlFOCksICgweDgwMDBDQkYwKSwgKDB4ODAwMENDRDApLCAoMHg4MDAwQ0RCMCksICgweDgwMDBDRTkwKSwgKDB4MDAwMDAwMDApLCAoMHgyRjI2QjEzNiksICgweDU1NjMxMjY5KSwgKDB4RUYxMjEzRTEpLCAoMHhBNTZBQjg0NCksCisvLygweEFBNEIxRDY0KSwgKDB4NjQzNDFFQTkpLCAoMHgwQ0U5REI0OCksICgweDQ2MEMyMTQ0KSwgKDB4QURDNTAyMDUpLCAoMHg1MTVDNDcyRiksICgweDMwNEMyOUJEKSwgKDB4NzZBRjg3MTEpLCAoMHg1NTdDQURCNyksICgweDJBOUJCQzhFKSwgKDB4RTUwRTE0NUIpLCAoMHg5QzIwMzFGRCksICgweEQ5MTIxQThDKSwgKDB4RjUxQTk2RkQpLCAoMHg0NUNDQkVCRiksICgweDVGODg0ODcxKSwgKDB4NjZEQUUyOTEpLCAoMHg5NUFEQzlFNSksCisvLygweDMzQ0YzMDREKSwgKDB4MjNDODdEQ0UpLCAoMHhBNzAxNEZCMyksICgweEZCMzUxRTcxKSwgKDB4OEQ2MEY2NkYpLCAoMHhCRkQ2RERENSksICgweDE1MUZFNkYxKSwgKDB4RENDNzkzNUEpLCAoMHgwQ0FDRkJGMCksICgweEVFNTVBMzcxKSwgKDB4QkU0NkI3NTUpLCAoMHgwRjc5RENEMiksICgweDIzREZGNzZEKSwgKDB4ODNERTc2RDcpLCAoMHg4QjBFM0FFRSksICgweEIwMUJGQjQ0KSwgKDB4NEUzNjE5RkEpLCAoMHhBMTlGOUU2NCksCisvLygweDU0OUNCMTZDKSwgKDB4NzQ2NDlFNjkpLCAoMHhEOEQ0OEFERSksICgweDEyNTNBRUREKSwgKDB4ODA0MTBGRDIpLCAoMHg1QjM2ODg5RCksICgweDg4MENFMUU3KSwgKDB4NTZDNDk4RTcpLCAoMHhCRDQ5MkFEOSksICgweDA4OTlFNDVGKSwgKDB4ODE1NkU0MUQpLCAoMHg1REE1MzlCQSksICgweDBBRjM1QjJDKSwgKDB4REI4OUJBQUUpLCAoMHhBMTI4Qzk2NiksICgweEEwMkNFQUVFKSwgKDB4OEI3RkJDRUMpLCAoMHg5REFGN0VGNSksCisvLygweDdFM0E3OUYxKSwgKDB4OUM4OTZBQ0QpLCAoMHg2MjhGMjQ5QSksICgweERENkU1MUFGKSwgKDB4QUY3Mzk5NEIpLCAoMHg1OTY2OTk1RCksICgweEI3NjIwNTk3KSwgKDB4MzY5QjFFNTQpLCAoMHg3Q0VEQzc4NyksICgweEU3QjE1QjFGKSwgKDB4QjM2RjVGN0QpLCAoMHhCNUI3M0VGNiksICgweEQ3NkVFRUUyKSwgKDB4MTRFODYxODYpLCAoMHhDQzE1OTI5MSksICgweDRFQzg1Q0EzKSwgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksCisvLygweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksICgweDExNzgzNzE5KSwgKDB4OUQ3MDQ4RTUpLCAoMHhDMTI0NTY5RSksICgweENDQjBFMTExKSwgKDB4MTVCMkJCODYpLCAoMHgxODM3MUQ5QyksICgweEIyQUJEOTREKSwgKDB4OEVDNjU2QjMpLCAoMHhCRjAxMDk5NSksICgweDQ2NTIyMEJCKSwgKDB4QzY2RTFGRkMpLCAoMHgyQzYxRDM1NiksICgweEFGRkIxNzZEKSwgKDB4ODgwNjdFMjMpLCAoMHgzNzk2RjAwOCksCisvLygweEM4RDEyOEYzKSwgKDB4QjY2MUE1RkEpLCAoMHhGMTlDRTRGMCksICgweDNGN0QwMzQ1KSwgKDB4RTk3RTYwMzApLCAoMHg0QUJBOTFDRiksICgweERFRURBQjBDKSwgKDB4MzVGRDFENzcpLCAoMHhERDYzNjQzOSksICgweDJGOEI3OTRDKSwgKDB4NzY0RTFEMzIpLCAoMHg3QThEMEIxQiksICgweDhFQUNCMjdGKSwgKDB4NTc3QUQ2N0IpLCAoMHgyQjNGRTJDNSksICgweDhBQ0QwMjRBKSwgKDB4RURGNUM0MkMpLCAoMHhGMUNBOTUxQyksCisvLygweEI5OEI2RDA0KSwgKDB4NkQxMkI4NjQpLCAoMHg1MEU3NEQwOCksICgweDczRDE1MDNCKSwgKDB4QzdEM0Y2QTkpLCAoMHgxRjM2NUU5NyksICgweEUxMzQwRTU5KSwgKDB4ODlEMjFCOUQpLCAoMHg5Qjc1NjczMyksICgweDkwMjRDRDUwKSwgKDB4RTJDN0ZGNTIpLCAoMHhEOUYwNjFFRiksICgweDc3MTUxMzkyKSwgKDB4QTBFNEEwMDQpLCAoMHg2MEJFODIwRiksICgweEM3NjAzQkFGKSwgKDB4QTYyRTNEQTkpLCAoMHhBNDAwRTExRiksCisvLygweDE1NTExMUQ0KSwgKDB4OTAzMEEzNzQpLCAoMHgxNDE4NTEyNCksICgweDhEMDQzQTAwKSwgKDB4NTA5NDUyNTgpLCAoMHgyMEE2NjUzRSksICgweDgyMEQwMjA4KSwgKDB4MDIwMjgyMDcpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMEUwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwNyksICgweDAwMDAwMDM4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAzOCksICgweDAwMDEwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisvLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NTQ0NDJEMTgpLCAoMHg0MDE5MjFGQiksICgweDg2QjJBNTJFKSwgKDB4QkRBOEJENTkpLCAoMHg2MEREREM4QyksICgweDNFMjFFRTNCKQorLy99OwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvbWlwcy9zY2FsZS5jcHAgYi9hYWMvbGliRkRLL3NyYy9taXBzL3NjYWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGEzYTAwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvbWlwcy9zY2FsZS5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoX19taXBzX2RzcCkKKworI2lmbmRlZiBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKKyNkZWZpbmUgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfREJMCisvKiEKKyAqCisgKiAgXGJyaWVmIENhbGN1bGF0ZSBtYXggcG9zc2libGUgc2NhbGUgZmFjdG9yIGZvciBpbnB1dCB2ZWN0b3IKKyAqCisgKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGNhbiBjb25zdGl0dXRlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSAtIHZlcnkgbXVjaCBkZXBlbmRpbmcgb24gdGhlCisgKiAgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwgZnVuY3Rpb24sIGVmZmVjdGl2ZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIHBvc3NpYmxlLgorICoKKyAqLworaW5saW5lIElOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX0RCTCAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4pICAgICAgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLworeworICBJTlQgaTsKKyAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOworCisgIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgICAgbWF4VmFsIHw9IF9fYnVpbHRpbl9taXBzX2Fic3Ffc193KCp2ZWN0b3IrKyk7CisgIH0KKworICByZXR1cm4gZml4TWF4KChJTlQpMCwoQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qX19taXBzX2RzcCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYkZESy9zcmMvcW1mLmNwcCBiL2FhYy9saWJGREsvc3JjL3FtZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1MjZkZAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJGREsvc3JjL3FtZi5jcHAKQEAgLTAsMCArMSwxMTk2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyLCBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBRTUYgZmlsdGVyYmFuaworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIENvbXBsZXggcW1mIGFuYWx5c2lzL3N5bnRoZXNpcywgIAorICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcW1mIGZpbHRlcmJhbmsgZm9yIGFuYWx5c2lzIFsgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCkgXSBhbmQKKyAgc3ludGhlc2lzIFsgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpIF0uIEl0IGlzIGEgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgY29tcGxleAorICBleHBvbmVudGlhbCBtb2R1bGF0ZWQgZmlsdGVyIGJhbmsuIFRoZSBhbmFseXNpcyBwYXJ0IHVzdWFsbHkgcnVucyBhdCBoYWxmIHRoZSBzYW1wbGUgcmF0ZQorICB0aGFuIHRoZSBzeW50aGVzaXMgcGFydC4gKFNvIGNhbGxlZCAiZHVhbC1yYXRlIiBtb2RlLikKKworICBUaGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcm90b3R5cGUgZmlsdGVyIGFyZSBzcGVjaWZpZWQgaW4gI3Nicl9xbWZfNjRfNjQwIChpbiBzYnJfcm9tLmNwcCkuCisgIFRodXMgb25seSBhIDY0IGNoYW5uZWwgdmVyc2lvbiAoMzIgb24gdGhlIGFuYWx5c2lzIHNpZGUpIHdpdGggYSA2NDAgdGFwIHByb3RvdHlwZSBmaWx0ZXIKKyAgYXJlIHVzZWQuCisKKyAgXGFuY2hvciBQb2x5cGhhc2VGaWx0ZXJpbmcgPGgyPkFib3V0IHBvbHlwaGFzZSBmaWx0ZXJpbmc8L2gyPgorICBUaGUgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmlsdGVyYmFuayByZXF1aXJlcyBmaWx0ZXJpbmcgYXQgdGhlIGlucHV0IGFuZCBvdXRwdXQuCisgIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBjcGx4QW5hbHlzaXNRbWZGaWx0ZXJpbmcoKSBhbmQgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpLgorICBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgaW4gYSBzcGVjaWZpYyBzdHJ1Y3R1cmUgYXMgZGVzY3JpYmVkIGluCisgICNzYnJfcW1mXzY0XzY0MF9xbWYgKGluIHNicl9yb20uY3BwKS4KKworICBUaGlzIG1vZHVsZSBjb21wcmlzZXMgdGhlIGNvbXB1dGF0aW9uYWxseSBtb3N0IGV4cGVuc2l2ZSBmdW5jdGlvbnMgb2YgdGhlIFNCUiBkZWNvZGVyLiBUaGUgYWNjdXJhY3kgb2YKKyAgY29tcHV0YXRpb25zIGlzIGFsc28gaW1wb3J0YW50IGFuZCBoYXMgYSBkaXJlY3QgaW1wYWN0IG9uIHRoZSBvdmVyYWxsIHNvdW5kIHF1YWxpdHkuIFRoZXJlZm9yZSBhIHNwZWNpYWwKKyAgdGVzdCBwcm9ncmFtIGlzIGF2YWlsYWJsZSB3aGljaCBjYW4gYmUgdXNlZCB0byBvbmx5IHRlc3QgdGhlIGZpbHRlcmJhbms6IG1haW5fYXVkaW8uY3BwCisKKyAgVGhpcyBtb2R1bGVzIGFsc28gdXNlcyBzY2FsaW5nIG9mIGRhdGEgdG8gcHJvdmlkZSBiZXR0ZXIgU05SIG9uIGZpeGVkLXBvaW50IHByb2Nlc3NvcnMuIFNlZSAjUU1GX1NDQUxFX0ZBQ1RPUiAoaW4gc2JyX3NjYWxlLmgpIGZvciBkZXRhaWxzLgorICBBbiBpbnRlcmVzdGluZyBub3RlOiBUaGUgZnVuY3Rpb24gZ2V0U2NhbGVmYWN0b3IoKSBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgLSB2ZXJ5IG11Y2ggZGVwZW5kaW5nIG9uIHRoZQorICBiaXRyYXRlLiBTaW5jZSBpdCBpcyBhIHJhdGhlciBzbWFsbCBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisKKyovCisKKyNpbmNsdWRlICJxbWYuaCIKKworCisjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgorI2luY2x1ZGUgImRjdC5oIgorCisjaWZkZWYgUU1GU1lOX1NUQVRFU18xNkJJVAorI2RlZmluZSBRU1NDQUxFICg3KQorI2RlZmluZSBGWF9EQkwyRlhfUVNTKHgpICgoRklYUF9RU1MpICgoeCk+PihERlJBQ1RfQklUUy1RU1NfQklUUy1RU1NDQUxFKSApKQorI2RlZmluZSBGWF9RU1MyRlhfREJMKHgpICgoRklYUF9EQkwpKChMT05HKXgpPDwoREZSQUNUX0JJVFMtUVNTX0JJVFMtUVNTQ0FMRSkpCisjZWxzZQorI2RlZmluZSBRU1NDQUxFICgwKQorI2RlZmluZSBGWF9EQkwyRlhfUVNTKHgpICh4KQorI2RlZmluZSBGWF9RU1MyRlhfREJMKHgpICh4KQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoX19hcm1fXykKKyNpbmNsdWRlICJhcm0vcW1mX2FybS5jcHAiCisKKyNlbmRpZgorCisvKiEKKyAqIFxicmllZiBBbGdvcml0aG1pYyBzY2FsaW5nIGluIHNickZvcndhcmRNb2R1bGF0aW9uKCkKKyAqCisgKiBUaGUgc2NhbGluZyBpbiBzYnJGb3J3YXJkTW9kdWxhdGlvbigpIGlzIGNhdXNlZCBieToKKyAqCisgKiAgIFxsaSAxIFJfU0hJRlQgaW4gc2JyRm9yd2FyZE1vZHVsYXRpb24oKQorICogICBcbGkgNS82IFJfU0hJRlQgaW4gZGN0MygpIGlmIHVzaW5nIDMyLzY0IEJhbmRzCisgKiAgIFxsaSAxIG9tbWl0ZWQgZ2FpbiBvZiAyLjAgaW4gcW1mRm9yd2FyZE1vZHVsYXRpb24oKQorICovCisjZGVmaW5lIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyA3CisKKy8qIQorICogXGJyaWVmIEFsZ29yaXRobWljIHNjYWxpbmcgaW4gY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpCisgKgorICogVGhlIHNjYWxpbmcgaW4gY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpIGlzIGNhdXNlZCBieToKKyAqCisgKiAgIFxsaSAgNS82IFJfU0hJRlQgaW4gZGN0MigpIGlmIHVzaW5nIDMyLzY0IEJhbmRzCisgKiAgIFxsaSAgMSBvbW1pdGVkIGdhaW4gb2YgMi4wIGluIHFtZkludmVyc2VNb2R1bGF0aW9uKCkKKyAqICAgXGxpIC02IGRpdmlzaW9uIGJ5IDY0IGluIHN5bnRoZXNpcyBmaWx0ZXJiYW5rCisgKiAgIFxsaSB4IGJpdHMgZXh0ZXJuYWwgaW5mbHVlbmNlCisgKi8KKyNkZWZpbmUgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyAxCisKKworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCisgIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgorKi8KK3N0YXRpYworI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90Cit2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3QoCisjZWxzZQordm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcmVhbFNsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byByZWFsIFNsb3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGltYWdTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICpSRVNUUklDVCB0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgRklYUF9RU1MqIEZpbHRlclN0YXRlcyA9IChGSVhQX1FTUyopcW1mLT5GaWx0ZXJTdGF0ZXM7CisgIGludCAgICAgICBub19jaGFubmVscyA9IHFtZi0+bm9fY2hhbm5lbHM7CisgIGNvbnN0IEZJWFBfUEZUICpwX0ZpbHRlciA9IHFtZi0+cF9maWx0ZXI7CisgIGludCBwX3N0cmlkZSA9IHFtZi0+cF9zdHJpZGU7CisgIGludCBqOworICBGSVhQX1FTUyAqUkVTVFJJQ1Qgc3RhID0gRmlsdGVyU3RhdGVzOworICBjb25zdCBGSVhQX1BGVCAqUkVTVFJJQ1QgcF9mbHQsICpSRVNUUklDVCBwX2ZsdG07CisgIGludCBzY2FsZSA9ICgoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3Rvcik7CisKKyAgcF9mbHQgID0gcF9GaWx0ZXIrcF9zdHJpZGUqUU1GX05PX1BPTFk7ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgNS10ZXIgdm9uIDMzMCAqLworICBwX2ZsdG0gPSBwX0ZpbHRlcisocW1mLT5GaWx0ZXJTaXplLzIpLXBfc3RyaWRlKlFNRl9OT19QT0xZOyAgLyogNSArICgzMjAgLSAyKjUpID0gMzE1LXRlciB2b24gMzMwICovCisKKyAgRkRLX0FTU0VSVChTQU1QTEVfQklUUy0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7IC8vICAgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7CisKKyAgZm9yIChqID0gbm9fY2hhbm5lbHMtMTsgaiA+PSAwOyBqLS0pIHsgIC8qIC0tLS0gbOR1ZnQgdWViZXIgYWxsZSBMaW5pZW4gZWluZXMgU2xvdHMgLS0tLSAqLworICAgIEZJWFBfUU1GIGltYWcgID0gIGltYWdTbG90W2pdOyAgLy8gbm9fY2hhbm5lbHMtMSAuLiAwCisgICAgRklYUF9RTUYgcmVhbCAgPSAgcmVhbFNsb3Rbal07ICAvLyB+fiJ+fgorICAgIHsKKyAgICAgIElOVF9QQ00gdG1wOworICAgICAgRklYUF9EQkwgQXJlID0gRlhfUVNTMkZYX0RCTChzdGFbMF0pICsgZk11bHREaXYyKCBwX2ZsdG1bMF0gLCByZWFsKTsKKworICAgICAgaWYgKHFtZi0+b3V0R2FpbiE9KEZJWFBfREJMKTB4ODAwMDAwMDApIHsKKyAgICAgICAgQXJlID0gZk11bHQoQXJlLHFtZi0+b3V0R2Fpbik7CisgICAgICB9CisKKyAgI2lmIFNBTVBMRV9CSVRTID4gMTYKKyAgICAgIHRtcCA9IChJTlRfUENNKShTQVRVUkFURV9TSElGVChmQWJzKEFyZSksIHNjYWxlLCBTQU1QTEVfQklUUykpOworICAjZWxzZQorICAgICAgdG1wID0gKElOVF9QQ00pKFNBVFVSQVRFX1JJR0hUX1NISUZUKGZBYnMoQXJlKSwgc2NhbGUsIFNBTVBMRV9CSVRTKSk7CisgICNlbmRpZgorICAgICAgaWYgKEFyZSA8IChGSVhQX1FNRikwKSB7CisgICAgICAgIHRtcCA9IC10bXA7CisgICAgICB9CisgICAgICB0aW1lT3V0WyAoaikqc3RyaWRlIF0gPSB0bXA7CisgICAgfQorCisgICAgc3RhWzBdID0gc3RhWzFdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFs0XSAsIGltYWcgKSk7CisgICAgc3RhWzFdID0gc3RhWzJdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVsxXSAsIHJlYWwgKSk7CisgICAgc3RhWzJdID0gc3RhWzNdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFszXSAsIGltYWcgKSk7CisgICAgc3RhWzNdID0gc3RhWzRdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVsyXSAsIHJlYWwgKSk7CisgICAgc3RhWzRdID0gc3RhWzVdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFsyXSAsIGltYWcgKSk7CisgICAgc3RhWzVdID0gc3RhWzZdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVszXSAsIHJlYWwgKSk7CisgICAgc3RhWzZdID0gc3RhWzddICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFsxXSAsIGltYWcgKSk7CisgICAgc3RhWzddID0gc3RhWzhdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVs0XSAsIHJlYWwgKSk7CisgICAgc3RhWzhdID0gICAgICAgICAgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFswXSAsIGltYWcgKSk7CisKKyAgICBwX2ZsdCAgKz0gKHBfc3RyaWRlKlFNRl9OT19QT0xZKTsKKyAgICBwX2ZsdG0gLT0gKHBfc3RyaWRlKlFNRl9OT19QT0xZKTsKKyAgICBzdGEgICAgKz0gOTsgLy8gPSAoMipRTUZfTk9fUE9MWS0xKTsKKyAgfQorfQorCisjaWZuZGVmIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljCisvKiEKKyAgXGJyaWVmIFBlcmZvcm0gU3ludGhlc2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgorCisgIFRoZSBmaWx0ZXIgdGFrZXMgMiAqIHFtZi0+bm9fY2hhbm5lbHMgb2YgaW5wdXQgZGF0YSBhbmQKKyAgZ2VuZXJhdGVzIHFtZi0+bm9fY2hhbm5lbHMgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMuCisqLworc3RhdGljCit2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqUkVTVFJJQ1QgdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIEZJWFBfUVNTKiBGaWx0ZXJTdGF0ZXMgPSAoRklYUF9RU1MqKXFtZi0+RmlsdGVyU3RhdGVzOworICBpbnQgICAgICAgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOworICBjb25zdCBGSVhQX1BGVCAqcF9GaWx0ZXIgPSBxbWYtPnBfZmlsdGVyOworICBpbnQgcF9zdHJpZGUgPSBxbWYtPnBfc3RyaWRlOworICBpbnQgajsKKyAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IEZpbHRlclN0YXRlczsKKyAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0LCAqUkVTVFJJQ1QgcF9mbHRtOworICBpbnQgc2NhbGUgPSAoKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IpOworCisgIHBfZmx0ICA9IHBfRmlsdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBmaXJzdCBoYWxmIG9mIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgcF9mbHRtID0gJnBfZmx0W3FtZi0+RmlsdGVyU2l6ZS8yXTsgIC8qIGF0IGluZGV4IDMyMCwgb3ZlcmFsbCA2NDAgY29lZmZpY2llbnRzICovCisKKyAgRkRLX0FTU0VSVChTQU1QTEVfQklUUy0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7IC8vICAgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7CisKKyAgZm9yIChqID0gbm9fY2hhbm5lbHMtMTsgaiA+PSAwOyBqLS0pIHsgIC8qIC0tLS0gbOR1ZnQgdWViZXIgYWxsZSBMaW5pZW4gZWluZXMgU2xvdHMgLS0tLSAqLworCisgICAgRklYUF9RTUYgaW1hZyAgPSAgaW1hZ1Nsb3Rbal07ICAvLyBub19jaGFubmVscy0xIC4uIDAKKyAgICBGSVhQX1FNRiByZWFsICA9ICByZWFsU2xvdFtqXTsgIC8vIH5+In5+CisgICAgeworICAgICAgSU5UX1BDTSB0bXA7CisgICAgICBGSVhQX1FNRiBBcmUgPSBzdGFbMF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzRdICwgcmVhbCApKTsKKworICAjaWYgU0FNUExFX0JJVFMgPiAxNgorICAgICAgdG1wID0gKElOVF9QQ00pKFNBVFVSQVRFX1NISUZUKGZBYnMoQXJlKSwgc2NhbGUsIFNBTVBMRV9CSVRTKSk7CisgICNlbHNlCisgICAgICB0bXAgPSAoSU5UX1BDTSkoU0FUVVJBVEVfUklHSFRfU0hJRlQoZkFicyhBcmUpLCBzY2FsZSwgU0FNUExFX0JJVFMpKTsKKyAgI2VuZGlmCisgICAgICBpZiAoQXJlIDwgKEZJWFBfUU1GKTApIHsKKyAgICAgICAgdG1wID0gLXRtcDsKKyAgICAgIH0KKyAgICAgIHRpbWVPdXRbaipzdHJpZGVdID0gdG1wOworICAgIH0KKworICAgIHN0YVswXSA9IHN0YVsxXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbNF0gLCBpbWFnICkpOworICAgIHN0YVsxXSA9IHN0YVsyXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bM10gLCByZWFsICkpOworICAgIHN0YVsyXSA9IHN0YVszXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbM10gLCBpbWFnICkpOworCisgICAgc3RhWzNdID0gc3RhWzRdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVsyXSAsIHJlYWwgKSk7CisgICAgc3RhWzRdID0gc3RhWzVdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFsyXSAsIGltYWcgKSk7CisgICAgc3RhWzVdID0gc3RhWzZdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVsxXSAsIHJlYWwgKSk7CisgICAgc3RhWzZdID0gc3RhWzddICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFsxXSAsIGltYWcgKSk7CisKKyAgICBzdGFbN10gPSBzdGFbOF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzBdICwgcmVhbCApKTsKKyAgICBzdGFbOF0gPSAgICAgICAgICBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzBdICwgaW1hZyApKTsKKworICAgIHBfZmx0ICArPSAocF9zdHJpZGUqUU1GX05PX1BPTFkpOworICAgIHBfZmx0bSArPSAocF9zdHJpZGUqUU1GX05PX1BPTFkpOworICAgIHN0YSAgICArPSA5OyAvLyA9ICgyKlFNRl9OT19QT0xZLTEpOworICB9CisKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAqLworCisjaWZuZGVmIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QKKy8qIQorICBcYnJpZWYgUGVyZm9ybSBBbmFseXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKyovCitzdGF0aWMKK3ZvaWQgcW1mQW5hUHJvdG90eXBlRmlyU2xvdCggRklYUF9RTUYgKmFuYWx5c2lzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBwX3N0cmlkZSwgICAgICAgICAgICAgICAgLyohPCBTdGlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaW50IGs7CisKKyAgICBGSVhQX0RCTCBhY2N1OworICAgIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCA9IHBfZmlsdGVyOworICAgIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8wID0gYW5hbHlzaXNCdWZmZXIgKyAyKm5vX2NoYW5uZWxzIC0gMTsKKyAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcERhdGFfMSA9IGFuYWx5c2lzQnVmZmVyOworCisgICAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8wID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlczsKKyAgICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzEgPSAoRklYUF9RQVMgKilwRmlsdGVyU3RhdGVzICsgKDIqUU1GX05PX1BPTFkqbm9fY2hhbm5lbHMpIC0gMTsKKyAgICBpbnQgcGZsdFN0ZXAgPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZSk7CisgICAgaW50IHN0YVN0ZXAxID0gbm9fY2hhbm5lbHM8PDE7CisgICAgaW50IHN0YVN0ZXAyID0gKG5vX2NoYW5uZWxzPDwzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLworCisgICAgLyogRklSIGZpbHRlciAwICovCisgICAgYWNjdSA9ICAgZk11bHREaXYyKCBwX2ZsdFswXSwgKnN0YV8xKTsgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbMV0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgYWNjdSArPSAgZk11bHREaXYyKCBwX2ZsdFszXSwgKnN0YV8xKTsgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbNF0sICpzdGFfMSk7CisgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTw8MSk7CisgICAgc3RhXzEgKz0gc3RhU3RlcDI7CisKKyAgICBwX2ZsdCArPSBwZmx0U3RlcDsKKworICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgKi8KKyAgICBmb3IgKGs9MDsgazxub19jaGFubmVscy0xOyBrKyspCisgICAgeworICAgICAgYWNjdSA9ICBmTXVsdERpdjIoIHBfZmx0WzBdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9IGZNdWx0RGl2MiggcF9mbHRbMV0sICpzdGFfMCk7ICBzdGFfMCArPSBzdGFTdGVwMTsKKyAgICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsyXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzNdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9IGZNdWx0RGl2MiggcF9mbHRbNF0sICpzdGFfMCk7CisgICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKKyAgICAgIHN0YV8wIC09IHN0YVN0ZXAyOworCisgICAgICBhY2N1ID0gICBmTXVsdERpdjIoIHBfZmx0WzBdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzFdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzNdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7CisgICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzRdLCAqc3RhXzEpOworICAgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTw8MSk7CisgICAgICBzdGFfMSArPSBzdGFTdGVwMjsKKworICAgICAgcF9mbHQgKz0gcGZsdFN0ZXA7CisgICAgfQorCisgICAgLyogRklSIGZpbHRlciA2NCAqLworICAgIGFjY3UgPSAgZk11bHREaXYyKCBwX2ZsdFswXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsxXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsyXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFszXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFs0XSwgKnN0YV8wKTsKKyAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKKyAgICBzdGFfMCAtPSBzdGFTdGVwMjsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90KSAqLworCisKKyNpZm5kZWYgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMKKy8qIQorICBcYnJpZWYgUGVyZm9ybSBBbmFseXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKyovCitzdGF0aWMKK3ZvaWQgcW1mQW5hUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKmFuYWx5c2lzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub19jaGFubmVscywgICAgICAgICAgICAgLyohPCBOdW1iZXIgY2hhbm5lbHMgb2YgYW5hbHlzaXMgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBwX3N0cmlkZSwgICAgICAgICAgICAgICAgLyohPCBTdGlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgcEZpbHRlclN0YXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBjb25zdCBGSVhQX1BGVCAqUkVTVFJJQ1QgcF9mbHQgPSBwX2ZpbHRlcjsKKyAgaW50ICBwLCBrOworCisgIGZvciAoayA9IDA7IGsgPCAyKm5vX2NoYW5uZWxzOyBrKyspCisgIHsKKyAgICBGSVhQX0RCTCBhY2N1ID0gKEZJWFBfREJMKTA7CisKKyAgICBwX2ZsdCArPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZSAtIDEpOworCisgICAgLyoKKyAgICAgIFBlcmZvcm0gRklSLUZpbHRlcgorICAgICovCisgICAgZm9yIChwID0gMDsgcCA8IFFNRl9OT19QT0xZOyBwKyspIHsKKyAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MigqcF9mbHQrKywgcEZpbHRlclN0YXRlc1syKm5vX2NoYW5uZWxzICogcF0pOworICAgIH0KKyAgICBhbmFseXNpc0J1ZmZlclsyKm5vX2NoYW5uZWxzIC0gMSAtIGtdID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKKyAgICBwRmlsdGVyU3RhdGVzKys7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAqLworCisvKiEKKyAqCisgKiBcYnJpZWYgUGVyZm9ybSByZWFsLXZhbHVlZCBmb3J3YXJkIG1vZHVsYXRpb24gb2YgdGhlIHRpbWUgZG9tYWluCisgKiAgICAgICAgZGF0YSBvZiB0aW1lSW4gYW5kIHN0b3JlcyB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBzdWJiYW5kCisgKiAgICAgICAgc2FtcGxlcyBpbiByU3ViYmFuZAorICoKKyAqLworc3RhdGljIHZvaWQKK3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfZXZlbiggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqclN1YmJhbmQgKSAgICAgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLworeworICBpbnQgaTsKKyAgaW50IEwgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOworICBpbnQgTSA9IEw+PjE7CisgIGludCBzY2FsZTsKKyAgRklYUF9RTUYgYWNjdTsKKworICBjb25zdCBGSVhQX1FNRiAqdGltZUluVG1wMSA9IChGSVhQX1FNRiAqKSAmdGltZUluWzMgKiBNXTsKKyAgY29uc3QgRklYUF9RTUYgKnRpbWVJblRtcDIgPSB0aW1lSW5UbXAxOworICBGSVhQX1FNRiAqclN1YmJhbmRUbXAgPSByU3ViYmFuZDsKKworICByU3ViYmFuZFswXSA9IHRpbWVJblszICogTV0gPj4gMTsKKworICBmb3IgKGkgPSBNLTE7IGkgIT0gMDsgaS0tKSB7CisgICAgYWNjdSA9ICgoKi0tdGltZUluVG1wMSkgPj4gMSkgKyAoKCorK3RpbWVJblRtcDIpID4+IDEpOworICAgICorK3JTdWJiYW5kVG1wID0gYWNjdTsKKyAgfQorCisgIHRpbWVJblRtcDEgPSAmdGltZUluWzIgKiBNXTsKKyAgdGltZUluVG1wMiA9ICZ0aW1lSW5bMF07CisgIHJTdWJiYW5kVG1wID0gJnJTdWJiYW5kW01dOworCisgIGZvciAoaSA9IEwtTTsgaSAhPSAwOyBpLS0pIHsKKyAgICBhY2N1ID0gKCgqdGltZUluVG1wMS0tKSA+PiAxKSAtICgoKnRpbWVJblRtcDIrKykgPj4gMSk7CisgICAgKnJTdWJiYW5kVG1wKysgPSBhY2N1OworICB9CisKKyAgZGN0X0lJSShyU3ViYmFuZCwgdGltZUluLCBMLCAmc2NhbGUpOworfQorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQpCitzdGF0aWMgdm9pZAorcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpyU3ViYmFuZCApICAgICAgICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCit7CisgIGludCBpOworICBpbnQgTCA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7CisgIGludCBNID0gTD4+MTsKKyAgaW50IHNoaWZ0ID0gKGFuYVFtZi0+bm9fY2hhbm5lbHM+PjYpICsgMTsKKworICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgclN1YmJhbmRbTSArIGldICAgICA9ICh0aW1lSW5bTCAtIDEgLSBpXT4+MSkgLSAodGltZUluW2ldPj5zaGlmdCk7CisgICAgclN1YmJhbmRbTSAtIDEgLSBpXSA9ICh0aW1lSW5bTCArIGldPj4xKSAgICAgKyAodGltZUluWzIgKiBMIC0gMSAtIGldPj5zaGlmdCk7CisgIH0KKworICBkY3RfSVYoclN1YmJhbmQsIEwsICZzaGlmdCk7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQpICovCisKKworCisvKiEKKyAqCisgKiBcYnJpZWYgUGVyZm9ybSBjb21wbGV4LXZhbHVlZCBmb3J3YXJkIG1vZHVsYXRpb24gb2YgdGhlIHRpbWUgZG9tYWluCisgKiAgICAgICAgZGF0YSBvZiB0aW1lSW4gYW5kIHN0b3JlcyB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBzdWJiYW5kCisgKiAgICAgICAgc2FtcGxlcyBpbiByU3ViYmFuZCwgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpbiBpU3ViYmFuZAorICoKKyAqICAgICAgICBPbmx5IHRoZSBsb3dlciBiYW5kcyBhcmUgb2J0YWluZWQgKHVwdG8gYW5hUW1mLT5sc2IpLiBGb3IKKyAqICAgICAgICBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCisgKiAgICAgICAgYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgorICoKKyAqLworc3RhdGljIHZvaWQKK3FtZkZvcndhcmRNb2R1bGF0aW9uSFEoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgICAgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqUkVTVFJJQ1QgdGltZUluLCAgIC8qITwgVGltZSBTaWduYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCByU3ViYmFuZCwgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGlTdWJiYW5kICAgICAgICAvKiE8IEltYWdpbmFyeSBPdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaTsKKyAgaW50IEwgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOworICBpbnQgTDIgPSBMPDwxOworICBpbnQgc2hpZnQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBMOyBpKz0yKSB7CisgICAgRklYUF9RTUYgeDAsIHgxLCB5MCwgeTE7CisKKyAgICB4MCA9IHRpbWVJbltpXSA+PiAxOworICAgIHgxID0gdGltZUluW2krMV0gPj4gMTsKKyAgICB5MCA9IHRpbWVJbltMMiAtIDEgLSBpXSA+PiAxOworICAgIHkxID0gdGltZUluW0wyIC0gMiAtIGldID4+IDE7CisKKyAgICByU3ViYmFuZFtpXSA9IHgwIC0geTA7CisgICAgclN1YmJhbmRbaSsxXSA9IHgxIC0geTE7CisgICAgaVN1YmJhbmRbaV0gPSB4MCArIHkwOworICAgIGlTdWJiYW5kW2krMV0gPSB4MSArIHkxOworICB9CisKKyAgZGN0X0lWKHJTdWJiYW5kLCBMLCAmc2hpZnQpOworICBkc3RfSVYoaVN1YmJhbmQsIEwsICZzaGlmdCk7CisKKyAgeworICAgIHsKKyAgICAgIGNvbnN0IEZJWFBfUVRXICpSRVNUUklDVCBzYnJfdF9jb3M7CisgICAgICBjb25zdCBGSVhQX1FUVyAqUkVTVFJJQ1Qgc2JyX3Rfc2luOworICAgICAgc2JyX3RfY29zID0gYW5hUW1mLT50X2NvczsKKyAgICAgIHNicl90X3NpbiA9IGFuYVFtZi0+dF9zaW47CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhbmFRbWYtPmxzYjsgaSsrKSB7CisgICAgICAgIGNwbHhNdWx0KCZpU3ViYmFuZFtpXSwgJnJTdWJiYW5kW2ldLCBpU3ViYmFuZFtpXSwgclN1YmJhbmRbaV0sIHNicl90X2Nvc1tpXSwgc2JyX3Rfc2luW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoKKyAqIFxicmllZiBQZXJmb3JtIG9uZSBRTUYgc2xvdCBhbmFseXNpcyBvZiB0aGUgdGltZSBkb21haW4gZGF0YSBvZiB0aW1lSW4KKyAqICAgICAgICB3aXRoIHNwZWNpZmllZCBzdHJpZGUgYW5kIHN0b3JlcyB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBzdWJiYW5kCisgKiAgICAgICAgc2FtcGxlcyBpbiByU3ViYmFuZCwgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpbiBpU3ViYmFuZAorICoKKyAqICAgICAgICBPbmx5IHRoZSBsb3dlciBiYW5kcyBhcmUgb2J0YWluZWQgKHVwdG8gYW5hUW1mLT5sc2IpLiBGb3IKKyAqICAgICAgICBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCisgKiAgICAgICAgYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgorICovCit2b2lkCitxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpxbWZSZWFsLCAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcW1mSW1hZywgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKlJFU1RSSUNUIHRpbWVJbiwgLyohPCBQb2ludGVyIHRvIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgIHN0cmlkZSwgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnBXb3JrQnVmZmVyICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIGludCBpOworICAgIGludCBvZmZzZXQgPSBhbmFRbWYtPm5vX2NoYW5uZWxzKihRTUZfTk9fUE9MWSoyLTEpOworICAgIC8qCisgICAgICBGZWVkIHRpbWUgc2lnbmFsIGludG8gb2xkZXN0IGFuYVFtZi0+bm9fY2hhbm5lbHMgc3RhdGVzCisgICAgKi8KKyAgICB7CisgICAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgRmlsdGVyU3RhdGVzQW5hVG1wID0gKChGSVhQX1FBUyopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpK29mZnNldDsKKworICAgICAgLyogRmVlZCBhbmQgc2NhbGUgYWN0dWFsIHRpbWUgaW4gc2xvdCAqLworICAgICAgZm9yKGk9YW5hUW1mLT5ub19jaGFubmVscz4+MTsgaSE9MDsgaS0tKSB7CisgICAgICAgIC8qIFBsYWNlIElOVF9QQ00gdmFsdWUgbGVmdCBhbGlnbmVkIGluIHNjYWxlZFRpbWVJbiAqLworI2lmIChRQVNfQklUUz09U0FNUExFX0JJVFMpCisgICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykqdGltZUluOyB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKnRpbWVJbjsgdGltZUluICs9IHN0cmlkZTsKKyNlbGlmIChRQVNfQklUUz5TQU1QTEVfQklUUykKKyAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbik8PChRQVNfQklUUy1TQU1QTEVfQklUUykpOyB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKCgqdGltZUluKTw8KFFBU19CSVRTLVNBTVBMRV9CSVRTKSk7IHRpbWVJbiArPSBzdHJpZGU7CisjZWxzZQorICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKCgqdGltZUluKT4+KFNBTVBMRV9CSVRTLVFBU19CSVRTKSk7IHRpbWVJbiArPSBzdHJpZGU7CisgICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykoKCp0aW1lSW4pPj4oU0FNUExFX0JJVFMtUUFTX0JJVFMpKTsgdGltZUluICs9IHN0cmlkZTsKKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTk9OU1lNTUVUUklDKSB7CisgICAgICBxbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5ub19jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgIHFtZkFuYVByb3RvdHlwZUZpclNsb3QoIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5ub19jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkgeworICAgICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikKKyAgICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoIGFuYVFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mUmVhbCApOworICAgICAgZWxzZQorICAgICAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX2V2ZW4oIGFuYVFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZSZWFsICk7CisKKyAgICB9IGVsc2UgeworICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25IUSggYW5hUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mSW1hZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICAvKgorICAgICAgU2hpZnQgZmlsdGVyIHN0YXRlcworCisgICAgICBTaG91bGQgYmUgcmVhbGl6ZWQgd2l0aCBtb2R1bG8gYWRyZXNzaW5nIG9uIGEgRFNQIGluc3RlYWQgb2YgYSB0cnVlIGJ1ZmZlciBzaGlmdAorICAgICovCisgICAgRkRLbWVtbW92ZSAoKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcywgKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcythbmFRbWYtPm5vX2NoYW5uZWxzLCBvZmZzZXQqc2l6ZW9mKEZJWFBfUUFTKSk7Cit9CisKKworLyohCisgKgorICogXGJyaWVmIFBlcmZvcm0gY29tcGxleC12YWx1ZWQgc3ViYmFuZCBmaWx0ZXJpbmcgb2YgdGhlIHRpbWUgZG9tYWluCisgKiAgICAgICAgZGF0YSBvZiB0aW1lSW4gYW5kIHN0b3JlcyB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBzdWJiYW5kCisgKiAgICAgICAgc2FtcGxlcyBpbiByQW5hbHlzaXMsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaW4gaUFuYWx5c2lzCisgKiBUaGUgcW1mIGNvZWZmaWNpZW50IHRhYmxlIGlzIHN5bW1ldHJpYy4gVGhlIHN5bW1ldHJ5IGlzIGV4cG9pdGVkIGJ5CisgKiBzaHJpbmtpbmcgdGhlIGNvZWZmaWNpZW50IHRhYmxlIHRvIGhhbGYgdGhlIHNpemUuIFRoZSBhZGRyZXNzaW5nIG1vZGUKKyAqIHRha2VzIGNhcmUgb2YgdGhlIHN5bW1ldHJpZXMuCisgKgorICogT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCisgKiBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCisgKiBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCisgKgorICogXHNhIFBvbHlwaGFzZUZpbHRlcmluZworICovCisKK3ZvaWQKK3FtZkFuYWx5c2lzRmlsdGVyaW5nKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgICAgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqKnFtZlJlYWwsICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICoqcW1mSW1hZywgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgIC8qITwgVGltZSBzaWduYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgKnBXb3JrQnVmZmVyICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaTsKKyAgaW50IG5vX2NoYW5uZWxzID0gYW5hUW1mLT5ub19jaGFubmVsczsKKworICBzY2FsZUZhY3Rvci0+bGJfc2NhbGUgPSAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LOworICBzY2FsZUZhY3Rvci0+bGJfc2NhbGUgLT0gYW5hUW1mLT5maWx0ZXJTY2FsZTsKKworICBmb3IgKGkgPSAwOyBpIDwgYW5hUW1mLT5ub19jb2w7IGkrKykKKyAgeworICAgICAgRklYUF9RTUYgKnFtZkltYWdTbG90ID0gTlVMTDsKKworICAgICAgaWYgKCEoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkgeworICAgICAgICBxbWZJbWFnU2xvdCA9IHFtZkltYWdbaV07CisgICAgICB9CisKKyAgICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdCggYW5hUW1mLCBxbWZSZWFsW2ldLCBxbWZJbWFnU2xvdCwgdGltZUluICwgc3RyaWRlLCBwV29ya0J1ZmZlciApOworCisgICAgICB0aW1lSW4gKz0gbm9fY2hhbm5lbHMqc3RyaWRlOworCisgIH0gLyogbm9fY29sIGxvb3AgIGkgICovCit9CisKKy8qIQorICoKKyAqIFxicmllZiBQZXJmb3JtIGxvdyBwb3dlciBpbnZlcnNlIG1vZHVsYXRpb24gb2YgdGhlIHN1YmJhbmQKKyAqICAgICAgICBzYW1wbGVzIHN0b3JlZCBpbiByU3ViYmFuZCAocmVhbCBwYXJ0KSBhbmQgaVN1YmJhbmQgKGltYWdpbmFyeQorICogICAgICAgIHBhcnQpIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBwV29ya0J1ZmZlci4KKyAqCisgKi8KK2lubGluZQorc3RhdGljIHZvaWQKK3FtZkludmVyc2VNb2R1bGF0aW9uTFBfZXZlbiggSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcW1mUmVhbCwgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHJlYWwgc3ViYmFuZCBzbG90IChpbnB1dCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgc2NhbGVGYWN0b3JMb3dCYW5kLCAgLyohPCBTY2FsZWZhY3RvciBmb3IgTG93IGJhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwgLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpwVGltZU91dCAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgc3ViYmFuZCBzbG90IChvdXRwdXQpKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGk7CisgIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKKyAgaW50IE0gPSBMPj4xOworICBpbnQgc2NhbGU7CisgIEZJWFBfUU1GIHRtcDsKKyAgRklYUF9RTUYgKlJFU1RSSUNUIHRSZWFsID0gcFRpbWVPdXQ7CisgIEZJWFBfUU1GICpSRVNUUklDVCB0SW1hZyA9IHBUaW1lT3V0ICsgTDsKKworICAvKiBNb3ZlIGlucHV0IHRvIG91dHB1dCB2ZWN0b3Igd2l0aCBvZmZzZXQgKi8KKyAgc2NhbGVWYWx1ZXMoJnRSZWFsWzBdLCAgICAgICAgICAgICAmcW1mUmVhbFswXSwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgIHNjYWxlVmFsdWVzKCZ0UmVhbFswK3N5blFtZi0+bHNiXSwgJnFtZlJlYWxbMCtzeW5RbWYtPmxzYl0sIHN5blFtZi0+dXNiLXN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgRkRLbWVtY2xlYXIoJnRSZWFsWzArc3luUW1mLT51c2JdLCAoTC1zeW5RbWYtPnVzYikqc2l6ZW9mKEZJWFBfUU1GKSk7CisKKyAgLyogRGN0IHR5cGUtMiB0cmFuc2Zvcm0gKi8KKyAgZGN0X0lJKHRSZWFsLCB0SW1hZywgTCwgJnNjYWxlKTsKKworICAvKiBFeHBhbmQgb3V0cHV0IGFuZCByZXBsYWNlIGlucGxhY2UgdGhlIG91dHB1dCBidWZmZXJzICovCisgIHRJbWFnWzBdID0gdFJlYWxbTV07CisgIHRJbWFnW01dID0gKEZJWFBfUU1GKTA7CisgIHRtcCA9IHRSZWFsIFswXTsKKyAgdFJlYWwgWzBdID0gdFJlYWxbTV07CisgIHRSZWFsIFtNXSA9IHRtcDsKKworICBmb3IgKGkgPSAxOyBpIDwgTS8yOyBpKyspIHsKKyAgICAvKiBJbWFnICovCisgICAgdG1wID0gdFJlYWxbTCAtIGldOworICAgIHRJbWFnW00gLSBpXSA9ICB0bXA7CisgICAgdEltYWdbaSArIE1dID0gLXRtcDsKKworICAgIHRtcCA9IHRSZWFsW00gKyBpXTsKKyAgICB0SW1hZ1tpXSA9ICB0bXA7CisgICAgdEltYWdbTCAtIGldID0gLXRtcDsKKworICAgIC8qIFJlYWwgKi8KKyAgICB0UmVhbCBbTSArIGldID0gdFJlYWxbaV07CisgICAgdFJlYWwgW0wgLSBpXSA9IHRSZWFsW00gLSBpXTsKKyAgICB0bXAgPSB0UmVhbFtpXTsKKyAgICB0UmVhbFtpXSA9IHRSZWFsIFtNIC0gaV07CisgICAgdFJlYWwgW00gLSBpXSA9IHRtcDsKKworICB9CisgIC8qIFJlbWFpbmluZyBvZGQgdGVybXMgKi8KKyAgdG1wID0gdFJlYWxbTSArIE0vMl07CisgIHRJbWFnW00vMl0gICAgID0gIHRtcDsKKyAgdEltYWdbTS8yICsgTV0gPSAtdG1wOworCisgIHRSZWFsIFtNICsgTS8yXSA9IHRSZWFsW00vMl07Cit9CisKK2lubGluZQorc3RhdGljIHZvaWQKK3FtZkludmVyc2VNb2R1bGF0aW9uTFBfb2RkKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnFtZlJlYWwsICAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAoaW5wdXQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwgICAgLyohPCBTY2FsZWZhY3RvciBmb3IgTG93IGJhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZCwgICAvKiE8IFNjYWxlZmFjdG9yIGZvciBIaWdoIGJhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqcFRpbWVPdXQgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHN1YmJhbmQgc2xvdCAob3V0cHV0KSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGk7CisgIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKKyAgaW50IE0gPSBMPj4xOworICBpbnQgc2hpZnQgPSAwOworCisgIC8qIE1vdmUgaW5wdXQgdG8gb3V0cHV0IHZlY3RvciB3aXRoIG9mZnNldCAqLworICBzY2FsZVZhbHVlcyhwVGltZU91dCtNLCAgICAgICAgICAgICAgcW1mUmVhbCwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgIHNjYWxlVmFsdWVzKHBUaW1lT3V0K00rc3luUW1mLT5sc2IsICBxbWZSZWFsK3N5blFtZi0+bHNiLCBzeW5RbWYtPnVzYi1zeW5RbWYtPmxzYiwgc2NhbGVGYWN0b3JIaWdoQmFuZCk7CisgIEZES21lbWNsZWFyKHBUaW1lT3V0K00rc3luUW1mLT51c2IsIChMLXN5blFtZi0+dXNiKSpzaXplb2YoRklYUF9RTUYpKTsKKworICBkY3RfSVYocFRpbWVPdXQrTSwgTCwgJnNoaWZ0KTsKKyAgZm9yIChpID0gMDsgaSA8IE07IGkrKykgeworICAgIHBUaW1lT3V0W2ldICAgICAgICAgICAgID0gIHBUaW1lT3V0W0wgLSAxIC0gaV07CisgICAgcFRpbWVPdXRbMiAqIEwgLSAxIC0gaV0gPSAtcFRpbWVPdXRbTCArIGldOworICB9Cit9CisKKworLyohCisgKgorICogXGJyaWVmIFBlcmZvcm0gY29tcGxleC12YWx1ZWQgaW52ZXJzZSBtb2R1bGF0aW9uIG9mIHRoZSBzdWJiYW5kCisgKiAgICAgICAgc2FtcGxlcyBzdG9yZWQgaW4gclN1YmJhbmQgKHJlYWwgcGFydCkgYW5kIGlTdWJiYW5kIChpbWFnaW5hcnkKKyAqICAgICAgICBwYXJ0KSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gcFdvcmtCdWZmZXIuCisgKgorICovCitpbmxpbmUKK3N0YXRpYyB2b2lkCitxbWZJbnZlcnNlTW9kdWxhdGlvbkhRKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICpxbWZSZWFsLCAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnFtZkltYWcsICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIGltYWcgc3ViYmFuZCBzbG90ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICBzY2FsZUZhY3Rvckxvd0JhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IFdvcmtCdWZmZXIgKG91dHB1dCkgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaTsKKyAgaW50IEwgPSBzeW5RbWYtPm5vX2NoYW5uZWxzOworICBpbnQgTSA9IEw+PjE7CisgIGludCBzaGlmdCA9IDA7CisgIEZJWFBfUU1GICpSRVNUUklDVCB0UmVhbCA9IHBXb3JrQnVmZmVyOworICBGSVhQX1FNRiAqUkVTVFJJQ1QgdEltYWcgPSBwV29ya0J1ZmZlcitMOworCisgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpeworICAgIGZvciAoaSA9IDA7IGkgPCBzeW5RbWYtPmxzYjsgaSsrKSB7CisgICAgICBjcGx4TXVsdCgmdEltYWdbaV0sICZ0UmVhbFtpXSwKKyAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHFtZkltYWdbaV0sc2NhbGVGYWN0b3JMb3dCYW5kKSwgc2NhbGVWYWx1ZShxbWZSZWFsW2ldLHNjYWxlRmFjdG9yTG93QmFuZCksCisgICAgICAgICAgICAgICAgc3luUW1mLT50X2Nvc1tpXSwgc3luUW1mLT50X3NpbltpXSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgc3luUW1mLT51c2I7IGkrKykgeworICAgICAgY3BseE11bHQoJnRJbWFnW2ldLCAmdFJlYWxbaV0sCisgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShxbWZJbWFnW2ldLHNjYWxlRmFjdG9ySGlnaEJhbmQpLCBzY2FsZVZhbHVlKHFtZlJlYWxbaV0sc2NhbGVGYWN0b3JIaWdoQmFuZCksCisgICAgICAgICAgICAgICAgc3luUW1mLT50X2Nvc1tpXSwgc3luUW1mLT50X3NpbltpXSk7CisgICAgfQorICB9CisKKyAgaWYgKCAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSA9PSAwKSB7CisgICAgc2NhbGVWYWx1ZXMoJnRSZWFsWzBdLCAgICAgICAgICAgICAmcW1mUmVhbFswXSwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgICAgc2NhbGVWYWx1ZXMoJnRSZWFsWzArc3luUW1mLT5sc2JdLCAmcW1mUmVhbFswK3N5blFtZi0+bHNiXSwgc3luUW1mLT51c2Itc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOworICAgIHNjYWxlVmFsdWVzKCZ0SW1hZ1swXSwgICAgICAgICAgICAgJnFtZkltYWdbMF0sICAgICAgICAgICAgIHN5blFtZi0+bHNiLCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQpOworICAgIHNjYWxlVmFsdWVzKCZ0SW1hZ1swK3N5blFtZi0+bHNiXSwgJnFtZkltYWdbMCtzeW5RbWYtPmxzYl0sIHN5blFtZi0+dXNiLXN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgfQorCisgIEZES21lbWNsZWFyKCZ0UmVhbFtzeW5RbWYtPnVzYl0sIChzeW5RbWYtPm5vX2NoYW5uZWxzLXN5blFtZi0+dXNiKSpzaXplb2YoRklYUF9RTUYpKTsKKyAgRkRLbWVtY2xlYXIoJnRJbWFnW3N5blFtZi0+dXNiXSwgKHN5blFtZi0+bm9fY2hhbm5lbHMtc3luUW1mLT51c2IpKnNpemVvZihGSVhQX1FNRikpOworCisgIGRjdF9JVih0UmVhbCwgTCwgJnNoaWZ0KTsKKyAgZHN0X0lWKHRJbWFnLCBMLCAmc2hpZnQpOworCisgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpeworICAgIGZvciAoaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgIEZJWFBfUU1GIHIxLCBpMSwgcjIsIGkyOworICAgICAgcjEgPSB0UmVhbFtpXTsKKyAgICAgIGkyID0gdEltYWdbTCAtIDEgLSBpXTsKKyAgICAgIHIyID0gdFJlYWxbTCAtIGkgLSAxXTsKKyAgICAgIGkxID0gdEltYWdbaV07CisKKyAgICAgIHRSZWFsW2ldID0gKHIxIC0gaTEpPj4xOworICAgICAgdEltYWdbTCAtIDEgLSBpXSA9IC0ocjEgKyBpMSk+PjE7CisgICAgICB0UmVhbFtMIC0gaSAtIDFdID0gIChyMiAtIGkyKT4+MTsKKyAgICAgIHRJbWFnW2ldID0gLShyMiArIGkyKT4+MTsKKyAgICB9CisgIH0gZWxzZQorICB7CisgICAgLyogVGhlIGFycmF5IGFjY2Vzc2VzIGFyZSBuZWdhdGl2ZSB0byBjb21wZW5zYXRlIHRoZSBtaXNzaW5nIG1pbnVzIHNpZ24gaW4gdGhlIGxvdyBhbmQgaGkgYmFuZCBnYWluLiAqLworICAgIC8qIDI2IGN5Y2xlcyBvbiBBUk05MjYgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICBGSVhQX1FNRiByMSwgaTEsIHIyLCBpMjsKKyAgICAgIHIxID0gLXRSZWFsW2ldOworICAgICAgaTIgPSAtdEltYWdbTCAtIDEgLSBpXTsKKyAgICAgIHIyID0gLXRSZWFsW0wgLSBpIC0gMV07CisgICAgICBpMSA9IC10SW1hZ1tpXTsKKworICAgICAgdFJlYWxbaV0gPSAocjEgLSBpMSk+PjE7CisgICAgICB0SW1hZ1tMIC0gMSAtIGldID0gLShyMSArIGkxKT4+MTsKKyAgICAgIHRSZWFsW0wgLSBpIC0gMV0gPSAgKHIyIC0gaTIpPj4xOworICAgICAgdEltYWdbaV0gPSAtKHIyICsgaTIpPj4xOworICAgIH0KKyAgfQorfQorCit2b2lkIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgICpyZWFsU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgICppbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICp0aW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAgICpwV29ya0J1ZmZlcikKK3sKKyAgICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQorICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25IUSAoIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSB7CisgICAgICAgIHFtZkludmVyc2VNb2R1bGF0aW9uTFBfb2RkICggc3luUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9ldmVuICggc3luUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTk9OU1lNTUVUUklDKSB7CisgICAgICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIrc3luUW1mLT5ub19jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3QgKCBzeW5RbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyK3N5blFtZi0+bm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9Cit9CisKKworLyohCisgKgorICoKKyAqIFxicmllZiBQZXJmb3JtIGNvbXBsZXgtdmFsdWVkIHN1YmJhbmQgc3ludGhlc2lzIG9mIHRoZQorICogICAgICAgIGxvdyBiYW5kIGFuZCB0aGUgaGlnaCBiYW5kIGFuZCBzdG9yZSB0aGUKKyAqICAgICAgICB0aW1lIGRvbWFpbiBkYXRhIGluIHRpbWVPdXQKKyAqCisgKiBGaXJzdCBzdGVwOiBDYWxjdWxhdGUgdGhlIHByb3BlciBzY2FsaW5nIGZhY3RvciBvZiBjdXJyZW50CisgKiBzcGVjdHJhbCBkYXRhIGluIHFtZlJlYWwvcW1mSW1hZywgb2xkIHNwZWN0cmFsIGRhdGEgaW4gdGhlIG92ZXJsYXAKKyAqIHJhbmdlIGFuZCBmaWx0ZXIgc3RhdGVzLgorICoKKyAqIFNlY29uZCBzdGVwOiBQZXJmb3JtIEZyZXF1ZW5jeS10by1UaW1lIG1hcHBpbmcgd2l0aCBpbnZlcnNlCisgKiBNb2R1bGF0aW9uIHNsb3Qtd2lzZS4KKyAqCisgKiBUaGlyZCBzdGVwOiBQZXJmb3JtIEZJUi1maWx0ZXIgc2xvdC13aXNlLiBUbyBzYXZlIHNwYWNlIGZvciBmaWx0ZXIKKyAqIHN0YXRlcywgdGhlIE1BQyBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBkaXJlY3RseSBvbiB0aGUgZmlsdGVyIHN0YXRlcworICogaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgc2V2ZXJhbCBwcm9kdWN0cyBpbiB0aGUgYWNjdW11bGF0b3IuIFRoZQorICogYnVmZmVyIHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCisgKiBtb2R1bG8gb3BlcmF0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgb24gc29tZSBEU1BzLgorICoKKyAqIExhc3Qgc3RlcDogQ29weSB0aGUgdXBwZXIgcGFydCBvZiB0aGUgc3BlY3RyYWwgZGF0YSB0byB0aGUgb3ZlcmxhcCBidWZmZXIuCisgKgorICogVGhlIHFtZiBjb2VmZmljaWVudCB0YWJsZSBpcyBzeW1tZXRyaWMuIFRoZSBzeW1tZXRyeSBpcyBleHBsb2l0ZWQgYnkKKyAqIHNocmlua2luZyB0aGUgY29lZmZpY2llbnQgdGFibGUgdG8gaGFsZiB0aGUgc2l6ZS4gVGhlIGFkZHJlc3NpbmcgbW9kZQorICogdGFrZXMgY2FyZSBvZiB0aGUgc3ltbWV0cmllcy4gIElmIHRoZSAjZGVmaW5lICNRTUZUQUJMRV9GVUxMIGlzIHNldCwKKyAqIGNvZWZmaWNpZW50IGFkZHJlc3Npbmcgd29ya3Mgb24gdGhlIGZ1bGwgdGFibGUgc2l6ZS4gVGhlIGNvZGUgd2lsbCBiZQorICogc2xpZ2h0bHkgZmFzdGVyIGFuZCBzbGlnaHRseSBtb3JlIGNvbXBhY3QuCisgKgorICogV29ya2J1ZmZlciByZXF1aXJlbWVudDogMiB4IHNpemVvZigqKlFtZkJ1ZmZlclJlYWwpICogc3luUW1mLT5ub19jaGFubmVscworICovCit2b2lkCitxbWZTeW50aGVzaXNGaWx0ZXJpbmcoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCByZWFsICovCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBvdl9sZW4sICAgICAgICAgICAgICAgICAgLyohPCBzcGxpdCBTbG90IG9mIG92ZXJsYXAgYW5kIGFjdHVhbCBzbG90cyAqLworICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzdHJpZGUsICAgICAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICpwV29ya0J1ZmZlciAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaTsKKyAgaW50IEwgPSBzeW5RbWYtPm5vX2NoYW5uZWxzOworICBTQ0hBUiBzY2FsZUZhY3RvckhpZ2hCYW5kOworICBTQ0hBUiBzY2FsZUZhY3Rvckxvd0JhbmRfb3YsIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKKworICAvKiBhZGFwdCBzY2FsaW5nICovCisgIHNjYWxlRmFjdG9ySGlnaEJhbmQgPSAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0gc2NhbGVGYWN0b3ItPmhiX3NjYWxlOworICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSAtIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtIHNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZTsKKyAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gLSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgLSBzY2FsZUZhY3Rvci0+bGJfc2NhbGU7CisKKyAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bm9fY29sOyBpKyspICAvKiAtLS0tLSBub19jb2wgbG9vcCAtLS0tLSAqLworICB7CisgICAgY29uc3QgRklYUF9EQkwgKlFtZkJ1ZmZlckltYWdTbG90ID0gTlVMTDsKKworICAgIFNDSEFSIHNjYWxlRmFjdG9yTG93QmFuZCA9IChpPG92X2xlbikgPyBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgOiBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7CisKKyAgICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQorICAgICAgICBRbWZCdWZmZXJJbWFnU2xvdCA9IFFtZkJ1ZmZlckltYWdbaV07CisKKyAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KCAgc3luUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0KyhpKkwqc3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7CisgIH0gLyogbm9fY29sIGxvb3AgIGkgICovCisKK30KKworCisvKiEKKyAqCisgKiBcYnJpZWYgQ3JlYXRlIFFNRiBmaWx0ZXIgYmFuayBpbnN0YW5jZQorICoKKyAqIFxyZXR1cm4gMCBpZiBzdWNjZXNzZnVsCisgKgorICovCitzdGF0aWMgaW50CitxbWZJbml0RmlsdGVyQmFuayAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgICAgIC8qITwgSGFuZGxlIHRvIHJldHVybiAqLworICAgICAgICAgICAgICAgICAgIHZvaWQgKnBGaWx0ZXJTdGF0ZXMsICAgICAgICAgICAgICAvKiE8IEhhbmRsZSB0byBmaWx0ZXIgc3RhdGVzICovCisgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb3dlciBlbmQgb2YgUU1GIGZyZXF1ZW5jeSByYW5nZSAqLworICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwcGVyIGVuZCBvZiBRTUYgZnJlcXVlbmN5IHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIChiYW5kcykgKi8KKyAgICAgICAgICAgICAgICAgICBVSU5UIGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmbGFncyAqLworeworICBGREttZW1jbGVhcihoX1FtZixzaXplb2YoUU1GX0ZJTFRFUl9CQU5LKSk7CisKKyAgaWYgKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICggIShmbGFncyAmIFFNRl9GTEFHX01QU0xERkIpICYmIChmbGFncyAmIFFNRl9GTEFHX0NMREZCKSApCisgIHsKKyAgICBmbGFncyB8PSBRTUZfRkxBR19OT05TWU1NRVRSSUM7CisgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gUU1GX0NMREZCX1BGVF9TQ0FMRTsKKworICAgIGhfUW1mLT5wX3N0cmlkZSA9IDE7CisgICAgc3dpdGNoIChub19jaGFubmVscykgeworICAgICAgY2FzZSA2NDoKKyAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zNjRfY2xkZmI7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjY0X2NsZGZiOworICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfY2xkZmJfNjQwOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyOgorICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3MzMl9jbGRmYjsKKyAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luMzJfY2xkZmI7CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9jbGRmYl8zMjA7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gMzIwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBpZiAoICEoZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSAmJiAoKGZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpID09IDApICkKKyAgeworICAgIHN3aXRjaCAobm9fY2hhbm5lbHMpIHsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl82NDsKKyAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zNjQ7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjY0OworICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSAxOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKKyAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyOgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfNjQ7CisgICAgICAgIGlmIChmbGFncyAmIFFNRl9GTEFHX0RPV05TQU1QTEVEKSB7CisgICAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zX2Rvd25zYW1wMzI7CisgICAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczMyOworICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW4zMjsKKyAgICAgICAgfQorICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSAyOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKKyAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaF9RbWYtPmZsYWdzID0gZmxhZ3M7CisKKyAgaF9RbWYtPm5vX2NoYW5uZWxzID0gbm9fY2hhbm5lbHM7CisgIGhfUW1mLT5ub19jb2wgPSBub0NvbHM7CisKKyAgaF9RbWYtPmxzYiA9IGxzYjsKKyAgaF9RbWYtPnVzYiA9IGZNaW4odXNiLCBoX1FtZi0+bm9fY2hhbm5lbHMpOworCisgIGhfUW1mLT5GaWx0ZXJTdGF0ZXMgPSAodm9pZCopcEZpbHRlclN0YXRlczsKKworICBoX1FtZi0+b3V0U2NhbGVmYWN0b3IgPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LICsgaF9RbWYtPmZpbHRlclNjYWxlOworCisgIGlmICggKGhfUW1mLT5wX3N0cmlkZSA9PSAyKQorICAgIHx8ICgoZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgJiYgKG5vX2NoYW5uZWxzID09IDMyKSkgKSB7CisgICAgaF9RbWYtPm91dFNjYWxlZmFjdG9yIC09IDE7CisgIH0KKyAgaF9RbWYtPm91dEdhaW4gPSAoRklYUF9EQkwpMHg4MDAwMDAwMDsgLyogZGVmYXVsdCBpbml0IHZhbHVlIHdpbGwgYmUgbm90IGFwcGxpZWQgKi8KKworICByZXR1cm4gKDApOworfQorCisvKiEKKyAqCisgKiBcYnJpZWYgQWRqdXN0IHN5bnRoZXNpcyBxbWYgZmlsdGVyIHN0YXRlcworICoKKyAqIFxyZXR1cm4gdm9pZAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitxbWZBZGFwdEZpbHRlclN0YXRlcyAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgRmlsdGVyIEJhbmsgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGVGYWN0b3JEaWZmKSAgICAgICAgICAgICAgIC8qITwgU2NhbGUgZmFjdG9yIGRpZmZlcmVuY2UgdG8gYmUgYXBwbGllZCAqLworeworICBpZiAoc3luUW1mID09IE5VTEwgfHwgc3luUW1mLT5GaWx0ZXJTdGF0ZXMgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBzY2FsZVZhbHVlcygoRklYUF9RU1MqKXN5blFtZi0+RmlsdGVyU3RhdGVzLCBzeW5RbWYtPm5vX2NoYW5uZWxzKihRTUZfTk9fUE9MWSoyIC0gMSksIHNjYWxlRmFjdG9yRGlmZik7Cit9CisKKy8qIQorICoKKyAqIFxicmllZiBDcmVhdGUgUU1GIGZpbHRlciBiYW5rIGluc3RhbmNlCisgKgorICogT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCisgKiBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCisgKiBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCisgKgorICogXHJldHVybiAwIGlmIHN1Y2Nlc2Z1bAorICoKKyAqLworaW50CitxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAgIC8qITwgUmV0dXJucyBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgICAgLyohPCBIYW5kbGUgdG8gZmlsdGVyIHN0YXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbG93ZXIgZW5kIG9mIFFNRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIGVuZCBvZiBRTUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvdyBQb3dlciBmbGFnICovCit7CisgIGludCBlcnIgPSBxbWZJbml0RmlsdGVyQmFuayhoX1FtZiwgcEZpbHRlclN0YXRlcywgbm9Db2xzLCBsc2IsIHVzYiwgbm9fY2hhbm5lbHMsIGZsYWdzKTsKKyAgaWYgKCAhKGZsYWdzICYgUU1GX0ZMQUdfS0VFUF9TVEFURVMpICYmIChoX1FtZi0+RmlsdGVyU3RhdGVzICE9IE5VTEwpICkgeworICAgIEZES21lbWNsZWFyKGhfUW1mLT5GaWx0ZXJTdGF0ZXMsICgyKlFNRl9OT19QT0xZLTEpKmhfUW1mLT5ub19jaGFubmVscypzaXplb2YoRklYUF9RQVMpKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIQorICoKKyAqIFxicmllZiBDcmVhdGUgUU1GIGZpbHRlciBiYW5rIGluc3RhbmNlCisgKgorICogT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCisgKiBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCisgKiBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCisgKgorICogXHJldHVybiAwIGlmIHN1Y2Nlc2Z1bAorICoKKyAqLworaW50CitxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgICAvKiE8IFJldHVybnMgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RU1MgKnBGaWx0ZXJTdGF0ZXMsICAgICAgICAvKiE8IEhhbmRsZSB0byBmaWx0ZXIgc3RhdGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGxvd2VyIGVuZCBvZiBRTUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdXBwZXIgZW5kIG9mIFFNRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb3cgUG93ZXIgZmxhZyAqLworeworICBpbnQgb2xkT3V0U2NhbGUgPSBoX1FtZi0+b3V0U2NhbGVmYWN0b3I7CisgIGludCBlcnIgPSBxbWZJbml0RmlsdGVyQmFuayhoX1FtZiwgcEZpbHRlclN0YXRlcywgbm9Db2xzLCBsc2IsIHVzYiwgbm9fY2hhbm5lbHMsIGZsYWdzKTsKKyAgaWYgKCBoX1FtZi0+RmlsdGVyU3RhdGVzICE9IE5VTEwgKSB7CisgICAgaWYgKCAhKGZsYWdzICYgUU1GX0ZMQUdfS0VFUF9TVEFURVMpICkgeworICAgICAgRkRLbWVtY2xlYXIoaF9RbWYtPkZpbHRlclN0YXRlcywgKDIqUU1GX05PX1BPTFktMSkqaF9RbWYtPm5vX2NoYW5uZWxzKnNpemVvZihGSVhQX1FTUykpOworICAgIH0gZWxzZSB7CisgICAgICBxbWZBZGFwdEZpbHRlclN0YXRlcyhoX1FtZiwgb2xkT3V0U2NhbGUtaF9RbWYtPm91dFNjYWxlZmFjdG9yKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworCisKKworLyohCisgKgorICogXGJyaWVmIENoYW5nZSBzY2FsZSBmYWN0b3IgZm9yIG91dHB1dCBkYXRhIGFuZCBhZGp1c3QgcW1mIGZpbHRlciBzdGF0ZXMKKyAqCisgKiBccmV0dXJuIHZvaWQKKyAqCisgKi8KK3ZvaWQKK3FtZkNoYW5nZU91dFNjYWxlZmFjdG9yIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRTY2FsZWZhY3RvciAgICAgICAgICAgICAgICAgLyohPCBOZXcgc2NhbGluZyBmYWN0b3IgZm9yIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGlmIChzeW5RbWYgPT0gTlVMTCB8fCBzeW5RbWYtPkZpbHRlclN0YXRlcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQWRkIGludGVybmFsIGZpbHRlcmJhbmsgc2NhbGUgKi8KKyAgb3V0U2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LICsgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyArIHN5blFtZi0+ZmlsdGVyU2NhbGU7CisKKyAgaWYgKCAoc3luUW1mLT5wX3N0cmlkZSA9PSAyKQorICAgIHx8ICgoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSAmJiAoc3luUW1mLT5ub19jaGFubmVscyA9PSAzMikpICkgeworICAgIG91dFNjYWxlZmFjdG9yIC09IDE7CisgIH0KKworICAvKiBhZGp1c3QgZmlsdGVyIHN0YXRlcyB3aGVuIHNjYWxlIGZhY3RvciBoYXMgYmVlbiBjaGFuZ2VkICovCisgIGlmIChzeW5RbWYtPm91dFNjYWxlZmFjdG9yICE9IG91dFNjYWxlZmFjdG9yKQorICB7CisgICAgaW50IGRpZmY7CisKKyAgICBpZiAob3V0U2NhbGVmYWN0b3IgPiAoU0FNUExFX0JJVFMgLSAxKSkgeworICAgICAgb3V0U2NhbGVmYWN0b3IgPSBTQU1QTEVfQklUUyAtIDE7CisgICAgfSBlbHNlIGlmIChvdXRTY2FsZWZhY3RvciA8ICgxIC0gU0FNUExFX0JJVFMpKSB7CisgICAgICBvdXRTY2FsZWZhY3RvciA9IDEgLSBTQU1QTEVfQklUUzsKKyAgICB9CisKKyAgICBkaWZmID0gc3luUW1mLT5vdXRTY2FsZWZhY3RvciAtIG91dFNjYWxlZmFjdG9yOworCisgICAgcW1mQWRhcHRGaWx0ZXJTdGF0ZXMoc3luUW1mLCBkaWZmKTsKKworICAgIC8qIHNhdmUgbmV3IHNjYWxlIGZhY3RvciAqLworICAgIHN5blFtZi0+b3V0U2NhbGVmYWN0b3IgPSBvdXRTY2FsZWZhY3RvcjsKKyAgfQorfQorCisvKiEKKyAqCisgKiBcYnJpZWYgQ2hhbmdlIGdhaW4gZm9yIG91dHB1dCBkYXRhCisgKgorICogXHJldHVybiB2b2lkCisgKgorICovCit2b2lkCitxbWZDaGFuZ2VPdXRHYWluIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3V0cHV0R2FpbiAgICAgICAgICAgICAgICAvKiE8IE5ldyBnYWluIGZvciBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICApCit7CisgIHN5blFtZi0+b3V0R2FpbiA9IG91dHB1dEdhaW47Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJGREsvc3JjL3NjYWxlLmNwcCBiL2FhYy9saWJGREsvc3JjL3NjYWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI5NDQzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYkZESy9zcmMvc2NhbGUuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBTY2FsaW5nIG9wZXJhdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmxpbmUgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTQ0FMRV9JTkxJTkUgaW5saW5lCisKKworI2lmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpbmNsdWRlICJtaXBzL3NjYWxlLmNwcCIKKworI2VsaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9zY2FsZV9hcm0uY3BwIgorCisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc19TR0wKKy8qIQorICoKKyAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAorICogIFxwYXJhbSBsZW4gICAgbXVzdCBiZSBsYXJnZXIgdGhhbiA0CisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzX1NHTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICp2ZWN0b3IsICAvKiE8IFZlY3RvciAqLworICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCisgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgLyohPCBTY2FsZWZhY3RvciAqLworICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIGlmIChzY2FsZWZhY3Rvcj09MCkgcmV0dXJuOworCisgIGlmKHNjYWxlZmFjdG9yID4gMCl7CisgICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKShERlJBQ1RfQklUUy0xKSk7CisgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQorICAgIHsKKyAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKKyAgICB9CisgICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKKyAgICB7CisgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CisgICAgfQorICB9IGVsc2UgeworICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOworICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKKyAgICB7CisgICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CisgICAgfQorICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCisgICAgeworICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOworICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOworICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOworICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfREJMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3IgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gbGVuIG11c3QgYmUgbGFyZ2VyIHRoYW4gNAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19EQkwKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlcyhGSVhQX0RCTCAqdmVjdG9yLCAgICAvKiE8IFZlY3RvciAqLworICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCisgICAgICAgICAgICAgICAgKQoreworICBJTlQgaTsKKworICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLworICBpZiAoc2NhbGVmYWN0b3I9PTApIHJldHVybjsKKworICBpZihzY2FsZWZhY3RvciA+IDApeworICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKKyAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCisgICAgeworICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOworICAgIH0KKyAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQorICAgIHsKKyAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKKyAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKKyAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKKyAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CisgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQorICAgIHsKKyAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKKyAgICB9CisgICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKKyAgICB7CisgICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CisgICAgICAqKHZlY3RvcisrKSA+Pj0gbmVnU2NhbGVmYWN0b3I7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc19EQkxEQkwKKy8qIQorICoKKyAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBzcmMgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICAgICAgICAgIGFuZCBwbGFjZSByZXN1bHQgaW50byBkc3QKKyAqICBccGFyYW0gZHN0IGRldGluYXRpb24gYnVmZmVyCisgKiAgXHBhcmFtIHNyYyBzb3VyY2UgYnVmZmVyCisgKiAgXHBhcmFtIGxlbiBtdXN0IGJlIGxhcmdlciB0aGFuIDQKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIGxlZnQgc2hpZnRzIHRvIGJlIGFwcGxpZWQKKyAqICBccmV0dXJuIHZvaWQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfREJMREJMCitTQ0FMRV9JTkxJTkUKK3ZvaWQgc2NhbGVWYWx1ZXMoRklYUF9EQkwgKmRzdCwgICAgICAgLyohPCBkc3QgVmVjdG9yICovCisgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzcmMsIC8qITwgc3JjIFZlY3RvciAqLworICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCisgICAgICAgICAgICAgICAgKQoreworICBJTlQgaTsKKworICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLworICBpZiAoc2NhbGVmYWN0b3I9PTApIHsKKwlpZiAoZHN0ICE9IHNyYykKKyAgICAgIEZES21lbW1vdmUoZHN0LCBzcmMsIGxlbipzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorICBlbHNlIHsKKworICAgIGlmKHNjYWxlZmFjdG9yID4gMCl7CisgICAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CisgICAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCisgICAgICB7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICB9CisgICAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQorICAgICAgeworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKKyAgICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKKyAgICAgIHsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCisgICAgICB7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3IgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gbGVuIG11c3QgYmUgbGFyZ2VyIHRoYW4gNAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMCitTQ0FMRV9JTkxJTkUKK3ZvaWQgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKAorICAgICAgICBGSVhQX0RCTCAqdmVjdG9yLAorICAgICAgICBGSVhQX0RCTCBmYWN0b3IsCisgICAgICAgIElOVCBsZW4sCisgICAgICAgIElOVCBzY2FsZWZhY3RvcgorICAgICAgICApCit7CisgIElOVCBpOworCisgIC8qIENvbXBlbnNhdGUgZk11bHREaXYyICovCisgIHNjYWxlZmFjdG9yKys7CisKKyAgaWYoc2NhbGVmYWN0b3IgPiAwKXsKKyAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7CisgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQorICAgIHsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsKKyAgICAgIHZlY3RvcisrOworICAgIH0KKyAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQorICAgIHsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsgdmVjdG9yKys7CisgICAgfQorICB9IGVsc2UgeworICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOworICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKKyAgICB7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKKyAgICB9CisgICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKKyAgICB7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7IHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7IHZlY3RvcisrOworICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitJTVBPUlRBTlQgTk9URSBmb3IgdXNhZ2Ugb2YgZ2V0U2NhbGVmYWN0b3IoKQorCitJZiB0aGUgaW5wdXQgYXJyYXkgY29udGFpbnMgbmVnYXRpdmUgdmFsdWVzIHRvbywgdGhlbiB0aGVzZSBmdW5jdGlvbnMgbWF5IHNvbWV0aW1lcyByZXR1cm4KK3RoZSBhY3R1YWwgbWF4aW11bSB2YWx1ZSBtaW51cyAxLCBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgYXBwbGllZCBhbGdvcml0aG0uCitTbyBiZSBjYXJlZnVsIHdpdGggcG9zc2libGUgZnJhY3Rpb25hbCAtMSB2YWx1ZXMgdGhhdCBtYXkgbGVhZCB0byBvdmVyZmxvd3Mgd2hlbiBiZWluZyBmUG93MigpJ2VkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JTaG9ydAorLyohCisgKgorICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cworICoKKyAqICBccmV0dXJuIE1heGltdW0gc2NhbGUgZmFjdG9yIC8gcG9zc2libGUgbGVmdCBzaGlmdAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3RvclNob3J0CitTQ0FMRV9JTkxJTkUKK0lOVCBnZXRTY2FsZWZhY3RvclNob3J0KGNvbnN0IFNIT1JUICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4gICAgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpOworICBTSE9SVCB0ZW1wLCBtYXhWYWwgPSAwOworCisgIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgICAgdGVtcCA9IChTSE9SVCkoKnZlY3RvcisrKTsKKyAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihTSE9SVF9CSVRTLTEpKSk7CisgIH0KKworICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTSE9SVF9CSVRTKSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JQQ00KKy8qIQorICoKKyAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvciBvZiBzaG9ydHMKKyAqCisgKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3RvclBDTQorU0NBTEVfSU5MSU5FCitJTlQgZ2V0U2NhbGVmYWN0b3JQQ00oY29uc3QgSU5UX1BDTSAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICBJTlQgaTsKKyAgSU5UX1BDTSB0ZW1wLCBtYXhWYWwgPSAwOworCisgIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgICAgdGVtcCA9IChJTlRfUENNKSgqdmVjdG9yKTsgdmVjdG9yKz1zdHJpZGU7CisgICAgbWF4VmFsIHw9ICh0ZW1wXih0ZW1wPj4oKHNpemVvZihJTlRfUENNKSo4KS0xKSkpOworICB9CisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLSAoSU5UKShERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JTaG9ydAorLyohCisgKgorICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cworICogIFxwYXJhbSBzdHJpZGUsIGl0ZW0gaW5jcmVtZW50IGJldHdlZW4gdmVjdG9yIG1lbWJlcnMuCisgKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3RvclNob3J0CitTQ0FMRV9JTkxJTkUKK0lOVCBnZXRTY2FsZWZhY3RvclNob3J0KGNvbnN0IFNIT1JUICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpOworICBTSE9SVCB0ZW1wLCBtYXhWYWwgPSAwOworCisgIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgICAgdGVtcCA9IChTSE9SVCkoKnZlY3Rvcik7IHZlY3Rvcis9c3RyaWRlOworICAgIG1heFZhbCB8PSAodGVtcF4odGVtcD4+KFNIT1JUX0JJVFMtMSkpKTsKKyAgfQorCisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLSAoSU5UKShERlJBQ1RfQklUUyAtIFNIT1JUX0JJVFMpKSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKKy8qIQorICoKKyAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvcgorICoKKyAqICBccmV0dXJuIE1heGltdW0gc2NhbGUgZmFjdG9yCisgKgorICogIFRoaXMgZnVuY3Rpb24gY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUKKyAqICBiaXRyYXRlLiBTaW5jZSBpdCBpcyBhIHJhdGhlciBzbWFsbCBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX0RCTAorU0NBTEVfSU5MSU5FCitJTlQgZ2V0U2NhbGVmYWN0b3IoY29uc3QgRklYUF9EQkwgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgIElOVCBsZW4pICAgICAgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLworeworICBJTlQgaTsKKyAgRklYUF9EQkwgdGVtcCwgbWF4VmFsID0gKEZJWFBfREJMKTA7CisKKyAgZm9yKGk9bGVuO2khPTA7aS0tKXsKKyAgICB0ZW1wID0gKExPTkcpKCp2ZWN0b3IrKyk7CisgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpdGVtcF4oTE9ORykodGVtcD4+KERGUkFDVF9CSVRTLTEpKSk7CisgIH0KKworICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QobWF4VmFsKSAtIDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX1NHTAorI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9TR0wKK1NDQUxFX0lOTElORQorSU5UIGdldFNjYWxlZmFjdG9yKGNvbnN0IEZJWFBfU0dMICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICBJTlQgbGVuKSAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KK3sKKyAgSU5UIGk7CisgIFNIT1JUIHRlbXAsIG1heFZhbCA9IChGSVhQX1NHTCkwOworCisgIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgICAgdGVtcCA9IChTSE9SVCkoKnZlY3RvcisrKTsKKyAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihGUkFDVF9CSVRTLTEpKSk7CisgIH0KKworICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpbWF4VmFsKSkgLSAxKSk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYk1wZWdUUERlYy9pbmNsdWRlL21wZWdGaWxlUmVhZC5oIGIvYWFjL2xpYk1wZWdUUERlYy9pbmNsdWRlL21wZWdGaWxlUmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRGVjL2luY2x1ZGUvbXBlZ0ZpbGVSZWFkLmgKQEAgLTAsMCArMSwxOTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZGF0YSBwcm92aWRlciBmb3IgTVA0IGRlY29kZXJzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjZGVmaW5lIE1QRlJFQURfTVA0RkZfRElTQUJMRQorCisjaWZuZGVmIE1QRlJFQURfTVA0RkZfRElTQUJMRQorICAvKiE8IElmIE1QRlJFQURfTVA0RkZfRU5BQkxFIGlzIHNldCwgaW5jbHVkZSBzdXBwb3J0IGZvciBNUEVHIElTTyBmaWxlZm9ybWF0LgorICAgICAgIElmIG5vdCBzZXQsIG5vIC5tcDQsIC5tNGEgYW5kIC4zZ3AgZmlsZXMgY2FuIGJlIHVzZWQgZm9yIGlucHV0LiAqLworICAjZGVmaW5lIE1QRlJFQURfTVA0RkZfRU5BQkxFCisjZW5kaWYKKworLyogbWF4aW11bSBudW1iZXIgb2YgbGF5ZXJzIHdoaWNoIGNhbiBiZSByZWFkICAgICAgICAqLworLyogc2hhbGwgZXF1YWwgbWF4IG51bWJlciBvZiBsYXllcnMgcmVhZCBieSBpaXNpc29mZiAqLworI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTICgyKQorCit0eXBlZGVmIHN0cnVjdCBTVFJVQ1RfRklMRVJFQUQgKkhBTkRMRV9GSUxFUkVBRDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgICAgICAgICAgT3BlbiBhbiBNUEVHIGF1ZGlvIGZpbGUgYW5kIHRyeSB0byBkZXRlY3QgaXRzIGZvcm1hdC4KKyAqIFxwYXJhbSBmaWxlbmFtZSAgU3RyaW5nIG9mIHRoZSBmaWxlbmFtZSB0byBiZSBvcGVuZWQuCisgKiBccGFyYW0gZmlsZUZvcm1hdCBTa2lwIGZpbGUgZm9ybWF0IGRldGVjdGlvbiBhbmQgdXNlIGdpdmVuIGZvcm1hdCBpZiBmaWxlRm9ybWF0ICE9IEZGX1VOS05PV04uCisgICAgICAgICAgICAgICAgICAgIEVsc2Ugc3RvcmUgZGV0ZWN0ZWQgZm9ybWF0IGludG8gKmZpbGVGbXQuCisgKiBccGFyYW0gdHJhbnNwb3J0VHlwZSBTa2lwIHRyYW5zcG9ydCB0eXBlIGRldGVjdGlvbiBhbmQgdXNlIGdpdmVuIGZvcm1hdCBpZiB0cmFuc3BvcnRUeXBlICE9IFRUX1VOS05PV04uCisgICAgICAgICAgICAgICAgICAgIEVsc2Ugc3RvcmUgZGV0ZWN0ZWQgZm9ybWF0IGludG8gKmZpbGVGbXQuCisgKiBccGFyYW0gY29uZiAgICAgIFBvaW50ZXIgdG8gdW5zaWduZWQgY2hhciB0byBob2xkIHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnIG9mIHRoZSBpbnB1dCBmaWxlLCBpZgorICAgICAgICAgICAgICAgICAgICBhbnkgKE1QRUcgNCBmaWxlIGZvcm1hdCkuIEluIGNhc2Ugb2YgUkFXIExBVE0gaXQgaG9sZHMgdGhlIFN0cmVhbU11eENvbmZpZy4KKyAqIFxwYXJhbSBjb25mU2l6ZSAgUG9pbnRlciB0byBhbiBpbnRlZ2VyLCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBBU0Mgb3IgU01DIChpbiBjYXNlIG9mIFJBVyBMQVRNKQorICAgICAgICAgICAgICAgICAgICBpcyBzdG9yZWQgdG8uCisgKiBccmV0dXJuICAgICAgICAgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KKyAqLworSEFORExFX0ZJTEVSRUFEIG1wZWdGaWxlUmVhZF9PcGVuKCBjb25zdCBjaGFyICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRk9STUFUICAgICBmaWxlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgdHJhbnNwb3J0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgKmNvbmZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgIGNvbmZTaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpub09mTGF5ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgR2V0IHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFxwYXJhbSBoRGF0YVNyYyAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICBGaWxlIGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqLworRklMRV9GT1JNQVQgbXBlZ0ZpbGVSZWFkX0dldEZpbGVGb3JtYXQoSEFORExFX0ZJTEVSRUFEIGhEYXRhU3JjKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgIEdldCB0aGUgdHJhbnNwb3J0IHR5cGUgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBccGFyYW0gaERhdGFTcmMgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgVHJhbnNwb3J0IHR5cGUgb2YgdGhlIGlucHV0IGZpbGUuCisgKi8KK1RSQU5TUE9SVF9UWVBFIG1wZWdGaWxlUmVhZF9HZXRUcmFuc3BvcnRUeXBlKEhBTkRMRV9GSUxFUkVBRCBoRGF0YVNyYyk7CisKKy8qKgorICogXGJyaWVmIFJlYWQgZGF0YSBmcm9tIE1QRUcgZmlsZS4gSW4gY2FzZSBvZiBwYWNrZXQgZmlsZSwgcmVhZCBvbmUgcGFja2V0LCBpbiBjYXNlCisgKiAgICAgICAgb2Ygc3RyZWFtaW5nIGZpbGUgd2l0aCBlbWJlZGRlZCBzeW5jaHJvbmlzYXRpb24gbGF5ZXIgKExPQVMvQURUUy4uLiksIGp1c3QKKyAqICAgICAgICBmaWxsIHRoZSBidWZmZXIuCisgKgorICogXHBhcmFtIGhNcGVnRmlsZSAgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KKyAqIFxwYXJhbSBpbkJ1ZmZlciAgICBQb2ludGVyIHRvIGlucHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGlucHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQuCisgKiBccmV0dXJuICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBpZiB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdCBvciBmaWxlIHJlYWQgZXJyb3IuCisgKi8KK2ludCBtcGVnRmlsZVJlYWRfUmVhZCggSEFORExFX0ZJTEVSRUFEICAgaE1wZWdGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICppbkJ1ZmZlcltdLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICpieXRlc1ZhbGlkCisgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgIFNlZWsgaW4gZmlsZSBmcm9tIG9yaWdpbiBieSBnaXZlbiBvZmZzZXQgaW4gZnJhbWVzLgorICogXHBhcmFtIGhNcGVnRmlsZSAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgorICogXHBhcmFtIG9yaWdpbiAgICAgSWYgMCwgdGhlIG9yaWdpbiBpcyB0aGUgZmlsZSBiZWdpbm5pbmcgKGFic29sdXRlIHNlZWspLgorICogICAgICAgICAgICAgICAgICAgSWYgMSwgdGhlIG9yaWdpbiBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiAocmVsYXRpdmUgc2VlaykuCisgKiBccGFyYW0gb2Zmc2V0ICAgICBUaGUgYW1vdW50IG9mIGZyYW1lcyB0byBzZWVrIGZyb20gdGhlIGdpdmVuIG9yaWdpbi4KKyAqIFxyZXR1cm4gICAgICAgICAgIDAgb24gc3VjZXNzLCAtMSBpZiBvZmZzZXQgPCAwIG9yIGZpbGUgcmVhZCBlcnJvci4KKyAqLworaW50IG1wZWdGaWxlUmVhZF9zZWVrKCBIQU5ETEVfRklMRVJFQUQgICBoTXBlZ0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICBHZXQgZmlsZSBwb3NpdGlvbiBpbiBwZXJjZW50LgorICogXHBhcmFtIGhNcGVnRmlsZSAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgRmlsZSBwb3NpdGlvbiBpbiBwZXJjZW50LgorICovCitpbnQgbXBlZ0ZpbGVSZWFkX2dldFBlcmNlbnQoSEFORExFX0ZJTEVSRUFEIGhNcGVnRmlsZSk7CisKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgIENsb3NlIE1QRUcgYXVkaW8gZmlsZS4KKyAqIFxwYXJhbSBoTXBlZ0ZpbGUgTXBlZyBmaWxlIHJlYWQgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAwIG9uIHN1Y2Vzcy4KKyAqLworaW50IG1wZWdGaWxlUmVhZF9DbG9zZShIQU5ETEVfRklMRVJFQUQgKmhNcGVnRmlsZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBfZGF0YS5oIGIvYWFjL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU4OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwX2RhdGEuaApAQCAtMCwwICsxLDM1MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBkYXRhIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19UUF9EQVRBX0hfXworI2RlZmluZSBfX1RQX0RBVEFfSF9fCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKy8qCisgKiBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgVFBfR0FfRU5BQkxFCisvKiAjZGVmaW5lIFRQX0NFTFBfRU5BQkxFICovCisvKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCisvKiAjZGVmaW5lIFRQX1NMU19FTkFCTEUgKi8KKyNkZWZpbmUgVFBfRUxEX0VOQUJMRQorLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLworLyogI2RlZmluZSBUUF9SU1ZENTBfRU5BQkxFICovCisKKyNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQorI2RlZmluZSBUUF9QQ0VfRU5BQkxFICAgICAgIC8qKjwgRW5hYmxlIGZ1bGwgUENFIHN1cHBvcnQgKi8KKyNlbmRpZgorCisvKioKKyAqIFByb2dyYW1Db25maWcgc3RydWN0LgorICovCisvKiBJU08vSUVDIDE0NDk2LTMgNC40LjEuMSBUYWJsZSA0LjIgUHJvZ3JhbSBjb25maWcgZWxlbWVudCAqLworI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLworI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKKyNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCAgICA4CisjZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KKyNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIC8qIFBDRSBiaXRzdHJlYW0gZWxlbWVudHM6ICovCisgIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKKyAgVUNIQVIgUHJvZmlsZTsKKyAgVUNIQVIgU2FtcGxpbmdGcmVxdWVuY3lJbmRleDsKKyAgVUNIQVIgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bVNpZGVDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bUJhY2tDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgVUNIQVIgTnVtQXNzb2NEYXRhRWxlbWVudHM7CisgIFVDSEFSIE51bVZhbGlkQ2NFbGVtZW50czsKKworICBVQ0hBUiBNb25vTWl4ZG93blByZXNlbnQ7CisgIFVDSEFSIE1vbm9NaXhkb3duRWxlbWVudE51bWJlcjsKKworICBVQ0hBUiBTdGVyZW9NaXhkb3duUHJlc2VudDsKKyAgVUNIQVIgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXI7CisKKyAgVUNIQVIgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudDsKKyAgVUNIQVIgTWF0cml4TWl4ZG93bkluZGV4OworICBVQ0hBUiBQc2V1ZG9TdXJyb3VuZEVuYWJsZTsKKworICBVQ0hBUiBGcm9udEVsZW1lbnRJc0NwZVtQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKyAgVUNIQVIgRnJvbnRFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOworICBVQ0hBUiBGcm9udEVsZW1lbnRIZWlnaHRJbmZvW1BDX0ZTQl9DSEFOTkVMU19NQVhdOworCisgIFVDSEFSIFNpZGVFbGVtZW50SXNDcGVbUENfRlNCX0NIQU5ORUxTX01BWF07CisgIFVDSEFSIFNpZGVFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOworICBVQ0hBUiBTaWRlRWxlbWVudEhlaWdodEluZm9bUENfRlNCX0NIQU5ORUxTX01BWF07CisKKyAgVUNIQVIgQmFja0VsZW1lbnRJc0NwZVtQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKyAgVUNIQVIgQmFja0VsZW1lbnRUYWdTZWxlY3RbUENfRlNCX0NIQU5ORUxTX01BWF07CisgIFVDSEFSIEJhY2tFbGVtZW50SGVpZ2h0SW5mb1tQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKworICBVQ0hBUiBMZmVFbGVtZW50VGFnU2VsZWN0W1BDX0xGRV9DSEFOTkVMU19NQVhdOworCisgIFVDSEFSIEFzc29jRGF0YUVsZW1lbnRUYWdTZWxlY3RbUENfQVNTT0NEQVRBX01BWF07CisKKyAgVUNIQVIgQ2NFbGVtZW50SXNJbmRTd1tQQ19DQ0VMX01BWF07CisgIFVDSEFSIFZhbGlkQ2NFbGVtZW50VGFnU2VsZWN0W1BDX0NDRUxfTUFYXTsKKworICBVQ0hBUiBDb21tZW50RmllbGRCeXRlczsKKyAgVUNIQVIgQ29tbWVudFtQQ19DT01NRU5UTEVOR1RIXTsKKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisKKyAgLyogSGVscGVyIHZhcmlhYmxlcyBmb3IgYWRtaW5pc3RyYXRpb246ICovCisgIFVDSEFSIGlzVmFsaWQ7ICAgICAgICAgICAgICAgLyohPCBGbGFnIHNob3dpbmcgaWYgUENFIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LiAqLworICBVQ0hBUiBOdW1DaGFubmVsczsgICAgICAgICAgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMgaW5jbHVkaW5nIExGRXMgKi8KKyAgVUNIQVIgTnVtRWZmZWN0aXZlQ2hhbm5lbHM7ICAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcyBhbmQgQ1BFcyAqLworICBVQ0hBUiBlbENvdW50ZXI7CisKK30gQ1Byb2dyYW1Db25maWc7CisKK3R5cGVkZWYgZW51bSB7CisgIEFTQ0VYVF9VTktPV04gPSAtMSwKKyAgQVNDRVhUX1NCUiAgICA9IDB4MmI3LAorICBBU0NFWFRfUFMgICAgID0gMHg1NDgsCisgIEFTQ0VYVF9NUFMgICAgPSAweDc2YSwKKyAgQVNDRVhUX1NBT0MgICA9IDB4N2NiLAorICBBU0NFWFRfTERNUFMgID0gMHg3Y2MKKworfSBUUF9BU0NfRVhURU5TSU9OX0lEOworCisjaWZkZWYgVFBfR0FfRU5BQkxFCisvKioKKyAqIEdhU3BlY2lmaWNDb25maWcgc3RydWN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZyA7CisgIFVJTlQgbV9kZXBlbmRzT25Db3JlQ29kZXIgOworICBVSU5UIG1fY29yZUNvZGVyRGVsYXkgOworCisgIFVJTlQgbV9leHRlbnNpb25GbGFnIDsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWczIDsKKworICBVSU5UIG1fbGF5ZXI7CisgIFVJTlQgbV9udW1PZlN1YkZyYW1lOworICBVSU5UIG1fbGF5ZXJMZW5ndGg7CisKK30gQ1NHYVNwZWNpZmljQ29uZmlnOworI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLworCisKKworCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorCit0eXBlZGVmIGVudW0geworICBFTERFWFRfVEVSTSAgPSAweDAsICAgLyogVGVybWluYXRpb24gdGFnICovCisgIEVMREVYVF9TQU9DICA9IDB4MSwgICAvKiBTQU9DIGNvbmZpZyAqLworICBFTERFWFRfTERTQUMgPSAweDIgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgLyogcmVzZXJ2ZWQgKi8KK30gQVNDX0VMRF9FWFRfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKKworICBVQ0hBUiBtX3NiclByZXNlbnRGbGFnOworICBVQ0hBUiBtX3VzZUxkUW1mVGltZUFsaWduOyAgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLworICBVQ0hBUiBtX3NiclNhbXBsaW5nUmF0ZTsKKyAgVUNIQVIgbV9zYnJDcmNGbGFnOworCit9IENTRWxkU3BlY2lmaWNDb25maWc7CisjZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworCisKKworCisvKioKKyAqIEF1ZGlvIGNvbmZpZ3VyYXRpb24gc3RydWN0LCBzdWl0YWJsZSBmb3IgZW5jb2RlciBhbmQgZGVjb2RlciBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLyogWFlaIFNwZWNpZmljIERhdGEgKi8KKyAgdW5pb24geworI2lmZGVmIFRQX0dBX0VOQUJMRQorICAgIENTR2FTcGVjaWZpY0NvbmZpZyAgICBtX2dhU3BlY2lmaWNDb25maWc7ICAgICAgIC8qKjwgR2VuZXJhbCBhdWRpbyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAgICAgICAgICovCisjZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorICAgIENTRWxkU3BlY2lmaWNDb25maWcgICBtX2VsZFNwZWNpZmljQ29uZmlnOyAgICAgIC8qKjwgRUxEIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworICB9IG1fc2M7CisgIAorICAvKiBDb21tb24gQVNDIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIENQcm9ncmFtQ29uZmlnICAgICAgICBtX3Byb2dyQ29uZmlnRWxlbWVudDsgICAgIC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisKKyAgQVVESU9fT0JKRUNUX1RZUEUgICAgIG1fYW90OyAgICAgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVSU5UICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgICAgICAvKio8IFNhbXBsZXJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsZXNQZXJGcmFtZTsgICAgICAgIC8qKjwgQW1vdW50IG9mIHNhbXBsZXMgcGVyIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZGlyZWN0TWFwcGluZzsgICAgICAgICAgLyoqPCBEb2N1bWVudCB0aGlzIHBsZWFzZSAhISAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFVRElPX09CSkVDVF9UWVBFICAgICBtX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsgICAgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCisKKyAgU0NIQVIgICAgICAgICAgICAgICAgIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAqLworCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2VwQ29uZmlnOyAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX3ZjYjExRmxhZzsgICAgICAgICAgICAgIC8qKjwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX3J2bGNGbGFnOyAgICAgICAgICAgICAgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2hjckZsYWc7ICAgICAgICAgICAgICAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCisKKyAgU0NIQVIgICAgICAgICAgICAgICAgIG1fc2JyUHJlc2VudEZsYWc7ICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIFNCUiBkYXRhIGluIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLworICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9wc1ByZXNlbnRGbGFnOyAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCisgIFVDSEFSICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uOyAgIC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICAgICAgICAgICAgICovCisKK30gQ1NBdWRpb1NwZWNpZmljQ29uZmlnOworCit0eXBlZGVmIElOVCAoKmNiVXBkYXRlQ29uZmlnX3QpKHZvaWQqLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcqKTsKK3R5cGVkZWYgSU5UICgqY2JTc2NfdCkoCisgICAgICAgIHZvaWQqLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSwKKyAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgIGNvbnN0IElOVCBtdXhNb2RlLAorICAgICAgICBjb25zdCBJTlQgY29uZmlnQnl0ZXMKKyAgICAgICAgKTsKK3R5cGVkZWYgSU5UICgqY2JTYnJfdCkoCisgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKKyAgICAgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgIHsKKyAgY2JVcGRhdGVDb25maWdfdCBjYlVwZGF0ZUNvbmZpZzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeSBjYWxsYmFjay4gICovCisgIHZvaWQgKmNiVXBkYXRlQ29uZmlnRGF0YTsgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAqLworICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiU2JyX3QgY2JTYnI7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU2JyRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLworfSBDU1RwQ2FsbEJhY2tzOworCitzdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0gCit7IDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MCwgMCwgMCwKKyAgMAorfTsKKworc3RhdGljIGlubGluZQoraW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KCBVSU5UIHNhbXBsaW5nUmF0ZSApCit7CisgIFVJTlQgc2ZfaW5kZXgsIHRhYmxlU2l6ZT1zaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihVSU5UKTsKKworICBmb3IgKHNmX2luZGV4PTA7IHNmX2luZGV4PHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgeworICAgIGlmKCBTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlICkgYnJlYWs7CisgIH0KKworICBpZiAoc2ZfaW5kZXg+dGFibGVTaXplLTEpIHsKKyAgICByZXR1cm4gdGFibGVTaXplLTE7CisgIH0KKworICByZXR1cm4gc2ZfaW5kZXg7Cit9CisKKy8qCisgKiBHZXQgQ2hhbm5lbCBjb3VudCBmcm9tIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpCit7CisgIHN3aXRjaCAoY2hhbm5lbENvbmZpZykgeworICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOgorICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgorICAgIHJldHVybiBjaGFubmVsQ29uZmlnOworICBjYXNlIDc6IGNhc2UgMTI6IGNhc2UgMTQ6CisgICAgcmV0dXJuIDg7CisgIGNhc2UgMTE6CisgICAgcmV0dXJuIDc7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGlubGluZQoraW50IGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoY29uc3QgaW50IGNoYW5uZWxDb25maWcpCit7ICAgICAgICAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLworICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsNywwLDAsIDAsIDYsIDcsIDAsIDcsIDB9OworICByZXR1cm4gbltjaGFubmVsQ29uZmlnXTsKK30KKworI2VuZGlmIC8qIF9fVFBfREFUQV9IX18gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBEZWMvaW5jbHVkZS90cGRlY19saWIuaCBiL2FhYy9saWJNcGVnVFBEZWMvaW5jbHVkZS90cGRlY19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQzOTdkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwZGVjX2xpYi5oCkBAIC0wLDAgKzEsNTIxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fVFBERUNfTElCX0hfXworI2RlZmluZSBfX1RQREVDX0xJQl9IX18KKworI2luY2x1ZGUgInRwX2RhdGEuaCIKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2RlZmluZSBUUkFOU1BPUlRERUNfSU5CVUZfU0laRSAgKCA4MTkyICkgICAvKiE8IFNpemUgaXMgaW4gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSB0cmFuc3BvcnQgaW5wdXQgYnVmZmVyIHNpemUgY2FyZWZ1bGx5IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VyZSB0aGF0IGl0IGZ1bGZpbGxzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIHRyYW5zcG9ydCBmb3JtYXQocykuICAgICAgICAgICAgICAgICAgICAqLworCit0eXBlZGVmIGVudW0geworICBUUkFOU1BPUlRERUNfT0sgPSAwLCAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBTeW5jaHJvbml6YXRpb24gZXJyb3JzLiBXYWl0IGZvciBuZXcgaW5wdXQgZGF0YSBhbmQgdHJ5IGFnYWluLiAqLworICB0cGRlY19zeW5jX2Vycm9yX3N0YXJ0ICAgPSAweDEwMCwKKyAgVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUywgICAgLyohPCBPdXQgb2YgYml0cy4gUHJvdmlkZSBtb3JlIGJpdHMgYW5kIHRyeSBhZ2Fpbi4gICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SLCAgICAgICAgIC8qITwgTm8gc3luYyB3YXMgZm91bmQgb3Igc3luYyBnb3QgbG9zdC4gS2VlcCB0cnlpbmcuICAgICAgICAgICAqLworICB0cGRlY19zeW5jX2Vycm9yX2VuZCwKKworICAvKiBEZWNvZGUgZXJyb3JzLiBNb3N0bHkgY2F1c2VkIGR1ZSB0byBiaXQgZXJyb3JzLiAqLworICB0cGRlY19kZWNvZGVfZXJyb3Jfc3RhcnQgPSAweDQwMCwKKyAgVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SLCAgICAgICAgLyohPCBCaXRzdHJlYW0gZGF0YSBzaG93ZWQgaW5jb25zaXN0ZW5jaWVzICh3cm9uZyBzeW50YXgpLiAgICAgICovCisgIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQsIC8qITwgVW5zdXBwb3J0ZWQgZm9ybWF0IG9yIGZlYXR1cmUgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSBkYXRhLiAqLworICBUUkFOU1BPUlRERUNfQ1JDX0VSUk9SLCAgICAgICAgICAvKiE8IENSQyBlcnJvciBlbmNvdW50ZXJlZCBpbiBiaXRzdHJlYW0gZGF0YS4gICAgICAgICAgICAgICAgICAgKi8KKyAgdHBkZWNfZGVjb2RlX2Vycm9yX2VuZCwKKworICAvKiBGYXRhbCBlcnJvcnMuIFN0b3AgaW1tZWRpYXRlbHkgb24gb25lIG9mIHRoZXNlIGVycm9ycyEgKi8KKyAgdHBkZWNfZmF0YWxfZXJyb3Jfc3RhcnQgID0gMHgyMDAsCisgIFRSQU5TUE9SVERFQ19VTktPV05fRVJST1IsICAgICAgIC8qITwgQW4gdW5rbm93biBlcnJvciBvY2N1cmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVIsICAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVCwgICAgLyohPCBUaGUgZGVjb2RlciBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsIHNpbmNlIHRoZSByZXF1aWVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGNoYW5nZSBjYW5ub3QgYmUgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICovCisgIHRwZGVjX2ZhdGFsX2Vycm9yX2VuZAorCit9IFRSQU5TUE9SVERFQ19FUlJPUjsKKworCisvKiogTWFjcm8gdG8gaWRlbnRpZnkgZGVjb2RlIGVycm9ycy4gKi8KKyNkZWZpbmUgVFBERUNfSVNfREVDT0RFX0VSUk9SKGVycikgKCAoKGVycj49dHBkZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiAoZXJyPD10cGRlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKKy8qKiBNYWNybyB0byBpZGVudGlmeSBmYXRhbCBlcnJvcnMuICovCisjZGVmaW5lIFRQREVDX0lTX0ZBVEFMX0VSUk9SKGVycikgICggKChlcnI+PXRwZGVjX2ZhdGFsX2Vycm9yX3N0YXJ0KSAgJiYgKGVycjw9dHBkZWNfZmF0YWxfZXJyb3JfZW5kKSkgID8gMSA6IDApCisKKworLyoqCisgKiBcYnJpZWYgUGFyYW1ldGVyIGlkZW50aWZpZXJzIGZvciB0cmFuc3BvcnREZWNfU2V0UGFyYW0oKQorICovCit0eXBlZGVmIGVudW0geworICBUUERFQ19QQVJBTV9NSU5JTUlaRV9ERUxBWSA9IDEsICAgICAgICAvKiogRGVsYXkgbWluaW1pemF0aW9uIHN0cmF0ZWd5LiAwOiBub25lLCAxOiBkaXNjYXJkIGFzIG1hbnkgZnJhbWVzIGFzIHBvc3NpYmxlLiAqLworICBUUERFQ19QQVJBTV9FQVJMWV9DT05GSUcsICAgICAgICAgICAgICAvKiogRW5hYmxlIGVhcmx5IGNvbmZpZyBkaXNjb3ZlcnkuICovCisgIFRQREVDX1BBUkFNX0lHTk9SRV9CVUZGRVJGVUxMTkVTUywgICAgIC8qKiBJZ25vcmUgYnVmZmVyIGZ1bGxuZXNzLiAqLworICBUUERFQ19QQVJBTV9TRVRfQklUUkFURSwgICAgICAgICAgICAgICAvKiogU2V0IGF2ZXJhZ2UgYml0IHJhdGUgZm9yIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uIGZyYW1lIG1pc3NlcyBlc3RpbWF0aW9uLiAqLworICBUUERFQ19QQVJBTV9SRVNFVCwgICAgICAgICAgICAgICAgICAgICAvKiogUmVzZXQgdHJhbnNwb3J0IGRlY29kZXIgaW5zdGFuY2Ugc3RhdHVzLiAqLworICBUUERFQ19QQVJBTV9CVVJTVF9QRVJJT0QgICAgICAgICAgICAgICAvKiogU2V0IGRhdGEgcmVjZXB0aW9uIGJ1cnN0IHBlcmlvZCBpbiBtaWxpIHNlY29uZHMuICovCit9IFRQREVDX1BBUkFNOworCisvKiBJU08vSUVDIDE0NDk2LTMgNC40LjEuMSBUYWJsZSA0LjIgUHJvZ3JhbSBjb25maWcgZWxlbWVudCAqLworI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLworI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKKyNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCAgICA4CisjZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KKyNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKKyNkZWZpbmUgUENfTlVNX0hFSUdIVF9MQVlFUiAzCisKKworLyohCisgIFxicmllZiAgICAgICAgICAgICAgIFJlc2V0IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCisgIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgorICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCisqLwordm9pZCAgQ1Byb2dyYW1Db25maWdfUmVzZXQgKCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSApOworCisvKiEKKyAgXGJyaWVmICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBQcm9ncmFtIENvbmZpZyBFbGVtZW50LgorICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KKyAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAorKi8KK3ZvaWQgIENQcm9ncmFtQ29uZmlnX0luaXQgKCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSApOworCisvKiEKKyAgXGJyaWVmICAgICAgICAgICAgICAgSW5xdWlyZSBzdGF0ZSBvZiBwcmVzZW50IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgorICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KKyAgXHJldHVybiAgICAgICAgICAgICAgMSBpZiB0aGUgUENFIHN0cnVjdHVyZSBpcyBmaWxsZWQgY29ycmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBubyB2YWxpZCBQQ0UgcHJlc2VudC4KKyovCitpbnQgIENQcm9ncmFtQ29uZmlnX0lzVmFsaWQgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSApOworCisjaWZkZWYgVFBfUENFX0VOQUJMRQorLyohCisgIFxicmllZiAgICAgICAgICAgICAgIFJlYWQgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4KKyAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCisgIFxwYXJhbSBicyAgICAgICAgICAgIEJpdHN0cmVhbSBidWZmZXIgdG8gcmVhZCBmcm9tLgorICBccGFyYW0gYWxpZ25BbmNob3IgICBBbGlnbiBiaXRzdHJlYW0gdG8gYWxpZ25BbmNob3IgYml0cyBhZnRlciBhbGwgcmVhZCBvcGVyYXRpb25zLgorICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCisqLwordm9pZCAgQ1Byb2dyYW1Db25maWdfUmVhZCAoIENQcm9ncmFtQ29uZmlnICAgICAgICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IgKTsKKworLyohCisgIFxicmllZiAgICAgICAgICAgICAgIENvbXBhcmUgdHdvIFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzLgorICBccGFyYW0gcFBjZTEgICAgICAgICBQb2ludGVyIHRvIGZpcnN0IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgorICBccGFyYW0gcFBjZTIgICAgICAgICBQb2ludGVyIHRvIHNlY29uZCBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KKyAgXHJldHVybiAgICAgICAgICAgICAgLTEgaWYgUENFcyBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIFBDRXMgYXJlIGNvbXBsZXRlbHkgZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIFBDRXMgYXJlIGRpZmZlcmVudCBidXQgaGF2ZSB0aGUgc2FtZSBjaGFubmVsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDIgaWYgUENFcyBoYXZlIGRpZmZlcmVudCBjaGFubmVsIGNvbmZpZyBidXQgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMuCisqLworaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UyICk7CisKKy8qIQorICBcYnJpZWYgICAgICAgICAgICAgICBHZXQgYSBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcHJlZGVmaW5lZCBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAxLTE0LgorICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KKyAgXHBhcmFtIGNoYW5uZWxDb25maWcgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KKyAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAorKi8KK3ZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCAoIENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVsQ29uZmlnICk7CisjZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworCisvKioKKyAqIFxicmllZiBMb29rdXAgYW5kIHZlcmlmeSBhIGdpdmVuIGVsZW1lbnQuIFRoZSBkZWNvZGVyIGNhbGxzIHRoaXMKKyAqICAgICAgICBtZXRob2Qgd2l0aCBldmVyeSBuZXcgZWxlbWVudCBJRCBmb3VuZCBpbiB0aGUgYml0c3RyZWFtLgorICoKKyAqIFxwYXJhbSBwUGNlICAgICAgICBBIHZhbGlkIFByb2dyYW0gY29uZmlnIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSB0YWcgICAgICAgICBUYWcgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSBsb29rZWQgdXAuCisgKiBccGFyYW0gY2hhbm5lbElkeCAgVGhlIGN1cnJlbnQgY2hhbm5lbCBjb3VudCBvZiB0aGUgZGVjb2RlciBwYXJzZXIuCisgKiBccGFyYW0gY2hNYXBwaW5nICAgQXJyYXkgdG8gc3RvcmUgdGhlIGNhbm9uaWNhbCBjaGFubmVsIG1hcHBpbmcgaW5kZXhlcy4KKyAqIFxwYXJhbSBjaFR5cGUgICAgICBBcnJheSB0byBzdG9yZSB0aGUgYXVkaW8gY2hhbm5lbCB0eXBlLgorICogXHBhcmFtIGNoSW5kZXggICAgIEFycmF5IHRvIHN0b3JlIHRoZSBpbmRpdmlkdWFsIGF1ZGlvIGNoYW5uZWwgdHlwZSBpbmRleC4KKyAqIFxwYXJhbSBlbE1hcHBpbmcgICBQb2ludGVyIHdoZXJlIHRoZSBjYW5vbmljYWwgZWxlbWVudCBpbmRleCBpcyBzdG9yZWQuCisgKiBccGFyYW0gZWxUeXBlICAgICAgVGhlIGVsZW1lbnQgaWQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSBsb29rZWQgdXAuCisgKgorICogXHJldHVybiAgICAgICAgICAgIE5vbi16ZXJvIGlmIHRoZSBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvZ3JhbSwgemVybworICogICAgICAgICAgICAgICAgICAgIGlmIGl0IGRvZXMgbm90LgorICovCitpbnQgQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudCgKKyAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgIFVJTlQgICAgICAgICAgICBjaGFubmVsQ29uZmlnLAorICAgICAgICBjb25zdCBVSU5UICAgICAgdGFnLAorICAgICAgICBjb25zdCBVSU5UICAgICAgY2hhbm5lbElkeCwKKyAgICAgICAgVUNIQVIgICAgICAgICAgIGNoTWFwcGluZ1tdLAorICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCisgICAgICAgIFVDSEFSICAgICAgICAgICBjaEluZGV4W10sCisgICAgICAgIFVDSEFSICAgICAgICAgICplbE1hcHBpbmcsCisgICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbExpc3RbXSwKKyAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsVHlwZQorICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICBHZXQgdGFibGUgb2YgZWxlbWVudHMgaW4gY2Fub25pY2FsIG9yZGVyIGZyb20gYQorICogICAgICAgICAgICAgICAgICAgIGdpdmUgcHJvZ3JhbSBjb25maWcgZmllbGQuCisgKiBccGFyYW0gcFBjZSAgICAgICAgQSB2YWxpZCBwcm9ncmFtIGNvbmZpZyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gdGFibGUgICAgICAgQW4gYXJyYXkgd2hlcmUgdGhlIGVsZW1lbnQgSURzIGFyZSBzdG9yZWQuCisgKiBccGFyYW0gZWxMaXN0U2l6ZSAgVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgYXJyYXkuCisgKiBccGFyYW0gcENoTWFwSWR4ICAgUG9pbnRlciB0byBhIGZpZWxkIHJlY2VpdmluZyB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgICAgICAgICAgICAgIGltcGxpY2l0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCBvZiB0aGUgZ2l2ZW4KKyAqICAgICAgICAgICAgICAgICAgICBQQ0UuIElmIG5vbmUgY2FuIGJlIGZvdW5kIGl0IHJlY2VpdmVzIHRoZSB2YWx1ZSAwLgorICogXHJldHVybiAgICAgICAgICAgIFRvdGFsIGVsZW1lbnQgY291bnQgaW5jbHVkaW5nIGFsbCBTQ0UsIENQRSBhbmQgTEZFLgorICovCitpbnQgQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEICB0YWJsZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGVsTGlzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcENoTWFwSWR4ICk7CisKKy8qKgorICogXGJyaWVmICAgICAgIEluaXRpYWxpemUgYSBnaXZlbiBBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBwQXNjICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCisgKiBccmV0dXJuICAgICAgdm9pZAorICovCit2b2lkIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdChDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MpOworCisvKioKKyAqIFxicmllZiAgIFBhcnNlIGEgQXVkaW9TcGVjaWZpY0NvbmZpZyBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gcEFzYyAgICAgICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCisgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW0gaGFuZGxlLgorICogXHBhcmFtIGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSAgRG8gZXhwbGljaXQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBwYXJzaW5nIGlmIHNldCAoZmxhZykuCisgKiBccGFyYW0gY2IgcG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBjYWxsYmFjayBpbmZvcm1hdGlvbgorICoKKyAqIFxyZXR1cm4gIFRvdGFsIGVsZW1lbnQgY291bnQgaW5jbHVkaW5nIGFsbCBTQ0UsIENQRSBhbmQgTEZFLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKKyAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIGludCBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUsCisgICAgICAgIENTVHBDYWxsQmFja3MgKmNiCisgICAgICAgICk7CisKKy8qIENFTFAgc3R1ZmYgKi8KK2VudW0geworICBNUEUgICAgID0gMCwKKyAgUlBFICAgICA9IDEsCisgIGZzOEtIeiAgPSAwLAorICBmczE2S0h6ID0gMQorfTsKKworLyogRGVmaW50aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0cmFuc3BvcnREZWNPcGVuKCkgKi8KKyNkZWZpbmUgVFBfRkxBR19NUEVHNCAxCisKKy8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19BRElGICAgICAgICAweDAwMDAxMDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1RQREVDX0FEVFMgICAgICAgIDB4MDAwMDIwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCisjZGVmaW5lIENBUEZfVFBERUNfTE9BUyAgICAgICAgMHgwMDAwNDAwMCAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19MQVRNICAgICAgICAweDAwMDA4MDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBMQVRNIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1RQREVDX1JBV1BBQ0tFVFMgIDB4MDAwMTAwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIHJhdyBwYWNrZXRzIHRyYW5zcG9ydCBmb3JtYXQuICovCisKK3R5cGVkZWYgc3RydWN0IFRSQU5TUE9SVERFQyAqSEFORExFX1RSQU5TUE9SVERFQzsKKworCisvKioKKyAqIFxicmllZiBDb25maWd1cmUgVHJhbnNwb3J0IERlY29kZXIgdmlhIGEgYmluYXJ5IGNvZGVkIEF1ZGlvU3BlY2lmaWNDb25maWcgb3IgU3RyZWFtTXV4Q29uZmlnLgorICogICAgICAgIFRoZSBwcmV2aW91c2x5IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFzIHdlbGwuIFRoZSBidWZmZXIgY29uZgorICogICAgICAgIG11c3QgY29udGFpbnQgYSBTTUMgaW4gY2FzZSBvZiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdCwgYW5kIGFuIEFTQyBlbHNld2F5cy4KKyAqCisgKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgYSB0cmFuc3BvcnQgZGVjb2Rlci4KKyAqIFxwYXJhbSBjb25mICAgIFVDSEFSIGJ1ZmZlciBvZiB0aGUgYmluYXJ5IGNvZGVkIGNvbmZpZyAoQVNDIG9yIFNNQykuCisgKiBccGFyYW0gbGVuZ3RoICBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb25mIGJ1ZmZlci4KKyAqCisgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpjb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgbGF5ZXIgKTsKKworLyoqCisgKiBcYnJpZWYgT3BlbiBUcmFuc3BvcnQgbWVkaXVtIGZvciByZWFkaW5nLgorICoKKyAqIFxwYXJhbSB0cmFuc3BvcnREZWNGbXQgRm9ybWF0IG9mIHRoZSB0cmFuc3BvcnQgZGVjb2RlciBtZWRpdW0gdG8gYmUgYWNjZXNzZWQuCisgKiBccGFyYW0gZmxhZ3MgICAgICAgICAgIFRyYW5zcG9ydCBkZWNvZGVyIGZsYWdzLiBDdXJyZW50bHkgb25seSBUUF9GTEFHX01QRUc0LCB3aGljaCBzaWduYWxzIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgTVBFRzQgY2FwYWJsZSBkZWNvZGVyIChyZWxldmFudCBmb3IgQURUUyBvbmx5KS4KKyAqCisgKiBccmV0dXJuICAgQSBwb2ludGVyIHRvIGEgdmFsaWQgYW5kIGFsbG9jYXRlZCBIQU5ETEVfVFJBTlNQT1JUREVDIG9yIGEgbnVsbCBwb2ludGVyIG9uIGZhaWx1cmUuCisgKi8KK0hBTkRMRV9UUkFOU1BPUlRERUMgdHJhbnNwb3J0RGVjX09wZW4oIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydERlY0ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgYXVkaW8gY29uZmlnIGNoYW5nZXMuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQXNjQ2FsbGJhY2sgKAorICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgY29uc3QgY2JVcGRhdGVDb25maWdfdCBjYlVwZGF0ZUNvbmZpZywKKyAgICAgICAgdm9pZCogdXNlcl9kYXRhICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNTQyBwYXJzZXIgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU1NDIHBhcnNpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU3NjQ2FsbGJhY2sgKAorICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzY1BhcnNlLAorICAgICAgICB2b2lkKiB1c2VyX2RhdGEgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU0JSIGhlYWRlciBwYXJzaW5nLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4gCisgKi8KK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQqIHVzZXJfZGF0YSk7CisKKy8qKgorICogXGJyaWVmIEZpbGwgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgorICogIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuCisgKiAgU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20gcEJ1ZmZlciBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhCisgKiAgc3Vic2VxdWVudCBjYWxsIG9mICV0cmFuc3BvcnREZWNfRmlsbERhdGEoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KKyAqICBncmFiIHRoZSBuZXh0IGRhdGEuCisgKgorICogXHBhcmFtIGhUcCAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCisgKiBccGFyYW0gcEJ1ZmZlciAgICAgUG9pbnRlciB0byBleHRlcm5hbCBpbnB1dCBidWZmZXIuCisgKiBccGFyYW0gYnVmZmVyU2l6ZSAgU2l6ZSBvZiBleHRlcm5hbCBpbnB1dCBidWZmZXIuIFRoaXMgYXJndW1lbnQgaXMgcmVxdWlyZWQgYmVjYXVzZSBkZWNvZGVyLWludGVybmFsbHkKKyAqICAgICAgICAgICAgICAgICAgICB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0byBwQnVmZmVyLCB3aGVyZSB0aGUgbmV4dAorICogICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBkYXRhIGlzLCB3aGljaCBpcyB0aGVuIGZlZCBpbnRvIHRoZSBkZWNvZGVyLWludGVybmFsIGJ1ZmZlciAoYXMgbXVjaAorICogICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlKS4gT3VyIGV4YW1wbGUgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIGZpbGxzIHRoZSBidWZmZXIgYXQgcEJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgIGFnYWluLCBvbmNlIGl0IGNvbnRhaW5zIG5vIGF2YWlsYWJsZSB2YWxpZCBieXRlcyBhbnltb3JlIChtZWFuaW5nIGJ5dGVzVmFsaWQgZXF1YWwgMCkuCisgKiBccGFyYW0gYnl0ZXNWYWxpZCAgTnVtYmVyIG9mIGJpdHN0cmVhbSBieXRlcyBpbiB0aGUgZXh0ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciB0aGF0IGhhdmUgbm90IHlldCBiZWVuCisgKiAgICAgICAgICAgICAgICAgICAgY29waWVkIGludG8gdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudCBvZiBuZXdseSBjb3BpZWQgYnl0ZXMuCisgKiBccGFyYW0gbGF5ZXIgICAgICAgVGhlIGxheWVyIHRoZSBiaXRzdHJlYW0gYmVsb25ncyB0by4KKyAqIFxyZXR1cm4gICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0ZpbGxEYXRhKAorICAgICAgICBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDICBoVHAsCisgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgKnBCdWZmZXIsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCisgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgKnBCeXRlc1ZhbGlkLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBsYXllciApOworCisvKioKKyAqIFxicmllZiAgICAgIEdldCB0cmFuc3BvcnREZWMgYml0c3RyZWFtIGhhbmRsZS4KKyAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0gaGFuZGxlLgorICovCitIQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICBHZXQgdHJhbnNwb3J0IGZvcm1hdC4KKyAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICBUaGUgdHJhbnNwb3J0IGZvcm1hdC4KKyAqLworVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjX0dldEZvcm1hdCAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgY3VycmVudCBidWZmZXIgZnVsbG5lc3MgdmFsdWUuCisgKgorICogXHBhcmFtIGhUcCAgICAgSGFuZGxlIG9mIGEgdHJhbnNwb3J0IGRlY29kZXIuCisgKgorICogXHJldHVybiAgICAgICAgQnVmZmVyIGZ1bGxuZXNzCisgKi8KK0lOVCB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CisKKy8qKgorICogXGJyaWVmICAgICAgIENsb3NlIGFuZCBkZWFsbG9jYXRlIHRyYW5zcG9ydERlYy4KKyAqIFxwYXJhbSBwaFRwICBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgIHZvaWQKKyAqLwordm9pZCB0cmFuc3BvcnREZWNfQ2xvc2UgKCBIQU5ETEVfVFJBTlNQT1JUREVDICpwaFRwICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgUmVhZCBvbmUgYWNjZXNzIHVuaXQgZnJvbSB0aGUgdHJhbnNwb3J0RGVjIG1lZGl1bS4KKyAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCisgKiBccGFyYW0gbGVuZ3RoICBPbiByZXR1cm4sIHRoaXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYWN0dWFsIGFjY2VzcyB1bml0IGxlbmd0aCBpbiBiaXRzLgorICogICAgICAgICAgICAgICAgU2V0IHRvIC0xIGlmIGxlbmd0aCBpcyB1bmtub3duLgorICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdCAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LiBUaGUgcmVzdWx0CisgKiAgICAgICAgY2FuIGJlIGJlbG93IHplcm8sIG1lYW5pbmcgdGhhdCB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkLgorICogXHBhcmFtIGhUcCAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydERlYy4KKyAqIFxyZXR1cm4gYW1vdW50IG9mIHJlbWFpbmluZyBiaXRzLgorICovCitJTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSB0b3RhbCBhbW91bnQgb2YgYml0cyBvZiB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4KKyAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCisgKiBccmV0dXJuIGFtb3VudCBvZiB0b3RhbCBiaXRzLgorICovCitJTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOworCisvKioKKyAqIFxicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRlY29kZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcKKyAqICAgICAgICAgICAgIG9uZSBBY2Nlc3MgVW5pdCBmb3IgYml0c3RyZWFtIGhvdXNla2VlcGluZy4KKyAqIFxwYXJhbSBoVHAgIFRyYW5zcG9ydCBIYW5kbGUuCisgKiBccmV0dXJuICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOworCisvKioKKyAqIFxicmllZiAgICAgIE9idGFpbiB0aGUgYW1vdW50IG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzIGlmIGFwcGxpY2FibGUgaW4gY2FzZSBvZiAKKyAqICAgICAgICAgICAgIGEgYml0IHN0cmVhbSBzeW5jaHJvbml6YXRpb24gZXJyb3IuIEVhY2ggdGltZSB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoKQorICogICAgICAgICAgICAgcmV0dXJucyBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmUgYW4gZXN0aW1hdGUKKyAqICAgICAgICAgICAgIG9mIHRoZSBhbW91bnQgb2YgbWlzc2luZyBhY2Nlc3MgdW5pdHMuIFRoaXMgd29ya3Mgb25seSBpbiBjYXNlIG9mIGNvbnN0YW50IGF2ZXJhZ2UKKyAqICAgICAgICAgICAgIGJpdCByYXRlIChoYXMgdG8gYmUga25vd24pIGFuZCBpZiB0aGUgcGFyYW1ldGVyIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFIGhhcyBiZWVuIHNldAorICogICAgICAgICAgICAgYWNjb3JkaW5nbHkuCisgKiBccGFyYW0gaFRwICBUcmFuc3BvcnQgSGFuZGxlLgorICogXHBhcmFtIHBOQWNjZXNzVW5pdHMgcG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUgZXN0aW1hdGVkIGxvc3QgZnJhbWUgY291bnQgd2lsbCBiZSBzdG9yZWQgaW50by4gICAgICAKKyAqIFxyZXR1cm4gICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCAoIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKKworCisvKioKKyAqIFxicmllZiAgICAgICAgU2V0IGEgZ2l2ZW4gc2V0dGluZy4KKyAqIFxwYXJhbSBoVHAgICAgVHJhbnNwb3J0IEhhbmRsZS4KKyAqIFxwYXJhbSBwYXJhbSAgSWRlbnRpZmllciBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQuCisgKiBccGFyYW0gdmFsdWUgIFZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQuCisgKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUUERFQ19QQVJBTSAgICAgICAgIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdmFsdWUgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgIEdldCBudW1iZXIgb2Ygc3ViZnJhbWVzIChmb3IgTEFUTSBvciBBRFRTKQorICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgSGFuZGxlLgorICogXHJldHVybiAgICAgICBOdW1iZXIgb2YgQURUUy9MQVRNIHN1YmZyYW1lcyAocmV0dXJuIDEgZm9yIGFsbCBvdGhlciB0cmFuc3BvcnQgdHlwZXMpLgorICovCitVSU5UIHRyYW5zcG9ydERlY19HZXROck9mU3ViRnJhbWVzKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKKworCisvKioKKyAqIFxicmllZiAgICAgICBHZXQgaW5mbyBzdHJ1Y3R1cmUgb2YgdHJhbnNwb3J0IGRlY29kZXIgbGlicmFyeS4KKyAqIFxwYXJhbSBpbmZvICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KKyAqIFxyZXR1cm4gICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7CisKKy8qIEFEVFMgQ1JDIHN1cHBvcnQgKi8KKworLyoqCisgKiBcYnJpZWYgICAgICAgIFNldCBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhcyBzdGFydCBvZiBhIG5ldyBkYXRhIHJlZ2lvbi4KKyAqIFxwYXJhbSBoVHAgICAgVHJhbnNwb3J0IGhhbmRsZS4KKyAqIFxwYXJhbSBtQml0cyAgU2l6ZSBpbiBiaXRzIG9mIHRoZSBkYXRhIHJlZ2lvbi4gU2V0IHRvIDAgaWYgaXQgc2hvdWxkIG5vdCBiZSBvZiBhIGZpeGVkIHNpemUuCisgKiBccmV0dXJuICAgICAgIERhdGEgcmVnaW9uIElELCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNhbGxpbmcgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZygpLgorICovCitpbnQgdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1CaXRzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICBTZXQgZW5kIG9mIGRhdGEgcmVnaW9uLgorICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgaGFuZGxlLgorICogXHBhcmFtIHJlZyAgICBEYXRhIHJlZ2lvbiBJRCwgb3BidGFpbmVkIGZyb20gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKCkuCisgKiBccmV0dXJuICAgICAgIHZvaWQKKyAqLwordm9pZCB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcmVnICk7CisKKy8qKgorICogXGJyaWVmICAgICAgQ2FsY3VsYXRlIEFEVFMgY3JjIGFuZCBjaGVjayBpZiBpdCBpcyBjb3JyZWN0LiBUaGUgQURUUyBjaGVja3N1bSBpcyBoZWxkIGludGVybmFsbHkuCisgKiBccGFyYW0gaFRwICBUcmFuc3BvcnQgaGFuZGxlLgorICogXHJldHVybiAgICAgUmV0dXJuIFRSQU5TUE9SVERFQ19PSyBpZiB0aGUgQ1JDIGlzIG9rLCBvciBlcnJvciBpZiBDUkMgaXMgbm90IGNvcnJlY3QuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2sgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fVFBERUNfTElCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYk1wZWdUUERlYy9zcmMvbXBlZ0ZpbGVGb3JtYXQuaCBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL21wZWdGaWxlRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjZmU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL21wZWdGaWxlRm9ybWF0LmgKQEAgLTAsMCArMSwxMTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBPbGl2ZXIgTW9zZXIKKyAgIERlc2NyaXB0aW9uOiBiaXRzdHJlYW0gZm9ybWF0IGRldGVjdGlvbiByb3V0aW5lcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChfX0JJVFNUUkVBTV9GT1JNQVRfSF9fKQorI2RlZmluZSBfX0JJVFNUUkVBTV9GT1JNQVRfSF9fCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKworLyoqCisgKiBcYnJpZWYgVHJ5IHRvIGZpbmQgb3V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlLCBnaXZlbiB0aGUgZmV3IGZpcnN0IGJ5dGVzLgorICogXHBhcmFtIGZpbGVEYXRhIHBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyB0aGUgZmlyc3QgYnl0ZXMgb2YgYSBmaWxlLgorICogXHBhcmFtIHBBdSBwb2ludGVyIHRvIFVDSEFSKiwgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgQVUgZm91bmQgb3IgTlVMTC4KKyAqIFxwYXJhbSBsZW5ndGggcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgZmlsZURhdGEuIFJldHVybiBsZW5ndGggb2YgZmlyc3QgQVUuCisgKiBccmV0dXJuIHRoZSBkZXRlY3RlZCBmaWxlIGZvcm1hdCwgb3IgRkZfVU5LTk9XTiBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK0ZJTEVfRk9STUFUIEdldEZpbGVGb3JtYXQoVUNIQVIgKmZpbGVEYXRhLCBVQ0hBUiAqKnBBdSwgVUlOVCAqbGVuZ3RoKTsKKworLyoqCisgKiBcYnJpZWYgVHJ5IHRvIGZpbmQgb3V0IHRoZSB0cmFuc3BvcnQgdHlwZSBjb250YWluZWQgaW4gYSBnaXZlbiBmaWxlLgorICogXHBhcmFtIGZpbGVuYW1lIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgYW5hbHlzZWQuCisgKiBccGFyYW0gZmlsZUZvcm1hdCBwb2ludGVyIHRvIGEgdmFyaWFibGUgd2hlcmUgdGhlIGRldGVjdGVkIGZpbGUgZm9ybWF0IGlzIHN0b3JlZCBpbnRvLgorICogXHJldHVybiB0aGUgZGV0ZWN0ZWQgdHJhbnNwb3J0IHR5cGUgb3IgVFRfVU5LTk9XTiBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK1RSQU5TUE9SVF9UWVBFIEdldFRyYW5zcG9ydFR5cGUoY29uc3QgY2hhciogZmlsZW5hbWUsIEZJTEVfRk9STUFUICpmaWxlRm9ybWF0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcCBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2U4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcApAQCAtMCwwICsxLDE1NSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogQURJRiByZWFkZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHBkZWNfYWRpZi5oIgorCisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworVFJBTlNQT1JUREVDX0VSUk9SIGFkaWZSZWFkX0RlY29kZUhlYWRlcigKKyAgICAgICAgQ0FkaWZIZWFkZXIgICAgICAgICAgKnBBZGlmSGVhZGVyLAorICAgICAgICBDUHJvZ3JhbUNvbmZpZyAgICAgICAqcFBjZSwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzCisgICAgICAgICkKK3sKKyAgaW50IGk7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgVUlOVCBzdGFydEFuY2hvciA9IEZES2dldFZhbGlkQml0cyhicyk7CisKKyAgaWYgKChJTlQpc3RhcnRBbmNob3IgPCBNSU5fQURJRl9IRUFERVJMRU5HVEgpIHsKKyAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpOworICB9CisKKyAgaWYgKEZES3JlYWRCaXRzKGJzLDgpICE9ICdBJykgeworICAgIHJldHVybiAoVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpOworICB9CisgIGlmIChGREtyZWFkQml0cyhicyw4KSAhPSAnRCcpIHsKKyAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKTsKKyAgfQorICBpZiAoRkRLcmVhZEJpdHMoYnMsOCkgIT0gJ0knKSB7CisgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfU1lOQ19FUlJPUik7CisgIH0KKyAgaWYgKEZES3JlYWRCaXRzKGJzLDgpICE9ICdGJykgeworICAgIHJldHVybiAoVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpOworICB9CisKKyAgaWYgKCAocEFkaWZIZWFkZXItPkNvcHlyaWdodElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwICkKKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicyw3Mik7ICAvKiBDb3B5cmlnaHRJZCAqLworCisKKyAgcEFkaWZIZWFkZXItPk9yaWdpbmFsQ29weSA9IEZES3JlYWRCaXRzKGJzLDEpOworICBwQWRpZkhlYWRlci0+SG9tZSA9IEZES3JlYWRCaXRzKGJzLDEpOworICBwQWRpZkhlYWRlci0+Qml0c3RyZWFtVHlwZSA9IEZES3JlYWRCaXRzKGJzLDEpOworCisgIC8qIHBBZGlmSGVhZGVyLT5CaXRSYXRlID0gRkRLcmVhZEJpdHMoYnMsIDIzKTsgKi8KKyAgcEFkaWZIZWFkZXItPkJpdFJhdGUgPSBGREtyZWFkQml0cyhicywxNik7CisgIHBBZGlmSGVhZGVyLT5CaXRSYXRlIDw8PSA3OworICBwQWRpZkhlYWRlci0+Qml0UmF0ZSB8PSBGREtyZWFkQml0cyhicyw3KTsKKworICBwQWRpZkhlYWRlci0+TnVtUHJvZ3JhbUNvbmZpZ0VsZW1lbnRzID0gRkRLcmVhZEJpdHMoYnMsNCkgKyAxOworCisgIGlmIChwQWRpZkhlYWRlci0+Qml0c3RyZWFtVHlwZSA9PSAwKSB7CisgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsMjApOyAgLyogYWRpZl9idWZmZXJfZnVsbG5lc3MgKi8KKyAgfQorCisgIC8qIFBhcnNlIGFsbCBQQ0VzIGJ1dCBrZWVwIG9ubHkgb25lICovCisgIGZvciAoaT0wOyBpIDwgcEFkaWZIZWFkZXItPk51bVByb2dyYW1Db25maWdFbGVtZW50czsgaSsrKQorICB7CisgICAgQ1Byb2dyYW1Db25maWdfUmVhZChwUGNlLCBicywgc3RhcnRBbmNob3IpOworICB9CisKKyAgRkRLYnl0ZUFsaWduKGJzLCBzdGFydEFuY2hvcik7CisKKyAgcmV0dXJuIChFcnJvclN0YXR1cyk7Cit9CisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmggYi9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3ODBhNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuaApAQCAtMCwwICsxLDEyMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBEZXNjcmlwdGlvbjogQURJRiByZWFkZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQREVDX0FESUZfSAorI2RlZmluZSBUUERFQ19BRElGX0gKKworI2luY2x1ZGUgInRwZGVjX2xpYi5oIgorCisjZGVmaW5lIE1JTl9BRElGX0hFQURFUkxFTkdUSCAgNjMgIC8qIGluIGJpdHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIE51bVByb2dyYW1Db25maWdFbGVtZW50czsKKyAgVUlOVCBCaXRSYXRlOworICBVQ0hBUiBDb3B5cmlnaHRJZFByZXNlbnQ7CisgIFVDSEFSIE9yaWdpbmFsQ29weTsKKyAgVUNIQVIgSG9tZTsKKyAgVUNIQVIgQml0c3RyZWFtVHlwZTsKK30gQ0FkaWZIZWFkZXI7CisKKy8qKgorICogXGJyaWVmIFBhcnNlIGEgQURJRiBoZWFkZXIgYXQgdGhlIGdpdmVuIGJpdHN0cmVhbSBhbmQgc3RvcmUgdGhlIHBhcnNlZCBkYXRhIGludG8gYSBnaXZlbiBDQWRpZkhlYWRlcgorICogICAgICAgIGFuZCBDUHJvZ3JhbUNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBccGFyYW0gcEFkaWZIZWFkZXIgcG9pbnRlciB0byBhIENBZGlmSGVhZGVyIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwYXJzZWQgQURJRiBoZWFkZXIgZGF0YS4KKyAqIFxwYXJhbSBwUGNlIHBvaW50ZXIgdG8gYSBDUHJvZ3JhbUNvbmZpZyBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGxhc3QgUENFIHdpbGwgcmVtYWluLgorICoKKyAqIFxyZXR1cm4gVFJBTlNQT1JUREVDX0VSUk9SIGVycm9yIGNvZGUKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIGFkaWZSZWFkX0RlY29kZUhlYWRlcigKKyAgICAgICAgQ0FkaWZIZWFkZXIgICAgICAgICAqcEFkaWZIZWFkZXIsCisgICAgICAgIENQcm9ncmFtQ29uZmlnICAgICAgKnBQY2UsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzCisgICAgICAgICk7CisKKyNlbmRpZiAvKiBUUERFQ19BRElGX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuY3BwIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1NTY4MQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuY3BwCkBAIC0wLDAgKzEsMzg4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBBRFRTIGludGVyZmFjZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0cGRlY19hZHRzLmgiCisKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworCisKK3ZvaWQgYWR0c1JlYWRfQ3JjSW5pdChIQU5ETEVfQURUUyBwQWR0cykgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KK3sKKyAgRkRLY3JjSW5pdCgmcEFkdHMtPmNyY0luZm8sIDB4ODAwNSwgMHhGRkZGLCAxNik7Cit9CisKK2ludCBhZHRzUmVhZF9DcmNTdGFydFJlZygKKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBzdHVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gKi8KKyAgICAgICAgICAgICAgICAgICApCit7CisgIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAoIEZES2NyY1N0YXJ0UmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKKworfQorCit2b2lkIGFkdHNSZWFkX0NyY0VuZFJlZygKKyAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLworICAgICAgICAgICAgICAgICAgKQoreworICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApCisgIHsKKyAgICBGREtjcmNFbmRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIHJlZyk7CisgIH0KK30KKworVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0NyY0NoZWNrKCBIQU5ETEVfQURUUyBwQWR0cyApCit7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgVVNIT1JUIGNyYzsKKworICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50KQorICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CisKKyAgY3JjID0gRkRLY3JjR2V0Q1JDKCZwQWR0cy0+Y3JjSW5mbyk7CisgIGlmIChjcmMgIT0gcEFkdHMtPmNyY1JlYWRWYWx1ZSkKKyAgeworICAgIHJldHVybiAoVFJBTlNQT1JUREVDX0NSQ19FUlJPUik7CisgIH0KKworICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KKworCisKKyNkZWZpbmUgQWR0c19MZW5ndGhfU3luY1dvcmQgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBBZHRzX0xlbmd0aF9JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0xheWVyICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQWR0c19MZW5ndGhfUHJvdGVjdGlvbkFic2VudCAgICAgICAgICAgICAgMQorI2RlZmluZSBBZHRzX0xlbmd0aF9Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFkdHNfTGVuZ3RoX1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggICAgICAgIDQKKyNkZWZpbmUgQWR0c19MZW5ndGhfUHJpdmF0ZUJpdCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBZHRzX0xlbmd0aF9DaGFubmVsQ29uZmlndXJhdGlvbiAgICAgICAgICAzCisjZGVmaW5lIEFkdHNfTGVuZ3RoX09yaWdpbmFsQ29weSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfSG9tZSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvbkJpdCAgICAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uU3RhcnQgIDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfRnJhbWVMZW5ndGggICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBBZHRzX0xlbmd0aF9CdWZmZXJGdWxsbmVzcyAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFkdHNfTGVuZ3RoX051bWJlck9mUmF3RGF0YUJsb2Nrc0luRnJhbWUgIDIKKyNkZWZpbmUgQWR0c19MZW5ndGhfQ3JjQ2hlY2sgICAgICAgICAgICAgICAgICAgICAxNgorCitUUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfRGVjb2RlSGVhZGVyKAorICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICAgcEFkdHMsCisgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCisgICAgICAgICkKK3sKKyAgSU5UIGNyY1JlZzsKKworICBJTlQgdmFsQml0czsKKyAgSU5UIGNtcF9idWZmZXJfZnVsbG5lc3M7CisgIGludCBpLCBhZHRzSGVhZGVyTGVuZ3RoOworCisgIFNUUlVDVF9BRFRTX0JTIGJzOworCisjaWZkZWYgVFBfUENFX0VOQUJMRQorICBDUHJvZ3JhbUNvbmZpZyBvbGRQY2U7CisgIC8qIFN0b3JlIHRoZSBvbGQgUENFIHRlbXBvcmFyaWx5LiBNYXliZSB3ZSdsbCBuZWVkIGl0IGxhdGVyIGlmIHdlCisgICAgIGhhdmUgY2hhbm5lbENvbmZpZz0wIGFuZCBubyBQQ0UgaW4gdGhpcyBmcmFtZS4gKi8KKyAgRkRLbWVtY3B5KCZvbGRQY2UsICZwQXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7CisjZW5kaWYKKworICB2YWxCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgLyogYWR0c19maXhlZF9oZWFkZXIgKi8KKyAgYnMubXBlZ19pZCAgICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0lkKTsKKyAgYnMubGF5ZXIgICAgICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0xheWVyKTsKKyAgYnMucHJvdGVjdGlvbl9hYnNlbnQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1Byb3RlY3Rpb25BYnNlbnQpOworICBicy5wcm9maWxlICAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfUHJvZmlsZSk7CisgIGJzLnNhbXBsZV9mcmVxX2luZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KTsKKyAgYnMucHJpdmF0ZV9iaXQgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1ByaXZhdGVCaXQpOworICBicy5jaGFubmVsX2NvbmZpZyAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ2hhbm5lbENvbmZpZ3VyYXRpb24pOworICBicy5vcmlnaW5hbCAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfT3JpZ2luYWxDb3B5KTsKKyAgYnMuaG9tZSAgICAgICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0hvbWUpOworCisgIC8qIGFkdHNfdmFyaWFibGVfaGVhZGVyICovCisgIGJzLmNvcHlyaWdodF9pZCAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25CaXQpOworICBicy5jb3B5cmlnaHRfc3RhcnQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uU3RhcnQpOworICBicy5mcmFtZV9sZW5ndGggICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0ZyYW1lTGVuZ3RoKTsKKyAgYnMuYWR0c19mdWxsbmVzcyAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9CdWZmZXJGdWxsbmVzcyk7CisgIGJzLm51bV9yYXdfYmxvY2tzICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfTnVtYmVyT2ZSYXdEYXRhQmxvY2tzSW5GcmFtZSk7CisgIGJzLm51bV9wY2VfYml0cyAgICA9IDA7CisKKyAgYWR0c0hlYWRlckxlbmd0aCA9IEFEVFNfSEVBREVSTEVOR1RIOworCisgIGlmICghYnMucHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICBGREtjcmNSZXNldCgmcEFkdHMtPmNyY0luZm8pOworICAgIEZES3B1c2hCYWNrKGhCcywgNTYpOyAgIC8qIGNvbXBsZXRlIGZpeGVkIGFuZCB2YXJpYWJsZSBoZWFkZXIhICovCisgICAgY3JjUmVnID0gRkRLY3JjU3RhcnRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIDApOworICAgIEZES3B1c2hGb3IoaEJzLCA1Nik7CisgIH0KKworICBpZiAoISBicy5wcm90ZWN0aW9uX2Fic2VudCAmJiBicy5udW1fcmF3X2Jsb2Nrcz4wKSB7CisgICAgZm9yIChpPTA7IGk8YnMubnVtX3Jhd19ibG9ja3M7IGkrKykgeworICAgICAgcEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbaV0gPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgMTYpOworICAgICAgYWR0c0hlYWRlckxlbmd0aCArPSAxNjsKKyAgICB9CisgICAgLyogQ2hhbmdlIHJhdyBkYXRhIGJsb2NrcyB0byBkZWx0YSB2YWx1ZXMgKi8KKyAgICBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFticy5udW1fcmF3X2Jsb2Nrc10gPSBicy5mcmFtZV9sZW5ndGggLSA3IC0gYnMubnVtX3Jhd19ibG9ja3MqMiAtIDIgOworICAgIGZvciAoaT1icy5udW1fcmF3X2Jsb2NrczsgaT4wOyBpLS0pIHsKKyAgICAgIHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ldIC09IHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ktMV07CisgICAgfQorICB9CisKKyAgLyogYWR0c19lcnJvcl9jaGVjayAqLworICBpZiAoIWJzLnByb3RlY3Rpb25fYWJzZW50KQorICB7CisgICAgVVNIT1JUIGNyY19jaGVjazsKKworICAgIEZES2NyY0VuZFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgY3JjUmVnKTsKKyAgICBjcmNfY2hlY2sgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NyY0NoZWNrKTsKKyAgICBhZHRzSGVhZGVyTGVuZ3RoICs9IEFkdHNfTGVuZ3RoX0NyY0NoZWNrOworCisgICAgcEFkdHMtPmNyY1JlYWRWYWx1ZSA9IGNyY19jaGVjazsKKyAgICAvKiBDaGVjayBoZWFkZXIgQ1JDIGluIGNhc2Ugb2YgbXVsdGlwbGUgcmF3IGRhdGEgYmxvY2tzICovCisgICAgaWYgKGJzLm51bV9yYXdfYmxvY2tzID4gMCkgeworICAgICAgaWYgKHBBZHRzLT5jcmNSZWFkVmFsdWUgIT0gRkRLY3JjR2V0Q1JDKCZwQWR0cy0+Y3JjSW5mbykpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19DUkNfRVJST1I7CisgICAgICB9CisgICAgICAvKiBSZXNldCBDUkMgZm9yIHRoZSB1cGNvbWluZyByYXdfZGF0YV9ibG9jaygpICovCisgICAgICBGREtjcmNSZXNldCgmcEFkdHMtPmNyY0luZm8pOworICAgIH0KKyAgfQorCisKKyAgLyogY2hlY2sgaWYgdmFsaWQgaGVhZGVyICovCisgIGlmICgKKyAgICAgIChicy5sYXllciAhPSAwKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1QRUcgQURUUworICAgICAgKGJzLnNhbXBsZV9mcmVxX2luZGV4ID49IDEzKSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgOTZrSHogLSA3MzUwa0h6CisgICAgICApIHsKKyAgICBGREtwdXNoRm9yKGhCcywgYnMuZnJhbWVfbGVuZ3RoICogOCk7ICAgLy8gdHJ5IGFnYWluIG9uZSBmcmFtZSBsYXRlcgorICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisKKyAgLyogc3BlY2lhbCB0cmVhdG1lbnQgb2YgaWQtYml0ICovCisgIGlmICggKGJzLm1wZWdfaWQgPT0gMCkgJiYgKHBBZHRzLT5kZWNvZGVyQ2FuRG9NcGVnNCA9PSAwKSApCisgIHsKKyAgICAvKiBNUEVHLTIgZGVjb2RlciBjYW5ub3QgcGxheSBNUEVHLTQgYml0c3RyZWFtcyAqLworCisKKyAgICBGREtwdXNoRm9yKGhCcywgYnMuZnJhbWVfbGVuZ3RoICogOCk7ICAvLyB0cnkgYWdhaW4gb25lIGZyYW1lIGxhdGVyCisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKworICBpZiAoIWlnbm9yZUJ1ZmZlckZ1bGxuZXNzKQorICB7CisgICAgY21wX2J1ZmZlcl9mdWxsbmVzcyA9IGJzLmZyYW1lX2xlbmd0aCo4ICsgYnMuYWR0c19mdWxsbmVzcyozMipnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKGJzLmNoYW5uZWxfY29uZmlnKTsKKworCisgICAgLyogRXZhbHVhdGUgYnVmZmVyIGZ1bGxuZXNzICovCisgICAgaWYgKGJzLmFkdHNfZnVsbG5lc3MgIT0gMHg3RkYpCisgICAgeworICAgICAgaWYgKHBBZHRzLT5CdWZmZXJGdWxsbmVzU3RhcnRGbGFnKQorICAgICAgeworICAgICAgICBpZiAoIHZhbEJpdHMgPCBjbXBfYnVmZmVyX2Z1bGxuZXNzICkKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbmRpdGlvbiBmb3Igc3RhcnQgb2YgZGVjb2RpbmcgaXMgbm90IGZ1bGZpbGxlZCAqLworCisgICAgICAgICAgLyogVGhlIGN1cnJlbnQgZnJhbWUgd2lsbCBub3QgYmUgZGVjb2RlZCAqLworICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywgYWR0c0hlYWRlckxlbmd0aCk7CisKKyAgICAgICAgICBpZiAoIChjbXBfYnVmZmVyX2Z1bGxuZXNzK2FkdHNIZWFkZXJMZW5ndGgpID4gKChUUkFOU1BPUlRERUNfSU5CVUZfU0laRTw8MyktNykgKSB7CisgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwQWR0cy0+QnVmZmVyRnVsbG5lc1N0YXJ0RmxhZyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8qIEdldCBpbmZvIGZyb20gQURUUyBoZWFkZXIgKi8KKyAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHBBc2MpOworICBwQXNjLT5tX2FvdCAgICAgICAgICAgICAgICAgICAgPSAoQVVESU9fT0JKRUNUX1RZUEUpKGJzLnByb2ZpbGUgKyAxKTsKKyAgcEFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gYnMuc2FtcGxlX2ZyZXFfaW5kZXg7CisgIHBBc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgICAgICA9IFNhbXBsaW5nUmF0ZVRhYmxlW2JzLnNhbXBsZV9mcmVxX2luZGV4XTsKKyAgcEFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiAgID0gYnMuY2hhbm5lbF9jb25maWc7CisgIHBBc2MtPm1fc2FtcGxlc1BlckZyYW1lICAgICAgICA9IDEwMjQ7CisKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIGlmIChicy5jaGFubmVsX2NvbmZpZyA9PSAwKQorICB7CisgICAgaW50IHBjZUJpdHMgPSAwOworICAgIFVJTlQgYWxpZ25BbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgICAKKyAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLDMpID09IElEX1BDRSkgeworICAgICAgLyogR290IGx1Y2shIFBhcnNlIHRoZSBQQ0UgKi8KKyAgICAgIGludCBjcmNSZWc7CisgICAgICBjcmNSZWcgPSBhZHRzUmVhZF9DcmNTdGFydFJlZyhwQWR0cywgaEJzLCAwKTsKKworICAgICAgQ1Byb2dyYW1Db25maWdfUmVhZCgmcEFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIGhCcywgYWxpZ25BbmNob3IpOworCisgICAgICBhZHRzUmVhZF9DcmNFbmRSZWcocEFkdHMsIGhCcywgY3JjUmVnKTsKKyAgICAgIHBjZUJpdHMgPSBhbGlnbkFuY2hvciAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgLyogc3RvcmUgdGhlIG51bWJlciBvZiBQQ0UgYml0cyAqLworICAgICAgYnMubnVtX3BjZV9iaXRzID0gcGNlQml0czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBObyBQQ0UgaW4gdGhpcyBmcmFtZSEgUHVzaCBiYWNrIHRoZSBJRCB0YWcgYml0cy4gKi8KKyAgICAgIEZES3B1c2hCYWNrKGhCcywzKTsKKworICAgICAgLyogRW5jb2RlcnMgZG8gbm90IGhhdmUgdG8gd3JpdGUgYSBQQ0UgaW4gZWFjaCBmcmFtZS4KKyAgICAgICAgIFNvIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIFBDRSB3ZSBoYXZlIHRvIHVzZSBpdC4gKi8KKyAgICAgIGlmICggIG9sZFBjZS5pc1ZhbGlkCisgICAgICAgICYmIChicy5zYW1wbGVfZnJlcV9pbmRleCA9PSBwQWR0cy0+YnMuc2FtcGxlX2ZyZXFfaW5kZXgpICAvKiB3ZSBjb3VsZCBjb21wYXJlIHRoZSBjb21wbGV0ZSBmaXhlZCBoZWFkZXIgKGJ5dGVzKSBoZXJlISAqLworICAgICAgICAmJiAoYnMuY2hhbm5lbF9jb25maWcgICAgPT0gcEFkdHMtPmJzLmNoYW5uZWxfY29uZmlnKSAvKiA9PSAwICovCisgICAgICAgICYmIChicy5tcGVnX2lkICAgICAgICAgICA9PSBwQWR0cy0+YnMubXBlZ19pZCkgKQorICAgICAgeyAvKiBSZXN0b3JlIHByZXZpb3VzIFBDRSB3aGljaCBpcyBzdGlsbCB2YWxpZCAqLworICAgICAgICBGREttZW1jcHkoJnBBc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCAmb2xkUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGJzLm1wZWdfaWQgPT0gMCkgeworICAgICAgICAvKiBJZiBub3QgaXQgc2VlbXMgdGhhdCB3ZSBoYXZlIGEgaW1wbGljaXQgY2hhbm5lbCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICBUaGlzIG1vZGUgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGNvbnRleHQgb2YgSVNPL0lFQyAxNDQ5Ni0zLgorICAgICAgICAgICBTa2lwIHRoaXMgZnJhbWUgYW5kIHRyeSB0aGUgbmV4dCBvbmUuICovCisgICAgICAgIEZES3B1c2hGb3IoaEJzLCAoYnMuZnJhbWVfbGVuZ3RoPDwzKSAtIGFkdHNIZWFkZXJMZW5ndGggLSAzKTsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICB9CisgICAgICAvKiBlbHNlIHsKKyAgICAgICAgIElTTy9JRUMgMTM4MTgtNyBpbXBsaWNpdCBjaGFubmVsIG1hcHBpbmcgaXMgYWxsb3dlZC4KKyAgICAgICAgIFNvIGp1c3Qgb3BlbiB0aGUgYm94IG9mIGNob2NvbGF0ZXMgdG8gc2VlIHdoYXQgd2UgZ290LgorICAgICAgfSAqLworICAgIH0KKyAgfQorI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KKworICAvKiBDb3B5IGJpdCBzdHJlYW0gZGF0YSBzdHJ1Y3QgdG8gcGVyc2lzdGVudCBtZW1vcnkgbm93LCBvbmNlIHdlIHBhc3NlZCBhbGwgc2FuaXR5IGNoZWNrcyBhYm92ZS4gKi8KKyAgRkRLbWVtY3B5KCZwQWR0cy0+YnMsICZicywgc2l6ZW9mKFNUUlVDVF9BRFRTX0JTKSk7CisKKyAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKK30KKworaW50IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgKKyAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCisgICAgICAgIElOVCAgICAgICAgIGJsb2NrTnVtCisgICAgICAgICkKK3sKKyAgaW50IGxlbmd0aDsKKworICBpZiAocEFkdHMtPmJzLm51bV9yYXdfYmxvY2tzID09IDApIHsKKyAgICBsZW5ndGggPSAocEFkdHMtPmJzLmZyYW1lX2xlbmd0aCAtIDcpIDw8IDM7ICAgIC8qIGFhY19mcmFtZV9sZW5ndGggc3VidHJhY3RlZCBieSB0aGUgaGVhZGVyIHNpemUgKDcgYnl0ZXMpLiAqLworICAgIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkKKyAgICAgIGxlbmd0aCAtPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IDE2IGJpdCBDUkMgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50KSB7CisgICAgICBsZW5ndGggPSAtMTsgLyogcmF3IGRhdGEgYmxvY2sgbGVuZ3RoIGlzIHVua25vd24gKi8KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJsb2NrTnVtIDwgMCB8fCBibG9ja051bSA+IDMpIHsKKyAgICAgICAgbGVuZ3RoID0gLTE7CisgICAgICB9CisgICAgICBsZW5ndGggPSAocEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbYmxvY2tOdW1dIDw8IDMpIC0gMTY7CisgICAgfQorICB9CisgIGlmIChibG9ja051bSA9PSAwICYmIGxlbmd0aCA+IDApIHsKKyAgICBsZW5ndGggLT0gcEFkdHMtPmJzLm51bV9wY2VfYml0czsKKyAgfQorICByZXR1cm4gbGVuZ3RoOworfQorCisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuaCBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I4M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5oCkBAIC0wLDAgKzEsMjM2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKyAgIERlc2NyaXB0aW9uOiBBRFRTIGludGVyZmFjZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFBERUNfQURUU19ICisjZGVmaW5lIFRQREVDX0FEVFNfSAorCisjaW5jbHVkZSAidHBkZWNfbGliLmgiCisKKworI2RlZmluZSBBRFRTX1NZTkNXT1JEICAgICAgICAgICAgICAgKCAweGZmZiApCisjZGVmaW5lIEFEVFNfU1lOQ0xFTkdUSCAgICAgICAgICAgICAoIDEyICkgICAgIC8qIGluIGJpdHMgKi8KKyNkZWZpbmUgQURUU19IRUFERVJMRU5HVEggICAgICAgICAgICggNTYgKSAgICAgLyogbWluaW11bSBoZWFkZXIgc2l6ZSBpbiBiaXRzICovCisjZGVmaW5lIEFEVFNfRklYRURfSEVBREVSTEVOR1RIICAgICAoIDI4ICkgICAgIC8qIGluIGJpdHMgKi8KKyNkZWZpbmUgQURUU19WQVJJQUJMRV9IRUFERVJMRU5HVEggICggQURUU19IRUFERVJMRU5HVEggLSBBRFRTX0ZJWEVEX0hFQURFUkxFTkdUSCApCisKKyNpZmRlZiBDSEVDS19UV09fU1lOQ1MKKyAjZGVmaW5lIEFEVFNfTUlOX1RQX0JVRl9TSVpFICAgICAgICggODE5MSArIDIgKQorI2Vsc2UKKyAjZGVmaW5lIEFEVFNfTUlOX1RQX0JVRl9TSVpFICAgICAgICggODE5MSApCisjZW5kaWYKKworI2luY2x1ZGUgIkZES19jcmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBBRFRTIGhlYWRlciBmaWVsZHMgKi8KKyAgVUNIQVIgbXBlZ19pZDsKKyAgVUNIQVIgbGF5ZXI7CisgIFVDSEFSIHByb3RlY3Rpb25fYWJzZW50OworICBVQ0hBUiBwcm9maWxlOworICBVQ0hBUiBzYW1wbGVfZnJlcV9pbmRleDsKKyAgVUNIQVIgcHJpdmF0ZV9iaXQ7CisgIFVDSEFSIGNoYW5uZWxfY29uZmlnOworICBVQ0hBUiBvcmlnaW5hbDsKKyAgVUNIQVIgaG9tZTsKKyAgVUNIQVIgY29weXJpZ2h0X2lkOworICBVQ0hBUiBjb3B5cmlnaHRfc3RhcnQ7CisgIFVTSE9SVCBmcmFtZV9sZW5ndGg7CisgIFVTSE9SVCBhZHRzX2Z1bGxuZXNzOworICBVQ0hBUiBudW1fcmF3X2Jsb2NrczsKKyAgVUNIQVIgbnVtX3BjZV9iaXRzOworfSBTVFJVQ1RfQURUU19CUzsKKworc3RydWN0IFNUUlVDVF9BRFRTIHsKKworICBTVFJVQ1RfQURUU19CUyBiczsKKworICBVQ0hBUiBkZWNvZGVyQ2FuRG9NcGVnNDsKKyAgVUNIQVIgQnVmZmVyRnVsbG5lc1N0YXJ0RmxhZzsKKworICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAgICAgICAgICAgICAvKiBDUkMgc3RhdGUgaW5mbyAqLworICBVU0hPUlQgICAgICBjcmNSZWFkVmFsdWU7ICAgICAgICAvKiBDUkMgdmFsdWUgcmVhZCBmcm9tIGJpdHN0cmVhbSBkYXRhICovCisgIFVTSE9SVCAgICAgIHJhd0RhdGFCbG9ja0Rpc3RbNF07IC8qIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByYXcgZGF0YSBibG9jay4gTm90IHRoZSBzYW1lIGFzIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gKi8KK30gOworCit0eXBlZGVmIHN0cnVjdCBTVFJVQ1RfQURUUyAqSEFORExFX0FEVFM7CisKKy8qIQorICBcYnJpZWYgSW5pdGlhbGl6ZSBBRFRTIENSQworCisgIFRoZSBmdW5jdGlvbiBpbml0aWFsemVzIHRoZSBjcmMgYnVmZmVyIGFuZCB0aGUgY3JjIGxvb2t1cCB0YWJsZS4KKworICBccmV0dXJuICBub25lCisqLwordm9pZCBhZHRzUmVhZF9DcmNJbml0KCBIQU5ETEVfQURUUyBwQWR0cyApOworCisvKioKKyAqIFxicmllZiBTdGFydHMgQ1JDIHJlZ2lvbiB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgYml0cworICogICAgICAgIElmIG1CaXRzIGlzIHBvc2l0aXZlIHplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbiwgaWYgdGhlcmUKKyAqICAgICAgICBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLgorICogICAgICAgIElmIG1CaXRzIGlzIG5lZ2F0aXZlIG5vIHplcm8gcGFkZGluZyBpcyBkb25lLgorICogICAgICAgIElmIG1CaXRzIGlzIHplcm8gdGhlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHRoZQorICogICAgICAgIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgorICoKKyAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUsIG9uIHdoaWNoIHRoZSBDUkMgcmVnaW9uIHJlZmVyZXMgdG8KKyAqIFxwYXJhbSBtQml0cyBtYXggbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiB0byBiZSBjb25zaWRlcmVkCisgKgorICogXHJldHVybiAgSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitpbnQgYWR0c1JlYWRfQ3JjU3RhcnRSZWcoCisgICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIGludCBtQml0cworICAgICAgICApOworCisvKioKKyAqIFxicmllZiBFbmRzIENSQyByZWdpb24gaWRlbnRpZmllZCBieSByZWcKKyAqCisgKiBccGFyYW0gcEFkdHMgQURUUyBkYXRhIGhhbmRsZQorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlLCBvbiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiByZWZlcmVzIHRvCisgKiBccGFyYW0gcmVnIENSQyByZWdpb25zIElEIHJldHVybmVkIGJ5IGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCkKKyAqCisgKiBccmV0dXJuICBub25lCisgKi8KK3ZvaWQgYWR0c1JlYWRfQ3JjRW5kUmVnKAorICAgICAgICBIQU5ETEVfQURUUyBwQWR0cywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBpbnQgcmVnCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIENoZWNrIENSQworICoKKyAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IGNhbGN1bGF0ZWQgQ1JDIG1hdGNoZXMgdGhlIENSQyBmaWVsZCByZWFkIGZyb20gdGhlIGJpdHN0cmVhbQorICogRGVsZXRlcyBhbGwgQ1JDIHJlZ2lvbnMuCisgKgorICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUKKyAqCisgKiBccmV0dXJuIFJldHVybnMgMCBpZiB0aGV5IGFyZSBpZGVudGljYWwgb3RoZXJ3aXNlIDEKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0NyY0NoZWNrKCBIQU5ETEVfQURUUyBwQWR0cyApOworCisKKy8qKgorICogXGJyaWVmIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBBRFRTIGZyYW1lIGF0IHRoZSBjdXJyZW50IGJpdGJ1ZmZlciBwb3NpdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBlbm91Z2ggYml0cyBpbiBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICogSXQgcmVhZHMgb3V0IHRoZSBoZWFkZXIgYml0cyB0byBwcmVwYXJlIHRoZSBiaXRidWZmZXIgZm9yIHRoZSBkZWNvZGUgbG9vcC4KKyAqIEluIGNhc2UgdGhlIGhlYWRlciBiaXRzIHNob3cgYW4gaW52YWxpZCBiaXRzdHJlYW0vZnJhbWUsIHRoZSB3aG9sZSBmcmFtZSBpcyBza2lwcGVkLgorICoKKyAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHBhcnNlZCBBRFRTIGhlYWRlciBkYXRhCisgKiBccGFyYW0gYnMgaGFuZGxlIG9mIGJpdHN0cmVhbSBmcm9tIHdob20gdGhlIEFEVFMgaGVhZGVyIGlzIHJlYWQKKyAqCisgKiBccmV0dXJuICBlcnJvciBzdGF0dXMKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0RlY29kZUhlYWRlcigKKyAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgIHBBZHRzLAorICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgcmF3IGRhdGEgYmxvY2sgbGVuZ3RoIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuCisgKgorICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUKKyAqIFxwYXJhbSBibG9ja051bSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGluZGV4CisgKiBccGFyYW0gcExlbmd0aCBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiByYXcgZGF0YSBibG9jayBpcyBzdG9yZWQgaW50bworICogICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIHZhbHVlIG1pZ2h0IGJlIC0xLCBpbiB3aGljaCBjYXNlIHRoZSByYXcgZGF0YSBibG9jayBsZW5ndGggaXMgdW5rbm93bi4KKyAqCisgKiBccmV0dXJuICBlcnJvciBzdGF0dXMKKyAqLworaW50IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgKKyAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCisgICAgICAgIElOVCAgICAgICAgIGJsb2NrTnVtCisgICAgICAgICk7CisKKworI2VuZGlmIC8qIFRQREVDX0FEVFNfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcCBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMjcxZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKQEAgLTAsMCArMSwxMzc1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBEYW5pZWwgSG9tbQorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRwZGVjX2xpYi5oIgorI2luY2x1ZGUgInRwX2RhdGEuaCIKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisjaW5jbHVkZSAiRkRLX2NyYy5oIgorI2VuZGlmCisKKwordm9pZCBDUHJvZ3JhbUNvbmZpZ19SZXNldChDUHJvZ3JhbUNvbmZpZyAqcFBjZSkKK3sKKyAgcFBjZS0+ZWxDb3VudGVyID0gMDsKK30KKwordm9pZCBDUHJvZ3JhbUNvbmZpZ19Jbml0KENQcm9ncmFtQ29uZmlnICpwUGNlKQoreworICBGREttZW1jbGVhcihwUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIHBQY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAweGY7CisjZW5kaWYKK30KKworaW50ICBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkICggY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UgKQoreworICByZXR1cm4gKCAocFBjZS0+aXNWYWxpZCkgPyAxIDogMCk7Cit9CisKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisjZGVmaW5lIFBDRV9IRUlHSFRfRVhUX1NZTkMgICggMHhBQyApCisKKy8qCisgKiBSZWFkIHRoZSBleHRlbnNpb24gZm9yIGhlaWdodCBpbmZvLgorICogcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bGwgb3IgLTEgaWYgdGhlIENSQyBmYWlsZWQuCisgKi8KK3N0YXRpYworaW50IENQcm9ncmFtQ29uZmlnX1JlYWRIZWlnaHRFeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICogY29uc3QgYnl0ZXNBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBhbGlnbm1lbnRBbmNob3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgZXJyID0gMDsKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgICAgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgSU5UIGNyY1JlZzsKKyAgRkRLY3JjSW5pdCgmY3JjSW5mbywgMHgwNywgMHhGRiwgOCk7CisgIGNyY1JlZyA9IEZES2NyY1N0YXJ0UmVnKCZjcmNJbmZvLCBicywgMCk7CisgIFVJTlQgc3RhcnRBbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYnMpOworCisgIEZES19BU1NFUlQocFBjZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChicyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChieXRlc0F2YWlsYWJsZSAhPSBOVUxMKTsKKworICBpZiAoIChzdGFydEFuY2hvciA+PSAyNCkgJiYgKCpieXRlc0F2YWlsYWJsZSA+PSAzKQorICAgICYmIChGREtyZWFkQml0cyhicyw4KSA9PSBQQ0VfSEVJR0hUX0VYVF9TWU5DKSApCisgIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykKKyAgICB7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICB9CisgICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspCisgICAgeworICAgICAgcFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICB9CisgICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspCisgICAgeworICAgICAgcFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICB9CisgICAgRkRLYnl0ZUFsaWduKGJzLCBhbGlnbm1lbnRBbmNob3IpOworCisgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBicywgY3JjUmVnKTsKKyAgICBpZiAoKFVTSE9SVClGREtyZWFkQml0cyhicyw4KSAhPSBGREtjcmNHZXRDUkMoJmNyY0luZm8pKSB7CisgICAgICAvKiBDUkMgZmFpbGVkICovCisgICAgICBlcnIgPSAtMTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLyogTm8gdmFsaWQgZXh0ZW5zaW9uIGRhdGEgZm91bmQgLT4gcmVzdG9yZSB0aGUgaW5pdGlhbCBiaXRidWZmZXIgc3RhdGUgKi8KKyAgICBGREtwdXNoQmFjayhicywgc3RhcnRBbmNob3IgLSBGREtnZXRWYWxpZEJpdHMoYnMpKTsKKyAgfQorCisgIC8qIEFsd2F5cyByZXBvcnQgdGhlIGJ5dGVzIHJlYWQuICovCisgICpieXRlc0F2YWlsYWJsZSAtPSAoc3RhcnRBbmNob3IgLSBGREtnZXRWYWxpZEJpdHMoYnMpKSA+PiAzOworCisgIHJldHVybiAoZXJyKTsKK30KKwordm9pZCBDUHJvZ3JhbUNvbmZpZ19SZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25tZW50QW5jaG9yCisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGludCBpLCBlcnIgPSAwOworICBpbnQgY29tbWVudEJ5dGVzOworCisgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzID0gMDsKKyAgcFBjZS0+TnVtQ2hhbm5lbHMgPSAwOworICBwUGNlLT5FbGVtZW50SW5zdGFuY2VUYWcgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBwUGNlLT5Qcm9maWxlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgcFBjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOworICBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMyk7CisgIHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisKKyAgaWYgKChwUGNlLT5Nb25vTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwKQorICB7CisgICAgcFBjZS0+TW9ub01peGRvd25FbGVtZW50TnVtYmVyID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgfQorCisgIGlmICgocFBjZS0+U3RlcmVvTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwKQorICB7CisgICAgcFBjZS0+U3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICB9CisKKyAgaWYgKChwUGNlLT5NYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKSkgIT0gMCkKKyAgeworICAgIHBQY2UtPk1hdHJpeE1peGRvd25JbmRleCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisgICAgcFBjZS0+UHNldWRvU3Vycm91bmRFbmFibGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICB9CisKKyAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKQorICB7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICAgIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKQorICB7CisgICAgcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgcFBjZS0+U2lkZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKQorICB7CisgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKKyAgfQorCisgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzID0gcFBjZS0+TnVtQ2hhbm5lbHM7CisKKyAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykKKyAgeworICAgIHBQY2UtPkxmZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDE7CisgIH0KKworICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUFzc29jRGF0YUVsZW1lbnRzOyBpKyspCisgIHsKKyAgICBwUGNlLT5Bc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtVmFsaWRDY0VsZW1lbnRzOyBpKyspCisgIHsKKyAgICBwUGNlLT5DY0VsZW1lbnRJc0luZFN3W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKKyAgICBwUGNlLT5WYWxpZENjRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIH0KKworICBGREtieXRlQWxpZ24oYnMsIGFsaWdubWVudEFuY2hvcik7CisKKyAgcFBjZS0+Q29tbWVudEZpZWxkQnl0ZXMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDgpOworICBjb21tZW50Qnl0ZXMgPSBwUGNlLT5Db21tZW50RmllbGRCeXRlczsKKworICAvKiBTZWFyY2ggZm9yIGhlaWdodCBpbmZvIGV4dGVuc2lvbiBhbmQgcmVhZCBpdCBpZiBhdmFpbGFibGUgKi8KKyAgZXJyID0gQ1Byb2dyYW1Db25maWdfUmVhZEhlaWdodEV4dCggcFBjZSwgYnMsICZjb21tZW50Qnl0ZXMsIGFsaWdubWVudEFuY2hvciApOworCisgIGZvciAoaT0wOyBpIDwgY29tbWVudEJ5dGVzOyBpKyspCisgIHsKKyAgICBVQ0hBUiB0ZXh0OworCisgICAgdGV4dCA9IChVQ0hBUilGREtyZWFkQml0cyhicyw4KTsKKworICAgIGlmIChpIDwgUENfQ09NTUVOVExFTkdUSCkKKyAgICB7CisgICAgICBwUGNlLT5Db21tZW50W2ldID0gdGV4dDsKKyAgICB9CisgIH0KKworICBwUGNlLT5pc1ZhbGlkID0gKGVycikgPyAwIDogMTsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIHByb2dyYW0gY29uZmlndXJhdGlvbnMuCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb246CisgKiAgLTEgLSBjb21wbGV0ZWx5IGRpZmZlcmVudAorICogICAwIC0gY29tcGxldGVseSBlcXVhbAorICogICAxIC0gZGlmZmVyZW50IGJ1dCBzYW1lIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICogICAyIC0gZGlmZmVyZW50IGNoYW5uZWwgY29uZmlndXJhdGlvbiBidXQgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAqLworaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UyICkKK3sKKyAgaW50IHJlc3VsdCA9IDA7ICAvKiBJbm5vY2VudCB1bnRpbCBwcm92ZW4gZmFsc2UuICovCisKKyAgaWYgKEZES21lbWNtcChwUGNlMSwgcFBjZTIsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpICE9IDApCisgIHsgLyogQ29uZmlndXJhdGlvbnMgYXJlIG5vdCBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKyAgICAgICBTbyBsb29rIGludG8gZGV0YWlscyBhbmQgYW5hbHlzZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uczogKi8KKyAgICByZXN1bHQgPSAtMTsKKworICAgIGlmIChwUGNlMS0+TnVtQ2hhbm5lbHMgPT0gcFBjZTItPk51bUNoYW5uZWxzKQorICAgIHsgLyogTm93IHRoZSBsb2dpYyBjaGFuZ2VzLiBXZSBmaXJzdCBhc3N1bWUgdG8gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgIGFuZCB0aGVuIHByb3ZlIGlmIHRoaXMgYXNzdW1wdGlvbiBpcyB0cnVlLiAqLworICAgICAgcmVzdWx0ID0gMTsKKworICAgICAgLyogRnJvbnQgY2hhbm5lbHMgKi8KKyAgICAgIGlmIChwUGNlMS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzKSB7CisgICAgICAgIHJlc3VsdCA9IDI7ICAvKiBkaWZmZXJlbnQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlbCwgbnVtQ2gxID0gMCwgbnVtQ2gyID0gMDsKKyAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZTEtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgaWYgKHBQY2UxLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSAhPSBwUGNlMi0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIG51bUNoMSArPSBwUGNlMS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdID8gMiA6IDE7CisgICAgICAgICAgbnVtQ2gyICs9IHBQY2UyLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0gPyAyIDogMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtQ2gxICE9IG51bUNoMikgeworICAgICAgICAgIHJlc3VsdCA9IDI7ICAvKiBkaWZmZXJlbnQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIFNpZGUgY2hhbm5lbHMgKi8KKyAgICAgIGlmIChwUGNlMS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyAhPSBwUGNlMi0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cykgeworICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlbCwgbnVtQ2gxID0gMCwgbnVtQ2gyID0gMDsKKyAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZTEtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICBpZiAocFBjZTEtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0gcFBjZTItPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIG51bUNoMSArPSBwUGNlMS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0gPyAyIDogMTsKKyAgICAgICAgICBudW1DaDIgKz0gcFBjZTItPlNpZGVFbGVtZW50SXNDcGVbZWxdID8gMiA6IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bUNoMSAhPSBudW1DaDIpIHsKKyAgICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWxzICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEJhY2sgY2hhbm5lbHMgKi8KKyAgICAgIGlmIChwUGNlMS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAhPSBwUGNlMi0+TnVtQmFja0NoYW5uZWxFbGVtZW50cykgeworICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlbCwgbnVtQ2gxID0gMCwgbnVtQ2gyID0gMDsKKyAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZTEtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICBpZiAocFBjZTEtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0gcFBjZTItPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIG51bUNoMSArPSBwUGNlMS0+QmFja0VsZW1lbnRJc0NwZVtlbF0gPyAyIDogMTsKKyAgICAgICAgICBudW1DaDIgKz0gcFBjZTItPkJhY2tFbGVtZW50SXNDcGVbZWxdID8gMiA6IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bUNoMSAhPSBudW1DaDIpIHsKKyAgICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWxzICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIExGRSBjaGFubmVscyAqLworICAgICAgaWYgKHBQY2UxLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bUxmZUNoYW5uZWxFbGVtZW50cykgeworICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBsZmUgY2hhbm5lbHMgKi8KKyAgICAgIH0KKyAgICAgIC8qIExGRXMgYXJlIGFsd2F5cyBTQ0VzIHNvIHdlIGRvbid0IG5lZWQgdG8gY291bnQgdGhlIGNoYW5uZWxzLiAqLworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCggQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbENvbmZpZyApCit7CisgIEZES19BU1NFUlQocFBjZSAhPSBOVUxMKTsKKworICAvKiBJbml0IFBDRSAqLworICBDUHJvZ3JhbUNvbmZpZ19Jbml0KHBQY2UpOworICBwUGNlLT5Qcm9maWxlID0gMTsgIC8qIFNldCBBQUMgTEMgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgb2JqZWN0IHR5cGUuICovCisKKyAgc3dpdGNoIChjaGFubmVsQ29uZmlnKSB7CisgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgY2FzZSAzMjogLyogNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFzIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmggKi8KKyAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyAgPSAyOworICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKKyAgICBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzICAgPSAxOworICAgIHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbMF0gICAgICA9IDE7CisgICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAgID0gMTsKKyAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdICAgICAgPSAxOworICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyAgICA9IDE7CisgICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgID0gODsKKyAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICAgPSA3OworICAgIHBQY2UtPmlzVmFsaWQgICAgICAgICAgICAgICAgICA9IDE7CisgICAgYnJlYWs7CisgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgY2FzZSAxMjogIC8qIDMvMC80LjFjaCBzdXJyb3VuZCBiYWNrICovCisgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSAgICAgID0gMTsKKyAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAxOworICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDE7CisgIGNhc2UgMTE6ICAvKiAzLzAvMy4xY2ggKi8KKyAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAyOworICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKKyAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICArPSAyOworICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMF0gICAgICA9IDE7CisgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSAgICAgKz0gMDsKKyAgICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgICArPSAxOworICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDc7CisgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gNjsKKyAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOworICAgIGJyZWFrOworICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIGNhc2UgMTQ6ICAvKiAyLzAvMC0zLzAvMi0wLjFjaCBmcm9udCBoZWlnaHQgKi8KKyAgICBwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvWzJdID0gMTsgICAgICAvKiBUb3Agc3BlYWtlciAqLworICBjYXNlIDc6ICAgLyogNS8wLzIuMWNoIGZyb250ICovCisgICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMTsKKyAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVsyXSAgICAgPSAxOworICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDI7CisgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gMjsKKyAgY2FzZSA2OiAgIC8qIDMvMC8yLjFjaCAqLworICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyAgICs9IDE7CisgICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMTsKKyAgY2FzZSA1OiAgIC8qIDMvMC8yLjBjaCAqLworICBjYXNlIDQ6ICAgLyogMy8wLzEuMGNoICovCisgICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAgKz0gMTsKKyAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdICAgICAgPSAoY2hhbm5lbENvbmZpZz40KSA/IDEgOiAwOworICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IChjaGFubmVsQ29uZmlnPjQpID8gMiA6IDE7CisgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gKGNoYW5uZWxDb25maWc+NCkgPyAyIDogMTsKKyAgY2FzZSAzOiAgIC8qIDMvMC8wLjBjaCAqLworICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICs9IDE7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKKyAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAyOworICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDI7CisgIGNhc2UgMTogICAvKiAxLzAvMC4wY2ggKi8KKyAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOworICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7CisgICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMTsKKyAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICArPSAxOworICAgIHBQY2UtPmlzVmFsaWQgICAgICAgICAgICAgICAgICA9IDE7CisgICAgYnJlYWs7CisgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgY2FzZSAyOiAgIC8qIDIvMC8wLmNoICovCisgICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgID0gMTsKKyAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSAgICAgPSAxOworICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDI7CisgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gMjsKKyAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOworICAgIGJyZWFrOworICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIGRlZmF1bHQ6CisgICAgcFBjZS0+aXNWYWxpZCAgICAgICAgICAgICAgICAgID0gMDsgICAvKiBUbyBiZSBleHBsaWNpdCEgKi8KKyAgICBicmVhazsKKyAgfQorCisgIGlmIChwUGNlLT5pc1ZhbGlkKSB7CisgICAgLyogQ3JlYXRlIHZhbGlkIGVsZW1lbnQgaW5zdGFuY2UgdGFncyAqLworICAgIGludCBlbCwgZWxUYWdTY2UgPSAwLCBlbFRhZ0NwZSA9IDA7CisKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2VsXSA9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CisgICAgfQorICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgIHBQY2UtPlNpZGVFbGVtZW50VGFnU2VsZWN0W2VsXSA9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyBlbFRhZ0NwZSsrIDogZWxUYWdTY2UrKzsKKyAgICB9CisgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbZWxdID0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IGVsVGFnQ3BlKysgOiBlbFRhZ1NjZSsrOworICAgIH0KKyAgICBlbFRhZ1NjZSA9IDA7CisgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICBwUGNlLT5MZmVFbGVtZW50VGFnU2VsZWN0W2VsXSA9IGVsVGFnU2NlKys7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworCisvKioKKyAqIFxicmllZiBnZXQgaW1wbGljaXQgYXVkaW8gY2hhbm5lbCB0eXBlIGZvciBnaXZlbiBjaGFubmVsQ29uZmlnIGFuZCBNUEVHIG9yZGVyZWQgY2hhbm5lbCBpbmRleAorICogXHBhcmFtIGNoYW5uZWxDb25maWcgTVBFRyBjaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIDEgdXB0byAxNAorICogXHBhcmFtIGluZGV4IE1QRUcgY2hhbm5lbCBvcmRlciBpbmRleAorICogXHJldHVybiBhdWRpbyBjaGFubmVsIHR5cGUuCisgKi8KK3N0YXRpYwordm9pZCBnZXRJbXBsaWNpdEF1ZGlvQ2hhbm5lbFR5cGVBbmRJbmRleCgKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICpjaFR5cGUsCisgICAgICAgIFVDSEFSICpjaEluZGV4LAorICAgICAgICBVSU5UIGNoYW5uZWxDb25maWcsCisgICAgICAgIFVJTlQgaW5kZXgKKyAgICAgICAgKQoreworICBpZiAoaW5kZXggPCAzKSB7CisgICAgKmNoVHlwZSA9IEFDVF9GUk9OVDsKKyAgICAqY2hJbmRleCA9IGluZGV4OworICB9IGVsc2UgeworICAgIHN3aXRjaCAoY2hhbm5lbENvbmZpZykgeworICAgICAgY2FzZSA0OiAgLyogU0NFLCBDUEUsIFNDRSAqLworICAgICAgY2FzZSA1OiAgLyogU0NFLCBDUEUsIENQRSAqLworICAgICAgY2FzZSA2OiAgLyogU0NFLCBDUEUsIENQRSwgTEZFICovCisgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9CQUNLOworICAgICAgICAgICAgKmNoSW5kZXggPSBpbmRleCAtIDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAqY2hUeXBlID0gQUNUX0xGRTsKKyAgICAgICAgICAgICpjaEluZGV4ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OiAgLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICpjaFR5cGUgPSBBQ1RfRlJPTlQ7CisgICAgICAgICAgICAqY2hJbmRleCA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICpjaFR5cGUgPSBBQ1RfQkFDSzsKKyAgICAgICAgICAgICpjaEluZGV4ID0gaW5kZXggLSA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9MRkU7CisgICAgICAgICAgICAqY2hJbmRleCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE6ICAvKiBTQ0UsQ1BFLENQRSxTQ0UsTEZFICovCisgICAgICAgIGlmIChpbmRleCA8IDYpIHsKKyAgICAgICAgICAqY2hUeXBlID0gQUNUX0JBQ0s7CisgICAgICAgICAgKmNoSW5kZXggPSBpbmRleCAtIDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmNoVHlwZSA9IEFDVF9MRkU7CisgICAgICAgICAgKmNoSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjogIC8qIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICAgICAgaWYgKGluZGV4IDwgNykgeworICAgICAgICAgICpjaFR5cGUgPSBBQ1RfQkFDSzsKKyAgICAgICAgICAqY2hJbmRleCA9IGluZGV4IC0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqY2hUeXBlID0gQUNUX0xGRTsKKyAgICAgICAgICAqY2hJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE0OiAgLyogU0NFLENQRSxDUEUsTEZFLENQRSAqLworICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICpjaFR5cGUgPSBBQ1RfQkFDSzsKKyAgICAgICAgICAgICpjaEluZGV4ID0gaW5kZXggLSAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9MRkU7CisgICAgICAgICAgICAqY2hJbmRleCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9GUk9OVF9UT1A7CisgICAgICAgICAgICAqY2hJbmRleCA9IGluZGV4IC0gNjsgIC8qIGhhbmRsZSB0aGUgdG9wIGxheWVyIGluZGVwZW5kZW50bHkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKmNoVHlwZSA9IEFDVF9OT05FOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCisgICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICBVSU5UICAgICAgICAgICAgY2hhbm5lbENvbmZpZywKKyAgICAgICAgY29uc3QgVUlOVCAgICAgIHRhZywKKyAgICAgICAgY29uc3QgVUlOVCAgICAgIGNoYW5uZWxJZHgsCisgICAgICAgIFVDSEFSICAgICAgICAgICBjaE1hcHBpbmdbXSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAorICAgICAgICBVQ0hBUiAgICAgICAgICAgY2hJbmRleFtdLAorICAgICAgICBVQ0hBUiAgICAgICAgICAqZWxNYXBwaW5nLAorICAgICAgICBNUDRfRUxFTUVOVF9JRCAgZWxMaXN0W10sCisgICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbFR5cGUKKyAgICAgICApCit7CisgIGlmIChjaGFubmVsQ29uZmlnID4gMCkKKyAgeworICAgIC8qIENvbnN0YW50IGNoYW5uZWwgbWFwcGluZyBtdXN0IGhhdmUKKyAgICAgICBiZWVuIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICovCisgICAgaWYgKCBlbFR5cGUgPT0gSURfU0NFCisgICAgICB8fCBlbFR5cGUgPT0gSURfQ1BFCisgICAgICB8fCBlbFR5cGUgPT0gSURfTEZFICkKKyAgICB7CisgICAgICAqZWxNYXBwaW5nID0gcFBjZS0+ZWxDb3VudGVyOworICAgICAgaWYgKGVsTGlzdFtwUGNlLT5lbENvdW50ZXJdICE9IGVsVHlwZSkgeworICAgICAgICAvKiBOb3QgaW4gdGhlIGxpc3QgKi8KKyAgICAgICAgaWYgKCAoY2hhbm5lbENvbmZpZyA9PSAyKSAmJiAoZWxUeXBlID09IElEX1NDRSkgKQorICAgICAgICB7IC8qIFRoaXMgc2NlbmFyaW8gb2NjdXJzIHdpdGggSEUtQUFDIHYyIHN0cmVhbXMgb2YgYnVnZ3kgZW5jb2RlcnMuCisgICAgICAgICAgICAgRHVlIHRvIG90aGVyIGRlY29kZXIgaW1wbGVtZW50YXRpb25zIGRlY29kaW5nIG9mIHRoZXNlIGtpbmQgb2Ygc3RyZWFtcyBpcyBkZXNpcmVkLiAqLworICAgICAgICAgIGNoYW5uZWxDb25maWcgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBBc3N1bWUgYWxsIGZyb250IGNoYW5uZWxzICovCisgICAgICBnZXRJbXBsaWNpdEF1ZGlvQ2hhbm5lbFR5cGVBbmRJbmRleCgmY2hUeXBlW2NoYW5uZWxJZHhdLCAmY2hJbmRleFtjaGFubmVsSWR4XSwgY2hhbm5lbENvbmZpZywgY2hhbm5lbElkeCk7CisgICAgICBpZiAoZWxUeXBlID09IElEX0NQRSkgeworICAgICAgICBjaFR5cGVbY2hhbm5lbElkeCsxXSA9IGNoVHlwZVtjaGFubmVsSWR4XTsKKyAgICAgICAgY2hJbmRleFtjaGFubmVsSWR4KzFdID0gY2hJbmRleFtjaGFubmVsSWR4XSsxOworICAgICAgfQorICAgICAgcFBjZS0+ZWxDb3VudGVyKys7CisgICAgfQorICAgIC8qIEFjY2VwdCBhbGwgbm9uLWNoYW5uZWwgZWxlbWVudHMsIHRvby4gKi8KKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgIHsKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgICAgaWYgKCFwUGNlLT5pc1ZhbGlkKQorI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KKyAgICB7CisgICAgICAvKiBJbXBsaWNpdCBjaGFubmVsIG1hcHBpbmcuICovCisgICAgICBpZiAoIGVsVHlwZSA9PSBJRF9TQ0UKKyAgICAgICAgfHwgZWxUeXBlID09IElEX0NQRQorICAgICAgICB8fCBlbFR5cGUgPT0gSURfTEZFICkKKyAgICAgIHsKKyAgICAgICAgLyogU3RvcmUgYWxsIGNoYW5uZWwgZWxlbWVudCBJRHMgKi8KKyAgICAgICAgZWxMaXN0W3BQY2UtPmVsQ291bnRlcl0gPSBlbFR5cGU7CisgICAgICAgICplbE1hcHBpbmcgPSBwUGNlLT5lbENvdW50ZXIrKzsKKyAgICAgIH0KKyAgICB9CisjaWZkZWYgIFRQX1BDRV9FTkFCTEUKKyAgICBlbHNlIHsKKyAgICAgIC8qIEFjY2VwdCB0aGUgYWRkaXRpb25hbCBjaGFubmVsKHMpLCBvbmx5IGlmIHRoZSB0YWcgaXMgaW4gdGhlIGxpc3RzICovCisgICAgICBpbnQgaXNDcGUgPSAwLCBpOworICAgICAgLyogRWxlbWVudCBjb3VudGVyICovCisgICAgICBpbnQgZWNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CisgICAgICAvKiBDaGFubmVsIGNvdW50ZXJzICovCisgICAgICBpbnQgY2NbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CisgICAgICBpbnQgZmNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CisgICAgICBpbnQgc2NbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CisgICAgICBpbnQgYmNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CisgICAgICBpbnQgbGMgPSAwOzsKKworICAgICAgLyogR2VuZXJhbCBNUEVHIChQQ0UpIGNvbXBvc2l0aW9uIHJ1bGVzOgorICAgICAgICAgLSBPdmVyIGFsbDoKKyAgICAgICAgICAgICA8bm9ybWFsIGhlaWdodCBjaGFubmVscz48dG9wIGhlaWdodCBjaGFubmVscz48Ym90dG9tIGhlaWdodCBjaGFubmVscz4KKyAgICAgICAgIC0gV2l0aGluIGVhY2ggaGVpZ2h0IGxheWVyOgorICAgICAgICAgICAgIDxmcm9udCBjaGFubmVscz48c2lkZSBjaGFubmVscz48YmFjayBjaGFubmVscz4KKyAgICAgICAgIC0gRXhjZXB0aW9uOgorICAgICAgICAgICAgIFRoZSBMRkUgY2hhbm5lbHMgaGF2ZSBubyBoZWlnaHQgaW5mbyBhbmQgdGh1cyB0aGV5IGFyZSBhcnJhbmdlZCBhdCB0aGUgdmVyeQorICAgICAgICAgICAgIGVuZCBvZiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciBjaGFubmVscy4KKyAgICAgICAqLworCisgICAgICBzd2l0Y2ggKGVsVHlwZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgICBpc0NwZSA9IDE7CisgICAgICBjYXNlIElEX1NDRToKKyAgICAgICAgLyogc2VhcmNoIGluIGZyb250IGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgaW50IGgsIGVsSWR4ID0gZWNbaGVpZ2h0TGF5ZXJdLCBjaElkeCA9IGNjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBhQ2hUeXBlID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKGhlaWdodExheWVyPDw0KSB8IEFDVF9GUk9OVCk7CisgICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllci0xOyBoID49IDA7IGgtPTEpIHsKKyAgICAgICAgICAgICAgaW50IGVsOworICAgICAgICAgICAgICAvKiBDb3VudCBmcm9udCBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKKyAgICAgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKKyAgICAgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICBlbElkeCArPSAxOworICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBDb3VudCBiYWNrIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGggPT0gMCkgeyAgLyogbm9ybWFsIGhlaWdodCAqLworICAgICAgICAgICAgICAgIGVsSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgICAgICAgICAgICAgICBjaElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeF0gPSBjaGFubmVsSWR4OworICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IGFDaFR5cGU7CisgICAgICAgICAgICBjaEluZGV4W2NoSWR4XSA9IGZjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgIGlmIChpc0NwZSkgeworICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHgrMV0gPSBjaGFubmVsSWR4KzE7CisgICAgICAgICAgICAgIGNoVHlwZVtjaElkeCsxXSA9IGFDaFR5cGU7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrMV0gPSBmY1toZWlnaHRMYXllcl0rMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIH0KKyAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgZmNbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgZmNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHNlYXJjaCBpbiBzaWRlIGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+U2lkZUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXI8PDQpIHwgQUNUX1NJREUpOworICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXItMTsgaCA+PSAwOyBoLT0xKSB7CisgICAgICAgICAgICAgIGludCBlbDsKKyAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgeworICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChoID09IDApIHsgIC8qIExGRSBjaGFubmVscyBiZWxvbmcgdG8gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgKi8KKyAgICAgICAgICAgICAgICBlbElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CisgICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBhQ2hUeXBlOworICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBzY1toZWlnaHRMYXllcl07CisgICAgICAgICAgICBpZiAoaXNDcGUpIHsKKyAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4KzFdID0gY2hhbm5lbElkeCsxOworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHgrMV0gPSBhQ2hUeXBlOworICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4KzFdID0gc2NbaGVpZ2h0TGF5ZXJdKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHNlYXJjaCBpbiBiYWNrIGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXI8PDQpIHwgQUNUX0JBQ0spOworICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXItMTsgaCA+PSAwOyBoLT0xKSB7CisgICAgICAgICAgICAgIGludCBlbDsKKyAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgeworICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChoID09IDApIHsgIC8qIG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICBlbElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CisgICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBhQ2hUeXBlOworICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBiY1toZWlnaHRMYXllcl07CisgICAgICAgICAgICBpZiAoaXNDcGUpIHsKKyAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4KzFdID0gY2hhbm5lbElkeCsxOworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHgrMV0gPSBhQ2hUeXBlOworICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4KzFdID0gYmNbaGVpZ2h0TGF5ZXJdKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX0xGRToKKyAgICAgIHsgLyogVW5mb3J0dW5hdGVseSB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYWxsIG5vcm1hbCBoZWlnaHQKKyAgICAgICAgICAgbGF5ZXIgZWxlbWVudHMgdG8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgTEZFIGNoYW5uZWxzLgorICAgICAgICAgICBTdGFydCB3aXRoIGNvdW50aW5nIHRoZSBmcm9udCBjaGFubmVscy9lbGVtZW50cyBhdCBub3JtYWwgaGVpZ2h0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSs9MSkgeworICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgPyAyIDogMTsKKyAgICAgICAgfQorICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzIGF0IG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrPTEpIHsKKyAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldKSA/IDIgOiAxOworICAgICAgICB9CisgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgYXQgbm9ybWFsIGhlaWdodCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSs9MSkgeworICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pID8gMiA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZWFyY2ggaW4gbGZlIGNoYW5uZWxzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgIGludCBlbElkeCA9IGVjWzBdOyAgLyogTEZFIGNoYW5uZWxzIGJlbG9uZyB0byB0aGUgbm9ybWFsIGhlaWdodCBsYXllciAqLworICAgICAgICAgIGludCBjaElkeCA9IGNjWzBdOworICAgICAgICAgIGlmICggcFBjZS0+TGZlRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcgKSB7CisgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKKyAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBBQ1RfTEZFOworICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBsYzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIH0KKyAgICAgICAgICBlY1swXSArPSAxOworICAgICAgICAgIGNjWzBdICs9IDE7CisgICAgICAgICAgbGMgKz0gMTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKworICAgICAgLyogTm9uIGF1ZGlvIGVsZW1lbnRzICovCisgICAgICBjYXNlIElEX0NDRToKKyAgICAgICAgLyogc2VhcmNoIGluIGNjZSBjaGFubmVscyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtVmFsaWRDY0VsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICBpZiAocFBjZS0+VmFsaWRDY0VsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElEX0RTRToKKyAgICAgICAgLyogc2VhcmNoIGFzc29jaWF0ZWQgZGF0YSBlbGVtZW50cyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQXNzb2NEYXRhRWxlbWVudHM7IGkrKykgeworICAgICAgICAgIGlmIChwUGNlLT5Bc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gMDsgIC8qIG5vdCBmb3VuZCBpbiBhbnkgbGlzdCAqLworICAgIH0KKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisgIH0KKworICByZXR1cm4gMTsKK30KKworI2lmZGVmICBUUF9QQ0VfRU5BQkxFCitpbnQgQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKAorICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsTGlzdFtdLAorICAgICAgICBjb25zdCBJTlQgZWxMaXN0U2l6ZSwKKyAgICAgICAgVUNIQVIgKnBDaE1hcElkeAorICAgICAgICkKK3sKKyAgaW50IGksIGVsID0gMDsKKworICBGREtfQVNTRVJUKGVsTGlzdCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwQ2hNYXBJZHggIT0gTlVMTCk7CisKKyAgKnBDaE1hcElkeCA9IDA7CisKKyAgaWYgKCBlbExpc3RTaXplCisgICAgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArIHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHMgKyBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICsgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzCisgICAgKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspCisgIHsKKyAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pID8gIElEX0NQRSA6IElEX1NDRTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKQorICB7CisgICAgZWxMaXN0W2VsKytdID0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pID8gIElEX0NQRSA6IElEX1NDRTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKQorICB7CisgICAgZWxMaXN0W2VsKytdID0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pID8gIElEX0NQRSA6IElEX1NDRTsKKyAgfQorCisgIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspCisgIHsKKyAgICBlbExpc3RbZWwrK10gPSBJRF9MRkU7CisgIH0KKworCisgIC8qIEZpbmQgYW4gY29ycmVzcG9uZGluZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaWYgcG9zc2libGUgKi8KKyAgc3dpdGNoIChwUGNlLT5OdW1DaGFubmVscykgeworICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgorICAgIC8qIE9uZSBhbmQgdHdvIGNoYW5uZWxzIGhhdmUgbm8gYWx0ZXJuYXRpdmVzLiBUaGUgb3RoZXIgb25lcyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBjb25maWcuIEJlY2F1c2Ugb2YgbGVnYWN5IHJlYXNvbnMgb3IgZm9yIGxhY2sgb2YgYWx0ZXJuYXRpdmUgbWFwcGluZ3MuICovCisgICAgKnBDaE1hcElkeCA9IHBQY2UtPk51bUNoYW5uZWxzOworICAgIGJyZWFrOworICBjYXNlIDc6CisgICAgeworICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOworICAgICAgLyogQ3JlYXRlIGEgUENFIGZvciB0aGUgY29uZmlnIHRvIHRlc3QgLi4uICovCisgICAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KHRtcFBjZSwgMTEpOworICAgICAgLyogLi4uIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGdpdmVuIG9uZS4gKi8KKyAgICAgICpwQ2hNYXBJZHggPSAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkmMHhFKSkgPyAxMSA6IDA7CisgICAgICAvKiBJZiBjb21wYXJlIHJlc3VsdCBpcyAwIG9yIDEgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBjaGFubmVsIGNvbmZpZyAxMS4gKi8KKyAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDg6CisgICAgeyAvKiBUcnkgdGhlIGZvdXIgcG9zc2libGUgNy4xY2ggY29uZmlndXJhdGlvbnMuIE9uZSBhZnRlciB0aGUgb3RoZXIuICovCisgICAgICBVQ0hBUiB0ZXN0Q2ZnWzRdID0geyAzMiwgMTQsIDEyLCA3fTsKKyAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKKyAgICAgIGZvciAoaT0wOyBpPDQ7IGkrPTEpIHsKKyAgICAgICAgLyogQ3JlYXRlIGEgUENFIGZvciB0aGUgY29uZmlnIHRvIHRlc3QgLi4uICovCisgICAgICAgIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQodG1wUGNlLCB0ZXN0Q2ZnW2ldKTsKKyAgICAgICAgLyogLi4uIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGdpdmVuIG9uZS4gKi8KKyAgICAgICAgaWYgKCEoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwUGNlLCB0bXBQY2UpJjB4RSkpIHsKKyAgICAgICAgICAvKiBJZiB0aGUgY29tcGFyZSByZXN1bHQgaXMgMCBvciAxIHRoYW4gdGhlIHR3byBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIG1hdGNoLiAqLworICAgICAgICAgIC8qIEV4cGxpY2l0IG1hcHBpbmcgb2YgNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHRvIDcuMSByZWFyIGNoYW5uZWwgbWFwcGluZy4gKi8KKyAgICAgICAgICAqcENoTWFwSWR4ID0gKHRlc3RDZmdbaV09PTMyKSA/IDEyIDogdGVzdENmZ1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLyogVGhlIFBDRSBkb2VzIG5vdCBtYXRjaCBhbnkgcHJlZGVmaW5lZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCisgICAgKnBDaE1hcElkeCA9IDA7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZWw7Cit9CisjZW5kaWYKKworc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykKK3sKKyAgaW50IHRtcCA9IDA7CisKKyAgdG1wID0gRkRLcmVhZEJpdHMoYnMsNSk7CisgIGlmICh0bXAgPT0gQU9UX0VTQ0FQRSkgeworICAgIGludCB0bXAyID0gRkRLcmVhZEJpdHMoYnMsNik7CisgICAgdG1wID0gMzIgKyB0bXAyOworICB9CisKKyAgcmV0dXJuIChBVURJT19PQkpFQ1RfVFlQRSl0bXA7Cit9CisKK3N0YXRpYyBJTlQgZ2V0U2FtcGxlUmF0ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgVUNIQVIgKmluZGV4LCBpbnQgbkJpdHMpCit7CisgIElOVCBzYW1wbGVSYXRlOworICBpbnQgaWR4OworCisgIGlkeCA9IEZES3JlYWRCaXRzKGJzLCBuQml0cyk7CisgIGlmKCBpZHggPT0gKDE8PG5CaXRzKS0xICkgeworICAgIGlmKEZES2dldFZhbGlkQml0cyhicykgPCAyNCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNhbXBsZVJhdGUgPSBGREtyZWFkQml0cyhicywyNCk7CisgIH0gZWxzZSB7CisgICAgc2FtcGxlUmF0ZSA9IFNhbXBsaW5nUmF0ZVRhYmxlW2lkeF07CisgIH0KKworICAqaW5kZXggPSBpZHg7CisKKyAgcmV0dXJuIHNhbXBsZVJhdGU7Cit9CisKKyNpZmRlZiBUUF9HQV9FTkFCTEUKK3N0YXRpYworVFJBTlNQT1JUREVDX0VSUk9SIEdhU3BlY2lmaWNDb25maWdfUGFyc2UoIENTR2FTcGVjaWZpY0NvbmZpZyAgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgYXNjU3RhcnRBbmNob3IgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgc2VsZi0+bV9mcmFtZUxlbmd0aEZsYWcgPSBGREtyZWFkQml0cyhicywxKTsKKworICBzZWxmLT5tX2RlcGVuZHNPbkNvcmVDb2RlciA9IEZES3JlYWRCaXRzKGJzLDEpOworCisgIGlmKCBzZWxmLT5tX2RlcGVuZHNPbkNvcmVDb2RlciApCisgICAgc2VsZi0+bV9jb3JlQ29kZXJEZWxheSA9IEZES3JlYWRCaXRzKGJzLDE0KTsKKworICBzZWxmLT5tX2V4dGVuc2lvbkZsYWcgPSBGREtyZWFkQml0cyhicywxKTsKKworICBpZiggYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID09IDAgKSB7CisgICAgQ1Byb2dyYW1Db25maWdfUmVhZCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgYnMsIGFzY1N0YXJ0QW5jaG9yKTsKKyAgfQorCisgIGlmICgoYXNjLT5tX2FvdCA9PSBBT1RfQUFDX1NDQUwpIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkpIHsKKyAgICBzZWxmLT5tX2xheWVyID0gRkRLcmVhZEJpdHMoYnMsMyk7CisgIH0KKworICBpZiAoc2VsZi0+bV9leHRlbnNpb25GbGFnKSB7CisgICAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgIHNlbGYtPm1fbnVtT2ZTdWJGcmFtZSA9IEZES3JlYWRCaXRzKGJzLDUpOworICAgICAgc2VsZi0+bV9sYXllckxlbmd0aCAgID0gRkRLcmVhZEJpdHMoYnMsMTEpOworICAgIH0KKworICAgIGlmICgoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xDKSAgIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTFRQKSAgfHwKKyAgICAgICAgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSkKKyAgICB7CisgICAgICBhc2MtPm1fdmNiMTFGbGFnID0gRkRLcmVhZEJpdHMoYnMsMSk7IC8qIGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgKi8KKyAgICAgIGFzYy0+bV9ydmxjRmxhZyAgPSBGREtyZWFkQml0cyhicywxKTsgLyogYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgKi8KKyAgICAgIGFzYy0+bV9oY3JGbGFnICAgPSBGREtyZWFkQml0cyhicywxKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgKi8KKyAgICB9CisKKyAgICBzZWxmLT5tX2V4dGVuc2lvbkZsYWczID0gRkRLcmVhZEJpdHMoYnMsMSk7CisKKyAgfQorICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KKyNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KKworCisKKworCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorCitzdGF0aWMgSU5UIGxkX3Nicl9oZWFkZXIoIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IgKQoreworICBjb25zdCBpbnQgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CisgIGludCBpID0gMDsKKyAgSU5UIGVycm9yID0gMDsKKworICBpZiAoY2hhbm5lbENvbmZpZ3VyYXRpb24gPT0gMikgeworICAgIGVycm9yID0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7CisgIH0gZWxzZSB7CisgICAgZXJyb3IgPSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX1NDRSwgaSsrKTsKKyAgfQorCisgIHN3aXRjaCAoIGNoYW5uZWxDb25maWd1cmF0aW9uICkgeworICAgIGNhc2UgMTQ6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDc6CisgICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKKyAgICBjYXNlIDY6CisgICAgY2FzZSA1OgorICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7CisgICAgY2FzZSAzOgorICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMTE6CisgICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKKyAgICBjYXNlIDQ6CisgICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKKyAgICAgIGVycm9yIHw9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfU0NFLCBpKyspOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYworVFJBTlNQT1JUREVDX0VSUk9SIEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKAorICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgorICAgICAgICApCit7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgQ1NFbGRTcGVjaWZpY0NvbmZpZyAqZXNjID0gJmFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnOworICBBU0NfRUxEX0VYVF9UWVBFIGVsZEV4dFR5cGU7CisgIGludCBlbGRFeHRMZW4sIGxlbiwgY250OworCisgIEZES21lbWNsZWFyKGVzYywgc2l6ZW9mKENTRWxkU3BlY2lmaWNDb25maWcpKTsKKworICBlc2MtPm1fZnJhbWVMZW5ndGhGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisgIGlmIChlc2MtPm1fZnJhbWVMZW5ndGhGbGFnKSB7CisgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSA9IDQ4MDsKKyAgfSBlbHNlIHsKKyAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lID0gNTEyOworICB9CisKKyAgYXNjLT5tX3ZjYjExRmxhZyA9IEZES3JlYWRCaXRzKGhCcywgMSApOworICBhc2MtPm1fcnZsY0ZsYWcgID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisgIGFzYy0+bV9oY3JGbGFnICAgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsKKworICBlc2MtPm1fc2JyUHJlc2VudEZsYWcgICAgID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisKKyAgaWYgKGVzYy0+bV9zYnJQcmVzZW50RmxhZyA9PSAxKSB7CisgICAgZXNjLT5tX3NiclNhbXBsaW5nUmF0ZSAgICA9IEZES3JlYWRCaXRzKGhCcywgMSApOyAvKiAwOiBzaW5nbGUgcmF0ZSwgMTogZHVhbCByYXRlICovCisgICAgZXNjLT5tX3NickNyY0ZsYWcgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgMSApOworCisgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5IDw8IGVzYy0+bV9zYnJTYW1wbGluZ1JhdGU7CisKKyAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpeworICAgICAgaWYgKCAwICE9IGxkX3Nicl9oZWFkZXIoYXNjLCBoQnMsIGNiKSApIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZXNjLT5tX3VzZUxkUW1mVGltZUFsaWduID0gMDsKKworICAvKiBuZXcgRUxEIHN5bnRheCAqLworICAvKiBwYXJzZSBFeHRUeXBlQ29uZmlnRGF0YSAqLworICB3aGlsZSAoKGVsZEV4dFR5cGUgPSAoQVNDX0VMRF9FWFRfVFlQRSlGREtyZWFkQml0cyhoQnMsIDQgKSkgIT0gRUxERVhUX1RFUk0pIHsKKyAgICBlbGRFeHRMZW4gPSBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDQgKTsKKyAgICBpZiAoIGxlbiA9PSAweGYgKSB7CisgICAgICBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDggKTsKKyAgICAgIGVsZEV4dExlbiArPSBsZW47CisKKyAgICAgIGlmICggbGVuID09IDB4ZmYgKSB7CisgICAgICAgIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgMTYgKTsKKyAgICAgICAgZWxkRXh0TGVuICs9IGxlbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGVsZEV4dFR5cGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZvcihjbnQ9MDsgY250PGxlbjsgY250KyspIHsKKyAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDggKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIC8qIGFkZCBmdXR1cmUgZWxkIGV4dGVuc2lvbiBjb25maWdzIGhlcmUgKi8KKyAgICB9CisgIH0KK2JhaWw6CisgIHJldHVybiAoRXJyb3JTdGF0dXMpOworfQorI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KKworCitzdGF0aWMKK1RSQU5TUE9SVERFQ19FUlJPUiBBdWRpb1NwZWNpZmljQ29uZmlnX0V4dGVuc2lvblBhcnNlKENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENTVHBDYWxsQmFja3MgKmNiKQoreworICBUUF9BU0NfRVhURU5TSU9OX0lEICBsYXN0QXNjRXh0LCBhc2NFeHRJZCA9IEFTQ0VYVF9VTktPV047CisgIElOVCAgYml0c0F2YWlsYWJsZSA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKworICB3aGlsZSAoYml0c0F2YWlsYWJsZSA+PSAxMSkKKyAgeworICAgIGxhc3RBc2NFeHQgPSBhc2NFeHRJZDsKKyAgICBhc2NFeHRJZCAgID0gKFRQX0FTQ19FWFRFTlNJT05fSUQpRkRLcmVhZEJpdHMoYnMsIDExKTsKKyAgICBiaXRzQXZhaWxhYmxlIC09IDExOworCisgICAgc3dpdGNoIChhc2NFeHRJZCkgeworICAgIGNhc2UgQVNDRVhUX1NCUjogICAgLyogMHgyYjcgKi8KKyAgICAgIGlmICggKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlICE9IEFPVF9TQlIpICYmIChiaXRzQXZhaWxhYmxlID49IDUpICkgeworICAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IGdldEFPVChicyk7CisKKyAgICAgICAgaWYgKCAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX1NCUikKKyAgICAgICAgICB8fCAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpICkKKyAgICAgICAgeyAvKiBHZXQgU0JSIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE7CisKKyAgICAgICAgICBpZiAoIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPT0gMSApIHsKKyAgICAgICAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPSBnZXRTYW1wbGVSYXRlKGJzLCAmc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA0KTsKKworICAgICAgICAgICAgaWYgKChJTlQpc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA8PSAwKSB7CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICggc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMgKSB7CisgICAgICAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDQpOworICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSA0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBVcGRhdGUgY291bnRlciBiZWNhdXNlIG9mIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgKEFPVCBhbmQgc2FtcGxpbmcgcmF0ZSkgKi8KKyAgICAgICAgYml0c0F2YWlsYWJsZSA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVNDRVhUX1BTOiAgICAgLyogMHg1NDggKi8KKyAgICAgIGlmICggKGxhc3RBc2NFeHQgPT0gQVNDRVhUX1NCUikKKyAgICAgICAgJiYgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpCisgICAgICAgICYmIChiaXRzQXZhaWxhYmxlID4gMCkgKQorICAgICAgeyAvKiBHZXQgUFMgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogSnVzdCBpZ25vcmUgYW55dGhpbmcuICovCisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7Cit9CisKKy8qCisgKiBBUEkgRnVuY3Rpb25zCisgKi8KKwordm9pZCBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpCit7CisgIEZES21lbWNsZWFyKGFzYywgc2l6ZW9mKENTQXVkaW9TcGVjaWZpY0NvbmZpZykpOworCisgIC8qIEluaXQgYWxsIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYmUgemVyby4gKi8KKyAgYXNjLT5tX2FvdCAgICAgICAgICAgICAgICAgICAgPSBBT1RfTk9ORTsKKyAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAweGY7CisgIGFzYy0+bV9lcENvbmZpZyAgICAgICAgICAgICAgID0gLTE7CisgIGFzYy0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgICAgICAgID0gQU9UX05VTExfT0JKRUNUOworI2lmZGVmIFRQX1BDRV9FTkFCTEUKKyAgQ1Byb2dyYW1Db25maWdfSW5pdCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCk7CisjZW5kaWYKK30KKworVFJBTlNQT1JUREVDX0VSUk9SIEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoCisgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBicywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUsCisgICAgICAgIENTVHBDYWxsQmFja3MgICAgICAqY2IKKyAgICAgICAgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisgIFVJTlQgYXNjU3RhcnRBbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYnMpOworICBpbnQgZnJhbWVMZW5ndGhGbGFnID0gLTE7CisKKyAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHNlbGYpOworCisgIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKKyAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOworICBpZiAoc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA8PSAwKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIHNlbGYtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBGREtyZWFkQml0cyhicyw0KTsKKworICAvKiBTQlIgZXh0ZW5zaW9uICggZXhwbGljaXQgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG1vZGUgKSAqLworICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMDsKKyAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnICA9IDA7CisKKyAgaWYgKCBzZWxmLT5tX2FvdCA9PSBBT1RfU0JSIHx8IHNlbGYtPm1fYW90ID09IEFPVF9QUyApIHsKKyAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9TQlI7CisKKyAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMTsKKyAgICBpZiAoIHNlbGYtPm1fYW90ID09IEFPVF9QUyApIHsKKyAgICAgIHNlbGYtPm1fcHNQcmVzZW50RmxhZyA9IDE7CisgICAgfQorCisgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOworICAgIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKKworICB9IGVsc2UgeworICAgIHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID0gQU9UX05VTExfT0JKRUNUOworICB9CisKKyAgLyogUGFyc2Ugd2hhdGV2ZXIgc3BlY2lmaWMgY29uZmlncyAqLworICBzd2l0Y2ggKHNlbGYtPm1fYW90KQorICB7CisjaWZkZWYgVFBfR0FfRU5BQkxFCisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBHYVNwZWNpZmljQ29uZmlnX1BhcnNlKCZzZWxmLT5tX3NjLm1fZ2FTcGVjaWZpY0NvbmZpZywgc2VsZiwgYnMsIGFzY1N0YXJ0QW5jaG9yKSkgIT0gVFJBTlNQT1JUREVDX09LICkgeworICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGZyYW1lTGVuZ3RoRmxhZyA9IHNlbGYtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLm1fZnJhbWVMZW5ndGhGbGFnOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCisgICAgY2FzZSBBT1RfTVBFR1M6CisgICAgICBpZiAoY2ItPmNiU3NjICE9IE5VTEwpIHsKKyAgICAgICAgY2ItPmNiU3NjKAorICAgICAgICAgICAgICAgIGNiLT5jYlNzY0RhdGEsCisgICAgICAgICAgICAgICAgYnMsCisgICAgICAgICAgICAgICAgc2VsZi0+bV9hb3QsCisgICAgICAgICAgICAgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIDAgIC8qIGRvbid0IGtub3cgdGhlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgICk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2lmZGVmIFRQX0VMRF9FTkFCTEUKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgaWYgKChFcnJvclN0YXR1cyA9IEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKHNlbGYsIGJzLCBjYikpICE9IFRSQU5TUE9SVERFQ19PSyApIHsKKyAgICAgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisgICAgICB9CisgICAgICBmcmFtZUxlbmd0aEZsYWcgPSBzZWxmLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9mcmFtZUxlbmd0aEZsYWc7CisgICAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gc2VsZi0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fc2JyUHJlc2VudEZsYWc7CisgICAgICBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gKHNlbGYtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3NiclNhbXBsaW5nUmF0ZSsxKSAqIHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3k7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEZyYW1lIGxlbmd0aCAqLworICBzd2l0Y2ggKHNlbGYtPm1fYW90KQorICB7CisjaWYgZGVmaW5lZChUUF9HQV9FTkFCTEUpIHx8IGRlZmluZWQoVFBfVVNBQ19FTkFCTEUpCisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICBjYXNlIEFPVF9FUl9CU0FDOgorICAgIC8qY2FzZSBBT1RfVVNBQzoqLworICAgICAgaWYgKCFmcmFtZUxlbmd0aEZsYWcpCisgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgIGVsc2UKKyAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KKyNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBpZiAoIWZyYW1lTGVuZ3RoRmxhZykKKyAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA1MTI7CisgICAgICBlbHNlCisgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gNDgwOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogZGVmaW5lZChUUF9HQV9FTkFCTEUpICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChzZWxmLT5tX2FvdCkKKyAgeworICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICBjYXNlIEFPVF9FUl9DRUxQOgorICAgIGNhc2UgQU9UX0VSX0hWWEM6CisgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICAgIHNlbGYtPm1fZXBDb25maWcgPSBGREtyZWFkQml0cyhicywyKTsKKworICAgICAgaWYgKHNlbGYtPm1fZXBDb25maWcgPiAxKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOyAvLyBFUENPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUpIHsKKyAgICBFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfRXh0ZW5zaW9uUGFyc2Uoc2VsZiwgYnMsIGNiKTsKKyAgfQorCisgIHJldHVybiAoRXJyb3JTdGF0dXMpOworfQorCisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxMGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwCkBAIC0wLDAgKzEsNDMzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBEYW5pZWwgSG9tbQorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRwZGVjX2xhdG0uaCIKKworCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisKKyNkZWZpbmUgVFBERUNfVFJBQ0tJTkRFWChwLGwpICgyKihwKSArIChsKSkKKworc3RhdGljCitVSU5UIENMYXRtRGVtdXhfR2V0VmFsdWUoSEFORExFX0ZES19CSVRTVFJFQU0gYnMpCit7CisgIFVDSEFSIGJ5dGVzRm9yVmFsdWUgPSAwLCB0bXAgPSAwOworICBpbnQgdmFsdWUgPSAwOworCisgIGJ5dGVzRm9yVmFsdWUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOworCisgIGZvciAoVUlOVCBpPTA7IGk8PWJ5dGVzRm9yVmFsdWU7IGkrKykgeworICAgIHZhbHVlIDw8PSA4OworICAgIHRtcCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgdmFsdWUgKz0gdG1wOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisKK3N0YXRpYworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZEF1ZGlvTXV4RWxlbWVudCgKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCisgICAgICAgIGludCBtX211eENvbmZpZ1ByZXNlbnQsCisgICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKKyAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICBpbnQgKnBmQ29uZmlnRm91bmQKKyAgICAgICAgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgaWYgKG1fbXV4Q29uZmlnUHJlc2VudCkgeworICAgIHBMYXRtRGVtdXgtPm1fdXNlU2FtZVN0cmVhbU11eCA9IEZES3JlYWRCaXRzKGJzLDEpOworCisgICAgaWYgKCFwTGF0bURlbXV4LT5tX3VzZVNhbWVTdHJlYW1NdXgpIHsKKyAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRTdHJlYW1NdXhDb25maWcoYnMsIHBMYXRtRGVtdXgsIHBUcERlY0NhbGxiYWNrcywgcEFzYywgcGZDb25maWdGb3VuZCkpKSB7CisgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIHRoZXJlIHdhcyBubyBjb25maWd1cmF0aW9uIHJlYWQsIGl0cyBub3QgcG9zc2libGUgdG8gcGFyc2UgUGF5bG9hZExlbmd0aEluZm8gYmVsb3cuICovCisgIGlmICghICpwZkNvbmZpZ0ZvdW5kKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICB9CisKKyAgaWYgKHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uQSA9PSAwKSB7CisgICAgLyogRG8gb25seSBvbmNlIHBlciBjYWxsLCBiZWNhdXNlIHBhcnNpbmcgYW5kIGRlY29kaW5nIGlzIGRvbmUgaW4tbGluZS4gKi8KKyAgICBpZiAoKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oYnMscExhdG1EZW11eCkpKSB7CisgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogYXVkaW9NdXhWZXJzaW9uQSA+IDAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisKKyAgcmV0dXJuIChFcnJvclN0YXR1cyk7Cit9CisKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWQoCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAorICAgICAgICBUUkFOU1BPUlRfVFlQRSB0dCwKKyAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAorICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgICAgIGludCAqcGZDb25maWdGb3VuZCwKKyAgICAgICAgY29uc3QgSU5UIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCisgICAgICAgICkKK3sKKyAgVUlOVCBjbnRCaXRzOworICBVSU5UIGNtcEJ1ZmZlckZ1bGxuZXNzOworICBVSU5UIGF1ZGlvTXV4TGVuZ3RoQnl0ZXNMYXN0ID0gMDsKKyAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOworCisgIGNudEJpdHMgPSBGREtnZXRWYWxpZEJpdHMoYnMpOworCisgIGlmICgoSU5UKWNudEJpdHMgPCBNSU5fTEFUTV9IRUFERVJMRU5HVEgpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKKyAgfQorCisgIGlmICgoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRBdWRpb011eEVsZW1lbnQoYnMsIHBMYXRtRGVtdXgsICh0dCAhPSBUVF9NUDRfTEFUTV9NQ1AwKSwgcFRwRGVjQ2FsbGJhY2tzLCBwQXNjLCBwZkNvbmZpZ0ZvdW5kKSkpCisgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisKKyAgaWYgKCFpZ25vcmVCdWZmZXJGdWxsbmVzcykKKyAgeworICAgIGNtcEJ1ZmZlckZ1bGxuZXNzID0gICAyNCthdWRpb011eExlbmd0aEJ5dGVzTGFzdCo4CisgICAgICAgICAgICAgICAgICAgICAgICArIHBMYXRtRGVtdXgtPm1fbGluZm9bMF1bMF0ubV9idWZmZXJGdWxsbmVzcyogcEFzY1tUUERFQ19UUkFDS0lOREVYKDAsMCldLm1fY2hhbm5lbENvbmZpZ3VyYXRpb24qMzI7CisKKyAgICAvKiBldmFsdWF0ZSBidWZmZXIgZnVsbG5lc3MgKi8KKworICAgIGlmIChwTGF0bURlbXV4LT5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MgIT0gMHhGRikKKyAgICB7CisgICAgICBpZiAoIXBMYXRtRGVtdXgtPkJ1ZmZlckZ1bGxuZXNzQWNoaWV2ZWQpCisgICAgICB7CisgICAgICAgIGlmIChjbnRCaXRzIDwgY21wQnVmZmVyRnVsbG5lc3MpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBjb25kaXRpb24gZm9yIHN0YXJ0IG9mIGRlY29kaW5nIGlzIG5vdCBmdWxmaWxsZWQgKi8KKworICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGZyYW1lIHdpbGwgbm90IGJlIGRlY29kZWQgKi8KKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwTGF0bURlbXV4LT5CdWZmZXJGdWxsbmVzc0FjaGlldmVkID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoRXJyb3JTdGF0dXMpOworfQorCisKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWRTdHJlYW1NdXhDb25maWcoCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAorICAgICAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsCisgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgaW50ICogcGZDb25maWdGb3VuZAorICAgICAgICApCit7CisgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9IE5VTEw7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKworICBwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9IEZES3JlYWRCaXRzKGJzLDEpOworCisgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAwKSB7CisgICAgcExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb25BID0gMDsKKyAgfSBlbHNlIHsKKyAgICBwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbkEgPSBGREtyZWFkQml0cyhicywxKTsKKyAgfQorCisgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbkEgPT0gMCkgeworICAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAxKSB7CisgICAgICBwTGF0bURlbXV4LT5tX3RhcmFCdWZmZXJGdWxsbmVzcyA9IENMYXRtRGVtdXhfR2V0VmFsdWUoYnMpOworICAgIH0KKyAgICBwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPSBGREtyZWFkQml0cyhicywxKTsKKyAgICBwTGF0bURlbXV4LT5tX25vU3ViRnJhbWVzID0gRkRLcmVhZEJpdHMoYnMsNikgKyAxOworICAgIHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSAgPSBGREtyZWFkQml0cyhicyw0KSArIDE7CisKKyAgICBpZiAocExhdG1EZW11eC0+bV9udW1Qcm9ncmFtID4gMSkgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgfQorCisgICAgaW50IGlkQ250ID0gMDsKKyAgICBmb3IgKFVJTlQgcHJvZyA9IDA7IHByb2cgPCBwTGF0bURlbXV4LT5tX251bVByb2dyYW07IHByb2crKykgeworICAgICAgcExhdG1EZW11eC0+bV9udW1MYXllciA9IEZES3JlYWRCaXRzKGJzLDMpICsgMTsKKyAgICAgIGlmIChwTGF0bURlbXV4LT5tX251bUxheWVyID4gMikgeworICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIH0KKworICAgICAgZm9yIChVSU5UIGxheSA9IDA7IGxheSA8IHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXI7IGxheSsrKSB7CisgICAgICAgIHBfbGluZm8gPSAmcExhdG1EZW11eC0+bV9saW5mb1twcm9nXVtsYXldOworCisgICAgICAgIHBfbGluZm8tPm1fc3RyZWFtSUQgPSBpZENudCsrOworICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzID0gMDsKKworICAgICAgICBpZiggKHByb2cgPT0gMCkgJiYgKGxheSA9PSAwKSApIHsKKyAgICAgICAgICBwTGF0bURlbXV4LT5tX3VzZVNhbWVDb25maWcgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBMYXRtRGVtdXgtPm1fdXNlU2FtZUNvbmZpZyA9IEZES3JlYWRCaXRzKGJzLDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBMYXRtRGVtdXgtPm1fdXNlU2FtZUNvbmZpZykgeworICAgICAgICAgIGlmIChsYXkgPiAxKSB7CisgICAgICAgICAgICBGREttZW1jcHkoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheSldLCAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5LTEpXSwgc2l6ZW9mKENTQXVkaW9TcGVjaWZpY0NvbmZpZykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPT0gMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBGREtfQklUU1RSRUFNIHRtcEJzOworICAgICAgICAgICAgVUlOVCBhc2NTdGFydFBvcywgYXNjTGVuPTA7CisKKyAgICAgICAgICAgIGFzY0xlbiA9IENMYXRtRGVtdXhfR2V0VmFsdWUoYnMpOworICAgICAgICAgICAgYXNjU3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoYnMpOworICAgICAgICAgICAgdG1wQnMgPSAqYnM7CisgICAgICAgICAgICBGREtzeW5jQ2FjaGUoJnRtcEJzKTsKKyAgICAgICAgICAgIHRtcEJzLmhCaXRCdWYuVmFsaWRCaXRzID0gYXNjTGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSZWFkIEFTQyAqLworICAgICAgICAgICAgaWYgKChFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheSldLCAmdG1wQnMsIDEsIHBUcERlY0NhbGxiYWNrcykpKSB7CisgICAgICAgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAxOworCisgICAgICAgICAgICAvKiBUaGUgZmllbGQgcF9saW5mby0+bV9hc2NMZW4gY291bGQgYmUgd3JvbmcsIHNvIGNoZWNrIGlmICovCisgICAgICAgICAgICBpZiAoIDAgPiAoSU5UKUZES2dldFZhbGlkQml0cygmdG1wQnMpKSB7CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREtwdXNoRm9yKGJzLCBhc2NMZW4pOyAvKiBwb3NpdGlvbiBiaXRzdHJlYW0gYWZ0ZXIgQVNDICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogUmVhZCBBU0MgKi8KKyAgICAgICAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSwgYnMsIDAsIHBUcERlY0NhbGxiYWNrcykpKSB7CisgICAgICAgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2JFcnJvcjsKKworICAgICAgICAgICAgY2JFcnJvciA9IHBUcERlY0NhbGxiYWNrcy0+Y2JVcGRhdGVDb25maWcocFRwRGVjQ2FsbGJhY2tzLT5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSk7CisgICAgICAgICAgICBpZiAoY2JFcnJvciAhPSAwKSB7CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhUeXBlID0gRkRLcmVhZEJpdHMoYnMsMyk7CisgICAgICAgIHN3aXRjaCggcF9saW5mby0+bV9mcmFtZUxlbmd0aFR5cGUgKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBwX2xpbmZvLT5tX2J1ZmZlckZ1bGxuZXNzID0gRkRLcmVhZEJpdHMoYnMsOCk7CisKKyAgICAgICAgICBpZiAoIXBMYXRtRGVtdXgtPm1fYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZykgeworICAgICAgICAgICAgaWYgKChsYXkgPiAwKSAmJiAocEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0ubV9hb3QgPT0gQU9UX0FBQ19TQ0FMIHx8IHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheSldLm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgLyogZnJhbWVMZW5ndGggPSBGREtyZWFkQml0cyhicyw5KTsgKi8KKyAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAvKiBDRUxQICovCisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgIC8qIEhWWEMgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvL19MQVRNX0lOVkFMSURGUkFNRUxFTkdUSFRZUEU7CisKKyAgICAgICAgfSAgLyogc3dpdGNoIGZyYW1lbGVuZ3RodHlwZSovCisKKyAgICAgIH0gIC8qIGxheWVyIGxvb3AgKi8KKyAgICB9ICAvKiBwcm9nIGxvb3AgKi8KKworICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLDEpOworICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoICA9IDA7CisKKyAgICBpZiAocExhdG1EZW11eC0+bV9vdGhlckRhdGFQcmVzZW50KSB7CisgICAgICBpbnQgb3RoZXJEYXRhTGVuRXNjICA9IDA7CisgICAgICBkbyB7CisgICAgICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoIDw8PSA4OyAgIC8vICo9IDI1NgorICAgICAgICBvdGhlckRhdGFMZW5Fc2MgPSBGREtyZWFkQml0cyhicywxKTsKKyAgICAgICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGggKz0gRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgICB9IHdoaWxlIChvdGhlckRhdGFMZW5Fc2MpOworICAgIH0KKworICAgIHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgcExhdG1EZW11eC0+bV9jcmNDaGVja1N1bSAgICAgPSAwOworCisgICAgaWYgKHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tQcmVzZW50KSB7CisgICAgICBwTGF0bURlbXV4LT5tX2NyY0NoZWNrU3VtID0gRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgfQorCisgIH0KKyAgZWxzZSB7CisgICAgLyogYXVkaW9NdXhWZXJzaW9uQSA+IDAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisgIHJldHVybiAoRXJyb3JTdGF0dXMpOworfQorCitUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENMYXRtRGVtdXggKnBMYXRtRGVtdXgpCit7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgaW50IHRvdGFsUGF5bG9hZEJpdHMgPSAwOworCisgIGlmKCBwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPT0gMSApIHsKKyAgICBmb3IgKFVJTlQgcHJvZz0wOyBwcm9nPHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbTsgcHJvZysrICkgeworICAgICAgZm9yIChVSU5UIGxheT0wOyBsYXk8cExhdG1EZW11eC0+bV9udW1MYXllcjsgbGF5KysgKSB7CisgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICZwTGF0bURlbXV4LT5tX2xpbmZvW3Byb2ddW2xheV07CisKKyAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSApIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHMgPSBDTGF0bURlbXV4X1JlYWRBdUNodW5rTGVuZ3RoSW5mbyhicyk7CisgICAgICAgICAgdG90YWxQYXlsb2FkQml0cyArPSBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7IC8vQUFDX0RFQ19MQVRNX0lOVkFMSURGUkFNRUxFTkdUSFRZUEU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7IC8vQUFDX0RFQ19MQVRNX1RJTUVGUkFNSU5HOworICB9CisgIGlmIChwTGF0bURlbXV4LT5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgPiAoVUlOVCkwICYmIHRvdGFsUGF5bG9hZEJpdHMgPiAoaW50KXBMYXRtRGVtdXgtPm1fYXVkaW9NdXhMZW5ndGhCeXRlcyo4KSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KKworaW50IENMYXRtRGVtdXhfUmVhZEF1Q2h1bmtMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKQoreworICBVQ0hBUiBlbmRGbGFnOworICBpbnQgbGVuID0gMDsKKworICBkbyB7CisgICAgVUNIQVIgdG1wID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw4KTsKKyAgICBlbmRGbGFnID0gKHRtcCA8IDI1NSk7CisKKyAgICBsZW4gKz0gdG1wOworCisgIH0gd2hpbGUoIGVuZEZsYWcgPT0gMCApOworCisgIGxlbiA8PD0gMzsgIC8qIGNvbnZlcnQgZnJvbSBieXRlcyB0byBiaXRzICovCisKKyAgcmV0dXJuIGxlbjsKK30KKworaW50IENMYXRtRGVtdXhfR2V0RnJhbWVMZW5ndGhJbkJpdHMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKK3sKKyAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fbGluZm9bMF1bMF0ubV9mcmFtZUxlbmd0aEluQml0czsKK30KKworaW50IENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhUHJlc2VudEZsYWcoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKK3sKKyAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhUHJlc2VudCA/IDEgOiAwOworfQorCitpbnQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKK3sKKyAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoOworfQorCitVSU5UIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KQoreworICByZXR1cm4gcExhdG1EZW11eC0+bV9ub1N1YkZyYW1lczsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzEzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmgKQEAgLTAsMCArMSwxNzYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIERhbmllbCBIb21tCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIExBVE1fREVNVVhfSAorI2RlZmluZSBMQVRNX0RFTVVYX0gKKworI2luY2x1ZGUgInRwZGVjX2xpYi5oIgorCisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKyNkZWZpbmUgTUlOX0xBVE1fSEVBREVSTEVOR1RIICA5CisjZGVmaW5lIE1JTl9MT0FTX0hFQURFUkxFTkdUSCAgTUlOX0xBVE1fSEVBREVSTEVOR1RIICsgMjQgICAvKiBib3RoIGluIGJpdHMgKi8KKyAjZGVmaW5lIE1JTl9UUF9CVUZfU0laRV9MT0FTICAgKCA4MTk0ICkKKworZW51bSB7CisgIExBVE1fTUFYX1BST0cgPSAxLAorICBMQVRNX01BWF9MQVlFUiA9IDIsCisgIExBVE1fTUFYX1ZBUl9DSFVOS1M9MTYsCisgIExBVE1fTUFYX0lEPTE2Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgbV9mcmFtZUxlbmd0aFR5cGU7CisgIFVJTlQgbV9idWZmZXJGdWxsbmVzczsKKyAgVUlOVCBtX3N0cmVhbUlEOworICBVSU5UIG1fZnJhbWVMZW5ndGhJbkJpdHM7Cit9IExBVE1fTEFZRVJfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBMQVRNX0xBWUVSX0lORk8gbV9saW5mb1tMQVRNX01BWF9QUk9HXVtMQVRNX01BWF9MQVlFUl07CisgIFVJTlQgbV90YXJhQnVmZmVyRnVsbG5lc3M7CisgIFVJTlQgbV9vdGhlckRhdGFMZW5ndGg7CisgIFVJTlQgbV9hdWRpb011eExlbmd0aEJ5dGVzOyAgICAgICAgICAvKiBMZW5ndGggb2YgTE9BUyBwYXlsb2FkICovCisKKyAgVUNIQVIgbV91c2VTYW1lU3RyZWFtTXV4OworICBVQ0hBUiBtX0F1ZGlvTXV4VmVyc2lvbjsKKyAgVUNIQVIgbV9BdWRpb011eFZlcnNpb25BOworICBVQ0hBUiBtX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmc7CisgIFVDSEFSIG1fbm9TdWJGcmFtZXM7CisgIFVDSEFSIG1fbnVtUHJvZ3JhbTsKKyAgVUNIQVIgbV9udW1MYXllcjsKKyAgVUNIQVIgbV91c2VTYW1lQ29uZmlnOworCisgIFVDSEFSIG1fb3RoZXJEYXRhUHJlc2VudDsKKyAgVUNIQVIgbV9jcmNDaGVja1ByZXNlbnQ7CisgIFVDSEFSIG1fY3JjQ2hlY2tTdW07CisKKyAgU0NIQVIgQnVmZmVyRnVsbG5lc3NBY2hpZXZlZDsKK30gQ0xhdG1EZW11eDsKKworaW50IENMYXRtRGVtdXhfUmVhZEF1Q2h1bmtMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKTsKKworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZCgKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCisgICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAorICAgICAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsCisgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgaW50ICpwZkNvbmZpZ0ZvdW5kLAorICAgICAgICBjb25zdCBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZCBTdHJlYW1NdXhDb25maWcKKyAqIFxwYXJhbSBicyBiaXQgc3RyZWFtIGhhbmRsZSBhcyBkYXRhIHNvdXJjZQorICogXHBhcmFtIHBMYXRtRGVtdXggcG9pbnRlciB0byBDTGF0bURlbXV4IHN0cnVjdCBvZiBjdXJyZW50IExBVE0gY29udGV4dAorICogXHBhcmFtIHBUcERlY0NhbGxiYWNrcyBDYWxsIGJhY2sgc3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uIGNhbGxiYWNrcworICogXHBhcmFtIHBBc2MgcG9pbnRlciB0byBhIEFTQyBmb3IgY29uZmlndXJhdGlvbiBzdG9yYWdlCisgKiBccGFyYW0gcGZDb25maWdGb3VuZCBwb2ludGVyIHRvIGEgZmxhZyB3aGljaCBpcyBzZXQgdG8gMSBpZiBhIGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kIGFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5CisgKiBccmV0dXJuIGVycm9yIGNvZGUKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZygKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCisgICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKKyAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICBpbnQgKiBwZkNvbmZpZ0ZvdW5kCisgICAgICAgICk7CisKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWRQYXlsb2FkTGVuZ3RoSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7CisKK2ludCAgQ0xhdG1EZW11eF9HZXRGcmFtZUxlbmd0aEluQml0cyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK2ludCAgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFQcmVzZW50RmxhZyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK2ludCAgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7CitVSU5UIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKKworCisjZW5kaWYgLyogTEFUTV9ERU1VWF9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDU2MTVkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcApAQCAtMCwwICsxLDEzMjggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBUcmFuc3BvcnQgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHBkZWNfbGliLmgiCisKKy8qIGxpYnJhcnkgdmVyc2lvbiAqLworI2luY2x1ZGUgInZlcnNpb24iCisKKworI2luY2x1ZGUgInRwX2RhdGEuaCIKKworI2luY2x1ZGUgInRwZGVjX2FkdHMuaCIKKworI2luY2x1ZGUgInRwZGVjX2FkaWYuaCIKKworI2luY2x1ZGUgInRwZGVjX2xhdG0uaCIKKworCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInRyYW5zcG9ydERlYyIKKwordHlwZWRlZiB1bmlvbiB7CisgIFNUUlVDVF9BRFRTIGFkdHM7CisKKyAgQ0FkaWZIZWFkZXIgYWRpZjsKKworICBDTGF0bURlbXV4IGxhdG07CisKKworfSB0cmFuc3BvcnRkZWNfcGFyc2VyX3Q7CisKK3N0cnVjdCBUUkFOU1BPUlRERUMKK3sKKyAgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10OyAgICAgLyohPCBNUEVHNCB0cmFuc3BvcnREZWMgdHlwZS4gKi8KKworICBDU1RwQ2FsbEJhY2tzIGNhbGxiYWNrczsgICAgICAgICAvKiE8IFN0cnVjdCBob2xkaW5nIGNhbGxiYWNrIGFuZCBpdHMgZGF0YSAqLworCisgIEZES19CSVRTVFJFQU0gYml0U3RyZWFtWzJdOyAvKiBCaXRzdHJlYW0gcmVhZGVyICovCisgIFVDSEFSICpic0J1ZmZlcjsgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIGJpdHN0cmVhbWQgZGF0YSBidWZmZXIgKHVuYWxsb2NhdGVkIGluIGNhc2Ugb2YgVFRfTVA0X1JBV1BBQ0tFVFMpICovCisKKyAgdHJhbnNwb3J0ZGVjX3BhcnNlcl90IHBhcnNlcjsgICAgLyogRm9ybWF0IHNwZWNpZmljIHBhcnNlciBzdHJ1Y3RzLiAqLworCisgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBhc2NbKDEqMildOyAvKiBBdWRpbyBzcGVjaWZpYyBjb25maWcgZnJvbSB0aGUgbGFzdCBjb25maWcgZm91bmQuICovCisgIFVJTlQgIGdsb2JhbEZyYW1lUG9zOyAgICAgICAgICAgIC8qIEdsb2JhbCB0cmFuc3BvcnQgZnJhbWUgcmVmZXJlbmNlIGJpdCBwb3NpdGlvbi4gKi8KKyAgVUlOVCAgYWNjZXNzVW5pdEFuY2hvclsyXTsgICAgLyogQ3VycmVudCBhY2Nlc3MgdW5pdCBzdGFydCBiaXQgcG9zaXRpb24uICovCisgIElOVCAgIGF1TGVuZ3RoWzJdOyAgICAgICAgICAgIC8qIExlbmd0aCBvZiBjdXJyZW50IGFjY2VzcyB1bml0LiAqLworICBJTlQgICBudW1iZXJPZlJhd0RhdGFCbG9ja3M7ICAgICAvKiBDdXJyZW50IG51bWJlciBvZiByYXcgZGF0YSBibG9ja3MgY29udGFpbmVkIHJlbWFpbmluZyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBmcmFtZS4gKi8KKyAgVUlOVCAgYXZnQml0UmF0ZTsgICAgICAgICAgICAgICAgLyogQXZlcmFnZSBiaXQgcmF0ZSB1c2VkIGZvciBmcmFtZSBsb3NzIGVzdGltYXRpb24uICovCisgIFVJTlQgIGxhc3RWYWxpZEJ1ZmZlckZ1bGxuZXNzOyAgIC8qIExhc3QgdmFsaWQgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlIGZvciBmcmFtZSBsb3NzIGVzdGltYXRpb24gKi8KKyAgSU5UICAgcmVtYWluZGVyOyAgICAgICAgICAgICAgICAgLyogUmVtaW5kZXIgaW4gZGl2aXNpb24gZHVyaW5nIGxvc3QgYWNjZXNzIHVuaXQgZXN0aW1hdGlvbi4gKi8KKyAgSU5UICAgbWlzc2luZ0FjY2Vzc1VuaXRzOyAgICAgICAgLyogRXN0aW1hdGVkIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiAqLworICBVSU5UICBidXJzdFBlcmlvZDsgICAgICAgICAgICAgICAvKiBEYXRhIGJ1cnN0IHBlcmlvZCBpbiBtaWxpIHNlY29uZHMuICovCisgIFVJTlQgIGhvbGRPZmZGcmFtZXM7ICAgICAgICAgICAgIC8qIEFtb3VudCBvZiBmcmFtZXMgdGhhdCB3ZXJlIGFscmVhZHkgaG9sZCBvZmYgZHVlIHRvIGJ1ZmZlciBmdWxsbmVzcyBjb25kaXRpb24gbm90IGJlaW5nIG1ldC4gKi8KKyAgVUlOVCAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyogRmxhZ3MuICovCit9OworCisvKiBGbGFnIGJpdG1hc2tzIGZvciAiZmxhZ3MiIG1lbWJlciBvZiBzdHJ1Y3QgVFJBTlNQT1JUREVDICovCisjZGVmaW5lIFRQREVDX1NZTkNPSyAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRQREVDX01JTklNSVpFX0RFTEFZICAgICAgICAyCisjZGVmaW5lIFRQREVDX0lHTk9SRV9CVUZGRVJGVUxMTkVTUyA0CisjZGVmaW5lIFRQREVDX0VBUkxZX0NPTkZJRyAgICAgICAgICA4CisjZGVmaW5lIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcgIDE2CisjZGVmaW5lIFRQREVDX0NPTkZJR19GT1VORCAgICAgICAgIDMyCisKK0NfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnREZWNvZGVyLCBUUkFOU1BPUlRERUMsIDEpCitDX0FMTE9DX01FTShSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlciwgVUNIQVIsIFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFKQorCisKKworCitIQU5ETEVfVFJBTlNQT1JUREVDIHRyYW5zcG9ydERlY19PcGVuKCBjb25zdCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIGNvbnN0IFVJTlQgZmxhZ3MpCit7CisgIEhBTkRMRV9UUkFOU1BPUlRERUMgaElucHV0OworCisgIGhJbnB1dCA9IEdldFJhbV9UcmFuc3BvcnREZWNvZGVyKDApOworICBpZiAoIGhJbnB1dCA9PSBOVUxMICkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogSW5pdCB0cmFuc3BvcnREZWMgc3RydWN0LiAqLworICBoSW5wdXQtPnRyYW5zcG9ydEZtdCA9IHRyYW5zcG9ydEZtdDsKKworICBzd2l0Y2ggKHRyYW5zcG9ydEZtdCkgeworCisgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICBpZiAoZmxhZ3MgJiBUUF9GTEFHX01QRUc0KQorICAgICAgaElucHV0LT5wYXJzZXIuYWR0cy5kZWNvZGVyQ2FuRG9NcGVnNCA9IDE7CisgICAgZWxzZQorICAgICAgaElucHV0LT5wYXJzZXIuYWR0cy5kZWNvZGVyQ2FuRG9NcGVnNCA9IDA7CisgICAgYWR0c1JlYWRfQ3JjSW5pdCgmaElucHV0LT5wYXJzZXIuYWR0cyk7CisgICAgaElucHV0LT5wYXJzZXIuYWR0cy5CdWZmZXJGdWxsbmVzU3RhcnRGbGFnID0gMTsKKyAgICBoSW5wdXQtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7CisgICAgYnJlYWs7CisKKworICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgY2FzZSBUVF9NUDRfUkFXOgorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyKCZoSW5wdXQpOworICAgIGhJbnB1dCA9IE5VTEw7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoaElucHV0ICE9IE5VTEwpIHsKKyAgICAvKiBDcmVhdGUgYml0c3RyZWFtICovCisgICAgaWYgKCBUVF9JU19QQUNLRVQodHJhbnNwb3J0Rm10KSApIHsKKyAgICAgIGhJbnB1dC0+YnNCdWZmZXIgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBoSW5wdXQtPmJzQnVmZmVyID0gR2V0UmFtX1RyYW5zcG9ydERlY29kZXJCdWZmZXIoMCk7CisgICAgICBpZiAoaElucHV0LT5ic0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgdHJhbnNwb3J0RGVjX0Nsb3NlKCAmaElucHV0ICk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBGREtpbml0Qml0U3RyZWFtKCZoSW5wdXQtPmJpdFN0cmVhbVswXSwgaElucHV0LT5ic0J1ZmZlciwgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUsIDAsIEJTX1JFQURFUik7CisgICAgfQorCisgICAgaElucHV0LT5idXJzdFBlcmlvZCA9IDA7CisgIH0KKworICByZXR1cm4gaElucHV0OworfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgVUNIQVIgKmNvbmYsIGNvbnN0IFVJTlQgbGVuZ3RoLCBVSU5UIGxheWVyICkKK3sKKyAgVFJBTlNQT1JUREVDX0VSUk9SICAgICBlcnIgICAgICAgID0gVFJBTlNQT1JUREVDX09LOworCisgIEZES19CSVRTVFJFQU0gYnM7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMgICAgICAgID0gJmJzOworCisgIEZES2luaXRCaXRTdHJlYW0oaEJzLCBjb25mLCAweDEwMDAwMDAwLCBsZW5ndGg8PDMsIEJTX1JFQURFUik7CisKKyAgaW50IGZDb25maWdGb3VuZCA9IDA7CisKKyAgLyogY29uZmlnIHRyYW5zcG9ydCBkZWNvZGVyICovCisgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgorICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgICB7CisgICAgICAgIGlmIChsYXllciAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4ID0gJmhUcC0+cGFyc2VyLmxhdG07CisgICAgICAgIGVyciA9IENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZyhoQnMsIHBMYXRtRGVtdXgsICZoVHAtPmNhbGxiYWNrcywgaFRwLT5hc2MsICZmQ29uZmlnRm91bmQpOworICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgZXJyID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgmaFRwLT5hc2NbbGF5ZXJdLCBoQnMsIDEsICZoVHAtPmNhbGxiYWNrcyk7CisgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdKTsKKyAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSyAmJiBmQ29uZmlnRm91bmQpIHsKKyAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0NPTkZJR19GT1VORDsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnID0gY2JVcGRhdGVDb25maWc7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTc2NDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU3NjX3QgY2JTc2MsIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiU3NjID0gY2JTc2M7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiU3NjRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiU2JyID0gY2JTYnI7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiU2JyRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoCisgICAgICAgIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgIGhUcCwKKyAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlciwKKyAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAqcEJ5dGVzVmFsaWQsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGxheWVyICkKK3sKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOworCisgIGlmICggKGhUcCA9PSBOVUxMKQorICAgIHx8IChsYXllciA+PSAyKSApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKKyAgaWYgKCpwQnl0ZXNWYWxpZCA9PSAwKSB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CisgIH0KKworICAvKiBzZXQgYml0YnVmZmVyIHNob3J0Y3V0ICovCisgIGhCcyA9ICZoVHAtPmJpdFN0cmVhbVtsYXllcl07CisKKyAgaWYgKCBUVF9JU19QQUNLRVQoaFRwLT50cmFuc3BvcnRGbXQpICkgeworICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwKSB7CisgICAgLyogRm9yIHBhY2tldCBiYXNlZCB0cmFuc3BvcnQsIHBhc3MgaW5wdXQgYnVmZmVyIHRvIGJpdGJ1ZmZlciB3aXRob3V0IGNvcHlpbmcgdGhlIGRhdGEuCisgICAgICAgVW5mb3J0dW5hdGVseSB3ZSBkbyBub3Qga25vdyB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBBbmQgdGhlIEZESyBiaXQgYnVmZmVyIGltcGxlbWVudGF0aW9uCisgICAgICAgbmVlZHMgYSBudW1iZXIgMl54LiBTbyB3ZSBhc3N1bWUgdGhlIG1heGltdW0gb2YgNDggY2hhbm5lbHMgd2l0aCA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwKKyAgICAgICBhbmQgcm91bmQgaXQgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMiA9PiA2NTUzNiBieXRlcyAqLworICAgIEZES2luaXRCaXRTdHJlYW0oaEJzLCBwQnVmZmVyLCAweDEwMDAwLCAoKnBCeXRlc1ZhbGlkKTw8MywgQlNfUkVBREVSKTsKKyAgICAqcEJ5dGVzVmFsaWQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiAuLi4gZWxzZSBmZWVkIGJpdGJ1ZmZlciB3aXRoIG5ldyBzdHJlYW0gZGF0YSAoYXBwZW5kKS4gKi8KKyAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkgeworICAgICAgRkRLZmVlZEJ1ZmZlciAoaEJzLCBwQnVmZmVyLCBidWZmZXJTaXplLCBwQnl0ZXNWYWxpZCkgOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7Cit9CisKK0hBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICkKK3sKKyAgcmV0dXJuICZoVHAtPmJpdFN0cmVhbVtsYXllcl07Cit9CisKK1RSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydERlY19HZXRGb3JtYXQoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICkKK3sKKyAgcmV0dXJuIGhUcC0+dHJhbnNwb3J0Rm10OworfQorCitJTlQgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApCit7CisgIElOVCBidWZmZXJGdWxsbmVzcyA9IC0xOworCisgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMuYWR0c19mdWxsbmVzcyAhPSAweDdmZikgeworICAgICAgICBidWZmZXJGdWxsbmVzcyA9IGhUcC0+cGFyc2VyLmFkdHMuYnMuZnJhbWVfbGVuZ3RoKjggKyBoVHAtPnBhcnNlci5hZHRzLmJzLmFkdHNfZnVsbG5lc3MgKiAzMiAqIGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoaFRwLT5wYXJzZXIuYWR0cy5icy5jaGFubmVsX2NvbmZpZyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBpZiAoaFRwLT5wYXJzZXIubGF0bS5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MgIT0gMHhmZikgeworICAgICAgICBidWZmZXJGdWxsbmVzcyA9IGhUcC0+cGFyc2VyLmxhdG0ubV9saW5mb1swXVswXS5tX2J1ZmZlckZ1bGxuZXNzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGJ1ZmZlckZ1bGxuZXNzOworfQorCisvKioKKyAqIFxicmllZiBhZGp1c3QgYml0IHN0cmVhbSBwb3NpdGlvbiBhbmQgdGhlIGVuZCBvZiBhbiBhY2Nlc3MgdW5pdC4KKyAqIFxwYXJhbSBoVHAgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgorICogXHJldHVybiBlcnJvciBjb2RlLgorICovCitzdGF0aWMKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKQoreworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bMF07CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICAgIGlmICggaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCApCisgICAgICB7CisgICAgICAgIC8qIERvIGJ5dGUgYWxpZ24gYXQgdGhlIGVuZCBvZiBBdWRpb011eEVsZW1lbnQuICovCisgICAgICAgIEZES2J5dGVBbGlnbihoQnMsIGhUcC0+Z2xvYmFsRnJhbWVQb3MpOworCisgICAgICAgIC8qIENoZWNrIGdsb2JhbCBmcmFtZSBsZW5ndGggKi8KKyAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MT0FTICYmIGhUcC0+cGFyc2VyLmxhdG0ubV9hdWRpb011eExlbmd0aEJ5dGVzID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGludCBsb2FzT2Zmc2V0OworCisgICAgICAgICAgbG9hc09mZnNldCA9IChoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyo4ICsgRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0gaFRwLT5nbG9iYWxGcmFtZVBvczsKKyAgICAgICAgICBpZiAobG9hc09mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIGxvYXNPZmZzZXQpOworICAgICAgICAgICAgLyogRm9yIEVMRCBhbmQgb3RoZXIgcGF5bG9hZHMgdGhlcmUgaXMgYW4gdW5rbm93biBhbW91bnQgb2YgcGFkZGluZywgc28gaWdub3JlIHVucmVhZCBiaXRzLCBidXQKKyAgICAgICAgICAgICAgIHRocm93IGFuIGVycm9yIG9ubHkgaWYgdG9vIG1hbnkgYml0cyB3aGVyZSByZWFkLiAqLworICAgICAgICAgICAgaWYgKGxvYXNPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApCisgICAgICB7CisgICAgICAgIGludCBvZmZzZXQ7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIG9mZnNldCB0byBlbmQgb2YgQVUgKi8KKyAgICAgICAgb2Zmc2V0ICA9IGhUcC0+cGFyc2VyLmFkdHMucmF3RGF0YUJsb2NrRGlzdFtoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzLWhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzXTw8MzsKKyAgICAgICAgLyogQ0FVVElPTjogVGhlIFBDRSAoaWYgYXZhaWxhYmxlKSBpcyBkZWNsYXJlZCB0byBiZSBhIHBhcnQgb2YgdGhlIGhlYWRlciEgKi8KKyAgICAgICAgb2Zmc2V0IC09IGhUcC0+YWNjZXNzVW5pdEFuY2hvclswXSAtIEZES2dldFZhbGlkQml0cyhoQnMpICsgMTYgKyBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9wY2VfYml0czsKKyAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCBvZmZzZXQpOworICAgICAgfQorICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgPiAwICYmIGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgeworICAgICAgICAvKiBOb3RlIHRoaXMgQ1JDIHJlYWQgY3VycmVudGx5IGhhcHBlbnMgdHdpY2UgYmVjYXVzZSBvZiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soKSAqLworICAgICAgICBoVHAtPnBhcnNlci5hZHRzLmNyY1JlYWRWYWx1ZSA9IEZES3JlYWRCaXRzKGhCcywgMTYpOworICAgICAgfQorICAgICAgaWYgKCBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwICkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgZ2xvYmFsIGZyYW1lIGxlbmd0aCAqLworICAgICAgICBpZiAoaFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IG9mZnNldDsKKworICAgICAgICAgIG9mZnNldCA9IChoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCo4IC0gQURUU19TWU5DTEVOR1RIICsgRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0gaFRwLT5nbG9iYWxGcmFtZVBvczsKKyAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgb2Zmc2V0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIFxicmllZiBEZXRlcm1pbmUgYWRkaXRpb25hbCBidWZmZXIgZnVsbG5lc3MgY29udHJhaW50IGR1ZSB0byBidXJzdCBkYXRhIHJlY2VwdGlvbi4KKyAqICAgICAgICBUaGUgcGFyYW1ldGVyIFRQREVDX1BBUkFNX0JVUlNUUEVSSU9EIG11c3QgaGF2ZSBiZWVuIHNldCBhcyBhIHByZWNvbmRpdGlvbi4KKyAqIFxwYXJhbSBoVHAgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGJ1ZmZlckZ1bGxuZXNzIHRoZSBidWZmZXIgZnVsbG5lc3MgdmFsdWUgb2YgdGhlIGZpcnN0IGZyYW1lIHRvIGJlIGRlY29kZWQuCisgKiBccGFyYW0gYml0c0F2YWlsIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIGJpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgZnJhbWUgdG8gYmUgZGVjb2RlZC4KKyAqIFxyZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgCitUUkFOU1BPUlRERUNfRVJST1IgYWRkaXRpb25hbEhvbGRPZmZOZWVkZWQoCisgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGJpdHNBdmFpbAorICAgICAgICApCit7CisgIElOVCBjaGVja0xlbmd0aEJpdHMsIGF2Z0JpdHNQZXJGcmFtZTsKKyAgSU5UIG1heEFVOyAvKiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcGVyIE1hc3RlciBGcmFtZSAqLworICBJTlQgc2FtcGxlc1BlckZyYW1lID0gaFRwLT5hc2MtPm1fc2FtcGxlc1BlckZyYW1lOworICBJTlQgc2FtcGxpbmdGcmVxdWVuY3kgPSAoSU5UKWhUcC0+YXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5OworCisgIGlmICggKGhUcC0+YXZnQml0UmF0ZSA9PSAwKSB8fCAoaFRwLT5idXJzdFBlcmlvZCA9PSAwKSApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICB9CisgIGlmICggKHNhbXBsZXNQZXJGcmFtZSA9PSAwICkgfHwgKHNhbXBsaW5nRnJlcXVlbmN5ID09IDApICkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOworICB9CisKKyAgLyogT25lIE1hc3RlciBGcmFtZSBpcyBzZW50IGV2ZXJ5IGhUcC0+YnVyc3RQZXJpb2QgbXMgKi8KKyAgbWF4QVUgPSBoVHAtPmJ1cnN0UGVyaW9kICogc2FtcGxpbmdGcmVxdWVuY3kgKyAoc2FtcGxlc1BlckZyYW1lKjEwMDAgLSAxKTsKKyAgbWF4QVUgPSBtYXhBVSAvIChzYW1wbGVzUGVyRnJhbWUqMTAwMCk7CisgIC8qIFN1YnRyYWN0IG51bWJlciBvZiBmcmFtZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGhlbGQgb2ZmLiAqLworICBtYXhBVSAtPSBoVHAtPmhvbGRPZmZGcmFtZXM7CisKKyAgYXZnQml0c1BlckZyYW1lID0gaFRwLT5hdmdCaXRSYXRlICogc2FtcGxlc1BlckZyYW1lICsgKHNhbXBsaW5nRnJlcXVlbmN5LTEpOworICBhdmdCaXRzUGVyRnJhbWUgPSBhdmdCaXRzUGVyRnJhbWUgLyBzYW1wbGluZ0ZyZXF1ZW5jeTsKKworICAvKiBDb25zaWRlciB3b3JzdCBjYXNlIG9mIGJ1ZmZlckZ1bGxuZXNzIHF1YW50aXphdGlvbi4gKi8KKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBidWZmZXJGdWxsbmVzcyArPSAzMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGNoZWNrTGVuZ3RoQml0cyA9IGJ1ZmZlckZ1bGxuZXNzICsgKG1heEFVLTEpKmF2Z0JpdHNQZXJGcmFtZTsKKworICAvKiBDaGVjayBpZiBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBmdWxsZmlsbCBidWZmZXIgZnVsbG5lc3MgY29uZGl0aW9uICovCisgIGlmICggKGNoZWNrTGVuZ3RoQml0cyAvKitoZWFkZXJCaXRzKi8pID4gKChUUkFOU1BPUlRERUNfSU5CVUZfU0laRTw8MyktNykgKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICB9CisKKyAgaWYgKCBiaXRzQXZhaWwgPCBjaGVja0xlbmd0aEJpdHMgKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgfQorfQorCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19yZWFkSGVhZGVyKAorICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBpbnQgc3luY0xlbmd0aCwKKyAgICAgICAgaW50IGlnbm9yZUJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICBpbnQgKnBSYXdEYXRhQmxvY2tMZW5ndGgsCisgICAgICAgIGludCAqcGZUcmF2ZXJzZU1vcmVGcmFtZXMsCisgICAgICAgIGludCAqcFN5bmNMYXllckZyYW1lQml0cywKKyAgICAgICAgaW50ICpwZkNvbmZpZ0ZvdW5kLAorICAgICAgICBpbnQgKnBIZWFkZXJCaXRzCisgICAgICAgICkKK3sKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKKyAgaW50IHJhd0RhdGFCbG9ja0xlbmd0aCA9ICpwUmF3RGF0YUJsb2NrTGVuZ3RoOworICBpbnQgZlRyYXZlcnNlTW9yZUZyYW1lcyA9IChwZlRyYXZlcnNlTW9yZUZyYW1lcyAhPSBOVUxMKSA/ICpwZlRyYXZlcnNlTW9yZUZyYW1lcyA6IDA7CisgIGludCBzeW5jTGF5ZXJGcmFtZUJpdHMgPSAocFN5bmNMYXllckZyYW1lQml0cyAhPSBOVUxMKSA/ICpwU3luY0xheWVyRnJhbWVCaXRzIDogMDsKKyAgaW50IGZDb25maWdGb3VuZCA9IChwZkNvbmZpZ0ZvdW5kICE9IE5VTEwpID8gKnBmQ29uZmlnRm91bmQgOiAwOworICBpbnQgc3RhcnRQb3M7CisKKyAgc3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA8PSAwKQorICAgICAgeworICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICBoVHAtPmdsb2JhbEZyYW1lUG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgICAgICAgLyogUGFyc2UgQURUUyBoZWFkZXIgKi8KKyAgICAgICAgZXJyID0gYWR0c1JlYWRfRGVjb2RlSGVhZGVyKCAmaFRwLT5wYXJzZXIuYWR0cywgJmhUcC0+YXNjWzBdLCBoQnMsIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzICk7CisgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnKGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjWzBdKTsKKyAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZXJyQyA9PSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUKSB7CisgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzKzE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogUmVzZXQgQ1JDIGJlY2F1c2UgdGhlIG5leHQgYml0cyBhcmUgdGhlIGJlZ2lubmluZyBvZiBhIHJhd19kYXRhX2Jsb2NrKCkgKi8KKyAgICAgICAgRkRLY3JjUmVzZXQoJmhUcC0+cGFyc2VyLmFkdHMuY3JjSW5mbyk7CisgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3BjZV9iaXRzID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzLS07CisgICAgICAgIHJhd0RhdGFCbG9ja0xlbmd0aCA9IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgmaFRwLT5wYXJzZXIuYWR0cywgKGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MtaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MpKTsKKyAgICAgICAgaWYgKHJhd0RhdGFCbG9ja0xlbmd0aCA8PSAwKSB7CisgICAgICAgICAgLyogTm8gZnVydGhlciBmcmFtZSB0cmF2ZXJzYWwgcG9zc2libGUuICovCisgICAgICAgICAgZlRyYXZlcnNlTW9yZUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzID0gKGhUcC0+cGFyc2VyLmFkdHMuYnMuZnJhbWVfbGVuZ3RoPDwzKSAtIChzdGFydFBvcyAtIEZES2dldFZhbGlkQml0cyhoQnMpKSAtIHN5bmNMZW5ndGg7CisgICAgICAgIGlmIChzeW5jTGF5ZXJGcmFtZUJpdHMgPD0gMCkgeworICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzIDw9IDApCisgICAgICB7CisgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA9IEZES3JlYWRCaXRzKGhCcywgMTMpOworICAgICAgICBoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyA9IHN5bmNMYXllckZyYW1lQml0czsKKyAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzIDw8PSAzOworICAgICAgfQorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkKKyAgICAgIHsKKyAgICAgICAgaFRwLT5nbG9iYWxGcmFtZVBvcyA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgICAgICAgIGVyciA9IENMYXRtRGVtdXhfUmVhZCgKKyAgICAgICAgICAgICAgICBoQnMsCisgICAgICAgICAgICAgICAmaFRwLT5wYXJzZXIubGF0bSwKKyAgICAgICAgICAgICAgICBoVHAtPnRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICZoVHAtPmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICBoVHAtPmFzYywKKyAgICAgICAgICAgICAgICZmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgaWdub3JlQnVmZmVyRnVsbG5lc3MpOworCisgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBDTGF0bURlbXV4X0dldE5yT2ZTdWJGcmFtZXMoJmhUcC0+cGFyc2VyLmxhdG0pOworICAgICAgICAgIGlmIChoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfTE9BUykgeworICAgICAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzIC09IHN0YXJ0UG9zIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSAoMTMpOyAgICAgICAgICAgIAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oaEJzLCAmaFRwLT5wYXJzZXIubGF0bSk7CisgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIHJhd0RhdGFCbG9ja0xlbmd0aCA9IENMYXRtRGVtdXhfR2V0RnJhbWVMZW5ndGhJbkJpdHMoJmhUcC0+cGFyc2VyLmxhdG0pOworICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2Nrcy0tOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKK2JhaWw6CisKKyAgKnBSYXdEYXRhQmxvY2tMZW5ndGggPSByYXdEYXRhQmxvY2tMZW5ndGg7CisKKyAgaWYgKHBIZWFkZXJCaXRzICE9IE5VTEwpIHsKKyAgICAqcEhlYWRlckJpdHMgKz0gc3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworICB9CisgIGlmIChwZkNvbmZpZ0ZvdW5kICE9IE5VTEwpIHsKKyAgICAqcGZDb25maWdGb3VuZCA9IGZDb25maWdGb3VuZDsKKyAgfQorCisgIGlmIChwZlRyYXZlcnNlTW9yZUZyYW1lcyAhPSBOVUxMKSB7CisgICAgKnBmVHJhdmVyc2VNb3JlRnJhbWVzID0gZlRyYXZlcnNlTW9yZUZyYW1lczsKKyAgfQorICBpZiAgKHBTeW5jTGF5ZXJGcmFtZUJpdHMgIT0gTlVMTCkgeworICAgICpwU3luY0xheWVyRnJhbWVCaXRzID0gc3luY0xheWVyRnJhbWVCaXRzOworICB9CisgIGlmIChwZkNvbmZpZ0ZvdW5kICE9IE5VTEwpIHsKKyAgICAqcGZDb25maWdGb3VuZCA9IGZDb25maWdGb3VuZDsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIEhvdyBtYW55IGJpdHMgdG8gYWR2YW5jZSBmb3Igc3luY2hyb25pemF0aW9uIHNlYXJjaC4gKi8KKyNkZWZpbmUgVFBERUNfU1lOQ1NLSVAgOAorCitzdGF0aWMKK1RSQU5TUE9SVERFQ19FUlJPUiBzeW5jaHJvbml6YXRpb24oCisgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnBIZWFkZXJCaXRzCisgICAgICAgICkKK3sKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSywgZXJyRmlyc3RGcmFtZSA9IFRSQU5TUE9SVERFQ19PSzsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmhUcC0+Yml0U3RyZWFtWzBdOworCisgIElOVCBzeW5jTGF5ZXJGcmFtZUJpdHMgPSAwOyAvKiBMZW5ndGggb2Ygc3luYyBsYXllciBmcmFtZSAoaS5lLiBMT0FTKSAqLworICBJTlQgcmF3RGF0YUJsb2NrTGVuZ3RoID0gMCwgcmF3RGF0YUJsb2NrTGVuZ3RoUHJldmlvdXM7CisgIElOVCB0b3RhbEJpdHM7CisgIElOVCBoZWFkZXJCaXRzID0gMCwgaGVhZGVyQml0c0ZpcnN0RnJhbWUgPSAwLCBoZWFkZXJCaXRzUHJldmlvdXM7CisgIElOVCBudW1GcmFtZXNUcmF2ZXJzZWQgPSAwLCBmVHJhdmVyc2VNb3JlRnJhbWVzLCBmQ29uZmlnRm91bmQgPSAoaFRwLT5mbGFncyAmIFRQREVDX0NPTkZJR19GT1VORCksIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IC0xOworICBJTlQgbnVtUmF3RGF0YUJsb2Nrc0ZpcnN0RnJhbWUgPSAwLCBudW1SYXdEYXRhQmxvY2tzUHJldmlvdXMsIGdsb2JhbEZyYW1lUG9zRmlyc3RGcmFtZSA9IDAsIHJhd0RhdGFCbG9ja0xlbmd0aEZpcnN0RnJhbWUgPSAwOworICBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MgPSBoVHAtPmZsYWdzICYgKFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkd8VFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTfFRQREVDX1NZTkNPSyk7CisKKyAgLyogU3luY2ggcGFyYW1ldGVycyAqLworICBJTlQgc3luY0xlbmd0aDsgICAgICAvKiBMZW5ndGggb2Ygc3luYyB3b3JkIGluIGJpdHMgKi8KKyAgVUlOVCBzeW5jV29yZDsgICAgICAgLyogU3luYyB3b3JkIHRvIGJlIGZvdW5kICovCisgIFVJTlQgc3luY01hc2s7ICAgICAgIC8qIE1hc2sgZm9yIHN5bmMgd29yZCAoZm9yIGFkZGluZyBvbmUgYml0LCBzbyBjb21wcmlzaW5nIG9uZSBiaXQgbGVzcykgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGNvbnRleHRGaXJzdEZyYW1lLCB0cmFuc3BvcnRkZWNfcGFyc2VyX3QsIDEpOworCisgIHRvdGFsQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgaWYgKHRvdGFsQml0cyA8PSAwKSB7CisgICAgZXJyID0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBmVHJhdmVyc2VNb3JlRnJhbWVzID0gKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTUlOSU1JWkVfREVMQVl8VFBERUNfRUFSTFlfQ09ORklHKSkgJiYgISAoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSyk7CisKKyAgLyogU2V0IHRyYW5zcG9ydCBzcGVjaWZpYyBzeW5jIHBhcmFtZXRlcnMgKi8KKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBzeW5jV29yZCA9IEFEVFNfU1lOQ1dPUkQ7CisgICAgICBzeW5jTGVuZ3RoID0gQURUU19TWU5DTEVOR1RIOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIHN5bmNXb3JkID0gMHgyQjc7CisgICAgICBzeW5jTGVuZ3RoID0gMTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3luY1dvcmQgPSAwOworICAgICAgc3luY0xlbmd0aCA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIHN5bmNNYXNrID0gKDE8PHN5bmNMZW5ndGgpLTE7CisKKyAgZG8geworICAgIElOVCBiaXRzQXZhaWwgPSAwOyAgICAgLyogQml0cyBhdmFpbGFibGUgaW4gYml0c3RyZWFtIGJ1ZmZlciAgICAqLworICAgIElOVCBjaGVja0xlbmd0aEJpdHM7ICAgLyogSGVscGVyIHRvIGNoZWNrIHJlbWFpbmluZyBiaXRzIGFuZCBidWZmZXIgYm91bmRhcmllcyAqLworICAgIFVJTlQgc3luY2g7ICAgICAgICAgICAgLyogQ3VycmVudCBzeW5jIHdvcmQgcmVhZCBmcm9tIGJpdHN0cmVhbSAqLworCisgICAgaGVhZGVyQml0c1ByZXZpb3VzID0gaGVhZGVyQml0czsKKworICAgIGJpdHNBdmFpbCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgeworICAgICAgLyogc2VhcmNoIHN5bmNod29yZCAqLworCisgICAgICBGREtfQVNTRVJUKCAoYml0c0F2YWlsICUgVFBERUNfU1lOQ1NLSVApID09IDApOworCisgICAgICBpZiAoKGJpdHNBdmFpbC1zeW5jTGVuZ3RoKSA8IFRQREVDX1NZTkNTS0lQKSB7CisgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CisgICAgICAgIGhlYWRlckJpdHMgPSAwOworICAgICAgfSBlbHNlIHsKKworICAgICAgICBzeW5jaCA9IEZES3JlYWRCaXRzKGhCcywgc3luY0xlbmd0aCk7CisKKyAgICAgICAgaWYgKCAhKGhUcC0+ZmxhZ3MgJiBUUERFQ19TWU5DT0spICkgeworICAgICAgICAgIGZvciAoOyAoYml0c0F2YWlsLXN5bmNMZW5ndGgpID49IFRQREVDX1NZTkNTS0lQOyBiaXRzQXZhaWwtPVRQREVDX1NZTkNTS0lQKSB7CisgICAgICAgICAgICBpZiAoc3luY2ggPT0gc3luY1dvcmQpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaCA9ICgoc3luY2ggPDwgVFBERUNfU1lOQ1NLSVApICYgc3luY01hc2spIHwgRkRLcmVhZEJpdHMoaEJzLCBUUERFQ19TWU5DU0tJUCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzeW5jaCAhPSBzeW5jV29yZCkgeworICAgICAgICAgIC8qIE5vIGNvcnJlY3Qgc3luY3dvcmQgZm91bmQuICovCisgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX09LOworICAgICAgICB9CisgICAgICAgIGhlYWRlckJpdHMgPSBzeW5jTGVuZ3RoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBoZWFkZXJCaXRzID0gMDsKKyAgICB9CisKKyAgICAvKiBTYXZlIHByZXZpb3VzIHJhdyBkYXRhIGJsb2NrIGRhdGEgKi8KKyAgICByYXdEYXRhQmxvY2tMZW5ndGhQcmV2aW91cyA9IHJhd0RhdGFCbG9ja0xlbmd0aDsKKyAgICBudW1SYXdEYXRhQmxvY2tzUHJldmlvdXMgPSBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrczsKKworICAgIC8qIFBhcnNlIHRyYW5zcG9ydCBoZWFkZXIgKHJhdyBkYXRhIGJsb2NrIGdyYW51bGFyaXR5KSAqLworCisgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0sgKQorICAgIHsKKyAgICAgIGVyciA9IHRyYW5zcG9ydERlY19yZWFkSGVhZGVyKAorICAgICAgICAgICAgICBoVHAsCisgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgc3luY0xlbmd0aCwKKyAgICAgICAgICAgICAgaWdub3JlQnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgJnJhd0RhdGFCbG9ja0xlbmd0aCwKKyAgICAgICAgICAgICAmZlRyYXZlcnNlTW9yZUZyYW1lcywKKyAgICAgICAgICAgICAmc3luY0xheWVyRnJhbWVCaXRzLAorICAgICAgICAgICAgICZmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgJmhlYWRlckJpdHMKKyAgICAgICAgICAgICAgKTsKKyAgICB9CisKKyAgICBiaXRzQXZhaWwgLT0gaGVhZGVyQml0czsKKworICAgIGNoZWNrTGVuZ3RoQml0cyAgPSBzeW5jTGF5ZXJGcmFtZUJpdHM7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgd2hvbGUgZnJhbWUgd291bGQgZml0IHRoZSBiaXRzdHJlYW0gYnVmZmVyICovCisgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgIGlmICggKGNoZWNrTGVuZ3RoQml0cytoZWFkZXJCaXRzKSA+ICgoVFJBTlNQT1JUREVDX0lOQlVGX1NJWkU8PDMpLTcpICkgeworICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgdHJhbnNwb3J0IGJpdCBidWZmZXIgaGFzIGJlZW4KKyAgICAgICAgICAgY2hvc2VuIHRvIG1lZXQgYWxsIHN5c3RlbSByZXF1aXJlbWVudHMsIHRodXMgdGhpcyBjb25kaXRpb24KKyAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhIHN5bmNocm9uaXNhdGlvbiBlcnJvci4gKi8KKyAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIGJpdHNBdmFpbCA8IGNoZWNrTGVuZ3RoQml0cyApIHsKKyAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKworICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpIHsKKyAgICAgIGludCBiaXRzOworCisgICAgICAvKiBFbmZvcmNlIHJlLXN5bmMgb2YgdHJhbnNwb3J0IGhlYWRlcnMuICovCisgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7CisKKyAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBiaXQgYW1vdW50IGxhbmRzIGF0IGEgbXVsdGlwbGUgb2YgVFBERUNfU1lOQ1NLSVAgKi8KKyAgICAgIGJpdHMgPSAoYml0c0F2YWlsICsgaGVhZGVyQml0cykgJSBUUERFQ19TWU5DU0tJUDsKKyAgICAgIC8qIFJld2luZCAtIFRQREVDX1NZTkNTS0lQLCBpbiBvcmRlciB0byBsb29rIGZvciBhIHN5bmNoIG9uZSBiaXQgYWhlYWQgbmV4dCB0aW1lLiAqLworICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAtKGhlYWRlckJpdHMgLSBUUERFQ19TWU5DU0tJUCkgKyBiaXRzKTsKKyAgICAgIGJpdHNBdmFpbCArPSBoZWFkZXJCaXRzIC0gVFBERUNfU1lOQ1NLSVAgLSBiaXRzOworICAgICAgaGVhZGVyQml0cyA9IDA7CisgICAgfQorCisgICAgLyogRnJhbWUgdHJhdmVyc2FsICovCisgICAgaWYgKCBmVHJhdmVyc2VNb3JlRnJhbWVzICkKKyAgICB7CisgICAgICAvKiBTYXZlIHBhcnNlciBjb250ZXh0IGZvciBlYXJseSBjb25maWcgZGlzY292ZXJ5ICJyZXdpbmQgYWxsIGZyYW1lcyIgKi8KKyAgICAgIGlmICggKGhUcC0+ZmxhZ3MgJiBUUERFQ19FQVJMWV9DT05GSUcpICYmICEoaFRwLT5mbGFncyAmIFRQREVDX01JTklNSVpFX0RFTEFZKSkKKyAgICAgIHsKKyAgICAgICAgLyogaWdub3JlIGJ1ZmZlciBmdWxsbmVzcyBpZiBqdXN0IHRyYXZlcnNpbmcgYWRkaXRpb25hbCBmcmFtZXMgZm9yIEVDRCAqLworICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcyA9IDE7CisKKyAgICAgICAgLyogU2F2ZSBjb250ZXh0IGluIG9yZGVyIHRvIHJldHVybiBsYXRlciAqLworICAgICAgICBpZiAoIGVyciA9PSBUUkFOU1BPUlRERUNfT0sgJiYgc3RhcnRQb3NGaXJzdEZyYW1lID09IC0xICkgeworICAgICAgICAgIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgICAgIG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lID0gaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3M7CisgICAgICAgICAgZ2xvYmFsRnJhbWVQb3NGaXJzdEZyYW1lID0gaFRwLT5nbG9iYWxGcmFtZVBvczsKKyAgICAgICAgICByYXdEYXRhQmxvY2tMZW5ndGhGaXJzdEZyYW1lID0gcmF3RGF0YUJsb2NrTGVuZ3RoOworICAgICAgICAgIGhlYWRlckJpdHNGaXJzdEZyYW1lID0gaGVhZGVyQml0czsKKyAgICAgICAgICBlcnJGaXJzdEZyYW1lID0gZXJyOworICAgICAgICAgIEZES21lbWNweShjb250ZXh0Rmlyc3RGcmFtZSwgJmhUcC0+cGFyc2VyLCBzaXplb2YodHJhbnNwb3J0ZGVjX3BhcnNlcl90KSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBCcmVhayB3aGVuIGNvbmZpZyB3YXMgZm91bmQgb3IgaXQgaXMgbm90IHBvc3NpYmxlIGFueW1vcmUgdG8gZmluZCBhIGNvbmZpZyAqLworICAgICAgICBpZiAoc3RhcnRQb3NGaXJzdEZyYW1lICE9IC0xICYmIChmQ29uZmlnRm91bmQgfHwgZXJyICE9IFRSQU5TUE9SVERFQ19PSykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbiBjYXNlIG9mIEVDRCBhbmQgc3luYyBlcnJvciwgZG8gbm90IHJld2luZCBhbnl3aGVyZS4gKi8KKyAgICAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IC0xOworICAgICAgICAgICAgZkNvbmZpZ0ZvdW5kID0gMDsKKyAgICAgICAgICAgIG51bUZyYW1lc1RyYXZlcnNlZCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCByYXdEYXRhQmxvY2tMZW5ndGgpOworICAgICAgICBiaXRzQXZhaWwgLT0gcmF3RGF0YUJsb2NrTGVuZ3RoOworICAgICAgICBudW1GcmFtZXNUcmF2ZXJzZWQrKzsKKyAgICAgICAgLyogSWdub3JlIGVycm9yIGhlcmUgaXRlbnRpb25hbGx5LiAqLworICAgICAgICB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KGhUcCk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlICggZlRyYXZlcnNlTW9yZUZyYW1lcyB8fCAoZXJyID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SICYmICEoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSykpKTsKKworICAvKiBSZXN0b3JlIGNvbnRleHQgaW4gY2FzZSBvZiBFQ0QgZnJhbWUgdHJhdmVyc2FsICovCisgIGlmICggc3RhcnRQb3NGaXJzdEZyYW1lICE9IC0xICYmIChmQ29uZmlnRm91bmQgfHwgZXJyICE9IFRSQU5TUE9SVERFQ19PSykgKSB7CisgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCBGREtnZXRWYWxpZEJpdHMoaEJzKSAtIHN0YXJ0UG9zRmlyc3RGcmFtZSk7CisgICAgRkRLbWVtY3B5KCZoVHAtPnBhcnNlciwgY29udGV4dEZpcnN0RnJhbWUsIHNpemVvZih0cmFuc3BvcnRkZWNfcGFyc2VyX3QpKTsKKyAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lOworICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSBnbG9iYWxGcmFtZVBvc0ZpcnN0RnJhbWU7CisgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gcmF3RGF0YUJsb2NrTGVuZ3RoRmlyc3RGcmFtZTsKKyAgICBoZWFkZXJCaXRzID0gaGVhZGVyQml0c0ZpcnN0RnJhbWU7CisgICAgZXJyID0gZXJyRmlyc3RGcmFtZTsKKyAgICBudW1GcmFtZXNUcmF2ZXJzZWQgPSAwOworICB9IAorCisgIC8qIEFkZGl0aW9uYWwgYnVyc3QgZGF0YSBtb2RlIGJ1ZmZlciBmdWxsbmVzcyBjaGVjay4gKi8KKyAgaWYgKCAhKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTE9TVF9GUkFNRVNfUEVORElOR3xUUERFQ19JR05PUkVfQlVGRkVSRlVMTE5FU1N8VFBERUNfU1lOQ09LKSkgJiYgZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgIGVyciA9IGFkZGl0aW9uYWxIb2xkT2ZmTmVlZGVkKGhUcCwgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGhUcCksIEZES2dldFZhbGlkQml0cyhoQnMpIC0gc3luY0xheWVyRnJhbWVCaXRzKTsKKyAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgIGhUcC0+aG9sZE9mZkZyYW1lcysrOworICAgIH0KKyAgfQorICAKKyAgLyogUmV3aW5kIGZvciByZXRyeSBiZWNhdXNlIG9mIG5vdCBlbm91Z2ggYml0cyAqLworICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICBGREtwdXNoQmFjayhoQnMsIGhlYWRlckJpdHMpOworICAgIGhlYWRlckJpdHMgPSAwOworICB9CisgIGVsc2UgeworICAgIC8qIHJlc2V0IGhvbGQgb2ZmIGZyYW1lIGNvdW50ZXIgKi8KKyAgICBoVHAtPmhvbGRPZmZGcmFtZXMgPSAwOworICB9CisKKyAgLyogUmV0dXJuIHRvIGxhc3QgZ29vZCBmcmFtZSBpbiBjYXNlIG9mIGZyYW1lIHRyYXZlcnNhbCBidXQgbm90IEVDRC4gKi8KKyAgaWYgKG51bUZyYW1lc1RyYXZlcnNlZCA+IDApIHsKKyAgICBGREtwdXNoQmFjayhoQnMsIHJhd0RhdGFCbG9ja0xlbmd0aFByZXZpb3VzKTsKKyAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBudW1SYXdEYXRhQmxvY2tzUHJldmlvdXM7CisgICAgICBoZWFkZXJCaXRzID0gaGVhZGVyQml0c1ByZXZpb3VzOworICAgIH0KKyAgICBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CisgIH0KKworYmFpbDoKKyAgaFRwLT5hdUxlbmd0aFswXSA9IHJhd0RhdGFCbG9ja0xlbmd0aDsKKworICAvKiBEZXRlY3QgcG9pbnRsZXNzIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMgZXJyb3IgY2FzZSwgd2VyZSB0aGUgYml0IGJ1ZmZlciBpcyBhbHJlYWR5IGZ1bGwsCisgICAgIG9yIG5vIG5ldyBidXJzdCBwYWNrZXQgZml0cy4gUmVjb3ZlciBieSBhZHZhbmNpbmcgdGhlIGJpdCBidWZmZXIuICovCisgIGlmICggKFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMgPT0gZXJyKSAmJiAgKEZES2dldFZhbGlkQml0cyhoQnMpID49ICgoVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUqOCAtICgoaFRwLT5hdmdCaXRSYXRlKmhUcC0+YnVyc3RQZXJpb2QpLzEwMDApKSAtIDcpKSApCisgIHsKKyAgICBGREtwdXNoRm9yKGhCcywgVFBERUNfU1lOQ1NLSVApOworICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICB9CisKKyAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBoVHAtPmZsYWdzIHw9IFRQREVDX1NZTkNPSzsKKyAgfQorCisgIGlmIChmQ29uZmlnRm91bmQpIHsKKyAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0NPTkZJR19GT1VORDsKKyAgfQorCisgIGlmIChwSGVhZGVyQml0cyAhPSBOVUxMKSB7CisgICAgKnBIZWFkZXJCaXRzID0gaGVhZGVyQml0czsKKyAgfQorCisgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpIHsKKyAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19TWU5DT0s7CisgIH0KKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGNvbnRleHRGaXJzdEZyYW1lLCB0cmFuc3BvcnRkZWNfcGFyc2VyX3QsIDEpOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogXGJyaWVmIFN5bmNocm9uaXplIHRvIHN0cmVhbSBhbmQgZXN0aW1hdGUgdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cyBkdWUKKyAqICAgICAgICB0byBhIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGVycm9yIGluIGNhc2Ugb2YgY29uc3RhbnQgYXZlcmFnZSBiaXQgcmF0ZS4KKyAqLworc3RhdGljCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX3JlYWRTdHJlYW0gKCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCit7CisKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVycm9yID0gVFJBTlNQT1JUREVDX09LOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdOworICBJTlQgbkFVID0gLTE7CisgIElOVCBoZWFkZXJCaXRzOworICBJTlQgYml0RGlzdGFuY2UsIGJmRGVsdGE7CisKKyAgLyogT2J0YWluIGRpc3RhbmNlIHRvIG5leHQgc3luY2ggd29yZCAqLworICBiaXREaXN0YW5jZSA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICBlcnJvciA9IHN5bmNocm9uaXphdGlvbihoVHAsICZoZWFkZXJCaXRzKTsKKyAgYml0RGlzdGFuY2UgLT0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKworICBGREtfQVNTRVJUKGJpdERpc3RhbmNlID49IDApOworCisgIGlmIChlcnJvciA9PSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiB8fCAoaFRwLT5mbGFncyAmIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcpKQorICB7CisgICAgLyogQ2hlY2sgaWYgZXN0aW1hdGluZyBsb3N0IGFjY2VzcyB1bml0cyBpcyBmZWFzaWJsZS4gKi8KKyAgICBpZiAoaFRwLT5hdmdCaXRSYXRlID4gMCAmJiBoVHAtPmFzY1swXS5tX3NhbXBsZXNQZXJGcmFtZSA+IDAgJiYgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSA+IDApCisgICAgeworICAgICAgaWYgKGVycm9yID09IFRSQU5TUE9SVERFQ19PSykKKyAgICAgIHsKKyAgICAgICAgaW50IGFqOworCisgICAgICAgIGFqID0gdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGhUcCk7CisgICAgICAgIGlmIChhaiA+IDApIHsKKyAgICAgICAgICBiZkRlbHRhID0gYWo7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYmZEZWx0YSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogc3luYyB3YXMgb2s6IGxhc3Qgb2YgYSBzZXJpZXMgb2YgYmFkIGFjY2VzcyB1bml0cy4gKi8KKyAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfTE9TVF9GUkFNRVNfUEVORElORzsKKyAgICAgICAgLyogQWRkIHVwIGJpdERpc3RhbmNlIHVudGlsIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gTGF0ZXIgd2Ugc3Vic3RyYWN0CisgICAgICAgICAgIHRoaXMgZnJhbWUgZnJvbSB0aGUgZ3JhbmQgdG90YWwsIHNpbmNlIHRoaXMgY3VycmVudCBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkCisgICAgICAgICAgIGZyYW1lIHNob3VsZCBub3QgYmUgc2tpcHBlZCBvZiBjb3Vyc2U7IGJ1dCBpdCBtdXN0IGJlIGFjY291bnRlZCBpbnRvIHRoZQorICAgICAgICAgICBidWZmZXJmdWxuZXNzIG1hdGguICovCisgICAgICAgIGJpdERpc3RhbmNlICs9IGhUcC0+YXVMZW5ndGhbMF07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoICEoaFRwLT5mbGFncyAmIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcpICkgeworICAgICAgICAgIC8qIHN5bmMgbm90IG9rOiBvbmUgb2YgbWFueSBiYWQgYWNjZXNzIHVuaXRzLiAqLworICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfTE9TVF9GUkFNRVNfUEVORElORzsKKyAgICAgICAgICBiZkRlbHRhID0gLSAoSU5UKWhUcC0+bGFzdFZhbGlkQnVmZmVyRnVsbG5lc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYmZEZWx0YSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBpbnQgbnVtLCBkZW5vbTsKKworICAgICAgICAvKiBPYnRhaW4gZXN0aW1hdGUgb2YgbnVtYmVyIG9mIGxvc3QgZnJhbWVzICovCisgICAgICAgIG51bSA9IGhUcC0+YXNjWzBdLm1fc2FtcGxpbmdGcmVxdWVuY3kgKiAoYmZEZWx0YSArIGJpdERpc3RhbmNlKSArIGhUcC0+cmVtYWluZGVyOworICAgICAgICBkZW5vbSA9IGhUcC0+YXZnQml0UmF0ZSAqIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lOworICAgICAgICBpZiAobnVtID4gMCkgeworICAgICAgICAgIG5BVSA9IG51bSAvIGRlbm9tOworICAgICAgICAgIGhUcC0+cmVtYWluZGVyID0gbnVtICUgZGVub207CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaFRwLT5yZW1haW5kZXIgPSBudW07CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IgPT0gVFJBTlNQT1JUREVDX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRmluYWwgYWRqdXN0bWVudCBvZiByZW1haW5kZXIsIHRha2VuIC0xIGludG8gYWNjb3VudCBiZWNhdXNlIGN1cnJlbnQKKyAgICAgICAgICAgICBmcmFtZSBzaG91bGQgbm90IGJlIHNraXBwZWQsIHRodXMgc3Vic3RyYWN0IC0xIG9yIGRvIG5vdGhpbmcgaW5zdGVhZAorICAgICAgICAgICAgIG9mICsxLTEgYWNjb3JkaW5nbHkuICovCisgICAgICAgICAgaWYgKCAoZGVub20gLSBoVHAtPnJlbWFpbmRlcikgPj0gaFRwLT5yZW1haW5kZXIgKSB7CisgICAgICAgICAgICBuQVUtLTsKKyAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICBpZiAobkFVIDwgMCkgeworICAgICAgICAgICAgLyogVGhlcmUgd2FzIG9uZSBmcmFtZSB0b28gbXVjaCBjb25jZWFsZWQsIHNvIHVuZm9ydHVuYXRlbHkgd2Ugd2lsbCBoYXZlIHRvIHNraXAgb25lIGdvb2QgZnJhbWUuICovCisgICAgICAgICAgICB0cmFuc3BvcnREZWNfRW5kQWNjZXNzVW5pdChoVHApOworICAgICAgICAgICAgZXJyb3IgPSBzeW5jaHJvbml6YXRpb24oaFRwLCAmaGVhZGVyQml0cyk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgbkFVID0gLTE7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIEZES3ByaW50ZigiRVJST1I6IEJ1ZmZlcmZ1bGxuZXNzIGFjY291bnRpbmcgZmFpbGVkLiByZW1haW5kZXI9JWQsIG5BVT0lZFxuIiwgaFRwLT5yZW1haW5kZXIsIG5BVSk7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgICAgaFRwLT5yZW1haW5kZXIgPSAwOworICAgICAgICAgIC8qIEVuZm9yY2UgbGFzdCBtaXNzZWQgZnJhbWVzIHRvIGJlIGNvbmNlYWxlZC4gKi8KKyAgICAgICAgICBpZiAobkFVID4gMCkgeworICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBoZWFkZXJCaXRzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBCZSBzdXJlIHRoYXQgbG9zdCBmcmFtZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiBUaGlzIGlzIG5lY2Vzc2FyeSBkdWUgdG8gc29tZQorICAgICBzeW5jIGVycm9yIHNlcXVlbmNlcyB3aGVyZSBsYXRlciBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEsIGJ1dAorICAgICB0aGUgYml0cyB1cHRvIHRoZSBzeW5jIHdvcmQgYXJlIGRpc2NhcmRlZCwgdGh1cyBjYXVzaW5nIGEgdmFsdWUgb2YgbkFVID4gMCAqLworICBpZiAobkFVID4gMCkgeworICAgIGVycm9yID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgIH0KKworICBoVHAtPm1pc3NpbmdBY2Nlc3NVbml0cyA9IG5BVTsKKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qIHJldHVybnMgZXJyb3IgY29kZSAqLworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdCggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CisKKyAgaWYgKCFoVHApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKKyAgaEJzID0gJmhUcC0+Yml0U3RyZWFtW2xheWVyXTsKKworICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8PSAwKSB7CisgICAgZXJyID0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKKyAgfQorCisgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKKworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgICAvKiBSZWFkIGhlYWRlciBpZiBub3QgYWxyZWFkeSBkb25lICovCisgICAgICBpZiAoIShoVHAtPmZsYWdzICYgVFBERUNfQ09ORklHX0ZPVU5EKSkKKyAgICAgIHsKKyAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBjZTsKKworICAgICAgICBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoJmhUcC0+YXNjWzBdKTsKKyAgICAgICAgcGNlID0gJmhUcC0+YXNjWzBdLm1fcHJvZ3JDb25maWdFbGVtZW50OworICAgICAgICBlcnIgPSBhZGlmUmVhZF9EZWNvZGVIZWFkZXIoJmhUcC0+cGFyc2VyLmFkaWYsIHBjZSwgaEJzKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICBnb3RvIGJhaWw7CisKKyAgICAgICAgLyogTWFwIGFkaWYgaGVhZGVyIHRvIEFTQyAqLworICAgICAgICBoVHAtPmFzY1swXS5tX2FvdCAgICAgICAgICAgICAgICAgICAgPSAoQVVESU9fT0JKRUNUX1RZUEUpKHBjZS0+UHJvZmlsZSArIDEpOworICAgICAgICBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBwY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7CisgICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxpbmdGcmVxdWVuY3kgICAgICA9IFNhbXBsaW5nUmF0ZVRhYmxlW3BjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleF07CisgICAgICAgIGhUcC0+YXNjWzBdLm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gICA9IDA7CisgICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lICAgICAgICA9IDEwMjQ7CisgICAgICAgIGhUcC0+YXZnQml0UmF0ZSAgICAgICAgICAgICAgICAgICAgICA9IGhUcC0+cGFyc2VyLmFkaWYuQml0UmF0ZTsKKworICAgICAgICAvKiBDYWxsIGNhbGxiYWNrIHRvIGRlY29kZXIuICovCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1swXSk7CisgICAgICAgICAgaWYgKGVyckMgPT0gMCkgeworICAgICAgICAgICAgaFRwLT5mbGFncyB8PSBUUERFQ19DT05GSUdfRk9VTkQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGhUcC0+YXVMZW5ndGhbbGF5ZXJdID0gLTE7IC8qIEFjY2VzcyBVbml0IGRhdGEgbGVuZ3RoIGlzIHVua25vd24uICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfTVA0X1JBVzoKKyAgICAgIC8qIE9uZSBBY2Nlc3MgVW5pdCB3YXMgZmlsbGVkIGludG8gYnVmZmVyLgorICAgICAgICAgU28gZ2V0IHRoZSBsZW5ndGggb3V0IG9mIHRoZSBidWZmZXIuICovCisgICAgICBoVHAtPmF1TGVuZ3RoW2xheWVyXSA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgaFRwLT5mbGFncyB8PSBUUERFQ19TWU5DT0s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICB7CisgICAgICAgIGludCBmQ29uZmlnRm91bmQgPSBoVHAtPmZsYWdzICYgVFBERUNfQ09ORklHX0ZPVU5EOworICAgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcihoVHAsIGhCcywgMCwgMSwgJmhUcC0+YXVMZW5ndGhbbGF5ZXJdLCBOVUxMLCBOVUxMLCAmZkNvbmZpZ0ZvdW5kLCBOVUxMKTsKKyAgICAgICAgaWYgKGZDb25maWdGb3VuZCkgeworICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfQ09ORklHX0ZPVU5EOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfUlNWRDUwOgorICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIGVyciA9IHRyYW5zcG9ydERlY19yZWFkU3RyZWFtKGhUcCwgbGF5ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBoVHAtPmFjY2Vzc1VuaXRBbmNob3JbbGF5ZXJdID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIH0gZWxzZSB7CisgICAgaFRwLT5hY2Nlc3NVbml0QW5jaG9yW2xheWVyXSA9IDA7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICkKK3sKKyAgSU5UIGJpdHM7CisKKyAgaWYgKGhUcC0+YWNjZXNzVW5pdEFuY2hvcltsYXllcl0gPiAwICYmIGhUcC0+YXVMZW5ndGhbbGF5ZXJdID4gMCkgeworICAgIGJpdHMgPSBoVHAtPmF1TGVuZ3RoW2xheWVyXSAtIChoVHAtPmFjY2Vzc1VuaXRBbmNob3JbbGF5ZXJdIC0gRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbVtsYXllcl0pKTsKKyAgfSBlbHNlIHsKKyAgICBiaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbVtsYXllcl0pOworICB9CisKKyAgcmV0dXJuIGJpdHM7Cit9CisKK0lOVCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzVG90YWwoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICkKK3sKKyAgcmV0dXJuIGhUcC0+YXVMZW5ndGhbbGF5ZXJdOworfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldE1pc3NpbmdBY2Nlc3NVbml0Q291bnQgKCBJTlQgKnBOQWNjZXNzVW5pdHMsIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICkKK3sKKyAgKnBOQWNjZXNzVW5pdHMgPSBoVHAtPm1pc3NpbmdBY2Nlc3NVbml0czsKKworICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworfQorCisvKiBJbmZvcm0gdGhlIHRyYW5zcG9ydERlYyBsYXllciB0aGF0IHJlYWRpbmcgb2YgYWNjZXNzIHVuaXQgaGFzIGZpbmlzaGVkLiAqLworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOworCisKKyAgZXJyID0gdHJhbnNwb3J0RGVjX0FkanVzdEVuZE9mQWNjZXNzVW5pdChoVHApOworCisgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1NldFBhcmFtICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFBERUNfUEFSQU0gICAgICAgIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVycm9yID0gVFJBTlNQT1JUREVDX09LOworCisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIFRQREVDX1BBUkFNX01JTklNSVpFX0RFTEFZOgorICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfTUlOSU1JWkVfREVMQVk7CisgICAgICB9IGVsc2UgeworICAgICAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19NSU5JTUlaRV9ERUxBWTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFBERUNfUEFSQU1fRUFSTFlfQ09ORklHOgorICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfRUFSTFlfQ09ORklHOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfRUFSTFlfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBUUERFQ19QQVJBTV9JR05PUkVfQlVGRkVSRlVMTE5FU1M6CisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgaFRwLT5mbGFncyB8PSBUUERFQ19JR05PUkVfQlVGRkVSRlVMTE5FU1M7CisgICAgICB9IGVsc2UgeworICAgICAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19JR05PUkVfQlVGRkVSRlVMTE5FU1M7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFOgorICAgICAgaFRwLT5hdmdCaXRSYXRlID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRQREVDX1BBUkFNX0JVUlNUX1BFUklPRDoKKyAgICAgIGhUcC0+YnVyc3RQZXJpb2QgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFBERUNfUEFSQU1fUkVTRVQ6CisgICAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaT0wOyBpPCgxKjIpOyBpKyspIHsKKyAgICAgICAgICBGREtyZXNldEJpdGJ1ZmZlcigmaFRwLT5iaXRTdHJlYW1baV0pOworICAgICAgICAgIGhUcC0+YXVMZW5ndGhbaV0gPSAwOworICAgICAgICAgIGhUcC0+YWNjZXNzVW5pdEFuY2hvcltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaFRwLT5mbGFncyAmPSB+KFRQREVDX1NZTkNPS3xUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HKTsKKyAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ICE9IFRUX01QNF9BRElGKSB7CisgICAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfQ09ORklHX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGhUcC0+cmVtYWluZGVyID0gMDsKKyAgICAgICAgaFRwLT5hdmdCaXRSYXRlID0gMDsKKyAgICAgICAgaFRwLT5taXNzaW5nQWNjZXNzVW5pdHMgPSAwOworICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7CisgICAgICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSAwOworICAgICAgICBoVHAtPmhvbGRPZmZGcmFtZXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK1VJTlQgdHJhbnNwb3J0RGVjX0dldE5yT2ZTdWJGcmFtZXMoSEFORExFX1RSQU5TUE9SVERFQyBoVHApCit7CisgIFVJTlQgblN1YkZyYW1lcyA9IDA7CisKKyAgaWYgKGhUcCA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGlmIChoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xBVE1fTUNQMSB8fCBoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xBVE1fTUNQMCB8fCBoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xPQVMpCisgICAgblN1YkZyYW1lcyA9IENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcygmaFRwLT5wYXJzZXIubGF0bSk7CisgIGVsc2UgaWYgKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfQURUUykKKyAgICBuU3ViRnJhbWVzID0gaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2NrczsKKworICByZXR1cm4gblN1YkZyYW1lczsKK30KKwordm9pZCB0cmFuc3BvcnREZWNfQ2xvc2UoSEFORExFX1RSQU5TUE9SVERFQyAqcGhUcCkKK3sKKyAgaWYgKHBoVHAgIT0gTlVMTCkKKyAgeworICAgIGlmICgqcGhUcCAhPSBOVUxMKSB7CisgICAgICBpZiAoICEgVFRfSVNfUEFDS0VUKCgqcGhUcCktPnRyYW5zcG9ydEZtdCkgKSB7CisgICAgICAgIEZyZWVSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlcigmKCpwaFRwKS0+YnNCdWZmZXIpOworICAgICAgfQorICAgICAgaWYgKCpwaFRwICE9IE5VTEwpIHsKKyAgICAgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyKHBoVHApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICB9CisKKyAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSByZXR1cm4gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgaW5mbyArPSBpOworCisgIGluZm8tPm1vZHVsZV9pZCAgPSBGREtfVFBERUM7CisjaWZkZWYgX19BTkRST0lEX18KKyAgaW5mby0+YnVpbGRfZGF0ZSA9ICIiOworICBpbmZvLT5idWlsZF90aW1lID0gIiI7CisjZWxzZQorICBpbmZvLT5idWlsZF9kYXRlID0gX19EQVRFX187CisgIGluZm8tPmJ1aWxkX3RpbWUgPSBfX1RJTUVfXzsKKyNlbmRpZgorICBpbmZvLT50aXRsZSAgICAgID0gVFBfTElCX1RJVExFOworICBpbmZvLT52ZXJzaW9uICAgID0gTElCX1ZFUlNJT04oVFBfTElCX1ZMMCwgVFBfTElCX1ZMMSwgVFBfTElCX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKKyAgaW5mby0+ZmxhZ3MgPSAwCisgICAgfCBDQVBGX0FESUYKKyAgICB8IENBUEZfQURUUworICAgIHwgQ0FQRl9MQVRNCisgICAgfCBDQVBGX0xPQVMKKyAgICB8IENBUEZfUkFXUEFDS0VUUworICAgIDsKKworICByZXR1cm4gVFJBTlNQT1JUREVDX09LOyAvKiBGREtFUlJfTk9FUlJPUjsgKi8KK30KKworCitpbnQgIHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwgSU5UIG1CaXRzKQoreworICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7CisgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgcmV0dXJuIGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIHRyYW5zcG9ydERlY19DcmNFbmRSZWcoSEFORExFX1RSQU5TUE9SVERFQyBwVHAsIElOVCByZWcpCit7CisgIHN3aXRjaCAocFRwLT50cmFuc3BvcnRGbXQpIHsKKyAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICBhZHRzUmVhZF9DcmNFbmRSZWcoJnBUcC0+cGFyc2VyLmFkdHMsICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0NyY0NoZWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwKQoreworICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7CisgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgaWYgKCAocFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2NrcyA+IDApICYmIChwVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApICkKKyAgICB7CisgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmcFRwLT5iaXRTdHJlYW1bMF07CisgICAgICAKKyAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQocFRwKTsKKyAgICB9CisgICAgcmV0dXJuIGFkdHNSZWFkX0NyY0NoZWNrKCZwVHAtPnBhcnNlci5hZHRzKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdlNWYwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgpAQCAtMCwwICsxLDEzIEBACisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBUUF9MSUJfVkwwIDIKKyNkZWZpbmUgVFBfTElCX1ZMMSAzCisjZGVmaW5lIFRQX0xJQl9WTDIgNAorI2RlZmluZSBUUF9MSUJfVElUTEUgIk1QRUcgVHJhbnNwb3J0IgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRW5jL2luY2x1ZGUvbXBlZ0ZpbGVXcml0ZS5oIGIvYWFjL2xpYk1wZWdUUEVuYy9pbmNsdWRlL21wZWdGaWxlV3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODg2YTBiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9pbmNsdWRlL21wZWdGaWxlV3JpdGUuaApAQCAtMCwwICsxLDE0MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IEJpdHN0cmVhbSBkYXRhIHByb3ZpZGVyIGZvciBNUDQgZGVjb2RlcnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKy8qITwgSWYgTVBGV1JJVEVfTVA0RkZfRU5BQkxFIGlzIHNldCwgaW5jbHVkZSBzdXBwb3J0IGZvciBNUEVHIElTTyBmaWxlZm9ybWF0LgorICAgICBJZiBub3Qgc2V0LCBubyAubXA0LCAubTRhIGFuZCAuM2dwIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBpbnB1dC4gICovCisvKiAjZGVmaW5lIE1QRldSSVRFX01QNEZGX0VOQUJMRSAqLworCit0eXBlZGVmIHN0cnVjdCBTVFJVQ1RfRklMRVdSSVRFICpIQU5ETEVfRklMRVdSSVRFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW4gYW4gTVBFRyBhdWRpbyBmaWxlLgorICogXHBhcmFtIG1wZWdGaWxlV3JpdGVfRmlsZW5hbWUgIFN0cmluZyBvZiB0aGUgZmlsZW5hbWUgdG8gYmUgb3BlbmVkLgorICogXHBhcmFtIGZpbGVGbXQgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCBmb3JtYXQgdG8gdXNlLgorICogXHBhcmFtIGNvbmYKKyAqIFxwYXJhbSBjb25mU2l6ZQorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcgZmlsZSB3cml0ZSBoYW5kbGUuCisgKi8KK0hBTkRMRV9GSUxFV1JJVEUgbXBlZ0ZpbGVXcml0ZV9PcGVuKCBjaGFyICAgICAgICAgICAqbXBlZ0ZpbGVXcml0ZV9GaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZPUk1BVCAgICAgZmlsZUZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgdHJhbnNwb3J0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgY29uZlNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgV3JpdGUgdG8gYW4gTVBFRyBhdWRpbyBmaWxlLgorICogXHBhcmFtIGluQnVmZmVyICAgIEJ1ZmZlciB0byB3cml0ZS4KKyAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGJ1ZmZlciB0byB3cml0ZSBpbiBieXRlcy4KKyAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2VzcywgLTEgb24gdW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQgb3Igd3JpdGUgZXJyb3IuCisgKi8KK2ludCBtcGVnRmlsZVdyaXRlX1dyaXRlKCBIQU5ETEVfRklMRVdSSVRFICBoRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgYnVmZmVyU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICBEZWFsbG9jYXRlIG1lbW9yeSBhbmQgY2xvc2UgZmlsZS4KKyAqIFxwYXJhbSBoRmlsZVdyaXRlICBNUEVHIGZpbGUgd3JpdGUgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgIDAgb24gc3VjZXNzLgorICovCitpbnQgbXBlZ0ZpbGVXcml0ZV9DbG9zZSggSEFORExFX0ZJTEVXUklURSAqaEZpbGVXcml0ZSApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBfZGF0YS5oIGIvYWFjL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU4OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwX2RhdGEuaApAQCAtMCwwICsxLDM1MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBkYXRhIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19UUF9EQVRBX0hfXworI2RlZmluZSBfX1RQX0RBVEFfSF9fCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKy8qCisgKiBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgVFBfR0FfRU5BQkxFCisvKiAjZGVmaW5lIFRQX0NFTFBfRU5BQkxFICovCisvKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCisvKiAjZGVmaW5lIFRQX1NMU19FTkFCTEUgKi8KKyNkZWZpbmUgVFBfRUxEX0VOQUJMRQorLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLworLyogI2RlZmluZSBUUF9SU1ZENTBfRU5BQkxFICovCisKKyNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQorI2RlZmluZSBUUF9QQ0VfRU5BQkxFICAgICAgIC8qKjwgRW5hYmxlIGZ1bGwgUENFIHN1cHBvcnQgKi8KKyNlbmRpZgorCisvKioKKyAqIFByb2dyYW1Db25maWcgc3RydWN0LgorICovCisvKiBJU08vSUVDIDE0NDk2LTMgNC40LjEuMSBUYWJsZSA0LjIgUHJvZ3JhbSBjb25maWcgZWxlbWVudCAqLworI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLworI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKKyNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCAgICA4CisjZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KKyNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIC8qIFBDRSBiaXRzdHJlYW0gZWxlbWVudHM6ICovCisgIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKKyAgVUNIQVIgUHJvZmlsZTsKKyAgVUNIQVIgU2FtcGxpbmdGcmVxdWVuY3lJbmRleDsKKyAgVUNIQVIgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bVNpZGVDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bUJhY2tDaGFubmVsRWxlbWVudHM7CisgIFVDSEFSIE51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgVUNIQVIgTnVtQXNzb2NEYXRhRWxlbWVudHM7CisgIFVDSEFSIE51bVZhbGlkQ2NFbGVtZW50czsKKworICBVQ0hBUiBNb25vTWl4ZG93blByZXNlbnQ7CisgIFVDSEFSIE1vbm9NaXhkb3duRWxlbWVudE51bWJlcjsKKworICBVQ0hBUiBTdGVyZW9NaXhkb3duUHJlc2VudDsKKyAgVUNIQVIgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXI7CisKKyAgVUNIQVIgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudDsKKyAgVUNIQVIgTWF0cml4TWl4ZG93bkluZGV4OworICBVQ0hBUiBQc2V1ZG9TdXJyb3VuZEVuYWJsZTsKKworICBVQ0hBUiBGcm9udEVsZW1lbnRJc0NwZVtQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKyAgVUNIQVIgRnJvbnRFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOworICBVQ0hBUiBGcm9udEVsZW1lbnRIZWlnaHRJbmZvW1BDX0ZTQl9DSEFOTkVMU19NQVhdOworCisgIFVDSEFSIFNpZGVFbGVtZW50SXNDcGVbUENfRlNCX0NIQU5ORUxTX01BWF07CisgIFVDSEFSIFNpZGVFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOworICBVQ0hBUiBTaWRlRWxlbWVudEhlaWdodEluZm9bUENfRlNCX0NIQU5ORUxTX01BWF07CisKKyAgVUNIQVIgQmFja0VsZW1lbnRJc0NwZVtQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKyAgVUNIQVIgQmFja0VsZW1lbnRUYWdTZWxlY3RbUENfRlNCX0NIQU5ORUxTX01BWF07CisgIFVDSEFSIEJhY2tFbGVtZW50SGVpZ2h0SW5mb1tQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKKworICBVQ0hBUiBMZmVFbGVtZW50VGFnU2VsZWN0W1BDX0xGRV9DSEFOTkVMU19NQVhdOworCisgIFVDSEFSIEFzc29jRGF0YUVsZW1lbnRUYWdTZWxlY3RbUENfQVNTT0NEQVRBX01BWF07CisKKyAgVUNIQVIgQ2NFbGVtZW50SXNJbmRTd1tQQ19DQ0VMX01BWF07CisgIFVDSEFSIFZhbGlkQ2NFbGVtZW50VGFnU2VsZWN0W1BDX0NDRUxfTUFYXTsKKworICBVQ0hBUiBDb21tZW50RmllbGRCeXRlczsKKyAgVUNIQVIgQ29tbWVudFtQQ19DT01NRU5UTEVOR1RIXTsKKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisKKyAgLyogSGVscGVyIHZhcmlhYmxlcyBmb3IgYWRtaW5pc3RyYXRpb246ICovCisgIFVDSEFSIGlzVmFsaWQ7ICAgICAgICAgICAgICAgLyohPCBGbGFnIHNob3dpbmcgaWYgUENFIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LiAqLworICBVQ0hBUiBOdW1DaGFubmVsczsgICAgICAgICAgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMgaW5jbHVkaW5nIExGRXMgKi8KKyAgVUNIQVIgTnVtRWZmZWN0aXZlQ2hhbm5lbHM7ICAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcyBhbmQgQ1BFcyAqLworICBVQ0hBUiBlbENvdW50ZXI7CisKK30gQ1Byb2dyYW1Db25maWc7CisKK3R5cGVkZWYgZW51bSB7CisgIEFTQ0VYVF9VTktPV04gPSAtMSwKKyAgQVNDRVhUX1NCUiAgICA9IDB4MmI3LAorICBBU0NFWFRfUFMgICAgID0gMHg1NDgsCisgIEFTQ0VYVF9NUFMgICAgPSAweDc2YSwKKyAgQVNDRVhUX1NBT0MgICA9IDB4N2NiLAorICBBU0NFWFRfTERNUFMgID0gMHg3Y2MKKworfSBUUF9BU0NfRVhURU5TSU9OX0lEOworCisjaWZkZWYgVFBfR0FfRU5BQkxFCisvKioKKyAqIEdhU3BlY2lmaWNDb25maWcgc3RydWN0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZyA7CisgIFVJTlQgbV9kZXBlbmRzT25Db3JlQ29kZXIgOworICBVSU5UIG1fY29yZUNvZGVyRGVsYXkgOworCisgIFVJTlQgbV9leHRlbnNpb25GbGFnIDsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWczIDsKKworICBVSU5UIG1fbGF5ZXI7CisgIFVJTlQgbV9udW1PZlN1YkZyYW1lOworICBVSU5UIG1fbGF5ZXJMZW5ndGg7CisKK30gQ1NHYVNwZWNpZmljQ29uZmlnOworI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLworCisKKworCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorCit0eXBlZGVmIGVudW0geworICBFTERFWFRfVEVSTSAgPSAweDAsICAgLyogVGVybWluYXRpb24gdGFnICovCisgIEVMREVYVF9TQU9DICA9IDB4MSwgICAvKiBTQU9DIGNvbmZpZyAqLworICBFTERFWFRfTERTQUMgPSAweDIgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgLyogcmVzZXJ2ZWQgKi8KK30gQVNDX0VMRF9FWFRfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKKworICBVQ0hBUiBtX3NiclByZXNlbnRGbGFnOworICBVQ0hBUiBtX3VzZUxkUW1mVGltZUFsaWduOyAgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLworICBVQ0hBUiBtX3NiclNhbXBsaW5nUmF0ZTsKKyAgVUNIQVIgbV9zYnJDcmNGbGFnOworCit9IENTRWxkU3BlY2lmaWNDb25maWc7CisjZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworCisKKworCisvKioKKyAqIEF1ZGlvIGNvbmZpZ3VyYXRpb24gc3RydWN0LCBzdWl0YWJsZSBmb3IgZW5jb2RlciBhbmQgZGVjb2RlciBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLyogWFlaIFNwZWNpZmljIERhdGEgKi8KKyAgdW5pb24geworI2lmZGVmIFRQX0dBX0VOQUJMRQorICAgIENTR2FTcGVjaWZpY0NvbmZpZyAgICBtX2dhU3BlY2lmaWNDb25maWc7ICAgICAgIC8qKjwgR2VuZXJhbCBhdWRpbyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAgICAgICAgICovCisjZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorICAgIENTRWxkU3BlY2lmaWNDb25maWcgICBtX2VsZFNwZWNpZmljQ29uZmlnOyAgICAgIC8qKjwgRUxEIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworICB9IG1fc2M7CisgIAorICAvKiBDb21tb24gQVNDIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIENQcm9ncmFtQ29uZmlnICAgICAgICBtX3Byb2dyQ29uZmlnRWxlbWVudDsgICAgIC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisKKyAgQVVESU9fT0JKRUNUX1RZUEUgICAgIG1fYW90OyAgICAgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVSU5UICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgICAgICAvKio8IFNhbXBsZXJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsZXNQZXJGcmFtZTsgICAgICAgIC8qKjwgQW1vdW50IG9mIHNhbXBsZXMgcGVyIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZGlyZWN0TWFwcGluZzsgICAgICAgICAgLyoqPCBEb2N1bWVudCB0aGlzIHBsZWFzZSAhISAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFVRElPX09CSkVDVF9UWVBFICAgICBtX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsgICAgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCisKKyAgU0NIQVIgICAgICAgICAgICAgICAgIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAqLworCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2VwQ29uZmlnOyAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX3ZjYjExRmxhZzsgICAgICAgICAgICAgIC8qKjwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX3J2bGNGbGFnOyAgICAgICAgICAgICAgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2hjckZsYWc7ICAgICAgICAgICAgICAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCisKKyAgU0NIQVIgICAgICAgICAgICAgICAgIG1fc2JyUHJlc2VudEZsYWc7ICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIFNCUiBkYXRhIGluIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLworICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9wc1ByZXNlbnRGbGFnOyAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCisgIFVDSEFSICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uOyAgIC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICAgICAgICAgICAgICovCisKK30gQ1NBdWRpb1NwZWNpZmljQ29uZmlnOworCit0eXBlZGVmIElOVCAoKmNiVXBkYXRlQ29uZmlnX3QpKHZvaWQqLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcqKTsKK3R5cGVkZWYgSU5UICgqY2JTc2NfdCkoCisgICAgICAgIHZvaWQqLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSwKKyAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgIGNvbnN0IElOVCBtdXhNb2RlLAorICAgICAgICBjb25zdCBJTlQgY29uZmlnQnl0ZXMKKyAgICAgICAgKTsKK3R5cGVkZWYgSU5UICgqY2JTYnJfdCkoCisgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKKyAgICAgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QgIHsKKyAgY2JVcGRhdGVDb25maWdfdCBjYlVwZGF0ZUNvbmZpZzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeSBjYWxsYmFjay4gICovCisgIHZvaWQgKmNiVXBkYXRlQ29uZmlnRGF0YTsgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAqLworICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiU2JyX3QgY2JTYnI7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU2JyRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLworfSBDU1RwQ2FsbEJhY2tzOworCitzdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0gCit7IDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MCwgMCwgMCwKKyAgMAorfTsKKworc3RhdGljIGlubGluZQoraW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KCBVSU5UIHNhbXBsaW5nUmF0ZSApCit7CisgIFVJTlQgc2ZfaW5kZXgsIHRhYmxlU2l6ZT1zaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihVSU5UKTsKKworICBmb3IgKHNmX2luZGV4PTA7IHNmX2luZGV4PHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgeworICAgIGlmKCBTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlICkgYnJlYWs7CisgIH0KKworICBpZiAoc2ZfaW5kZXg+dGFibGVTaXplLTEpIHsKKyAgICByZXR1cm4gdGFibGVTaXplLTE7CisgIH0KKworICByZXR1cm4gc2ZfaW5kZXg7Cit9CisKKy8qCisgKiBHZXQgQ2hhbm5lbCBjb3VudCBmcm9tIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpCit7CisgIHN3aXRjaCAoY2hhbm5lbENvbmZpZykgeworICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOgorICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgorICAgIHJldHVybiBjaGFubmVsQ29uZmlnOworICBjYXNlIDc6IGNhc2UgMTI6IGNhc2UgMTQ6CisgICAgcmV0dXJuIDg7CisgIGNhc2UgMTE6CisgICAgcmV0dXJuIDc7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGlubGluZQoraW50IGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoY29uc3QgaW50IGNoYW5uZWxDb25maWcpCit7ICAgICAgICAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLworICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsNywwLDAsIDAsIDYsIDcsIDAsIDcsIDB9OworICByZXR1cm4gbltjaGFubmVsQ29uZmlnXTsKK30KKworI2VuZGlmIC8qIF9fVFBfREFUQV9IX18gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvaW5jbHVkZS90cGVuY19saWIuaCBiL2FhYy9saWJNcGVnVFBFbmMvaW5jbHVkZS90cGVuY19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODMzZTgyCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwZW5jX2xpYi5oCkBAIC0wLDAgKzEsMjk2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBlbmNvZGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fVFBFTkNfTElCX0hfXworI2RlZmluZSBfX1RQRU5DX0xJQl9IX18KKworI2luY2x1ZGUgInRwX2RhdGEuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKyNkZWZpbmUgVFJBTlNQT1JURU5DX0lOQlVGX1NJWkUgODE5MgorCit0eXBlZGVmIGVudW0geworICBUUkFOU1BPUlRFTkNfT0sgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19OT19NRU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0IG9mIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgLyohPCBVbmtub3duIGVycm9yIChlbWJhcnJhc2luZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVIsICAgICAgICAgICAgICAgICAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBmdW5jdGlvbiAuICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19QQVJTRV9FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQml0c3RyZWFtIGRhdGEgY29udGFpbmVkIGluY29uc2lzdGVuY2llcyAod3Jvbmcgc3ludGF4KS4gKi8KKyAgVFJBTlNQT1JURU5DX1VOU1VQUE9SVEVEX0ZPUk1BVCwgICAgICAgICAgICAgICAgLyohPCBVbnN1cHBvcnRlZCB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfTk9UX0VOT1VHSF9CSVRTLCAgICAgICAgICAgICAgICAgICAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5IGFnYWluLiAgICAgICAgICAgICovCisKKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfQ09ORklHLCAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbiBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfTEFUTV9JTlZBTElEX05SX09GX1NVQkZSQU1FUywgICAgICAvKiE8IExBVE06IG51bWJlciBvZiBzdWJmcmFtZXMgb3V0IG9mIHJhbmdlLiAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19MT0FTX05PVF9BVkFJTEFCTEUsICAgICAgICAgICAgICAgIC8qITwgTE9BUyBmb3JtYXQgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfTEFUTV9BTElHTk1FTlQsICAgICAgICAgICAgLyohPCBBdWRpb011eEVsZW1lbnQgbGVuZ3RoIG5vdCBhbGlnbmVkIHRvIDEgYnl0ZS4gICAgICAgICAgICAqLworCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX1RSQU5TTUlTU0lPTl9GUkFNRV9MRU5HVEgsIC8qITwgSW52YWxpZCB0cmFuc21pc3Npb24gZnJhbWUgbGVuZ3RoICg8IDApLiAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfQ0VMUF9GUkFNRV9MRU5HVEgsICAgICAgICAgLyohPCBJbnZhbGlkIENFTFAgZnJhbWUgbGVuZ3RoIGZvdW5kICg+PSA2MikuICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9GUkFNRV9CSVRTLCAgICAgICAgICAgICAgICAvKiE8IEZyYW1lIGJpdHMgaXMgbm90IDQwIGFuZCBub3QgODAuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FPVCwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVW5rbm93biBBT1QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIICAgICAgICAgICAgICAgICAgLyohPCBJbnZhbGlkIEFjY2VzcyBVbml0IGxlbmd0aCAobm90IGJ5dGUtYWxpZ25lZCkuICAgICAgICAgICAqLworCit9IFRSQU5TUE9SVEVOQ19FUlJPUjsKKwordHlwZWRlZiBzdHJ1Y3QgVFJBTlNQT1JURU5DICpIQU5ETEVfVFJBTlNQT1JURU5DOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICBEZXRlcm1pbmUgYSByZWFzb25hYmxlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBvbiB0aGUgYmFzaXMgb2YgY2hhbm5lbF9tb2RlLgorICogXHBhcmFtIG5vQ2hhbm5lbHMgIE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KKyAqIFxyZXR1cm4gICAgICAgICAgICBDSEFOTkVMX01PREUgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMuCisgKi8KK0NIQU5ORUxfTU9ERSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoIGludCBub0NoYW5uZWxzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNCUiBoZWFxZGVyIHdyaXRlciBjYWxsYmFjay4KKyAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCisgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTQlIgaGVhZGVyIHdyaXRpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2sgKAorICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwKKyAgICAgICAgdm9pZCogdXNlcl9kYXRhCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNTQyB3cml0ZXIgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU1NDIHdyaXRpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU3NjQ2FsbGJhY2sgKAorICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzYywKKyAgICAgICAgdm9pZCogdXNlcl9kYXRhCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgV3JpdGUgQVNDIGZyb20gZ2l2ZW4gcGFyYW1ldGVycy4KKyAqIFxwYXJhbSBhc2MgICAgIEEgSEFORExFX0ZES19CSVRTVFJFQU0gd2hlcmUgdGhlIEFTQyBpcyB3cml0dGVuIHRvLgorICogXHBhcmFtIGNvbmZpZyAgU3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgKiBccGFyYW0gY2IgY2FsbGJhY2sgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICogXHJldHVybiAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RW5jX3dyaXRlQVNDICgKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLAorICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKKyAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKKyAgICAgICAgKTsKKworCisvKiBEZWZpbnRpb24gb2YgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRyYW5zcG9ydEVuY19PcGVuKCkgKi8KKyNkZWZpbmUgVFBfRkxBR19NUEVHNCAgICAgIDEgIC8qKiBNUEVHNCAoaW5zdGVhZCBvZiBNUEVHMikgKi8KKyNkZWZpbmUgVFBfRkxBR19MQVRNX0FNViAgIDIgIC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbiAgKi8KKyNkZWZpbmUgVFBfRkxBR19MQVRNX0FNVkEgIDQgIC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbkEgKi8KKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICBBbGxvY2F0ZSB0cmFuc3BvcnQgZW5jb2Rlci4KKyAqIFxwYXJhbSBwaFRwRW5jICAgICAgIFBvaW50ZXIgdG8gdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICAgRXJyb3IgY29kZS4KKyAqLworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKCBIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwRW5jICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgSW5pdCB0cmFuc3BvcnQgZW5jb2Rlci4KKyAqIFxwYXJhbSBic0J1ZmZlciAgICAgIFBvaW50ZXIgdG8gdHJhbnNwb3J0IGVuY29kZXIuCisgKiBccGFyYW0gYnNCdWZmZXIgICAgICBQb2ludGVyIHRvIGJpdHN0cmVhbSBidWZmZXIuCisgKiBccGFyYW0gYnNCdWZmZXJTaXplICBTaXplIGluIGJ5dGVzIG9mIGJzQnVmZmVyLgorICogXHBhcmFtIHRyYW5zcG9ydEZtdCAgRm9ybWF0IG9mIHRoZSB0cmFuc3BvcnQgdG8gYmUgd3JpdHRlbi4KKyAqIFxwYXJhbSBjb25maWcgICAgICAgIFBvaW50ZXIgdG8gYSB2YWxpZCBDT0RFUl9DT05GSUcgc3RydWN0LgorICogXHBhcmFtIGZsYWdzICAgICAgICAgVHJhbnNwb3J0IGVuY29kZXIgZmxhZ3MuCisgKiBccmV0dXJuICAgICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXQoCisgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKmJzQnVmZmVyLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGJzQnVmZmVyU2l6ZSwKKyAgICAgICAgVFJBTlNQT1JUX1RZUEUgICAgIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgQ09ERVJfQ09ORklHICAgICAgKmNvbmZpZywKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgIGZsYWdzCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICAgICAgR2V0IHRyYW5zcG9ydCBlbmNvZGVyIGJpdHN0cmVhbS4KKyAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICBUaGUgaGFuZGxlIHRvIHRoZSByZXF1ZXN0ZWQgRkRLIGJpdHN0cmVhbS4KKyAqLworSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbSggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICBHZXQgYW1vdW50IG9mIGJpdHMgcmVxdWlyZWQgYnkgdGhlIHRyYW5zcG9ydCBoZWFkZXJzLgorICogXHBhcmFtIGhUcCAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBlbmNvZGVyLgorICogXHBhcmFtIGF1Qml0cyAgQW1vdW50IG9mIHBheWxvYWQgYml0cyByZXF1aXJlZCBmb3IgdGhlIGN1cnJlbnQgc3ViZnJhbWUuCisgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgorICovCitJTlQgdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLCBpbnQgYXVCaXRzICk7CisKKy8qKgorICogXGJyaWVmICAgICAgIENsb3NlIHRyYW5zcG9ydCBlbmNvZGVyLiBUaGlzIGZ1bmN0aW9uIGFzc3VyZXMgdGhhdCBhbGwgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKyAqIFxwYXJhbSBwaFRwICBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgorICovCit2b2lkIHRyYW5zcG9ydEVuY19DbG9zZSggSEFORExFX1RSQU5TUE9SVEVOQyAqcGhUcCApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUgb25lIGFjY2VzcyB1bml0LgorICogXHBhcmFtIGhUcCAgICAgICAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGVuY29kZXIuCisgKiBccGFyYW0gdG90YWxfYml0cyAgICAgICAgICAgIEFtb3VudCBvZiB0b3RhbCBhY2Nlc3MgdW5pdCBiaXRzLgorICogXHBhcmFtIGJ1ZmZlckZ1bGxuZXNzICAgICAgICBWYWx1ZSBvZiBjdXJyZW50IGJ1ZmZlciBmdWxsbmVzcyBpbiBiaXRzLgorICogXHBhcmFtIG5vQ29uc2lkZXJlZENoYW5uZWxzICBOdW1iZXIgb2YgYml0cmF0ZSB3aXNlIGNvbnNpZGVyZWQgY2hhbm5lbHMgKGFsbCBtaW51cyBMRkUgY2hhbm5lbHMpLgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdGFsX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbnNpZGVyZWRDaGFubmVscyApOworCisvKioKKyAqIFxicmllZiAgICAgICAgSW5mb3JtIHRoZSB0cmFuc3BvcnRFbmMgbGF5ZXIgdGhhdCB3cml0aW5nIG9mIGFjY2VzcyB1bml0IGhhcyBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbgorICogICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZW5jb2RlciBoYXMgZmluaXNoZWQgd3JpdGluZyBvbmUgQWNjZXNzCisgKiAgICAgICAgICAgICAgIG9uZSBBY2Nlc3MgVW5pdCBmb3IgYml0c3RyZWFtIGhvdXNla2VlcGluZy4KKyAqIFxwYXJhbSBoVHAgICAgVHJhbnNwb3J0IGhhbmRsZS4KKyAqIFxwYXJhbSBwQml0cyAgUG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGFtb3VudCBvZiBmcmFtZSBiaXRzIGlzIHBhc3NlZAorICogICAgICAgICAgICAgICBhbmQgd2hlcmUgdGhlIGN1cnJlbnQgYW1vdW50IG9mIHN1YmZyYW1lIGJpdHMgaXMgcmV0dXJuZWQuCisgKgorICogT1I6ICBUaGlzIGludGVnZXIgaXMgbW9kaWZpZWQgYnkgdGhlIGFtb3VudCBvZiBleHRyYSBiaXQgYWxpZ25tZW50IHRoYXQgbWF5IG9jY3Vyci4KKyAqCisgKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCAqcEJpdHMpOworCisvKgorICogXGJyaWVmICAgICAgICAgR2V0IGEgcGF5bG9hZCBmcmFtZS4KKyAqIFxwYXJhbSBoVHBFbmMgIFRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBuQnl0ZXMgIFBvaW50ZXIgdG8gYW4gaW50IHRvIGhvbGQgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMuIFJldHVybnMgemVybworICogICAgICAgICAgICAgICAgaWYgY3VycmVudGx5IHRoZXJlIGlzIG5vIGNvbXBsZXRlIGZyYW1lIGZvciBvdXRwdXQgKG51bWJlciBvZiBzdWIgZnJhbWVzID4gMSkuCisgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldEZyYW1lKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgKm5ieXRlcyk7CisKKy8qIEFEVFMgQ1JDIHN1cHBvcnQgKi8KKworLyoqCisgKiBcYnJpZWYgICAgICAgICBTZXQgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYXMgc3RhcnQgb2YgYSBuZXcgZGF0YSByZWdpb24uCisgKiBccGFyYW0gaFRwRW5jICBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gbUJpdHMgICBTaXplIGluIGJpdHMgb2YgdGhlIGRhdGEgcmVnaW9uLiBTZXQgdG8gMCBpZiBpdCBzaG91bGQgbm90IGJlIG9mIGEgZml4ZWQgc2l6ZS4KKyAqIFxyZXR1cm4gICAgICAgIERhdGEgcmVnaW9uIElELCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNhbGxpbmcgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZygpLgorICovCitpbnQgdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgbUJpdHMpOworCisvKioKKyAqIFxicmllZiAgICAgICAgIFNldCBlbmQgb2YgZGF0YSByZWdpb24uCisgKiBccGFyYW0gaFRwRW5jICBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcmVnICAgICBEYXRhIHJlZ2lvbiBJRCwgb3BidGFpbmVkIGZyb20gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKCkuCisgKiBccmV0dXJuICAgICAgICB2b2lkCisgKi8KK3ZvaWQgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50IHJlZyk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgIEdldCBBdWRpb1NwZWNpZmljQ29uZmlnIG9yIFN0cmVhbU11eENvbmZpZyBmcm9tIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZSBhbmQgd3JpdGUgaXQgdG8gZGF0YUJ1ZmZlci4KKyAqIFxwYXJhbSBoVHBFbmMgICAgICBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gY2MgICAgICAgICAgUG9pbnRlciB0byB0aGUgY3VycmVudCBhbmQgdmFsaWQgY29uZmlndXJhdGlvbiBjb250YWluZWQgaW4gYSBDT0RFUl9DT05GSUcgc3RydWN0LgorICogXHBhcmFtIGRhdGFCdWZmZXIgIEJpdGJ1ZmZlciBob2xkaW5nIGJpbmFyeSBjb25maWd1cmF0aW9uLgorICogXHBhcmFtIGNvbmZUeXBlICAgIFBvaW50ZXIgdG8gYW4gVUlOVCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiB0eXBlIGlzIHJldHVybmVkICgwOkFTQywgMTpTTUMpLgorICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0Q29uZiggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgICAgICAgICpjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSAgICAgICAqZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqY29uZlR5cGUgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgR2V0IGluZm9ybWF0aW9uICh2ZXJzaW9uIGFtb25nIG90aGVyIHRoaW5ncykgb2YgdGhlIHRyYW5zcG9ydCBlbmNvZGVyIGxpYnJhcnkuCisgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LgorICogXHJldHVybiAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX19UUEVOQ19MSUJfSF9fICovCmRpZmYgLS1naXQgYS9hYWMvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcCBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcApAQCAtMCwwICsxLDE4MiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgY29udGVudHMvZGVzY3JpcHRpb246IEFESUYgVHJhbnNwb3J0IEhlYWRlcnMgd3JpdGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0cGVuY19hZGlmLmgiCisKKyNpbmNsdWRlICJ0cGVuY19saWIuaCIKKyNpbmNsdWRlICJ0cGVuY19hc2MuaCIKKworCisKK2ludCBhZGlmV3JpdGVfRW5jb2RlSGVhZGVyKEFESUZfSU5GTyAqYWRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhZGlmX2J1ZmZlcl9mdWxsbmVzcykKK3sKKyAgLyogQURJRi9QQ0UvQURUUyBkZWZpbml0aW9ucyAqLworICBjb25zdCBjaGFyIGFkaWZJZFs1XT0iQURJRiI7CisgIGNvbnN0IGludCAgY29weVJpZ2h0SWRQcmVzZW50PTA7CisgIGNvbnN0IGludCAgb3JpZ2luYWxDb3B5PTA7CisgIGNvbnN0IGludCAgaG9tZT0wOworCisgIGludCBpOworCisgIElOVCBzYW1wbGVSYXRlID0gYWRpZi0+c2FtcGxpbmdSYXRlOworICBJTlQgdG90YWxCaXRSYXRlID0gYWRpZi0+Yml0UmF0ZTsKKworICBpZiAoYWRpZi0+aGVhZGVyV3JpdHRlbikKKyAgICByZXR1cm4gMDsKKworICAvKiBBbGlnbiBpbnNpZGUgUENFIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBoZWFkZXIgKi8KKyAgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgIC8qIFNpZ25hbCB2YXJpYWJsZSBiaXRyYXRlIGlmIGJ1ZmZlciBmdWxsbmVzIGV4Y2VlZHMgMjAgYml0ICovCisgIGFkaWYtPmJWYXJpYWJsZVJhdGUgPSAoIGFkaWZfYnVmZmVyX2Z1bGxuZXNzID49IChJTlQpKDB4MTw8MjApICkgPyAxIDogMDsKKworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMF0sOCk7CisgIEZES3dyaXRlQml0cyhoQnMsIGFkaWZJZFsxXSw4KTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzJdLDgpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbM10sOCk7CisKKworICBGREt3cml0ZUJpdHMoaEJzLCBjb3B5UmlnaHRJZFByZXNlbnQgPyAxOjAsMSk7CisKKyAgaWYoY29weVJpZ2h0SWRQcmVzZW50KSB7CisgICAgZm9yKGk9MDtpPDcyO2krKykgeworICAgICAgRkRLd3JpdGVCaXRzKGhCcywwLDEpOworICAgIH0KKyAgfQorICBGREt3cml0ZUJpdHMoaEJzLCBvcmlnaW5hbENvcHkgPyAxOjAsMSk7CisgIEZES3dyaXRlQml0cyhoQnMsIGhvbWUgPyAxOjAsMSk7CisgIEZES3dyaXRlQml0cyhoQnMsIGFkaWYtPmJWYXJpYWJsZVJhdGU/MTowLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgdG90YWxCaXRSYXRlLDIzKTsKKworICAvKiB3ZSB3cml0ZSBvbmx5IG9uZSBQQ0UgYXQgdGhlIG1vbWVudCAqLworICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsKKworICBpZighYWRpZi0+YlZhcmlhYmxlUmF0ZSkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIGFkaWZfYnVmZmVyX2Z1bGxuZXNzLCAyMCk7CisgIH0KKworICAvKiBXcml0ZSBQQ0UgKi8KKyAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKGhCcywgYWRpZi0+Y20sIHNhbXBsZVJhdGUsIGFkaWYtPmluc3RhbmNlVGFnLCBhZGlmLT5wcm9maWxlLCAwLCAwLCBhbGlnbkFuY2hvcik7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBhZGlmV3JpdGVfR2V0SGVhZGVyQml0cyhBRElGX0lORk8gKmFkaWYpCit7CisgIC8qIEFESUYgZGVmaW5pdGlvbnMgKi8KKyAgY29uc3QgaW50ICBjb3B5UmlnaHRJZFByZXNlbnQ9MDsKKworICBpZiAoYWRpZi0+aGVhZGVyV3JpdHRlbikKKyAgICByZXR1cm4gMDsKKworICBpbnQgYml0cyA9IDA7CisKKyAgYml0cyArPSA4KjQ7IC8qIEFESUYgSUQgKi8KKworICBiaXRzICs9IDE7IC8qIENvcHlyaWdodCBwcmVzZW50ICovCisKKyAgaWYgKGNvcHlSaWdodElkUHJlc2VudCkKKyAgICBiaXRzICs9IDcyOyAgICAgICAgICAvKiBDb3B5cmlnaHQgSUQgKi8KKworICBiaXRzICs9IDI2OworCisgIGJpdHMgKz0gNDsgLyogTnVtYmVyIG9mIFBDRSdzICovCisKKyAgaWYoIWFkaWYtPmJWYXJpYWJsZVJhdGUpIHsKKyAgICBiaXRzICs9IDIwOworICB9CisKKyAgLyogd3JpdGUgUENFICovCisgIGJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhhZGlmLT5jbSwgMCwgYml0cyk7CisKKyAgcmV0dXJuIGJpdHM7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuaCBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkwMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWRpZi5oCkBAIC0wLDAgKzEsMTM1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHb2VzY2hlbAorICAgY29udGVudHMvZGVzY3JpcHRpb246IFRyYW5zcG9ydCBIZWFkZXJzIHN1cHBvcnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQRU5DX0FESUZfSAorI2RlZmluZSBUUEVOQ19BRElGX0gKKworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2luY2x1ZGUgInRwX2RhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDSEFOTkVMX01PREUgY207CisgIElOVCBzYW1wbGluZ1JhdGU7CisgIElOVCBiaXRSYXRlOworICBpbnQgcHJvZmlsZTsKKyAgaW50IGJWYXJpYWJsZVJhdGU7CisgIGludCBpbnN0YW5jZVRhZzsKKyAgaW50IGhlYWRlcldyaXR0ZW47Cit9IEFESUZfSU5GTzsKKworLyoqCisgKiBcYnJpZWYgZW5jb2RlcyBBRElGIEhlYWRlcgorICoKKyAqIFxwYXJhbSBhZGlmIHBvaW50ZXIgdG8gQURJRl9JTkZPIHN0cnVjdHVyZQorICogXHBhcmFtIGhCaXRTdHJlYW0gaGFuZGxlIG9mIGJpdHN0cmVhbSwgd2hlcmUgdGhlIEFESUYgaGVhZGVyIGlzIHdyaXR0ZW4gaW50bworICogXHBhcmFtIGFkaWZfYnVmZmVyX2Z1bGxuZXNzIGJ1ZmZlciBmdWxsbmVzcyB2YWx1ZSBmb3IgdGhlIEFESUYgaGVhZGVyCisgKgorICogXHJldHVybiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoCisgICAgICAgIEFESUZfSU5GTyAgICAgICAgICAgKmFkaWYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGFkaWZfYnVmZmVyX2Z1bGxuZXNzCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEdldCBiaXQgZGVtYW5kIG9mIGEgQURJRiBoZWFkZXIKKyAqCisgKiBccGFyYW0gYWRpZiBwb2ludGVyIHRvIEFESUZfSU5GTyBzdHJ1Y3R1cmUKKyAqCisgKiBccmV0dXJuIGFtb3VudCBvZiBiaXRzIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBBRElGIGhlYWRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEKKyAqICAgICAgICAgY29udGFpbmVkIGluIHRoZSBhZGlmIHBhcmFtZXRlcgorICovCitpbnQgYWRpZldyaXRlX0dldEhlYWRlckJpdHMoIEFESUZfSU5GTyAqYWRpZiApOworCisjZW5kaWYgLyogVFBFTkNfQURJRl9IICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuY3BwIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMzE3OAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHcm9lc2NoZWwKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBBRFRTIFRyYW5zcG9ydCBIZWFkZXJzIHN1cHBvcnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHBlbmNfYWR0cy5oIgorCisKKyNpbmNsdWRlICJ0cGVuY19saWIuaCIKKyNpbmNsdWRlICJ0cGVuY19hc2MuaCIKKworCitpbnQgYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsICAgICAgICAgIC8qITwgcG9pbnRlciB0byBhZHRzIHN0dWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1CaXRzICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGlmIChwQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKCBGREtjcmNTdGFydFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgbUJpdHMpICk7Cit9CisKK3ZvaWQgYWR0c1dyaXRlX0NyY0VuZFJlZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaWYgKHBBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKQorICB7CisgICAgRkRLY3JjRW5kUmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCByZWcpOworICB9Cit9CisKK2ludCBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyggSEFORExFX0FEVFMgaEFkdHMgKQoreworICBpbnQgYml0cyA9IDA7CisKKyAgaWYgKGhBZHRzLT5jdXJyZW50QmxvY2sgPT0gMCkgeworICAgIC8qIFN0YXRpYyBhbmQgdmFyaWFibGUgaGVhZGVyIGJpdHMgKi8KKyAgICBiaXRzID0gNTY7CisgICAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICAgIC8qIEFkZCBoZWFkZXIvIHNpbmdsZSByYXcgZGF0YSBibG9jayBDUkMgYml0cyAqLworICAgICAgYml0cyArPSAxNjsKKyAgICAgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3M+MCkgeworICAgICAgICAvKiBBZGQgYml0cyBvZiByYXcgZGF0YSBibG9jayBwb3NpdGlvbiBtYXJrZXJzICovCisgICAgICAgIGJpdHMgKz0gKGhBZHRzLT5udW1fcmF3X2Jsb2NrcykqMTY7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ICYmIGhBZHRzLT5udW1fcmF3X2Jsb2Nrcz4wKSB7CisgICAgLyogQWRkIHJhdyBkYXRhIGJsb2NrIENSQyBiaXRzLiBOb3QgcmVhbGx5IHBhcnQgb2YgdGhlIGhlYWRlciwgcHV0IHRoZXkgY2F1c2UgYml0IG92ZXJoZWFkIHRvIGJlIGFjY291bnRlZC4gKi8KKyAgICBiaXRzICs9IDE2OworICB9CisKKyAgaEFkdHMtPmhlYWRlckJpdHMgPSBiaXRzOworCisgIHJldHVybiBiaXRzOworfQorCitJTlQgYWR0c1dyaXRlX0luaXQoSEFORExFX0FEVFMgaEFkdHMsIENPREVSX0NPTkZJRyAqY29uZmlnKQoreworICAvKiBTYW5pdHkgY2hlY2tzICovCisgIGlmICggY29uZmlnLT5uU3ViRnJhbWVzIDwgMQorICAgIHx8IGNvbmZpZy0+blN1YkZyYW1lcyA+IDQKKyAgICB8fCAoaW50KWNvbmZpZy0+YW90ID4gNAorICAgIHx8IChpbnQpY29uZmlnLT5hb3QgPCAxICkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGZpeGVkIGhlYWRlciAqLworICBpZiAoY29uZmlnLT5mbGFncyAmIENDX01QRUdfSUQpIHsKKyAgICBoQWR0cy0+bXBlZ19pZCA9IDA7IC8qIE1QRUcgNCAqLworICB9IGVsc2UgeworICAgIGhBZHRzLT5tcGVnX2lkID0gMTsgLyogTVBFRyAyICovCisgIH0KKyAgaEFkdHMtPmxheWVyPTA7CisgIGhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9ICEgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19QUk9URUNUSU9OKTsKKyAgaEFkdHMtPnByb2ZpbGUgPSAoKGludCljb25maWctPmFvdCkgLSAxOworICBoQWR0cy0+c2FtcGxlX2ZyZXFfaW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChjb25maWctPnNhbXBsaW5nUmF0ZSk7CisgIGhBZHRzLT5zYW1wbGVfZnJlcSA9IGNvbmZpZy0+c2FtcGxpbmdSYXRlOworICBoQWR0cy0+cHJpdmF0ZV9iaXQ9MDsKKyAgaEFkdHMtPmNoYW5uZWxfbW9kZSA9IGNvbmZpZy0+Y2hhbm5lbE1vZGU7CisgIGhBZHRzLT5vcmlnaW5hbD0wOworICBoQWR0cy0+aG9tZT0wOworICAvKiB2YXJpYWJsZSBoZWFkZXIgKi8KKyAgaEFkdHMtPmNvcHlyaWdodF9pZD0wOworICBoQWR0cy0+Y29weXJpZ2h0X3N0YXJ0PTA7CisKKyAgaEFkdHMtPm51bV9yYXdfYmxvY2tzPWNvbmZpZy0+blN1YkZyYW1lcy0xOyAvKiAwIG1lYW5zIDEgcmF3IGRhdGEgYmxvY2sgKi8KKworICBGREtjcmNJbml0KCZoQWR0cy0+Y3JjSW5mbywgMHg4MDA1LCAweEZGRkYsIDE2KTsKKworICBoQWR0cy0+Y3VycmVudEJsb2NrID0gMDsKKworCisgIHJldHVybiAwOworfQorCitpbnQgYWR0c1dyaXRlX0VuY29kZUhlYWRlcihIQU5ETEVfQURUUyBoQWR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX2Z1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2xlbmd0aCkKK3sKKyAgSU5UIGNyY0luZGV4ID0gMDsKKworCisgIGhBZHRzLT5oZWFkZXJCaXRzID0gYWR0c1dyaXRlX0dldEhlYWRlckJpdHMoaEFkdHMpOworCisgIEZES19BU1NFUlQoKChmcmFtZV9sZW5ndGgraEFkdHMtPmhlYWRlckJpdHMpLzgpPDB4MjAwMCk7ICAgICAgLyoxMyBiaXQqLworICBGREtfQVNTRVJUKGJ1ZmZlcl9mdWxsbmVzczwweDgwMCk7ICAgIC8qIDExIGJpdCAgICovCisKKyAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICBGREtjcmNSZXNldCgmaEFkdHMtPmNyY0luZm8pOworICB9CisKKyAgaWYgKGhBZHRzLT5jdXJyZW50QmxvY2sgPT0gMCkgeworICAgIEZES3Jlc2V0Qml0YnVmZmVyKGhCaXRTdHJlYW0sIEJTX1dSSVRFUik7CisgIH0KKworICBoQWR0cy0+c3ViRnJhbWVTdGFydEJpdCA9IEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKTsKKworICAvKiBTa2lwIG5ldyBoZWFkZXIgaWYgdGhpcyBpcyByYXcgZGF0YSBibG9jayAxLi5uICovCisgIGlmIChoQWR0cy0+Y3VycmVudEJsb2NrID09IDApCisgIHsKKyAgICBGREtyZXNldEJpdGJ1ZmZlcihoQml0U3RyZWFtLCBCU19XUklURVIpOworCisgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7CisgICAgICBjcmNJbmRleCA9IGFkdHNXcml0ZV9DcmNTdGFydFJlZyhoQWR0cywgaEJpdFN0cmVhbSwgMCk7CisgICAgfQorCisgICAgLyogZml4ZWQgaGVhZGVyICovCisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4RkZGLCAxMik7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5tcGVnX2lkLCAxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPmxheWVyLCAyKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50LCAxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPnByb2ZpbGUsIDIpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+c2FtcGxlX2ZyZXFfaW5kZXgsIDQpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+cHJpdmF0ZV9iaXQsIDEpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBnZXRDaGFubmVsQ29uZmlnKGhBZHRzLT5jaGFubmVsX21vZGUpLCAzKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPm9yaWdpbmFsLCAxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPmhvbWUsIDEpOworICAgIC8qIHZhcmlhYmxlIGhlYWRlciAqLworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+Y29weXJpZ2h0X2lkLCAxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPmNvcHlyaWdodF9zdGFydCwgMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIChmcmFtZV9sZW5ndGggKyBoQWR0cy0+aGVhZGVyQml0cyk+PjMsIDEzKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgYnVmZmVyX2Z1bGxuZXNzLCAxMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5udW1fcmF3X2Jsb2NrcywgMik7CisKKyAgICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgeworICAgICAgaW50IGk7CisKKyAgICAgIC8qIEVuZCBoZWFkZXIgQ1JDIHBvcnRpb24gZm9yIHNpbmdsZSByYXcgZGF0YSBibG9jayBhbmQgd3JpdGUgZHVtbXkgemVybyB2YWx1ZXMgZm9yIHVua25vd24gZmllbGRzLiAqLworICAgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7CisgICAgICAgIGFkdHNXcml0ZV9DcmNFbmRSZWcoaEFkdHMsIGhCaXRTdHJlYW0sIGNyY0luZGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaT0wOyBpPGhBZHRzLT5udW1fcmF3X2Jsb2NrczsgaSsrKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDE2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDE2KTsKKyAgICB9CisgIH0gLyogRW5kIG9mIEFEVFMgaGVhZGVyICovCisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jayhIQU5ETEVfQURUUyBoQWR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBCaXRzKQoreworICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgeworICAgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7CisKKyAgICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgaEJzLT5oQml0QnVmLkJ1ZmZlciwgaEJzLT5oQml0QnVmLmJ1ZlNpemUsIDAsIEJTX1dSSVRFUik7CisgICAgRkRLcHVzaEZvcigmYnNXcml0ZXIsIDU2KTsKKworICAgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MgPT0gMCkgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgRkRLY3JjR2V0Q1JDKCZoQWR0cy0+Y3JjSW5mbyksIDE2KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGRpc3RhbmNlOworCisgICAgICAvKiBXcml0ZSBDUkMgb2YgY3VycmVudCByYXcgZGF0YSBibG9jayAqLworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgRkRLY3JjR2V0Q1JDKCZoQWR0cy0+Y3JjSW5mbyksIDE2KTsKKworICAgICAgLyogV3JpdGUgZGlzdGFuY2UgdG8gY3VycmVudCBkYXRhIGJsb2NrICovCisgICAgICBpZiAoaEFkdHMtPmN1cnJlbnRCbG9jayA8IGhBZHRzLT5udW1fcmF3X2Jsb2NrcykgeworICAgICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgaEFkdHMtPmN1cnJlbnRCbG9jayoxNik7CisgICAgICAgIGRpc3RhbmNlID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSAoNTYgKyAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSoxNiArIDE2KTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgZGlzdGFuY2U+PjMsIDE2KTsKKyAgICAgIH0KKyAgICB9CisgICAgRkRLc3luY0NhY2hlKCZic1dyaXRlcik7CisgIH0KKworICAvKiBXcml0ZSB0b3RhbCBmcmFtZSBsZW50aCBmb3IgbXVsdGlwbGUgcmF3IGRhdGEgYmxvY2tzIGFuZCBoZWFkZXIgQ1JDICovCisgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MgPiAwICYmIGhBZHRzLT5jdXJyZW50QmxvY2sgPT0gaEFkdHMtPm51bV9yYXdfYmxvY2tzKSB7CisgICAgRkRLX0JJVFNUUkVBTSBic1dyaXRlcjsKKyAgICBpbnQgY3JjSW5kZXggPSAwOworCisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLCBCU19XUklURVIpOworCisgICAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICAgIEZES2NyY1Jlc2V0KCZoQWR0cy0+Y3JjSW5mbyk7CisgICAgICBjcmNJbmRleCA9IEZES2NyY1N0YXJ0UmVnKCZoQWR0cy0+Y3JjSW5mbywgJmJzV3JpdGVyLCAwKTsKKyAgICB9CisgICAgLyogV3JpdGUgdG90YWwgZnJhbWUgbGVuZ3RoICovCisgICAgRkRLcHVzaEZvcigmYnNXcml0ZXIsIDU2LTI4KzIpOworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIEZES2dldFZhbGlkQml0cyhoQnMpPj4zLCAxMyk7CisKKyAgICAvKiBXcml0ZSBoZWFkZXIgQ1JDICovCisgICAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICAgIEZES3B1c2hGb3IoJmJzV3JpdGVyLCAxMSsyICsgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcykqMTYpOworICAgICAgRkRLY3JjRW5kUmVnKCZoQWR0cy0+Y3JjSW5mbywgJmJzV3JpdGVyLCBjcmNJbmRleCk7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBGREtjcmNHZXRDUkMoJmhBZHRzLT5jcmNJbmZvKSwgMTYpOworICAgIH0KKyAgICBGREtzeW5jQ2FjaGUoJmJzV3JpdGVyKTsKKyAgfQorCisgIC8qIENvcnJlY3QgKnBCaXRzIHRvIHJlZmxlY3QgdGhlIGFtb3VudCBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IHN1YmZyYW1lICovCisgICpwQml0cyAtPSBoQWR0cy0+c3ViRnJhbWVTdGFydEJpdDsKKyAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQgJiYgaEFkdHMtPm51bV9yYXdfYmxvY2tzID4gMCkgeworICAgIC8qIEZpeHVwIENSQyBiaXRzLCBzaW5jZSB0aGV5IGNvbWUgYWZ0ZXIgZWFjaCByYXcgZGF0YSBibG9jayAqLworICAgICpwQml0cyArPSAxNjsKKyAgfQorICBoQWR0cy0+Y3VycmVudEJsb2NrKys7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuaCBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJjN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5oCkBAIC0wLDAgKzEsMjE4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHcm9lc2NoZWwKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBBRFRTIFRyYW5zcG9ydCB3cml0ZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQRU5DX0FEVFNfSAorI2RlZmluZSBUUEVOQ19BRFRTX0gKKworCisKKyNpbmNsdWRlICJ0cF9kYXRhLmgiCisKKyNpbmNsdWRlICJGREtfY3JjLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIHNhbXBsZV9mcmVxOworICBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlOworICBVQ0hBUiBkZWNvZGVyQ2FuRG9NcGVnNDsKKyAgVUNIQVIgbXBlZ19pZDsKKyAgVUNIQVIgbGF5ZXI7CisgIFVDSEFSIHByb3RlY3Rpb25fYWJzZW50OworICBVQ0hBUiBwcm9maWxlOworICBVQ0hBUiBzYW1wbGVfZnJlcV9pbmRleDsKKyAgVUNIQVIgcHJpdmF0ZV9iaXQ7CisgIFVDSEFSIG9yaWdpbmFsOworICBVQ0hBUiBob21lOworICBVQ0hBUiBjb3B5cmlnaHRfaWQ7CisgIFVDSEFSIGNvcHlyaWdodF9zdGFydDsKKyAgVVNIT1JUIGZyYW1lX2xlbmd0aDsKKyAgVUNIQVIgbnVtX3Jhd19ibG9ja3M7CisgIFVDSEFSIEJ1ZmZlckZ1bGxuZXNTdGFydEZsYWc7CisgIGludCBoZWFkZXJCaXRzOyAgICAgICAgICAgICAgICAvKiE8IEhlYWRlciBiaXQgZGVtYW5kIGZvciB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jayAqLworICBpbnQgY3VycmVudEJsb2NrOyAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHJhdyBkYXRhIGJsb2NrICovCisgIGludCBzdWJGcmFtZVN0YXJ0Qml0OyAgICAgICAgICAvKiE8IEJpdCBwb3NpdGlvbiB3aGVyZSB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jayBiZWdpbnMgKi8KKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsKK30gU1RSVUNUX0FEVFM7CisKK3R5cGVkZWYgU1RSVUNUX0FEVFMgKkhBTkRMRV9BRFRTOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIEFEVFMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBccGFyYW0gaEFkdHMgQURUUyBkYXRhIGhhbmRsZQorICogXHBhcmFtIGNvbmZpZyBhIHZhbGlkIENPREVSX0NPTkZJRyBzdHJ1Y3QgZnJvbSB3aGVyZSB0aGUgcmVxdWlyZWQKKyAqICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIEFEVFMgaGVhZGVyIGlzIGV4dHJhdGVkIGZyb20KKyAqCisgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICovCitJTlQgYWR0c1dyaXRlX0luaXQoCisgICAgICAgIEhBTkRMRV9BRFRTICAgaEFkdHMsCisgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgdG90YWwgYml0IG92ZXJoZWFkIGNhdXNlZCBieSBBRFRTCisgKgorICogXGhBZHRzIGhhbmRsZSB0byBBRFRTIGRhdGEKKyAqCisgKiBccmV0dXJuIEFtb3VudCBvZiBhZGRpdGlvbmFsIGJpdHMgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrCisgKi8KK2ludCBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyggSEFORExFX0FEVFMgaEFkdHMgKTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGUgYW4gQURUUyBoZWFkZXIgaW50byB0aGUgZ2l2ZW4gYml0c3RyZWFtLiBNYXkgbm90IHdyaXRlIGEgaGVhZGVyCisgKiAgICAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSByYXcgZGF0YSBibG9ja3MuCisgKgorICogXHBhcmFtIGhBZHRzIEFEVFMgZGF0YSBoYW5kbGUKKyAqIFxwYXJhbSBoQml0U3RyZWFtIGJpdHN0cmVhbSBoYW5kbGUgaW50byB3aGljaCB0aGUgQURUUyBtYXkgYmUgd3JpdHRlbiBpbnRvCisgKiBccGFyYW0gYnVmZmVyX2Z1bGxuZXNzIHRoZSBidWZmZXIgZnVsbG5lc3MgdmFsdWUgZm9yIHRoZSBBRFRTIGhlYWRlcgorICogXHBhcmFtIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGxlbmd0aAorICoKKyAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKi8KK0lOVCBhZHRzV3JpdGVfRW5jb2RlSGVhZGVyKAorICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICBoQWR0cywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aAorICAgICAgICApOworLyoqCisgKiBcYnJpZWYgRmluaXNoIGEgQURUUyByYXcgZGF0YSBibG9jaworICoKKyAqIFxwYXJhbSBoQWR0cyBBRFRTIGRhdGEgaGFuZGxlCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgaW50byB3aGljaCB0aGUgQURUUyBtYXkgYmUgd3JpdHRlbiBpbnRvCisgKiBccGFyYW0gcEJpdHMgYSBwb2ludGVyIHRvIGEgaW50ZWdlciBob2xkaW5nIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBidWZmZXIgYml0IGNvdW50LAorICogICAgICAgICAgICAgIHdoaWNoIGlzIGNvcnJlY3RlZCB0byB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jayBib3VuZGFyeS4KKyAqCisgKi8KK3ZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jaygKKyAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgaEFkdHMsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqYml0cworICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmIFN0YXJ0IENSQyByZWdpb24gd2l0aCBhIG1heGltdW0gbnVtYmVyIG9mIGJpdHMKKyAqICAgICAgICBJZiBtQml0cyBpcyBwb3NpdGl2ZSB6ZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCisgKiAgICAgICAgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyBuZWdhdGl2ZSBubyB6ZXJvIHBhZGRpbmcgaXMgZG9uZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCB0aGUKKyAqICAgICAgICBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KKyAqCisgKiBccGFyYW0gcEFkdHMgQURUUyBkYXRhIGhhbmRsZQorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIG9mIHdoaWNoIHRoZSBDUkMgcmVnaW9uIGVuZHMKKyAqIFxwYXJhbSBtQml0cyBsaW1pdCBvZiBudW1iZXIgb2YgYml0cyB0byBiZSBjb25zaWRlcmVkIGZvciB0aGUgcmVxdWVzdGVkIENSQyByZWdpb24KKyAqCisgKiBccmV0dXJuIElEIGZvciB0aGUgY3JlYXRlZCByZWdpb24sIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworaW50IGFkdHNXcml0ZV9DcmNTdGFydFJlZygKKyAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgcEFkdHMsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbUJpdHMKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgRW5kcyBDUkMgcmVnaW9uIGlkZW50aWZpZWQgYnkgcmVnCisgKgorICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUKKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBvZiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiBlbmRzCisgKiBccGFyYW0gcmVnIGEgQ1JDIHJlZ2lvbiBJRCByZXR1cm5lZCBwcmV2aW91c2x5IGJ5IGFkdHNXcml0ZV9DcmNTdGFydFJlZygpCisgKi8KK3ZvaWQgYWR0c1dyaXRlX0NyY0VuZFJlZygKKyAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgcEFkdHMsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcmVnCisgICAgICAgICk7CisKKworCisKKyNlbmRpZiAvKiBUUEVOQ19BRFRTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmNwcCBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0MzAyZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5jcHAKQEAgLTAsMCArMSw1NzYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRwX2RhdGEuaCIKKworI2luY2x1ZGUgInRwZW5jX2xpYi5oIgorI2luY2x1ZGUgInRwZW5jX2FzYy5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjZGVmaW5lIFBDRV9NQVhfRUxFTUVOVFMgOAorCisvKioKKyAqICBEZXNjcmliZSBhIFBDRSBiYXNlZCBvbiBwbGFjZWQgY2hhbm5lbCBlbGVtZW50cyBhbmQgZWxlbWVudCB0eXBlIHNlcXVlbmNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBVQ0hBUiAgICBudW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgICAgIC8qITwgTnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMuICovCisgICAgVUNIQVIgICAgbnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50czsgICAgICAvKiE8IE51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMuICovCisgICAgVUNIQVIgICAgbnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50czsgICAgICAvKiE8IE51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMuICovCisgICAgVUNIQVIgICAgbnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyAgICAgICAvKiE8IE51bWJlciBvZiBsZmUgY2hhbm5lbCBlbGVtZW50cy4gKi8KKyAgICBNUDRfRUxFTUVOVF9JRCBlbF9saXN0W1BDRV9NQVhfRUxFTUVOVFNdOy8qITwgTGlzdCBjb250YWlucyBzZXF1ZW5jZSBkZXNjcmliaW5nIHRoZSBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwcmVzZW50IGNoYW5uZWwgbW9kZS4gKE1QRUcgb3JkZXIpICovCit9IFBDRV9DT05GSUdVUkFUSU9OOworCisKKy8qKgorICogIE1hcCBhbiBpbmNvbWluZyBjaGFubmVsIG1vZGUgdG8gYSBleGlzdGluZyBQQ0UgY29uZmlndXJhdGlvbiBlbnRyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgQ0hBTk5FTF9NT0RFICAgICAgICBjaGFubmVsX21vZGU7ICAgICAgICAvKiE8IFByZXNlbnQgY2hhbm5lbCBtb2RlLiAqLworICAgIFBDRV9DT05GSUdVUkFUSU9OICAgcGNlX2NvbmZpZ3VyYXRpb247ICAgLyohPCBQcm9ncmFtIGNvbmZpZyBlbGVtZW50IGRlc2NyaXB0aW9uLiAqLworCit9IENIQU5ORUxfQ09ORklHVVJBVElPTjsKKworCisvKioKKyAqIFxicmllZiBUYWJsZSBjb250YWlucyBhbGwgc3VwcG9ydGVkIGNoYW5uZWwgbW9kZXMgYW5kIGFjY29yZGluZyBQQ0UgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbi4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWwgZWxlbWVudCBwYXJhbWV0ZXIgZGVzY3JpYmVzIHRoZSBraW5kIG9mIGNvbnNlY3V0aXZlbHkgZWxlbWVudHMuCisgKiBFLmcuIE1PREVfMV8yXzJfMl8xIG1lYW5zOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gRmlyc3QgMyBlbGVtZW50cyAoU0NFLENQRSxDUEUpIGFyZSBmcm9udCBjaGFubmVsIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTmV4dCBlbGVtZW50IChDUEUpIGlzIGEgYmFjayBjaGFubmVsIGVsZW1lbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBMYXN0IGVsZW1lbnQgKExGRSkgaXMgYSBsZmUgY2hhbm5lbCBlbGVtZW50LgorICovCitzdGF0aWMgY29uc3QgQ0hBTk5FTF9DT05GSUdVUkFUSU9OIHBjZUNvbmZpZ1RhYltdID0KK3sKKyAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMCwgMCwgMCwgeyBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAwLCAwLCB7IElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisgIHsgTU9ERV8xXzIsICAgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKKyAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMSwgMCwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAxLCAwLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisgIHsgTU9ERV8xXzJfMl8xLCAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDEsIDEsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgICB7ICAzLCAwLCAxLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisKKworICB7IE1PREVfMV8xLCAgICAgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAwLCAwLCB7IElEX1NDRSwgIElEX1NDRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisgIHsgTU9ERV8xXzFfMV8xLCAgICAgICAgICAgICAgICAgIHsgIDIsIDIsIDAsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKKyAgeyBNT0RFXzFfMV8xXzFfMV8xLCAgICAgICAgICAgICAgeyAgMiwgMiwgMiwgMCwgeyBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorICB7IE1PREVfMV8xXzFfMV8xXzFfMV8xLCAgICAgICAgICB7ICAzLCAyLCAzLCAwLCB7IElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSB9IH0gfSwKKworICB7IE1PREVfMl8yLCAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAxLCAwLCB7IElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisgIHsgTU9ERV8yXzJfMiwgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEsIDEsIDAsIHsgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKKyAgeyBNT0RFXzJfMl8yXzIsICAgICAgICAgICAgICAgICAgeyAgNCwgMCwgMCwgMCwgeyBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorCisgIHsgTU9ERV8yXzEsICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDAsIDEsIDAsIHsgSURfQ1BFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKKworICB7IE1PREVfN18xX1JFQVJfU1VSUk9VTkQsICAgICAgICB7ICAyLCAwLCAyLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCisgIHsgTU9ERV83XzFfRlJPTlRfQ0VOVEVSLCAgICAgICAgIHsgIDMsIDAsIDEsIDEsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKKworfTsKKworCisvKioKKyAqIFxicmllZiAgR2V0IHByb2dyYW0gY29uZmlnIGVsZW1lbnQgZGVzY3JpcHRpb24gZm9yIGV4aXN0aW5nIGNoYW5uZWwgbW9kZS4KKyAqCisgKiBccGFyYW0gY2hhbm5lbF9tb2RlICAgICAgICAgIEN1cnJlbnQgY2hhbm5lbCBtb2RlLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gUG9pbnRlciB0byBQQ0VfQ09ORklHVVJBVElPTiBlbnRyeSwgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gTlVMTCwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OKiBnZXRQY2VFbnRyeSgKKyAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZQorICAgICAgICApCit7CisgIFVJTlQgaTsKKyAgY29uc3QgUENFX0NPTkZJR1VSQVRJT04gKnBjZV9jb25maWcgPSBOVUxMOworCisgIGZvciAoaT0wOyBpIDwgKHNpemVvZihwY2VDb25maWdUYWIpL3NpemVvZihDSEFOTkVMX0NPTkZJR1VSQVRJT04pKTsgaSsrKSB7CisgICAgaWYgKHBjZUNvbmZpZ1RhYltpXS5jaGFubmVsX21vZGUgPT0gY2hhbm5lbF9tb2RlKSB7CisgICAgICBwY2VfY29uZmlnID0gJnBjZUNvbmZpZ1RhYltpXS5wY2VfY29uZmlndXJhdGlvbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcGNlX2NvbmZpZzsKK30KKworaW50IGdldENoYW5uZWxDb25maWcoIENIQU5ORUxfTU9ERSBjaGFubmVsX21vZGUgKQoreworICBJTlQgY2hhbl9jb25maWcgPSAwOworCisgIHN3aXRjaChjaGFubmVsX21vZGUpIHsKKyAgICBjYXNlIE1PREVfMTogICAgICAgICBjaGFuX2NvbmZpZyA9IDE7IGJyZWFrOworICAgIGNhc2UgTU9ERV8yOiAgICAgICAgIGNoYW5fY29uZmlnID0gMjsgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMjogICAgICAgY2hhbl9jb25maWcgPSAzOyBicmVhazsKKyAgICBjYXNlIE1PREVfMV8yXzE6ICAgICBjaGFuX2NvbmZpZyA9IDQ7IGJyZWFrOworICAgIGNhc2UgTU9ERV8xXzJfMjogICAgIGNoYW5fY29uZmlnID0gNTsgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAgY2hhbl9jb25maWcgPSA2OyBicmVhazsKKyAgICBjYXNlIE1PREVfMV8yXzJfMl8xOiBjaGFuX2NvbmZpZyA9IDc7IGJyZWFrOworCisgICAgZGVmYXVsdDogICAgICAgICAgICAgY2hhbl9jb25maWcgPSAwOworICB9CisKKyAgcmV0dXJuIGNoYW5fY29uZmlnOworfQorCitDSEFOTkVMX01PREUgdHJhbnNwb3J0RW5jX0dldENoYW5uZWxNb2RlKCBpbnQgbm9DaGFubmVscyApCit7CisgIENIQU5ORUxfTU9ERSBjaE1vZGU7CisKKyAgaWYgKG5vQ2hhbm5lbHMgPD0gOCAmJiBub0NoYW5uZWxzID4gMCkKKyAgICBjaE1vZGUgPSAoQ0hBTk5FTF9NT0RFKSgobm9DaGFubmVscyA9PSA4KSA/IDcgOiBub0NoYW5uZWxzKTsgLyogc2VlIDogaXNvL21wZWc0IHYxIGF1ZGlvIHN1YnBhcnQxKi8KKyAgZWxzZQorICAgIGNoTW9kZSA9IE1PREVfVU5LTk9XTjsKKworICByZXR1cm4gY2hNb2RlOworfQorCisjaWZkZWYgVFBfUENFX0VOQUJMRQoraW50IHRyYW5zcG9ydEVuY193cml0ZVBDRShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZVRhZ1BDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzZXVkb1N1cnJvdW5kRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWduQW5jaG9yKQoreworICBpbnQgc2FtcGxlUmF0ZUluZGV4LCBpOworICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogY29uZmlnID0gTlVMTDsKKyAgY29uc3QgTVA0X0VMRU1FTlRfSUQqIHBFbF9saXN0ID0gTlVMTDsKKyAgVUNIQVIgY3BlQ250PTAsIHNjZUNudD0wLCBsZmVDbnQ9MDsKKworICBzYW1wbGVSYXRlSW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChzYW1wbGVSYXRlKTsKKyAgaWYgKHNhbXBsZVJhdGVJbmRleCA9PSAxNSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICgoY29uZmlnPWdldFBjZUVudHJ5KGNoYW5uZWxNb2RlKSk9PU5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBQb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gZWxlbWVudCBsaXN0LiAqLworICBwRWxfbGlzdCA9ICZjb25maWctPmVsX2xpc3RbMF07CisKKyAgRkRLd3JpdGVCaXRzKGhCcywgaW5zdGFuY2VUYWdQQ0UsICA0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGluc3RhbmNlIHRhZyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBwcm9maWxlLCAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCB0eXBlICovCisgIEZES3dyaXRlQml0cyhoQnMsIHNhbXBsZVJhdGVJbmRleCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgaW5kZXgqLworCisgIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMsIDQpOyAgICAgLyogRnJvbnQgY2hhbm5lbCBFbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgLCA0KTsgICAgIC8qIE5vIFNpZGUgQ2hhbm5lbCBFbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMgLCA0KTsgICAgIC8qIE5vIEJhY2sgY2hhbm5lbCBFbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50cyAgLCAyKTsgICAgIC8qIE5vIExmZSBjaGFubmVsIGVsZW1lbnRzICovCisKKyAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBhc3NvYyBkYXRhIGVsZW1lbnRzICovCisgIEZES3dyaXRlQml0cyhoQnMsIDAsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gdmFsaWQgY2MgZWxlbWVudHMgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIG1peGRvd24gcHJlc2VudCAqLworICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBtaXhkb3duIHByZXNlbnQgKi8KKworICBpZiAoIG1hdHJpeE1peGRvd25BIT0wICYmICgoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzJfMSkpICkgeworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeCBtaXhkb3duIHByZXNlbnQgKi8KKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIChtYXRyaXhNaXhkb3duQS0xKSYweDMsIDIpOyAgICAgICAgICAgICAvKiBtYXRyaXhfbWl4ZG93bl9pZHggKi8KKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIChwc2V1ZG9TdXJyb3VuZEVuYWJsZSk/MTowLCAxKTsgICAgICAgICAvKiBwc2V1ZG9fc3Vycm91bmRfZW5hYmxlICovCisgIH0KKyAgZWxzZSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4IG1peGRvd24gbm90IHByZXNlbnQgKi8KKyAgfQorCisgIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgaSsrKSB7CisgICAgICBVQ0hBUiBpc0NwZSA9ICgqcEVsX2xpc3QrKz09SURfQ1BFKSA/IDEgOiAwOworICAgICAgVUNIQVIgdGFnICAgPSAoaXNDcGUpID8gY3BlQ250KysgOiBzY2VDbnQrKzsKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIGlzQ3BlLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEVsZW1lbnRzIGlzIENQRT8gKi8KKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIHRhZywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEluc3RhbmNlIFRhZy4qLworICB9CisgIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIFVDSEFSIGlzQ3BlID0gKCpwRWxfbGlzdCsrPT1JRF9DUEUpID8gMSA6IDA7CisgICAgICBVQ0hBUiB0YWcgICA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaXNDcGUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgaXMgQ1BFPyAqLworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdGFnLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgSW5zdGFuY2UgVGFnLiovCisgIH0KKyAgZm9yKGk9MDsgaTxjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgeworICAgICAgVUNIQVIgaXNDcGUgPSAoKnBFbF9saXN0Kys9PUlEX0NQRSkgPyAxIDogMDsKKyAgICAgIFVDSEFSIHRhZyAgID0gKGlzQ3BlKSA/IGNwZUNudCsrIDogc2NlQ250Kys7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCBpc0NwZSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBFbGVtZW50cyBpcyBDUEU/ICovCisgICAgICBGREt3cml0ZUJpdHMoaEJzLCB0YWcsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBJbnN0YW5jZSBUYWcuKi8KKyAgfQorICBmb3IoaT0wOyBpPGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIGxmZUNudCsrLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMRkUgY2hhbm5lbCBJbnN0YW5jZSBUYWcuICovCisgIH0KKworICAvKiAtIG51bV92YWxpZF9jY19lbGVtZW50cyBhbHdheXMgMC4KKyAgICAgLSBudW1fYXNzb2NfZGF0YV9lbGVtZW50cyBhbHdheXMgMC4gKi8KKworICAvKiBCeXRlIGFsaWdubWVudDogcmVsYXRpdmUgdG8gYWxpZ25BbmNob3IKKyAgICAgICBBRFRTOiBhbGlnbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgcmF3X2RhdGFfYmxvY2soKQorICAgICAgIEFESUY6IGFsaWduIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBoZWFkZXIKKyAgICAgICBMQVRNOiBhbGlnbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgQVNDICovCisgIEZES2J5dGVBbGlnbihoQnMsIGFsaWduQW5jaG9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpZ25tZW50ICovCisKKyAgRkRLd3JpdGVCaXRzKGhCcywgMCAsOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBubyB3cml0ZSBhbnkgY29tbWVudC4gKi8KKworICAvKiAtIGNvbW1lbnRfZmllbGRfYnl0ZXMgYWx3YXlzIDAuICovCisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKQoreworICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogY29uZmlnID0gTlVMTDsKKworICBpZiAoKGNvbmZpZz1nZXRQY2VFbnRyeShjaGFubmVsTW9kZSkpPT1OVUxMKSB7CisgICAgcmV0dXJuIC0xOyAgLyogdW5zdXBwb3J0ZWQgY2hhbm5lbG1hcHBpbmcgKi8KKyAgfQorCisgIGJpdHMgKz0gNCArIDIgKyA0OyAgICAgICAgLyogRWxlbWVudCBpbnN0YW5jZSB0YWcgICsgT2JqZWN0IHR5cGUgKyBTYW1wbGUgcmF0ZSBpbmRleCAqLworICBiaXRzICs9IDQgKyA0ICsgNCArIDI7ICAgIC8qIE5vIChmcm9udCArIHNpZGUgKyBiYWNrICsgbGZlIGNoYW5uZWwpIGVsZW1lbnRzICovCisgIGJpdHMgKz0gMyArIDQ7ICAgICAgICAgICAgLyogTm8gKGFzc29jIGRhdGEgKyB2YWxpZCBjYykgZWxlbWVudHMgKi8KKyAgYml0cyArPSAxICsgMSArIDEgOyAgICAgICAvKiBNb25vICsgU3RlcmVvICsgTWF0cml4IG1peGRvd24gcHJlc2VudCAqLworCisgIGlmICggbWF0cml4TWl4ZG93bkEhPTAgJiYgKChjaGFubmVsTW9kZT09TU9ERV8xXzJfMil8fChjaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKSB7CisgICAgYml0cyArPTM7ICAgICAgICAgICAgICAgLyogbWF0cml4X21peGRvd25faWR4ICsgcHNldWRvX3N1cnJvdW5kX2VuYWJsZSAqLworICB9CisKKyAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsKKyAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOworICBiaXRzICs9ICgxKzQpICogKElOVCljb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7CisgIGJpdHMgKz0gICAoNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOworCisgIC8qIC0gbnVtX3ZhbGlkX2NjX2VsZW1lbnRzIGFsd2F5cyAwLgorICAgICAtIG51bV9hc3NvY19kYXRhX2VsZW1lbnRzIGFsd2F5cyAwLiAqLworCisgIGlmICgoYml0cyU4KSAhPSAwKSB7CisgICAgYml0cyArPSAoOCAtIChiaXRzJTgpKTsgLyogQWxpZ25tZW50ICovCisgIH0KKworICBiaXRzICs9IDg7ICAgICAgICAgICAgICAgIC8qIENvbW1lbnQgZmllbGQgIGJ5dGVzICovCisKKyAgLyogLSBjb21tZW50X2ZpZWxkX2J5dGVzIGFsd3lzIDAuICovCisKKyAgcmV0dXJuIGJpdHM7Cit9CisjZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworCitzdGF0aWMgdm9pZCB3cml0ZUFvdChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtQnVmZmVyLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpCit7CisgICAgaW50IHRtcCA9IChpbnQpIGFvdDsKKworICAgIGlmICh0bXAgPiAzMSkgeworICAgICAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIEFPVF9FU0NBUEUsIDUgKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCB0bXAtMzIsIDYgKTsgICAvKiBBdWRpb09iamVjdFR5cGUgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHRtcCwgNSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVTYW1wbGVSYXRlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW1CdWZmZXIsIGludCBzYW1wbGVSYXRlKQoreworICBpbnQgc2FtcGxlUmF0ZUluZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoc2FtcGxlUmF0ZSk7CisKKyAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCBzYW1wbGVSYXRlSW5kZXgsIDQgKTsKKyAgaWYoIHNhbXBsZVJhdGVJbmRleCA9PSAxNSApIHsKKyAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHNhbXBsZVJhdGUsIDI0ICk7CisgIH0KK30KKworI2lmZGVmIFRQX0dBX0VOQUJMRQorc3RhdGljCitpbnQgdHJhbnNwb3J0RW5jX3dyaXRlR0FTcGVjaWZpY0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGV4dEZsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgYWxpZ25BbmNob3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGFvdCA9IGNvbmZpZy0+YW90OworICBpbnQgc2FtcGxlc1BlckZyYW1lID0gY29uZmlnLT5zYW1wbGVzUGVyRnJhbWU7CisKKyAgLyogc3RhcnQgb2YgR0FTcGVjaWZpY0NvbmZpZyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zIFN1YnBhcnQgNCwgNC40LjEgKi8KKyAgRkRLd3JpdGVCaXRzKCBhc2MsICgoc2FtcGxlc1BlckZyYW1lPT05NjAgfHwgc2FtcGxlc1BlckZyYW1lPT00ODApPzE6MCksIDEpOyAgLyogZnJhbWVMZW5ndGhGbGFnOiAxIGZvciBhIDk2MC80ODAgKEkpTURDVCwgMCBmb3IgYSAxMDI0LzUxMiAoSSlNRENUKi8KKyAgRkRLd3JpdGVCaXRzKCBhc2MsIDAsIDEpOyAgLyogZGVwZW5kc09uQ29yZUNvZGVyOiBTYW1wbGluZyBSYXRlIENvZGVyIFNwZWNpZmljLCBzZWUgaW4gSVNPL0lFQyAxNDQ5Ni0zIFN1YnBhcnQgNCwgNC40LjEgKi8KKyAgRkRLd3JpdGVCaXRzKCBhc2MsIGV4dEZsZywgMSApOyAvKiBFeHRlbnNpb24gRmxhZzogU2hhbGwgYmUgMSBmb3IgYW90ID0gMTcsMTksMjAsMjEsMjIsMjMgKi8KKworICAvKiBXcml0ZSBQQ0UgaWYgY2hhbm5lbCBjb25maWcgaXMgbm90IDEtNyAqLworICBpZiAoZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlKSA9PSAwKSB7CisgICAgICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoYXNjLCBjb25maWctPmNoYW5uZWxNb2RlLCBjb25maWctPnNhbXBsaW5nUmF0ZSwgMCwgMSwgY29uZmlnLT5tYXRyaXhNaXhkb3duQSwgKGNvbmZpZy0+ZmxhZ3MmQ0NfUFNFVURPX1NVUlJPVU5EKT8xOjAsIGFsaWduQW5jaG9yKTsKKyAgfQorICBpZiAoZXh0RmxnKSB7CisgICAgaWYgKGFvdCA9PSBBT1RfRVJfQlNBQykgeworICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGNvbmZpZy0+QlNBQ251bU9mU3ViRnJhbWUsIDUgKTsgLyogbnVtT2ZTdWJGcmFtZSAqLworICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGNvbmZpZy0+QlNBQ2xheWVyTGVuZ3RoLCAxMSApOyAgLyogbGF5ZXJfbGVuZ3RoICovCisgICAgfQorICAgIGlmICgoYW90ID09IEFPVF9FUl9BQUNfTEMpICAgfHwgKGFvdCA9PSBBT1RfRVJfQUFDX0xUUCkgIHx8CisgICAgICAgIChhb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSB8fCAoYW90ID09IEFPVF9FUl9BQUNfTEQpKQorICAgIHsKKyAgICAgIEZES3dyaXRlQml0cyggYXNjLCAoY29uZmlnLT5mbGFncyAmIENDX1ZDQjExKSA/IDEgOiAwLCAxICk7IC8qIGFhY1NlY3Rpb25EYXRhUmVzaWxsaWVuY2VGbGFnICovCisgICAgICBGREt3cml0ZUJpdHMoIGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19SVkxDKSA/IDEgOiAwLCAgMSApOyAvKiBhYWNTY2FsZUZhY3RvckRhdGFSZXNpbGxpZW5jZUZsYWcgKi8KKyAgICAgIEZES3dyaXRlQml0cyggYXNjLCAoY29uZmlnLT5mbGFncyAmIENDX0hDUikgPyAxIDogMCwgICAxICk7IC8qIGFhY1NwZWN0cmFsRGF0YVJlc2lsbGllbmNlRmxhZyAqLworICAgIH0KKyAgICBGREt3cml0ZUJpdHMoIGFzYywgMCwgMSApOyAvKiBleHRlbnNpb25GbGFnMzogcmVzZXJ2ZWQuIFNoYWxsIGJlICcwJyAqLworICB9CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLworCisjaWZkZWYgVFBfRUxEX0VOQUJMRQorCitzdGF0aWMKK2ludCB0cmFuc3BvcnRFbmNfd3JpdGVFTERTcGVjaWZpY0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBlcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIC8qIEVMRCBzcGVjaWZpYyBjb25maWcgKi8KKyAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV8xXzEpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+c2FtcGxlc1BlckZyYW1lID09IDQ4MCkgPyAxIDogMCwgMSk7CisKKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSApID8gMTowLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19SVkxDICkgPyAxOjAsIDEpOworICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX0hDUiAgKSA/IDE6MCwgMSk7CisKKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpID8gMTowLCAxKTsgLyogU0JSIGhlYWRlciBmbGFnICovCisgIGlmICggKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpICkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPnNhbXBsaW5nUmF0ZSA9PSBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSkgPyAwOjEsIDEpOyAvKiBTYW1wbGVyYXRlIEZsYWcgKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1NCUkNSQykgPyAxOjAsIDEpOyAvKiBTQlIgQ1JDIGZsYWcqLworCisgICAgaWYgKGNiLT5jYlNiciAhPSBOVUxMKSB7CisgICAgICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqcFBjZTsKKyAgICAgIGludCBlOworCisgICAgICBwUGNlID0gZ2V0UGNlRW50cnkoY29uZmlnLT5jaGFubmVsTW9kZSk7CisKKyAgICAgIGZvciAoZT0wOyBlPFBDRV9NQVhfRUxFTUVOVFMgJiYgcFBjZS0+ZWxfbGlzdFtlXSAhPSBJRF9OT05FOyBlKysgICkgeworICAgICAgICBpZiAoIChwUGNlLT5lbF9saXN0W2VdID09IElEX1NDRSkgfHwgKHBQY2UtPmVsX2xpc3RbZV0gPT0gSURfQ1BFKSApIHsKKyAgICAgICAgICBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCAwLCAwLCAwLCBjb25maWctPmFvdCwgcFBjZS0+ZWxfbGlzdFtlXSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsgLyogRUxERVhUX1RFUk0gKi8KKworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCisKKworaW50IHRyYW5zcG9ydEVuY193cml0ZUFTQyAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiCisgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFVJTlQgZXh0RmxhZyA9IDA7CisgIGludCBlcnI7CisgIGludCBlcENvbmZpZyA9IDA7CisKKyAgLyogUmVxdWlyZWQgZm9yIHRoZSBQQ0UuICovCisgIFVJTlQgYWxpZ25BbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYXNjKTsKKworICAvKiBFeHRlbnNpb24gRmxhZzogU2hhbGwgYmUgMSBmb3IgYW90ID0gMTcsMTksMjAsMjEsMjIsMjMsMzkgKi8KKyAgc3dpdGNoIChjb25maWctPmFvdCkgeworICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTFRQOgorICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgIGNhc2UgQU9UX0VSX1RXSU5fVlE6CisgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICBleHRGbGFnID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KQorICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5leHRBT1QpOworICBlbHNlCisgICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmFvdCk7CisKKyAgeworICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgfQorCisgIC8qIFRyeSB0byBndWVzcyBhIHJlYXNvbmFibGUgY2hhbm5lbCBtb2RlIGlmIG5vdCBnaXZlbiAqLworICBpZiAoY29uZmlnLT5jaGFubmVsTW9kZSA9PSBNT0RFX0lOVkFMSUQpIHsKKyAgICBjb25maWctPmNoYW5uZWxNb2RlID0gdHJhbnNwb3J0RW5jX0dldENoYW5uZWxNb2RlKGNvbmZpZy0+bm9DaGFubmVscyk7CisgICAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV9JTlZBTElEKQorICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgRkRLd3JpdGVCaXRzKCBhc2MsIGdldENoYW5uZWxDb25maWcoY29uZmlnLT5jaGFubmVsTW9kZSksIDQgKTsKKworICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KSB7CisgICAgd3JpdGVTYW1wbGVSYXRlKGFzYywgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUpOworICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5hb3QpOworICB9CisKKyAgc3dpdGNoIChjb25maWctPmFvdCkgeworI2lmZGVmIFRQX0dBX0VOQUJMRQorICAgIGNhc2UgQU9UX0FBQ19NQUlOOgorICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9BQUNfU1NSOgorICAgIGNhc2UgQU9UX0FBQ19MVFA6CisgICAgY2FzZSBBT1RfQUFDX1NDQUw6CisgICAgY2FzZSBBT1RfVFdJTl9WUToKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CisgICAgY2FzZSBBT1RfRVJfQUFDX0xUUDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICBjYXNlIEFPVF9FUl9UV0lOX1ZROgorICAgIGNhc2UgQU9UX0VSX0JTQUM6CisgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgZXJyID0gdHJhbnNwb3J0RW5jX3dyaXRlR0FTcGVjaWZpY0NvbmZpZyhhc2MsIGNvbmZpZywgZXh0RmxhZywgYWxpZ25BbmNob3IpOworICAgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLworI2lmZGVmIFRQX0VMRF9FTkFCTEUKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgZXJyID0gdHJhbnNwb3J0RW5jX3dyaXRlRUxEU3BlY2lmaWNDb25maWcoYXNjLCBjb25maWcsIGVwQ29uZmlnLCBjYik7CisgICAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2ggKGNvbmZpZy0+YW90KSB7CisgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MVFA6CisgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgY2FzZSBBT1RfRVJfVFdJTl9WUToKKyAgICBjYXNlIEFPVF9FUl9CU0FDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICBjYXNlIEFPVF9FUl9DRUxQOgorICAgIGNhc2UgQU9UX0VSX0hWWEM6CisgICAgY2FzZSBBT1RfRVJfSElMTjoKKyAgICBjYXNlIEFPVF9FUl9QQVJBOgorICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICBGREt3cml0ZUJpdHMoIGFzYywgMCwgMiApOyAvKiBlcGNvbmZpZyAwICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBiYWNrd2FyZCBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZyBvZiBleHRlbnNpb24gQU9UICovCisgIGlmIChjb25maWctPnNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpCisgIHsKKyAgICBUUF9BU0NfRVhURU5TSU9OX0lEIGFzY0V4dElkID0gQVNDRVhUX1VOS09XTjsKKworICAgIGlmIChjb25maWctPnNiclByZXNlbnQpIHsKKyAgICAgIGFzY0V4dElkPUFTQ0VYVF9TQlI7CisgICAgICBGREt3cml0ZUJpdHMoIGFzYywgYXNjRXh0SWQsIDExICk7CisgICAgICB3cml0ZUFvdChhc2MsIGNvbmZpZy0+ZXh0QU9UKTsKKyAgICAgIEZES3dyaXRlQml0cyggYXNjLCAxLCAxICk7IC8qIHNiclByZXNlbnRGbGFnPTEgKi8KKyAgICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKTsKKyAgICAgIGlmIChjb25maWctPnBzUHJlc2VudCkgeworICAgICAgICBhc2NFeHRJZD1BU0NFWFRfUFM7CisgICAgICAgIEZES3dyaXRlQml0cyggYXNjLCBhc2NFeHRJZCwgMTEgKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIDEsIDEgKTsgLyogcHNQcmVzZW50RmxhZz0xICovCisgICAgICB9CisgICAgfQorCisgIH0KKworICAvKiBNYWtlIHN1cmUgYWxsIGJpdHMgYXJlIHN5bmMnZWQgKi8KKyAgRkRLc3luY0NhY2hlKCBhc2MgKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5oIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmZTdhMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5oCkBAIC0wLDAgKzEsMTQyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IEF1ZGlvIFNwZWNpZmljIENvbmZpZyB3cml0ZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQRU5DX0FTQ19ICisjZGVmaW5lIFRQRU5DX0FTQ19ICisKKy8qKgorICogXGJyaWVmIEdldCBjaGFubmVsIGNvbmZpZyBmcm9tIGNoYW5uZWwgbW9kZS4KKyAqCisgKiBccGFyYW0gY2hhbm5lbF9tb2RlIGNoYW5uZWwgbW9kZQorICoKKyAqIFxyZXR1cm4gY2hhbmVsIGNvbmZpZworICovCitpbnQgZ2V0Q2hhbm5lbENvbmZpZyggQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZSApOworCisvKioKKyAqIFxicmllZiBXcml0ZSBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCisgKgorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGludG8gd2hpY2ggdGhlIFBDRSBpcyBhcHBlbmRlZAorICogXHBhcmFtIGNoYW5uZWxNb2RlIHRoZSBjaGFubmVsIG1vZGUgdG8gYmUgdXNlZAorICogXHBhcmFtIHNhbXBsZVJhdGUgdGhlIHNhbXBsZSByYXRlCisgKiBccGFyYW0gaW5zdGFuY2VUYWdQQ0UgdGhlIGluc3RhbmNlIHRhZyBvZiB0aGUgUHJvZ3JhbSBDb25maWcgRWxlbWVudAorICogXHBhcmFtIHByb2ZpbGUgdGhlIE1QRUcgQXVkaW8gcHJvZmlsZSB0byBiZSB1c2VkCisgKiBccGFyYW0gbWF0cml4IG1peGRvd24gZ2FpbgorICogXHBhcmFtIHBzZXVkbyBzdXJyb3VuZCBpbmRpY2F0aW9uCisgKiBccGFyYW0gcmVmZXJlbmNlIGJpdHN0cmVhbSBwb3NpdGlvbiBmb3IgYWxpZ25tZW50CisgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqLworaW50IHRyYW5zcG9ydEVuY193cml0ZVBDRSgKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDSEFOTkVMX01PREUgICAgICAgICBjaGFubmVsTW9kZSwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zdGFuY2VUYWdQQ0UsCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHByb2ZpbGUsCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25BLAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBwc2V1ZG9TdXJyb3VuZEVuYWJsZSwKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBiaXQgY291bnQgcmVxdWlyZWQgYnkgYSBQcm9ncmFtIENvbmZpZyBFbGVtZW50CisgKgorICogXHBhcmFtIGNoYW5uZWxNb2RlIHRoZSBjaGFubmVsIG1vZGUgdG8gYmUgdXNlZAorICogXHBhcmFtIG1hdHJpeCBtaXhkb3duIGdhaW4KKyAqIFxwYXJhbSBiaXQgb2Zmc2V0IGF0IHdoaWNoIHRoZSBQQ0Ugd291bGQgc3RhcnQKKyAqIFxyZXR1cm4gdGhlIGFtb3VudCBvZiBiaXRzIHJlcXVpcmVkIGZvciB0aGUgUENFIGluY2x1ZGluZyB0aGUgZ2l2ZW4gYml0IG9mZnNldC4KKyAqLworaW50IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKAorICAgICAgICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgIGludCAgICAgICAgICBtYXRyaXhNaXhkb3duQSwKKyAgICAgICAgaW50ICAgICAgICAgIGJpdHMKKyAgICAgICAgKTsKKworI2VuZGlmIC8qIFRQRU5DX0FTQ19IICovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNTFlZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwCkBAIC0wLDAgKzEsODgyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0cGVuY19sYXRtLmgiCisKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKK3N0YXRpYyBjb25zdCBzaG9ydCBjZWxwRnJhbWVMZW5ndGhUYWJsZVs2NF0gPSB7CisgMTU0LCAxNzAsIDE4NiwgMTQ3LCAxNTYsIDE2NSwgMTE0LCAxMjAsCisgMTg2LCAxMjYsIDEzMiwgMTM4LCAxNDIsIDE0NiwgMTU0LCAxNjYsCisgMTc0LCAxODIsIDE5MCwgMTk4LCAyMDYsIDIxMCwgMjE0LCAxMTAsCisgMTE0LCAxMTgsIDEyMCwgMTIyLCAyMTgsIDIzMCwgMjQyLCAyNTQsCisgMjY2LCAyNzgsIDI4NiwgMjk0LCAzMTgsIDM0MiwgMzU4LCAzNzQsCisgMzkwLCA0MDYsIDQyMiwgMTM2LCAxNDIsIDE0OCwgMTU0LCAxNjAsCisgMTY2LCAxNzAsIDE3NCwgMTg2LCAxOTgsIDIwNiwgMjE0LCAyMjIsCisgMjMwLCAyMzgsIDIxNiwgMTYwLCAyODAsIDMzOCwgMCwgICAwCit9OworCisvKioqKioqKgorIHdyaXRlIHZhbHVlIHRvIHRyYW5zcG9ydCBzdHJlYW0KKyBmaXJzdCB0d28gYml0cyBkZWZpbmUgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGl0c2VsZgorIHRoZW4gdGhlIHZhbHVlIGl0c2VsZiwgd2l0aCBhIHNpemUgb2YgMC0zIGJ5dGVzCisqKioqKioqLworc3RhdGljCitVSU5UIHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCB2YWx1ZSkKK3sKKyAgVUNIQVIgdmFsdWVCeXRlcyA9IDQ7CisgIHVuc2lnbmVkIGludCBiaXRzV3JpdHRlbiA9IDA7CisgIGludCBpOworCisgIGlmICggdmFsdWUgPCAoMTw8OCkgKSB7CisgICAgdmFsdWVCeXRlcyA9IDE7CisgIH0gZWxzZSBpZiAoIHZhbHVlIDwgKDE8PDE2KSApIHsKKyAgICB2YWx1ZUJ5dGVzID0gMjsKKyAgfSBlbHNlIGlmICggdmFsdWUgPCAoMTw8MjQpICkgeworICAgIHZhbHVlQnl0ZXMgPSAzOworICB9IGVsc2UgeworICAgIHZhbHVlQnl0ZXMgPSA0OworICB9CisKKyAgRkRLd3JpdGVCaXRzKGhCcywgdmFsdWVCeXRlcy0xLCAyICk7IC8qIHNpemUgb2YgdmFsdWUgaW4gQnl0ZXMgKi8KKyAgZm9yIChpPTA7IGk8dmFsdWVCeXRlczsgaSsrKSB7CisgICAgLyogd3JpdGUgbW9zdCBzaWduaWZpY2FudCBCeXRlIGZpcnN0ICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgKFVDSEFSKSh2YWx1ZT4+KCh2YWx1ZUJ5dGVzLTEtaSk8PDMpKSwgOCk7CisgIH0KKworICBiaXRzV3JpdHRlbiA9ICh2YWx1ZUJ5dGVzPDwzKSsyOworCisgIHJldHVybiBiaXRzV3JpdHRlbjsKK30KKworc3RhdGljCitVSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRGaXhCaXREZW1hbmRIZWFkZXIgKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcyApCit7CisgIGludCBiaXREZW1hbmQgPSAwOworICBpbnQgaW5zZXJ0U2V0dXBEYXRhID0gMCA7CisKKyAgLyogb25seSBpZiBzdGFydCBvZiBuZXcgbGF0bSBmcmFtZSAqLworICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQ9PTApCisgIHsKKyAgICAvKiBBdWRpb1N5bmNTdHJlYW0gKi8KKworICAgIGlmIChoQXNzLT50dCA9PSBUVF9NUDRfTE9BUykgeworICAgICAgYml0RGVtYW5kICs9IDExIDsgICAgICAgICAgICAgLyogc3luY3dvcmQgKi8KKyAgICAgIGJpdERlbWFuZCArPSAxMyA7ICAgICAgICAgICAgIC8qIGF1ZGlvTXV4TGVuZ3RoQnl0ZXMgKi8KKyAgICB9CisKKyAgICAvKiBBdWRpb011eEVsZW1lbnQqLworCisgICAgLyogQXVkaW9NdXhFbGVtZW50OjpTdHJlYW0gTXV4IENvbmZpZyAqLworICAgIGlmIChoQXNzLT5tdXhDb25maWdQZXJpb2QgPiAwKSB7CisgICAgICBpbnNlcnRTZXR1cERhdGEgPSAoaEFzcy0+bGF0bUZyYW1lQ291bnRlciA9PSAwKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5zZXJ0U2V0dXBEYXRhID0gMDsKKyAgICB9CisKKyAgICBpZiAoaEFzcy0+dHQgIT0gVFRfTVA0X0xBVE1fTUNQMCkgeworICAgICAgLyogQXVkaW9NdXhFbGVtZW50Ojp1c2VTYW1lU3RyZWFtTXV4IEZsYWcgKi8KKyAgICAgIGJpdERlbWFuZCs9MTsKKworICAgICAgaWYoIGluc2VydFNldHVwRGF0YSApIHsKKyAgICAgICAgYml0RGVtYW5kICs9IGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHM7CisgICAgICB9CisgICAgfQorCisgICAgLyogQXVkaW9NdXhFbGVtZW50OjpvdGhlckRhdGFCaXRzICovCisgICAgYml0RGVtYW5kICs9IDgqaEFzcy0+b3RoZXJEYXRhTGVuQnl0ZXM7CisKKyAgICAvKiBBdWRpb011eEVsZW1lbnQ6OkJ5dGVBbGlnbiAqLworICAgIGlmICggYml0RGVtYW5kICUgOCApIHsKKyAgICAgICBoQXNzLT5maWxsQml0cyA9IDggLSAoYml0RGVtYW5kICUgOCk7CisgICAgICAgYml0RGVtYW5kICs9IGhBc3MtPmZpbGxCaXRzIDsKKyAgICB9IGVsc2UgeworICAgICAgaEFzcy0+ZmlsbEJpdHMgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBiaXREZW1hbmQgOworfQorCitzdGF0aWMKK1VJTlQgdHJhbnNwb3J0RW5jX0xhdG1Db3VudFZhckJpdERlbWFuZEhlYWRlciAoIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzICwgdW5zaWduZWQgaW50IHN0cmVhbURhdGFMZW5ndGggKQoreworICBpbnQgYml0RGVtYW5kID0gMDsKKyAgaW50ICBwcm9nLCBsYXllcjsKKworICAvKiBQYXlsb2FkIExlbmd0aCBJbmZvKi8KKyAgaWYoIGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgKSB7CisgICAgZm9yKCBwcm9nPTA7IHByb2c8aEFzcy0+bm9Qcm9ncmFtOyBwcm9nKysgKSB7CisgICAgICBmb3IoIGxheWVyPTA7IGxheWVyPExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKyApIHsKKyAgICAgICAgTEFUTV9MQVlFUl9JTkZPICpwX2xpbmZvID0gJihoQXNzLT5tX2xpbmZvW3Byb2ddW2xheWVyXSk7CisKKyAgICAgICAgaWYoIHBfbGluZm8tPnN0cmVhbUlEID49IDAgKSB7CisgICAgICAgICAgc3dpdGNoKCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKCBzdHJlYW1EYXRhTGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSBiaXREZW1hbmQgOworICAgICAgICAgICAgICB3aGlsZSggc3RyZWFtRGF0YUxlbmd0aCA+PSAoMjU1PDwzKSApIHsKKyAgICAgICAgICAgICAgICBiaXREZW1hbmQrPTg7CisgICAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSAoMjU1PDwzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBiaXREZW1hbmQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiB0aGVyZSBhcmUgbWFueSBwb3NzaWJpbGl0aWVzIHRvIHVzZSB0aGlzIG1lY2hhbmlzbS4gICovCisgICAgc3dpdGNoKCBoQXNzLT52YXJNb2RlICkgeworICAgIGNhc2UgTEFUTVZBUl9TSU1QTEVfU0VRVUVOQ0U6IHsKKyAgICAgIC8qIFVzZSB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBlbmNvZGVyICovCisgICAgICAvL2ludCBzdHJlYW1DbnRQb3NpdGlvbiA9IHRyYW5zcG9ydEVuY19TZXRXcml0ZVBvaW50ZXIoIGhBc3MtPmhBc3NlbWJsZSwgMCApOworICAgICAgLy9pbnQgc3RyZWFtQ250UG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoIGhBc3MtPmhBc3NlbWJsZSApOworICAgICAgYml0RGVtYW5kKz00OworCisgICAgICBoQXNzLT52YXJTdHJlYW1DbnQgPSAwOworICAgICAgZm9yKCBwcm9nPTA7IHByb2c8aEFzcy0+bm9Qcm9ncmFtOyBwcm9nKysgKSB7CisgICAgICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkgeworICAgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICYoaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0pOworCisgICAgICAgICAgaWYoIHBfbGluZm8tPnN0cmVhbUlEID49IDAgKSB7CisKKyAgICAgICAgICAgIGJpdERlbWFuZCs9NDsgLyogc3RyZWFtSUQgKi8KKyAgICAgICAgICAgIHN3aXRjaCggcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlICkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09IGJpdERlbWFuZCA7CisgICAgICAgICAgICAgIHdoaWxlKCBzdHJlYW1EYXRhTGVuZ3RoID49ICgyNTU8PDMpICkgeworICAgICAgICAgICAgICAgIGJpdERlbWFuZCs9ODsKKyAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09ICgyNTU8PDMpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAvKmJpdERlbWFuZCArPSAxOyBlbmRGbGFnCisgICAgICAgICAgICAgIGJyZWFrOyovCisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgNjoKKworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuICAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEFzcy0+dmFyU3RyZWFtQ250Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBiaXREZW1hbmQrPTQ7CisgICAgICAvL3RyYW5zcG9ydEVuY19VcGRhdGVCaXRzdHJlYW1GaWVsZCggaEFzcy0+aEFzc2VtYmxlLCBzdHJlYW1DbnRQb3NpdGlvbiwgaEFzcy0+dmFyU3RyZWFtQ250LTEsIDQgKTsKKyAgICAgIC8vVUlOVCBwb3MgPSBzdHJlYW1DbnRQb3NpdGlvbi1GREtnZXRWYWxpZEJpdHMoaEFzcy0+aEFzc2VtYmxlKTsKKyAgICAgIC8vRkRLcHVzaEJhY2soIGhBc3MtPmhBc3NlbWJsZSwgIHBvcyk7CisgICAgICAvL0ZES3dyaXRlQml0cyggaEFzcy0+aEFzc2VtYmxlLCBoQXNzLT52YXJTdHJlYW1DbnQtMSwgNCk7CisgICAgICAvL0ZES3B1c2hGb3IoIGhBc3MtPmhBc3NlbWJsZSwgcG9zLTQpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJpdERlbWFuZCA7Cit9CisKK1RSQU5TUE9SVEVOQ19FUlJPUgorQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKKyAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSU5UIHN0cmVhbUlEY250LCB0bXA7CisgIGludCBsYXllciwgcHJvZzsKKworICBVU0hPUlQgY29yZUZyYW1lT2Zmc2V0PTA7CisKKyAgaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSAgICA9IDA7IC8qIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLworICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzID0gMDsKKworICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YXVkaW9NdXhWZXJzaW9uLCAxICk7ICAgICAgICAgICAgICAgICAgIC8qIGF1ZGlvTXV4VmVyc2lvbiAqLworICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDE7CisKKyAgaWYgKCBoQXNzLT5hdWRpb011eFZlcnNpb24gPT0gMSApIHsKKyAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSwgMSApOyAgICAgICAgICAgICAgICAvKiBhdWRpb011eFZlcnNpb25BICovCisgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTsKKyAgfQorCisgIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSA9PSAwICkKKyAgeworICAgIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEgKSB7CisgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0gdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKCBoQnMsIGhBc3MtPnRhcmFCdWZmZXJGdWxsbmVzcyApOy8qIHRhcmFCdWZmZXJGdWxsbmVzcyAqLworICAgIH0KKyAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA/IDE6MCwgMSApOyAvKiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICovCisgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPm5vU3ViZnJhbWVzLTEsIDYgKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFN1YmZyYW1lcyAqLworICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5ub1Byb2dyYW0tMSwgNCApOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQcm9ncmFtcyAqLworCisgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTE7CisKKyAgICBzdHJlYW1JRGNudCA9IDA7CisgICAgZm9yKCBwcm9nPTA7IHByb2c8aEFzcy0+bm9Qcm9ncmFtOyBwcm9nKysgKSB7CisgICAgICBpbnQgdHJhbnNMYXllciA9IDA7CisKKyAgICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5ub0xheWVyW3Byb2ddLTEsIDMgKTsKKyAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTM7CisKKyAgICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkgeworICAgICAgICBMQVRNX0xBWUVSX0lORk8gICAqcF9saW5mbyA9ICYoaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0pOworICAgICAgICBDT0RFUl9DT05GSUcgKnBfbGNpICAgPSBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdOworCisgICAgICAgIHBfbGluZm8tPnN0cmVhbUlEID0gLTE7CisKKyAgICAgICAgaWYoIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0gIT0gTlVMTCApIHsKKyAgICAgICAgICBpbnQgdXNlU2FtZUNvbmZpZyA9IDA7CisKKyAgICAgICAgICBpZiggdHJhbnNMYXllciA+IDAgKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgdXNlU2FtZUNvbmZpZyA/IDEgOiAwLCAxICk7CisgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiggKHVzZVNhbWVDb25maWcgPT0gMCkgfHwgKHRyYW5zTGF5ZXI9PTApICkgeworICAgICAgICAgICAgVUlOVCBiaXRzOworCisgICAgICAgICAgICBpZiAoIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiA9PSAxICkgeworICAgICAgICAgICAgICBGREtwdXNoRm9yKGhCcywgMik7IC8qIGFsaWduIHRvIEFTQywgZXZlbiBpZiB3ZSBkbyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSAiYXNjTGVuIiBmaWVsZCB5ZXQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0cyA9IEZES2dldFZhbGlkQml0cyggaEJzICk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydEVuY193cml0ZUFTQygKKyAgICAgICAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICAgICAgICBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLAorICAgICAgICAgICAgICAgICAgICBjYgorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBiaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCBoQnMgKSAtIGJpdHM7CisKKyAgICAgICAgICAgIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEgKSB7CisgICAgICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywgYml0cysyKTsKKyAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSB0cmFuc3BvcnRFbmNfTGF0bVdyaXRlVmFsdWUoIGhCcywgYml0cyApOworICAgICAgICAgICAgICB0cmFuc3BvcnRFbmNfd3JpdGVBU0MoCisgICAgICAgICAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICAgICAgICAgIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0sCisgICAgICAgICAgICAgICAgICAgICAgY2IKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IGJpdHM7IC8qIGFkZCBhc2MgbGVuZ3RoIHRvIHNtYyBzdW1tYXJ5ICovCisgICAgICAgICAgfQorICAgICAgICAgIHRyYW5zTGF5ZXIrKzsKKworICAgICAgICAgIGlmKCAhaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyApIHsKKyAgICAgICAgICAgIGlmKCBzdHJlYW1JRGNudCA+PSBMQVRNX01BWF9TVFJFQU1fSUQgKQorICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIH0KKyAgICAgICAgICBwX2xpbmZvLT5zdHJlYW1JRCA9IHN0cmVhbUlEY250Kys7CisKKyAgICAgICAgICBzd2l0Y2goIHBfbGNpLT5hb3QgKSB7CisgICAgICAgICAgY2FzZSBBT1RfQUFDX01BSU4gICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfQUFDX0xDICAgICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfQUFDX1NTUiAgICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfQUFDX0xUUCAgICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfQUFDX1NDQUwgICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEICAgICA6CisgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRCAgICA6CisgICAgICAgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgICAgICBjYXNlIEFPVF9SU1ZENTA6CisgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSAwOworCisgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCisgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgYnVmZmVyRnVsbG5lc3MsIDggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXJGdWxsbmVzcyAqLworICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTE7CisKKyAgICAgICAgICAgIGlmICggIWhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgKSB7CisgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqcF9sY2lfcHJldiA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllci0xXTsKKyAgICAgICAgICAgICAgaWYgKCAoKHBfbGNpLT5hb3QgPT0gQU9UX0FBQ19TQ0FMKSB8fCAocF9sY2ktPmFvdCA9PSBBT1RfRVJfQUFDX1NDQUwpKSAmJgorICAgICAgICAgICAgICAgICAgICgocF9sY2lfcHJldi0+YW90ID09IEFPVF9DRUxQKSB8fCAocF9sY2lfcHJldi0+YW90ID09IEFPVF9FUl9DRUxQKSkgKSB7CisgICAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGNvcmVGcmFtZU9mZnNldCwgNiApOyAgICAgICAgICAgICAgICAgICAgICAvKiBjb3JlRnJhbWVPZmZzZXQgKi8KKyAgICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz02OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQU9UX1RXSU5fVlE6CisgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSAxOworICAgICAgICAgICAgdG1wID0gKCAocF9sY2ktPmJpdHNGcmFtZSs3KSA+PiAzICkgLSAyMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNtaXNzaW9uIGZyYW1lIGxlbmd0aCBpbiBieXRlcyAqLworICAgICAgICAgICAgaWYoICh0bXAgPCAwKSApIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1RSQU5TTUlTU0lPTl9GUkFNRV9MRU5HVEg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgIC8qIGZyYW1lTGVuZ3RoVHlwZSAqLworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIHRtcCwgOSApOworICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTI7CisKKyAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoQml0cyA9ICh0bXArMjApIDw8IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQU9UX0NFTFA6CisgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSA0OworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwgMyApOyAgICAgICAgICAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KKyAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTM7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw2MjsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBjZWxwRnJhbWVMZW5ndGhUYWJsZVtpXSA9PSBwX2xjaS0+Yml0c0ZyYW1lICkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKCBpPj02MiApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQ0VMUF9GUkFNRV9MRU5HVEg7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgaSwgNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0VMUGZyYW1lTGVuZ3RoVGFiZWxJbmRleCAqLworICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz02OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gcF9sY2ktPmJpdHNGcmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBBT1RfSFZYQzoKKyAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDY7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgIC8qIGZyYW1lTGVuZ3RoVHlwZSAqLworICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MzsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgaWYoIHBfbGNpLT5iaXRzRnJhbWUgPT0gNDAgKSB7CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiggcF9sY2ktPmJpdHNGcmFtZSA9PSA4MCApIHsKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfRlJBTUVfQklUUzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgaSwgMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSFZYQ2ZyYW1lTGVuZ3RoVGFibGVJbmRleCAqLworICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gcF9sY2ktPmJpdHNGcmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBBT1RfTlVMTF9PQkpFQ1Q6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BT1Q7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgRkRLd3JpdGVCaXRzKCBoQnMsIChoQXNzLT5vdGhlckRhdGFMZW5CeXRlcz4wKSA/IDE6MCwgMSApOyAgICAgIC8qIG90aGVyRGF0YVByZXNlbnQgKi8KKyAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOworCisgICAgaWYoIGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzID4gMCApIHsKKworICAgICAgSU5UIG90aGVyRGF0YUxlblRtcCA9IGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzOworICAgICAgSU5UIGVzY0NudCA9IDA7CisgICAgICBJTlQgb3RoZXJEYXRhTGVuRXNjID0gMTsKKworICAgICAgd2hpbGUob3RoZXJEYXRhTGVuVG1wKSB7CisgICAgICAgIG90aGVyRGF0YUxlblRtcCA+Pj0gODsKKyAgICAgICAgZXNjQ250ICsrOworICAgICAgfQorCisgICAgICBkbyB7CisgICAgICAgIG90aGVyRGF0YUxlblRtcCA9IChoQXNzLT5vdGhlckRhdGFMZW5CeXRlcz4+KGVzY0NudCo4KSkgJiAweEZGOworICAgICAgICBlc2NDbnQtLTsKKyAgICAgICAgb3RoZXJEYXRhTGVuRXNjID0gZXNjQ250PjA7CisKKyAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIG90aGVyRGF0YUxlbkVzYywgMSApOworICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgb3RoZXJEYXRhTGVuVG1wLCA4ICk7CisgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTk7CisgICAgICB9IHdoaWxlKG90aGVyRGF0YUxlbkVzYyk7CisgICAgfQorCisgICAgeworICAgICAgVVNIT1JUIGNyY0NoZWNrUHJlc2VudD0wOworICAgICAgVVNIT1JUIGNyY0NoZWNrU3VtPTA7CisKKyAgICAgIEZES3dyaXRlQml0cyggaEJzLCBjcmNDaGVja1ByZXNlbnQsIDEgKTsgICAgICAgICAgICAgICAvKiBjcmNDaGVja1ByZXNlbnQgKi8KKyAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7CisgICAgICBpZiAoIGNyY0NoZWNrUHJlc2VudCApeworICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgY3JjQ2hlY2tTdW0sIDggKTsgICAgICAgICAgICAgICAgIC8qIGNyY0NoZWNrU3VtICovCisgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTg7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7ICAvKiBpZiAoIGF1ZGlvTXV4VmVyc2lvbkEgPT0gMCApICovCisKKyAgICAvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KKworICB9CisKKyAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKK30KKworCitzdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SCitXcml0ZUF1UGF5bG9hZExlbmd0aEluZm8oIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGludCBBdUxlbmd0aEJpdHMgKQoreworICBpbnQgcmVzdEJ5dGVzOworCisgIGlmKCBBdUxlbmd0aEJpdHMgJSA4ICkKKyAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIOworCisgIHdoaWxlKCBBdUxlbmd0aEJpdHMgPj0gMjU1KjggKSB7CisgICAgRkRLd3JpdGVCaXRzKCBoQml0U3RyZWFtLCAyNTUsIDggKTsgIC8qIDI1NSBzaG93cyBpbmNvbXBsZXRlIEFVICovCisgICAgQXVMZW5ndGhCaXRzIC09ICgyNTUqOCk7CisgIH0KKworICByZXN0Qnl0ZXMgPSAoQXVMZW5ndGhCaXRzKSA+PiAzOworICBGREt3cml0ZUJpdHMoIGhCaXRTdHJlYW0sIHJlc3RCeXRlcywgOCApOworCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKK3N0YXRpYworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtU2V0TnJPZlN1YmZyYW1lcyggSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9TdWJmcmFtZXNfbmV4dCkgICAgLyogbnIgb2YgYWNjZXNzIHVuaXRzIC8gcGF5bG9hZHMgd2l0aGluIGEgbGF0bSBmcmFtZSAqLworeworICAvKiBzYW5pdHkgY2hrICovCisgIGlmIChub1N1YmZyYW1lc19uZXh0IDwgMSB8fCBub1N1YmZyYW1lc19uZXh0ID4gTUFYX05SX09GX1NVQkZSQU1FUykgeworICAgIHJldHVybiBUUkFOU1BPUlRFTkNfTEFUTV9JTlZBTElEX05SX09GX1NVQkZSQU1FUzsKKyAgfQorCisgIGhBc3MtPm5vU3ViZnJhbWVzX25leHQgPSBub1N1YmZyYW1lc19uZXh0OworCisgIC8qIGlmIGF0IHN0YXJ0IHRoZW4gd2UgY2FuIHRha2Ugb3ZlciB0aGUgdmFsdWUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBuZXh0IFNNQyAqLworICBpZiAoIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSAmJiAoaEFzcy0+bGF0bUZyYW1lQ291bnRlciA9PSAwKSApIHsKKyAgICBoQXNzLT5ub1N1YmZyYW1lcyA9IG5vU3ViZnJhbWVzX25leHQ7CisgIH0KKworICByZXR1cm4gVFJBTlNQT1JURU5DX09LOworfQorCitzdGF0aWMKK2ludCBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgVUNIQVIgbm9Qcm9ncmFtLCBVQ0hBUiBub0xheWVyW10gLyogcmV0dXJuICovICkKK3sKKyAgaW50IHByb2csIGxheWVyOworCisgIHNpZ25lZCBpbnQgbGFzdE5vU2FtcGxlcyAgID0gLTE7CisgIHNpZ25lZCBpbnQgbWluRnJhbWVTYW1wbGVzID0gRkRLX0lOVF9NQVg7CisgIHNpZ25lZCBpbnQgbWF4RnJhbWVTYW1wbGVzID0gMDsKKworICBzaWduZWQgaW50IGhpZ2hlc3RTYW1wbGluZ1JhdGUgPSAtMTsKKworICBmb3IoIHByb2c9MDsgcHJvZzxub1Byb2dyYW07IHByb2crKyApIHsKKyAgICBub0xheWVyW3Byb2ddID0gMDsKKworICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkKKyAgICB7CisgICAgICBpZiggaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgSU5UIGhzZlNhbXBsZXNGcmFtZTsKKworICAgICAgICBub0xheWVyW3Byb2ddKys7CisKKyAgICAgICAgaWYoIGhpZ2hlc3RTYW1wbGluZ1JhdGUgPCAwICkKKyAgICAgICAgICBoaWdoZXN0U2FtcGxpbmdSYXRlID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXS0+c2FtcGxpbmdSYXRlOworCisgICAgICAgIGhzZlNhbXBsZXNGcmFtZSA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0tPnNhbXBsZXNQZXJGcmFtZSAgKiBoaWdoZXN0U2FtcGxpbmdSYXRlIC8gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXS0+c2FtcGxpbmdSYXRlOworCisgICAgICAgIGlmKCBoc2ZTYW1wbGVzRnJhbWUgPD0gbWluRnJhbWVTYW1wbGVzICkgbWluRnJhbWVTYW1wbGVzID0gaHNmU2FtcGxlc0ZyYW1lOworICAgICAgICBpZiggaHNmU2FtcGxlc0ZyYW1lID49IG1heEZyYW1lU2FtcGxlcyApIG1heEZyYW1lU2FtcGxlcyA9IGhzZlNhbXBsZXNGcmFtZTsKKworICAgICAgICBpZiggbGFzdE5vU2FtcGxlcyA9PSAtMSApIHsKKyAgICAgICAgICBsYXN0Tm9TYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhzZlNhbXBsZXNGcmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiggaHNmU2FtcGxlc0ZyYW1lICE9IGxhc3ROb1NhbXBsZXMgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIExBVE0vTE9BUyBTdHJlYW0gYW5kIGFkZCBsYXllciAwIGF0IHByb2dyYW0gMC4KKyAqLworc3RhdGljCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXRMYXRtU3RyZWFtKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmcmFjdERlbGF5UHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBpbnQgICAgICAgICBtdXhDb25maWdQZXJpb2QsIC8qIGluc2VydCBzZXR1cCBkYXRhIGV2ZXJ5IG11eENvbmZpZ1BlcmlvZCBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICBhdWRpb011eFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgICAgdHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKKworICBpZiAoaEFzcyA9PSBOVUxMKQorICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgaEFzcy0+dHQgPSB0dDsKKworICBoQXNzLT5ub1Byb2dyYW0gPSAxOworCisgIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiA9IGF1ZGlvTXV4VmVyc2lvbjsKKworICAvKiBGaWxsIG5vTGF5ZXIgYXJyYXkgdXNpbmcgaEFzcy0+Y29uZmlnICovCisgIGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPSBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKCBoQXNzLCBoQXNzLT5ub1Byb2dyYW0sIGhBc3MtPm5vTGF5ZXIgKTsKKyAgLyogT25seSBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nPT0xIGlzIHN1cHBvcnRlZCAqLworICBGREtfQVNTRVJUKGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcpOworCisgIGhBc3MtPmZyYWN0RGVsYXlQcmVzZW50ID0gZnJhY3REZWxheVByZXNlbnQ7CisgIGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzID0gMDsKKworICBoQXNzLT52YXJNb2RlID0gTEFUTVZBUl9TSU1QTEVfU0VRVUVOQ0U7CisKKyAgLyogaW5pdGlhbGl6ZSBjb3VudGVycyAqLworICBoQXNzLT5zdWJGcmFtZUNudCAgICAgICAgICAgICAgICAgID0gMDsKKyAgaEFzcy0+bm9TdWJmcmFtZXMgICAgICAgICAgICAgICAgICA9IERFRkFVTFRfTEFUTV9OUl9PRl9TVUJGUkFNRVM7CisgIGhBc3MtPm5vU3ViZnJhbWVzX25leHQgICAgICAgICAgICAgPSBERUZBVUxUX0xBVE1fTlJfT0ZfU1VCRlJBTUVTOworCisgIC8qIHN5bmMgbGF5ZXIgcmVsYXRlZCAqLworICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzICAgICA9IDA7CisKKyAgaEFzcy0+bGF0bUZyYW1lQ291bnRlciAgICAgICAgPSAwOworICBoQXNzLT5tdXhDb25maWdQZXJpb2QgPSBtdXhDb25maWdQZXJpb2Q7CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisKKy8qKgorICoKKyAqLworVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIgKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcyAsIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoICkKK3sKKyAgVUlOVCBiaXREZW1hbmQgPSAwOworCisgIHN3aXRjaCAoaEFzcy0+dHQpIHsKKyAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKKyAgICAgIGJpdERlbWFuZCAgPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50Rml4Qml0RGVtYW5kSGVhZGVyICggaEFzcyApOworICAgIH0KKyAgICBiaXREZW1hbmQgKz0gdHJhbnNwb3J0RW5jX0xhdG1Db3VudFZhckJpdERlbWFuZEhlYWRlciAoIGhBc3MgLCBzdHJlYW1EYXRhTGVuZ3RoIC8qLSBiaXREZW1hbmQqLyk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gYml0RGVtYW5kOworfQorCitzdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SCitBZHZhbmNlQXVkaW9NdXhFbGVtZW50ICgKKyAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICAgaEFzcywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBhdUJpdHMsCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICBDU1RwQ2FsbEJhY2tzICAgICpjYgorICAgICAgICApCit7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKKyAgaW50IGluc2VydE11eFNldHVwOworCisgIC8qIEluc2VydCBzZXR1cCBkYXRhIHRvIGFzc2VtYmxlIEJ1ZmZlciAqLworICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkKKyAgeworICAgIGlmIChoQXNzLT5tdXhDb25maWdQZXJpb2QgPiAwKSB7CisgICAgICBpbnNlcnRNdXhTZXR1cCA9IChoQXNzLT5sYXRtRnJhbWVDb3VudGVyID09IDApOworICAgIH0gZWxzZSAgeworICAgICAgaW5zZXJ0TXV4U2V0dXAgPSAwOworICAgIH0KKworICAgIGlmIChoQXNzLT50dCAhPSBUVF9NUDRfTEFUTV9NQ1AwKSB7CisgICAgICBpZiggaW5zZXJ0TXV4U2V0dXAgKSB7CisgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCAwLCAxICk7ICAvKiB1c2VTYW1lU3RyZWFtTXV4IHVzZU5ld1N0cmVhbU11eCAqLworICAgICAgICBDcmVhdGVTdHJlYW1NdXhDb25maWcoaEFzcywgaEJzLCBidWZmZXJGdWxsbmVzcywgY2IpOworICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKQorICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCAxLCAxICk7ICAgLyogdXNlU2FtZVN0cmVhbU11eCAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFBheWxvYWRMZW5ndGhJbmZvICovCisgIHsKKyAgICBpbnQgcHJvZywgbGF5ZXI7CisKKyAgICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgaEFzcy0+bm9Qcm9ncmFtOyBwcm9nKyspIHsKKyAgICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IGhBc3MtPm5vTGF5ZXJbcHJvZ107IGxheWVyKyspIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBXcml0ZUF1UGF5bG9hZExlbmd0aEluZm8oIGhCcywgYXVCaXRzICk7CisgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spCisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBBdCB0aGlzIHBvaW50IGNvbWVzIHRoZSBhY2Nlc3MgdW5pdC4gKi8KKworICByZXR1cm4gVFJBTlNQT1JURU5DX09LOworfQorCitUUkFOU1BPUlRFTkNfRVJST1IKK3RyYW5zcG9ydEVuY19MYXRtV3JpdGUgKAorICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gICAgaEFzcywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGF1Qml0cywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICBDU1RwQ2FsbEJhY2tzICAgICAqY2IKKyAgICAgICAgKQoreworICBUUkFOU1BPUlRFTkNfRVJST1IgRXJyb3JTdGF0dXM7CisKKyAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKKyAgICAvKiBTdGFydCBuZXcgZnJhbWUgKi8KKyAgICBGREtyZXNldEJpdGJ1ZmZlcihoQnMsIEJTX1dSSVRFUik7CisgIH0KKworICBoQXNzLT5sYXRtU3ViZnJhbWVTdGFydCA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgIC8qIEluc2VydCBzeW5jd29yZCBhbmQgc3luY3dvcmQgZGlzdGFuY2UKKyAgICAgLSBvbmx5IGlmIGxvYXMKKyAgICAgLSB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3luY3dvcmQgZGlzdGFuY2UgKD1hdWRpb211eGxlbmd0aGJ5dGVzKSBsYXRlcgorICAgKi8KKyAgaWYoIGhBc3MtPnR0ID09IFRUX01QNF9MT0FTICYmIGhBc3MtPnN1YkZyYW1lQ250ID09IDApCisgIHsKKyAgICAvKiBTdGFydCBuZXcgTE9BUyBmcmFtZSAqLworICAgIEZES3dyaXRlQml0cyggaEJzLCAweDJCNywgMTEgKTsKKyAgICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzID0gMDsKKyAgICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzUG9zID0gRkRLZ2V0VmFsaWRCaXRzKCBoQnMgKTsgIC8qIHN0b3JlIHJlYWQgcG9pbnRlciBwb3NpdGlvbiAqLworICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzLCAxMyApOworICB9CisKKyAgRXJyb3JTdGF0dXMgPSBBZHZhbmNlQXVkaW9NdXhFbGVtZW50KAorICAgICAgICAgIGhBc3MsCisgICAgICAgICAgaEJzLAorICAgICAgICAgIGF1Qml0cywKKyAgICAgICAgICBidWZmZXJGdWxsbmVzcywKKyAgICAgICAgICBjYgorICAgICAgICAgICk7CisKKyAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKKyAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCit2b2lkIHRyYW5zcG9ydEVuY19MYXRtQWRqdXN0U3ViZnJhbWVCaXRzKEhBTkRMRV9MQVRNX1NUUkVBTSAgICBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqYml0cykKK3sKKyAgLyogU3Vic3RyYWN0IGJpdHMgZnJvbSBwb3NzaWJsZSBwcmV2aW91cyBzdWJmcmFtZSAqLworICAqYml0cyAtPSBoQXNzLT5sYXRtU3ViZnJhbWVTdGFydDsKKyAgLyogQWRkIGZpbGwgYml0cyAqLworICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkKKyAgICAqYml0cyArPSBoQXNzLT5maWxsQml0czsKK30KKworCit2b2lkIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqYnl0ZXMpCit7CisKKyAgaEFzcy0+c3ViRnJhbWVDbnQrKzsKKyAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID49IGhBc3MtPm5vU3ViZnJhbWVzKQorICB7CisKKyAgICAvKiBBZGQgTE9BUyBmcmFtZSBsZW5ndGggaWYgcmVxdWlyZWQuICovCisgICAgaWYgKGhBc3MtPnR0ID09IFRUX01QNF9MT0FTKQorICAgIHsKKyAgICAgIGludCBsYXRtQnl0ZXM7CisKKyAgICAgIGxhdG1CeXRlcyA9IChGREtnZXRWYWxpZEJpdHMoaEJzKSs3KSA+PiAzOworCisgICAgICAvKiB3cml0ZSBsZW5ndGggaW5mbyBpbnRvIGFzc2VtYmxlciBidWZmZXIgKi8KKyAgICAgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPSBsYXRtQnl0ZXMgLSAzOyAvKiAzPVN5bmN3b3JkICsgbGVuZ3RoICovCisgICAgICB7CisgICAgICAgIEZES19CSVRTVFJFQU0gdG1wQnVmOworCisgICAgICAgIEZES2luaXRCaXRTdHJlYW0oICZ0bXBCdWYsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLCBCU19XUklURVIgKSA7CisgICAgICAgIEZES3B1c2hGb3IoICZ0bXBCdWYsIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXNQb3MgKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKCAmdG1wQnVmLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzLCAxMyApOworICAgICAgICBGREtzeW5jQ2FjaGUoICZ0bXBCdWYgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXcml0ZSBBdWRpb011eEVsZW1lbnQgYnl0ZSBhbGlnbm1lbnQgZmlsbCBiaXRzICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgaEFzcy0+ZmlsbEJpdHMpOworCisgICAgRkRLX0FTU0VSVCggKEZES2dldFZhbGlkQml0cyhoQnMpICUgOCkgPT0gMCk7CisKKyAgICBoQXNzLT5zdWJGcmFtZUNudCA9IDA7CisKKyAgICBGREtzeW5jQ2FjaGUoaEJzKTsKKyAgICAqYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KT4+MzsKKyAgICAvL0ZES2ZldGNoQnVmZmVyKGhCcywgYnVmZmVyLCAoVUlOVCopYnl0ZXMpOworCisgICAgaWYgKGhBc3MtPm11eENvbmZpZ1BlcmlvZCA+IDApCisgICAgeworICAgICAgaEFzcy0+bGF0bUZyYW1lQ291bnRlcisrOworCisgICAgICBpZiAoaEFzcy0+bGF0bUZyYW1lQ291bnRlciA+PSBoQXNzLT5tdXhDb25maWdQZXJpb2QpIHsKKyAgICAgICAgaEFzcy0+bGF0bUZyYW1lQ291bnRlciA9IDA7CisgICAgICAgIGhBc3MtPm5vU3ViZnJhbWVzID0gaEFzcy0+bm9TdWJmcmFtZXNfbmV4dDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogTm8gZGF0YSB0aGlzIHRpbWUgKi8KKyAgICAqYnl0ZXMgPSAwOworICB9Cit9CisKKy8qKgorICogSW5pdCBMQVRNL0xPQVMKKyAqLworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtX0luaXQoCisgICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSAgaEFzcywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDT0RFUl9DT05GSUcgICpsYXllckNvbmZpZywKKyAgICAgICAgVUlOVCBhdWRpb011eFZlcnNpb24sCisgICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAorICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgorICAgICAgICApCit7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1czsKKyAgaW50IGZyYWN0RGVsYXlQcmVzZW50ID0gMDsKKyAgaW50IHByb2csIGxheWVyOworCisgIGludCBzZXR1cERhdGFEaXN0YW5jZUZyYW1lcyA9IGxheWVyQ29uZmlnLT5oZWFkZXJQZXJpb2Q7CisKKyAgRkRLX0FTU0VSVChzZXR1cERhdGFEaXN0YW5jZUZyYW1lcz49MCk7CisKKyAgZm9yIChwcm9nPTA7IHByb2c8TEFUTV9NQVhfUFJPR1JBTVM7IHByb2crKykgeworICAgIGZvciAobGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrKSB7CisgICAgICBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdID0gTlVMTDsKKyAgICAgIGhBc3MtPm1fbGluZm9bcHJvZ11bbGF5ZXJdLnN0cmVhbUlEID0gLTE7CisgICAgfQorICB9CisKKyAgaEFzcy0+Y29uZmlnWzBdWzBdID0gbGF5ZXJDb25maWc7CisgIGhBc3MtPm1fbGluZm9bMF1bMF0uc3RyZWFtSUQgPSAwOworCisgIEVycm9yU3RhdHVzID0gdHJhbnNwb3J0RW5jX0luaXRMYXRtU3RyZWFtKCBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3REZWxheVByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cERhdGFEaXN0YW5jZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb011eFZlcnNpb24pPzE6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKQorICAgIGdvdG8gYmFpbDsKKworICBFcnJvclN0YXR1cyA9IHRyYW5zcG9ydEVuY19MYXRtU2V0TnJPZlN1YmZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllckNvbmZpZy0+blN1YkZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKQorICAgIGdvdG8gYmFpbDsKKworICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIFN0cmVhbU11eENvbmZpZyBzb21laG93ICovCisgIEFkdmFuY2VBdWRpb011eEVsZW1lbnQoaEFzcywgaEJzLCAwLCAwLCBjYik7CisgIC8vQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKGhBc3MsIGhCcywgMCk7CisKK2JhaWw6CisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uaCBiL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVlYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5oCkBAIC0wLDAgKzEsMjY0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFBFTkNfTEFUTV9ICisjZGVmaW5lIFRQRU5DX0xBVE1fSAorCisKKworI2luY2x1ZGUgInRwZW5jX2xpYi5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworCisjZGVmaW5lIERFRkFVTFRfTEFUTV9OUl9PRl9TVUJGUkFNRVMgMQorI2RlZmluZSBERUZBVUxUX0xBVE1fU01DX1JFUEVBVCAgICAgIDgKKworI2RlZmluZSBNQVhfQUFDX0xBWUVSUyAgICAgICAgOQorCisjZGVmaW5lIExBVE1fTUFYX1BST0dSQU1TICAgICAxCisjZGVmaW5lIExBVE1fTUFYX1NUUkVBTV9JRCAgIDE2CisKKyNkZWZpbmUgTEFUTV9NQVhfTEFZRVJTICAgICAgIDEgLypNQVhfQUFDX0xBWUVSUyovCisKKyNkZWZpbmUgTUFYX05SX09GX1NVQkZSQU1FUyAgIDIgICAgICAgICAgIC8qIHNldCB0aGlzIGNhcmVmdWxseSB0byBhdm9pZCBidWZmZXIgb3ZlcmZsb3dzICovCisKK3R5cGVkZWYgZW51bSB7IExBVE1WQVJfU0lNUExFX1NFUVVFTkNFIH0gTEFUTV9WQVJfTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaWduZWQgaW50IGZyYW1lTGVuZ3RoVHlwZTsKKyAgc2lnbmVkIGludCBmcmFtZUxlbmd0aEJpdHM7CisgIHNpZ25lZCBpbnQgdmFyRnJhbWVMZW5ndGhUYWJsZVs0XTsKKyAgc2lnbmVkIGludCBzdHJlYW1JRDsKK30gTEFUTV9MQVlFUl9JTkZPOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgTEFUTV9MQVlFUl9JTkZPICAgICAgbV9saW5mb1tMQVRNX01BWF9QUk9HUkFNU11bTEFUTV9NQVhfTEFZRVJTXTsKKyAgQ09ERVJfQ09ORklHICAgICAgICAqY29uZmlnW0xBVE1fTUFYX1BST0dSQU1TXVtMQVRNX01BWF9MQVlFUlNdOworCisgIExBVE1fVkFSX01PREUgICAgICAgIHZhck1vZGU7CisgIFRSQU5TUE9SVF9UWVBFICAgICAgIHR0OworCisgIGludCAgICAgICAgICAgICAgICAgIGF1ZGlvTXV4TGVuZ3RoQnl0ZXM7CisKKyAgaW50ICAgICAgICAgICAgICAgICAgYXVkaW9NdXhMZW5ndGhCeXRlc1BvczsKKyAgaW50ICAgICAgICAgICAgICAgICAgdGFyYUJ1ZmZlckZ1bGxuZXNzOyAvKiBzdGF0ZSBvZiB0aGUgYml0IHJlc2Vydm9pciAqLworICBpbnQgICAgICAgICAgICAgICAgICB2YXJTdHJlYW1DbnQ7CisgIHVuc2lnbmVkIGludCAgICAgICAgIG90aGVyRGF0YUxlbkJ5dGVzOworCisgIFVDSEFSICAgICAgICAgICAgICAgIGxhdG1GcmFtZUNvdW50ZXI7ICAgLyogQ3VycmVudCBmcmFtZSBudW1iZXIuIENvdW50cyBtb2R1bG8gbXV4Q29uZmlnUGVyaW9kICovCisgIFVDSEFSICAgICAgICAgICAgICAgIG11eENvbmZpZ1BlcmlvZDsgICAgLyogRGlzdGFuY2UgaW4gZnJhbWVzIGJldHdlZW4gTXV4Q29uZmlnICovCisKKyAgVUNIQVIgICAgICAgICAgICAgICAgYXVkaW9NdXhWZXJzaW9uOyAgICAvKiBBTVYxIHN1cHBvcnRzIHRyYW5zbWlzc2lvbiBvZiB0YXJhQnVmZmVyRnVsbG5lc3MgYW5kIEFTQyBsZW5ndGhzICovCisgIFVDSEFSICAgICAgICAgICAgICAgIGF1ZGlvTXV4VmVyc2lvbkE7ICAgLyogZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisKKyAgVUNIQVIgICAgICAgICAgICAgICAgbm9Qcm9ncmFtOworICBVQ0hBUiAgICAgICAgICAgICAgICBub0xheWVyW0xBVE1fTUFYX1BST0dSQU1TXTsKKyAgVUNIQVIgICAgICAgICAgICAgICAgZnJhY3REZWxheVByZXNlbnQ7CisKKyAgVUNIQVIgICAgICAgICAgICAgICAgYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZzsKKyAgVUNIQVIgICAgICAgICAgICAgICAgc3ViRnJhbWVDbnQ7ICAgICAgICAvKiBDdXJyZW50IFN1YmZyYW1lIGZyYW1lICovCisgIFVDSEFSICAgICAgICAgICAgICAgIG5vU3ViZnJhbWVzOyAgICAgICAgLyogTnVtYmVyIG9mIHN1YmZyYW1lcyAgICAqLworICBVSU5UICAgICAgICAgICAgICAgICBsYXRtU3ViZnJhbWVTdGFydDsgIC8qIFBvc2l0aW9uIG9mIGN1cnJlbnQgc3ViZnJhbWUgc3RhcnQgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgbm9TdWJmcmFtZXNfbmV4dDsKKworICBVQ0hBUiAgICAgICAgICAgICAgICBmaWxsQml0czsgICAgICAgICAgIC8qIEF1ZGlvTXV4RWxlbWVudCBmaWxsIGJpdHMgKi8KKyAgVUNIQVIgICAgICAgICAgICAgICAgc3RyZWFtTXV4Q29uZmlnQml0czsKKworfSBMQVRNX1NUUkVBTTsKKwordHlwZWRlZiBMQVRNX1NUUkVBTSAqSEFORExFX0xBVE1fU1RSRUFNOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIExBVE1fU1RSRUFNIEhhbmRsZS4gQ3JlYXRlcyBhdXRvbWF0aWNhbGx5IG9uZSBwcm9ncmFtIHdpdGggb25lIGxheWVyIHdpdGgKKyAqICAgICAgICB0aGUgZ2l2ZW4gbGF5ZXJDb25maWcuIFRoZSBsYXllckNvbmZpZyBtdXN0IGJlIHBlcnNpc3RlbiBiZWNhdXNlIHJlZmVyZW5jZXMgdG8gdGhpcyBwb2ludGVyCisgKiAgICAgICAgYXJlIG1hZGUgYXQgYW55IHRpbWUgYWdhaW4uCisgKiAgICAgICAgVXNlIHRyYW5zcG9ydEVuY19MYXRtX0FkZExheWVyKCkgdG8gYWRkIG1vcmUgcHJvZ3JhbXMvbGF5ZXJzLgorICoKKyAqIFxwYXJhbSBoTGF0bVN0cmVhbUluZm8gSEFORExFX0xBVE1fU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIGhCcyBCaXRzdHJlYW0gaGFuZGxlCisgKiBccGFyYW0gbGF5ZXJDb25maWcgYSB2YWxpZCBDT0RFUl9DT05GSUcgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYXVkaW8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccGFyYW0gYXVkaW9NdXhWZXJzaW9uIHRoZSBMQVRNIGF1ZGlvTXV4VmVyc2lvbiB0byBiZSB1c2VkCisgKiBccGFyYW0gdHQgdGhlIHNwZWNpZmljIFRSQU5TUE9SVF9UWVBFIHRvIGJlIHVzZWQsIGVpdGhlciBUVF9NUDRfTE9BUywgVFRfTVA0X0xBVE1fTUNQMSBvciBUVF9NUDRfTEFUTV9NQ1AwIExPQVMKKyAqIFxwYXJhbSBjYiBjYWxsYmFjayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgKgorICogXHJldHVybiBhbiBUUkFOU1BPUlRFTkNfRVJST1IgZXJyb3IgY29kZQorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1fSW5pdCgKKyAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNIGhMYXRtU3RyZWFtSW5mbywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBDT0RFUl9DT05GSUcgKmxheWVyQ29uZmlnLAorICAgICAgICBVSU5UIGF1ZGlvTXV4VmVyc2lvbiwKKyAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHQsCisgICAgICAgIENTVHBDYWxsQmFja3MgKmNiCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEdldCBiaXQgZGVtYW5kIG9mIG5leHQgTEFUTS9MT0FTIGhlYWRlcgorICoKKyAqIFxwYXJhbSBoQXNzIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBzdHJlYW1EYXRhTGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQKKyAqCisgKiBccmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCBieSB0aGUgTEFUTS9MT0FTIGhlYWRlcnMKKyAqLwordW5zaWduZWQgaW50IHRyYW5zcG9ydEVuY19MYXRtQ291bnRUb3RhbEJpdERlbWFuZEhlYWRlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0cmVhbURhdGFMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIFdyaXRlIExBVE0vTE9BUyBoZWFkZXIgaW50byBnaXZlbiBiaXRzdHJlYW0gaGFuZGxlCisgKgorICogXHBhcmFtIGhMYXRtU3RyZWFtSW5mbyBIQU5ETEVfTEFUTV9TVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gaEJpdHN0cmVhbSBCaXRzdHJlYW0gaGFuZGxlCisgKiBccGFyYW0gYXVCaXRzIGFtb3VudCBvZiBjdXJyZW50IHBheWxvYWQgYml0cworICogXHBhcmFtIGJ1ZmZlckZ1bGxuZXNzIExBVE0gYnVmZmVyIGZ1bGxuZXNzIHZhbHVlCisgKiBccGFyYW0gY2IgY2FsbGJhY2sgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoKKyAqIFxyZXR1cm4gYW4gVFJBTlNQT1JURU5DX0VSUk9SIGVycm9yIGNvZGUKKyAqLworVFJBTlNQT1JURU5DX0VSUk9SCit0cmFuc3BvcnRFbmNfTGF0bVdyaXRlICgKKyAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0c3RyZWFtLAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYXVCaXRzLAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgIENTVHBDYWxsQmFja3MgICAgICpjYgorICAgICAgICApOworCisvKioKKyAqIFxicmllZiBBZGp1c3QgYml0IGNvdW50IHJlbGF0aXZlIHRvIGN1cnJlbnQgc3ViZnJhbWUKKyAqCisgKiBccGFyYW0gaEFzcyBIQU5ETEVfTEFUTV9TVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gcEJpdHMgcG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGZyYW1lIGJpdCBjb3VudCBpcyBjb250YWluZWQsCisgKiAgICAgICAgYW5kIHdoZXJlIHRoZSBzdWJmcmFtZSByZWxhdGl2ZSBiaXQgY291bnQgd2lsbCBiZSByZXR1cm5lZCBpbnRvCisgKgorICogXHJldHVybiB2b2lkCisgKi8KK3ZvaWQgdHJhbnNwb3J0RW5jX0xhdG1BZGp1c3RTdWJmcmFtZUJpdHMoSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwQml0cyk7CisKKy8qKgorICogXGJyaWVmIFJlcXVlc3QgYW4gTEFUTSBmcmFtZSwgd2hpY2ggbWF5LCBvciBtYXkgbm90IGJlIGF2YWlsYWJsZQorICoKKyAqIFxwYXJhbSBoQXNzIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBoQnMgQml0c3RyZWFtIGhhbmRsZQorICogXHBhcmFtIHBCeXRlcyBwb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgZnJhbWUgYnl0ZSBjb3VudCBzdG9yZWQgaW50by4KKyAqICAgICAgICBBIHJldHVybiB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoYXQgY3VycmVudGx5IG5vIExBVE0vTE9BUyBmcmFtZSBjYW4gYmUgcmV0dXJuZWQuCisgKiAgICAgICAgVGhlIGxhdHRlciBpcyBleHBlY3RlZCBpbiBjYXNlIG9mIG11bHRpcGxlIHN1YmZyYW1lcyBiZWluZyB1c2VkLgorICoKKyAqIFxyZXR1cm4gdm9pZAorICovCit2b2lkIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcEJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGUgYSBTdHJlYW1NdXhDb25maWcgaW50byB0aGUgZ2l2ZW4gYml0c3RyZWFtIGhhbmRsZQorICoKKyAqIFxwYXJhbSBoQXNzIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBoQnMgQml0c3RyZWFtIGhhbmRsZQorICogXHBhcmFtIGJ1ZmZlckZ1bGxuZXNzIExBVE0gYnVmZmVyIGZ1bGxuZXNzIHZhbHVlCisgKiBccGFyYW0gY2IgY2FsbGJhY2sgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoKKyAqIFxyZXR1cm4gdm9pZAorICovCitUUkFOU1BPUlRFTkNfRVJST1IKK0NyZWF0ZVN0cmVhbU11eENvbmZpZygKKyAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgorICAgICAgICApOworCisKKyNlbmRpZiAvKiBUUEVOQ19MQVRNX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xpYi5jcHAgYi9hYWMvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZmIzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwCkBAIC0wLDAgKzEsNjQyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBlbmNvZGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHBlbmNfbGliLmgiCisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2luY2x1ZGUgInZlcnNpb24iCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInRyYW5zcG9ydEVuYyIKKworI2luY2x1ZGUgInRwZW5jX2FzYy5oIgorI2luY2x1ZGUgImNvbnZfc3RyaW5nLmgiCisKKyNpbmNsdWRlICJ0cGVuY19hZHRzLmgiCisKKyNpbmNsdWRlICJ0cGVuY19hZGlmLmgiCisKKyNpbmNsdWRlICJ0cGVuY19sYXRtLmgiCisKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBjdXJTdWJGcmFtZTsKKyAgaW50IG5TdWJGcmFtZXM7CisgIGludCBwcmV2Qml0czsKK30gUkFXUEFDS0VUU19JTkZPOworCitzdHJ1Y3QgVFJBTlNQT1JURU5DCit7CisgIENPREVSX0NPTkZJRyBjb25maWc7CisgIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdDsgICAgICAgICAgLyohPCBNUEVHNCB0cmFuc3BvcnQgdHlwZS4gKi8KKworICBGREtfQklUU1RSRUFNIGJpdFN0cmVhbTsKKyAgVUNIQVIgKmJzQnVmZmVyOworICBJTlQgYnNCdWZmZXJTaXplOworCisgIElOVCBwY2VGcmFtZUNvdW50ZXI7ICAgICAgICAgICAgICAgICAgLyohPCBJbmRpY2F0ZXMgZnJhbWUgcGVyaW9kIHdoZW4gUENFIG11c3QgYmUgd3JpdHRlbiBpbiByYXdfZGF0YV9ibG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIG1lYW5zIG5vdCB0byB3cml0ZSBhIFBDRSBpbiByYXdfZGF0X2Jsb2NrLiAqLworICB1bmlvbiB7CisgICAgU1RSVUNUX0FEVFMgYWR0czsKKworICAgIEFESUZfSU5GTyBhZGlmOworCisgICAgTEFUTV9TVFJFQU0gbGF0bTsKKworICAgIFJBV1BBQ0tFVFNfSU5GTyByYXc7CisKKworCisgIH0gd3JpdGVyOworCisgIENTVHBDYWxsQmFja3MgY2FsbGJhY2tzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RSQU5TUE9SVEVOQ19TVFJVQ1QgVFJBTlNQT1JURU5DX1NUUlVDVDsKKworCisvKgorICogTUVNT1JZIERlY2xhcmF0aW9uCisgKi8KKworQ19BTExPQ19NRU0oUmFtX1RyYW5zcG9ydEVuY29kZXIsIFRSQU5TUE9SVEVOQywgMSkKKworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKCBIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwRW5jICkKK3sKKyAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmM7CisKKyAgaWYgKCBwaFRwRW5jID09IE5VTEwgKXsKKyAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKKyAgaFRwRW5jID0gR2V0UmFtX1RyYW5zcG9ydEVuY29kZXIoMCk7CisKKyAgaWYgKCBoVHBFbmMgPT0gTlVMTCApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JURU5DX05PX01FTTsKKyAgfQorCisgICpwaFRwRW5jID0gaFRwRW5jOworICByZXR1cm4gVFJBTlNQT1JURU5DX09LOworfQorCisvKioKKyAqIFxicmllZiAgR2V0IGZyYW1lIHBlcmlvZCBvZiBQQ0UgaW4gcmF3X2RhdGFfYmxvY2suCisgKgorICogIC0gV3JpdGUgUENFIG9ubHkgaWYgbmVjZXNzYXJ5LiBQQ0UgY2FuIGJlIHBhcnQgb2YgdGhlIEFTQyBpZiBjaENvbmZpZz09MCB3aGVyZXJmb3JlCisgKiAgICBubyBhZGRpdG9uYWwgUENFIHdpbGwgYmUgd3JpdHRlbiBpbiByYXdfZGF0YV9ibG9jay4KKyAqIC0gQSBtYXRyaXhNaXhkb3duIGNvZWZmaWNpZW50IGNhbiBvbmx5IGJlIHdyaXR0ZW4gaWYgY2hDb25maWcgaXMgNS4wIG9yIDUuMS4KKyAqIC0gVGhlIFBDRSByZXBldGl0aW9uIHJhdGUgaW4gcmF3X2RhdGFfYmxvY2sgY2FuIGJlIGNvbnRyb2xsZWQgdmlhIGhlYWRlclBlcmlvZCBwYXJhbWV0ZXIuCisgKgorICogXHBhcmFtIGNoYW5uZWxDb25maWcgICAgICAgICBDaGFubmVsIENvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIENoYW5uZWwgTW9kZQorICogXHBhcmFtIHRyYW5zcG9ydEZtdCAgICAgICAgICBGb3JtYXQgb2YgdGhlIHRyYW5zcG9ydCB0byBiZSB3cml0dGVuLgorICogXHBhcmFtIGhlYWRlclBlcmlvZCAgICAgICAgICBDaG9zZW4gUENFIGZyYW1lIHJlcGV0aXRpb24gcmF0ZS4KKyAqIFxwYXJhbSBtYXRyaXhNaXhkb3duQSAgICAgICAgSW5kaWNhdGVzIGlmIGEgdmFsaWQgTWF0cml4IE1peGRvd24gY29lZmZpY2llbnQgaXMgYXZhaWxhYmxlLgorICoKKyAqIFxyZXR1cm4gIFBDRSBmcmFtZSByZXBldGl0aW9uIHJhdGUuIC0xIG1lYW5zIG5vIFBDRSBwcmVzZW50IGluIHJhd19kYXRhX2Jsb2NrLgorICovCitzdGF0aWMgSU5UIGdldFBjZVJlcGV0aXRpb25SYXRlKAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBjaGFubmVsQ29uZmlnLAorICAgICAgICBjb25zdCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgbWF0cml4TWl4ZG93bkEKKyAgICAgICAgKQoreworICBJTlQgcGNlRnJhbWVDb3VudGVyID0gLTE7IC8qIHZhcmlhYmxlIHRvIGJlIHJldHVybmVkICovCisKKyAgaWYgKGhlYWRlclBlcmlvZD4wKSB7CisgICAgc3dpdGNoICggY2hhbm5lbENvbmZpZyApIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgc3dpdGNoICh0cmFuc3BvcnRGbXQpIHsKKyAgICAgICAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICAgICAgICBjYXNlIFRUX01QNF9SQVc6CisgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSBoZWFkZXJQZXJpb2Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAgICAgICAgICAgICAgICAgIC8qIEFESUYgaGVhZGVyIGNvbXByaXNlcyBQQ0UgKi8KKyAgICAgICAgICBjYXNlIFRUX01QNF9MT0FTOiAgICAgICAgICAgICAgICAgIC8qIFBDRSBpbiBBU0MgaWYgY2hDaG9uZmlnPT0wICovCisgICAgICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOiAgICAgICAgICAgICAvKiBQQ0UgaW4gQVNDIGlmIGNoQ2hvbmZpZz09MCAqLworICAgICAgICAgIGNhc2UgVFRfRFJNOiAgICAgICAgICAgICAgICAgICAgICAgLyogUENFIG5vdCBhbGxvd2VkIGluIERSTSAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgICAgICAgICAgICAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTogLyogTU9ERV8xXzJfMiAqLworICAgICAgY2FzZSA2OiAvKiBNT0RFXzFfMl8yXzEgKi8KKyAgICAgICAgLyogbWF0cml4TWl4ZG93bkNvZWZmaWNpZW50IGNhbiBvbmx5IGJlIHdyaXR0ZW4gaWYgNS4wIGFuZCA1LjEgY29uZmlnIHByZXNlbnQuICovCisgICAgICAgIGlmIChtYXRyaXhNaXhkb3duQSE9MCkgeworICAgICAgICAgIHN3aXRjaCAodHJhbnNwb3J0Rm10KSB7CisgICAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAgICAgICAgICAgICAgICAvKiBBRElGIGhlYWRlciBjb21wcmlzZXMgUENFICovCisgICAgICAgICAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzogICAgICAgICAgICAgICAgLyogbm8gUENFIGluIEFTQyBiZWNhdXNlIGNoQ29uZmlnIT0wICovCisgICAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6ICAgICAgICAgICAvKiBubyBQQ0UgaW4gQVNDIGJlY2F1c2UgY2hDb25maWchPTAgKi8KKyAgICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICAgICAgICAgIGNhc2UgVFRfTVA0X1JBVzoKKyAgICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gaGVhZGVyUGVyaW9kOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFRfRFJNOiAgICAgICAgICAgICAgICAgICAgIC8qIFBDRSBub3QgYWxsb3dlZCBpbiBEUk0gKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAgICAgICAgICAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICAgICAgICB9IC8qIHN3aXRjaCB0cmFuc3BvcnRGbXQgKi8KKyAgICAgICAgfSAvKiBpZiBtYXRyaXhNaXhkb3duQSE9MCAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAgICAgICAgICAgICAgICAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICB9IC8qIHN3aXRjaCBnZXRDaGFubmVsQ29uZmlnKCkgKi8KKyAgfSAvKiBpZiBoZWFkZXJQZXJpb2Q+MCAgKi8KKyAgZWxzZSB7CisgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgfQorCisgIHJldHVybiBwY2VGcmFtZUNvdW50ZXI7Cit9CisKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfSW5pdCgKKyAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgIFVDSEFSICAgICAgICAgICAgICpic0J1ZmZlciwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgIGJzQnVmZmVyU2l6ZSwKKyAgICAgICAgVFJBTlNQT1JUX1RZUEUgICAgIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgQ09ERVJfQ09ORklHICAgICAgKmNjb25maWcsCisgICAgICAgIFVJTlQgICAgICAgICAgICAgICBmbGFncworICAgICAgICApCit7CisgIC8qIENvcHkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKyAgRkRLbWVtY3B5KCZoVHBFbmMtPmNvbmZpZywgY2NvbmZpZywgc2l6ZW9mKENPREVSX0NPTkZJRykpOworCisgIC8qIEluaXQgdHJhbnNwb3J0RW5jIHN0cnVjdC4gKi8KKyAgaFRwRW5jLT50cmFuc3BvcnRGbXQgPSB0cmFuc3BvcnRGbXQ7CisKKyAgaFRwRW5jLT5ic0J1ZmZlciA9IGJzQnVmZmVyOworICBoVHBFbmMtPmJzQnVmZmVyU2l6ZSA9IGJzQnVmZmVyU2l6ZTsKKworICBGREtpbml0Qml0U3RyZWFtKCZoVHBFbmMtPmJpdFN0cmVhbSwgaFRwRW5jLT5ic0J1ZmZlciwgaFRwRW5jLT5ic0J1ZmZlclNpemUsIDAsIEJTX1dSSVRFUik7CisKKyAgc3dpdGNoICh0cmFuc3BvcnRGbXQpIHsKKworICBjYXNlIFRUX01QNF9BRElGOgorICAgIC8qIFNhbml0eSBjaGVja3MgKi8KKyAgICBpZiAoIChoVHBFbmMtPmNvbmZpZy5hb3QgIT0gQU9UX0FBQ19MQykKKyAgICAgICB8fChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkpCisgICAgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaFRwRW5jLT53cml0ZXIuYWRpZi5oZWFkZXJXcml0dGVuID0gMDsKKyAgICBoVHBFbmMtPndyaXRlci5hZGlmLnNhbXBsaW5nUmF0ZSA9IGhUcEVuYy0+Y29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJpdFJhdGUgPSBoVHBFbmMtPmNvbmZpZy5iaXRSYXRlOworICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYucHJvZmlsZSA9ICgoaW50KWhUcEVuYy0+Y29uZmlnLmFvdCkgLSAxOworICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuY20gPSBoVHBFbmMtPmNvbmZpZy5jaGFubmVsTW9kZTsKKyAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJWYXJpYWJsZVJhdGUgPSAwOworICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuaW5zdGFuY2VUYWcgPSAwOworICAgIGJyZWFrOworCisgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgLyogU2FuaXR5IGNoZWNrcyAqLworICAgIGlmICggKCBoVHBFbmMtPmNvbmZpZy5hb3QgIT0gQU9UX0FBQ19MQykKKyAgICAgICB8fChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkgKQorICAgIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICggYWR0c1dyaXRlX0luaXQoJmhUcEVuYy0+d3JpdGVyLmFkdHMsICZoVHBFbmMtPmNvbmZpZykgIT0gMCkgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgeworICAgICAgVFJBTlNQT1JURU5DX0VSUk9SIGVycm9yOworCisgICAgICBlcnJvciA9IHRyYW5zcG9ydEVuY19MYXRtX0luaXQoCisgICAgICAgICAgICAgICAgJmhUcEVuYy0+d3JpdGVyLmxhdG0sCisgICAgICAgICAgICAgICAgJmhUcEVuYy0+Yml0U3RyZWFtLAorICAgICAgICAgICAgICAgICZoVHBFbmMtPmNvbmZpZywKKyAgICAgICAgICAgICAgICAgZmxhZ3MgJiBUUF9GTEFHX0xBVE1fQU1WLAorICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGbXQsCisgICAgICAgICAgICAgICAgJmhUcEVuYy0+Y2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICk7CisgICAgICBpZiAoZXJyb3IgIT0gVFJBTlNQT1JURU5DX09LKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVF9NUDRfUkFXOgorICAgIGhUcEVuYy0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSA9IDA7CisgICAgaFRwRW5jLT53cml0ZXIucmF3Lm5TdWJGcmFtZXMgPSBoVHBFbmMtPmNvbmZpZy5uU3ViRnJhbWVzOworICAgIGJyZWFrOworCisKKworICBkZWZhdWx0OgorICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICAvKiBwY2VGcmFtZUNvdW50ZXIgaW5kaWNhdGVzIGlmIFBDRSBtdXN0IGJlIHdyaXR0ZW4gaW4gcmF3X2RhdGFfYmxvY2suICovCisgIGhUcEVuYy0+cGNlRnJhbWVDb3VudGVyID0gZ2V0UGNlUmVwZXRpdGlvblJhdGUoCisgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxDb25maWcoaFRwRW5jLT5jb25maWcuY2hhbm5lbE1vZGUpLAorICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGbXQsCisgICAgICAgICAgICAgICAgICAgIGhUcEVuYy0+Y29uZmlnLmhlYWRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgaFRwRW5jLT5jb25maWcubWF0cml4TWl4ZG93bkEpOworCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKK0hBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydEVuY19HZXRCaXRzdHJlYW0oIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwICkKK3sKKyAgcmV0dXJuICZoVHAtPmJpdFN0cmVhbTsKK30KKworaW50IHRyYW5zcG9ydEVuY19SZWdpc3RlclNickNhbGxiYWNrKCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCogdXNlcl9kYXRhKQoreworICBpZiAoaFRwRW5jID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaFRwRW5jLT5jYWxsYmFja3MuY2JTYnIgPSBjYlNicjsKKyAgaFRwRW5jLT5jYWxsYmFja3MuY2JTYnJEYXRhID0gdXNlcl9kYXRhOworICByZXR1cm4gMDsKK30KKworCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZVVzZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuY2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRFTkNfT0s7CisKKyAgaWYgKCFoVHApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZoVHAtPmJpdFN0cmVhbTsKKworICAvKiBJbiBjYXNlIG9mIHdyaXRpbmcgUENFIGluIHJhd19kYXRhX2Jsb2NrIGZyYW1lVXNlZEJpdHMgbXVzdCBiZSBhZGFwdGVkLiAqLworICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXI+PWhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgeworICAgIGZyYW1lVXNlZEJpdHMgKz0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLm1hdHJpeE1peGRvd25BLCAzKTsgLyogQ29uc2lkZXIgMyBiaXRzIElEIHNpZ25hbGxpbmcgaW4gYWxpZ25tZW50ICovCisgIH0KKworICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfQURJRjoKKyAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmJzQnVmZmVyLCBoVHAtPmJzQnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKyAgICAgIGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoCisgICAgICAgICAgICAgJmhUcC0+d3JpdGVyLmFkaWYsCisgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MKKyAgICAgICAgICAgICAgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBidWZmZXJGdWxsbmVzcyAvPSBuY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQ29uc2lkZXJlZCBDaGFubmVscyAqLworICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gMzI7CisgICAgICBidWZmZXJGdWxsbmVzcyA9IEZES21pbigweDdGRiwgYnVmZmVyRnVsbG5lc3MpOyAvKiBTaWduYWwgdmFyaWFibGUgcmF0ZSAqLworICAgICAgYWR0c1dyaXRlX0VuY29kZUhlYWRlcigKKyAgICAgICAgICAgICAmaFRwLT53cml0ZXIuYWR0cywKKyAgICAgICAgICAgICAmaFRwLT5iaXRTdHJlYW0sCisgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICBmcmFtZVVzZWRCaXRzCisgICAgICAgICAgICAgICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBidWZmZXJGdWxsbmVzcyAvPSBuY2M7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBDb25zaWRlcmVkIENoYW5uZWxzICovCisgICAgICBidWZmZXJGdWxsbmVzcyAvPSAzMjsKKyAgICAgIGJ1ZmZlckZ1bGxuZXNzID0gRkRLbWluKDB4RkYsIGJ1ZmZlckZ1bGxuZXNzKTsgLyogU2lnbmFsIHZhcmlhYmxlIHJhdGUgKi8KKyAgICAgIHRyYW5zcG9ydEVuY19MYXRtV3JpdGUoCisgICAgICAgICAgICAgJmhUcC0+d3JpdGVyLmxhdG0sCisgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgZnJhbWVVc2VkQml0cywKKyAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgJmhUcC0+Y2FsbGJhY2tzCisgICAgICAgICAgICAgICk7CisgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgaWYgKGhUcC0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSA+PSBoVHAtPndyaXRlci5yYXcublN1YkZyYW1lcykgeworICAgICAgICBoVHAtPndyaXRlci5yYXcuY3VyU3ViRnJhbWUgPSAwOworICAgICAgICBGREtpbml0Qml0U3RyZWFtKCZoVHAtPmJpdFN0cmVhbSwgaFRwLT5ic0J1ZmZlciwgaFRwLT5ic0J1ZmZlclNpemUsIDAsIEJTX1dSSVRFUik7CisgICAgICB9CisgICAgICBoVHAtPndyaXRlci5yYXcucHJldkJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBUUkFOU1BPUlRFTkNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBXcml0ZSBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgaWYgcmVxdWlyZWQgKi8KKyAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyPj1oVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKKyAgICBJTlQgY3JjSW5kZXggPSAwOworICAgIC8qIEFsaWduIGluc2lkZSBQQ0Ugd2l0aCByZXBzZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkgKi8KKyAgICBVSU5UIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbSk7CisKKyAgICAvKiBXcml0ZSBQQ0UgZWxlbWVudCBJRCBiaXRzICovCisgICAgRkRLd3JpdGVCaXRzKCZoVHAtPmJpdFN0cmVhbSwgSURfUENFLCAzKTsKKworICAgIGlmICggKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfQURUUykgJiYgIWhUcC0+d3JpdGVyLmFkdHMucHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICAgIGNyY0luZGV4ID0gYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKCZoVHAtPndyaXRlci5hZHRzLCAmaFRwLT5iaXRTdHJlYW0sIDApOworICAgIH0KKworICAgIC8qIFdyaXRlIFBDRSBhcyBmaXJzdCByYXdfZGF0YV9ibG9jayBlbGVtZW50ICovCisgICAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKCZoVHAtPmJpdFN0cmVhbSwgaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLnNhbXBsaW5nUmF0ZSwgMCwgMSwgaFRwLT5jb25maWcubWF0cml4TWl4ZG93bkEsIChoVHAtPmNvbmZpZy5mbGFncyZDQ19QU0VVRE9fU1VSUk9VTkQpPzE6MCwgYWxpZ25BbmNob3IpOworCisgICAgaWYgKCAoaFRwLT50cmFuc3BvcnRGbXQ9PVRUX01QNF9BRFRTKSAmJiAhaFRwLT53cml0ZXIuYWR0cy5wcm90ZWN0aW9uX2Fic2VudCkgeworICAgICAgYWR0c1dyaXRlX0NyY0VuZFJlZygmaFRwLT53cml0ZXIuYWR0cywgJmhUcC0+Yml0U3RyZWFtLCBjcmNJbmRleCk7CisgICAgfQorICAgIGhUcC0+cGNlRnJhbWVDb3VudGVyID0gMDsgLyogcmVzZXQgcGNlIGZyYW1lIGNvdW50ZXIgKi8KKyAgfQorCisgIGlmIChoVHAtPnBjZUZyYW1lQ291bnRlciE9LTEpIHsKKyAgICBoVHAtPnBjZUZyYW1lQ291bnRlcisrOyAvKiBVcGRhdGUgcGNlRnJhbWVDb3VudGVyIG9ubHkgaWYgUENFIHdyaXRpbmcgaXMgYWN0aXZlLiAqLworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCAqYml0cykKK3sKKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIHRyYW5zcG9ydEVuY19MYXRtQWRqdXN0U3ViZnJhbWVCaXRzKCZoVHAtPndyaXRlci5sYXRtLCBiaXRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBhZHRzV3JpdGVfRW5kUmF3RGF0YUJsb2NrKCZoVHAtPndyaXRlci5hZHRzLCAmaFRwLT5iaXRTdHJlYW0sIGJpdHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfQURJRjoKKyAgICAgIC8qIFN1YnN0cmFjdCBBRElGIGhlYWRlciBmcm9tIEFVIGJpdHMsIG5vdCB0byBiZSBjb25zaWRlcmVkLiAqLworICAgICAgKmJpdHMgLT0gYWRpZldyaXRlX0dldEhlYWRlckJpdHMoJmhUcC0+d3JpdGVyLmFkaWYpOworICAgICAgaFRwLT53cml0ZXIuYWRpZi5oZWFkZXJXcml0dGVuID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X1JBVzoKKyAgICAgICpiaXRzIC09IGhUcC0+d3JpdGVyLnJhdy5wcmV2Qml0czsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0RnJhbWUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCAqbmJ5dGVzKQoreworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwRW5jLT5iaXRTdHJlYW07CisKKyAgc3dpdGNoIChoVHBFbmMtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgICpuYnl0ZXMgPSBoVHBFbmMtPmJzQnVmZmVyU2l6ZTsKKyAgICAgIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoJmhUcEVuYy0+d3JpdGVyLmxhdG0sIGhCcywgbmJ5dGVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBpZiAoaFRwRW5jLT53cml0ZXIuYWR0cy5jdXJyZW50QmxvY2sgPj0gaFRwRW5jLT53cml0ZXIuYWR0cy5udW1fcmF3X2Jsb2NrcysxKSB7CisgICAgICAgICpuYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KT4+MzsKKyAgICAgICAgaFRwRW5jLT53cml0ZXIuYWR0cy5jdXJyZW50QmxvY2sgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKm5ieXRlcyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9BRElGOgorICAgICAgRkRLX0FTU0VSVCgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpID49IDApOworICAgICAgKm5ieXRlcyA9IChGREtnZXRWYWxpZEJpdHMoaEJzKSArIDcpPj4zOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgRkRLc3luY0NhY2hlKGhCcyk7CisgICAgICBoVHBFbmMtPndyaXRlci5yYXcuY3VyU3ViRnJhbWUrKzsKKyAgICAgICpuYnl0ZXMgPSAoKEZES2dldFZhbGlkQml0cyhoQnMpLWhUcEVuYy0+d3JpdGVyLnJhdy5wcmV2Qml0cykgKyA3KT4+MzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKK0lOVCB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCBhdUJpdHMgKQoreworICBJTlQgbmJpdHMgPSAwLCBuUGNlQml0cyA9IDA7CisKKyAgLyogV3JpdGUgUENFIHdpdGhpbiByYXdfZGF0YV9ibG9jayBpbiB0cmFuc3BvcnQgbGliLiAqLworICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXI+PWhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgeworICAgIG5QY2VCaXRzID0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLm1hdHJpeE1peGRvd25BLCAzKTsgLyogQ29uc2lkZXIgMyBiaXRzIElEIHNpZ25hbGxpbmcgaW4gYWxpZ25tZW50ICovCisgICAgYXVCaXRzICs9IG5QY2VCaXRzOyAvKiBBZGFwdCByZXF1aXJlZCByYXdfZGF0YV9ibG9jayBiaXQgY29uc3VtdHBpb24gZm9yIEFVIGxlbmd0aCBpbmZvcm1hdGlvbiBlLmcuIGluIExBVE0vTE9BUyBjb25maWd1cmF0aW9uLiAqLworICB9CisKKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgbmJpdHMgPSAwOyAvKiBEbyBub3QgY29uc2lkZXIgdGhlIEFESUYgaGVhZGVyIGludG8gdGhlIHRvdGFsIGJpdHJhdGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBuYml0cyA9IGFkdHNXcml0ZV9HZXRIZWFkZXJCaXRzKCZoVHAtPndyaXRlci5hZHRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICAgIG5iaXRzID0gdHJhbnNwb3J0RW5jX0xhdG1Db3VudFRvdGFsQml0RGVtYW5kSGVhZGVyKCAmaFRwLT53cml0ZXIubGF0bSwgYXVCaXRzICk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbmJpdHMgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBQQ0UgaXMgd3JpdHRlbiBpbiB0aGUgdHJhbnNwb3J0IGxpYnJhcnkgdGhlcmVmb3JlIHRoZSBiaXQgY29uc3VtcHRpb24gaXMgcGFydCBvZiB0aGUgdHJhbnNwb3J0IHN0YXRpYyBiaXRzLiAqLworICBuYml0cyArPSBuUGNlQml0czsKKworICByZXR1cm4gbmJpdHM7Cit9CisKK3ZvaWQgdHJhbnNwb3J0RW5jX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHApCit7CisgIGlmIChwaFRwICE9IE5VTEwpCisgIHsKKyAgICBpZiAoKnBoVHAgIT0gTlVMTCkgeworICAgICAgRnJlZVJhbV9UcmFuc3BvcnRFbmNvZGVyKHBoVHApOworICAgIH0KKyAgfQorfQorCitpbnQgdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgbUJpdHMpCit7CisgIGludCBjcmNSZWcgPSAwOworCisgIHN3aXRjaCAoaFRwRW5jLT50cmFuc3BvcnRGbXQpIHsKKyAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICBjcmNSZWcgPSBhZHRzV3JpdGVfQ3JjU3RhcnRSZWcoJmhUcEVuYy0+d3JpdGVyLmFkdHMsICZoVHBFbmMtPmJpdFN0cmVhbSwgbUJpdHMpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGNyY1JlZzsKK30KKwordm9pZCB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgcmVnKQoreworICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7CisgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgYWR0c1dyaXRlX0NyY0VuZFJlZygmaFRwRW5jLT53cml0ZXIuYWR0cywgJmhUcEVuYy0+Yml0U3RyZWFtLCByZWcpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9Cit9CisKKworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRDb25mKEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgICAgICAgICpjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfQklUU1RSRUFNICAgICAgICpkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgKmNvbmZUeXBlKQoreworICBUUkFOU1BPUlRFTkNfRVJST1IgdHBFcnIgPSBUUkFOU1BPUlRFTkNfT0s7CisgIEhBTkRMRV9MQVRNX1NUUkVBTSBoTGF0bUNvbmZpZyA9ICZoVHBFbmMtPndyaXRlci5sYXRtOworCisgICpjb25mVHlwZSA9IDA7IC8qIHNldCBjb25mVHlwZSB2YXJpYWJsZSB0byBkZWZhdWx0ICovCisKKyAgLyogd3JpdGUgU3RyZWFtTXV4Q29uZmlnIG9yIEF1ZGlvU3BlY2lmaWNDb25maWcgZGVwZW5kaW5nIG9uIGZvcm1hdCB1c2VkICovCisgIHN3aXRjaCAoaFRwRW5jLT50cmFuc3BvcnRGbXQpCisgIHsKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgorICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgICB0cEVyciA9IENyZWF0ZVN0cmVhbU11eENvbmZpZyhoTGF0bUNvbmZpZywgZGF0YUJ1ZmZlciwgMCwgJmhUcEVuYy0+Y2FsbGJhY2tzKTsKKyAgICAgICpjb25mVHlwZSA9IDE7IC8qIGNvbmZpZyBpcyBTTUMgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAodHJhbnNwb3J0RW5jX3dyaXRlQVNDKGRhdGFCdWZmZXIsIGNjLCAmaFRwRW5jLT5jYWxsYmFja3MpICE9IDApIHsKKyAgICAgICAgdHBFcnIgPSBUUkFOU1BPUlRFTkNfVU5LT1dOX0VSUk9SOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIHRwRXJyOworCit9CisKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQoreworICBpbnQgaTsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUjsKKyAgfQorICBpbmZvICs9IGk7CisKKyAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1RQRU5DOworICBpbmZvLT52ZXJzaW9uID0gTElCX1ZFUlNJT04oVFBfTElCX1ZMMCwgVFBfTElCX1ZMMSwgVFBfTElCX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKKyNpZmRlZiBfX0FORFJPSURfXworICBpbmZvLT5idWlsZF9kYXRlID0gIiI7CisgIGluZm8tPmJ1aWxkX3RpbWUgPSAiIjsKKyNlbHNlCisgIGluZm8tPmJ1aWxkX2RhdGUgPSBfX0RBVEVfXzsKKyAgaW5mby0+YnVpbGRfdGltZSA9IF9fVElNRV9fOworI2VuZGlmCisgIGluZm8tPnRpdGxlID0gVFBfTElCX1RJVExFOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvLT5mbGFncyA9IDAKKyAgICB8IENBUEZfQURJRgorICAgIHwgQ0FQRl9BRFRTCisgICAgfCBDQVBGX0xBVE0KKyAgICB8IENBUEZfTE9BUworICAgIHwgQ0FQRl9SQVdQQUNLRVRTCisgICAgOworCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJNcGVnVFBFbmMvc3JjL3ZlcnNpb24gYi9hYWMvbGliTXBlZ1RQRW5jL3NyYy92ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2U1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliTXBlZ1RQRW5jL3NyYy92ZXJzaW9uCkBAIC0wLDAgKzEsMTMgQEAKKworLyogbGlicmFyeSBpbmZvICovCisjZGVmaW5lIFRQX0xJQl9WTDAgMgorI2RlZmluZSBUUF9MSUJfVkwxIDMKKyNkZWZpbmUgVFBfTElCX1ZMMiA0CisjZGVmaW5lIFRQX0xJQl9USVRMRSAiTVBFRyBUcmFuc3BvcnQiCisjaWZkZWYgX19BTkRST0lEX18KKyNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgVFBfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJQQ011dGlscy9pbmNsdWRlL2xpbWl0ZXIuaCBiL2FhYy9saWJQQ011dGlscy9pbmNsdWRlL2xpbWl0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNkNzAxCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlBDTXV0aWxzL2luY2x1ZGUvbGltaXRlci5oCkBAIC0wLDAgKzEsMjMzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSBwb3N0cHJvY2Vzc29yIG1vZHVsZSAgKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBOZXVzaW5nZXIKKyAgIERlc2NyaXB0aW9uOiBIYXJkIGxpbWl0ZXIgZm9yIGNsaXBwaW5nIHByZXZlbnRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTElNSVRFUl9IXworI2RlZmluZSBfTElNSVRFUl9IXworCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNkZWZpbmUgVERMX0FUVEFDS19ERUZBVUxUX01TICAgICAgKDE1KSAgICAgICAgICAgICAgLyogZGVmYXVsdCBhdHRhY2sgIHRpbWUgaW4gbXMgKi8KKyNkZWZpbmUgVERMX1JFTEVBU0VfREVGQVVMVF9NUyAgICAgKDUwKSAgICAgICAgICAgICAgLyogZGVmYXVsdCByZWxlYXNlIHRpbWUgaW4gbXMgKi8KKworI2RlZmluZSBURExfR0FJTl9TQ0FMSU5HICAgICAgICAgICAoMTUpICAgICAgICAgICAgICAvKiBzY2FsaW5nIG9mIGdhaW4gdmFsdWUuICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3R5cGVkZWYgZW51bSB7CisgIFRETElNSVRfT0sgPSAwLAorCisgIF9fZXJyb3JfY29kZXNfc3RhcnQgPSAtMTAwLAorCisgIFRETElNSVRfSU5WQUxJRF9IQU5ETEUsCisgIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVIsCisKKyAgX19lcnJvcl9jb2Rlc19lbmQKK30gVERMSU1JVEVSX0VSUk9SOworCitzdHJ1Y3QgVERMaW1pdGVyOwordHlwZWRlZiBzdHJ1Y3QgVERMaW1pdGVyKiBURExpbWl0ZXJQdHI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3JlYXRlTGltaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogbWF4QXR0YWNrTXM6ICAgbWF4aW11bSBhbmQgaW5pdGlhbCBhdHRhY2svbG9va2FoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzICAgICoKKyogcmVsZWFzZU1zOiAgICAgcmVsZWFzZSB0aW1lIGluIG1pbGxpc2Vjb25kcyAoOTAlIHRpbWUgY29uc3RhbnQpICAgICAgICAgICAgICoKKyogdGhyZXNob2xkOiAgICAgbGltaXRpbmcgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogbWF4Q2hhbm5lbHM6ICAgbWF4aW11bSBhbmQgaW5pdGlhbCBudW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICoKKyogbWF4U2FtcGxlUmF0ZTogbWF4aW11bSBhbmQgaW5pdGlhbCBzYW1wbGluZyByYXRlIGluIEh6ICAgICAgICAgICAgICAgICAgICAgICoKKyogcmV0dXJuczogICAgICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETGltaXRlclB0ciBjcmVhdGVMaW1pdGVyKHVuc2lnbmVkIGludCAgbWF4QXR0YWNrTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHJlbGVhc2VNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4U2FtcGxlUmF0ZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiByZXNldExpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZXR1cm5zOiBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHJlc2V0TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkZXN0cm95TGltaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZXR1cm5zOiBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIGRlc3Ryb3lMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBhcHBseUxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBwR2FpbiA6ICAgICBwb2ludGVyIHRvIGdhaW5zIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNpZ25hbCBiZWZvcmUgbGltaXRpbmcsICAgKgorKiAgICAgICAgICAgICB3aGljaCBhcmUgZG93bnNjYWxlZCBieSBURExfR0FJTl9TQ0FMSU5HIGJpdC4gICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICBUaGVzZSBnYWlucyBhcmUgZGVsYXllZCBieSBnYWluX2RlbGF5LCBhbmQgc21vb3RoZWQuICAgICAgICAgICAgKgorKiAgICAgICAgICAgICBTbW9vdGhpbmcgaXMgZG9uZSBieSBhIGJ1dHRlcndvcnRoIGxvd3Bhc3MgZmlsdGVyIHdpdGggYSBjdXRvZmYgKgorKiAgICAgICAgICAgICBmcmVxdWVuY3kgd2hpY2ggaXMgZml4ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBzYW1wbGluZyByYXRlLiAgICAgKgorKiAgICAgICAgICAgICBJdCBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZSBzbW9vdGhpbmcgZHVlIHRvIHdpbmRvd2luZyBhbmQgICAgICAgKgorKiAgICAgICAgICAgICBvdmVybGFwL2FkZCwgaWYgYSBnYWluIGlzIGFwcGxpZWQgaW4gZnJlcXVlbmN5IGRvbWFpbi4gICAgICAgICAgKgorKiBnYWluX3NjYWxlOiBwb2ludGVyIHRvIHNjYWxpbmcgZXhwb25lbnRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNpZ25hbCBiZWZvcmUgKgorKiAgICAgICAgICAgICBsaW1pdGluZywgd2l0aG91dCBkZWxheSBhbmQgd2l0aG91dCBzbW9vdGhpbmcgICAgICAgICAgICAgICAgICAgKgorKiBnYWluX3NpemU6ICBudW1iZXIgb2YgZWxlbWVudHMgaW4gcEdhaW4sIGN1cnJlbnRseSByZXN0cmljdGVkIHRvIDEgICAgICAgICAgKgorKiBnYWluX2RlbGF5OiBkZWxheSBbc2FtcGxlc10gd2l0aCB3aGljaCB0aGUgZ2FpbnMgaW4gcEdhaW4gc2hhbGwgYmUgYXBwbGllZCAgKgorKiAgICAgICAgICAgICBnYWluX2RlbGF5IDw9IG5TYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBzYW1wbGVzOiAgICBpbnB1dC9vdXRwdXQgYnVmZmVyIGNvbnRhaW5pbmcgaW50ZXJsZWF2ZWQgc2FtcGxlcyAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICBwcmVjaXNpb24gb2Ygb3V0cHV0IHdpbGwgYmUgREZSQUNUX0JJVFMtVERMX0dBSU5fU0NBTElORyBiaXRzICAgKgorKiBuU2FtcGxlczogICBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIGFwcGx5TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgSU5UX1BDTSogICAgc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgRklYUF9EQkwqICAgIHBHYWluLAorICAgICAgICAgICAgICAgICBjb25zdCBJTlQqICAgZ2Fpbl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fZGVsYXksCisgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICBuU2FtcGxlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZ2V0TGltaXRlckRlbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogbGltaXRlcjogbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogcmV0dXJuczogZXhhY3QgZGVsYXkgY2F1c2VkIGJ5IHRoZSBsaW1pdGVyIGluIHNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBnZXRMaW1pdGVyRGVsYXkoVERMaW1pdGVyUHRyIGxpbWl0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNldExpbWl0ZXJOQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIGxpbWl0ZXI6ICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIG5DaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzICggPD0gbWF4Q2hhbm5lbHMgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICAgICAqCisqIHJldHVybnM6ICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1Igc2V0TGltaXRlck5DaGFubmVscyhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IG5DaGFubmVscyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2V0TGltaXRlclNhbXBsZVJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogc2FtcGxlUmF0ZTogc2FtcGxpbmcgcmF0ZSBpbiBIeiAoIDw9IG1heFNhbXBsZVJhdGUgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICoKKyogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyU2FtcGxlUmF0ZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHNhbXBsZVJhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNldExpbWl0ZXJBdHRhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIGF0dGFja01zOiAgIGF0dGFjayB0aW1lIGluIG1zICggPD0gbWF4QXR0YWNrTXMgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICAgICAqCisqIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1Igc2V0TGltaXRlckF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IGF0dGFja01zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZXRMaW1pdGVyUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZWxlYXNlTXM6ICByZWxlYXNlIHRpbWUgaW4gbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJSZWxlYXNlKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZXRMaW1pdGVyVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiB0aHJlc2hvbGQ6ICBsaW1pdGVyIHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIElOVF9QQ00gdGhyZXNob2xkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgIC8vI2lmbmRlZiBfTElNSVRFUl9IXwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtdXRpbHNfbGliLmggYi9hYWMvbGliUENNdXRpbHMvaW5jbHVkZS9wY211dGlsc19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2YTQxCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtdXRpbHNfbGliLmgKQEAgLTAsMCArMSwzMzQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHVwL2Rvd25taXhpbmcgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRGVjbGFyZXMgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBQQ00gZG93bm1peCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgbW9kdWxlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9QQ01VVElMU19MSUJfSF8KKyNkZWZpbmUgX1BDTVVUSUxTX0xJQl9IXworCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAgIEVSUk9SIENPREVTOiAgICAgICAgICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBlbnVtCit7CisgIFBDTURNWF9PSyAgICAgICAgICAgICAgPSAweDAsICAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBwY21fZG14X2ZhdGFsX2Vycm9yX3N0YXJ0LAorICBQQ01ETVhfT1VUX09GX01FTU9SWSAgID0gMHgyLCAgIC8qITwgTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUuICAgICovCisgIFBDTURNWF9VTktOT1dOICAgICAgICAgPSAweDUsICAgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSB0aGlyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHkgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHBjbV9kbXhfZmF0YWxfZXJyb3JfZW5kLAorCisgIFBDTURNWF9JTlZBTElEX0hBTkRMRSwgICAgICAgICAgLyohPCBUaGUgZ2l2ZW4gaW5zdGFuY2UgaGFuZGxlIGlzIG5vdCB2YWxpZC4gICAgICAgICAgICAgICAgICAgKi8KKyAgUENNRE1YX0lOVkFMSURfQVJHVU1FTlQsICAgICAgICAvKiE8IE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYW5kZWQgb3ZlciBpcyBpbnZhbGlkLiAgICAgICAgICAgICAqLworICBQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcsICAgICAgIC8qITwgVGhlIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB0aHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBwcm9jZXNzaW5nIHdhcyBwZXJmb3JtZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENNRE1YX0lOVkFMSURfTU9ERSwgICAgICAgICAgICAvKiE8IFRoZSBzZXQgY29uZmlndXJhdGlvbi9tb2RlIGlzIG5vdCBhcHBsaWNhYmxlLiAgICAgICAgICAgICAqLworICBQQ01ETVhfVU5LTk9XTl9QQVJBTSwgICAgICAgICAgIC8qITwgVGhlIGhhbmRlZCBwYXJhbWV0ZXIgaXMgbm90IGtub3duL3N1cHBvcnRlZC4gICAgICAgICAgICAgICovCisgIFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNLCAgICAgLyohPCBVbmFibGUgdG8gc2V0IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIuIE1vc3QgcHJvYmFibHkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpc3Qgb3V0IG9mIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEgICAgICAgICAvKiE8IFRoZSByZWFkIGFuY2lsbGFyeSBkYXRhIHdhcyBjb3JydXB0LiAgICAgICAgICAgICAgICAgICAgICAqLworCit9IFBDTURNWF9FUlJPUjsKKworLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGZhdGFsIGVycm9ycy4gKi8KKyNkZWZpbmUgUENNRE1YX0lTX0ZBVEFMX0VSUk9SKGVycikgICAoICgoKGVycik+PXBjbV9kbXhfZmF0YWxfZXJyb3Jfc3RhcnQpICAgJiYgKChlcnIpPD1wY21fZG14X2ZhdGFsX2Vycm9yX2VuZCkpICAgPyAxIDogMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgICBSVU5USU1FIFBBUkFNUzogICAgICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3R5cGVkZWYgZW51bQoreworICBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUsICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBmcmFtZXMgd2l0aG91dCBuZXcgbWV0YWRhdGEgdGhhdCBoYXZlIHRvIGdvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBiZWZvcmUgdGhlIGJpdHN0cmVhbSBkYXRhIGV4cGlyZXMuIFRoZSB2YWx1ZSAwIGRpc2FibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1YX0JTX0RBVEFfREVMQVksICAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgZGVsYXkgZnJhbWVzIG9mIHRoZSBvdXRwdXQgc2FtcGxlcyBjb21wYXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgbGVzcyB0aGFuIHRoZSBnaXZlbiBjaGFubmVscyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB3aWxsIG1vZGlmeSB0aGUgb3V0cHV0IGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gTW9ubyBzaWduYWxzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQuIElmIG1vcmUgdGhhbiB0d28gb3V0cHV0IGNoYW5uZWxzIGFyZSBkZXNpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIGp1c3QgYWRkcyBlbXB0eSBjaGFubmVscy4gVGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBlaXRoZXIgLTEsIDAsIDEsIDIsIDYgb3IgOC4gSWYgdGhlIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgZXhjZWVkcyB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyB0aGUgbGF0dGVyIHdpbGwgYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSB2YWx1ZS4gQm90aCB2YWx1ZXMgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gKi8KKyAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsICAvKiE8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIEZvciBhbGwgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gdGhlIGdpdmVuIGNoYW5uZWxzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHdpbGwgYXBwbHkgYSBtaXhkb3duIGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gVGhlIHZhbHVlIG11c3QgYmUgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgNiBvciA4LiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgbG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRoYW4gdGhlIHZhbHVlIG9mIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdGhlIGxhdHRlciB3aWxsIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gICAgICAgICAgICAgICAgICAqLworICBETVhfRFVBTF9DSEFOTkVMX01PREUsICAgICAgICAgIC8qITwgRG93bm1peCBtb2RlIGZvciB0d28gY2hhbm5lbCBhdWRpbyBkYXRhLiAgICAgICAgICAgICAgICAgICovCisgIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERSAgICAgICAgLyohPCBEZWZpbmVzIGhvdyBtb2R1bGUgaGFuZGxlcyBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFscy4gU2VlIFBTRVVET19TVVJST1VORF9NT0RFIHR5cGUgZm9yIGRldGFpbHMuICAgICAgICovCit9IFBDTURNWF9QQVJBTTsKKworLyogUGFyYW1ldGVyIHZhbHVlIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgTkVWRVJfRE9fUFNfRE1YID0gLTEsICAgICAgICAgICAvKiE8IE5ldmVyIGNyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlIGRvd25taXguICAgICAgICAqLworICBBVVRPX1BTX0RNWCAgICAgPSAgMCwgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUgZG93bm1peCBvbmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxsZWQgaW4gYml0c3RyZWFtcyBtZXRhIGRhdGEuIChEZWZhdWx0KSAgICAgICAgICAgICAgKi8KKyAgRk9SQ0VfUFNfRE1YICAgID0gIDEgICAgICAgICAgICAvKiE8IEFsd2F5cyBjcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBjYW4gbGVhZCB0byBleGNlc3NpdmUgc2lnbmFsIGNhbmNlbGxhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzaWduYWwgbGV2ZWwgZGlmZmVyZW5jZXMgZm9yIG5vbi1jb21wYXRpYmxlIHNpZ25hbHMuICAqLworfSBQU0VVRE9fU1VSUk9VTkRfTU9ERTsKKwordHlwZWRlZiBlbnVtCit7CisgIFNURVJFT19NT0RFID0gMHgwLCAgICAgICAgICAgICAgLyohPCBMZWF2ZSBzdGVyZW8gc2lnbmFscyBhcyB0aGV5IGFyZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQ0gxX01PREUgICAgPSAweDEsICAgICAgICAgICAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAxLiAgICAgICAgICAqLworICBDSDJfTU9ERSAgICA9IDB4MiwgICAgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuICAgICAgICAgICovCisgIE1JWEVEX01PREUgID0gMHgzICAgICAgICAgICAgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgdGhlIHR3bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IERVQUxfQ0hBTk5FTF9NT0RFOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgICAgTU9EVUxFUyBJTlRFUkZBQ0U6ICAgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFICpIQU5ETEVfUENNX0RPV05NSVg7CisKKy8qIE1vZHVsZXMgcmVzZXQgZmxhZ3MgKi8KKyNkZWZpbmUgUENNRE1YX1JFU0VUX1BBUkFNUyAgICggMSApCisjZGVmaW5lIFBDTURNWF9SRVNFVF9CU19EQVRBICAoIDIgKQorI2RlZmluZSBQQ01ETVhfUkVTRVRfRlVMTCAgICAgKCBQQ01ETVhfUkVTRVRfUEFSQU1TIHwgUENNRE1YX1JFU0VUX0JTX0RBVEEgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGhhbmRsZSBvZiB0aGUgbmV3IGluc3RhbmNlLgorICogQHJldHVybnMgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfT3BlbiAoCisgICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgorICApOworCisvKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KKyAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0gKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKKyAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAorICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUKKyAgKTsKKworLyoqIEdldCBvbmUgcGFyYW1ldGVyIHZhbHVlIG9mIG9uZSBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KKyAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciByZWNlaXZpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfR2V0UGFyYW0gKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKKyAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAorICAgIElOVCAqIGNvbnN0ICAgICAgICAgcFZhbHVlCisgICk7CisKKy8qKiBSZWFkIGRvd25taXggbWV0YS1kYXRhIGRpcmVjdGx5IGZyb20gYSBnaXZlbiBiaXRzdHJlYW0uCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgRkRLIGJpdHN0cmVhbSBidWZmZXIuCisgKiBAcGFyYW0gW2luXSBMZW5ndGggb2YgYW5jaWxsYXJ5IGRhdGEgaW4gYml0cy4KKyAqIEBwYXJhbSBbaW5dIEZsYWcgaW5kaWNhdGluZyB3aGV0ZXIgdGhlIGFuY2lsbGFyeSBkYXRhIGlzIGZyb20gYSBNUEVHLTEvMiBvciBhbiBNUEVHLTQgc3RyZWFtLgorICogQHJldHVybnMgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZSAoCisgICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAorICAgIFVJTlQgICBhbmNEYXRhQml0cywKKyAgICBpbnQgICAgaXNNcGVnMgorICApOworCisvKiogUmVhZCBkb3dubWl4IG1ldGEtZGF0YSBmcm9tIGEgZ2l2ZW4gZGF0YSBidWZmZXIuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBQb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KKyAqIEBwYXJhbSBbaW5dIFNpemUgb2YgYW5jaWxsYXJ5IGRhdGEgaW4gYnl0ZXMuCisgKiBAcGFyYW0gW2luXSBGbGFnIGluZGljYXRpbmcgd2hldGVyIHRoZSBhbmNpbGxhcnkgZGF0YSBpcyBmcm9tIGEgTVBFRy0xLzIgb3IgYW4gTVBFRy00IHN0cmVhbS4KKyAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEgKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKKyAgICBVQ0hBUiAqcEFuY0RhdGFCdWYsCisgICAgVUlOVCAgIGFuY0RhdGFCeXRlcywKKyAgICBpbnQgICAgaXNNcGVnMgorICApOworCisvKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBNYXRyaXggbWl4ZG93biBpbmRleCBwcmVzZW50IGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgorICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KKyAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgorICogQHJldHVybnMgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoCisgICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAorICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCisgICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duSWR4LAorICAgIGludCAgICAgICAgICAgICAgICAgcHNldWRvU3Vycm91bmRFbmFibGUKKyAgKTsKKworLyoqIFJlc2V0IHRoZSBtb2R1bGUuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0ICgKKyAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCisgICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncworICApOworCisvKiogQ3JlYXRlIGEgbWl4ZG93biwgYnlwYXNzIG9yIGV4dGVuZCB0aGUgb3V0cHV0IHNpZ25hbCBkZXBlbmRpbmcgb24gdGhlIG1vZHVsZXMgc2V0dGluZ3MgYW5kIHRoZQorICogIHJlc3BlY3RpdmUgZ2l2ZW4gaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBccGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogXHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byB0aW1lIGJ1ZmZlciB3aXRoIGRlY29kZWQgUENNIHNhbXBsZXMuCisgKiBccGFyYW0gW2luXSAgICBUaGUgSS9PIGJsb2NrIHNpemUgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLgorICogXHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkcyB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGFuZCB3aGVyZSB0aGUKKyAqICAgICAgICAgICAgICAgIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgd3JpdHRlbiB0by4KKyAqIFxwYXJhbSBbaW5dICAgIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIG91dHB1dCB0aW1lIGRhdGEgaXMgd3JpdHRlcm4gaW50ZXJsZWF2ZWQgb3IgYXMKKyAqICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgYmxvY2tzLgorICogXHBhcmFtIFtpbm91dF0gQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMKKyAqICAgICAgICAgICAgICAgIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIFtpbm91dF0gQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChmcm9tIE1QRUcgUENFIG9yZGVyaW5nCisgKiAgICAgICAgICAgICAgICB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCisgKiBccGFyYW0gW291dF0gICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUgYXBwbGllZCBvbiBhbGwKKyAqICAgICAgICAgICAgICAgIHNhbXBsZXMgYWZ0ZXJ3YXJkcy4gSWYgdGhlIGhhbmRlZCBwb2ludGVyIGlzIE5VTEwgdGhlIGZpbmFsIHNjYWxpbmcgaXMgZG9uZQorICogICAgICAgICAgICAgICAgaW50ZXJuYWxseS4KKyAqIEByZXR1cm5zICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCisgICAgSEFORExFX1BDTV9ET1dOTUlYICAgICAgc2VsZiwKKyAgICBJTlRfUENNICAgICAgICAgICAgICAgICpwUGNtQnVmLAorICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZkludGVybGVhdmVkLAorICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgIGNoYW5uZWxUeXBlW10sCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwKKyAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLAorICAgIElOVCAgICAgICAgICAgICAgICAgICAgKnBEbXhPdXRTY2FsZQorICApOworCisvKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KKyAqIEByZXR1cm5zICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UgKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKKyAgKTsKKworLyoqIEdldCBsaWJyYXJ5IGluZm8gZm9yIHRoaXMgbW9kdWxlLgorICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KKyAqIEByZXR1cm5zICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIF9QQ01VVElMU19MSUJfSF8gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJQQ011dGlscy9zcmMvbGltaXRlci5jcHAgYi9hYWMvbGliUENNdXRpbHMvc3JjL2xpbWl0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliUENNdXRpbHMvc3JjL2xpbWl0ZXIuY3BwCkBAIC0wLDAgKzEsNDk4IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSBwb3N0cHJvY2Vzc29yIG1vZHVsZSAgKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBOZXVzaW5nZXIKKyAgIERlc2NyaXB0aW9uOiBIYXJkIGxpbWl0ZXIgZm9yIGNsaXBwaW5nIHByZXZlbnRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImxpbWl0ZXIuaCIKKworCitzdHJ1Y3QgVERMaW1pdGVyIHsKKyAgdW5zaWduZWQgaW50ICBhdHRhY2s7CisgIEZJWFBfREJMICAgICAgYXR0YWNrQ29uc3QsIHJlbGVhc2VDb25zdDsKKyAgdW5zaWduZWQgaW50ICBhdHRhY2tNcywgcmVsZWFzZU1zLCBtYXhBdHRhY2tNczsKKyAgRklYUF9QQ00gICAgICB0aHJlc2hvbGQ7CisgIHVuc2lnbmVkIGludCAgY2hhbm5lbHMsIG1heENoYW5uZWxzOworICB1bnNpZ25lZCBpbnQgIHNhbXBsZVJhdGUsIG1heFNhbXBsZVJhdGU7CisgIEZJWFBfREJMICAgICAgY29yLCBtYXg7CisgIEZJWFBfREJMKiAgICAgbWF4QnVmOworICBGSVhQX0RCTCogICAgIGRlbGF5QnVmOworICB1bnNpZ25lZCBpbnQgIG1heEJ1ZklkeCwgZGVsYXlCdWZJZHg7CisgIEZJWFBfREJMICAgICAgc21vb3RoU3RhdGUwOworICBGSVhQX0RCTCAgICAgIG1pbkdhaW47CisKKyAgRklYUF9EQkwgICAgICBhZGRpdGlvbmFsR2FpblByZXY7CisgIEZJWFBfREJMICAgICAgYWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTsKKyAgRklYUF9EQkwgICAgICBhZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKK307CisKKy8qIGNyZWF0ZSBsaW1pdGVyICovCitURExpbWl0ZXJQdHIgY3JlYXRlTGltaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4QXR0YWNrTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHJlbGVhc2VNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4U2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBURExpbWl0ZXJQdHIgbGltaXRlciA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBhdHRhY2ssIHJlbGVhc2U7CisgIEZJWFBfREJMIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3QsIGV4cG9uZW50OworICBJTlQgZV9hbnM7CisKKyAgLyogY2FsYyBhdHRhY2sgYW5kIHJlbGVhc2UgdGltZSBpbiBzYW1wbGVzICovCisgIGF0dGFjayA9ICh1bnNpZ25lZCBpbnQpKG1heEF0dGFja01zICogbWF4U2FtcGxlUmF0ZSAvIDEwMDApOworICByZWxlYXNlID0gKHVuc2lnbmVkIGludCkocmVsZWFzZU1zICogbWF4U2FtcGxlUmF0ZSAvIDEwMDApOworCisgIC8qIGFsbG9jIGxpbWl0ZXIgc3RydWN0ICovCisgIGxpbWl0ZXIgPSAoVERMaW1pdGVyUHRyKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IFRETGltaXRlcikpOworICBpZiAoIWxpbWl0ZXIpIHJldHVybiBOVUxMOworCisgIC8qIGFsbG9jIG1heCBhbmQgZGVsYXkgYnVmZmVycyAqLworICBsaW1pdGVyLT5tYXhCdWYgICA9IChGSVhQX0RCTCopRkRLY2FsbG9jKGF0dGFjayArIDEsIHNpemVvZihGSVhQX0RCTCkpOworICBsaW1pdGVyLT5kZWxheUJ1ZiA9IChGSVhQX0RCTCopRkRLY2FsbG9jKGF0dGFjayAqIG1heENoYW5uZWxzLCBzaXplb2YoRklYUF9EQkwpKTsKKworICBpZiAoIWxpbWl0ZXItPm1heEJ1ZiB8fCAhbGltaXRlci0+ZGVsYXlCdWYpIHsKKyAgICBkZXN0cm95TGltaXRlcihsaW1pdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIGF0dGFja0NvbnN0ID0gcG93KDAuMSwgMS4wIC8gKGF0dGFjayArIDEpKSAqLworICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOworICBhdHRhY2tDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOworICBhdHRhY2tDb25zdCA9IHNjYWxlVmFsdWUoYXR0YWNrQ29uc3QsIGVfYW5zKTsKKworICAvKiByZWxlYXNlQ29uc3QgID0gKGZsb2F0KXBvdygwLjEsIDEuMCAvIChyZWxlYXNlICsgMSkpICovCisgIGV4cG9uZW50ID0gaW52Rml4cChyZWxlYXNlICsgMSk7CisgIHJlbGVhc2VDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOworICByZWxlYXNlQ29uc3QgPSBzY2FsZVZhbHVlKHJlbGVhc2VDb25zdCwgZV9hbnMpOworCisgIC8qIGluaXQgcGFyYW1ldGVycyAqLworICBsaW1pdGVyLT5hdHRhY2tNcyAgICAgID0gbWF4QXR0YWNrTXM7CisgIGxpbWl0ZXItPm1heEF0dGFja01zICAgPSBtYXhBdHRhY2tNczsKKyAgbGltaXRlci0+cmVsZWFzZU1zICAgICA9IHJlbGVhc2VNczsKKyAgbGltaXRlci0+YXR0YWNrICAgICAgICA9IGF0dGFjazsKKyAgbGltaXRlci0+YXR0YWNrQ29uc3QgICA9IGF0dGFja0NvbnN0OworICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgID0gcmVsZWFzZUNvbnN0OworICBsaW1pdGVyLT50aHJlc2hvbGQgICAgID0gKEZJWFBfUENNKXRocmVzaG9sZDsKKyAgbGltaXRlci0+Y2hhbm5lbHMgICAgICA9IG1heENoYW5uZWxzOworICBsaW1pdGVyLT5tYXhDaGFubmVscyAgID0gbWF4Q2hhbm5lbHM7CisgIGxpbWl0ZXItPnNhbXBsZVJhdGUgICAgPSBtYXhTYW1wbGVSYXRlOworICBsaW1pdGVyLT5tYXhTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKKworICByZXNldExpbWl0ZXIobGltaXRlcik7CisKKyAgcmV0dXJuIGxpbWl0ZXI7Cit9CisKKworLyogcmVzZXQgbGltaXRlciAqLworVERMSU1JVEVSX0VSUk9SIHJlc2V0TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcikKK3sKKyAgaWYgKGxpbWl0ZXIgIT0gTlVMTCkgeworCisgICAgbGltaXRlci0+bWF4QnVmSWR4ID0gMDsKKyAgICBsaW1pdGVyLT5kZWxheUJ1ZklkeCA9IDA7CisgICAgbGltaXRlci0+bWF4ID0gKEZJWFBfREJMKTA7CisgICAgbGltaXRlci0+Y29yID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpOworICAgIGxpbWl0ZXItPnNtb290aFN0YXRlMCA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKKyAgICBsaW1pdGVyLT5taW5HYWluID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpOworCisgICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2ID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOworICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDxURExfR0FJTl9TQ0FMSU5HKSk7CisgICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTEgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDxURExfR0FJTl9TQ0FMSU5HKSk7CisKKyAgICBGREttZW1zZXQobGltaXRlci0+bWF4QnVmLCAgIDAsIChsaW1pdGVyLT5hdHRhY2sgKyAxKSAqIHNpemVvZihGSVhQX0RCTCkgKTsKKyAgICBGREttZW1zZXQobGltaXRlci0+ZGVsYXlCdWYsIDAsIGxpbWl0ZXItPmF0dGFjayAqIGxpbWl0ZXItPmNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSApOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICB9CisKKyAgcmV0dXJuIFRETElNSVRfT0s7Cit9CisKKworLyogZGVzdHJveSBsaW1pdGVyICovCitURExJTUlURVJfRVJST1IgZGVzdHJveUxpbWl0ZXIoVERMaW1pdGVyUHRyIGxpbWl0ZXIpCit7CisgIGlmIChsaW1pdGVyICE9IE5VTEwpIHsKKyAgICBGREtmcmVlKGxpbWl0ZXItPm1heEJ1Zik7CisgICAgRkRLZnJlZShsaW1pdGVyLT5kZWxheUJ1Zik7CisKKyAgICBGREtmcmVlKGxpbWl0ZXIpOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICB9CisgIHJldHVybiBURExJTUlUX09LOworfQorCisvKiBhcHBseSBsaW1pdGVyICovCitURExJTUlURVJfRVJST1IgYXBwbHlMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICBJTlRfUENNKiAgICBzYW1wbGVzLAorICAgICAgICAgICAgICAgICBGSVhQX0RCTCogICAgcEdhaW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogICBnYWluX3NjYWxlLAorICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgZ2Fpbl9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgZ2Fpbl9kZWxheSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIG5TYW1wbGVzKQoreworICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgRklYUF9QQ00gdG1wMSwgdG1wMjsKKyAgRklYUF9EQkwgdG1wLCBvbGQsIGdhaW4sIGFkZGl0aW9uYWxHYWluLCBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQ7CisgIEZJWFBfREJMIG1pbkdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CisKKyAgRkRLX0FTU0VSVChnYWluX3NpemUgPT0gMSk7CisgIEZES19BU1NFUlQoZ2Fpbl9kZWxheSA8PSBuU2FtcGxlcyk7CisKKyAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKworICB7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzICAgICAgID0gbGltaXRlci0+Y2hhbm5lbHM7CisgICAgdW5zaWduZWQgaW50IGF0dGFjayAgICAgICAgID0gbGltaXRlci0+YXR0YWNrOworICAgIEZJWFBfREJMICAgICBhdHRhY2tDb25zdCAgICA9IGxpbWl0ZXItPmF0dGFja0NvbnN0OworICAgIEZJWFBfREJMICAgICByZWxlYXNlQ29uc3QgICA9IGxpbWl0ZXItPnJlbGVhc2VDb25zdDsKKyAgICBGSVhQX0RCTCAgICAgdGhyZXNob2xkICAgICAgPSBGWF9QQ00yRlhfREJMKGxpbWl0ZXItPnRocmVzaG9sZCk+PlRETF9HQUlOX1NDQUxJTkc7CisKKyAgICBGSVhQX0RCTCAgICAgbWF4ICAgICAgICAgICAgPSBsaW1pdGVyLT5tYXg7CisgICAgRklYUF9EQkwqICAgIG1heEJ1ZiAgICAgICAgID0gbGltaXRlci0+bWF4QnVmOworICAgIHVuc2lnbmVkIGludCBtYXhCdWZJZHggICAgICA9IGxpbWl0ZXItPm1heEJ1ZklkeDsKKyAgICBGSVhQX0RCTCAgICAgY29yICAgICAgICAgICAgPSBsaW1pdGVyLT5jb3I7CisgICAgRklYUF9EQkwqICAgIGRlbGF5QnVmICAgICAgID0gbGltaXRlci0+ZGVsYXlCdWY7CisgICAgdW5zaWduZWQgaW50IGRlbGF5QnVmSWR4ICAgID0gbGltaXRlci0+ZGVsYXlCdWZJZHg7CisKKyAgICBGSVhQX0RCTCAgICAgc21vb3RoU3RhdGUwICAgPSBsaW1pdGVyLT5zbW9vdGhTdGF0ZTA7CisgICAgRklYUF9EQkwgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlOworICAgIEZJWFBfREJMICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxOworCisgICAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKKworICAgICAgaWYgKGkgPCBnYWluX2RlbGF5KSB7CisgICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluUHJldjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IHBHYWluWzBdOworICAgICAgfQorCisgICAgICAvKiBTbW9vdGggYWRkaXRpb25hbEdhaW4gKi8KKyAgICAgIC8qIFtiLGFdID0gYnV0dGVyKDEsIDAuMDEpICovCisgICAgICBzdGF0aWMgY29uc3QgRklYUF9TR0wgYltdID0geyBGTDJGWENPTlNUX1NHTCgwLjAxNTQ2NioyLjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTU0NjYqMi4wKSB9OworICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGFbXSA9IHsgRkwyRlhDT05TVF9TR0woMS4wMDAwMDApLCBGTDJGWENPTlNUX1NHTCgtMC45NjkwNykgfTsKKyAgICAgIC8qIFtiLGFdID0gYnV0dGVyKDEsIDAuMDAxKSAqLworICAgICAgLy9zdGF0aWMgY29uc3QgRklYUF9TR0wgYltdID0geyBGTDJGWENPTlNUX1NHTCgwLjAwMTU2ODMqMi4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDAxNTY4MyoyLjApIH07CisgICAgICAvL3N0YXRpYyBjb25zdCBGSVhQX1NHTCBhW10gPSB7IEZMMkZYQ09OU1RfU0dMKDEuMDAwMDAwMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5Njg2KSB9OworICAgICAgYWRkaXRpb25hbEdhaW4gPSAtIGZNdWx0KGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUsIGFbMV0pICsgZk11bHREaXYyKCBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQsIGJbMF0pICsgZk11bHREaXYyKGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxLCBiWzFdKTsKKyAgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxID0gYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkOworICAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSA9IGFkZGl0aW9uYWxHYWluOworCisgICAgICAvKiBBcHBseSB0aGUgYWRkaXRpb25hbCBzY2FsaW5nIHRoYXQgaGFzIG5vIGRlbGF5IGFuZCBubyBzbW9vdGhpbmcgKi8KKyAgICAgIGlmIChnYWluX3NjYWxlWzBdID4gMCkgeworICAgICAgICBhZGRpdGlvbmFsR2FpbiA8PD0gZ2Fpbl9zY2FsZVswXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZGl0aW9uYWxHYWluID4+PSBnYWluX3NjYWxlWzBdOworICAgICAgfQorCisgICAgICAvKiBnZXQgbWF4aW11bSBhYnNvbHV0ZSBzYW1wbGUgdmFsdWUgb2YgYWxsIGNoYW5uZWxzLCBpbmNsdWRpbmcgdGhlIGFkZGl0aW9uYWwgZ2Fpbi4gKi8KKyAgICAgIHRtcDEgPSAoRklYUF9QQ00pMDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgdG1wMiA9IChGSVhQX1BDTSlzYW1wbGVzW2kgKiBjaGFubmVscyArIGpdOworICAgICAgICAgIGlmICh0bXAyID09IChGSVhQX1BDTSlTQU1QTEVfTUlOKSAvKiBwcm90ZWN0IGZBYnMgZnJvbSAtMS4wIHZhbHVlICovCisgICAgICAgICAgICAgIHRtcDIgPSAoRklYUF9QQ00pKFNBTVBMRV9NSU4rMSk7CisgICAgICAgIHRtcDEgPSBmTWF4KHRtcDEsIGZBYnModG1wMikpOworICAgICAgfQorICAgICAgdG1wID0gU0FUVVJBVEVfTEVGVF9TSElGVChmTXVsdERpdjIodG1wMSwgYWRkaXRpb25hbEdhaW4pLCAxLCBERlJBQ1RfQklUUyk7CisKKyAgICAgIC8qIHNldCB0aHJlc2hvbGQgYXMgbG93ZXIgYm9yZGVyIHRvIHNhdmUgY2FsY3VsYXRpb25zIGluIHJ1bm5pbmcgbWF4aW11bSBhbGdvcml0aG0gKi8KKyAgICAgIHRtcCA9IGZNYXgodG1wLCB0aHJlc2hvbGQpOworCisgICAgICAvKiBydW5uaW5nIG1heGltdW0gKi8KKyAgICAgIG9sZCA9IG1heEJ1ZlttYXhCdWZJZHhdOworICAgICAgbWF4QnVmW21heEJ1ZklkeF0gPSB0bXA7CisKKyAgICAgIGlmICh0bXAgPj0gbWF4KSB7CisgICAgICAgIC8qIG5ldyBzYW1wbGUgaXMgZ3JlYXRlciB0aGFuIG9sZCBtYXhpbXVtLCBzbyBpdCBpcyB0aGUgbmV3IG1heGltdW0gKi8KKyAgICAgICAgbWF4ID0gdG1wOworICAgICAgfQorICAgICAgZWxzZSBpZiAob2xkIDwgbWF4KSB7CisgICAgICAgIC8qIG1heGltdW0gZG9lcyBub3QgY2hhbmdlLCBhcyB0aGUgc2FtcGxlLCB3aGljaCBoYXMgbGVmdCB0aGUgd2luZG93IHdhcworICAgICAgICAgICBub3QgdGhlIG1heGltdW0gKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiB0aGUgb2xkIG1heGltdW0gaGFzIGxlZnQgdGhlIHdpbmRvdywgd2UgaGF2ZSB0byBzZWFyY2ggdGhlIGNvbXBsZXRlCisgICAgICAgICAgIGJ1ZmZlciBmb3IgdGhlIG5ldyBtYXggKi8KKyAgICAgICAgbWF4ID0gbWF4QnVmWzBdOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IGF0dGFjazsgaisrKSB7CisgICAgICAgICAgaWYgKG1heEJ1ZltqXSA+IG1heCkgbWF4ID0gbWF4QnVmW2pdOworICAgICAgICB9CisgICAgICB9CisgICAgICBtYXhCdWZJZHgrKzsKKyAgICAgIGlmIChtYXhCdWZJZHggPj0gYXR0YWNrKzEpIG1heEJ1ZklkeCA9IDA7CisKKyAgICAgIC8qIGNhbGMgZ2FpbiAqLworICAgICAgLyogZ2FpbiBpcyBkb3duc2NhbGVkIGJ5IG9uZSwgc28gdGhhdCBnYWluID0gMS4wIGNhbiBiZSByZXByZXNlbnRlZCAqLworICAgICAgaWYgKG1heCA+IHRocmVzaG9sZCkgeworICAgICAgICBnYWluID0gZkRpdk5vcm0odGhyZXNob2xkLCBtYXgpPj4xOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CisgICAgICB9CisKKyAgICAgIC8qIGdhaW4gc21vb3RoaW5nLCBtZXRob2Q6IFRETF9FWFBPTkVOVElBTCAqLworICAgICAgLyogZmlyc3Qgb3JkZXIgSUlSIGZpbHRlciB3aXRoIGF0dGFjayBjb3JyZWN0aW9uIHRvIGF2b2lkIG92ZXJzaG9vdHMgKi8KKworICAgICAgLyogY29ycmVjdCB0aGUgJ2FpbWluZycgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsIGF0dGFjayB0byBhdm9pZCB0aGUgcmVtYWluaW5nIG92ZXJzaG9vdCAqLworICAgICAgaWYgKGdhaW4gPCBzbW9vdGhTdGF0ZTApIHsKKyAgICAgICAgY29yID0gZk1pbihjb3IsIGZNdWx0RGl2MigoZ2FpbiAtIGZNdWx0RGl2MihGTDJGWENPTlNUX1NHTCgwLjFmKigxPDwxKSksc21vb3RoU3RhdGUwKSksIEZMMkZYQ09OU1RfU0dMKDEuMTExMTExMTFmLygxPDwxKSkpPDwyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb3IgPSBnYWluOworICAgICAgfQorCisgICAgICAvKiBzbW9vdGhpbmcgZmlsdGVyICovCisgICAgICBpZiAoY29yIDwgc21vb3RoU3RhdGUwKSB7CisgICAgICAgIHNtb290aFN0YXRlMCA9IGZNdWx0KGF0dGFja0NvbnN0LChzbW9vdGhTdGF0ZTAgLSBjb3IpKSArIGNvcjsgIC8qIGF0dGFjayAqLworICAgICAgICBzbW9vdGhTdGF0ZTAgPSBmTWF4KHNtb290aFN0YXRlMCwgZ2Fpbik7IC8qIGF2b2lkIG92ZXJzaG9vdGluZyB0YXJnZXQgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBzaWduIGludmVyc2lvbiB0d2ljZSB0byByb3VuZCB0b3dhcmRzICtpbmZpbml0eSwKKyAgICAgICAgICAgc28gdGhhdCBnYWluIGNhbiBjb252ZXJnZSB0byAxLjAgYWdhaW4sCisgICAgICAgICAgIGZvciBiaXQtaWRlbnRpY2FsIG91dHB1dCB3aGVuIGxpbWl0ZXIgaXMgbm90IGFjdGl2ZSAqLworICAgICAgICBzbW9vdGhTdGF0ZTAgPSAtZk11bHQocmVsZWFzZUNvbnN0LC0oc21vb3RoU3RhdGUwIC0gY29yKSkgKyBjb3I7IC8qIHJlbGVhc2UgKi8KKyAgICAgIH0KKworICAgICAgZ2FpbiA9IHNtb290aFN0YXRlMDsKKworICAgICAgLyogbG9va2FoZWFkIGRlbGF5LCBhcHBseSBnYWluICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworCisgICAgICAgIHRtcCA9IGRlbGF5QnVmW2RlbGF5QnVmSWR4ICogY2hhbm5lbHMgKyBqXTsKKyAgICAgICAgZGVsYXlCdWZbZGVsYXlCdWZJZHggKiBjaGFubmVscyArIGpdID0gZk11bHQoKEZJWFBfUENNKXNhbXBsZXNbaSAqIGNoYW5uZWxzICsgal0sIGFkZGl0aW9uYWxHYWluKTsKKworICAgICAgICAvKiBBcHBseSBnYWluIHRvIGRlbGF5ZWQgc2lnbmFsICovCisgICAgICAgIGlmIChnYWluIDwgRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpKQorICAgICAgICAgIHRtcCA9IGZNdWx0KHRtcCxnYWluPDwxKTsKKworICAgICAgICBzYW1wbGVzW2kgKiBjaGFubmVscyArIGpdID0gRlhfREJMMkZYX1BDTSgoRklYUF9EQkwpU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAsVERMX0dBSU5fU0NBTElORyxERlJBQ1RfQklUUykpOworICAgICAgfQorICAgICAgZGVsYXlCdWZJZHgrKzsKKyAgICAgIGlmIChkZWxheUJ1ZklkeCA+PSBhdHRhY2spIGRlbGF5QnVmSWR4ID0gMDsKKworICAgICAgLyogc2F2ZSBtaW5pbXVtIGdhaW4gZmFjdG9yICovCisgICAgICBpZiAoZ2FpbiA8IG1pbkdhaW4pIG1pbkdhaW4gPSBnYWluOworICAgIH0KKworCisgICAgbGltaXRlci0+bWF4ID0gbWF4OworICAgIGxpbWl0ZXItPm1heEJ1ZklkeCA9IG1heEJ1ZklkeDsKKyAgICBsaW1pdGVyLT5jb3IgPSBjb3I7CisgICAgbGltaXRlci0+ZGVsYXlCdWZJZHggPSBkZWxheUJ1ZklkeDsKKworICAgIGxpbWl0ZXItPnNtb290aFN0YXRlMCA9IHNtb290aFN0YXRlMDsKKyAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlID0gYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTsKKyAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMSA9IGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxOworCisgICAgbGltaXRlci0+bWluR2FpbiA9IG1pbkdhaW47CisKKyAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpblByZXYgPSBwR2FpblswXTsKKworICAgIHJldHVybiBURExJTUlUX09LOworICB9Cit9CisKKy8qIGdldCBkZWxheSBpbiBzYW1wbGVzICovCit1bnNpZ25lZCBpbnQgZ2V0TGltaXRlckRlbGF5KFRETGltaXRlclB0ciBsaW1pdGVyKQoreworICBGREtfQVNTRVJUKGxpbWl0ZXIgIT0gTlVMTCk7CisgIHJldHVybiBsaW1pdGVyLT5hdHRhY2s7Cit9CisKKy8qIHNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KK1RETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyTkNoYW5uZWxzKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgbkNoYW5uZWxzKQoreworICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIGlmIChuQ2hhbm5lbHMgPiBsaW1pdGVyLT5tYXhDaGFubmVscykgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgbGltaXRlci0+Y2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgIC8vcmVzZXRMaW1pdGVyKGxpbWl0ZXIpOworCisgIHJldHVybiBURExJTUlUX09LOworfQorCisvKiBzZXQgc2FtcGxpbmcgcmF0ZSAqLworVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJTYW1wbGVSYXRlKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgc2FtcGxlUmF0ZSkKK3sKKyAgdW5zaWduZWQgaW50IGF0dGFjaywgcmVsZWFzZTsKKyAgRklYUF9EQkwgYXR0YWNrQ29uc3QsIHJlbGVhc2VDb25zdCwgZXhwb25lbnQ7CisgIElOVCBlX2FuczsKKworICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIGlmIChzYW1wbGVSYXRlID4gbGltaXRlci0+bWF4U2FtcGxlUmF0ZSkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgLyogdXBkYXRlIGF0dGFjayBhbmQgcmVsZWFzZSB0aW1lIGluIHNhbXBsZXMgKi8KKyAgYXR0YWNrID0gKHVuc2lnbmVkIGludCkobGltaXRlci0+YXR0YWNrTXMgKiBzYW1wbGVSYXRlIC8gMTAwMCk7CisgIHJlbGVhc2UgPSAodW5zaWduZWQgaW50KShsaW1pdGVyLT5yZWxlYXNlTXMgKiBzYW1wbGVSYXRlIC8gMTAwMCk7CisKKyAgLyogYXR0YWNrQ29uc3QgPSBwb3coMC4xLCAxLjAgLyAoYXR0YWNrICsgMSkpICovCisgIGV4cG9uZW50ID0gaW52Rml4cChhdHRhY2srMSk7CisgIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CisgIGF0dGFja0NvbnN0ID0gc2NhbGVWYWx1ZShhdHRhY2tDb25zdCwgZV9hbnMpOworCisgIC8qIHJlbGVhc2VDb25zdCAgPSAoZmxvYXQpcG93KDAuMSwgMS4wIC8gKHJlbGVhc2UgKyAxKSkgKi8KKyAgZXhwb25lbnQgPSBpbnZGaXhwKHJlbGVhc2UgKyAxKTsKKyAgcmVsZWFzZUNvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CisgIHJlbGVhc2VDb25zdCA9IHNjYWxlVmFsdWUocmVsZWFzZUNvbnN0LCBlX2Fucyk7CisKKyAgbGltaXRlci0+YXR0YWNrICAgICAgICA9IGF0dGFjazsKKyAgbGltaXRlci0+YXR0YWNrQ29uc3QgICA9IGF0dGFja0NvbnN0OworICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgID0gcmVsZWFzZUNvbnN0OworICBsaW1pdGVyLT5zYW1wbGVSYXRlICAgID0gc2FtcGxlUmF0ZTsKKworICAvKiByZXNldCAqLworICAvL3Jlc2V0TGltaXRlcihsaW1pdGVyKTsKKworICByZXR1cm4gVERMSU1JVF9PSzsKK30KKworLyogc2V0IGF0dGFjayB0aW1lICovCitURExJTUlURVJfRVJST1Igc2V0TGltaXRlckF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IGF0dGFja01zKQoreworICB1bnNpZ25lZCBpbnQgYXR0YWNrOworICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgZXhwb25lbnQ7CisgIElOVCBlX2FuczsKKworICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIGlmIChhdHRhY2tNcyA+IGxpbWl0ZXItPm1heEF0dGFja01zKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjsKKworICAvKiBjYWxjdWxhdGUgYXR0YWNrIHRpbWUgaW4gc2FtcGxlcyAqLworICBhdHRhY2sgPSAodW5zaWduZWQgaW50KShhdHRhY2tNcyAqIGxpbWl0ZXItPnNhbXBsZVJhdGUgLyAxMDAwKTsKKworICAvKiBhdHRhY2tDb25zdCA9IHBvdygwLjEsIDEuMCAvIChhdHRhY2sgKyAxKSkgKi8KKyAgZXhwb25lbnQgPSBpbnZGaXhwKGF0dGFjaysxKTsKKyAgYXR0YWNrQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKKyAgYXR0YWNrQ29uc3QgPSBzY2FsZVZhbHVlKGF0dGFja0NvbnN0LCBlX2Fucyk7CisKKyAgbGltaXRlci0+YXR0YWNrICAgICAgICA9IGF0dGFjazsKKyAgbGltaXRlci0+YXR0YWNrQ29uc3QgICA9IGF0dGFja0NvbnN0OworICBsaW1pdGVyLT5hdHRhY2tNcyAgICAgID0gYXR0YWNrTXM7CisKKyAgcmV0dXJuIFRETElNSVRfT0s7Cit9CisKKy8qIHNldCByZWxlYXNlIHRpbWUgKi8KK1RETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyUmVsZWFzZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHJlbGVhc2VNcykKK3sKKyAgdW5zaWduZWQgaW50IHJlbGVhc2U7CisgIEZJWFBfREJMIHJlbGVhc2VDb25zdCwgZXhwb25lbnQ7CisgIElOVCBlX2FuczsKKworICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIC8qIGNhbGN1bGF0ZSAgcmVsZWFzZSB0aW1lIGluIHNhbXBsZXMgKi8KKyAgcmVsZWFzZSA9ICh1bnNpZ25lZCBpbnQpKHJlbGVhc2VNcyAqIGxpbWl0ZXItPnNhbXBsZVJhdGUgLyAxMDAwKTsKKworICAvKiByZWxlYXNlQ29uc3QgID0gKGZsb2F0KXBvdygwLjEsIDEuMCAvIChyZWxlYXNlICsgMSkpICovCisgIGV4cG9uZW50ID0gaW52Rml4cChyZWxlYXNlICsgMSk7CisgIHJlbGVhc2VDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOworICByZWxlYXNlQ29uc3QgPSBzY2FsZVZhbHVlKHJlbGVhc2VDb25zdCwgZV9hbnMpOworCisgIGxpbWl0ZXItPnJlbGVhc2VDb25zdCAgPSByZWxlYXNlQ29uc3Q7CisgIGxpbWl0ZXItPnJlbGVhc2VNcyAgICAgPSByZWxlYXNlTXM7CisKKyAgcmV0dXJuIFRETElNSVRfT0s7Cit9CisKKy8qIHNldCBsaW1pdGVyIHRocmVzaG9sZCAqLworVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIElOVF9QQ00gdGhyZXNob2xkKQoreworICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIGxpbWl0ZXItPnRocmVzaG9sZCA9IChGSVhQX1BDTSl0aHJlc2hvbGQ7CisKKyAgcmV0dXJuIFRETElNSVRfT0s7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliUENNdXRpbHMvc3JjL3BjbXV0aWxzX2xpYi5jcHAgYi9hYWMvbGliUENNdXRpbHMvc3JjL3BjbXV0aWxzX2xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhYzNmZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJQQ011dGlscy9zcmMvcGNtdXRpbHNfbGliLmNwcApAQCAtMCwwICsxLDI1MDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1dGlscyBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorICAgRGVzY3JpcHRpb246IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBkb3dubWl4aW5nIG9yIGEgc2ltcGxlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICBleHBhbnNpb24gaW4gdGhlIFBDTSB0aW1lIGRvbWFpbi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSAicGNtdXRpbHNfbGliLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKyNpbmNsdWRlICJGREtfY29yZS5oIgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgR0xPQkFMIFNFVFRJTkdTIChHRlIpOiAgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIERTRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcvRVRTSSBEVkIgYW5jaWxsYXJ5IGRhdGEgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGFzc2lzdGVkIGRvd25taXhpbmcgb2YgTVBFRy00IEFBQyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctMS8yIGxheWVyIDIgc3RyZWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcgbWF0cml4IG1peGRvd24gd2l0aCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCBjYXJyaWVkIGluIHRoZSBQQ0UuICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTICAgICAgICAgICggOCApICAgLyogTmVpdGhlciB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5wdXQgbm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgLi4uICovCisjZGVmaW5lIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyAgICAgICAgICggOCApICAgLyogLi4uIG11c3QgZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHRoZSBmcmFtZXdvcmsgY2FuIGhhbmRsZS4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgIFNQRUNJRklDIFNFVFRJTkdTOiAgICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAgICAgICAgICAgICAvKiE8IEFsbG93IG1vZHVsZSB0byBkdXBsaWNhdGUgbW9ubyBzaWduYWxzIG9yIGFkZCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuICovCisKKyNkZWZpbmUgUENNX0RNWF9ERkxUX01BWF9PVVRfQ0hBTk5FTFMgICAgKCA2ICkgICAvKiE8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbWl4ZG93biBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBtb3JlIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHNwZWNpZmllZC4gKi8KKyNkZWZpbmUgUENNX0RNWF9ERkxUX01JTl9PVVRfQ0hBTk5FTFMgICAgKCAwICkgICAvKiE8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGRvIGNoYW5uZWwgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBpbnB1dCBzaWduYWxzIHdpdGggbGVzcyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQuICovCisjZGVmaW5lIFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUyAgICAgICAgICggMSApICAgLyohPCBUaGUgbWF4aW11bSBkZWxheSBmcmFtZXMgdG8gYWxpZ24gdGhlIGJpdHN0cmVhbXMgcGF5bG9hZCB3aXRoIHRoZSBQQ00gb3V0cHV0LiAqLworI2RlZmluZSBQQ01fRE1YX0RGTFRfRVhQSVJZX0ZSQU1FICAgICAgICAoIDUwICkgIC8qITwgSWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1peGRvd24gY29lZmZpY2llbnRzIHdpbGwgZXhwaXJlIGJ5IGRlZmF1bHQgYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2YgZnJhbWVzLiBUaGUgdmFsdWUgNTAgY29ycmVzcG9uZHMgdG8gYXQgbGVhc3QgNTAwbXMgKEZMIDk2MCBAIDk2a0h6KSAqLworLyogI2RlZmluZSBQQ01ETVhfREVCVUcgKi8KKworLyogRGVyaXZlZCBzZXR0aW5nOgorICogICBObyBuZWVkIHRvIGVkaXQgYmV5b25kIHRoaXMgbGluZS4gKi8KKyNpZiBkZWZpbmVkKERTRV9NRVRBREFUQV9FTkFCTEUpIHx8IGRlZmluZWQoUENFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChBUklCX01JWERPV05fRU5BQkxFKQorICNkZWZpbmUgUENNX0RPV05NSVhfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhbGx5IGVuYWJsZSBkb3duIG1peGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+IDIpIHx8IChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKQorICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFMgICAgICAgICAgICAoIDggKQorICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDQgKQorICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICBQQ01fRE1YX01BWF9DSEFOTkVMUyAgIC8qIEFsbCBjaGFubmVscyBjYW4gYmUgaW4gb25lIGdyb3VwICovCisjZWxzZQorICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFMgICAgICAgICAgICAoIDMgKSAgIC8qIE5lZWQgdG8gYWRkIDEgYmVjYXVzZSB0aGVyZSBhcmUgdGhyZWUgY2hhbm5lbCBwb3NpdGlvbnMgaW4gZmlyc3QgY2hhbm5lbCBncm91cC4gKi8KKyAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCAxICkgICAvKiBPbmx5IGZyb250IGNoYW5uZWxzIHN1cHBvcnRlZC4gKi8KKyAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCAgKCAyICkgICAvKiBUaGUgbWF4aW11bSBvdmVyIGFsbCBjaGFubmVsIGdyb3VwcyAqLworI2VuZGlmCisjaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTKQorICNkZWZpbmUgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMgIFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTCisjZWxzZQorICNkZWZpbmUgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMgIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUworI2VuZGlmCisKKy8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCisjZGVmaW5lIFBDTURNWF9MSUJfVkwwIDIKKyNkZWZpbmUgUENNRE1YX0xJQl9WTDEgNAorI2RlZmluZSBQQ01ETVhfTElCX1ZMMiAyCisjZGVmaW5lIFBDTURNWF9MSUJfVElUTEUgIlBDTSBEb3dubWl4IExpYiIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKKworCisvKiBGaXhlZCBhbmQgdW5pcXVlIGNoYW5uZWwgZ3JvdXAgaW5kaWNlcy4KKyAqIFRoZSBsYXN0IGdyb3VwIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMuICovCisjZGVmaW5lIENIX0dST1VQX0ZST05UICggMCApCisjZGVmaW5lIENIX0dST1VQX1NJREUgICggMSApCisjZGVmaW5lIENIX0dST1VQX1JFQVIgICggMiApCisjZGVmaW5lIENIX0dST1VQX0xGRSAgICggMyApCisKKy8qIFRoZSBvcmRlcmluZyBvZiB0aGUgZm9sbG93aW5nIGZpeGVkIGNoYW5uZWwgbGFiZWxzIGhhcyB0byBiZSBpbiBNUEVHLTQgc3R5bGUuCisgKiBGcm9tIHRoZSBjZW50ZXIgdG8gdGhlIGJhY2sgd2l0aCBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGludGVybGVhdmVkIChzdGFydGluZyB3aXRoIGxlZnQpLgorICogVGhlIGxhc3QgY2hhbm5lbCBsYWJlbCBpbmRleCBoYXMgdG8gYmUgc21hbGxlciB0aGFuIFBDTV9ETVhfTUFYX0NIQU5ORUxTLiAqLworI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTCAgICAoIDAgKSAgICAgLyogQyAgKi8KKyNkZWZpbmUgTEVGVF9GUk9OVF9DSEFOTkVMICAgICAgKCAxICkgICAgIC8qIEwgICovCisjZGVmaW5lIFJJR0hUX0ZST05UX0NIQU5ORUwgICAgICggMiApICAgICAvKiBSICAqLworI2RlZmluZSBMRUZUX1JFQVJfQ0hBTk5FTCAgICAgICAoIDMgKSAgICAgLyogTHIgKGFrYSBsZWZ0IGJhY2sgY2hhbm5lbCkgb3IgY2VudGVyIGJhY2sgY2hhbm5lbCAqLworI2RlZmluZSBSSUdIVF9SRUFSX0NIQU5ORUwgICAgICAoIDQgKSAgICAgLyogUnIgKGFrYSByaWdodCBiYWNrIGNoYW5uZWwpICovCisjZGVmaW5lIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCAgICggNSApICAgICAvKiBMZiAqLworI2RlZmluZSBMRUZUX01VTFRJUFJQU19DSEFOTkVMICAoIDYgKSAgICAgLyogTGVmdCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLworI2RlZmluZSBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCAoIDcgKSAgICAgLyogUmlnaHQgbXVsdGlwdXJwb3NlIGNoYW5uZWwgKi8KKworLyogTW9yZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgT05FX0NIQU5ORUwgICAgICAgICAgICAgKCAxICkKKyNkZWZpbmUgVFdPX0NIQU5ORUwgICAgICAgICAgICAgKCAyICkKKyNkZWZpbmUgU0lYX0NIQU5ORUwgICAgICAgICAgICAgKCA2ICkKKyNkZWZpbmUgRUlHSFRfQ0hBTk5FTCAgICAgICAgICAgKCA4ICkKKworI2RlZmluZSBQQ01ETVhfQV9JRFhfREVGQVVMVCAgICAoIDIgKQorI2RlZmluZSBQQ01ETVhfQl9JRFhfREVGQVVMVCAgICAoIDIgKQorI2RlZmluZSBQQ01ETVhfTEZFX0lEWF9ERUZBVUxUICAoIDE1ICkKKyNkZWZpbmUgUENNRE1YX0dBSU5fNV9ERUZBVUxUICAgKCAwICkKKyNkZWZpbmUgUENNRE1YX0dBSU5fMl9ERUZBVUxUICAgKCAwICkKKworI2RlZmluZSBQQ01ETVhfTUFYX0hFQURST09NICAgICAoIDMgKSAgICAgLyogRGVmaW5lcyB0aGUgbWF4aW11bSBQQ00gc2NhbGluZyBoZWFkcm9vbSB0aGF0IGNhbiBiZSBkb25lIGJ5IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jZXNzaW5nIHN0ZXAuIFRoaXMgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIDAuICovCisKKyNkZWZpbmUgRkFMU0UgIDAKKyNkZWZpbmUgVFJVRSAgIDEKKyNkZWZpbmUgSU4gICAgIDAKKyNkZWZpbmUgT1VUICAgIDEKKworLyogVHlwZSBkZWZpbml0aW9uczogKi8KKyNpZm5kZWYgRE1YX0hJR0hfUFJFQ0lTSU9OX0VOQUJMRQorICNkZWZpbmUgRklYUF9ETVggICAgICAgICAgRklYUF9TR0wKKyAjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKKyAjZGVmaW5lIEZYX0RCTDJGWF9ETVgoeCkgIEZYX0RCTDJGWF9TR0woeCkKKyAjZGVmaW5lIEZMMkZYQ09OU1RfRE1YKHgpIEZMMkZYQ09OU1RfU0dMKHgpCisgI2RlZmluZSBNQVhWQUxfRE1YICAgICAgICBNQVhWQUxfU0dMCisgI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAgICAoKFNIT1JUKSh4KSkKKyAjZGVmaW5lIEZYX0RNWDJGTCh4KSAgICAgIEZYX0RCTDJGTChGWF9ETVgyRlhfREJMKHgpKQorI2Vsc2UKKyAjZGVmaW5lIEZJWFBfRE1YICAgICAgICAgIEZJWFBfREJMCisgI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpICAoKEZJWFBfREJMKSh4KSkKKyAjZGVmaW5lIEZYX0RCTDJGWF9ETVgoeCkgICgoRklYUF9EQkwpKHgpCisgI2RlZmluZSBGTDJGWENPTlNUX0RNWCh4KSBGTDJGWENPTlNUX0RCTCh4KQorICNkZWZpbmUgTUFYVkFMX0RNWCAgICAgICAgTUFYVkFMX0RCTAorICNkZWZpbmUgRlhfRE1YMlNIUlQoeCkgICAgKChTSE9SVCkoKHgpPj5GUkFDVF9CSVRTKSkKKyAjZGVmaW5lIEZYX0RNWDJGTCh4KSAgICAgIEZYX0RCTDJGTCh4KQorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcG9zaXRpb25zIGZvciBlYWNoIGdyb3VwIGluIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAqIFNlZSB0aGUgY2hhbm5lbCBsYWJlbHMgYWJvdmUuICovCitzdGF0aWMgY29uc3QgVUNIQVIgbWF4Q2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU10gPSB7CisjaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKKyAgMywgMCwgMiwgMQorI2Vsc2UKKyAgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQCisjZW5kaWYKK307CisKKy8qIExpc3Qgb2YgcGFja2VkIGNoYW5uZWwgbW9kZXMgKi8KK3R5cGVkZWYgZW51bQoreyAvKiBDSF9NT0RFXzxudW1Gcm9udENoPl88bnVtU2lkZUNoPl88bnVtQmFja0NoPl88bnVtTGZDaD4gKi8KKyAgQ0hfTU9ERV9VTkRFRklORUQgPSAweDAwMDAsCisgIC8qIDEgY2hhbm5lbCAqLworICBDSF9NT0RFXzFfMF8wXzAgICA9IDB4MDAwMSwgICAvKiBjaENmZyAxICovCisgIC8qIDIgY2hhbm5lbHMgKi8KKyAgQ0hfTU9ERV8yXzBfMF8wICAgPSAweDAwMDIsICAgLyogY2hDZmcgMiAqLworICAvKiAzIGNoYW5uZWxzICovCisgIENIX01PREVfM18wXzBfMCAgID0gMHgwMDAzLCAgIC8qIGNoQ2ZnIDMgKi8KKyAgQ0hfTU9ERV8yXzBfMV8wICAgPSAweDAxMDIsCisgIENIX01PREVfMl8wXzBfMSAgID0gMHgxMDAyLAorICAvKiA0IGNoYW5uZWxzICovCisgIENIX01PREVfM18wXzFfMCAgID0gMHgwMTAzLCAgIC8qIGNoQ2ZnIDQgKi8KKyAgQ0hfTU9ERV8yXzBfMl8wICAgPSAweDAyMDIsCisgIENIX01PREVfMl8wXzFfMSAgID0gMHgxMTAyLAorICBDSF9NT0RFXzRfMF8wXzAgICA9IDB4MDAwNCwKKyAgLyogNSBjaGFubmVscyAqLworICBDSF9NT0RFXzNfMF8yXzAgICA9IDB4MDIwMywgICAvKiBjaENmZyA1ICovCisgIENIX01PREVfMl8wXzJfMSAgID0gMHgxMjAyLAorICBDSF9NT0RFXzNfMF8xXzEgICA9IDB4MTEwMywKKyAgQ0hfTU9ERV8zXzJfMF8wICAgPSAweDAwMjMsCisgIENIX01PREVfNV8wXzBfMCAgID0gMHgwMDA1LAorICAvKiA2IGNoYW5uZWxzICovCisgIENIX01PREVfM18wXzJfMSAgID0gMHgxMjAzLCAgIC8qIGNoQ2ZnIDYgKi8KKyAgQ0hfTU9ERV8zXzJfMF8xICAgPSAweDEwMjMsCisgIENIX01PREVfM18yXzFfMCAgID0gMHgwMTIzLAorICBDSF9NT0RFXzVfMF8xXzAgICA9IDB4MDEwNSwKKyAgQ0hfTU9ERV82XzBfMF8wICAgPSAweDAwMDYsCisgIC8qIDcgY2hhbm5lbHMgKi8KKyAgQ0hfTU9ERV8yXzJfMl8xICAgPSAweDEyMjIsCisgIENIX01PREVfM18wXzNfMSAgID0gMHgxMzAzLCAgIC8qIGNoQ2ZnIDExICovCisgIENIX01PREVfM18yXzFfMSAgID0gMHgxMTIzLAorICBDSF9NT0RFXzNfMl8yXzAgICA9IDB4MDIyMywKKyAgQ0hfTU9ERV8zXzBfMl8yICAgPSAweDIyMDMsCisgIENIX01PREVfNV8wXzJfMCAgID0gMHgwMjA1LAorICBDSF9NT0RFXzVfMF8xXzEgICA9IDB4MTEwNSwKKyAgQ0hfTU9ERV83XzBfMF8wICAgPSAweDAwMDcsCisgIC8qIDggY2hhbm5lbHMgKi8KKyAgQ0hfTU9ERV8zXzJfMl8xICAgPSAweDEyMjMsCisgIENIX01PREVfM18wXzRfMSAgID0gMHgxNDAzLCAgIC8qIGNoQ2ZnIDEyICovCisgIENIX01PREVfNV8wXzJfMSAgID0gMHgxMjA1LCAgIC8qIGNoQ2ZnIDcgKyAxNCAqLworICBDSF9NT0RFXzVfMl8xXzAgICA9IDB4MDEyNSwKKyAgQ0hfTU9ERV8zXzJfMV8yICAgPSAweDIxMjMsCisgIENIX01PREVfMl8yXzJfMiAgID0gMHgyMjIyLAorICBDSF9NT0RFXzNfMF8zXzIgICA9IDB4MjMwMywKKyAgQ0hfTU9ERV84XzBfMF8wICAgPSAweDAwMDgKKworfSBQQ01fRE1YX0NIQU5ORUxfTU9ERTsKKworCisvKiBUaGVzZSBhcmUgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgbGlua2VkIHRvCisgICB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBnaXZlIGJ5IHRoZSB1c2VyOiAqLworc3RhdGljIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFIG91dENoTW9kZVRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTKzFdID0KK3sKKyAgQ0hfTU9ERV9VTkRFRklORUQsCisgIENIX01PREVfMV8wXzBfMCwgIC8qIDEgY2hhbm5lbCAgKi8KKyAgQ0hfTU9ERV8yXzBfMF8wLCAgLyogMiBjaGFubmVscyAqLworICBDSF9NT0RFXzNfMF8wXzAgICAvKiAzIGNoYW5uZWxzICovCisjaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKKyAsQ0hfTU9ERV8zXzBfMV8wLCAgLyogNCBjaGFubmVscyAqLworICBDSF9NT0RFXzNfMF8yXzAsICAvKiA1IGNoYW5uZWxzICovCisgIENIX01PREVfM18wXzJfMSwgIC8qIDYgY2hhbm5lbHMgKi8KKyAgQ0hfTU9ERV8zXzBfM18xLCAgLyogNyBjaGFubmVscyAqLworICBDSF9NT0RFXzNfMF80XzEgICAvKiA4IGNoYW5uZWxzICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RNWCBhYk1peEx2bFZhbHVlVGFiWzhdID0KK3sKKyAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiBzY2FsZWQgYnkgMSAqLworICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLAorICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLAorICBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLAorICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLAorICBGTDJGWENPTlNUX0RNWCgwLjQyMmYpLAorICBGTDJGWENPTlNUX0RNWCgwLjM1NWYpLAorICBGTDJGWENPTlNUX0RNWCgwLjBmKQorfTsKKworc3RhdGljIGNvbnN0IEZJWFBfRE1YIGxmZU1peEx2bFZhbHVlVGFiWzE2XSA9Cit7IC8qICAgICAgICAgICAgIHZhbHVlLCAgICAgICAgc2NhbGUgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC43OTA1ZiksICAvKiAgICAgMiAqLworICBGTDJGWENPTlNUX0RNWCgwLjUwMDBmKSwgIC8qICAgICAyICovCisgIEZMMkZYQ09OU1RfRE1YKDAuODM5NWYpLCAgLyogICAgIDEgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC43MDY1ZiksICAvKiAgICAgMSAqLworICBGTDJGWENPTlNUX0RNWCgwLjU5NDVmKSwgIC8qICAgICAxICovCisgIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogICAgIDEgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwgICAvKiAgICAgMCAqLworICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAgIC8qICAgICAwICovCisgIEZMMkZYQ09OU1RfRE1YKDAuNTk2ZiksICAgLyogICAgIDAgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiAgICAgMCAqLworICBGTDJGWENPTlNUX0RNWCgwLjMxNmYpLCAgIC8qICAgICAwICovCisgIEZMMkZYQ09OU1RfRE1YKDAuMTc4ZiksICAgLyogICAgIDAgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC4xMDBmKSwgICAvKiAgICAgMCAqLworICBGTDJGWENPTlNUX0RNWCgwLjAzMmYpLCAgIC8qICAgICAwICovCisgIEZMMkZYQ09OU1RfRE1YKDAuMDEwZiksICAgLyogICAgIDAgKi8KKyAgRkwyRlhDT05TVF9ETVgoMC4wMDBmKSAgICAvKiAgICAgMCAqLworfTsKKworCisKKyNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCisgIC8qIE1QRUcgbWF0cml4IG1peGRvd246CisgICAgICBTZXQgMTogIEwnID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgKyBBICogTHNdOworICAgICAgICAgICAgICBSJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIFJzXTsKKworICAgICAgU2V0IDI6ICBMJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSAtIEEgKiAoTHMgKyBScyldOworICAgICAgICAgICAgICBSJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtSICsgQyAqIDJeLTAuNSArIEEgKiAoTHMgKyBScyldOworCisgICAgICBNID0gKDMgKyAyQSleLTEgKiBbTCArIEMgKyBSICsgQSooTHMgKyBScyldOworICAqLworICBzdGF0aWMgY29uc3QgRklYUF9ETVggbXBlZ01peERvd25JZHgyQ29lZls0XSA9CisgIHsKKyAgICBGTDJGWENPTlNUX0RNWCgwLjcwNzEwNjc4ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC41ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC4zNTM1NTMzOWYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuMGYpCisgIH07CisKKyAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIG1wZWdNaXhEb3duSWR4MlByZUZhY3RbM11bNF0gPQorICB7IHsgIC8qIFNldCAxOiAqLworICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuNDUzMDgxODM5MzIxOTcyOGYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuNDg1MjgxMzc0MjM4NTcwM2YpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCisgIH0seyAgLyogU2V0IDI6ICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4zMjAzNzcyNDEwMTcwNDA3ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC4zNjkzOTgwNjI1MTgxMjkzZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC40MTQyMTM1NjIzNzMwOTUwZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZikKKyAgfSx7ICAvKiBNb25vIERNWCBzZXQ6ICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4yMjY1NDA5MTk2NjA5ODY0ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC4yNWYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuMjY5NzUyMTQzMzg5ODE3OWYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuMzMzMzMzMzMzMzMzMzMzM2YpIH0KKyAgfTsKKyNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLworCisKKyNkZWZpbmUgVFlQRV9OT05FICAgICAgKCAweDAgKQorI2RlZmluZSBUWVBFX0RTRV9EQVRBICAoIDB4MSApCisjZGVmaW5lIFRZUEVfUENFX0RBVEEgICggMHgyICkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVCAgIHR5cGVGbGFnczsKKyAgLyogRnJvbSBEU0UgKi8KKyAgVUNIQVIgIGNMZXZJZHg7CisgIFVDSEFSICBzTGV2SWR4OworICBVQ0hBUiAgZG1peElkeEE7CisgIFVDSEFSICBkbWl4SWR4QjsKKyAgVUNIQVIgIGRtaXhJZHhMZmU7CisgIFVDSEFSICBkbXhHYWluSWR4MjsKKyAgVUNIQVIgIGRteEdhaW5JZHg1OworI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKKyAgLyogRnJvbSBQQ0UgKi8KKyAgVUNIQVIgIG1hdHJpeE1peGRvd25JZHg7CisjZW5kaWYKKyAgLyogQXR0cmlidXRlczogKi8KKyAgU0NIQVIgIHBzZXVkb1N1cnJvdW5kOyAgICAgICAgICAgICAgIC8qITwgSWYgc2V0IHRvIDEgdGhlIHNpZ25hbCBpcyBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZS4gVGhlIHZhbHVlIDAgdGVsbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBpcyBub3QuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gICovCisgIFVJTlQgICBleHBpcnlDb3VudDsgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgdG8gbW9uaXRvciB0aGUgbGlmZSB0aW1lIG9mIGEgbWV0YSBkYXRhIHNldC4gKi8KKworfSBETVhfQlNfTUVUQV9EQVRBOworCisvKiBEZWZhdWx0IG1ldGFkYXRhICovCitzdGF0aWMgY29uc3QgRE1YX0JTX01FVEFfREFUQSAgZGZsdE1ldGFEYXRhID0geworICAwLCAyLCAyLCAyLCAyLCAxNSwgMCwgMCwKKyNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCisgIDAsCisjZW5kaWYKKyAgLTEsIDAKK307CisKKy8qIER5bmFtaWMgKHVzZXIpIHBhcmFtczoKKyAgICAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIFBDTURNWF9QQVJBTSBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMgZmllbGRzLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVCAgIGV4cGlyeUZyYW1lOyAgICAgICAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUgICAgICAgKi8KKyAgRFVBTF9DSEFOTkVMX01PREUgZHVhbENoYW5uZWxNb2RlOyAgICAvKiE8IExpbmtlZCB0byBETVhfRFVBTF9DSEFOTkVMX01PREUgICAgICAgICAgKi8KKyAgUFNFVURPX1NVUlJPVU5EX01PREUgcHNldWRvU3Vyck1vZGU7ICAvKiE8IExpbmtlZCB0byBETVhfUFNFVURPX1NVUlJPVU5EX01PREUgICAgICAgKi8KKyAgU0hPUlQgIG51bU91dENoYW5uZWxzTWluOyAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KKyAgU0hPUlQgIG51bU91dENoYW5uZWxzTWF4OyAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KKyAgVUNIQVIgIGZyYW1lRGVsYXk7ICAgICAgICAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9ERUxBWSAgICAgICAgICAgICAgKi8KKworfSBQQ01fRE1YX1VTRVJfUEFSQU1TOworCisvKiBNb2R1bGVzIG1haW4gZGF0YSBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRQoreworICAvKiBNZXRhZGF0YSAqLworICBETVhfQlNfTUVUQV9EQVRBICAgICBic01ldGFEYXRhW1BDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUysxXTsKKyAgUENNX0RNWF9VU0VSX1BBUkFNUyAgdXNlclBhcmFtczsKKworICBVQ0hBUiAgYXBwbHlQcm9jZXNzaW5nOyAgICAgICAgICAgICAgLyohPCBGbGFnIHRvIGVuLS9kaXNhYmxlIG1vZHVsZXMgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBjaGFubmVsIGxpbWl0aW5nIGlzIGRvbmUgaW5kZXBlbmRlbnRseS4gKi8KK307CisKKy8qIE1lbW9yeSBhbGxvY2F0aW9uIG1hY3JvICovCitDX0FMTE9DX01FTV9TVEFUSUMoUGNtRG14SW5zdGFuY2UsIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFLCAxKQorCisKKy8qKiBFdmFsdWF0ZSBhIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZXh0cmFjdCBhIHBhY2tlZCBjaGFubmVsIG1vZGUuIEluIGFkZGl0aW9uIHRoZQorICogIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGNoYW5uZWwgb2Zmc2V0IHRhYmxlIGZvciB0aGUgbWFwcGluZyB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW52ZXJzZSB0byB0aGUgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKCkgcm91dGluZS4KKyAqIEBwYXJhbSBbaW5dIFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCisgKiBAcGFyYW0gW291dF0gVGhlIGdlbmVyYXRlZCBwYWNrZWQgY2hhbm5lbCBtb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK3N0YXRpYworUENNRE1YX0VSUk9SIGdldENoYW5uZWxNb2RlICgKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgICAgIGNvbnN0IEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KKyAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIG9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwgICAgIC8qIG91dCAqLworICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgICAqY2hNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCisgICAgICApCit7CisgIFVDSEFSIGNoSWR4W1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXVtQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVBdOworICBVQ0hBUiBudW1DaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsgLyogVG90YWwgbnVtIG9mIGNoYW5uZWxzIHBlciBncm91cCBvZiB0aGUgaW5wdXQgY29uZmlnICovCisgIFVDSEFSIG51bUNoRnJlZVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107ICAvKiBOdW1iZXIgb2YgZnJlZSBzbG90cyBwZXIgZ3JvdXAgaW4gdGhlIGludGVybmFsIHJlcHIuICovCisgIFVDSEFSIGhhcmRUb1BsYWNlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsgICAgICAvKiBMaXN0IG9mIGNoYW5uZWxzIG5vdCBtYXRjaGluZyB0aGUgaW50ZXJuYWwgcmVwci4gKi8KKyAgVUNIQVIgaDJwU29ydElkeFtQQ01fRE1YX01BWF9DSEFOTkVMU107CisgIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7CisgIGludCAgIGNoLCBncnBJZHg7CisgIGludCAgIG51bUNoVG9QbGFjZSA9IDA7CisKKyAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaGFubmVsSW5kaWNlcyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaE1vZGUgIT0gTlVMTCk7CisKKyAgLyogRm9yIGRldGFpbHMgc2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMyBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgRkRLbWVtY2xlYXIobnVtQ2hJbkdycCwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtc2V0KGNoSWR4LCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCpzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtc2V0KGhhcmRUb1BsYWNlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOworICBGREttZW1zZXQoaDJwU29ydElkeCwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKKyAgLyogR2V0IHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCisgIEZES21lbWNweShudW1DaEZyZWUsIG1heENoSW5HcnAsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKnNpemVvZihVQ0hBUikpOworCisgICpjaE1vZGUgPSBDSF9NT0RFX1VOREVGSU5FRDsKKworICAvKiBDYXRlZ29yaXplIGNoYW5uZWxzICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgVUNIQVIgY2hHcnBJZHggPSBjaGFubmVsSW5kaWNlc1tjaF07CisgICAgaW50IGkgPSAwLCBqOworCisgICAgc3dpdGNoIChjaGFubmVsVHlwZVtjaF0pIHsKKyAgICBjYXNlIEFDVF9GUk9OVF9UT1A6CisgICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXTsgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KKyAgICBjYXNlIEFDVF9GUk9OVDoKKyAgICAgIGdycElkeCA9IENIX0dST1VQX0ZST05UOworICAgICAgYnJlYWs7CisjaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKKyAgICBjYXNlIEFDVF9TSURFX1RPUDoKKyAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV07ICAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLworICAgIGNhc2UgQUNUX1NJREU6CisgICAgICBncnBJZHggPSBDSF9HUk9VUF9TSURFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ1RfQkFDS19UT1A6CisgICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdOyAgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KKyAgICBjYXNlIEFDVF9CQUNLOgorICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfUkVBUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUNUX0xGRToKKyAgICAgIGdycElkeCA9IENIX0dST1VQX0xGRTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZvdW5kIGEgY2hhbm5lbCB0aGF0IGNhbiBub3QgYmUgY2F0ZWdvcml6ZWQhIE1vc3QgbGlrZWx5IGR1ZSB0byBjb3JydXB0IGlucHV0IHNpZ25hbGxpbmcuCisgICAgICAgICBUaGUgcmVzY3VlIHN0cmF0ZWd5IGlzIHRvIGFwcGVuZCBpdCB0byB0aGUgZnJvbnQgY2hhbm5lbHMgKD0+IGlnbm9yZSBpbmRleCkuCisgICAgICAgICBUaGlzIGNvdWxkIGNhdXNlIHN0cmFuZ2UgYmVoYXZpb3VyIHNvIHJldHVybiBhbiBlcnJvciB0byBzaWduYWwgaXQuICovCisgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfRlJPTlQ7CisgICAgICBjaEdycElkeCA9IG51bUNoYW5uZWxzICsgbnVtQ2hUb1BsYWNlOworICAgICAgbnVtQ2hUb1BsYWNlICs9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobnVtQ2hJbkdycFtncnBJZHhdIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQKSB7CisgICAgICAvKiBTb3J0IGNoYW5uZWxzIGJ5IGluZGV4ICovCisgICAgICB3aGlsZSAoIChpIDwgbnVtQ2hJbkdycFtncnBJZHhdKSAmJiAoY2hHcnBJZHggPiBjaGFubmVsSW5kaWNlc1tjaElkeFtncnBJZHhdW2ldXSkgKSB7CisgICAgICAgIGkgKz0gMTsKKyAgICAgIH0KKyAgICAgIGZvciAoaiA9IG51bUNoSW5HcnBbZ3JwSWR4XTsgaiA+IGk7IGogLT0gMSkgeworICAgICAgICBjaElkeFtncnBJZHhdW2pdID0gY2hJZHhbZ3JwSWR4XVtqLTFdOworICAgICAgfQorICAgICAgY2hJZHhbZ3JwSWR4XVtpXSA9IGNoOworICAgICAgbnVtQ2hJbkdycFtncnBJZHhdICs9IDE7CisgICAgfQorICB9CisKKyNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQorICBGREtfQVNTRVJUKCAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0rbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXQorICAgICAgICAgICAgICArbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXStudW1DaEluR3JwW0NIX0dST1VQX0xGRV0pID09IG51bUNoYW5uZWxzKTsKKyNlbHNlCisgIEZES19BU1NFUlQoIG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdID09IG51bUNoYW5uZWxzICk7CisjZW5kaWYKKworICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlOgorICAgKiBNYXAgYWxsIGNoYW5uZWxzIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gKi8KKyAgbnVtQ2hUb1BsYWNlID0gMDsKKworICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCisgIGlmIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4MSkgeworICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgorICAgICAgIEluIE1QRUctNCB0aGUgY2VudGVyIGhhcyB0aGUgaW5kZXggMC4gKi8KKyAgICBvZmZzZXRUYWJsZVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBjaElkeFtDSF9HUk9VUF9GUk9OVF1bMF07CisgICAgbnVtQ2hGcmVlW0NIX0dST1VQX0ZST05UXSAtPSAxOworICB9CisKKyAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKKyAgICBpbnQgY2hNYXBQb3MgPSAwOworICAgIGNoID0gMDsgIC8qIEluZGV4IG9mIGNoYW5uZWwgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCAqLworCisgICAgc3dpdGNoIChncnBJZHgpIHsKKyAgICBjYXNlIENIX0dST1VQX0ZST05UOgorICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CisgICAgICBjaCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKKyAgICAgIGJyZWFrOworI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCisgICAgY2FzZSBDSF9HUk9VUF9TSURFOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDSF9HUk9VUF9SRUFSOgorICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hfR1JPVVBfTEZFOgorICAgICAgY2hNYXBQb3MgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogTWFwIGFsbCBjaGFubmVscyBvZiB0aGUgZ3JvdXAgKi8KKyAgICBmb3IgKCA7IGNoIDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaCArPSAxKSB7CisgICAgICBpZiAobnVtQ2hGcmVlW2dycElkeF0gPiAwKSB7CisgICAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zXSA9IGNoSWR4W2dycElkeF1bY2hdOworICAgICAgICBjaE1hcFBvcyArPSAxOworICAgICAgICBudW1DaEZyZWVbZ3JwSWR4XSAtPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQWRkIHRvIHRoZSBsaXN0IG9mIGhhcmRzaGlwIGNhc2VzIGNvbnNpZGVyaW5nIGEgTVBFRy1saWtlIHNvcnRpbmcgb3JkZXI6ICovCisgICAgICAgIGludCBwb3MsIHNvcnRJZHggPSBncnBJZHgqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hhbm5lbEluZGljZXNbY2hJZHhbZ3JwSWR4XVtjaF1dOworICAgICAgICBmb3IgKHBvcyA9IG51bUNoVG9QbGFjZTsgcG9zID4gMDsgcG9zIC09IDEpIHsKKyAgICAgICAgICBpZiAoaDJwU29ydElkeFtwb3MtMV0gPiBzb3J0SWR4KSB7CisgICAgICAgICAgICBoYXJkVG9QbGFjZVtwb3NdID0gaGFyZFRvUGxhY2VbcG9zLTFdOworICAgICAgICAgICAgaDJwU29ydElkeFtwb3NdID0gaDJwU29ydElkeFtwb3MtMV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEluc2VydCBjaGFubmVsIGF0IHRoZSBjdXJyZW50IGluZGV4L3Bvc2l0aW9uICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaGFyZFRvUGxhY2VbcG9zXSA9IGNoSWR4W2dycElkeF1bY2hdOworICAgICAgICBoMnBTb3J0SWR4W3Bvc10gPSBzb3J0SWR4OworICAgICAgICBudW1DaFRvUGxhY2UgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB7IC8qIEFzc2lnbiB0aGUgaGFyZHNoaXAgY2FzZXMgKi8KKyAgICBpbnQgY2hNYXBQb3MgPSAwOworICAgIGludCBtYXBwaW5nSGVhdCA9IDA7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hUb1BsYWNlOyBjaCs9MSkgeworICAgICAgaW50IGNoQXNzaWduZWQgPSAwOworCisgICAgICAvKiBKdXN0IGFzc2lnbmluZyB0aGUgY2hhbm5lbHMgdG8gdGhlIG5leHQgYmVzdCBzbG90IGNhbiBsZWFkIHRvIHVuZGVzaXJlZCByZXN1bHRzIChlc3BlY2lhbGx5IGZvciB4L3gvMS54CisgICAgICAgICBjb25maWd1cmF0aW9ucykuIFRodXMgdXNlIHRoZSBNUEVHLWxpa2Ugc29ydGluZyBpbmRleCB0byBmaW5kIHRoZSBiZXN0IGZpdHRpbmcgc2xvdCBmb3IgZWFjaCBjaGFubmVsLgorICAgICAgICAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUgdGhlIHNvcnRpbmcgaW5kZXggd2lsbCBiZSBpZ25vcmVkIChtYXBwaW5nSGVhdCA+PSAyKS4gKi8KKyAgICAgIGZvciAoIDsgY2hNYXBQb3MgPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2hNYXBQb3MrPTEpIHsKKyAgICAgICAgaWYgKG9mZnNldFRhYmxlW2NoTWFwUG9zXSA9PSAyNTUpIHsKKyAgICAgICAgICBpbnQgcHJ2U29ydElkeCA9IDA7CisgICAgICAgICAgaW50IG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKKworICAgICAgICAgIGlmIChtYXBwaW5nSGVhdCA8IDIpIHsKKyAgICAgICAgICAgIGlmIChjaE1hcFBvcyA8IExFRlRfUkVBUl9DSEFOTkVMKSB7CisgICAgICAgICAgICAgIC8qIEdvdCBmcm9udCBjaGFubmVsIHNsb3QgKi8KKyAgICAgICAgICAgICAgcHJ2U29ydElkeCA9IENIX0dST1VQX0ZST05UKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gQ0VOVEVSX0ZST05UX0NIQU5ORUw7CisgICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9TSURFICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaE1hcFBvcyA8IExPV19GUkVRVUVOQ1lfQ0hBTk5FTCkgeworICAgICAgICAgICAgICAvKiBHb3QgYmFjayBjaGFubmVsIHNsb3QgKi8KKyAgICAgICAgICAgICAgcHJ2U29ydElkeCA9IENIX0dST1VQX1JFQVIqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBMRUZUX1JFQVJfQ0hBTk5FTDsKKyAgICAgICAgICAgICAgbnh0U29ydElkeCA9IENIX0dST1VQX0xGRSAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2hNYXBQb3MgPCBMRUZUX01VTFRJUFJQU19DSEFOTkVMKSB7CisgICAgICAgICAgICAgIC8qIEdvdCBsZmUgY2hhbm5lbCBzbG90ICovCisgICAgICAgICAgICAgIHBydlNvcnRJZHggPSAgQ0hfR1JPVVBfTEZFICAgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOworICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gKENIX0dST1VQX0xGRSsxKSpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogQXNzaWduIHRoZSBjaGFubmVsIG9ubHkgaWYgaXRzIHNvcnQgaW5kZXggaXMgd2l0aGluIHRoZSByYW5nZSAqLworICAgICAgICAgIGlmICggKGgycFNvcnRJZHhbY2hdID49IHBydlNvcnRJZHgpCisgICAgICAgICAgICAmJiAoaDJwU29ydElkeFtjaF0gPCAgbnh0U29ydElkeCkgKSB7CisgICAgICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvcysrXSA9IGhhcmRUb1BsYWNlW2NoXTsKKyAgICAgICAgICAgIGNoQXNzaWduZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoY2hBc3NpZ25lZCA9PSAwKSB7CisgICAgICAgIGNoTWFwUG9zID0gMDsKKyAgICAgICAgY2ggLT0gMTsKKyAgICAgICAgbWFwcGluZ0hlYXQgKz0gMTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ29tcG9zZSB0aGUgY2hhbm5lbCBtb2RlICovCisgICpjaE1vZGUgPSAoUENNX0RNWF9DSEFOTkVMX01PREUpKCAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweEYpCisjaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX1NJREVdICAmIDB4RikgPDwgIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICAmIDB4RikgPDwgIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX0xGRV0gICAmIDB4RikgPDwgMTIKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgcmV0dXJuIGVycjsKK30KKworCisvKiogR2VuZXJhdGUgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBhbmQgY29tcGxldGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiAocGFja2VkKSBjaGFubmVsIG1vZGUuCisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW52ZXJzZSB0byB0aGUgZ2V0Q2hhbm5lbE1vZGUoKSByb3V0aW5lIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHdlaXJkIGNoYW5uZWwKKyAqICBjb25maWd1cmF0aW9ucy4gQWxsIGNoYW5uZWxzIGhhdmUgdG8gYmUgaW4gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgYW5kIHRoZXJlIG11c3Qgbm90IGJlIG1vcmUKKyAqICBjaGFubmVscyBpbiBlYWNoIGdyb3VwIHRoYW4gZ2l2ZW4gYnkgbWF4Q2hJbkdycC4KKyAqIEBwYXJhbSBbaW5dIFRoZSBwYWNrZWQgY2hhbm5lbCBtb2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHByb2Nlc3NlZC4KKyAqIEBwYXJhbSBbaW5dIEFycmF5IGNvbnRhaW5pbmcgdGhlIGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KKyAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbHMgYXJlIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIHRoZSBidWZmZXIgb2Zmc2V0cyBmb3IgZWFjaCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KKyAqIEByZXR1cm5zIE5vbmUuCisgKiovCitzdGF0aWMKK3ZvaWQgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uICgKKyAgICAgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgIGNoTW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgICAgICBjaGFubmVsVHlwZVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCisgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCisgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU10gICAgICAgLyogb3V0ICovCisgICAgICApCit7CisgIGNvbnN0IFVDSEFSICpwQ2hhbm5lbE1hcDsKKyAgaW50ICAgZ3JwSWR4LCBjaCA9IDAsIG51bUNoYW5uZWxzID0gMDsKKyAgVUNIQVIgbnVtQ2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107CisKKyAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaGFubmVsSW5kaWNlcyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaGFubmVsTWFwcGluZyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKKworICAvKiBJbml0IG91dHB1dCBhcnJheXMgKi8KKyAgRkRLbWVtY2xlYXIoY2hhbm5lbFR5cGUsICAgIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKKyAgRkRLbWVtY2xlYXIoY2hhbm5lbEluZGljZXMsIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOworICBGREttZW1zZXQob2Zmc2V0VGFibGUsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CisKKyAgLyogRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBncm91cCAqLworICBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSA9ICBjaE1vZGUgICAgICAgICYgMHhGOworI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCisgIG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0gID0gKGNoTW9kZSA+PiAgNCkgJiAweEY7CisgIG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0gID0gKGNoTW9kZSA+PiAgOCkgJiAweEY7CisgIG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgID0gKGNoTW9kZSA+PiAxMikgJiAweEY7CisjZW5kaWYKKworICAvKiBTdW1tZXJpemUgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKKyAgICBudW1DaGFubmVscyArPSBudW1DaEluR3JwW2dycElkeF07CisgIH0KKworICAvKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgbWFwICovCisgIHN3aXRjaCAoY2hNb2RlKSB7CisgIGNhc2UgQ0hfTU9ERV8xXzBfMF8wOgorICBjYXNlIENIX01PREVfMl8wXzBfMDoKKyAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6CisgIGNhc2UgQ0hfTU9ERV8zXzBfMV8wOgorICBjYXNlIENIX01PREVfM18wXzJfMDoKKyAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6CisgICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1tudW1DaGFubmVsc107CisgICAgYnJlYWs7CisgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOgorICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMTFdOworICAgIGJyZWFrOworICBjYXNlIENIX01PREVfM18wXzRfMToKKyAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzEyXTsKKyAgICBicmVhazsKKyAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6CisgICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1s3XTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICAvKiBmYWxsYmFjayAqLworICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMF07CisgICAgYnJlYWs7CisgIH0KKworICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlICovCisKKyAgLyogTm9uLXN5bW1ldHJpYyBjaGFubmVscyAqLworICBpZiAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHsKKyAgICAvKiBPZGQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzIC0+IHdlIGhhdmUgYSBjZW50ZXIgY2hhbm5lbC4KKyAgICAgICBJbiBNUEVHLTQgdGhlIGNlbnRlciBoYXMgdGhlIGluZGV4IDAuICovCisgICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKKyAgICBvZmZzZXRUYWJsZVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBtYXBwZWRJZHg7CisgICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSAgICA9IEFDVF9GUk9OVDsKKyAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gMDsKKyAgICBjaCArPSAxOworICB9CisKKyAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKKyAgICBBVURJT19DSEFOTkVMX1RZUEUgdHlwZSA9IEFDVF9OT05FOworICAgIGludCBjaE1hcFBvcyA9IDAsIG1heENoYW5uZWxzID0gMDsKKyAgICBpbnQgY2hJZHggPSAwOyAgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCisKKyAgICBzd2l0Y2ggKGdycElkeCkgeworICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6CisgICAgICB0eXBlID0gQUNUX0ZST05UOworICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CisgICAgICBtYXhDaGFubmVscyA9IDM7CisgICAgICBjaElkeCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKKyAgICAgIGJyZWFrOworI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCisgICAgY2FzZSBDSF9HUk9VUF9TSURFOgorICAgICAgLyogQWx3YXlzIG1hcCBzaWRlIGNoYW5uZWxzIHRvIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAuICovCisgICAgICB0eXBlID0gQUNUX1NJREU7CisgICAgICBjaE1hcFBvcyA9IExFRlRfTVVMVElQUlBTX0NIQU5ORUw7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX0dST1VQX1JFQVI6CisgICAgICB0eXBlID0gQUNUX0JBQ0s7CisgICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOworICAgICAgbWF4Q2hhbm5lbHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSF9HUk9VUF9MRkU6CisgICAgICB0eXBlID0gQUNUX0xGRTsKKyAgICAgIGNoTWFwUG9zID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOworICAgICAgbWF4Q2hhbm5lbHMgPSAxOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTWFwIGFsbCBjaGFubmVscyBpbiB0aGlzIGdyb3VwICovCisgICAgZm9yICggOyBjaElkeCA8IG51bUNoSW5HcnBbZ3JwSWR4XTsgY2hJZHggKz0gMSkgeworICAgICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKKyAgICAgIGlmIChjaElkeCA9PSBtYXhDaGFubmVscykgeworICAgICAgICAvKiBObyBzcGFjZSBsZWZ0IGluIHRoaXMgY2hhbm5lbCBncm91cCEKKyAgICAgICAgICAgVXNlIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAgaW5zdGVhZDogKi8KKyAgICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOworICAgICAgfQorICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdICAgICA9IG1hcHBlZElkeDsKKyAgICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gICAgPSB0eXBlOworICAgICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IGNoSWR4OworICAgICAgY2hNYXBQb3MgKz0gMTsKKyAgICAgIGNoICs9IDE7CisgICAgfQorICB9Cit9CisKKy8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgaW5pdGlhbGl6ZXMKKyAqICBvbmUgcm93IGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXggKGNvcnJlc3BvbmRpbmcgdG8gb25lIG91dHB1dCBjaGFubmVsKS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGNoYW5uZWwgKHJvdykgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYwordm9pZCBkbXhJbml0Q2hhbm5lbCgKKyAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgb3V0Q2gKKyAgICAgICApCit7CisgIHVuc2lnbmVkIGludCBpbkNoOworICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CisgICAgaWYgKGluQ2ggPT0gb3V0Q2gpIHsKKyAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CisgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gRkwyRlhDT05TVF9ETVgoMC4wZik7CisgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDA7CisgICAgfQorICB9Cit9CisKKy8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgZG9lcyBhIHJlc2V0CisgKiAgb2Ygb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGNsZWFyZWQvcmVzZXQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYwordm9pZCBkbXhDbGVhckNoYW5uZWwoCisgICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAorICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIG91dENoCisgICAgICAgKQoreworICBGREttZW1jbGVhcigmbWl4RmFjdG9yc1tvdXRDaF0sIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihGSVhQX0RNWCkpOworICBGREttZW1jbGVhcigmbWl4U2NhbGVzW291dENoXSwgIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihJTlQpKTsKK30KKworLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhcHBsaWVzIGEgc291cmNlIGNoYW5uZWwgKHJvdykKKyAqICBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LgorICogIEV4aXN0aW5nIG1peCBmYWN0b3JzIG9mIHRoZSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIHdpbGwgZ2V0IG92ZXJ3cml0dGVuLgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2Ygc291cmNlIGNoYW5uZWwgKHJvdykuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpLgorICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCisgKiBAcGFyYW0gW2luXSAgICBTY2FsZSBmYWN0b3Igb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgorICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCisgKiovCitzdGF0aWMKK3ZvaWQgZG14U2V0Q2hhbm5lbCgKKyAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgZHN0Q2gsCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCisgICAgICAgIGNvbnN0IEZJWFBfRE1YICAgICAgZmFjdG9yLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHNjYWxlCisgICAgICAgKQoreworICBpbnQgY2g7CisgIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKKyAgICBpZiAobWl4RmFjdG9yc1tzcmNDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CisgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPSBGWF9EQkwyRlhfRE1YKGZNdWx0KG1peEZhY3RvcnNbc3JjQ2hdW2NoXSwgZmFjdG9yKSk7CisgICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOworICAgIH0KKyAgfQorfQorCisvKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFkZHMgYSBzb3VyY2UgY2hhbm5lbCAocm93KQorICogIHNjYWxlZCBieSBhIGdpdmVuIG1peCBmYWN0b3IgdG8gYSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXguCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykuCisgKiBAcGFyYW0gW2luXSAgICBGaXhlZC1wb2ludCBwYXJ0IG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KKyAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYwordm9pZCBkbXhBZGRDaGFubmVsKAorICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBkc3RDaCwKKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBzcmNDaCwKKyAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgc2NhbGUKKyAgICAgICApCit7CisgIGludCBjaDsKKyAgZm9yIChjaD0wOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgeworICAgIEZJWFBfREJMIGFkZEZhY3QgPSBmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3Rvcik7CisgICAgaWYgKGFkZEZhY3QgIT0gKEZJWFBfRE1YKTApIHsKKyAgICAgIElOVCBuZXdTY2FsZSA9IG1peFNjYWxlc1tzcmNDaF1bY2hdICsgc2NhbGU7CisgICAgICBpZiAobWl4RmFjdG9yc1tkc3RDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CisgICAgICAgIGlmIChuZXdTY2FsZSA+IG1peFNjYWxlc1tkc3RDaF1bY2hdKSB7CisgICAgICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID4+PSBuZXdTY2FsZSAtIG1peFNjYWxlc1tkc3RDaF1bY2hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZEZhY3QgPj49IG1peFNjYWxlc1tkc3RDaF1bY2hdIC0gbmV3U2NhbGU7CisgICAgICAgICAgbmV3U2NhbGUgID0gbWl4U2NhbGVzW2RzdENoXVtjaF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSArPSBGWF9EQkwyRlhfRE1YKGFkZEZhY3QpOworICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gICA9IG5ld1NjYWxlOworICAgIH0KKyAgfQorfQorCisKKy8qKiBQcml2YXRlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGRvd25taXggZmFjdG9yIG1hdHJpeCBkZXBlbmRpbmcgb24gdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAqICBjb25maWd1cmF0aW9uLCB0aGUgdXNlciBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMgdGhlIGdpdmVuIG1ldGFkYXRhLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBtb2R1bGVzCisgKiAgYnJhaW4gYW5kIGhvbGQgYWxsIGRvd25taXggYWxnb3JpdGhtcy4KKyAqIEBwYXJhbSBbaW5dICBGbGFnIHRoYXQgaW5kaWNhdGVzIGlmIGluQ2hNb2RlIGhvbGRzIGEgcmVhbCAocGFja2VkKSBjaGFubmVsIG1vZGUgb3IgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gYSBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4LgorICogQHBhcmFtIFtpbl0gIERlcGVuZGVudCBvbiB0aGUgaW5Nb2RlSXNDZmcgZmxhZyB0aGlzIGZpZWxkIGhhbmRzIGluIGEgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9yCisgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC5vZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqIEBwYXJhbSBbaW5dICBUaGUgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9mIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbi4KKyAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIHN0cnVjdHVyZSBob2xkaW5nIGFsbCBjdXJyZW50IHVzZXIgcGFyYW1ldGVyLgorICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gZmllbGQgaG9sZGluZyBhbGwgY3VycmVudCBtZXRhIGRhdGEuCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguIE5vcm1hbGl6ZWQgdG8gb25lIHNjYWxlIGZhY3Rvci4KKyAqIEBwYXJhbSBbb3V0XSBUaGUgY29tbW9uIHNjYWxlIGZhY3RvciBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcmV0dXJucyAgICAgQW4gZXJyb3IgY29kZS4KKyAqKi8KK3N0YXRpYworUENNRE1YX0VSUk9SIGdldE1peEZhY3RvcnMgKAorICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgaW5Nb2RlSXNDZmcsCisgICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICAgICAgICBpbkNoTW9kZSwKKyAgICAgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgIG91dENoTW9kZSwKKyAgICAgICAgY29uc3QgUENNX0RNWF9VU0VSX1BBUkFNUyAgKnBQYXJhbXMsCisgICAgICAgIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgICAgICpwTWV0YURhdGEsCisgICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICpwT3V0U2NhbGUKKyAgICAgICkKK3sKKyAgUENNRE1YX0VSUk9SIGVyciA9IFBDTURNWF9PSzsKKyAgSU5UICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKKyAgSU5UICBtYXhTY2FsZSA9IDA7CisgIGludCAgbnVtSW5DaGFubmVsLCBudW1PdXRDaGFubmVsOworICB1bnNpZ25lZCBpbnQgIG91dENoLCBpbkNoLCBpbkNoQ2ZnID0gMDsKKyAgdW5zaWduZWQgaW50ICB2YWxpZFtQQ01fRE1YX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKKworICBGREtfQVNTRVJUKHBNZXRhRGF0YSAgIT0gTlVMTCk7CisgIEZES19BU1NFUlQobWl4RmFjdG9ycyAhPSBOVUxMKTsKKyAgLyogQ2hlY2sgb24gYSBzdXBwb3J0ZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKyAgRkRLX0FTU0VSVCggKG91dENoTW9kZSA9PSBDSF9NT0RFXzFfMF8wXzApCisgICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8yXzBfMF8wKQorICAgICAgICAgICB8fCAob3V0Q2hNb2RlID09IENIX01PREVfM18wXzJfMSkgKTsKKworICBpZiAoaW5Nb2RlSXNDZmcpIHsKKyAgICAvKiBXb3JrYXJvdW5kIGZvciB0aGUgYW1iaWd1aXR5IG9mIHRoZSBpbnRlcm5hbCBjaGFubmVsIG1vZGVzLgorICAgICAgIENvbnZlcnQgY2hhbm5lbCBjb25maWcgdG8gY2hhbm5lbCBtb2RlOiAqLworICAgIGluQ2hDZmcgID0gKHVuc2lnbmVkIGludClpbkNoTW9kZTsKKyAgICBzd2l0Y2ggKGluQ2hDZmcpIHsKKyAgICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOgorI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCisgICAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjoKKyNlbmRpZgorICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtpbkNoQ2ZnXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzNfMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzRfMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzogY2FzZSAxNDoKKyAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV81XzBfMl8xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQorICB9CisKKyAgLyogRXh0cmFjdCB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisgIG51bUluQ2hhbm5lbCAgPSAgKGluQ2hNb2RlJjB4RikKKyAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA0KSYweEYpCisgICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4gOCkmMHhGKQorICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+MTIpJjB4Rik7CisgIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgbnVtT3V0Q2hhbm5lbCA9ICAob3V0Q2hNb2RlJjB4RikKKyAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4gNCkmMHhGKQorICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PiA4KSYweEYpCisgICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+MTIpJjB4Rik7CisKKyAgLyogTVBFRyBhbW1lbmRtZW50IDQgYWthIEVUU0kgbWV0YWRhdGEgYW5kIGZhbGxiYWNrIG1vZGU6ICovCisKKworICAvKiBDcmVhdGUgaWRlbnRpdHkgRE1YIG1hdHJpeDogKi8KKyAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgeworICAgIGRteEluaXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIG91dENoICk7CisgIH0KKyAgaWYgKCgoaW5DaE1vZGU+PjEyKSYweEYpID09IDApIHsKKyAgICAvKiBDbGVhciBlbXB0eSBvciB3cm9uZ2x5IG1hcHBlZCBpbnB1dCBjaGFubmVsICovCisgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCApOworICB9CisKKyAgLyogRklSU1QgU1RBR0U6ICovCisgIGlmIChudW1JbkNoYW5uZWwgPiBTSVhfQ0hBTk5FTCkKKyAgeyAvKiBBbHdheXMgdXNlIE1QRUcgZXF1YXRpb25zIGVpdGhlciB3aXRoIG1ldGEgZGF0YSBvciB3aXRoIGRlZmF1bHQgdmFsdWVzLiAqLworICAgIEZJWFBfRE1YICBkTWl4RmFjdEEsIGRNaXhGYWN0QjsKKyAgICBJTlQgICAgICAgZE1peFNjYWxlQSwgZE1peFNjYWxlQjsKKyAgICBpbnQgICAgICAgaXNWYWxpZENmZyA9IFRSVUU7CisKKyAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLworICAgIGRNaXhGYWN0QSAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEFdOworICAgIGRNaXhTY2FsZUEgPSAocE1ldGFEYXRhLT5kbWl4SWR4QT09MCkgPyAxIDogMDsKKyAgICBkTWl4RmFjdEIgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhCXTsKKyAgICBkTWl4U2NhbGVCID0gKHBNZXRhRGF0YS0+ZG1peElkeEI9PTApID8gMSA6IDA7CisKKyAgICAvKiBDaGVjayBpZiBpbnB1dCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CisgICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAgLyogY2hDZmcgMTEgKi8KKyAgICAgIC8qIDYuMWNoOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7CisgICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLworICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18yXzFfMDoKKyAgICBjYXNlIENIX01PREVfM18yXzFfMTogICAvKiBjaENmZyAxMSBidXQgd2l0aCBzaWRlIGNoYW5uZWxzICovCisgICAgICAvKiA2LjFjaDogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CisgICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsgKi8KKyAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CisgICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CisgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSF9NT0RFXzVfMl8xXzA6CisgICAgY2FzZSBDSF9NT0RFXzVfMF8xXzA6CisgICAgY2FzZSBDSF9NT0RFXzVfMF8xXzE6CisgICAgICAvKiAgICAgICAgIExzJyA9IENzKmRtaXhfYV9pZHg7CisgICAgICAgICAgICAgICAgIFJzJyA9IENzKmRtaXhfYV9pZHg7ICovCisgICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKKyAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKKyAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18wXzRfMTogICAvKiBjaENmZyAxMiAqLworICAgICAgLyogNy4xY2ggU3Vycm91bmQgQmFjazogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIExzcipkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBSc3IqZG1peF9iX2lkeDsgKi8KKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfNV8wXzJfMTogICAvKiBjaENmZyA3IHx8IDE0ICovCisgICAgICBpZiAoaW5DaENmZyA9PSAxNCkgeworICAgICAgICAvKiA3LjFjaCBGcm9udCBIZWlnaHQ6ICBDJyA9IEM7ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCcgPSBMKmRtaXhfYV9pZHggKyBMdipkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIqZG1peF9hX2lkeCArIFJ2KmRtaXhfYl9pZHg7ICovCisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogNy4xY2ggRnJvbnQ6ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBDJyA9IEMgKyAoTGMrUmMpKmRtaXhfYV9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgTCcgPSBMICsgTGMqZG1peF9iX2lkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIgKyBSYypkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgIENBVVRJT046IEwrUiBhcmUgbm90IGF0IChNUEVHKSBpbmRleCAxKzIuICovCisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8uIEp1c3QgdXNlIHRoZSBpZGVudGl0eSBtYXRyaXguICovCisgICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CisgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KKyAgICBpZiAoIChpc1ZhbGlkQ2ZnID09IFRSVUUpCisgICAgICAmJiAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAhPSAwKSkKKyAgICB7IC8qIEFwcGx5IERNWCBnYWluIDUgKi8KKyAgICAgIEZJWFBfRE1YIGRteEdhaW47CisgICAgICBJTlQgICAgICBkbXhTY2FsZTsKKyAgICAgIElOVCAgICAgIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4NDApID8gLTEgOiAxOworICAgICAgSU5UICAgICAgdmFsICA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgJiAweDNGOworCisgICAgICAvKiAxMF4oZG14X2dhaW5fNS84MCkgKi8KKyAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKCBmTGRQb3coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbip2YWwqKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KKyAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKKyAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOworICAgICAgICBkbXhTY2FsZSAgPSAgMDsKKyAgICAgIH0KKworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgZG14R2FpbiwgZG14U2NhbGUgKTsKKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICBMRUZUX0ZST05UX0NIQU5ORUwsICAgIGRteEdhaW4sIGRteFNjYWxlICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICBkbXhHYWluLCBkbXhTY2FsZSApOworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKKyAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIGRteEdhaW4sIGRteFNjYWxlICk7CisgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSApOworICAgIH0KKworICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLworICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSAgPSAxOworICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gICAgPSAxOworICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdICAgPSAxOworICAgIHZhbGlkW0xFRlRfUkVBUl9DSEFOTkVMXSAgICAgPSAxOworICAgIHZhbGlkW1JJR0hUX1JFQVJfQ0hBTk5FTF0gICAgPSAxOworICAgIHZhbGlkW0xPV19GUkVRVUVOQ1lfQ0hBTk5FTF0gPSAxOworCisgICAgLyogVXBkYXRlIGNoYW5uZWwgbW9kZSBmb3IgdGhlIG5leHQgc3RhZ2UgKi8KKyAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzJfMTsKKyAgfQorCisgIC8qIFNFQ09ORCBTVEFHRTogKi8KKyAgaWYgKG51bU91dENoYW5uZWwgPD0gVFdPX0NIQU5ORUwpIHsKKyAgICAvKiBDcmVhdGUgRE1YIG1hdHJpeCBhY2NvcmRpbmcgdG8gaW5wdXQgY29uZmlndXJhdGlvbiAqLworICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKKyAgICBjYXNlIENIX01PREVfMl8wXzBfMDogICAvKiBjaENmZyAyICovCisgICAgICAvKiBBcHBseSB0aGUgZHVhbCBjaGFubmVsIG1vZGUuICovCisgICAgICBzd2l0Y2ggKHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSkgeworICAgICAgY2FzZSBDSDFfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMTsgKi8KKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOworICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDI7ICovCisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1JWEVEX01PREU6ICAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjUqQ2gxICsgMC41KkNoMjsgKi8KKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOworICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKKyAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIFNURVJFT19NT0RFOgorICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDSF9NT0RFXzJfMF8xXzA6CisgICAgICAvKiBMJyA9IEwgKyAwLjcwNypTOworICAgICAgICAgUicgPSBSICsgMC43MDcqUzsgKi8KKyAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOworICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18wXzBfMDogICAvKiBjaENmZyAzICovCisgICAgICAvKiBMJyA9IEwgKyAwLjcwNypDOworICAgICAgICAgUicgPSBSICsgMC43MDcqQzsgKi8KKyAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKKyAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hfTU9ERV8zXzBfMV8wOiAgIC8qIGNoQ2ZnIDQgKi8KKyAgICAgIC8qIEwnID0gTCArIDAuNzA3KkMgKyAwLjcwNypTOworICAgICAgICAgUicgPSBSICsgMC43MDcqQyArIDAuNzA3KlM7ICovCisgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18wXzJfMDogICAvKiBjaENmZyA1ICovCisgICAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6ICAgLyogY2hDZmcgNiAqLworICAgICAgLyogTVBFRyArIElUVSArIERMQgorICAgICAgICAgQnV0IGJlY2F1c2UgdGhlIGRlZmF1bHQgZG93bm1peCBlcXVhdGlvbnMgYW5kIGNvZWZmaWNpZW50cyBhcmUgZXF1YWwgd2Ugc3RpY2sgdG8gTVBFRy4gKi8KKyAgICAgIGlmICggIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpCisgICAgICAgIHx8ICEocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX1BDRV9EQVRBKSApCisgICAgICB7CisgICAgICAgIEZJWFBfRE1YICBjTWl4THZsLCBzTWl4THZsLCBsTWl4THZsOworICAgICAgICBJTlQgICAgICAgY01peFNjYWxlLCBzTWl4U2NhbGUsIGxNaXhTY2FsZTsKKworICAgICAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLworICAgICAgICBjTWl4THZsICAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+Y0xldklkeF07CisgICAgICAgIGNNaXhTY2FsZSA9IChwTWV0YURhdGEtPmNMZXZJZHg9PTApID8gMSA6IDA7CisgICAgICAgIHNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5zTGV2SWR4XTsKKyAgICAgICAgc01peFNjYWxlID0gKHBNZXRhRGF0YS0+c0xldklkeD09MCkgPyAxIDogMDsKKyAgICAgICAgbE1peEx2bCAgID0gbGZlTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4TGZlXTsKKyAgICAgICAgaWYgKHBNZXRhRGF0YS0+ZG1peElkeExmZSA8PSAxKSB7CisgICAgICAgICAgbE1peFNjYWxlID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gNSkgeworICAgICAgICAgIGxNaXhTY2FsZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbE1peFNjYWxlID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBTZXR1cCB0aGUgRE1YIG1hdHJpeCAqLworICAgICAgICBpZiAoIChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpCisgICAgICAgICAgfHwgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQ9PTEpKSkKKyAgICAgICAgeyAvKiBMJyA9IEwgKyBDKmNsZXYgLSAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7CisgICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgKExzK1JzKSpzbGV2ICsgTEZFKmxmbGV2OyAqLworICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKKyAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAtc01peEx2bCwgc01peFNjYWxlICk7CisgICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgLXNNaXhMdmwsIHNNaXhTY2FsZSApOworICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKKyAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7CisgICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOworICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKKyAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IC8qIEwnID0gTCArIEMqY2xldiArIExzKnNsZXYgKyBMRkUqbGxldjsKKyAgICAgICAgICAgICBSJyA9IFIgKyBDKmNsZXYgKyBScypzbGV2ICsgTEZFKmxsZXY7ICovCisgICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOworICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKKyAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CisgICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOworICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKKyAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLworICAgICAgICBpZiAoIHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgIT0gMCApCisgICAgICAgIHsgLyogQXBwbHkgRE1YIGdhaW4gMiAqLworICAgICAgICAgIEZJWFBfRE1YIGRteEdhaW47CisgICAgICAgICAgSU5UICAgICAgZG14U2NhbGU7CisgICAgICAgICAgSU5UICAgICAgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHgyICYgMHg0MCkgPyAtMSA6IDE7CisgICAgICAgICAgSU5UICAgICAgdmFsICA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDNGOworCisgICAgICAgICAgLyogMTBeKGRteF9nYWluXzIvODApICovCisgICAgICAgICAgZG14R2FpbiA9IEZYX0RCTDJGWF9ETVgoIGZMZFBvdygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHNpZ24qdmFsKihMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCisgICAgICAgICAgaWYgKGRteFNjYWxlIDwgMCkgeworICAgICAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOworICAgICAgICAgICAgZG14U2NhbGUgID0gIDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBkbXhHYWluLCBkbXhTY2FsZSApOworICAgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUgKTsKKyAgICAgICAgfQorICAgICAgfQorI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKKyAgICAgIGVsc2UgeworICAgICAgICBGSVhQX0RNWCAgZmxldiwgY2xldiwgc2xldkxMLCBzbGV2TFIsIHNsZXZSTCwgc2xldlJSOworICAgICAgICBGSVhQX0RNWCAgbXRyeE1peER3bkNvZWYgPSBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisKKyAgICAgICAgaWYgKCAocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKQorICAgICAgICAgIHx8ICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gQVVUT19QU19ETVgpICYmIChwTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kPT0xKSkpCisgICAgICAgIHsgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNysyKkEpXi0xICogW0wrMC43MDcqQy1BKkxzLUEqUnNdOworICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAoMS43MDcrMipBKV4tMSAqIFtSKzAuNzA3KkMrQSpMcytBKlJzXTsgKi8KKyAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFsxXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOworICAgICAgICAgIHNsZXZSUiA9IHNsZXZSTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKKyAgICAgICAgICBzbGV2TEwgPSBzbGV2TFIgPSAtc2xldlJMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIDMvMiBpbnB1dDogTCcgPSAoMS43MDcrQSleLTEgKiBbTCswLjcwNypDK0EqTHNdOworICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAoMS43MDcrQSleLTEgKiBbUiswLjcwNypDK0EqUnNdOyAqLworICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzBdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisgICAgICAgICAgc2xldlJSID0gc2xldkxMID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtdHJ4TWl4RHduQ29lZikpOworICAgICAgICAgIHNsZXZMUiA9IHNsZXZSTCA9IChGSVhQX1NHTCkwOworICAgICAgICB9CisgICAgICAgIC8qIGNvbW1vbiBmYWN0b3IgKi8KKyAgICAgICAgY2xldiAgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG1wZWdNaXhEb3duSWR4MkNvZWZbMF0gLyogMC43MDcgKi8pKTsKKworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBmbGV2LCAgIDAgKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY2xldiwgICAwICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIHNsZXZMTCwgMCApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICBzbGV2TFIsIDAgKTsKKworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBmbGV2LCAgIDAgKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY2xldiwgICAwICk7CisgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgIHNsZXZSTCwgMCApOworICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICBzbGV2UlIsIDAgKTsKKyAgICAgIH0KKyNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBmaXQgdG8gYW55IGtub3duIGRvd25taXggZXF1YXRpb24hICovCisgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLworICAgIEZES21lbWNsZWFyKHZhbGlkLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSAgPSAxOworICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gMTsKKyAgICAvKiBVcGRhdGUgY2hhbm5lbCBtb2RlIGZvciB0aGUgbmV4dCBzdGFnZSAqLworICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8yXzBfMF8wOworICB9CisKKyAgaWYgKG51bU91dENoYW5uZWwgPT0gT05FX0NIQU5ORUwpIHsKKyAgICBGSVhQX0RNWCBtb25vTWl4TGV2ZWw7CisgICAgSU5UICAgICAgbW9ub01peFNjYWxlOworCisjaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQorICAgIGlmICggIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpCisgICAgICAmJiAhKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9EU0VfREFUQSkgKQorICAgIHsgLyogQycgPSAoMysyKkEpXi0xICogW0MrTCtSK0EqTHMrQStSc107ICovCisgICAgICBtb25vTWl4TGV2ZWwgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzJdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisgICAgICBtb25vTWl4U2NhbGUgPSAwOworCisgICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKTsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfRlJPTlRfQ0hBTk5FTF0gICA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX0ZST05UX0NIQU5ORUxdICA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1vbm9NaXhMZXZlbCA9IEZYX0RCTDJGWF9ETVgoZk11bHQobW9ub01peExldmVsLCBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF0pKTsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfUkVBUl9DSEFOTkVMXSAgICA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX1JFQVJfQ0hBTk5FTF0gICA9IG1vbm9NaXhMZXZlbDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeyAvKiBDJyA9IEwgKyBSOyBbZGVmYXVsdF0gKi8KKyAgICAgIG1vbm9NaXhMZXZlbCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOworICAgICAgbW9ub01peFNjYWxlID0gMTsKKyAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCApOyAgLyogQyBpcyBub3QgaW4gdGhlIG1peCAqLworICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKKyAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIG1vbm9NaXhMZXZlbCwgbW9ub01peFNjYWxlICk7CisgICAgfQorCisgICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWwgKi8KKyAgICBGREttZW1jbGVhcih2YWxpZCwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IDE7CisgIH0KKworI2RlZmluZSBNQVhfU0VBUkNIX1NUQVJUX1ZBTCAgKCAtNyApCisKKyAgeworICAgIExPTkcgY2hTdW1bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgIElOVCAgY2hTdW1NYXggPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKKworICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIHNjYWxlIGZhY3RvciAqLworICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKKyAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKKyAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgeworICAgICAgICAgIGlmIChtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID4gbWF4U2NhbGUpCisgICAgICAgICAgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KKyAgICAgICAgICAgIG1heFNjYWxlID0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbmRpdmlkdWFseSBhbmFseXNlIG91dHB1dCBjaGFuYWwgbGV2ZWxzICovCisgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgeworICAgICAgY2hTdW1bb3V0Q2hdID0gTUFYX1NFQVJDSF9TVEFSVF9WQUw7CisgICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CisgICAgICAgIGludCAgb3ZyZmx3UHJvdFNjYWxlID0gMDsKKworICAgICAgICAvKiBBY2N1bXVsYXRlIGFsbCBmYWN0b3JzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsICovCisgICAgICAgIGNoU3VtW291dENoXSA9IDA7CisgICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKKyAgICAgICAgICBTSE9SVCBhZGRGYWN0ID0gRlhfRE1YMlNIUlQobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOworICAgICAgICAgIGlmICggbWl4U2NhbGVzW291dENoXVtpbkNoXSA8PSBtYXhTY2FsZSApIHsKKyAgICAgICAgICAgIGFkZEZhY3QgPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkRmFjdCA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgICBjaFN1bVtvdXRDaF0gKz0gYWRkRmFjdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgeworICAgICAgICAgIHdoaWxlIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7CisgICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgKz0gMTsKKyAgICAgICAgICAgIGNoU3VtW291dENoXSA+Pj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hTdW1bb3V0Q2hdID4gMCkgeworICAgICAgICAgIHdoaWxlICgoY2hTdW1bb3V0Q2hdPDwxKSA8PSAoTE9ORylNQVhWQUxfU0dMKSB7CisgICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgLT0gMTsKKyAgICAgICAgICAgIGNoU3VtW291dENoXSA8PD0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU3RvcmUgdGhlIGRpZmZlcmVudGlhbCBzY2FsaW5nIGluIHRoZSBzYW1lIGFycmF5ICovCisgICAgICAgIGNoU3VtW291dENoXSA9IG92cmZsd1Byb3RTY2FsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CisgICAgICBpZiAoICh2YWxpZFtvdXRDaF0gIT0gMCkKKyAgICAgICAgJiYgKGNoU3VtW291dENoXSA+IGNoU3VtTWF4KSApCisgICAgICB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLworICAgICAgICBjaFN1bU1heCA9IGNoU3VtW291dENoXTsKKyAgICAgIH0KKyAgICB9CisgICAgbWF4U2NhbGUgPSBGREttYXgobWF4U2NhbGUrY2hTdW1NYXgsIDApOworCisgICAgLyogTm9ybWFsaXplIGFsbCBmYWN0b3JzICovCisgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgeworICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgeworICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CisgICAgICAgICAgaWYgKG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdICE9IChGSVhQX0RNWCkwKSB7CisgICAgICAgICAgICBpZiAoIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUgKSB7CisgICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSA9IG1heFNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyogcmV0dXJuIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgKnBPdXRTY2FsZSA9IG1heFNjYWxlOworCisgIHJldHVybiAoZXJyKTsKK30KKworCisvKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGhhbmRsZSBvZiB0aGUgbmV3IGluc3RhbmNlLgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9PcGVuICgKKyAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCisgICkKK3sKKyAgSEFORExFX1BDTV9ET1dOTUlYIHNlbGY7CisgIAorICBpZiAocFNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgICpwU2VsZiA9IE5VTEw7CisKKyAgc2VsZiA9IChIQU5ETEVfUENNX0RPV05NSVgpIEdldFBjbURteEluc3RhbmNlKCAwICk7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorCisgIC8qIFJlc2V0IHRoZSBmdWxsIGluc3RhbmNlICovCisgIHBjbURteF9SZXNldCggc2VsZiwgUENNRE1YX1JFU0VUX0ZVTEwgKTsKKworICAqcFNlbGYgPSBzZWxmOworCisgIHJldHVybiAoUENNRE1YX09LKTsKK30KKworCisvKiogUmVzZXQgYWxsIHN0YXRpYyB2YWx1ZXMgbGlrZSBlLmcuIG1peGRvd24gY29lZmZpY2llbnRzLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIEZsYWdzIHRlbGxpbmcgd2hpY2ggcGFydHMgb2YgdGhlIG1vZHVsZSBzaGFsbCBiZSByZXNldC4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfUmVzZXQgKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKKyAgICBVSU5UICAgICAgICAgICAgICAgIGZsYWdzCisgICkKK3sKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KKworICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfUEFSQU1TKSB7CisgICAgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOworCisgICAgcFBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlICAgPSBTVEVSRU9fTU9ERTsKKyAgICBwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSAgICA9IE5FVkVSX0RPX1BTX0RNWDsKKyAgICBwUGFyYW1zLT5udW1PdXRDaGFubmVsc01heCA9IFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTOworICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWluID0gUENNX0RNWF9ERkxUX01JTl9PVVRfQ0hBTk5FTFM7CisgICAgcFBhcmFtcy0+ZnJhbWVEZWxheSAgICAgICAgPSAwOworICAgIHBQYXJhbXMtPmV4cGlyeUZyYW1lICAgICAgID0gUENNX0RNWF9ERkxUX0VYUElSWV9GUkFNRTsKKworICAgIHNlbGYtPmFwcGx5UHJvY2Vzc2luZyAgICAgID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9CU19EQVRBKSB7CisgICAgaW50IHNsb3Q7CisgICAgLyogSW5pdCBhbGwgc2xvdHMgd2l0aCBhIGRlZmF1bHQgc2V0ICovCisgICAgZm9yIChzbG90ID0gMDsgc2xvdCA8PSBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVM7IHNsb3QgKz0gMSkgeworICAgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmZGZsdE1ldGFEYXRhLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiAoUENNRE1YX09LKTsKK30KKworCisvKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdmFsdWUuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtICgKKyAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCisgICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKKyAgICBjb25zdCBJTlQgICAgICAgICAgIHZhbHVlCisgICkKK3sKKyAgc3dpdGNoIChwYXJhbSkKKyAgeworICBjYXNlIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRToKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgIHNlbGYtPnVzZXJQYXJhbXMuZXhwaXJ5RnJhbWUgPSAodmFsdWUgPiAwKSA/IChVSU5UKXZhbHVlIDogMDsKKyAgICBicmVhazsKKworICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgorICAgIGlmICggKHZhbHVlID4gUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTKQorICAgICAgfHwgKHZhbHVlIDwgMCkgKSB7CisgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgIH0KKyAgICBzZWxmLT51c2VyUGFyYW1zLmZyYW1lRGVsYXkgPSAoVUNIQVIpdmFsdWU7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKKyAgICBzd2l0Y2ggKHZhbHVlKSB7ICAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCisgICAgY2FzZSAtMTogY2FzZSAwOiBjYXNlIE9ORV9DSEFOTkVMOiBjYXNlIFRXT19DSEFOTkVMOgorI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKKyAgICBjYXNlIFNJWF9DSEFOTkVMOgorI2VuZGlmCisjaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQorICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgIH0KKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KKyAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluID0gKHZhbHVlID4gMCkgPyB2YWx1ZSA6IC0xOworICAgIGlmICggKHZhbHVlID4gMCkKKyAgICAgICYmIChzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID4gMCkKKyAgICAgICYmICh2YWx1ZSA+IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXgpICkKKyAgICB7IC8qIE1JTiA+IE1BWCB3b3VsZCBiZSBhbiBpbnZhbGlkIHN0YXRlLiBUaHVzIHNldCBNQVggPSBNSU4gaW4gdGhpcyBjYXNlLiAqLworICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW47CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CisgICAgc3dpdGNoICh2YWx1ZSkgeyAgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLworICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKKyNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDYpCisgICAgY2FzZSBTSVhfQ0hBTk5FTDoKKyNlbmRpZgorI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gOCkKKyAgICBjYXNlIEVJR0hUX0NIQU5ORUw6CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCisgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9ICh2YWx1ZSA+IDApID8gdmFsdWUgOiAtMTsKKyAgICBpZiAoICh2YWx1ZSA+IDApCisgICAgICAmJiAodmFsdWUgPCBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluKSApCisgICAgeyAvKiBNQVggPCBNSU4gd291bGQgYmUgYW4gaW52YWxpZCBzdGF0ZS4gVGh1cyBzZXQgTUlOID0gTUFYIGluIHRoaXMgY2FzZS4gKi8KKyAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4OworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIERNWF9EVUFMX0NIQU5ORUxfTU9ERToKKyAgICBzd2l0Y2ggKChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZSkgeworICAgIGNhc2UgU1RFUkVPX01PREU6CisgICAgY2FzZSBDSDFfTU9ERToKKyAgICBjYXNlIENIMl9NT0RFOgorICAgIGNhc2UgTUlYRURfTU9ERToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICBzZWxmLT51c2VyUGFyYW1zLmR1YWxDaGFubmVsTW9kZSA9IChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZTsKKyAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgPSAxOyAgLyogRm9yY2UgcHJvY2Vzc2luZyAqLworICAgIGJyZWFrOworCisgIGNhc2UgRE1YX1BTRVVET19TVVJST1VORF9NT0RFOgorICAgIHN3aXRjaCAoKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlKSB7CisgICAgY2FzZSBORVZFUl9ET19QU19ETVg6CisgICAgY2FzZSBBVVRPX1BTX0RNWDoKKyAgICBjYXNlIEZPUkNFX1BTX0RNWDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICBzZWxmLT51c2VyUGFyYW1zLnBzZXVkb1N1cnJNb2RlID0gKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIChQQ01ETVhfVU5LTk9XTl9QQVJBTSk7CisgIH0KKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKy8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBvbmUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtICgKKyAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCisgICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKKyAgICBJTlQgKiBjb25zdCAgICAgICAgIHBWYWx1ZQorICApCit7CisgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBVc3JQYXJhbXM7CisKKyAgaWYgKCAoc2VsZiA9PSBOVUxMKQorICAgIHx8IChwVmFsdWUgPT0gTlVMTCkgKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisgIHBVc3JQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKKworICBzd2l0Y2ggKHBhcmFtKQorICB7CisgIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgorICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmV4cGlyeUZyYW1lOworICAgIGJyZWFrOworICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgorICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmZyYW1lRGVsYXk7CisgICAgYnJlYWs7CisgIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CisgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW47CisgICAgYnJlYWs7CisgIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CisgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNYXg7CisgICAgYnJlYWs7CisgIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgorICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmR1YWxDaGFubmVsTW9kZTsKKyAgICBicmVhazsKKyAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CisgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+cHNldWRvU3Vyck1vZGU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIChQQ01ETVhfVU5LTk9XTl9QQVJBTSk7CisgIH0KKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKworI2lmZGVmIERTRV9NRVRBREFUQV9FTkFCTEUKKworI2RlZmluZSBNQVhfRFNFX0FOQ19CWVRFUyAgICAgICAoIDE2ICkgICAgLyogMTUgYnl0ZXMgKi8KKyNkZWZpbmUgQU5DX0RBVEFfU1lOQ19CWVRFICAgICAgKCAweEJDICkgIC8qIGFuY2lsbGFyeSBkYXRhIHN5bmMgYnl0ZS4gKi8KKworLyoKKyAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KKyAqLworUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZSAoCisgICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCisgICAgVUlOVCAgYW5jRGF0YUJpdHMsCisgICAgaW50ICAgIGlzTXBlZzIKKyAgKQoreworICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CisgIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CisKKyAgaW50ICAgc2tpcDREbXggPSAwLCBza2lwNEV4dCA9IDA7CisgIGludCAgIGRteEx2bEF2YWlsID0gMCwgZXh0RGF0YUF2YWlsID0gMDsKKyAgaW50ICAgZm91bmROZXdEYXRhID0gMDsKKyAgVUlOVCAgbWluQW5jQml0cyA9ICgoaXNNcGVnMikgPyA1IDogMykqODsKKworICBpZiAoIChzZWxmID09IE5VTEwpCisgICAgfHwgKGhCcyAgPT0gTlVMTCkgKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQorCisgIGFuY0RhdGFCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgLyogc2FuaXR5IGNoZWNrcyAqLworICBpZiAoIChhbmNEYXRhQml0cyA8IG1pbkFuY0JpdHMpCisgICAgfHwgKGFuY0RhdGFCaXRzID4gRkRLZ2V0VmFsaWRCaXRzKGhCcykpICkgeworICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOworICB9CisKKyAgcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKKworICBpZiAoaXNNcGVnMikgeworICAgIC8qIHNraXAgRFZEIGFuY2lsbGFyeSBkYXRhICovCisgICAgRkRLcHVzaEZvcihoQnMsIDE2KTsKKyAgfQorCisgIC8qIGNoZWNrIHN5bmMgd29yZCAqLworICBpZiAoRkRLcmVhZEJpdHMoaEJzLDgpICE9IEFOQ19EQVRBX1NZTkNfQllURSkgeworICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOworICB9CisKKyAgLyogc2tpcCBNUEVHIGF1ZGlvIHR5cGUgYW5kIERvbGJ5IHN1cnJvdW5kIG1vZGUgKi8KKyAgRkRLcHVzaEZvcihoQnMsIDQpOworCisgIGlmIChpc01wZWcyKSB7CisgICAgLyogaW50IG51bUFuY0J5dGVzID0gKi8gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAvKiBhZHZhbmNlZCBkeW5hbWljIHJhbmdlIGNvbnRyb2wgKi8KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSAyNDsKKyAgICAvKiBkaWFsb2cgbm9ybWFsaXphdGlvbiAqLworICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDg7CisgICAgLyogcmVwcm9kdWN0aW9uX2xldmVsICovCisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gODsKKyAgfSBlbHNlIHsKKyAgICBGREtwdXNoRm9yKGhCcywgMik7ICAgLyogZHJjIHByZXNlbnRhdGlvbiBtb2RlICovCisgICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gRkRLcmVhZEJpdChoQnMpOworICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgICAvKiByZXNlcnZlZCBiaXRzICovCisgIH0KKworICAvKiBkb3dubWl4aW5nIGxldmVscyBNUEVHeCBzdGF0dXMgKi8KKyAgZG14THZsQXZhaWwgID0gRkRLcmVhZEJpdChoQnMpOworCisgIGlmIChpc01wZWcyKSB7CisgICAgLyogc2NhbGUgZmFjdG9yIENSQyBzdGF0dXMgKi8KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKKyAgfSBlbHNlIHsKKyAgICAvKiBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gc3RhdHVzICovCisgICAgZXh0RGF0YUF2YWlsID0gRkRLcmVhZEJpdChoQnMpOworICB9CisKKyAgLyogYXVkaW8gY29kaW5nIGFuZCBjb21wcmVzc2lvbiBzdGF0dXMgKi8KKyAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CisgIC8qIGNvYXJzZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KKyAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CisgIC8qIGZpbmUgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCisgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OworCisgIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIERNWCBsZXZlbHMgKi8KKyAgRkRLcHVzaEZvcihoQnMsIHNraXA0RG14KTsKKworICAvKiBkb3dubWl4X2xldmVsc19NUEVHWCAqLworICBpZiAoZG14THZsQXZhaWwpCisgIHsKKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7ICAvKiBjZW50ZXJfbWl4X2xldmVsX29uICovCisgICAgICBwQnNNZXRhRGF0YS0+Y0xldklkeCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBmb3VuZE5ld0RhdGEgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDMpOworICAgIH0KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7ICAvKiBzdXJyb3VuZF9taXhfbGV2ZWxfb24gKi8KKyAgICAgIHBCc01ldGFEYXRhLT5zTGV2SWR4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgfQorICB9CisKKyAgLyogc2tpcCB0aGUgdXNlbGVzcyBkYXRhIHRvIGdldCB0byB0aGUgYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uICovCisgIEZES3B1c2hGb3IoaEJzLCBza2lwNEV4dCk7CisKKyAgLyogYW5jIGRhdGEgZXh0ZW5zaW9uIChNUEVHLTQgb25seSkgKi8KKyAgaWYgKGV4dERhdGFBdmFpbCkgeworICAgIGludCBleHREbXhMdmxTdCwgZXh0RG14R2FpblN0LCBleHREbXhMZmVTdDsKKworICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAgIC8qIHJlc2VydmVkIGJpdCAqLworICAgIGV4dERteEx2bFN0ICA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICBleHREbXhHYWluU3QgPSBGREtyZWFkQml0KGhCcyk7CisgICAgZXh0RG14TGZlU3QgID0gRkRLcmVhZEJpdChoQnMpOworICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAgIC8qIHJlc2VydmVkIGJpdHMgKi8KKworICAgIGlmIChleHREbXhMdmxTdCkgeworICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhBID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4QiA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDIpOyAgLyogcmVzZXJ2ZWQgYml0cyAqLworICAgICAgZm91bmROZXdEYXRhID0gMTsKKyAgICB9CisgICAgaWYgKGV4dERteEdhaW5TdCkgeworICAgICAgcEJzTWV0YURhdGEtPmRteEdhaW5JZHg1ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KKyAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4MiA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCisgICAgICBmb3VuZE5ld0RhdGEgPSAxOworICAgIH0KKyAgICBpZiAoZXh0RG14TGZlU3QpIHsKKyAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4TGZlID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAvKiByZXNlcnZlZCBiaXRzICovCisgICAgICBmb3VuZE5ld0RhdGEgPSAxOworICAgIH0KKyAgfQorCisgIC8qIGZpbmFsIHNhbml0eSBjaGVjayBvbiB0aGUgYW1vdW50IG9mIHJlYWQgZGF0YSAqLworICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8IDApIHsKKyAgICBlcnJvclN0YXR1cyA9IFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBOworICB9CisKKyAgaWYgKCAoZXJyb3JTdGF0dXMgID09IFBDTURNWF9PSykKKyAgICAmJiAoZm91bmROZXdEYXRhID09IDEpICkgeworICAgIC8qIGFubm91bmNlIG5ldyBkYXRhICovCisgICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX0RTRV9EQVRBOworICAgIC8qIHJlc2V0IGV4cGlyeSBjb3VudGVyICovCisgICAgcEJzTWV0YURhdGEtPmV4cGlyeUNvdW50ID0gMDsKKyAgfQorCisgIHJldHVybiAoZXJyb3JTdGF0dXMpOworfQorCisvKgorICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgorICovCitQQ01ETVhfRVJST1IgcGNtRG14X1JlYWREdmJBbmNEYXRhICgKKyAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCisgICAgVUNIQVIgKnBBbmNEYXRhQnVmLAorICAgIFVJTlQgICBhbmNEYXRhQnl0ZXMsCisgICAgaW50ICAgIGlzTXBlZzIKKyAgKQoreworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CisgIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKKworICBpZiAoc2VsZiA9PSBOVUxMKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQorCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKCAocEFuY0RhdGFCdWYgPT0gTlVMTCkKKyAgICB8fCAoYW5jRGF0YUJ5dGVzID09IDApICkgeworICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOworICB9CisKKyAgRkRLaW5pdEJpdFN0cmVhbSAoaEJzLCBwQW5jRGF0YUJ1ZiwgTUFYX0RTRV9BTkNfQllURVMsIGFuY0RhdGFCeXRlcyo4LCBCU19SRUFERVIpOworCisgIGVycm9yU3RhdHVzID0gcGNtRG14X1BhcnNlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmNEYXRhQnl0ZXMqOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzTXBlZzIgKTsKKworICByZXR1cm4gKGVycm9yU3RhdHVzKTsKK30KKyNlbmRpZiAgLyogRFNFX01FVEFEQVRBX0VOQUJMRSAqLworCisjaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQorLyoqIFNldCB0aGUgbWF0cml4IG1peGRvd24gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIFBDRSBvZiBhbiBBQUMgYml0c3RyZWFtLgorICogIE5vdGU6IENhbGwgb25seSBpZiBtYXRyaXhfbWl4ZG93bl9pZHhfcHJlc2VudCBpcyB0cnVlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIFRoZSAyIGJpdCBtYXRyaXggbWl4ZG93biBpbmRleCBleHRyYWN0ZWQgZnJvbSBQQ0UuCisgKiBAcGFyYW0gW2luXSBUaGUgcHNldWRvIHN1cnJvdW5kIGVuYWJsZSBmbGFnIGV4dHJhY3RlZCBmcm9tIFBDRS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UgKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25QcmVzZW50LAorICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93bklkeCwKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBzZXVkb1N1cnJvdW5kRW5hYmxlCisgICkKK3sKKyAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKKworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgaWYgKG1hdHJpeE1peGRvd25QcmVzZW50KSB7CisgICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gcHNldWRvU3Vycm91bmRFbmFibGU7CisgICAgcEJzTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHggPSBtYXRyaXhNaXhkb3duSWR4ICYgMHgwMzsKKyAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IFRZUEVfUENFX0RBVEE7CisgICAgLyogUmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KKyAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOworICB9CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCisKKworLyoqIEFwcGx5IGRvd24gb3IgdXAgbWl4aW5nLgorICogQHBhcmFtIFtpbl0gICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZCB0aGUgdGltZSBkb21haW4gc2lnbmFsLgorICogQHBhcmFtIFtpbl0gICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzIGlzIHJldHVybmVkIGludG8uCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IGNoYW5uZWxzIGlzIHJldHVybmVkIGludG8uCisgKiBAcGFyYW0gW2luXSAgICBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBvdXRwdXQgdGltZSBkYXRhIGFyZSB3cml0dGVybiBpbnRlcmxlYXZlZCBvciBhcyBzdWJzZXF1ZW50IGJsb2Nrcy4KKyAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleCBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIEBwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCisgKiBAcGFyYW0gW291dF0gICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUgYXBwbGllZCBvbiBhbGwgc2FtcGxlcyBhZnRlcndhcmRzLgorICogICAgICAgICAgICAgICAgSWYgdGhlIGhhbmRlZCBwb2ludGVyIGlzIE5VTEwgc2NhbGluZyBpcyBkb25lIGludGVybmFsbHkuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0FwcGx5RnJhbWUgKAorICAgICAgICBIQU5ETEVfUENNX0RPV05NSVggICAgICBzZWxmLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICpwUGNtQnVmLAorICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscywKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZkludGVybGVhdmVkLAorICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICBjaGFubmVsVHlwZVtdLAorICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLAorICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICpwRG14T3V0U2NhbGUKKyAgKQoreworICBQQ01fRE1YX1VTRVJfUEFSQU1TICAqcFBhcmFtID0gTlVMTDsKKyAgUENNRE1YX0VSUk9SICBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKKyAgRFVBTF9DSEFOTkVMX01PREUgIGR1YWxDaGFubmVsTW9kZTsKKyAgUENNX0RNWF9DSEFOTkVMX01PREUgIGluQ2hNb2RlOworICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgb3V0Q2hNb2RlOworICBJTlQgICBkZXZOdWxsOyAgLyogSnVzdCBhIGR1bW15IHRvIGF2b2lkIGEgbG90IG9mIGJyYW5jaGVzIGluIHRoZSBjb2RlICovCisgIGludCAgIG51bU91dENoYW5uZWxzLCBudW1JbkNoYW5uZWxzOworICBpbnQgICBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CisgIGludCAgIGRteE1heFNjYWxlLCBkbXhTY2FsZTsKKyAgaW50ICAgY2gsIHNsb3Q7CisgIFVDSEFSIGluT2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworCisgIERNWF9CU19NRVRBX0RBVEEgIGJzTWV0YURhdGE7CisKKyAgaWYgKCAoc2VsZiAgICAgICAgICAgPT0gTlVMTCkKKyAgICB8fCAobkNoYW5uZWxzICAgICAgPT0gTlVMTCkKKyAgICB8fCAoY2hhbm5lbFR5cGUgICAgPT0gTlVMTCkKKyAgICB8fCAoY2hhbm5lbEluZGljZXMgPT0gTlVMTCkKKyAgICB8fCAoY2hhbm5lbE1hcHBpbmcgPT0gTlVMTCkgKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgLyogSW5pdCB0aGUgb3V0cHV0IHNjYWxpbmcgKi8KKyAgZG14U2NhbGUgPSAwOworICBpZiAocERteE91dFNjYWxlICE9IE5VTEwpIHsKKyAgICAvKiBBdm9pZCBmaW5hbCBzY2FsaW5nIGludGVybmFsbHkgYW5kIGhhbmQgaXQgdG8gdGhlIG91dHNpZGUgd29ybGQuICovCisgICAgKnBEbXhPdXRTY2FsZSA9IDA7CisgICAgZG14TWF4U2NhbGUgPSBQQ01ETVhfTUFYX0hFQURST09NOworICB9IGVsc2UgeworICAgIC8qIEFwcGx5IHRoZSBzY2FsaW5nIGludGVybmFsbHkuICovCisgICAgcERteE91dFNjYWxlID0gJmRldk51bGw7ICAvKiByZWRpcmVjdCB0byB0ZW1wb3JhbCBzdGFjayBtZW1vcnkgKi8KKyAgICBkbXhNYXhTY2FsZSA9IDA7CisgIH0KKworICBwUGFyYW0gPSAmc2VsZi0+dXNlclBhcmFtczsKKyAgbnVtSW5DaGFubmVscyA9ICpuQ2hhbm5lbHM7CisKKyAgLyogUGVyZm9ybSBzb21lIGlucHV0IHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKHBQY21CdWYgPT0gTlVMTCkgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KKyAgaWYgKGZyYW1lU2l6ZSA9PSAwKSAgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KKyAgaWYgKCAobnVtSW5DaGFubmVscyA9PSAwKQorICAgIHx8IChudW1JbkNoYW5uZWxzID4gUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KKworICAvKiBDaGVjayBvbiBtaXNjb25maWd1cmF0aW9uICovCisgIEZES19BU1NFUlQoIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApIFwKKyAgICAgICAgICAgfHwgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikpOworCisgIC8qIERldGVybWluZSBpZiB0aGUgbW9kdWxlIGhhcyB0byBkbyBwcm9jZXNzaW5nICovCisgIGlmICggICAoc2VsZi0+YXBwbHlQcm9jZXNzaW5nID09IDApCisgICAgJiYgICgocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKQorICAgICAgfHwgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gbnVtSW5DaGFubmVscykpCisgICAgJiYgICAocFBhcmFtLT5udW1PdXRDaGFubmVsc01pbiA8PSBudW1JbkNoYW5uZWxzKSApIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuIChlcnJvclN0YXR1cyk7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgaWYgKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+IDApCisgICAgJiYgKG51bUluQ2hhbm5lbHMgPiBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4KSApIHsKKyAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXg7CisgIH0KKyAgZWxzZSBpZiAobnVtSW5DaGFubmVscyA8IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pIHsKKyAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW47CisgIH0KKyAgZWxzZSB7CisgICAgbnVtT3V0Q2hhbm5lbHMgPSBudW1JbkNoYW5uZWxzOworICB9CisKKyAgZHVhbENoYW5uZWxNb2RlID0gcFBhcmFtLT5kdWFsQ2hhbm5lbE1vZGU7CisKKyAgLyogQW5hbHlzZSBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGdldCBjaGFubmVsIG9mZnNldAorICAgKiB0YWJsZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBmaXhlZCBjaGFubmVsIGxhYmVscy4gKi8KKyAgZXJyb3JTdGF0dXMgPSBnZXRDaGFubmVsTW9kZSgKKyAgICAgICAgICAgICAgICAgICBudW1JbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0VGFibGUsCisgICAgICAgICAgICAgICAgICAmaW5DaE1vZGUKKyAgICAgICAgICAgICAgICAgKTsKKyAgaWYgKCBQQ01ETVhfSVNfRkFUQUxfRVJST1IoZXJyb3JTdGF0dXMpCisgICAgfHwgKGluQ2hNb2RlID09IENIX01PREVfVU5ERUZJTkVEKSApIHsKKyAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgYmVjYXVzZSB0aGUgY2hhbm5lbAorICAgICAgIGNvbmZpZ3VyYXRpb24gaGFzIG5vdCBiZWVuIGNoYW5nZWQuIEp1c3QgZXhpdC4gKi8KKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0NIX0NPTkZJRyk7CisgIH0KKworICAvKiBTZXQgaW5wdXQgc3RyaWRlIGFuZCBvZmZzZXQgKi8KKyAgaWYgKGZJbnRlcmxlYXZlZCkgeworICAgIGluU3RyaWRlICA9IG51bUluQ2hhbm5lbHM7CisgICAgb2Zmc2V0ID0gMTsgICAgICAgICAgICAgICAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCisgIH0gZWxzZSB7CisgICAgaW5TdHJpZGUgID0gMTsKKyAgICBvZmZzZXQgPSBmcmFtZVNpemU7ICAgICAgICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KKyAgfQorCisgIC8qIFJlc2V0IGRvd25taXggbWV0YSBkYXRhIGlmIG5lY2Vzc2FyeSAqLworICBpZiAoIChwUGFyYW0tPmV4cGlyeUZyYW1lID4gMCkKKyAgICAmJiAoKytzZWxmLT5ic01ldGFEYXRhWzBdLmV4cGlyeUNvdW50ID4gcFBhcmFtLT5leHBpcnlGcmFtZSkgKQorICB7IC8qIFRoZSBtZXRhZGF0YSByZWFkIGZyb20gYml0c3RyZWFtIGlzIHRvbyBvbGQuICovCisgICAgUENNRE1YX0VSUk9SIGVyciA9IHBjbURteF9SZXNldChzZWxmLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CisgICAgRkRLX0FTU0VSVChlcnIgPT0gUENNRE1YX09LKTsKKyAgfQorICBGREttZW1jcHkoJmJzTWV0YURhdGEsICZzZWxmLT5ic01ldGFEYXRhW3BQYXJhbS0+ZnJhbWVEZWxheV0sIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CisgIC8qIE1haW50YWluIGRlbGF5IGxpbmUgKi8KKyAgZm9yIChzbG90ID0gcFBhcmFtLT5mcmFtZURlbGF5OyBzbG90ID4gMDsgc2xvdCAtPSAxKSB7CisgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmc2VsZi0+YnNNZXRhRGF0YVtzbG90LTFdLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOworICB9CisKKyAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisjaWZkZWYgUENNX0RPV05NSVhfRU5BQkxFCisgIGlmICggbnVtSW5DaGFubmVscyA+IG51bU91dENoYW5uZWxzICkKKyAgeyAvKiBBcHBseSBkb3dubWl4ICovCisgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9JTl9DSEFOTkVMU10gPSB7IE5VTEwgfTsKKyAgICBJTlRfUENNICAqcE91dFBjbVtQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFNdID0geyBOVUxMIH07CisgICAgRklYUF9ETVggIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKKyAgICBVQ0hBUiAgICAgb3V0T2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgIFVJTlQgICAgICBzYW1wbGU7CisgICAgaW50ICAgICAgIGNoQ2ZnID0gMDsKKyAgICBpbnQgICAgICAgYnlwU2NhbGUgPSAwOworCisjaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID49IDcpCisgICAgaWYgKG51bUluQ2hhbm5lbHMgPiBTSVhfQ0hBTk5FTCkgeworICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIG11bHRpUHVycG9zZUNoVHlwZVsyXTsKKworICAgICAgLyogR2V0IHRoZSB0eXBlIG9mIHRoZSBtdWx0aXB1cnBvc2UgY2hhbm5lbHMgKi8KKyAgICAgIG11bHRpUHVycG9zZUNoVHlwZVswXSA9IGNoYW5uZWxUeXBlW2luT2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOworICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzFdID0gY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbiBpcyBvbmUgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQuICovCisgICAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CisgICAgICBjYXNlIENIX01PREVfNV8wXzJfMTogIC8qIGNoQ2ZnIDcgfHwgMTQgKi8KKyAgICAgICAgLyogRnVydGhlciBhbmFseXNlIHRoZSBpbnB1dCBjb25maWcgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBDSF9NT0RFXzVfMF8yXzEgY29uZmlncy4gKi8KKyAgICAgICAgaWYgKCAobXVsdGlQdXJwb3NlQ2hUeXBlWzBdID09IEFDVF9GUk9OVF9UT1ApCisgICAgICAgICAgJiYgKG11bHRpUHVycG9zZUNoVHlwZVsxXSA9PSBBQ1RfRlJPTlRfVE9QKSApIHsKKyAgICAgICAgICBjaENmZyA9IDE0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNoQ2ZnID0gNzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOiAgLyogY2hDZmcgMTEgKi8KKyAgICAgICAgY2hDZmcgPSAxMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENIX01PREVfM18wXzRfMTogIC8qIGNoQ2ZnIDEyICovCisgICAgICAgIGNoQ2ZnID0gMTI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2hDZmcgPSAwOyAgLyogTm90IGEga25vd24gY29uZmlnICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KKyAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKKyAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtudW1PdXRDaGFubmVsc107CisKKyAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY29uZmlndXJhdGlvbi4gKi8KKyAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCisgICAgICAgICAgICBvdXRDaE1vZGUsCisgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQorICAgICAgICAgICApOworICAgIC8qIE5vdyB0aGVyZSBpcyBubyB3YXkgYmFjayBiZWNhdXNlIHdlIG1vZGlmaWVkIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24hICovCisKKyAgICAvKiBDcmVhdGUgdGhlIERNWCBtYXRyaXggKi8KKyAgICBlcnJvclN0YXR1cyA9IGdldE1peEZhY3RvcnMgKAorICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoQ2ZnPjApID8gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKWNoQ2ZnIDogaW5DaE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dENoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICZic01ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBtaXhGYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZQorICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAvKiBObyBmYXRhbCBlcnJvcnMgY2FuIG9jY3VyIGhlcmUuIFRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBhbHdheXMgcmV0dXJuIGEgdmFsaWQgbWF0cml4LgorICAgICAgIFRoZSBlcnJvciBjb2RlIGlzIHVzZWQgdG8gc2lnbmFsIGNvbmZpZ3VyYXRpb25zIGFuZCBtYXRyaWNlcyB0aGF0IGFyZSBub3QgY29uZm9ybSB0byBhbnkgc3RhbmRhcmQuICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGZpbmFsIHNjYWxpbmcgKi8KKyAgICBieXBTY2FsZSA9IEZES21pbihkbXhNYXhTY2FsZSwgZG14U2NhbGUpOworICAgICpwRG14T3V0U2NhbGUgKz0gYnlwU2NhbGU7CisgICAgZG14U2NhbGUgLT0gYnlwU2NhbGU7CisKKyAgICB7IC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIGlucHV0LiBSZW1vdmUgZW1wdHkgY29scy4gKi8KKyAgICAgIGludCBpbkNoLCBvdXRDaCwgbWFwW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKKyAgICAgIGNoID0gMDsKKyAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKKyAgICAgICAgaWYgKGluT2Zmc2V0VGFibGVbaW5DaF0gIT0gMjU1KSB7CisgICAgICAgICAgcEluUGNtW2NoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbaW5DaF0qb2Zmc2V0XTsKKyAgICAgICAgICBtYXBbY2grK10gID0gaW5DaDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGNoICE9IG51bUluQ2hhbm5lbHMpIHsKKyAgICAgICAgICBBTE9HRSgiYi8yMzg3NjQ0NCIpOworICAgICAgICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICAgIH0KKworICAgICAgLyogUmVtb3ZlIHVudXNlZCBjb2xzIGZyb20gZmFjdG9yIG1hdHJpeCAqLworICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CisgICAgICAgIGlmIChpbkNoICE9IG1hcFtpbkNoXSkgeworICAgICAgICAgIGludCBvdXRDaDsKKyAgICAgICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CisgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IG1peEZhY3RvcnNbb3V0Q2hdW21hcFtpbkNoXV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIG91dHB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCisgICAgICBjaCA9IDA7CisgICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CisgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gIT0gMjU1KSB7CisgICAgICAgICAgcE91dFBjbVtjaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtvdXRDaF0qb2Zmc2V0XTsKKyAgICAgICAgICBtYXBbY2grK10gID0gb3V0Q2g7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZES19BU1NFUlQoY2ggPT0gbnVtT3V0Q2hhbm5lbHMpOworCisgICAgICAvKiBSZW1vdmUgdW51c2VkIHJvd3MgZnJvbSBmYWN0b3IgbWF0cml4ICovCisgICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoKz0xKSB7CisgICAgICAgIGlmIChvdXRDaCAhPSBtYXBbb3V0Q2hdKSB7CisgICAgICAgICAgRkRLbWVtY3B5KCZtaXhGYWN0b3JzW291dENoXSwgJm1peEZhY3RvcnNbbWFwW291dENoXV0sIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihGSVhQX0RNWCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2FtcGxlIHByb2Nlc3NpbmcgbG9vcCAqLworICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykKKyAgICB7CisgICAgICBGSVhQX1BDTSB0SW5bUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFNdOworICAgICAgRklYUF9EQkwgdE91dFtQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFNdID0geyAoRklYUF9EQkwpMCB9OworICAgICAgaW50IGluQ2gsIG91dENoOworCisgICAgICAvKiBQcmVsb2FkIGFsbCBpbnB1dCBzYW1wbGVzICovCisgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKKyAgICAgICAgdEluW2luQ2hdID0gKEZJWFBfUENNKSpwSW5QY21baW5DaF07CisgICAgICAgIHBJblBjbVtpbkNoXSArPSBpblN0cmlkZTsKKyAgICAgIH0KKyAgICAgIC8qIEFwcGx5IGRvd25taXggY29lZmZpY2llbnRzIHRvIGlucHV0IHNhbXBsZXMgYW5kIGFjY3VtdWxhdGUgZm9yIG91dHB1dCAqLworICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCs9MSkgeworICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKKyAgICAgICAgICB0T3V0W291dENoXSArPSBmTXVsdCh0SW5baW5DaF0sIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKKyAgICAgICAgfQorICAgICAgICAvKiBXcml0ZSBzYW1wbGUgKi8KKyNpZiAoU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMpCisgICAgICAgICpwT3V0UGNtW291dENoXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodE91dFtvdXRDaF0sIGRteFNjYWxlLCBTQU1QTEVfQklUUyk7CisjZWxzZQorICAgICAgICAqcE91dFBjbVtvdXRDaF0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0T3V0W291dENoXSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNlbmRpZgorICAgICAgICBwT3V0UGNtW291dENoXSArPSBvdXRTdHJpZGU7CisgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCisgICAgKm5DaGFubmVscyA9IG51bU91dENoYW5uZWxzOworCisgIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICBlbHNlCisjZW5kaWYgLyogUENNX0RPV05NSVhfRU5BQkxFICovCisjaWZkZWYgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRQorICBpZiAoIG51bUluQ2hhbm5lbHMgPCBudW1PdXRDaGFubmVscyApCisgIHsgLyogQXBwbHkgcnVkaW1lbnRhcnkgdXBtaXggKi8KKyAgICAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCisgICAgVUlOVCAgICAgc2FtcGxlOworICAgIFVDSEFSICAgIG91dE9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKKworICAgIC8qIEZJUlNUIFNUQUdFCisgICAgICAgICBDcmVhdGUgYSBzdGVyZW8vZHVhbCBjaGFubmVsIHNpZ25hbCAqLworICAgIGlmIChudW1JbkNoYW5uZWxzID09IE9ORV9DSEFOTkVMKQorICAgIHsKKyAgICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgICAgSU5UX1BDTSAgKnBPdXRMRiwgKnBPdXRSRjsKKworICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KKyAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gVFdPX0NIQU5ORUwgOiAxOworICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbVFdPX0NIQU5ORUxdOworCisgICAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGlzCisgICAgICAgKiBzdGFnZXMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoYWx3YXlzIFNURVJFTykuICovCisgICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgIG91dENoTW9kZSwKKyAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCisgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKKyAgICAgICAgICAgICApOworICAgICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEgKi8KKworICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlci4gVGhlIGZpcnN0IGNoYW5uZWwgaXMgYWx3YXlzIGF0IGluZGV4IDAuICovCisgICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gJnBQY21CdWZbKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07ICAvKiBDb25zaWRlcmluZyBpbnB1dCBtYXBwaW5nIGNvdWxkIGxlYWQgdG8gYSBpbnZhbGlkIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGRlY2xhcmVkIHRvIGJlIGEgZnJvbnQgY2hhbm5lbC4gKi8KKworICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKGZvciB0aGlzIHN0YWdlKS4gKi8KKyAgICAgIHBPdXRMRiA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW0xFRlRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKKyAgICAgIHBPdXRSRiA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW1JJR0hUX0ZST05UX0NIQU5ORUxdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CisKKyAgICAgIC8qIDEvMCBpbnB1dDogKi8KKyAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgICAvKiBMJyA9IEM7ICBSJyA9IEM7ICovCisgICAgICAgICpwT3V0TEYgPSAqcE91dFJGID0gKnBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF07CisKKyAgICAgICAgcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSAtPSBpblN0cmlkZTsKKyAgICAgICAgcE91dExGIC09IG91dFN0cmlkZTsgcE91dFJGIC09IG91dFN0cmlkZTsKKyAgICAgIH0KKworICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBzdGFnZTogKi8KKyAgICAgIGluU3RyaWRlID0gb3V0U3RyaWRlOworICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGU7CisgICAgICBGREttZW1jcHkoaW5PZmZzZXRUYWJsZSwgb3V0T2Zmc2V0VGFibGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOworICAgIH0KKworI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKQorICAgIC8qIFNFQ09ORCBTVEFHRQorICAgICAgICAgRXh0ZW5kIHdpdGggemVybyBjaGFubmVscyB0byBhY2hpZXZlZCB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAqLworICAgIGlmIChudW1PdXRDaGFubmVscyA+IFRXT19DSEFOTkVMKQorICAgIHsKKyAgICAgIElOVF9QQ00gKnBJbltQQ01fRE1YX01BWF9DSEFOTkVMU10gID0geyBOVUxMIH07CisgICAgICBJTlRfUENNICpwT3V0W1BDTV9ETVhfTUFYX0NIQU5ORUxTXSA9IHsgTlVMTCB9OworICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICBpbkNoVHlwZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgICAgVUNIQVIgICAgaW5DaEluZGljZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgICAgVUNIQVIgICAgbnVtQ2hQZXJHcnBbMl1bUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOworICAgICAgaW50ICAgICAgbkNvbnRlbnRDaCA9IDA7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgd2l0aCBjb250ZW50ICovCisgICAgICBpbnQgICAgICBuRW1wdHlDaCA9IDA7ICAgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KKyAgICAgIGludCAgICAgIGNoLCBjaEdycCwgaXNDb21wYXRpYmxlID0gMTsKKworICAgICAgLyogRG8gbm90IGNoYW5nZSB0aGUgc2lnbmFsbGluZyB3aGljaCBpcyB0aGUgY2hhbm5lbCB0eXBlcyBhbmQgaW5kaWNlcy4KKyAgICAgICAgIEp1c3QgcmVvcmRlciBhbmQgYWRkIGNoYW5uZWxzLiBTbyBmaXJzdCBzYXZlIHRoZSBpbnB1dCBzaWduYWxsaW5nLiAqLworICAgICAgRkRLbWVtY3B5KGluQ2hUeXBlcywgY2hhbm5lbFR5cGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKKyAgICAgIEZES21lbWNweShpbkNoSW5kaWNlcywgY2hhbm5lbEluZGljZXMsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOworCisgICAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLworICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBudW1PdXRDaGFubmVscyA6IDE7CisgICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtudW1PdXRDaGFubmVsc107CisKKyAgICAgIC8qIENoZWNrIGlmIGlucHV0IGNoYW5uZWwgY29uZmlnIGNhbiBiZSBlYXNpbHkgbWFwcGVkIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBjb25maWcuICovCisgICAgICBmb3IgKGNoR3JwID0gMDsgY2hHcnAgPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgY2hHcnAgKz0gMSkgeworICAgICAgICBudW1DaFBlckdycFtJTl1bY2hHcnBdID0gKGluQ2hNb2RlID4+IChjaEdycCo0KSkgJiAweEY7CisgICAgICAgIG51bUNoUGVyR3JwW09VVF1bY2hHcnBdID0gKG91dENoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOworCisgICAgICAgIGlmIChudW1DaFBlckdycFtJTl1bY2hHcnBdID4gbnVtQ2hQZXJHcnBbT1VUXVtjaEdycF0pIHsKKyAgICAgICAgICBpc0NvbXBhdGlibGUgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICggaXNDb21wYXRpYmxlICkgeworICAgICAgICAvKiBHZXQgbmV3IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwKKyAgICAgICAgICogbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IGNoYW5uZWwgbW9kZS4gKi8KKyAgICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIG91dENoTW9kZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgLyogSWYgdGhlIGlucHV0IGNvbmZpZyBoYXMgYSBiYWNrIGNlbnRlciBjaGFubmVsIGJ1dCB0aGUgb3V0cHV0CisgICAgICAgICAgIGNvbmZpZyBoYXMgbm90LCBjb3B5IGl0IHRvIGxlZnQgYW5kIHJpZ2h0IChpZiBhdmFpbGFibGUpLiAqLworICAgICAgICBpZiAoICAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdJTIpCisgICAgICAgICAgJiYgIShudW1DaFBlckdycFtPVVRdW0NIX0dST1VQX1JFQVJdJTIpICkgeworICAgICAgICAgIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMSkgeworICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtSSUdIVF9SRUFSX0NIQU5ORUxdID0gaW5PZmZzZXRUYWJsZVtMRUZUX1JFQVJfQ0hBTk5FTF07CisgICAgICAgICAgfSBlbHNlIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMykgeworICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF0gPSBpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qIEp1c3QgY29weSBhbmQgZXh0ZW5kIHRoZSBvcmlnaW5hbCBjb25maWcgKi8KKyAgICAgICAgRkRLbWVtY3B5KG91dE9mZnNldFRhYmxlLCBpbk9mZnNldFRhYmxlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKKyAgICAgIH0KKworICAgICAgLyogU2V0IEkvTyBjaGFubmVsIHBvaW50ZXIuCisgICAgICAgICBOb3RlOiBUaGUgZm9sbG93aW5nIGFzc2lnbm1lbnQgYWxnb3JpdGhtIGNsZWFycyB0aGUgY2hhbm5lbCBvZmZzZXQgdGFibGVzLgorICAgICAgICAgICAgICAgVGh1cyB0aGV5IGNhbiBub3QgYmUgdXNlZCBhZnRlcndhcmRzLiAqLworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CisgICAgICAgIGlmICggKG91dE9mZnNldFRhYmxlW2NoXSA8IDI1NSkKKyAgICAgICAgICAmJiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpICkKKyAgICAgICAgeyAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCisgICAgICAgICAgcEluW25Db250ZW50Q2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOworICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKKyAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLworICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOworICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CisgICAgICAgICAgaW5PZmZzZXRUYWJsZVtjaF0gPSAyNTU7CisgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCBpc0NvbXBhdGlibGUgKSB7CisgICAgICAgIC8qIEFzc2lnbiB0aGUgcmVtYWluaW5nIGlucHV0IGNoYW5uZWxzLgorICAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBzYWZldHkgYXBwbGlhbmNlLiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBpdC4gKi8KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CisgICAgICAgICAgaWYgKGluT2Zmc2V0VGFibGVbY2hdIDwgMjU1KSB7CisgICAgICAgICAgICBpbnQgIG91dENoOworICAgICAgICAgICAgZm9yIChvdXRDaCA9IDAgOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCArPSAxKSB7CisgICAgICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPCAyNTUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2V0IEkvTyBwb2ludGVyOiAqLworICAgICAgICAgICAgcEluW25Db250ZW50Q2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOworICAgICAgICAgICAgcE91dFtuQ29udGVudENoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOworICAgICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KKyAgICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW291dENoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOworICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdXSA9IGluQ2hJbmRpY2VzW2luT2Zmc2V0VGFibGVbY2hdXTsKKyAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbb3V0Q2hdID0gMjU1OworICAgICAgICAgICAgbkNvbnRlbnRDaCArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgeworICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKKyAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaCtuRW1wdHlDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKKyAgICAgICAgICAgIC8qIEV4cGFuZCBvdXRwdXQgc2lnbmFsbGluZyAqLworICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IEFDVF9OT05FOworICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IG5FbXB0eUNoOworICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCs9MSkgeworICAgICAgICAgIHBPdXRbY2hdID0gJnBQY21CdWZbY2gqb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKKyAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KKyAgICAgICAgICBjaGFubmVsVHlwZVtjaF0gPSBBQ1RfTk9ORTsKKyAgICAgICAgICBjaGFubmVsSW5kaWNlc1tjaF0gPSBuRW1wdHlDaDsKKyAgICAgICAgICBuRW1wdHlDaCArPSAxOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEZpcnN0IGNvcHkgdGhlIGNoYW5uZWxzIHRoYXQgaGF2ZSBzaWduYWwgKi8KKyAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrPTEpIHsKKyAgICAgICAgSU5UX1BDTSB0SW5bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOworICAgICAgICAvKiBSZWFkIGFsbCBjaGFubmVsIHNhbXBsZXMgKi8KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNvbnRlbnRDaDsgY2grPTEpIHsKKyAgICAgICAgICB0SW5bY2hdID0gKnBJbltjaF07CisgICAgICAgICAgcEluW2NoXSAtPSBpblN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICAvKiBXcml0ZSBhbGwgY2hhbm5lbCBzYW1wbGVzICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoKz0xKSB7CisgICAgICAgICAgKnBPdXRbY2hdID0gdEluW2NoXTsKKyAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgYWxsIHRoZSBvdGhlciBjaGFubmVscyAqLworICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCs9MSkgeworICAgICAgICAgICpwT3V0W2NoXSA9IChJTlRfUENNKTA7CisgICAgICAgICAgcE91dFtjaF0gLT0gb3V0U3RyaWRlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmICAvKiBpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID4gMikgKi8KKworICAgIC8qIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKKyAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIGVsc2UKKyNlbmRpZiAvKiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFICovCisgIGlmICggbnVtSW5DaGFubmVscyA9PSBudW1PdXRDaGFubmVscyApCisgIHsKKyAgICAvKiBEb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBoZXJlICovCisKKyAgICBzd2l0Y2ggKG51bUluQ2hhbm5lbHMpCisgICAgeworICAgIGNhc2UgMjoKKyAgICAgIHsgLyogU2V0IHVwIGNoYW5uZWwgcG9pbnRlciAqLworICAgICAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKKyAgICAgICAgSU5UX1BDTSAgKnBPdXRMLCAqcE91dFI7CisgICAgICAgIEZJWFBfRE1YICBmbGV2OworCisgICAgICAgIFVJTlQgc2FtcGxlOworICAgICAgICBpbnQgaW5TdHJpZGUsIG91dFN0cmlkZSwgb2Zmc2V0OworCisgICAgICAgIGlmIChmSW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgICBpblN0cmlkZSAgPSBudW1JbkNoYW5uZWxzOworICAgICAgICAgIG91dFN0cmlkZSA9IDI7ICAvKiBmaXhlZCAhISEgKGJlbG93IHN0ZXJlbyBpcyBkb253bWl4ZWQgdG8gbW9ubyBpZiByZXF1aXJlZCAqLworICAgICAgICAgIG9mZnNldCA9IDE7IC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluU3RyaWRlICA9IDE7CisgICAgICAgICAgb3V0U3RyaWRlID0gMTsKKyAgICAgICAgICBvZmZzZXQgPSBmcmFtZVNpemU7ICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBpbnB1dCBjaGFubmVsIHBvaW50ZXIgKi8KKyAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtMRUZUX0ZST05UX0NIQU5ORUxdKm9mZnNldF07CisgICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0XTsKKworICAgICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoc2FtZSBhcyBpbnB1dCkgKi8KKyAgICAgICAgcE91dEwgID0gIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdOworICAgICAgICBwT3V0UiAgPSAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdOworCisgICAgICAgIC8qIFNldCBkb3dubWl4IGxldmVsczogKi8KKyAgICAgICAgZmxldiA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKTsKKyAgICAgICAgLyogMi8wIGlucHV0OiAqLworICAgICAgICBzd2l0Y2ggKGR1YWxDaGFubmVsTW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIENIMV9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMTsgIFInID0gMC43MDcgKiBDaDEgKi8KKyAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9CisgICAgICAgICAgICAgIChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKGZNdWx0KChGSVhQX1BDTSkqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUywgU0FNUExFX0JJVFMpOworCisgICAgICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKKyAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSDJfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDI7ICBSJyA9IDAuNzA3ICogQ2gyICovCisgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPQorICAgICAgICAgICAgICAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVChmTXVsdCgoRklYUF9QQ00pKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSwgZmxldiksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLCBTQU1QTEVfQklUUyk7CisKKyAgICAgICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKKyAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNSVhFRF9NT0RFOiAgLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsgIFInID0gMC41KkNoMSArIDAuNSpDaDIgKi8KKyAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9ICgqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gPj4gMSkgKyAoKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA+PiAxKTsKKworICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CisgICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgU1RFUkVPX01PREU6CisgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGVycm9yU3RhdHVzKTsKK30KKworCisvKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UgKAorICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKKyAgKQoreworICBpZiAocFNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgIEZyZWVQY21EbXhJbnN0YW5jZSggcFNlbGYgKTsKKyAgKnBTZWxmID0gTlVMTDsKKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKworLyoqIEdldCBsaWJyYXJ5IGluZm8gZm9yIHRoaXMgbW9kdWxlLgorICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqLworUENNRE1YX0VSUk9SIHBjbURteF9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCit7CisgIGludCBpOworCisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICByZXR1cm4gUENNRE1YX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICAvKiBTZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKKyAgICByZXR1cm4gUENNRE1YX1VOS05PV047CisgIH0KKworICAvKiBBZGQgdGhlIGxpYnJhcnkgaW5mbyAqLworICBpbmZvW2ldLm1vZHVsZV9pZCAgPSBGREtfUENNRE1YOworICBpbmZvW2ldLnZlcnNpb24gICAgPSBMSUJfVkVSU0lPTihQQ01ETVhfTElCX1ZMMCwgUENNRE1YX0xJQl9WTDEsIFBDTURNWF9MSUJfVkwyKTsKKyAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8raSk7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IFBDTURNWF9MSUJfQlVJTERfREFURTsKKyAgaW5mb1tpXS5idWlsZF90aW1lID0gUENNRE1YX0xJQl9CVUlMRF9USU1FOworICBpbmZvW2ldLnRpdGxlICAgICAgPSBQQ01ETVhfTElCX1RJVExFOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvW2ldLmZsYWdzID0gMAorI2lmZGVmIFBDTV9ET1dOTUlYX0VOQUJMRQorICAgICAgfCBDQVBGX0RNWF9CTElORCAgIC8qIEF0IGxlYXN0IGJsaW5kIGRvd25taXhpbmcgaXMgcG9zc2libGUgKi8KKyAjaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQorICAgICAgfCBDQVBGX0RNWF9QQ0UgICAgIC8qIEd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIE1QRUctMi80IFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzIChQQ0UpLiAqLworICAjaWZkZWYgQVJJQl9NSVhET1dOX0VOQUJMRQorICAgICAgfCBDQVBGX0RNWF9BUklCICAgIC8qIFBDRSBndWlkZWQgZG93bm1peCB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBlcXVhdGlvbnMgYW5kIGxldmVscy4gKi8KKyAgI2VuZGlmCisgI2VuZGlmIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KKyAjaWZkZWYgRFNFX01FVEFEQVRBX0VOQUJMRQorICAgICAgfCBDQVBGX0RNWF9EVkIgICAgIC8qIEd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkgZGF0YSBmaWVsZHMuICovCisgI2VuZGlmCisjZW5kaWYgLyogUENNX0RPV05NSVhfRU5BQkxFICovCisjaWZkZWYgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRQorICAgICAgfCBDQVBGX0RNWF9DSF9FWFAgIC8qIFNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBhZGRpbmcgemVybyBjaGFubmVscy4gKi8KKyNlbmRpZgorICAgICAgOworCisgIC8qIEFkZCBsaWIgaW5mbyBmb3IgRkRLIHRvb2xzIChpZiBub3QgeWV0IGRvbmUpLiAqLworICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOworCisgIHJldHVybiBQQ01ETVhfT0s7Cit9CisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oIGIvYWFjL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzRmYjVjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaApAQCAtMCwwICsxLDM0NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBTQlIgZGVjb2RlciBmcm9udC1lbmQgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1NCUkRFQ09ERVJfSAorI2RlZmluZSBfX1NCUkRFQ09ERVJfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisKKyNkZWZpbmUgU0JSX0RFQlVHX0VYVEhMUCAiXAorLS0tIFNCUiAtLS1cblwKKyAgICAweDAwMDAwMDEwIEFuY2lsbGFyeSBkYXRhIGFuZCBTQlItSGVhZGVyXG5cCisgICAgMHgwMDAwMDAyMCBTQlItU2lkZSBpbmZvXG5cCisgICAgMHgwMDAwMDA0MCBEZWNvZGVkIFNCUi1iaXRzdHJlYW0gZGF0YSwgZS5nLiBlbnZlbG9wZSBkYXRhXG5cCisgICAgMHgwMDAwMDA4MCBTQlItQml0c3RyZWFtIHN0YXRpc3RpY3NcblwKKyAgICAweDAwMDAwMTAwIE1pc2NlbGxhbmVvdXMgU0JSLW1lc3NhZ2VzXG5cCisgICAgMHgwMDAwMDIwMCBTQlItRW5lcmdpZXMgYW5kIGdhaW5zIGluIHRoZSBhZGp1c3RvclxuXAorICAgIDB4MDAwMDA0MDAgRmF0YWwgU0JSIGVycm9yc1xuXAorICAgIDB4MDAwMDA4MDAgVHJhbnNwb3NlciBjb2VmZmljaWVudHMgZm9yIGludmVyc2UgZmlsdGVyaW5nXG5cCisiCisKKy8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfTFAgICAgICAgICAgMHgwMDAwMDAwMSAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IG9mIExvdyBQb3dlciBtb2RlLiAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0hRICAgICAgICAgIDB4MDAwMDAwMDIgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBvZiBIaWdoIFF1YWxpdHkgbW9kZS4gICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9EUk1fQlMgICAgICAweDAwMDAwMDA0ICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZGVjb2RlIERSTSBTQlIgZGF0YS4gICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgMHgwMDAwMDAwOCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGNvbmNlYWwgZXJyb25lb3VzIGZyYW1lcy4gICovCisjZGVmaW5lIENBUEZfU0JSX0RSQyAgICAgICAgIDB4MDAwMDAwMTAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBmb3IgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAqLworI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHICAgICAweDAwMDAwMDIwICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZG8gTVBFRyBQYXJhbWV0cmljIFN0ZXJlby4gKi8KKyNkZWZpbmUgQ0FQRl9TQlJfUFNfRFJNICAgICAgMHgwMDAwMDA0MCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIERSTSBQYXJhbWV0cmljIFN0ZXJlby4gICovCisKK3R5cGVkZWYgZW51bQoreworICBTQlJERUNfT0sgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBbGwgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0JSREVDX0NPTkNFQUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNCUkRFQ19OT1NZTkNILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTQlJERUNfSUxMRUdBTF9QUk9HUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0JSREVDX0lMTEVHQUxfVEFHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNCUkRFQ19JTExFR0FMX0NITl9DT05GSUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTQlJERUNfSUxMRUdBTF9TRUNUSU9OLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0JSREVDX0lMTEVHQUxfU0NGQUNUT1JTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1BVTFNFX0RBVEEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTQlJERUNfTUFJTl9QUk9GSUxFX05PVF9JTVBMRU1FTlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0JSREVDX0dDX05PVF9JTVBMRU1FTlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1BMVVNfRUxFX0lELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTQlJERUNfQ1JFQVRFX0VSUk9SLCAgICAgICAgICAgICAgICAgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0JSREVDX05PVF9JTklUSUFMSVpFRCwgICAgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVELCAgICAgICAgICAgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gUHJvYmFibHkgbm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlLiAqLworICBTQlJERUNfUEFSU0VfRVJST1IsICAgICAgICAgICAgICAgICAgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRywgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNCUkRFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBTQlJfRVJST1I7CisKK3R5cGVkZWYgZW51bQoreworICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwgICAgICAgICAgLyohPCBTeXN0ZW06IFN3aXRjaCB0byBlbmFibGUgYW4gYWRkaXRpb25hbCBTQlIgYml0c3RyZWFtIGRlbGF5IG9mIG9uZSBmcmFtZS4gKi8KKyAgU0JSX1FNRl9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IFFNRiBtb2RlLCBlaXRoZXIgY29tcGxleCBvciBsb3cgcG93ZXIuICovCisgIFNCUl9MRF9RTUZfVElNRV9BTElHTiwgICAgICAgICAgICAgICAvKiE8IFNldCBRTUYgdHlwZSwgZWl0aGVyIExELU1QUyBvciBDTERGQi4gUmVsZXZhbnQgZm9yIEVMRCBzdHJlYW1zIG9ubHkuICovCisgIFNCUl9GTFVTSF9EQVRBLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBpbnRlcm5hbCBzdGF0ZSB0byBmbHVzaCB0aGUgZGVjb2RlciB3aXRoIHRoZSBuZXh0IHByb2Nlc3MgY2FsbC4gKi8KKyAgU0JSX0NMRUFSX0hJU1RPUlksICAgICAgICAgICAgICAgICAgIC8qITwgQ2xlYXIgYWxsIGludGVybmFsIHN0YXRlcyAoZGVsYXkgbGluZXMsIFFNRiBzdGF0ZXMsIC4uLikuICovCisgIFNCUl9CU19JTlRFUlJVUFRJT04gICAgICAgICAgICAgICAgICAvKiE8IFNpZ25hbCBiaXQgc3RyZWFtIGludGVycnVwdGlvbi4gVmFsdWUgaXMgaWdub3JlZC4gKi8KK30gU0JSREVDX1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCBTQlJfREVDT0RFUl9JTlNUQU5DRSAqSEFORExFX1NCUkRFQ09ERVI7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworCisvKioKKyAqIFxicmllZiAgICAgICAgQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBvbmUgU0JSIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gcFNlbGYgIFBvaW50ZXIgdG8gd2hlcmUgYSBTQlIgZGVjb2RlciBoYW5kbGUgaXMgY29waWVkIGludG8uCisgKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX09wZW4gKCBIQU5ETEVfU0JSREVDT0RFUiAqcFNlbGYgKTsKKworLyoqCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBTQlIgZGVjb2RlciBydW50aW1lIGluc3RhbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGVjb2Rpbmcgc3RhcnRzLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgIEhhbmRsZSB0byBhIFNCUiBkZWNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHNhbXBsZVJhdGVJbiAgICAgSW5wdXQgc2FtcGxlcmF0ZSBvZiB0aGUgU0JSIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gc2FtcGxlUmF0ZU91dCAgICBPdXRwdXQgc2FtcGxlcmF0ZSBvZiB0aGUgU0JSIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gc2FtcGxlc1BlckZyYW1lICBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWVzLgorICogXHBhcmFtIGNvcmVDb2RlYyAgICAgICAgQXVkaW8gT2JqZWN0IFR5cGUgKEFPVCkgb2YgdGhlIGNvcmUgY29kZWMuCisgKiBccGFyYW0gZWxlbWVudElEICAgICAgICBUYWJsZSB3aXRoIE1QRUctNCBlbGVtZW50IElkcyBpbiBjYW5vbmljYWwgb3JkZXIuCisgKiBccGFyYW0gZm9yY2VSZXNldCAgICAgICBGbGFnIHRoYXQgZW5mb3JjZXMgYSBjb21wbGV0ZSBkZWNvZGVyIHJlc2V0LgorICoKKyAqIFxyZXR1cm4gIEVycm9yIGNvZGUuCisgKi8KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50ICgKKyAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgcGFzcyBvdXQgb2YgYmFuZCBTQlIgaGVhZGVyIHRvIFNCUiBkZWNvZGVyCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICBIYW5kbGUgdG8gYSBTQlIgZGVjb2RlciBpbnN0YW5jZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgYml0IHN0cmVhbSBoYW5kbGUgZGF0YSBzb3VyY2UuCisgKiBccGFyYW0gZWxlbWVudElEICAgIFNCUiBlbGVtZW50IElELgorICogXHBhcmFtIGVsZW1lbnRJbmRleCBTQlIgZWxlbWVudCBpbmRleC4KKyAqCisgKiBccmV0dXJuICBFcnJvciBjb2RlLgorICovCitJTlQgc2JyRGVjb2Rlcl9IZWFkZXIgKAorICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgICAgICBzZWxmLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQnMsCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAorICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZWxlbWVudEluZGV4CisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmICAgICAgICBTZXQgYSBwYXJhbWV0ZXIgb2YgdGhlIFNCUiBkZWNvZGVyIHJ1bnRpbWUgaW5zdGFuY2UuCisgKiBccGFyYW0gc2VsZiAgIFNCUiBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwYXJhbSAgUGFyYW1ldGVyIHdoaWNoIHdpbGwgYmUgc2V0IGlmIHN1Y2Nlc3NmdWxsLgorICogXHBhcmFtIHZhbHVlICBOZXcgcGFyYW1ldGVyIHZhbHVlLgorICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgorICovCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIEhBTkRMRV9TQlJERUNPREVSICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSREVDX1BBUkFNICBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZSApOworCisvKioKKyAqIFxicmllZiAgRmVlZCBEUkMgY2hhbm5lbCBkYXRhIGludG8gYSBTQlIgZGVjb2RlciBydW50aW1lIGluc3RhbmNlLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgICAgICBTQlIgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gY2ggICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBudW1iZXIgdG8gd2hpY2ggdGhlIERSQyBkYXRhIGlzIGFzc29jaWF0ZWQgdG8uCisgKiBccGFyYW0gbnVtQmFuZHMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIERSQyBiYW5kcy4KKyAqIFxwYXJhbSBwTmV4dEZhY3RfbWFnICAgICAgICAgICBQb2ludGVyIHRvIGEgdGFibGUgd2l0aCB0aGUgRFJDIGZhY3RvciBtYWduaXR1ZGVzLgorICogXHBhcmFtIG5leHRGYWN0X2V4cCAgICAgICAgICAgIEV4cG9uZW50IGZvciBhbGwgRFJDIGZhY3RvcnMuCisgKiBccGFyYW0gZHJjSW50ZXJwb2xhdGlvblNjaGVtZSAgRFJDIGludGVycG9sYXRpb24gc2NoZW1lLgorICogXHBhcmFtIHdpblNlcXVlbmNlICAgICAgICAgICAgIFdpbmRvdyBzZXF1ZW5jZSBmcm9tIGNvcmUgY29kZXIgKGVpZ2h0IHNob3J0IG9yIG9uZSBsb25nIHdpbmRvdykuCisgKiBccGFyYW0gcEJhbmRUb3AgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIHRvcCBib3JkZXJzIGZvciBhbGwgRFJDIGJhbmRzLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIGNvZGUuCisgKi8KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX2RyY0ZlZWRDaGFubmVsICggSEFORExFX1NCUkRFQ09ERVIgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAqcE5leHRGYWN0X21hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIG5leHRGYWN0X2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgIGRyY0ludGVycG9sYXRpb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICB3aW5TZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgKnBCYW5kVG9wICk7CisKKy8qKgorICogXGJyaWVmICBEaXNhYmxlIFNCUiBEUkMgZm9yIGEgY2VydGFpbiBjaGFubmVsLgorICoKKyAqIFxwYXJhbSBoU2JyRGVjb2RlciAgU0JSIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGNoICAgICAgICAgICBOdW1iZXIgb2YgdGhlIGNoYW5uZWwgdGhhdCBoYXMgdG8gYmUgZGlzYWJsZWQuCisgKgorICogXHJldHVybiAgTm9uZS4KKyAqLwordm9pZCBzYnJEZWNvZGVyX2RyY0Rpc2FibGUgKCBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNoICk7CisKKworLyoqCisgKiBcYnJpZWYgIFBhcnNlIG9uZSBTQlIgZWxlbWVudCBkYXRhIGV4dGVuc2lvbiBkYXRhIGJsb2NrLiBUaGUgYml0IHN0cmVhbSBwb3NpdGlvbiB3aWxsCisgKiAgICAgICAgIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBTQlIgcGF5bG9hZCBibG9jay4gVGhlIHJlbWFpbmluZyBiaXRzIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgICAgICAgaW50byAqY291bnQgaWYgYSBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbiAoYnlQYXlMZW4gPiAwKS4gSWYgbm8gU0JSIHBheWxvYWQgbGVuZ3RoIGlzCisgKiAgICAgICAgIGdpdmVuIChic1BheUxlbiA8IDApIHRoZW4gdGhlIGJpdCBzdHJlYW0gcG9zaXRpb24gb24gcmV0dXJuIHdpbGwgYmUgcmFuZG9tIGFmdGVyIHRoaXMKKyAqICAgICAgICAgZnVuY3Rpb24gY2FsbCBpbiBjYXNlIG9mIGVycm9ycywgYW5kIGFueSBmdXJ0aGVyIGRlY29kaW5nIHdpbGwgYmUgY29tcGxldGVseSBwb2ludGxlc3MuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgIFNCUiBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICBCaXQgc3RyZWFtIGhhbmRsZSBhcyBkYXRhIHNvdXJjZS4KKyAqIFxwYXJhbSBjb3VudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGludGVnZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBwYXJzZWQgU0JSIHBheWxvYWQgYml0cyBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBic1BheUxlbiAgICAgICBJZiA+IDAgdGhpcyB2YWx1ZSBpcyB0aGUgU0JSIHBheWxvYWQgbGVuZ3RoLiBJZiA8IDAsIHRoZSBTQlIgcGF5bG9hZCBsZW5ndGggaXMgdW5rbm93bi4KKyAqIFxwYXJhbSBmbGFncyAgICAgICAgICBDUkMgZmxhZyAoMDogRVhUX1NCUl9EQVRBOyAxOiBFWFRfU0JSX0RBVEFfQ1JDKQorICogXHBhcmFtIHByZXZfZWxlbWVudCAgIFByZXZpb3VzIE1QRUctNCBlbGVtZW50IElELgorICogXHBhcmFtIGVsZW1lbnRfaW5kZXggIEluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgKgorICogXHJldHVybiAgRXJyb3IgY29kZS4KKyAqLworU0JSX0VSUk9SIHNickRlY29kZXJfUGFyc2UgKAorICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICBpbnQgKmNvdW50LAorICAgICAgICBpbnQgIGJzUGF5TGVuLAorICAgICAgICBpbnQgIGNyY0ZsYWcsCisgICAgICAgIE1QNF9FTEVNRU5UX0lEIHByZXZfZWxlbWVudCwKKyAgICAgICAgaW50IGVsZW1lbnRfaW5kZXgsCisgICAgICAgIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZworICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBnaXZlbiBTQlIgYml0c3RyZWFtcyBhbmQgYXBwbGllcyBTQlIgdG8gdGhlIGdpdmVuIHRpbWUgZGF0YS4KKyAqIAorICogU0JSLXByb2Nlc3Npbmcgd29ya3MgSW5QbGFjZS4gSS5lLiB0aGUgY2FsbGluZyBmdW5jdGlvbiBoYXMgdG8gcHJvdmlkZQorICogYSB0aW1lIGRvbWFpbiBidWZmZXIgdGltZURhdGEgd2hpY2ggY2FuIGhvbGQgdGhlIGNvbXBsZXRlbHkgZGVjb2RlZAorICogcmVzdWx0LgorICoKKyAqIExlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYXJlIHJlYWQgYW5kIHN0b3JlZCBhY2NvcmRpbmcgdG8gdGhlCisgKiBpbnRlcmxlYXZpbmcgZmxhZywgZnJhbWUgbGVuZ3RoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgICBIYW5kbGUgb2YgYW4gb3BlbiBTQlIgZGVjb2RlciBpbnN0YW5jZS4KKyAqIFxwYXJhbSBoU2JyQnMgICAgICAgICAgU0JSIEJpdHN0cmVhbSBoYW5kbGUuCisgKiBccGFyYW0gdGltZURhdGEgICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgYW5kIGZpbmFsbHkgdXBzYW1wbGVkIG91dHB1dCBkYXRhLgorICogXHBhcmFtIG51bUNoYW5uZWxzICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIGhvbGRpbmcgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aW1lIGRhdGEgYnVmZmVyLgorICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICBPdXRwdXQgc2FtcGxlcmF0ZS4KKyAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyAgQ2hhbm5lbCBtYXBwaW5nIGluZGljZXMuCisgKiBccGFyYW0gaW50ZXJsZWF2ZWQgICAgIEZsYWcgaW5kaWNhdGluZyBpZiB0aW1lIGRhdGEgaXMgc3RvcmVkIGludGVybGVhdmVkICgxOiBJbnRlcmxlYXZlZCB0aW1lIGRhdGEsIDA6IG5vbi1pbnRlcmxlYXZlZCB0aW1lZGF0YSkuCisgKiBccGFyYW0gY29yZURlY29kZWRPayAgIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgY29yZSBkZWNvZGVyIGRpZCBub3QgZmluZCBhbnkgZXJyb3IgKDA6IGNvcmUgZGVjb2RlciBmb3VuZCBlcnJvcnMsIDE6IG5vIGVycm9ycykuCisgKiBccGFyYW0gcHNEZWNvZGVkICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyBhIGZsYWcuIElucHV0OiBQUyBpcyBwb3NzaWJsZSwgT3V0cHV0OiBQUyBoYXMgYmVlbiByZW5kZXJlZC4KKyAqCisgKiBccmV0dXJuICBFcnJvciBjb2RlLgorICovCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9BcHBseSAoIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGNvcmVEZWNvZGVkT2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgKnBzRGVjb2RlZCApOworCisKKy8qKgorICogXGJyaWVmICAgICAgIENsb3NlIFNCUiBkZWNvZGVyIGluc3RhbmNlIGFuZCBmcmVlIG1lbW9yeS4KKyAqIFxwYXJhbSBzZWxmICBTQlIgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgRXJyb3IgQ29kZS4KKyAqLworU0JSX0VSUk9SIHNickRlY29kZXJfQ2xvc2UgKCBIQU5ETEVfU0JSREVDT0RFUiAqc2VsZiApOworCisKKy8qKgorICogXGJyaWVmICAgICAgIEdldCBTQlIgZGVjb2RlciBsaWJyYXJ5IGluZm9ybWF0aW9uLgorICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYSBMSUJfSU5GTyBzdHJ1Y3QsIHdoZXJlIGxpYnJhcnkgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiB0by4KKyAqIFxyZXR1cm4gICAgICAwIG9uIHN1Y2Nlc3MsIC0xIGlmIGludmFsaWQgaGFuZGxlIG9yIGlmIG5vIGZyZWUgZWxlbWVudCBpcyBhdmFpbGFibGUgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8uCisgKi8KK0lOVCBzYnJEZWNvZGVyX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7ICAgIAorCisvKioKKyAqIFxicmllZiAgICAgICBEZXRlcm1pbmUgdGhlIG1vZHVsZXMgb3V0cHV0IHNpZ25hbCBkZWxheSBpbiBzYW1wbGVzLgorICogXHBhcmFtIHNlbGYgIFNCUiBkZWNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgc2lnbmFsIGRlbGF5IGFkZGVkIGJ5IHRoZSBtb2R1bGUuCisgKi8KK1VJTlQgc2JyRGVjb2Rlcl9HZXREZWxheSggY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZiApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvYXJtL2Vudl9jYWxjX2FybS5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9hcm0vZW52X2NhbGNfYXJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIxN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvYXJtL2Vudl9jYWxjX2FybS5jcHAKQEAgLTAsMCArMSwxNDggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKKyAgIERlc2NyaXB0aW9uOiAoQVJNIG9wdGltaXNlZCkgU0JSIGRvbWFpbiBjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJTkNMVVNJT05fR1VBUkRfQ0FMQ19FTlZfQVJNCisjZGVmaW5lIElOQ0xVU0lPTl9HVUFSRF9DQUxDX0VOVl9BUk0KKworCisvKiEKKyAgXGJyaWVmICAgQ29tcHV0ZSBtYXhpbWFsIHZhbHVlIG9mIGEgY29tcGxleCBhcnJheSAocmUvaW0pIG9mIGEgZ2l2ZW4gd2lkdGgKKyAgICAgICAgICAgTmVnYXRpdmUgdmFsdWVzIGFyZSB0ZW1wb3JhcmlseSBsb2dpY2FsbHkgb3InZWQgd2l0aCAweEZGRkZGRkZGCisgICAgICAgICAgIGluc3RlYWQgb2YgbmVnYXRpbmcgdGhlIHZhbHVlLCBpZiB0aGUgc2lnbiBiaXQgaXMgc2V0LgorICBccGFyYW0gICBtYXhWYWwgIFByZXNldCBtYXhpbWFsIHZhbHVlCisgIFxwYXJhbSAgIHJlVG1wICAgcmVhbCBpbnB1dCBzaWduYWwKKyAgXHBhcmFtICAgaW1UbXAgICBpbWFnaW5hcnkgaW5wdXQgc2lnbmFsCisgIFxyZXR1cm4gIG5ldyBtYXhpbWFsIHZhbHVlCisqLworCisjaWZkZWYgRlVOQ1RJT05fRkRLX2dldF9tYXh2YWwKK19fYXNtIEZJWFBfREJMIEZES19nZXRfbWF4dmFsIChGSVhQX0RCTCBtYXhWYWwsIEZJWFBfREJMICpyZVRtcCwgRklYUF9EQkwgKmltVG1wLCBpbnQgd2lkdGggKQoreworCisgIC8qIFJlZ2lzdGVyIG1hcDoKKyAgICAgcjAgICAgbWF4VmFsCisgICAgIHIxICAgIHJlVG1wCisgICAgIHIyICAgIGltVG1wCisgICAgIHIzICAgIHdpZHRoCisgICAgIHI0ICAgIHJlYWwKKyAgICAgcjUgICAgaW1hZworICAqLworICAgIFBVU0ggICAge3I0LXI1fQorCisgICAgTU9WUyAgICByMywgcjMsIEFTUiAjMQorICAgIEFEQyAgICAgcjMsIHIzLCAjMAorICAgIEJDUyAgICAgRkRLX2dldF9tYXh2YWxfbG9vcF8ybmRfcGFydAorICAgIEJFUSAgICAgRkRLX2dldF9tYXh2YWxfbG9vcF9lbmQKKworRkRLX2dldF9tYXh2YWxfbG9vcAorICAgIExEUiAgICAgcjQsIFtyMV0sICM0CisgICAgTERSICAgICByNSwgW3IyXSwgIzQKKyAgICBFT1IgICAgIHI0LCByNCwgcjQsIEFTUiAjMzEKKyAgICBFT1IgICAgIHI1LCByNSwgcjUsIEFTUiAjMzEKKyAgICBPUlIgICAgIHIwLCByMCwgcjQKKyAgICBPUlIgICAgIHIwLCByMCwgcjUKKworRkRLX2dldF9tYXh2YWxfbG9vcF8ybmRfcGFydAorICAgIExEUiAgICAgcjQsIFtyMV0sICM0CisgICAgTERSICAgICByNSwgW3IyXSwgIzQKKyAgICBFT1IgICAgIHI0LCByNCwgcjQsIEFTUiAjMzEKKyAgICBFT1IgICAgIHI1LCByNSwgcjUsIEFTUiAjMzEKKyAgICBPUlIgICAgIHIwLCByMCwgcjQKKyAgICBPUlIgICAgIHIwLCByMCwgcjUKKworICAgIFNVQlMgICAgcjMsIHIzLCAjMQorICAgIEJORSAgICAgRkRLX2dldF9tYXh2YWxfbG9vcAorCitGREtfZ2V0X21heHZhbF9sb29wX2VuZAorICAgIFBPUCAgICAge3I0LXI1fQorICAgIEJYICAgICAgbHIKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9GREtfZ2V0X21heHZhbCAqLworCisjZW5kaWYgLyogSU5DTFVTSU9OX0dVQVJEX0NBTENfRU5WX0FSTSAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvYXJtL2xwcF90cmFuX2FybS5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9hcm0vbHBwX3RyYW5fYXJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJiYzJjCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvYXJtL2xwcF90cmFuX2FybS5jcHAKQEAgLTAsMCArMSwxNTEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKKyAgIERlc2NyaXB0aW9uOiAoQVJNIG9wdGltaXNlZCkgTFBQIHRyYW5zcG9zZXIgc3Vicm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisKKworI2RlZmluZSBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxCisKKyNpZmRlZiBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxCisKKy8qIE5vdGU6IFRoaXMgY29kZSByZXF1aXJlcyBvbmx5IDQzIGN5Y2xlcyBwZXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgNjEgb24gQVJNOTI2RUotUyAqLworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgc3RhdGljIHZvaWQgbHBwVHJhbnNwb3Nlcl9mdW5jMSgKKyAgRklYUF9EQkwgKmxvd0JhbmRSZWFsLAorICBGSVhQX0RCTCAqbG93QmFuZEltYWcsCisgIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKKyAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLAorICBpbnQgbG9vcHMsCisgIGludCBoaUJhbmQsCisgIGludCBkeW5hbWljU2NhbGUsCisgIGludCBkZXNjYWxlLAorICBGSVhQX1NHTCBhMHIsCisgIEZJWFBfU0dMIGEwaSwKKyAgRklYUF9TR0wgYTFyLAorICBGSVhQX1NHTCBhMWkpCit7CisKKyAgRklYUF9EQkwgcmVhbDEsIHJlYWwyLCBpbWFnMSwgaW1hZzIsIGFjY3UxLCBhY2N1MjsKKworICByZWFsMiA9IGxvd0JhbmRSZWFsWy0yXTsKKyAgcmVhbDEgPSBsb3dCYW5kUmVhbFstMV07CisgIGltYWcyID0gbG93QmFuZEltYWdbLTJdOworICBpbWFnMSA9IGxvd0JhbmRJbWFnWy0xXTsKKyAgZm9yKGludCBpPTA7IGkgPCBsb29wczsgaSsrKQorICB7CisgICAgYWNjdTEgPSBmTXVsdERpdjIoICAgICAgICAgYTByLHJlYWwxKTsKKyAgICBhY2N1MiA9IGZNdWx0RGl2MiggICAgICAgICBhMGksaW1hZzEpOworICAgIGFjY3UxID0gZk11bHRBZGREaXYyKGFjY3UxLGExcixyZWFsMik7CisgICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsYTFpLGltYWcyKTsKKyAgICByZWFsMiA9IGZNdWx0RGl2MiggICAgICAgICBhMWkscmVhbDIpOworICAgIGFjY3UxID0gYWNjdTEgLSBhY2N1MjsKKyAgICBhY2N1MSA9IGFjY3UxID4+IGR5bmFtaWNTY2FsZTsKKworICAgIGFjY3UyID0gZk11bHRBZGREaXYyKHJlYWwyLGExcixpbWFnMik7CisgICAgcmVhbDIgPSByZWFsMTsKKyAgICBpbWFnMiA9IGltYWcxOworICAgIGFjY3UyID0gZk11bHRBZGREaXYyKGFjY3UyLGEwaSxyZWFsMSk7CisgICAgcmVhbDEgPSBsb3dCYW5kUmVhbFtpXTsKKyAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihhY2N1MixhMHIsaW1hZzEpOworICAgIGltYWcxID0gbG93QmFuZEltYWdbaV07CisgICAgYWNjdTIgPSBhY2N1MiA+PiBkeW5hbWljU2NhbGU7CisKKyAgICBhY2N1MSA8PD0gMTsKKyAgICBhY2N1MiA8PD0gMTsKKworICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGFjY3UxICsgKHJlYWwxPj5kZXNjYWxlKTsKKyAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBhY2N1MiArIChpbWFnMT4+ZGVzY2FsZSk7CisgIH0KK30KKyNlbmRpZiAgLyogI2lmZGVmIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEgKi8KKyNlbmRpZiAgLyogX19hcm1fXyAqLworCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTU3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAKQEAgLTAsMCArMSwyMjI5IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgRW52ZWxvcGUgY2FsY3VsYXRpb24gIAorCisgIFRoZSBlbnZlbG9wZSBhZGp1c3RvciBjb21wYXJlcyB0aGUgZW5lcmdpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNwb3NlZAorICBoaWdoYmFuZCB0byB0aGUgcmVmZXJlbmNlIGVuZXJnaWVzIGNvbnZleWVkIHdpdGggdGhlIGJpdHN0cmVhbS4KKyAgVGhlIGhpZ2hiYW5kIGlzIGFtcGxpZmllZCAoc29tZXRpbWVzKSBvciBhdHRlbnVhdGVkIChtb3N0bHkpIHRvIHRoZQorICBkZXNpcmVkIGxldmVsLgorCisgIFRoZSBzcGVjdHJhbCBzaGFwZSBvZiB0aGUgcmVmZXJlbmNlIGVuZXJnaWVzIGNhbiBiZSBjaGFuZ2VkIHNldmVyYWwgdGltZXMgcGVyCisgIGZyYW1lIGlmIG5lY2Vzc2FyeS4gRWFjaCBzZXQgb2YgZW5lcmd5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGEgY2VydGFpbiByYW5nZQorICBpbiB0aW1lIHdpbGwgYmUgY2FsbGVkIGFuIDxlbT5lbnZlbG9wZTwvZW0+IGhlcmUuCisgIFRoZSBiaXRzdHJlYW0gc3VwcG9ydHMgc2V2ZXJhbCBmcmVxdWVuY3kgc2NhbGVzIGFuZCB0d28gcmVzb2x1dGlvbnMuIE5vcm1hbGx5LAorICBvbmUgb3IgbW9yZSBRTUYtc3ViYmFuZHMgYXJlIGdyb3VwZWQgdG8gb25lIFNCUi1iYW5kLiBBbiBlbnZlbG9wZSBjb250YWlucworICByZWZlcmVuY2UgZW5lcmdpZXMgZm9yIGVhY2ggU0JSLWJhbmQuCisgIEluIGFkZGl0aW9uIHRvIHRoZSBlbmVyZ3kgZW52ZWxvcGVzLCBub2lzZSBlbnZlbG9wZXMgYXJlIHRyYW5zbWl0dGVkIHRoYXQKKyAgZGVmaW5lIHRoZSByYXRpbyBvZiBlbmVyZ3kgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyBub2lzZSBpbnN0ZWFkIG9mCisgIHRyYW5zcG9zaW5nIHRoZSBsb3diYW5kLiBUaGUgbm9pc2UgZW52ZWxvcGVzIGFyZSBnaXZlbiBpbiBhIGNvYXJzZXIgdGltZQorICBhbmQgZnJlcXVlbmN5IHJlc29sdXRpb24uCisgIElmIGEgc2lnbmFsIGNvbnRhaW5zIHN0cm9uZyB0b25hbCBjb21wb25lbnRzLCBzeW50aGV0aWMgc2luZXMgY2FuIGJlCisgIGdlbmVyYXRlZCBpbiBpbmRpdmlkdWFsIFNCUiBiYW5kcy4KKworICBBbiBvdmVybGFwIGJ1ZmZlciBvZiA2IFFNRi10aW1lc2xvdHMgaXMgdXNlZCB0byBhbGxvdyBhIG1vcmUKKyAgZmxleGlibGUgYWxpZ25tZW50IG9mIHRoZSBlbnZlbG9wZXMgaW4gdGltZSB0aGF0IGlzIG5vdCByZXN0cmljdGVkIHRvIHRoZQorICBjb3JlIGNvZGVjJ3MgZnJhbWUgYm9yZGVycy4KKyAgVGhlcmVmb3JlIHRoZSBlbnZlbG9wZSBhZGp1c3RvciBoYXMgYWNjZXNzIHRvIHRoZSBzcGVjdHJhbCBkYXRhIG9mIHRoZQorICBjdXJyZW50IGZyYW1lIGFzIHdlbGwgYXMgdGhlIGxhc3QgNiBRTUYtdGltZXNsb3RzIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4KKyAgSG93ZXZlciwgaW4gYXZlcmFnZSBvbmx5IHRoZSBkYXRhIG9mIDEgZnJhbWUgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzCisgIHRoZSBhZGp1c3RvciBpcyBjYWxsZWQgb25jZSBwZXIgZnJhbWUuCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmVxdWVuY3kgcmFuZ2Ugc2V0IGluIHRoZSBiaXRzdHJlYW0sIG9ubHkgUU1GLXN1YmJhbmRzIGJldHdlZW4KKyAgPGVtPmxvd1N1YmJhbmQ8L2VtPiBhbmQgPGVtPmhpZ2hTdWJiYW5kPC9lbT4gYXJlIGFkanVzdGVkLgorCisgIFNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YSB0byBtYXhpbWl6ZSBTTlIgKHNlZSAjUU1GX1NDQUxFX0ZBQ1RPUikgYXMgd2VsbCBhcyBhIHNwZWNpYWwgTWFudGlzc2EtRXhwb25lbnQgZm9ybWF0CisgICggc2VlICBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpICkgYXJlIGJlaW5nIHVzZWQuIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIG1vZHVsZXMgaXMgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKS4KKworICBcc2Egc2JyX3NjYWxlLmgsICNRTUZfU0NBTEVfRkFDVE9SLCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworKi8KKworCisjaW5jbHVkZSAiZW52X2NhbGMuaCIKKworI2luY2x1ZGUgInNicmRlY19mcmVxX3NjYS5oIgorI2luY2x1ZGUgImVudl9leHRyLmgiCisjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCisjaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicl9yb20uaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiICAgICAgICAgICAvKiBuZWVkIEZES3BvdygpIGZvciBkZWJ1ZyBvdXRwdXRzICovCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjaW5jbHVkZSAiYXJtL2Vudl9jYWxjX2FybS5jcHAiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBGSVhQX0RCTCBucmdSZWZbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBGSVhQX0RCTCBucmdFc3RbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBGSVhQX0RCTCBucmdHYWluW01BWF9GUkVRX0NPRUZGU107CisgICAgRklYUF9EQkwgbm9pc2VMZXZlbFtNQVhfRlJFUV9DT0VGRlNdOworICAgIEZJWFBfREJMIG5yZ1NpbmVbTUFYX0ZSRVFfQ09FRkZTXTsKKworICAgIFNDSEFSICAgbnJnUmVmX2VbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBTQ0hBUiAgIG5yZ0VzdF9lW01BWF9GUkVRX0NPRUZGU107CisgICAgU0NIQVIgICBucmdHYWluX2VbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBTQ0hBUiAgIG5vaXNlTGV2ZWxfZVtNQVhfRlJFUV9DT0VGRlNdOworICAgIFNDSEFSICAgbnJnU2luZV9lW01BWF9GUkVRX0NPRUZGU107Cit9CitFTlZfQ0FMQ19OUkdTOworCisvKnN0YXRpYyovIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKEZJWFBfREJMICpmaWx0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgKmZpbHRCdWZmZXJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqTnJnR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICpOcmdHYWluX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHN1YmJhbmRzKTsKKworLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsIGludCBoaWdoU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgZnJhbWVFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0VzdF9lICk7CisKKy8qc3RhdGljKi8gdm9pZCBjYWxjTnJnUGVyU2ZiKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0YXJ0X3BvcywgIGludCBuZXh0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGlucHV0X2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdfZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnX2VzdF9lICk7CisKKy8qc3RhdGljKi8gdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgU0NIQVIgbnJnUmVmX2UsIEVOVl9DQUxDX05SR1MqIG5yZ3MsIGludCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgU0NIQVIgdG1wTm9pc2VfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZyk7CisKKy8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBoaWdoU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqc3VtUmVmX20sCisgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnN1bVJlZl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluX20sCisgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnB0ckF2Z0dhaW5fZSk7CisKKy8qc3RhdGljKi8gdm9pZCBhZGp1c3RUaW1lU2xvdExDKEZJWFBfREJMICAqcHRyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcHRySGFybUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vU3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc2NhbGVfY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKnB0clBoYXNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgZkNsZGZiKTsKKy8qc3RhdGljKi8gdm9pZCBhZGp1c3RUaW1lU2xvdEhRKEZJWFBfREJMICAqcHRyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vU3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc2NhbGVfY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKworCisvKiEKKyAgXGJyaWVmICAgICBNYXAgc2luZSBmbGFncyBmcm9tIGJpdHN0cmVhbSB0byBRTUYgYmFuZHMKKworICBUaGUgYml0c3RyZWFtIGNhcnJpZXMgb25seSAxIHNpbmUgZmxhZyBwZXIgYmFuZCBhbmQgZnJhbWUuCisgIFRoaXMgZnVuY3Rpb24gbWFwcyBldmVyeSBzaW5lIGZsYWcgZnJvbSB0aGUgYml0c3RyZWFtIHRvIGEgc3BlY2lmaWMgUU1GIHN1YmJhbmQKKyAgYW5kIHRvIGEgc3BlY2lmaWMgZW52ZWxvcGUgd2hlcmUgdGhlIHNpbmUgc2hhbGwgc3RhcnQuCisgIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSB2ZWN0b3Igc2luZU1hcHBlZCB3aGljaCBjb250YWlucyBvbmUgZW50cnkgcGVyCisgIFFNRiBzdWJiYW5kLiBUaGUgdmFsdWUgb2YgYW4gZW50cnkgc3BlY2lmaWVzIHRoZSBlbnZlbG9wZSB3aGVyZSBhIHNpbmUKKyAgc2hhbGwgc3RhcnQuIEEgdmFsdWUgb2YgI01BWF9FTlZFTE9QRVMgaW5kaWNhdGVzIHRoYXQgbm8gc2luZSBpcyBwcmVzZW50CisgIGluIHRoZSBzdWJiYW5kLgorICBUaGUgbWlzc2luZyBoYXJtb25pY3MgZmxhZ3MgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgKGhhcm1GbGFnc1ByZXYpIGRldGVybWluZQorICBpZiBhIHNpbmUgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lIG9yIGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uCisgIEFkZGl0aW9uYWxseSwgdGhlIGZsYWdzIGluIGhhcm1GbGFnc1ByZXYgYXJlIGJlaW5nIHVwZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbgorICBmb3IgdGhlIG5leHQgZnJhbWUuCisqLworLypzdGF0aWMqLyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgLyohPCBCYW5kIGJvcmRlcnMgKHRoZXJlJ3Mgb25seSAxIGZsYWcgcGVyIGJhbmQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZmIsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmFkZEhhcm1vbmljcywgICAgICAgICAgIC8qITwgdmVjdG9yIHdpdGggMSBmbGFnIHBlciBzZmIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhhcm1GbGFnc1ByZXYsICAgICAgICAgICAvKiE8IFBhY2tlZCAnYWRkSGFybW9uaWNzJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuRW52LCAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnNpbmVNYXBwZWQpICAgICAgICAgICAgLyohPCBSZXN1bHRpbmcgdmVjdG9yIG9mIHNpbmUgc3RhcnQgcG9zaXRpb25zIGZvciBlYWNoIFFNRiBiYW5kICovCisKK3sKKyAgaW50IGk7CisgIGludCBsb3dTdWJiYW5kMiA9IGZyZXFCYW5kVGFibGVbMF08PDE7CisgIGludCBiaXRjb3VudCA9IDA7CisgIGludCBvbGRmbGFncyA9ICpoYXJtRmxhZ3NQcmV2OworICBpbnQgbmV3ZmxhZ3MgPSAwOworCisgIC8qCisgICAgRm9ybWF0IG9mIGhhcm1GbGFnc1ByZXY6CisKKyAgICBmaXJzdCB3b3JkID0gZmxhZ3MgZm9yIGhpZ2hlc3QgMTYgc2ZiIGJhbmRzIGluIHVzZQorICAgIHNlY29uZCB3b3JkID0gZmxhZ3MgZm9yIG5leHQgbG93ZXIgMTYgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQorICAgIHRoaXJkIHdvcmQgPSBmbGFncyBmb3IgbG93ZXN0IDE2IHNmYiBiYW5kcyAoaWYgcHJlc2VudCkKKworICAgIFVwIHRvIE1BWF9GUkVRX0NPRUZGUyBzZmIgYmFuZHMgY2FuIGJlIGZsYWdnZWQgZm9yIGEgc2lnbi4KKyAgICBUaGUgbG93ZXN0IGJpdCBvZiB0aGUgZmlyc3Qgd29yZCBjb3JyZXNwb25kcyB0byB0aGUgX2hpZ2hlc3RfIHNmYiBiYW5kIGluIHVzZS4KKyAgICBUaGlzIGlzIGVuc3VyZXMgdGhhdCBlYWNoIGZsYWcgaXMgIG1hcHBlZCB0byB0aGUgc2FtZSBRTUYgYmFuZCBldmVuIGFmdGVyIGEKKyAgICBjaGFuZ2Ugb2YgdGhlIGNyb3Nzb3Zlci1mcmVxdWVuY3kuCisgICovCisKKworICAvKiBSZXNldCB0aGUgb3V0cHV0IHZlY3RvciBmaXJzdCAqLworICBGREttZW1zZXQoc2luZU1hcHBlZCwgTUFYX0VOVkVMT1BFUyxNQVhfRlJFUV9DT0VGRlMpOyAvKiBNQVhfRU5WRUxPUEVTIG1lYW5zICdubyBzaW5lJyAqLworCisgIGZyZXFCYW5kVGFibGUgKz0gblNmYjsKKyAgYWRkSGFybW9uaWNzICArPSBuU2ZiLTE7CisKKyAgZm9yIChpPW5TZmI7IGkhPTA7IGktLSkgeworICAgIGludCB1aSA9ICpmcmVxQmFuZFRhYmxlLS07ICAgICAgICAgICAgICAgICAvKiBVcHBlciBsaW1pdCBvZiB0aGUgY3VycmVudCBzY2FsZSBmYWN0b3IgYmFuZC4gKi8KKyAgICBpbnQgbGkgPSAqZnJlcUJhbmRUYWJsZTsgICAgICAgICAgICAgICAgICAgLyogTG93ZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgc2NhbGUgZmFjdG9yIGJhbmQuICovCisKKyAgICBpZiAoICphZGRIYXJtb25pY3MtLSApIHsgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgYSBzaW5lIGluIHRoaXMgYmFuZCAqLworCisgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgYml0Y291bnQ7CisgICAgICBuZXdmbGFncyB8PSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFnICovCisKKyAgICAgIC8qCisgICAgICAgIElmIHRoZXJlIHdhcyBhIHNpbmUgaW4gdGhlIGxhc3QgZnJhbWUsIGxldCBpdCBjb250aW51ZSBmcm9tIHRoZSBmaXJzdCBlbnZlbG9wZSBvbgorICAgICAgICBlbHNlIHN0YXJ0IGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uCisgICAgICAqLworICAgICAgc2luZU1hcHBlZFsodWkrbGktbG93U3ViYmFuZDIpID4+IDFdID0gKCBvbGRmbGFncyAmIG1hc2sgKSA/IDAgOiB0cmFuRW52OworICAgIH0KKworICAgIGlmICgoKytiaXRjb3VudCA9PSAxNikgfHwgaT09MSkgeworICAgICAgYml0Y291bnQgPSAwOworICAgICAgKmhhcm1GbGFnc1ByZXYrKyA9IG5ld2ZsYWdzOworICAgICAgb2xkZmxhZ3MgPSAqaGFybUZsYWdzUHJldjsgICAgICAgICAgICAgICAvKiBGZXRjaCAxNiBvZiB0aGUgb2xkIGZsYWdzICovCisgICAgICBuZXdmbGFncyA9IDA7CisgICAgfQorICB9Cit9CisKKworLyohCisgIFxicmllZiAgICAgUmVkdWNlIGdhaW4tYWRqdXN0bWVudCBpbmR1Y2VkIGFsaWFzaW5nIGZvciByZWFsIHZhbHVlZCBmaWx0ZXJiYW5rLgorKi8KKy8qc3RhdGljKi8gdm9pZAorYWxpYXNpbmdSZWR1Y3Rpb24oRklYUF9EQkwqIGRlZ3JlZUFsaWFzLCAgICAgICAvKiE8IGVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKKyAgICAgICAgICAgICAgICAgIGludCogICAgICB1c2VBbGlhc1JlZHVjdGlvbiwgLyohPCBzeW50aGV0aWMgc2luZSBlbmdlcmd5IGZvciBlYWNoIHN1YmJhbmQsIHVzZWQgYXMgZmxhZyAqLworICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMpICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLworeworICBGSVhQX0RCTCogbnJnR2FpbiAgID0gbnJncy0+bnJnR2FpbjsgICAgICAgICAgLyohPCBzdWJiYW5kIGdhaW5zIHRvIGJlIG1vZGlmaWVkICovCisgIFNDSEFSKiAgICBucmdHYWluX2UgPSBucmdzLT5ucmdHYWluX2U7ICAgICAgICAvKiE8IHN1YmJhbmQgZ2FpbnMgdG8gYmUgbW9kaWZpZWQgKGV4cG9uZW50cykgKi8KKyAgRklYUF9EQkwqIG5yZ0VzdCAgICA9IG5yZ3MtPm5yZ0VzdDsgICAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKi8KKyAgU0NIQVIqICAgIG5yZ0VzdF9lICA9IG5yZ3MtPm5yZ0VzdF9lOyAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKGV4cG9uZW50cykgKi8KKyAgaW50IGdyb3VwaW5nID0gMCwgaW5kZXggPSAwLCBub0dyb3VwcywgazsKKyAgaW50IGdyb3VwVmVjdG9yW01BWF9GUkVRX0NPRUZGU107CisKKyAgLyogQ2FsY3VsYXRlIGdyb3VwaW5nKi8KKyAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHMtMTsgaysrICl7CisgICAgaWYgKCAoZGVncmVlQWxpYXNbayArIDFdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiB1c2VBbGlhc1JlZHVjdGlvbltrXSApIHsKKyAgICAgIGlmKGdyb3VwaW5nPT0wKXsKKyAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrOworICAgICAgICBncm91cGluZyA9IDE7CisgICAgICB9CisgICAgICBlbHNleworICAgICAgICBpZihncm91cFZlY3RvcltpbmRleC0xXSArIDMgPT0gayl7CisgICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrICsgMTsKKyAgICAgICAgICBncm91cGluZyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgIGlmKGdyb3VwaW5nKXsKKyAgICAgICAgaWYodXNlQWxpYXNSZWR1Y3Rpb25ba10pCisgICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gazsKKyAgICAgICAgZ3JvdXBpbmcgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKGdyb3VwaW5nKXsKKyAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IG5vU3ViYmFuZHM7CisgIH0KKyAgbm9Hcm91cHMgPSBpbmRleCA+PiAxOworCisKKyAgLypDYWxjdWxhdGUgbmV3IGdhaW4qLworICBmb3IgKGludCBncm91cCA9IDA7IGdyb3VwIDwgbm9Hcm91cHM7IGdyb3VwICsrKSB7CisgICAgRklYUF9EQkwgbnJnT3JpZyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgICAvKiBPcmlnaW5hbCBzaWduYWwgZW5lcmd5IGluIGN1cnJlbnQgZ3JvdXAgb2YgYmFuZHMgKi8KKyAgICBTQ0hBUiAgICBucmdPcmlnX2UgPSAwOworICAgIEZJWFBfREJMIG5yZ0FtcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgICAgLyogQW1wbGlmaWVkIHNpZ25hbCBlbmVyZ3kgaW4gZ3JvdXAgKHVzaW5nIGN1cnJlbnQgZ2FpbnMpICovCisgICAgU0NIQVIgICAgbnJnQW1wX2UgPSAwOworICAgIEZJWFBfREJMIG5yZ01vZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgIC8qIFNpZ25hbCBlbmVyZ3kgaW4gZ3JvdXAgd2hlbiBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLworICAgIFNDSEFSICAgIG5yZ01vZF9lID0gMDsKKyAgICBGSVhQX0RCTCBncm91cEdhaW47ICAgICAgICAgLyogVG90YWwgZW5lcmd5IGdhaW4gaW4gZ3JvdXAgKi8KKyAgICBTQ0hBUiAgICBncm91cEdhaW5fZTsKKyAgICBGSVhQX0RCTCBjb21wZW5zYXRpb247ICAgICAgLyogQ29tcGVuc2F0aW9uIGZhY3RvciBmb3IgdGhlIGVuZXJneSBjaGFuZ2Ugd2hlbiBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLworICAgIFNDSEFSICAgIGNvbXBlbnNhdGlvbl9lOworCisgICAgaW50IHN0YXJ0R3JvdXAgPSBncm91cFZlY3RvclsyKmdyb3VwXTsKKyAgICBpbnQgc3RvcEdyb3VwICA9IGdyb3VwVmVjdG9yWzIqZ3JvdXArMV07CisKKyAgICAvKiBDYWxjdWxhdGUgdG90YWwgZW5lcmd5IGluIGdyb3VwIGJlZm9yZSBhbmQgYWZ0ZXIgYW1wbGlmaWNhdGlvbiB3aXRoIGN1cnJlbnQgZ2FpbnM6ICovCisgICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspeworICAgICAgLyogR2V0IG9yaWdpbmFsIGJhbmQgZW5lcmd5ICovCisgICAgICBGSVhQX0RCTCB0bXAgPSBucmdFc3Rba107CisgICAgICBTQ0hBUiAgICB0bXBfZSA9IG5yZ0VzdF9lW2tdOworCisgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgbnJnT3JpZywgbnJnT3JpZ19lLCAmbnJnT3JpZywgJm5yZ09yaWdfZSk7CisKKyAgICAgIC8qIE11bHRpcGx5IGJhbmQgZW5lcmd5IHdpdGggY3VycmVudCBnYWluICovCisgICAgICB0bXAgPSBmTXVsdCh0bXAsbnJnR2FpbltrXSk7CisgICAgICB0bXBfZSA9IHRtcF9lICsgbnJnR2Fpbl9lW2tdOworCisgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgbnJnQW1wLCBucmdBbXBfZSwgJm5yZ0FtcCwgJm5yZ0FtcF9lKTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdG90YWwgZW5lcmd5IGdhaW4gaW4gZ3JvdXAgKi8KKyAgICBGREtfZGl2aWRlX01hbnRFeHAobnJnQW1wLCBucmdBbXBfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnJnT3JpZywgbnJnT3JpZ19lLAorICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBHYWluLCAmZ3JvdXBHYWluX2UpOworCisgICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgU0NIQVIgICAgdG1wX2U7CisKKyAgICAgIEZJWFBfREJMIGFscGhhID0gZGVncmVlQWxpYXNba107CisgICAgICBpZiAoayA8IG5vU3ViYmFuZHMgLSAxKSB7CisgICAgICAgIGlmIChkZWdyZWVBbGlhc1trICsgMV0gPiBhbHBoYSkKKyAgICAgICAgICBhbHBoYSA9IGRlZ3JlZUFsaWFzW2sgKyAxXTsKKyAgICAgIH0KKworICAgICAgLyogTW9kaWZ5IGdhaW4gZGVwZW5kaW5nIG9uIHRoZSBkZWdyZWUgb2YgYWxpYXNpbmcgKi8KKyAgICAgIEZES19hZGRfTWFudEV4cCggZk11bHQoYWxwaGEsZ3JvdXBHYWluKSwgZ3JvdXBHYWluX2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhLG5yZ0dhaW5ba10pLCBucmdHYWluX2Vba10sCisgICAgICAgICAgICAgICAgICAgICAgICZucmdHYWluW2tdLCAmbnJnR2Fpbl9lW2tdICk7CisKKyAgICAgIC8qIEFwcGx5IG1vZGlmaWVkIGdhaW4gdG8gb3JpZ2luYWwgZW5lcmd5ICovCisgICAgICB0bXAgPSBmTXVsdChucmdHYWluW2tdLG5yZ0VzdFtrXSk7CisgICAgICB0bXBfZSA9IG5yZ0dhaW5fZVtrXSArIG5yZ0VzdF9lW2tdOworCisgICAgICAvKiBBY2N1bXVsYXRlIGVuZXJneSB3aXRoIG1vZGlmaWVkIGdhaW5zIGFwcGxpZWQgKi8KKyAgICAgIEZES19hZGRfTWFudEV4cCggdG1wLCB0bXBfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnJnTW9kLCBucmdNb2RfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm5yZ01vZCwgJm5yZ01vZF9lICk7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gcmV0YWluIHRoZSBlbmVyZ3kgb2YgdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICBGREtfZGl2aWRlX01hbnRFeHAobnJnQW1wLCBucmdBbXBfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnJnTW9kLCBucmdNb2RfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBlbnNhdGlvbiwgJmNvbXBlbnNhdGlvbl9lKTsKKworICAgIC8qIEFwcGx5IGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gYWxsIGdhaW5zIG9mIHRoZSBncm91cCAqLworICAgIGZvcihrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKXsKKyAgICAgIG5yZ0dhaW5ba10gPSBmTXVsdChucmdHYWluW2tdLGNvbXBlbnNhdGlvbik7CisgICAgICBucmdHYWluX2Vba10gPSBucmdHYWluX2Vba10gKyBjb21wZW5zYXRpb25fZTsKKyAgICB9CisgIH0KK30KKworCisgLyogQ29udmVydCBoZWFkcm9vbSBiaXRzIHRvIGV4cG9uZW50ICovCisjZGVmaW5lIFNDQUxFMkVYUChzKSAoMTUtKHMpKQorI2RlZmluZSBFWFAyU0NBTEUoZSkgKDE1LShlKSkKKworLyohCisgIFxicmllZiAgQXBwbHkgc3BlY3RyYWwgZW52ZWxvcGUgdG8gc3ViYmFuZCBzYW1wbGVzCisKKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBzYnJfZGVjLmNwcCBpbiBlYWNoIGZyYW1lLgorCisgIFRvIGVuaGFuY2UgYWNjdXJhY3kgYW5kIGR1ZSB0byB0aGUgdXNhZ2Ugb2YgdGFibGVzIGZvciBzcXVhcmVyb290cyBhbmQKKyAgaW52ZXJzZSwgc29tZSBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIHRoZSBvcGVyYW5kcyBiZWluZyBzcGxpdAorICBpbnRvIG1hbnRpc3NhIGFuZCBleHBvbmVudC4gVGhlIHZhcmlhYmxlIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZSBjYXJyeQorICB0aGUgc3VmZml4ZXMgPGVtPl9tPC9lbT4gYW5kICA8ZW0+X2U8L2VtPiByZXNwZWN0aXZlbHkuIFRoZSBjb250cm9sIGRhdGEKKyAgaW4gI2hGcmFtZURhdGEgY29udGFpbnRzIGVudmVsb3BlIGRhdGEgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtYXQgYnV0CisgIHN0b3JlZCBpbiBzaW5nbGUgd29yZHMuIChTZWUgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIGZvciBkZXRhaWxzKS4gVGhpcyBkYXRhCisgIGlzIHVucGFja2VkIHdpdGhpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIHRvIGZvbGxvdyB0aGUgZGVzY3JpYmVkIHN1ZmZpeCBjb252ZW50aW9uLgorCisgIFRoZSBhY3R1YWwgdmFsdWUgKGNvbXBhcmFibGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZmxvYXQtdmFyaWFibGUgaW4gdGhlCisgIHJlc2VhcmNoLWltcGxlbWVudGF0aW9uKSBvZiBhIG1hbnRpc3NhL2V4cG9uZW50LXBhaXIgY2FuIGJlIGNhbGN1bGF0ZWQgYXMKKworICBcZiQgdmFsdWUgPSB2YWx1ZVxfbSAqIDJee3ZhbHVlXF9lfSBcZiQKKworICBBbGwgZW5lcmdpZXMgYW5kIG5vaXNlIGxldmVscyBkZWNvZGVkIGZyb20gdGhlIGJpdHN0cmVhbSBzdWl0IGZvciBhbgorICBvcmlnaW5hbCBzaWduYWwgbWFnbml0dWRlIG9mIFxmJFxwbSAzMjc2OCBcZiQgcmF0aGVyIHRoYW4gXGYkIFxwbSAxXGYkLiBUaGVyZWZvcmUsCisgIHRoZSBzY2FsZSBmYWN0b3IgPGVtPmhiX3NjYWxlPC9lbT4gcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNvbnZlcnRlZAorICB0byBhbiAnaW5wdXQgZXhwb25lbnQnICgjaW5wdXRfZSksIHdoaWNoIGZpdHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorCisgIEJlZm9yZSB0aGUgYWN0dWFsIHByb2Nlc3NpbmcsIGFuIGV4cG9uZW50ICNhZGpfZSBmb3IgcmVzdWx0aW5nIGFkanVzdGVkCisgIHNhbXBsZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIHJlZmVyZW5jZSBlbmVyZ3kuCisKKyAgVGhlbiwgZm9yIGVhY2ggZW52ZWxvcGUsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHBlcmZvcm1lZDoKKworICBcbGkgQ2FsY3VsYXRlIGVuZXJneSBpbiB0aGUgc2lnbmFsIHRvIGJlIGFkanVzdGVkLiBEZXBlbmRpbmcgb24gdGhlIHRoZSB2YWx1ZSBvZgorICAgICAgI2ludGVycG9sRnJlcSAoaW50ZXJwb2xhdGlvbiBtb2RlKSwgdGhpcyBpcyBlaXRoZXIgZG9uZSBzZXBlcmF0ZWx5CisgICAgICBmb3IgZWFjaCBRTUYtc3ViYmFuZCBvciBmb3IgZWFjaCBTQlItYmFuZC4KKyAgICAgIFRoZSByZXN1bHRpbmcgZW5lcmdpZXMgYXJlIHN0b3JlZCBpbiAjbnJnRXN0X21bI01BWF9GUkVRX0NPRUZGU10gKG1hbnRpc3NhcykKKyAgICAgIGFuZCAjbnJnRXN0X2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cykuCisgIFxsaSBDYWxjdWxhdGUgZ2FpbiBhbmQgbm9pc2UgbGV2ZWwgZm9yIGVhY2ggc3ViYmFuZDo8YnI+CisgICAgICBcZiQgZ2FpbiAgPSBcc3FydHsgXGZyYWN7bnJnUmVmfXtucmdFc3R9IFxjZG90ICgxIC0gbm9pc2VSYXRpbykgfQorICAgICAgICAgIFxoc3BhY2V7MmNtfQorICAgICAgICAgIG5vaXNlID0gXHNxcnR7IG5yZ1JlZiBcY2RvdCBub2lzZVJhdGlvIH0KKyAgICAgIFxmJDxicj4KKyAgICAgIHdoZXJlIDxlbT5ub2lzZVJhdGlvPC9lbT4gYW5kIDxlbT5ucmdSZWY8L2VtPiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlCisgICAgICBiaXRzdHJlYW0gYW5kIDxlbT5ucmdFc3Q8L2VtPiBpcyB0aGUgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFkanVzdG1lbnQuCisgICAgICBUaGUgcmVzdWx0aW5nIGdhaW5zIGFyZSBzdG9yZWQgaW4gI25yZ0dhaW5fbVsjTUFYX0ZSRVFfQ09FRkZTXQorICAgICAgKG1hbnRpc3NhcykgYW5kICNucmdHYWluX2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cyksIHRoZSBub2lzZSBsZXZlbHMKKyAgICAgIGFyZSBzdG9yZWQgaW4gI25vaXNlTGV2ZWxfbVsjTUFYX0ZSRVFfQ09FRkZTXSBhbmQgI25vaXNlTGV2ZWxfZVsjTUFYX0ZSRVFfQ09FRkZTXQorICAgICAgKGV4cG9uZW50cykuCisgICAgICBUaGUgc2luZSBsZXZlbHMgYXJlIHN0b3JlZCBpbiAjbnJnU2luZV9tWyNNQVhfRlJFUV9DT0VGRlNdCisgICAgICBhbmQgI25yZ1NpbmVfZVsjTUFYX0ZSRVFfQ09FRkZTXS4KKyAgXGxpIE5vaXNlIGxpbWl0aW5nOiBUaGUgZ2FpbiBmb3IgZWFjaCBzdWJiYW5kIGlzIGxpbWl0ZWQgYm90aCBhYnNvbHV0ZWx5CisgICAgICBhbmQgcmVsYXRpdmVseSBjb21wYXJlZCB0byB0aGUgdG90YWwgZ2FpbiBvdmVyIGFsbCBzdWJiYW5kcy4KKyAgXGxpIEJvb3N0IGdhaW46IENhbGN1bGF0ZSBhbmQgYXBwbHkgYm9vc3QgZmFjdG9yIGZvciBlYWNoIGxpbWl0ZXIgYmFuZAorICAgICAgaW4gb3JkZXIgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGVuZXJneSBsb3NzIGltcG9zZWQgYnkgdGhlIGxpbWl0aW5nLgorICBcbGkgQXBwbHkgZ2FpbnMgYW5kIGFkZCBub2lzZTogVGhlIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgYXJlIGFwcGxpZWQKKyAgICAgIHRvIGFsbCB0aW1lc2xvdHMgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUuIEEgc2hvcnQgRklSLWZpbHRlciAobGVuZ3RoIDQKKyAgICAgIFFNRi10aW1lc2xvdHMpIGNhbiBiZSB1c2VkIHRvIHNtb290aCB0aGUgc3VkZGVuIGNoYW5nZSBhdCB0aGUgZW52ZWxvcGUgYm9yZGVycy4KKyAgICAgIEVhY2ggY29tcGxleCBzdWJiYW5kIHNhbXBsZSBvZiB0aGUgY3VycmVudCB0aW1lc2xvdCBpcyBtdWx0aXBsaWVkIGJ5IHRoZQorICAgICAgc21vb3RoZWQgZ2FpbiwgdGhlbiByYW5kb20gbm9pc2Ugd2l0aCB0aGUgY2FsY3VsYXRlZCBsZXZlbCBpcyBhZGRlZC4KKworICBcbm90ZQorICBUbyByZWR1Y2UgdGhlIHN0YWNrIHNpemUsIHNvbWUgb2YgdGhlIGxvY2FsIGFycmF5cyBjb3VsZCBiZSBsb2NhdGVkIHdpdGhpbgorICB0aGUgdGltZSBvdXRwdXQgYnVmZmVyLiBPZiB0aGUgNTEyIHNhbXBsZXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIHRoZXJlLAorICBhYm91dCBoYWxmIHRoZSBzaXplIGlzIGFscmVhZHkgdXNlZCBieSAjU0JSX0ZSQU1FX0RBVEEuIEEgcG9pbnRlciB0byB0aGUKKyAgcmVtYWluaW5nIGZyZWUgbWVtb3J5IGNvdWxkIGJlIHN1cHBsaWVkIGJ5IGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQorICBpbiBzYnJfZGVjOgorCisgIFxwYXIKKyAgXGNvZGUKKyAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0UHRyICsgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKS9zaXplb2YoRmxvYXQpICsgMSk7CisgIFxlbmRjb2RlCisKKyAgXHBhcgorICBXaXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgc29tZSBwb2ludGVycyBjb3VsZCBiZSBkZWZpbmVkIGluc3RlYWQgb2YgdGhlIGFycmF5cworICAjbnJnUmVmX20sICNucmdSZWZfZSwgI25yZ0VzdF9tLCAjbnJnRXN0X2UsICNub2lzZUxldmVsX206CisKKyAgXHBhcgorICBcY29kZQorICAgIGZyYWN0KiAgICAgICAgbnJnUmVmX20gPSB0aW1lT3V0UHRyOworICAgIFNDSEFSKiAgICAgICAgbnJnUmVmX2UgPSBucmdSZWZfbSArIE1BWF9GUkVRX0NPRUZGUzsKKyAgICBmcmFjdCogICAgICAgIG5yZ0VzdF9tID0gbnJnUmVmX2UgKyBNQVhfRlJFUV9DT0VGRlM7CisgICAgU0NIQVIqICAgICAgICBucmdFc3RfZSA9IG5yZ0VzdF9tICsgTUFYX0ZSRVFfQ09FRkZTOworICAgIGZyYWN0KiAgICAgICAgbm9pc2VMZXZlbF9tID0gbnJnRXN0X2UgKyBNQVhfRlJFUV9DT0VGRlM7CisgIFxlbmRjb2RlCisKKyAgPGJyPgorKi8KK3ZvaWQKK2NhbGN1bGF0ZVNickVudmVsb3BlIChRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsICAgICAgICAgICAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIC8qITwgSGFuZGxlIHRvIHN0cnVjdCBmaWxsZWQgYnkgdGhlIGNyZWF0ZS1mdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwgICAgICAgICAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsICAgICAgICAgICAgICAgICAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCAgICAgICAgICAgICAgICAgLyohPCBJbWFnIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lRXJyb3JGbGFnCisgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgYywgaSwgaiwgZW52Tm9pc2UgPSAwOworICBVQ0hBUiogICBib3JkZXJzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnM7CisKKyAgRklYUF9TR0wgKm5vaXNlTGV2ZWxzICAgICAgID0gaEZyYW1lRGF0YS0+c2JyTm9pc2VGbG9vckxldmVsOworICBIQU5ETEVfRlJFUV9CQU5EX0RBVEEgaEZyZXEgPSAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YTsKKworICBpbnQgbG93U3ViYmFuZCAgPSBoRnJlcS0+bG93U3ViYmFuZDsKKyAgaW50IGhpZ2hTdWJiYW5kID0gaEZyZXEtPmhpZ2hTdWJiYW5kOworICBpbnQgbm9TdWJiYW5kcyAgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisKKyAgaW50ICAgIG5vTm9pc2VCYW5kcyA9IGhGcmVxLT5uTmZiOworICBpbnQgICAgbm9fY29scyAgICAgID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsKKyAgVUNIQVIgIGZpcnN0X3N0YXJ0ICA9IGJvcmRlcnNbMF0gKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CisKKyAgU0NIQVIgIHNpbmVNYXBwZWRbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgU0NIQVIgIG92X2Fkal9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5vdl9oYl9zY2FsZSk7CisgIFNDSEFSICBhZGpfZSA9IDA7CisgIFNDSEFSICBvdXRwdXRfZTsKKyAgU0NIQVIgIGZpbmFsX2UgPSAwOworCisgIFNDSEFSICBtYXhHYWluTGltaXRfZSA9IChmcmFtZUVycm9yRmxhZykgPyBNQVhfR0FJTl9DT05DRUFMX0VYUCA6IE1BWF9HQUlOX0VYUDsKKworICBpbnQgdXNlQWxpYXNSZWR1Y3Rpb25bNjRdOworICBVQ0hBUiBzbW9vdGhfbGVuZ3RoID0gMDsKKworICBGSVhQX1NHTCAqIHBJZW52ID0gaEZyYW1lRGF0YS0+aUVudmVsb3BlOworCisgIC8qCisgICAgRXh0cmFjdCBzaW5lIGZsYWdzIGZvciBhbGwgUU1GIGJhbmRzCisgICovCisgIG1hcFNpbmVGbGFncyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwKKyAgICAgICAgICAgICAgIGhGcmVxLT5uU2ZiWzFdLAorICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzLAorICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldiwKKyAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52LAorICAgICAgICAgICAgICAgc2luZU1hcHBlZCk7CisKKworICAvKgorICAgIFNjYW4gZm9yIG1heGltdW0gaW4gYnVmZmVyZCBub2lzZSBsZXZlbHMuCisgICAgVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGF0IHdlIGhhZCBzdHJvbmcgbm9pc2UgaW4gdGhlIHByZXZpb3VzIGZyYW1lCisgICAgd2hpY2ggaXMgc21vb3RoZWQgaW50byB0aGUgY3VycmVudCBmcmFtZS4KKyAgICBUaGUgcmVzdWx0aW5nIGV4cG9uZW50IGlzIHVzZWQgYXMgc3RhcnQgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHNlYXJjaAorICAgIGluIHJlZmVyZW5jZSBlbmVyZ2llcworICAqLworICBpZiAoIXVzZUxQKQorICAgIGFkal9lID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBnZXRTY2FsZWZhY3RvcihoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIG5vU3ViYmFuZHMpOworCisgIC8qCisgICAgU2NhbiBmb3IgbWF4aW11bSByZWZlcmVuY2UgZW5lcmd5IHRvIGJlIGFibGUKKyAgICB0byBzZWxlY3QgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBhZGpfZSBhbmQgZmluYWxfZS4KKyAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgeworICAgIElOVCBtYXhTZmJOcmdfZSA9IC1GUkFDVF9CSVRTK05SR19FWFBfT0ZGU0VUOyAvKiBzdGFydCB2YWx1ZSBmb3IgbWF4aW11bSBzZWFyY2ggKi8KKworICAgIC8qIEZldGNoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlOiAqLworICAgIGZvciAoaj1oRnJlcS0+blNmYltoRnJhbWVEYXRhLT5mcmFtZUluZm8uZnJlcVJlc1tpXV07IGohPTA7IGotLSkgeworICAgICAgbWF4U2ZiTnJnX2UgPSBmaXhNYXgobWF4U2ZiTnJnX2UsKElOVCkoKExPTkcpKCpwSWVudisrKSAmIE1BU0tfRSkpOworICAgIH0KKyAgICBtYXhTZmJOcmdfZSAtPSBOUkdfRVhQX09GRlNFVDsKKworICAgIC8qIEVuZXJneSAtPiBtYWduaXR1ZGUgKHNxcnQgaGFsZmVucyBleHBvbmVudCkgKi8KKyAgICBtYXhTZmJOcmdfZSA9IChtYXhTZmJOcmdfZSsxKSA+PiAxOyAgLyogKzEgdG8gZ28gc2FmZSAocm91bmQgdG8gbmV4dCBoaWdoZXIgaW50KSAqLworCisgICAgLyogU29tZSBzYWZldHkgbWFyZ2luIGlzIG5lZWRlZCBmb3IgMiByZWFzb25zOgorICAgICAgIC0gVGhlIHNpZ25hbCBlbmVyZ3kgaXMgbm90IGVxdWFsbHkgc3ByZWFkIG92ZXIgYWxsIHN1YmJhbmQgc2FtcGxlcyBpbgorICAgICAgICAgYSBzcGVjaWZpYyBzZmIgb2YgYW4gZW52ZWxvcGUgKE5yZyBjb3VsZCBiZSB0b28gaGlnaCBieSBhIGZhY3RvciBvZgorICAgICAgICAgZW52V2lkdGggKiBzZmJXaWR0aCkKKyAgICAgICAtIFNtb290aGluZyBjYW4gc21lYXIgaGlnaCBnYWlucyBvZiB0aGUgcHJldmlvdXMgZW52ZWxvcGUgaW50byB0aGUgY3VycmVudAorICAgICovCisgICAgbWF4U2ZiTnJnX2UgKz0gNjsKKworICAgIGlmIChib3JkZXJzW2ldIDwgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cykKKyAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgdGhhdCBiZWxvbmcgdG8gdGhlIG91dHB1dCBmcmFtZSAqLworICAgICAgYWRqX2UgPSAobWF4U2ZiTnJnX2UgPiBhZGpfZSkgPyBtYXhTZmJOcmdfZSA6IGFkal9lOworCisgICAgaWYgKGJvcmRlcnNbaSsxXSA+IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCisgICAgICAvKiBUaGlzIGVudmVsb3BlIGFmZmVjdHMgdGltZXNsb3RzIGFmdGVyIHRoZSBvdXRwdXQgZnJhbWUgKi8KKyAgICAgIGZpbmFsX2UgPSAgKG1heFNmYk5yZ19lID4gZmluYWxfZSkgPyBtYXhTZmJOcmdfZSA6IGZpbmFsX2U7CisKKyAgfQorCisgIC8qCisgICAgQ2FsY3VsYXRlIGFkanVzdG1lbnQgZmFjdG9ycyBhbmQgYXBwbHkgdGhlbSBmb3IgZXZlcnkgZW52ZWxvcGUuCisgICovCisgIHBJZW52ID0gaEZyYW1lRGF0YS0+aUVudmVsb3BlOworCisgIGZvciAoaSA9IDA7IGkgPCBoRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsgaSsrKSB7CisKKyAgICBpbnQgaywgbm9Ob2lzZUZsYWc7CisgICAgU0NIQVIgIG5vaXNlX2UsIGlucHV0X2UgPSBTQ0FMRTJFWFAoc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlKTsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocE5yZ3MsIEVOVl9DQUxDX05SR1MsIDEpOworCisgICAgLyoKKyAgICAgIEhlbHBlciB2YXJpYWJsZXMuCisgICAgKi8KKyAgICBVQ0hBUiBzdGFydF9wb3MgPSBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKiBib3JkZXJzW2ldOyAgLyogU3RhcnQtcG9zaXRpb24gaW4gdGltZSAoc3ViYmFuZCBzYW1wbGUpIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLworICAgIFVDSEFSIHN0b3BfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogYm9yZGVyc1tpKzFdOyAvKiBTdG9wLXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICBVQ0hBUiBmcmVxX3JlcyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldOyAgICAgLyogRnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCisKKworICAgIC8qIEFsd2F5cyBkbyBmdWxseSBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgZW5lcmd5IHRhYmxlLiBUaGlzIHByZXZlbnRzIG5lZ2F0aXZlIGVuZXJnaWVzIGFuZCBleHRyZW1lIGdhaW4gZmFjdG9ycyBpbgorICAgICAgIGNhc2VzIHdoZXJlIHRoZSBudW1iZXIgb2YgbGltaXRlciBiYW5kcyBleGNlZWRzIHRoZSBudW1iZXIgb2Ygc3ViYmFuZHMuIFRoZSBsYXR0ZXIgY2FuIGJlIGNhdXNlZCBieSB1bmRldGVjdGVkIGJpdAorICAgICAgIGVycm9ycyBhbmQgaXMgdGVzdGVkIGJ5IHNvbWUgc3RyZWFtcyBmcm9tIHRoZSBjZXJ0aWZpY2F0aW9uIHNldC4gKi8KKyAgICBGREttZW1jbGVhcihwTnJncywgc2l6ZW9mKEVOVl9DQUxDX05SR1MpKTsKKworICAgIC8qIElmIHRoZSBzdGFydC1wb3Mgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUgZXF1YWxzIHRoZSBzdG9wIHBvcyBvZiB0aGUgY3VycmVudAorICAgICAgIG5vaXNlIGVudmVsb3BlLCBpbmNyZWFzZSB0aGUgcG9pbnRlciAoaS5lLiBjaG9vc2UgdGhlIG5leHQgbm9pc2UtZmxvb3IpLiovCisgICAgaWYgKGJvcmRlcnNbaV0gPT0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNOb2lzZVtlbnZOb2lzZSsxXSl7CisgICAgICBub2lzZUxldmVscyArPSBub05vaXNlQmFuZHM7ICAgLyogVGhlIG5vaXNlIGZsb29yIGRhdGEgaXMgc3RvcmVkIGluIGEgcm93IFtub2lzZUZsb29yMSBub2lzZUZsb29yMi4uLl0uKi8KKyAgICAgIGVudk5vaXNlKys7CisgICAgfQorCisgICAgaWYoaT09aEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgfHwgaT09aF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYpIC8qIGF0dGFjayAqLworICAgIHsKKyAgICAgIG5vTm9pc2VGbGFnID0gMTsKKyAgICAgIGlmICghdXNlTFApCisgICAgICAgIHNtb290aF9sZW5ndGggPSAwOyAgLyogTm8gc21vb3RoaW5nIG9uIGF0dGFja3MhICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgbm9Ob2lzZUZsYWcgPSAwOworICAgICAgaWYgKCF1c2VMUCkKKyAgICAgICAgc21vb3RoX2xlbmd0aCA9ICgxIC0gaEhlYWRlckRhdGEtPmJzX2RhdGEuc21vb3RoaW5nTGVuZ3RoKSA8PCAyOyAgLyogY2FuIGJlY29tZSBlaXRoZXIgMCBvciA0ICovCisgICAgfQorCisKKyAgICAvKgorICAgICAgRW5lcmd5IGVzdGltYXRpb24gaW4gdHJhbnNwb3NlZCBoaWdoYmFuZC4KKyAgICAqLworICAgIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5pbnRlcnBvbEZyZXEpCisgICAgICBjYWxjTnJnUGVyU3ViYmFuZChhbmFseXNCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsIHN0b3BfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0X2UpOworICAgIGVsc2UKKyAgICAgIGNhbGNOcmdQZXJTZmIoYW5hbHlzQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICBoRnJlcS0+blNmYltmcmVxX3Jlc10sCisgICAgICAgICAgICAgICAgICAgIGhGcmVxLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBzdG9wX3BvcywKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKKyAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdCwKKyAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdF9lKTsKKworICAgIC8qCisgICAgICBDYWxjdWxhdGUgc3ViYmFuZCBnYWlucworICAgICovCisgICAgeworICAgICAgVUNIQVIgKiB0YWJsZSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXTsKKyAgICAgIFVDSEFSICogcFVpTm9pc2UgPSAmaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZVsxXTsgLyohIFVwcGVyIGxpbWl0IG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yIGJhbmQuICovCisKKyAgICAgIEZJWFBfU0dMICogcE5vaXNlTGV2ZWxzID0gbm9pc2VMZXZlbHM7CisKKyAgICAgIEZJWFBfREJMIHRtcE5vaXNlID0gRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOworICAgICAgU0NIQVIgICAgdG1wTm9pc2VfZSA9IChVQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKKworICAgICAgaW50IGNjID0gMDsKKyAgICAgIGMgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IGhGcmVxLT5uU2ZiW2ZyZXFfcmVzXTsgaisrKSB7CisKKyAgICAgICAgRklYUF9EQkwgcmVmTnJnICAgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwSWVudikgJiBNQVNLX00pKTsKKyAgICAgICAgU0NIQVIgICAgcmVmTnJnX2UgPSAoU0NIQVIpKChMT05HKSgqcEllbnYpICYgTUFTS19FKSAtIE5SR19FWFBfT0ZGU0VUOworCisgICAgICAgIFVDSEFSIHNpbmVQcmVzZW50RmxhZyA9IDA7CisgICAgICAgIGludCBsaSA9IHRhYmxlW2pdOworICAgICAgICBpbnQgdWkgPSB0YWJsZVtqKzFdOworCisgICAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7CisgICAgICAgICAgc2luZVByZXNlbnRGbGFnIHw9IChpID49IHNpbmVNYXBwZWRbY2NdKTsKKyAgICAgICAgICBjYysrOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKKyAgICAgICAgICBpZiAoayA+PSAqcFVpTm9pc2UpIHsKKyAgICAgICAgICAgIHRtcE5vaXNlID0gRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOworICAgICAgICAgICAgdG1wTm9pc2VfZSA9IChTQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKKworICAgICAgICAgICAgcFVpTm9pc2UrKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBGREtfQVNTRVJUKGsgPj0gbG93U3ViYmFuZCk7CisKKyAgICAgICAgICBpZiAodXNlTFApCisgICAgICAgICAgICB1c2VBbGlhc1JlZHVjdGlvbltrLWxvd1N1YmJhbmRdID0gIXNpbmVQcmVzZW50RmxhZzsKKworICAgICAgICAgIHBOcmdzLT5ucmdTaW5lW2NdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVfZVtjXSA9IDA7CisKKyAgICAgICAgICBjYWxjU3ViYmFuZEdhaW4ocmVmTnJnLCByZWZOcmdfZSwgcE5yZ3MsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE5vaXNlLCB0bXBOb2lzZV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5lUHJlc2VudEZsYWcsIGkgPj0gc2luZU1hcHBlZFtjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcpOworCisgICAgICAgICAgcE5yZ3MtPm5yZ1JlZltjXSAgID0gcmVmTnJnOworICAgICAgICAgIHBOcmdzLT5ucmdSZWZfZVtjXSA9IHJlZk5yZ19lOworCisgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIHBJZW52Kys7CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgIE5vaXNlIGxpbWl0aW5nCisgICAgKi8KKworICAgIGZvciAoYyA9IDA7IGMgPCBoRnJlcS0+bm9MaW1pdGVyQmFuZHM7IGMrKykgeworCisgICAgICBGSVhQX0RCTCBzdW1SZWYsIGJvb3N0R2FpbiwgbWF4R2FpbjsKKyAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIFNDSEFSICAgc3VtUmVmX2UsIGJvb3N0R2Fpbl9lLCBtYXhHYWluX2UsIGFjY3VfZSA9IDA7CisKKyAgICAgIGNhbGNBdmdHYWluKHBOcmdzLAorICAgICAgICAgICAgICAgICAgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY10sIGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MrMV0sCisgICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UsCisgICAgICAgICAgICAgICAgICAmbWF4R2FpbiwgJm1heEdhaW5fZSk7CisKKyAgICAgIC8qIE11bHRpcGx5IG1heEdhaW4gd2l0aCBsaW1pdGVyR2FpbjogKi8KKyAgICAgIG1heEdhaW4gPSBmTXVsdChtYXhHYWluLCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdKTsKKyAgICAgIG1heEdhaW5fZSArPSBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdOworCisgICAgICAvKiBTY2FsZSBtYW50aXNzYSBvZiBNYXhHYWluIGludG8gcmFuZ2UgYmV0d2VlbiAwLjUgYW5kIDE6ICovCisgICAgICBpZiAobWF4R2FpbiA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgbWF4R2Fpbl9lID0gLUZSQUNUX0JJVFM7CisgICAgICBlbHNlIHsKKyAgICAgICAgU0NIQVIgY2hhclRlbXAgPSBDb3VudExlYWRpbmdCaXRzKG1heEdhaW4pOworICAgICAgICBtYXhHYWluX2UgLT0gY2hhclRlbXA7CisgICAgICAgIG1heEdhaW4gIDw8PSAoaW50KWNoYXJUZW1wOworICAgICAgfQorCisgICAgICBpZiAobWF4R2Fpbl9lID49IG1heEdhaW5MaW1pdF9lKSB7IC8qIHVwcGVyIGxpbWl0IChlLmcuIDk2IGRCKSAqLworICAgICAgICBtYXhHYWluID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgICAgICAgIG1heEdhaW5fZSA9IG1heEdhaW5MaW1pdF9lOworICAgICAgfQorCisKKyAgICAgIC8qIEV2ZXJ5IHN1YmJhbmQgZ2FpbiBpcyBjb21wYXJlZCB0byB0aGUgc2NhbGVkICJhdmVyYWdlIGdhaW4iCisgICAgICAgICBhbmQgbGltaXRlZCBpZiBuZWNlc3Nhcnk6ICovCisgICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MrMV07IGsrKykgeworICAgICAgICBpZiAoIChwTnJncy0+bnJnR2Fpbl9lW2tdID4gbWF4R2Fpbl9lKSB8fCAocE5yZ3MtPm5yZ0dhaW5fZVtrXSA9PSBtYXhHYWluX2UgJiYgcE5yZ3MtPm5yZ0dhaW5ba10+bWF4R2FpbikgKSB7CisKKyAgICAgICAgICBGSVhQX0RCTCBub2lzZUFtcDsKKyAgICAgICAgICBTQ0hBUiAgICBub2lzZUFtcF9lOworCisgICAgICAgICAgRkRLX2RpdmlkZV9NYW50RXhwKG1heEdhaW4sIG1heEdhaW5fZSwgcE5yZ3MtPm5yZ0dhaW5ba10sIHBOcmdzLT5ucmdHYWluX2Vba10sICZub2lzZUFtcCwgJm5vaXNlQW1wX2UpOworICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICAgID0gZk11bHQocE5yZ3MtPm5vaXNlTGV2ZWxba10sbm9pc2VBbXApOworICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsX2Vba10gKz0gbm9pc2VBbXBfZTsKKyAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgICAgICA9IG1heEdhaW47CisgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSAgICAgPSBtYXhHYWluX2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogLS0gQm9vc3QgZ2FpbgorICAgICAgICBDYWxjdWxhdGUgYW5kIGFwcGx5IGJvb3N0IGZhY3RvciBmb3IgZWFjaCBsaW1pdGVyIGJhbmQ6CisgICAgICAgIDEuIENoZWNrIGhvdyBtdWNoIGVuZXJneSB3b3VsZCBiZSBwcmVzZW50IHdoZW4gdXNpbmcgdGhlIGxpbWl0ZWQgZ2FpbgorICAgICAgICAyLiBDYWxjdWxhdGUgYm9vc3QgZmFjdG9yIGJ5IGNvbXBhcmlzb24gd2l0aCByZWZlcmVuY2UgZW5lcmd5CisgICAgICAgIDMuIEFwcGx5IGJvb3N0IGZhY3RvciB0byBjb21wZW5zYXRlIGZvciB0aGUgZW5lcmd5IGxvc3MgZHVlIHRvIGxpbWl0aW5nCisgICAgICAqLworICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV07IGsrKykgeworCisgICAgICAgIC8qIDEuYSAgQWRkIGVuZXJneSBvZiBhZGp1c3RlZCBzaWduYWwgKHVzaW5nIHByZWxpbWluYXJ5IGdhaW4pICovCisgICAgICAgIEZJWFBfREJMICB0bXAgICA9IGZNdWx0KHBOcmdzLT5ucmdHYWluW2tdLHBOcmdzLT5ucmdFc3Rba10pOworICAgICAgICBTQ0hBUiAgICAgdG1wX2UgPSBwTnJncy0+bnJnR2Fpbl9lW2tdICsgcE5yZ3MtPm5yZ0VzdF9lW2tdOworICAgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgYWNjdSwgYWNjdV9lLCAmYWNjdSwgJmFjY3VfZSk7CisKKyAgICAgICAgLyogMS5iICBBZGQgc2luZSBlbmVyZ3kgKGlmIHByZXNlbnQpICovCisgICAgICAgIGlmKHBOcmdzLT5ucmdTaW5lW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ucmdTaW5lW2tdLCBwTnJncy0+bnJnU2luZV9lW2tdLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiAxLmMgIEFkZCBub2lzZSBlbmVyZ3kgKGlmIHByZXNlbnQpICovCisgICAgICAgICAgaWYobm9Ob2lzZUZsYWcgPT0gMCkgeworICAgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ub2lzZUxldmVsW2tdLCBwTnJncy0+bm9pc2VMZXZlbF9lW2tdLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogMi5hICBDYWxjdWxhdGUgcmF0aW8gb2Ygd2FudGVkIGVuZXJneSBhbmQgYWNjdW11bGF0ZWQgZW5lcmd5ICovCisgICAgICBpZiAoYWNjdSA9PSAoRklYUF9EQkwpMCkgeyAvKiBJZiBkaXZpc29yIGlzIDAsIGxpbWl0IHF1b3RpZW50IHRvICs0IGRCICovCisgICAgICAgIGJvb3N0R2FpbiA9IEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNmYpOworICAgICAgICBib29zdEdhaW5fZSA9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBJTlQgZGl2X2U7CisgICAgICAgIGJvb3N0R2FpbiA9IGZEaXZOb3JtKHN1bVJlZiwgYWNjdSwgJmRpdl9lKTsKKyAgICAgICAgYm9vc3RHYWluX2UgPSBzdW1SZWZfZSAtIGFjY3VfZSArIGRpdl9lOworICAgICAgfQorCisKKyAgICAgIC8qIDIuYiBSZXN1bHQgdG9vIGhpZ2g/IC0tPiBMaW1pdCB0aGUgYm9vc3QgZmFjdG9yIHRvICs0IGRCICovCisgICAgICBpZigoYm9vc3RHYWluX2UgID4gMykgfHwKKyAgICAgICAgIChib29zdEdhaW5fZSA9PSAyICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNmYpKSB8fAorICAgICAgICAgKGJvb3N0R2Fpbl9lID09IDMgJiYgYm9vc3RHYWluID4gRkwyRlhDT05TVF9EQkwoMC4zMTM5ODU4ZikpICkKKyAgICAgIHsKKyAgICAgICAgYm9vc3RHYWluID0gRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2Zik7CisgICAgICAgIGJvb3N0R2Fpbl9lID0gMjsKKyAgICAgIH0KKyAgICAgIC8qIDMuICBNdWx0aXBseSBhbGwgc2lnbmFsIGNvbXBvbmVudHMgd2l0aCB0aGUgYm9vc3QgZmFjdG9yICovCisgICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MgKyAxXTsgaysrKSB7CisgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5yZ0dhaW5ba10sYm9vc3RHYWluKTsKKyAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSA9IHBOcmdzLT5ucmdHYWluX2Vba10gKyBib29zdEdhaW5fZSArIDE7CisKKyAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gICA9IGZNdWx0RGl2MihwTnJncy0+bnJnU2luZVtrXSxib29zdEdhaW4pOworICAgICAgICBwTnJncy0+bnJnU2luZV9lW2tdID0gcE5yZ3MtPm5yZ1NpbmVfZVtrXSArIGJvb3N0R2Fpbl9lICsgMTsKKworICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgID0gZk11bHREaXYyKHBOcmdzLT5ub2lzZUxldmVsW2tdLGJvb3N0R2Fpbik7CisgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsX2Vba10gPSBwTnJncy0+bm9pc2VMZXZlbF9lW2tdICsgYm9vc3RHYWluX2UgKyAxOworICAgICAgfQorICAgIH0KKyAgICAvKiBFbmQgb2Ygbm9pc2UgbGltaXRpbmcgKi8KKworICAgIGlmICh1c2VMUCkKKyAgICAgIGFsaWFzaW5nUmVkdWN0aW9uKGRlZ3JlZUFsaWFzK2xvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUFsaWFzUmVkdWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyk7CisKKyAgICAvKiBGb3IgdGhlIHRpbWVzbG90cyB3aXRoaW4gdGhlIHJhbmdlIGZvciB0aGUgb3V0cHV0IGZyYW1lLAorICAgICAgIHVzZSB0aGUgc2FtZSBzY2FsZSBmb3IgdGhlIG5vaXNlIGxldmVscy4KKyAgICAgICBEcmF3YmFjazogSWYgdGhlIGVudmVsb3BlIGV4Y2VlZHMgdGhlIGZyYW1lIGJvcmRlciwgdGhlIG5vaXNlIGxldmVscworICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgdG8gYmUgcmVzY2FsZWQgbGF0ZXIgdG8gZml0IGZpbmFsX2Ugb2YKKyAgICAgICAgICAgICAgICAgdGhlIGdhaW4tdmFsdWVzLgorICAgICovCisgICAgbm9pc2VfZSA9IChzdGFydF9wb3MgPCBub19jb2xzKSA/IGFkal9lIDogZmluYWxfZTsKKworICAgIC8qCisgICAgICBDb252ZXJ0IGVuZXJnaWVzIHRvIGFtcGxpdHVkZSBsZXZlbHMKKyAgICAqLworICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5yZ1NpbmVba10sICAgICZwTnJncy0+bnJnU2luZV9lW2tdLCAgICAmbm9pc2VfZSk7CisgICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bnJnR2FpbltrXSwgICAgJnBOcmdzLT5ucmdHYWluX2Vba10sICAgICZwTnJncy0+bnJnR2Fpbl9lW2tdKTsKKyAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ub2lzZUxldmVsW2tdLCAmcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSwgJm5vaXNlX2UpOworICAgIH0KKworCisKKyAgICAvKgorICAgICAgQXBwbHkgY2FsY3VsYXRlZCBnYWlucyBhbmQgYWRhcHRpdmUgbm9pc2UKKyAgICAqLworCisgICAgLyogYXNzZW1ibGVIZlNpZ25hbHMoKSAqLworICAgIHsKKyAgICAgIGludCBzY2FsZV9jaGFuZ2UsIHNjX2NoYW5nZTsKKyAgICAgIEZJWFBfU0dMIHNtb290aF9yYXRpbzsKKyAgICAgIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdD0wOworCisgICAgICAvKiBJbml0aWFsaXplIHNtb290aGluZyBidWZmZXJzIHdpdGggdGhlIGZpcnN0IHZhbGlkIHZhbHVlcyAqLworICAgICAgaWYgKGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXApCisgICAgICB7CisgICAgICAgIGlmICghdXNlTFApIHsKKyAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IG5vaXNlX2U7CisKKyAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lLCAgICBwTnJncy0+bnJnR2Fpbl9lLCAgbm9TdWJiYW5kcypzaXplb2YoU0NIQVIpKTsKKyAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgICAgICBwTnJncy0+bnJnR2FpbiwgICAgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgICB9CisgICAgICAgIGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXAgPSAwOworICAgICAgfQorCisgICAgICBpZiAoIXVzZUxQKSB7CisKKyAgICAgICAgZXF1YWxpemVGaWx0QnVmZmVyRXhwKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsICAgIC8qIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAvKiBidWZmZXJlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW4sICAgICAgICAgICAgICAgLyogY3VycmVudCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2UsICAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzKTsKKworICAgICAgICAvKiBBZGFwdCBleHBvbmVudCBvZiBidWZmZXJlZCBub2lzZSBsZXZlbHMgdG8gdGhlIGN1cnJlbnQgZXhwb25lbnQKKyAgICAgICAgICAgc28gdGhleSBjYW4gZWFzaWx5IGJlIHNtb290aGVkICovCisgICAgICAgIGlmKChoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpPj0wKSB7CisgICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsKGludCkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSk7CisgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKQorICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdIDw8PSBzaGlmdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpbnQgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwtKGludCkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSk7CisgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKQorICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdID4+PSBzaGlmdDsKKyAgICAgICAgfQorCisgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0gbm9pc2VfZTsKKyAgICAgIH0KKworICAgICAgLyogZmluZCBiZXN0IHNjYWxpbmchICovCisgICAgICBzY2FsZV9jaGFuZ2UgPSAtKERGUkFDVF9CSVRTLTEpOworICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7CisgICAgICAgICAgc2NhbGVfY2hhbmdlID0gZml4TWF4KHNjYWxlX2NoYW5nZSwoaW50KXBOcmdzLT5ucmdHYWluX2Vba10pOworICAgICAgfQorICAgICAgc2NfY2hhbmdlID0gKHN0YXJ0X3Bvczxub19jb2xzKT8gYWRqX2UgLSBpbnB1dF9lIDogZmluYWxfZSAtIGlucHV0X2U7CisKKyAgICAgIGlmICgoc2NhbGVfY2hhbmdlLXNjX2NoYW5nZSsxKTwwKQorICAgICAgICAgIHNjYWxlX2NoYW5nZS09KHNjYWxlX2NoYW5nZS1zY19jaGFuZ2UrMSk7CisKKyAgICAgIHNjYWxlX2NoYW5nZSA9IChzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKSsxOworCisgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKKyAgICAgICAgICBpbnQgc2MgPSBzY2FsZV9jaGFuZ2UtcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIChzY19jaGFuZ2UtMSk7CisgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gID4+PSBzYzsKKyAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IHNjOworICAgICAgfQorCisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgeworICAgICAgICAgIGludCBzYyA9IHNjYWxlX2NoYW5nZS1oX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2Vba10gKyAoc2NfY2hhbmdlLTEpOworICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IHNjOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaiA9IHN0YXJ0X3BvczsgaiA8IHN0b3BfcG9zOyBqKyspCisgICAgICB7CisgICAgICAgIC8qIFRoaXMgdGltZXNsb3QgaXMgbG9jYXRlZCB3aXRoaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHByb2Nlc3NpbmcgYnVmZmVyCisgICAgICAgICAgIGFuZCB3aWxsIGJlIGZlZCBpbnRvIHRoZSBRTUYtc3ludGhlc2lzIGZvciB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgICAgICAgICAgIGFkal9lIC0gaW5wdXRfZQorICAgICAgICAgICBUaGlzIHRpbWVzbG90IHdpbGwgbm90IHlldCBiZSBmZWQgaW50byB0aGUgUU1GIHNvIHdlIGRvIG5vdCBjYXJlCisgICAgICAgICAgIGFib3V0IHRoZSBhZGpfZS4KKyAgICAgICAgICAgICAgIHNjX2NoYW5nZSA9IGZpbmFsX2UgLSBpbnB1dF9lCisgICAgICAgICovCisgICAgICAgIGlmICggKGo9PW5vX2NvbHMpICYmIChzdGFydF9wb3M8bm9fY29scykgKQorICAgICAgICB7CisgICAgICAgICAgaW50IHNoaWZ0ID0gKGludCkgKG5vaXNlX2UgLSBmaW5hbF9lKTsKKyAgICAgICAgICBpZiAoIXVzZUxQKQorICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPSBzaGlmdDsgICAgICAgICAgICAgICAvKiBzaGlmdGluZyBvZiBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gd2lsbCBiZSBhcHBsaWVkIGluIGZ1bmN0aW9uIGFkanVzdFRpbWVTbG90SFEoKSAqLworICAgICAgICAgIGlmIChzaGlmdD49MCkgeworICAgICAgICAgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSxzaGlmdCk7CisgICAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPDw9IHNoaWZ0OworICAgICAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgPDw9IHNoaWZ0OworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICBpZiAoIXVzZUxQKQorICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSAgPDw9IHNoaWZ0OworICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLXNoaWZ0KTsKKyAgICAgICAgICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICAgICAgICBwTnJncy0+bnJnU2luZVtrXSA+Pj0gc2hpZnQ7CisgICAgICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICA+Pj0gc2hpZnQ7CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIGlmICghdXNlTFApCisgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdICA+Pj0gc2hpZnQ7CisgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogdXBkYXRlIG5vaXNlIHNjYWxpbmcgKi8KKyAgICAgICAgICBub2lzZV9lID0gZmluYWxfZTsKKyAgICAgICAgICBpZiAoIXVzZUxQKQorICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSBub2lzZV9lOyAgLyogc2NhbGluZyB2YWx1ZSB1bnVzZWQhICovCisKKyAgICAgICAgICAvKiB1cGRhdGUgZ2FpbiBidWZmZXIqLworICAgICAgICAgIHNjX2NoYW5nZSAtPSAoZmluYWxfZSAtIGlucHV0X2UpOworCisgICAgICAgICAgaWYgKHNjX2NoYW5nZTwwKSB7CisgICAgICAgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKKyAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgPj49IC1zY19jaGFuZ2U7CisgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSArPSAtc2NfY2hhbmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1c2VMUCkgeworICAgICAgICAgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcltrXSA+Pj0gLXNjX2NoYW5nZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY2FsZV9jaGFuZ2UrPXNjX2NoYW5nZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSAvLyBpZgorCisgICAgICAgIGlmICghdXNlTFApIHsKKworICAgICAgICAgIC8qIFByZXZlbnQgdGhlIHNtb290aGluZyBmaWx0ZXIgZnJvbSBydW5uaW5nIG9uIGNvbnN0YW50IGxldmVscyAqLworICAgICAgICAgIGlmIChqLXN0YXJ0X3BvcyA8IHNtb290aF9sZW5ndGgpCisgICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGREtfc2JyRGVjb2Rlcl9zYnJfc21vb3RoRmlsdGVyW2otc3RhcnRfcG9zXTsKKworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNtb290aF9yYXRpbyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworCisgICAgICAgICAgYWRqdXN0VGltZVNsb3RIUSgmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmFseXNCdWZmZXJJbWFnW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkpOworICAgICAgICB9CisgICAgICB9IC8vIGZvcgorCisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIC8qIFVwZGF0ZSB0aW1lLXNtb290aGluZy1idWZmZXJzIGZvciBnYWlucyBhbmQgbm9pc2UgbGV2ZWxzCisgICAgICAgICAgIFRoZSBnYWlucyBhbmQgdGhlIG5vaXNlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBhcmUgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgVGhpcyBoYXMgdG8gYmUgZG9uZSBhdCB0aGUgZW5kIG9mIGVhY2ggZW52ZWxvcGUgYXMgdGhlIHZhbHVlcyBhcmUgcmVxdWlyZWQgZm9yCisgICAgICAgICAgIGEgc21vb3RoIHRyYW5zaXRpb24gdG8gdGhlIG5leHQgZW52ZWxvcGUuICovCisgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAgIHBOcmdzLT5ucmdHYWluLCAgICBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lLCAgICBwTnJncy0+bnJnR2Fpbl9lLCAgbm9TdWJiYW5kcypzaXplb2YoU0NIQVIpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgcE5yZ3MtPm5vaXNlTGV2ZWwsIG5vU3ViYmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisKKyAgICB9CisgICAgQ19BTExPQ19TQ1JBVENIX0VORChwTnJncywgRU5WX0NBTENfTlJHUywgMSk7CisgIH0KKworICAvKiBSZXNjYWxlIG91dHB1dCBzYW1wbGVzICovCisgIHsKKyAgICBGSVhQX0RCTCBtYXhWYWw7CisgICAgaW50IG92X3Jlc2VydmUsIHJlc2VydmU7CisKKyAgICAvKiBEZXRlcm1pbmUgaGVhZHJvb20gaW4gb2xkIGFkanVzdGVkIHNhbXBsZXMgKi8KKyAgICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBhbmFseXNCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCk7CisKKyAgICBvdl9yZXNlcnZlID0gZk5vcm0obWF4VmFsKTsKKworICAgIC8qIERldGVybWluZSBoZWFkcm9vbSBpbiBuZXcgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIGFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY29scyk7CisKKyAgICByZXNlcnZlID0gZk5vcm0obWF4VmFsKTsKKworICAgIC8qIERldGVybWluZSBjb21tb24gb3V0cHV0IGV4cG9uZW50ICovCisgICAgaWYgKG92X2Fkal9lIC0gb3ZfcmVzZXJ2ZSAgPiAgYWRqX2UgLSByZXNlcnZlICkgLyogc2V0IG91dHB1dF9lIHRvIHRoZSBtYXhpbXVtICovCisgICAgICBvdXRwdXRfZSA9IG92X2Fkal9lIC0gb3ZfcmVzZXJ2ZTsKKyAgICBlbHNlCisgICAgICBvdXRwdXRfZSA9IGFkal9lIC0gcmVzZXJ2ZTsKKworICAgIC8qIFJlc2NhbGUgb2xkIHNhbXBsZXMgKi8KKyAgICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIGFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZpcnN0X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfYWRqX2UgLSBvdXRwdXRfZSk7CisKKyAgICAvKiBSZXNjYWxlIG5ldyBzYW1wbGVzICovCisgICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBhbmFseXNCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCwgbm9fY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkal9lIC0gb3V0cHV0X2UpOworICB9CisKKyAgLyogVXBkYXRlIGhiX3NjYWxlICovCisgIHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSA9IEVYUDJTQ0FMRShvdXRwdXRfZSk7CisKKyAgLyogU2F2ZSB0aGUgY3VycmVudCBmaW5hbCBleHBvbmVudCBmb3IgdGhlIG5leHQgZnJhbWU6ICovCisgIHNiclNjYWxlRmFjdG9yLT5vdl9oYl9zY2FsZSA9IEVYUDJTQ0FMRShmaW5hbF9lKTsKKworCisgIC8qIFdlIG5lZWQgdG8gcmVtZWJlciB0byB0aGUgbmV4dCBmcmFtZSB0aGF0IHRoZSB0cmFuc2llbnQKKyAgICAgd2lsbCBvY2N1ciBpbiB0aGUgZmlyc3QgZW52ZWxvcGUgKGlmIHRyYW5FbnYgPT0gbkVudmVsb3BlcykuICovCisgIGlmKGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52ID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzKQorICAgIGhfc2JyX2NhbF9lbnYtPnByZXZUcmFuRW52ID0gMDsKKyAgZWxzZQorICAgIGhfc2JyX2NhbF9lbnYtPnByZXZUcmFuRW52ID0gLTE7CisKK30KKworCisvKiEKKyAgXGJyaWVmICAgQ3JlYXRlIGVudmVsb3BlIGluc3RhbmNlCisKKyAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZSB1c2VkLgorCisgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLworU0JSX0VSUk9SCitjcmVhdGVTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzLCAgIC8qITwgcG9pbnRlciB0byBlbnZlbG9wZSBpbnN0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IHN0YXRpYyBTQlIgY29udHJvbCBkYXRhLCBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHRzICovCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBmb3Igd2hpY2ggdG8gYXNzaWduIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKK3sKKyAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKKyAgaW50IGk7CisKKyAgLyogQ2xlYXIgcHJldmlvdXMgbWlzc2luZyBoYXJtb25pY3MgZmxhZ3MgKi8KKyAgZm9yIChpPTA7IGk8KE1BWF9GUkVRX0NPRUZGUysxNSk+PjQ7IGkrKykgeworICAgIGhzLT5oYXJtRmxhZ3NQcmV2W2ldID0gMDsKKyAgfQorICBocy0+aGFybUluZGV4ID0gMDsKKworICAvKgorICAgIFNldHVwIHBvaW50ZXJzIGZvciB0aW1lIHNtb290aGluZy4KKyAgICBUaGUgYnVmZmVyIGl0c2VsZiB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyIHRyaWdnZXJlZCBieSB0aGUgc3RhcnRVcC1mbGFnLgorICAqLworICBocy0+cHJldlRyYW5FbnYgPSAtMTsKKworCisgIC8qIGluaXRpYWxpemF0aW9uICovCisgIHJlc2V0U2JyRW52ZWxvcGVDYWxjKGhzKTsKKworICBpZiAoY2hhbj09MCkgeyAvKiBkbyB0aGlzIG9ubHkgb25jZSAqLworICAgIGVyciA9IHJlc2V0RnJlcUJhbmRUYWJsZXMoaEhlYWRlckRhdGEsIGZsYWdzKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIQorICBcYnJpZWYgICBDcmVhdGUgZW52ZWxvcGUgaW5zdGFuY2UKKworICBNdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYmVmb3JlIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgY2FuIGJlIHVzZWQuCisKKyAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQKK2RlbGV0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaHMpCit7CisgIHJldHVybiAwOworfQorCisKKy8qIQorICBcYnJpZWYgICBSZXNldCBlbnZlbG9wZSBpbnN0YW5jZQorCisgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZm9yIGVhY2ggY2hhbm5lbCBvbiBhIGNoYW5nZSBvZiBjb25maWd1cmF0aW9uLgorICBOb3RlIHRoYXQgcmVzZXRGcmVxQmFuZFRhYmxlcyBzaG91bGQgYWxzbyBiZSBjYWxsZWQgaW4gdGhpcyBjYXNlLgorCisgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLwordm9pZAorcmVzZXRTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhDYWxFbnYpIC8qITwgcG9pbnRlciB0byBlbnZlbG9wZSBpbnN0YW5jZSAqLworeworICBoQ2FsRW52LT5waGFzZUluZGV4ID0gMDsKKworICAvKiBOb2lzZSBleHBvbmVudCBuZWVkcyB0byBiZSByZXNldCBiZWNhdXNlIHRoZSBvdXRwdXQgZXhwb25lbnQgZm9yIHRoZSBuZXh0IGZyYW1lIGRlcGVuZHMgb24gaXQgKi8KKyAgaENhbEVudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSAwOworCisgIGhDYWxFbnYtPnN0YXJ0VXAgPSAxOworfQorCisKKy8qIQorICBcYnJpZWYgIEVxdWFsaXplIGV4cG9uZW50cyBvZiB0aGUgYnVmZmVyZWQgZ2FpbiB2YWx1ZXMgYW5kIHRoZSBuZXcgb25lcworCisgIEFmdGVyIGVxdWFsaXphdGlvbiBvZiBleHBvbmVudHMsIHRoZSBGSVItZmlsdGVyIGFkZGl0aW9uIGZvciBzbW9vdGhpbmcKKyAgY2FuIGJlIHBlcmZvcm1lZC4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBlbnZlbG9wZSBiZWZvcmUgYWRqdXN0aW5nLgorKi8KKy8qc3RhdGljKi8gdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsICAgICAvKiE8IGJ1ZmZlcmQgZ2FpbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqZmlsdEJ1ZmZlcl9lLCAgIC8qITwgZXhwb25lbnRzIG9mIGJ1ZmZlcmQgZ2FpbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnR2FpbiwgICAgICAgIC8qITwgZ2FpbnMgZm9yIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnR2Fpbl9lLCAgICAgIC8qITwgZXhwb25lbnRzIG9mIGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN1YmJhbmRzKSAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KK3sKKyAgaW50ICAgYmFuZDsKKyAgaW50ICBkaWZmOworCisgIGZvciAoYmFuZD0wOyBiYW5kPHN1YmJhbmRzOyBiYW5kKyspeworICAgIGRpZmYgPSAoaW50KSAobnJnR2Fpbl9lW2JhbmRdIC0gZmlsdEJ1ZmZlcl9lW2JhbmRdKTsKKyAgICBpZiAoZGlmZj4wKSB7CisgICAgICBmaWx0QnVmZmVyW2JhbmRdID4+PSBkaWZmOyAgIC8qIENvbXBlbnNhdGUgZm9yIHRoZSBzY2FsZSBjaGFuZ2UgYnkgc2hpZnRpbmcgdGhlIG1hbnRpc3NhLiAqLworICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdICs9IGRpZmY7ICAvKiBOZXcgZ2FpbiBpcyBiaWdnZXIsIHVzZSBpdHMgZXhwb25lbnQgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZGlmZjwwKSB7CisgICAgICAvKiBUaGUgYnVmZmVyZWQgZ2FpbnMgc2VlbSB0byBiZSBsYXJnZXIsIGJ1dCBtYXliZSB0aGVyZQorICAgICAgICAgYXJlIHNvbWUgdW51c2VkIGJpdHMgbGVmdCBpbiB0aGUgbWFudGlzc2EgKi8KKworICAgICAgaW50IHJlc2VydmUgPSBDbnRMZWFkaW5nWmVyb3MoZml4cF9hYnMoZmlsdEJ1ZmZlcltiYW5kXSkpLTE7CisKKyAgICAgIGlmICgoLWRpZmYpIDw9IHJlc2VydmUpIHsKKyAgICAgICAgLyogVGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBidWZmZXJlZCBtYW50aXNzYSBzbworICAgICAgICAgICB0aGF0IHdlIGNhbiB0YWtlIHRoZSBuZXcgZXhwb25lbnQgYXMgY29tbW9uLgorICAgICAgICAqLworICAgICAgICBmaWx0QnVmZmVyW2JhbmRdIDw8PSAoLWRpZmYpOworICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgIC8qIGJlY29tZXMgZXF1YWwgdG8gKnB0ck5ld0V4cCAqLworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPDw9IHJlc2VydmU7ICAgLyogU2hpZnQgdGhlIG1hbnRpc3NhIGFzIGZhciBhcyBwb3NzaWJsZTogKi8KKyAgICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdIC09IHJlc2VydmU7ICAvKiBDb21wZW5zYXRlIGluIHRoZSBleHBvbmVudDogKi8KKworICAgICAgICAvKiBGb3IgdGhlIHJlbWFpbmluZyBkaWZmZXJlbmNlLCBjaGFuZ2UgdGhlIG5ldyBnYWluIHZhbHVlICovCisgICAgICAgIGRpZmYgPSBmaXhNaW4oLShyZXNlcnZlICsgZGlmZiksREZSQUNUX0JJVFMtMSk7CisgICAgICAgIG5yZ0dhaW5bYmFuZF0gPj49IGRpZmY7CisgICAgICAgIG5yZ0dhaW5fZVtiYW5kXSArPSBkaWZmOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiEKKyAgXGJyaWVmICBTaGlmdCBsZWZ0IHRoZSBtYW50aXNzYXMgb2YgYWxsIHN1YmJhbmQgc2FtcGxlcworICAgICAgICAgIGluIHRoZSBnaXZlbnRpbWUgYW5kIGZyZXF1ZW5jeSByYW5nZSBieSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLgorCisgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNjYWxlIHRoZSBhdWRpbyBkYXRhIGluIHRoZSBvdmVybGFwIGJ1ZmZlcgorICB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGVudmVsb3BlIGFkanVzdGVkIHdpdGggdGhlIGxhc3QgZnJhbWUuCisqLwordm9pZCByZXNjYWxlU3ViYmFuZFNhbXBsZXMoRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLCAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCAgIC8qITwgQmVnaW4gb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwgIC8qITwgRW5kIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcG9zLCAgICAvKiE8IEJlZ2luIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfcG9zLCAgICAgLyohPCBFbmQgb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQpICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0ICovCit7CisgIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kLWxvd1N1YmJhbmQ7CisKKyAgaWYgKCAod2lkdGggPiAwKSAmJiAoc2hpZnQhPTApICkgeworICAgIGlmIChpbSE9TlVMTCkgeworICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgeworICAgICAgICAgIHNjYWxlVmFsdWVzKCZyZVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKKyAgICAgICAgICBzY2FsZVZhbHVlcygmaW1bbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgeworICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgeworICAgICAgICAgIHNjYWxlVmFsdWVzKCZyZVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICAgRGV0ZXJtaW5lIGhlYWRyb29tIGZvciBzaGlmdGluZworCisgIERldGVybWluZSBieSBob3cgbXVjaCB0aGUgc3BlY3RydW0gY2FuIGJlIHNoaWZ0ZWQgbGVmdAorICBmb3IgYmV0dGVyIGFjY3VyYWN5IGluIGxhdGVyIHByb2Nlc3NpbmcuCisKKyAgXHJldHVybiAgTnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYmlnZ2VzdCBzcGVjdHJhbCB2YWx1ZQorKi8KKworRklYUF9EQkwgbWF4U3ViYmFuZFNhbXBsZSggRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93U3ViYmFuZCwgICAvKiE8IEJlZ2luIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaFN1YmJhbmQsICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMgdG8gcHJvY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywgICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X3BvcyAgICAgIC8qITwgRW5kIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKyAgdW5zaWduZWQgaW50IHdpZHRoID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOworCisgIEZES19BU1NFUlQod2lkdGggPD0gKDY0KSk7CisKKyAgaWYgKCB3aWR0aCA+IDAgKSB7CisgICAgaWYgKGltIT1OVUxMKSAKKyAgICB7CisgICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSAKKyAgICAgIHsKKyNpZmRlZiBGVU5DVElPTl9GREtfZ2V0X21heHZhbAorICAgICAgICBtYXhWYWwgPSBGREtfZ2V0X21heHZhbChtYXhWYWwsICZyZVtsXVtsb3dTdWJiYW5kXSwgJmltW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCk7CisjZWxzZQorICAgICAgICBpbnQgaz13aWR0aDsKKyAgICAgICAgRklYUF9EQkwgKnJlVG1wID0gJnJlW2xdW2xvd1N1YmJhbmRdOworICAgICAgICBGSVhQX0RCTCAqaW1UbXAgPSAmaW1bbF1bbG93U3ViYmFuZF07CisgICAgICAgIGRveworICAgICAgICAgIEZJWFBfREJMIHRtcDEgPSAqKHJlVG1wKyspOworICAgICAgICAgIEZJWFBfREJMIHRtcDIgPSAqKGltVG1wKyspOworICAgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXAxKV4oKExPTkcpdG1wMT4+KERGUkFDVF9CSVRTLTEpKSk7CisgICAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKHRtcDIpXigoTE9ORyl0bXAyPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgICAgfSB3aGlsZSgtLWshPTApOworI2VuZGlmCisgICAgICB9CisgICAgfSBlbHNlCisgICAgeworICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgeworICAgICAgICBpbnQgaz13aWR0aDsKKyAgICAgICAgRklYUF9EQkwgKnJlVG1wID0gJnJlW2xdW2xvd1N1YmJhbmRdOworICAgICAgICBkb3sKKyAgICAgICAgICBGSVhQX0RCTCB0bXAgPSAqKHJlVG1wKyspOworICAgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXApXigoTE9ORyl0bXA+PihERlJBQ1RfQklUUy0xKSkpOworICAgICAgICB9d2hpbGUoLS1rIT0wKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4obWF4VmFsKTsKK30KKworI2RlZmluZSBTSElGVF9CRUZPUkVfU1FVQVJFICgzKSAvKiAoNy8yKSAqLworLyohPAorICBJZiB0aGUgYWNjdW11bGF0b3IgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cyBvcgorICBkb2VzIG5vdCBwcm92aWRlIGEgaGlnaCBkeW5hbWljIHJhbmdlLCB0aGUgYmVsb3cgZW5lcmd5IGNhbGN1bGF0aW9uCisgIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgc2hpZnQgb3BlcmF0aW9uIGZvciBlYWNoIHNhbXBsZS4KKyAgT24gdGhlIG90aGVyIGhhbmQsIGRvaW5nIHRoZSBzaGlmdCBhbGxvd3MgdXNpbmcgYSBzaW5nbGUtcHJlY2lzaW9uCisgIG11bHRpcGxpY2F0aW9uIGZvciB0aGUgc3F1YXJlIChhdCBsZWFzdCAxNmJpdCB4IDE2Yml0KS4KKyAgRm9yIGV2ZW4gdmFsdWVzIG9mIE9WUkZMV19CSVRTICgwLCAyLCA0LCA2KSwgc2F0dXJhdGVkIGFyaXRobWV0aWMKKyAgaXMgcmVxdWlyZWQgZm9yIHRoZSBlbmVyZ3kgYWNjdW11bGF0aW9uLgorICBUaGVvcmV0aWNhbGx5LCB0aGUgc2FtcGxlLXNxdWFyZXMgY2FuIHN1bSB1cCB0byBhIHZhbHVlIG9mIDc2LAorICByZXF1aXJpbmcgNyBvdmVyZmxvdyBiaXRzLiBIb3dldmVyIHNpbmNlIHN1Y2ggc2l0dWF0aW9ucyBhcmUgKnZlcnkqCisgIHJhcmUsIGFjY3UgY2FuIGJlIGxpbWl0ZWQgdG8gNjQuCisgIEluIGNhc2UgbmF0aXZlIHNhdHVyYXRlZCBhcml0aG1ldGljIGlzIG5vdCBhdmFpbGFibGUsIG92ZXJmbG93cworICBjYW4gYmUgcHJldmVudGVkIGJ5IHJlcGxhY2luZyB0aGUgYWJvdmUgI2RlZmluZSBieQorICAgICNkZWZpbmUgU0hJRlRfQkVGT1JFX1NRVUFSRSAoKDggLSBPVlJGTFdfQklUUykgLyAyKQorICB3aGljaCB3aWxsIHJlc3VsdCBpbiBzbGlnaHRseSByZWR1Y2VkIGFjY3VyYWN5LgorKi8KKworLyohCisgIFxicmllZiAgRXN0aW1hdGVzIHRoZSBtZWFuIGVuZXJneSBvZiBlYWNoIGZpbHRlci1iYW5rIGNoYW5uZWwgZm9yIHRoZQorICAgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlCisKKyAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gaW50ZXJwb2xGcmVxIGlzIHRydWUuCisqLworLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgLyohPCBCZWdpbiBvZiB0aGUgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGhpZ2hTdWJiYW5kLCAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RhcnRfcG9zLCAgICAgICAgICAgIC8qITwgRmlyc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5leHRfcG9zLCAgICAgICAgICAgICAvKiE8IExhc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSArIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBmcmFtZUV4cCwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LCAgICAgICAgICAgICAgIC8qITwgcmVzdWx0aW5nIEVuZXJneSAoMC4uMSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiByZXN1bHRpbmcgRW5lcmd5ICovCit7CisgIEZJWFBfU0dMIGludldpZHRoOworICBTQ0hBUiAgcHJlU2hpZnQ7CisgIFNDSEFSICBzaGlmdDsKKyAgRklYUF9EQkwgc3VtOworICBpbnQgayxsOworCisgIC8qIERpdmlkZSBieSB3aWR0aCBvZiBlbnZlbG9wZSBsYXRlcjogKi8KKyAgaW52V2lkdGggPSBGWF9EQkwyRlhfU0dMKEdldEludkludChuZXh0X3BvcyAtIHN0YXJ0X3BvcykpOworICAvKiBUaGUgY29tbW9uIGV4cG9uZW50IG5lZWRzIHRvIGJlIGRvdWJsZWQgYmVjYXVzZSBhbGwgbWFudGlzc2FzIGFyZSBzcXVhcmVkOiAqLworICBmcmFtZUV4cCA9IGZyYW1lRXhwIDw8IDE7CisKKyAgZm9yIChrPWxvd1N1YmJhbmQ7IGs8aGlnaFN1YmJhbmQ7IGsrKykgeworICAgIEZJWFBfREJMICBidWZmZXJSZWFsWygoKDEwMjQpLygzMikpKyg2KSldOworICAgIEZJWFBfREJMICBidWZmZXJJbWFnWygoKDEwMjQpLygzMikpKyg2KSldOworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKworICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKQorICAgIHsKKyAgICAgIGZvciAobD1zdGFydF9wb3M7bDxuZXh0X3BvcztsKyspIAorICAgICAgeworICAgICAgICBidWZmZXJJbWFnW2xdID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlckltYWdbbF0pXigoTE9ORylidWZmZXJJbWFnW2xdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgICAgYnVmZmVyUmVhbFtsXSA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba107CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGw9c3RhcnRfcG9zO2w8bmV4dF9wb3M7bCsrKQorICAgICAgeworICAgICAgICBidWZmZXJSZWFsW2xdID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbbF0pXigoTE9ORylidWZmZXJSZWFsW2xdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7CisKKworICAgICAgLyogSWYgdGhlIGFjY3UgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywgd2UgY2Fubm90CisgICAgICAgICBzaGlmdCB0aGUgc2FtcGxlcyB1cCB0byB0aGUgbGltaXQuCisgICAgICAgICBJbnN0ZWFkLCBrZWVwIHVwIHRvIDMgZnJlZSBiaXRzIGluIGVhY2ggc2FtcGxlLCBpLmUuIHVwIHRvCisgICAgICAgICA2IGJpdHMgYWZ0ZXIgY2FsY3VsYXRpb24gb2Ygc3F1YXJlLgorICAgICAgICAgUGxlYXNlIG5vdGUgdGhlIGNvbW1lbnQgb24gc2F0dXJhdGVkIGFyaXRobWV0aWMgYWJvdmUhCisgICAgICAqLworICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgcHJlU2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS0xOworICAgICAgcHJlU2hpZnQgLT0gU0hJRlRfQkVGT1JFX1NRVUFSRTsKKworICAgICAgaWYgKHByZVNoaWZ0Pj0wKSB7CisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7CisgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPDwgKGludClwcmVTaGlmdDsKKyAgICAgICAgICAgIEZJWFBfREJMIHRlbXAyID0gYnVmZmVySW1hZ1tsXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CisgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeyAgICAvKiBpZiBuZWdhdGl2ZSBzaGlmdCB2YWx1ZSAqLworICAgICAgICBpbnQgbmVncHJlU2hpZnQgPSAtcHJlU2hpZnQ7CisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7CisgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKKyAgICAgICAgICAgIEZJWFBfREJMIHRlbXAyID0gYnVmZmVySW1hZ1tsXSA+PiAoaW50KW5lZ3ByZVNoaWZ0OworICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CisgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA+PiAoaW50KW5lZ3ByZVNoaWZ0OworICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFjY3UgPDw9IDE7CisKKyAgICAgIC8qIENvbnZlcnQgZG91YmxlIHByZWNpc2lvbiB0byBNYW50aXNzYS9FeHBvbmVudDogKi8KKyAgICAgIHNoaWZ0ID0gZk5vcm0oYWNjdSk7CisgICAgICBzdW0gPSBhY2N1IDw8IChpbnQpc2hpZnQ7CisKKyAgICAgIC8qIERpdmlkZSBieSB3aWR0aCBvZiBlbnZlbG9wZSBhbmQgYXBwbHkgZnJhbWUgc2NhbGU6ICovCisgICAgICAqbnJnRXN0KysgPSBmTXVsdChzdW0sIGludldpZHRoKTsKKyAgICAgIHNoaWZ0ICs9IDIgKiBwcmVTaGlmdDsKKyAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKQorICAgICAgICAqbnJnRXN0X2UrKyA9IGZyYW1lRXhwIC0gc2hpZnQ7CisgICAgICBlbHNlCisgICAgICAgICpucmdFc3RfZSsrID0gZnJhbWVFeHAgLSBzaGlmdCArIDE7ICAvKiArMSBkdWUgdG8gbWlzc2luZyBpbWFnLiBwYXJ0ICovCisgICAgfSAvKiBtYXhWYWwhPTAgKi8KKyAgICBlbHNlIHsKKworICAgICAgLyogUHJldmVudCBhIHplcm8tbWFudGlzc2EtbnVtYmVyIGZyb20gYmVpbmcgbWlzaW50ZXJwcmV0ZWQKKyAgICAgICAgIGR1ZSB0byBpdHMgZXhwb25lbnQuICovCisgICAgICAqbnJnRXN0KysgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICpucmdFc3RfZSsrID0gMDsKKyAgICB9CisgIH0KK30KKworLyohCisgIFxicmllZiAgIEVzdGltYXRlcyB0aGUgbWVhbiBlbmVyZ3kgb2YgZWFjaCBTY2FsZSBmYWN0b3IgYmFuZCBmb3IgdGhlCisgICAgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlLgorCisgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGludGVycG9sRnJlcSBpcyBmYWxzZS4KKyovCisvKnN0YXRpYyovIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLCAgICAgICAvKiE8IEZpcnN0IFN1YmJhbmQgZm9yIGVhY2ggU2ZiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICAgICAgICAgICAvKiE8IEZpcnN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5leHRfcG9zLCAgICAgICAgICAgIC8qITwgTGFzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICsgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgaW5wdXRfZSwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgICAvKiE8IHJlc3VsdGluZyBFbmVyZ3kgKDAuLjEpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdGluZyBFbmVyZ3kgKi8KK3sKKyAgRklYUF9TR0wgIGludldpZHRoOworICBGSVhQX0RCTCAgdGVtcDsKKyAgU0NIQVIgIHByZVNoaWZ0OworICBTQ0hBUiAgIHNoaWZ0LCBzdW1fZTsKKyAgRklYUF9EQkwgIHN1bTsKKworICBpbnQgaixrLGwsbGksdWk7CisgIEZJWFBfREJMIHN1bUFsbCwgc3VtTGluZTsgLyogU2luZ2xlIHByZWNpc2lvbiB3b3VsZCBiZSBzdWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgb3ZlcmZsb3cgYml0cyBhcmUgcmVxdWlyZWQgZm9yIGFjY3VtdWxhdGlvbiAqLworCisgIC8qIERpdmlkZSBieSB3aWR0aCBvZiBlbnZlbG9wZSBsYXRlcjogKi8KKyAgaW52V2lkdGggPSBGWF9EQkwyRlhfU0dMKEdldEludkludChuZXh0X3BvcyAtIHN0YXJ0X3BvcykpOworICAvKiBUaGUgY29tbW9uIGV4cG9uZW50IG5lZWRzIHRvIGJlIGRvdWJsZWQgYmVjYXVzZSBhbGwgbWFudGlzc2FzIGFyZSBzcXVhcmVkOiAqLworICBpbnB1dF9lID0gaW5wdXRfZSA8PCAxOworCisgIGZvcihqPTA7IGo8blNmYjsgaisrKSB7CisgICAgbGkgPSBmcmVxQmFuZFRhYmxlW2pdOworICAgIHVpID0gZnJlcUJhbmRUYWJsZVtqKzFdOworCisgICAgRklYUF9EQkwgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BvcyApOworCisgICAgaWYgKG1heFZhbCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgeworCisgICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CisKKyAgICAgIC8qIElmIHRoZSBhY2N1IGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG92ZXJmbG93IGJpdHMsIHdlIGNhbm5vdAorICAgICAgICAgc2hpZnQgdGhlIHNhbXBsZXMgdXAgdG8gdGhlIGxpbWl0LgorICAgICAgICAgSW5zdGVhZCwga2VlcCB1cCB0byAzIGZyZWUgYml0cyBpbiBlYWNoIHNhbXBsZSwgaS5lLiB1cCB0bworICAgICAgICAgNiBiaXRzIGFmdGVyIGNhbGN1bGF0aW9uIG9mIHNxdWFyZS4KKyAgICAgICAgIFBsZWFzZSBub3RlIHRoZSBjb21tZW50IG9uIHNhdHVyYXRlZCBhcml0aG1ldGljIGFib3ZlIQorICAgICAgKi8KKyAgICAgIHByZVNoaWZ0IC09IFNISUZUX0JFRk9SRV9TUVVBUkU7CisKKyAgICAgIHN1bUFsbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisKKyAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7CisKKyAgICAgICAgc3VtTGluZSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7CisgICAgICAgICAgaWYgKHByZVNoaWZ0Pj0wKSB7CisgICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKKyAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKKyAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CisgICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlckltYWdbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CisgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocHJlU2hpZnQ+PTApIHsKKyAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgeworICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CisgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKKyAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIG51bWJlciBvZiBRTUYtY2hhbm5lbHMgcGVyIFNCUiBiYW5kcyBtYXkgYmUgdXAgdG8gMTUuCisgICAgICAgICAgIFNoaWZ0IHJpZ2h0IHRvIGF2b2lkIG92ZXJmbG93cyBpbiBzdW0gb3ZlciBhbGwgY2hhbm5lbHMuICovCisgICAgICAgIHN1bUxpbmUgPSBzdW1MaW5lID4+ICg0LTEpOworICAgICAgICBzdW1BbGwgICs9IHN1bUxpbmU7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgZG91YmxlIHByZWNpc2lvbiB0byBNYW50aXNzYS9FeHBvbmVudDogKi8KKyAgICAgIHNoaWZ0ID0gZk5vcm0oc3VtQWxsKTsKKyAgICAgIHN1bSA9IHN1bUFsbCA8PCAoaW50KXNoaWZ0OworCisgICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgZW52ZWxvcGU6ICovCisgICAgICBzdW0gPSBmTXVsdChzdW0saW52V2lkdGgpOworCisgICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgU2ZiOiAqLworICAgICAgc3VtID0gZk11bHQoc3VtLCBGWF9EQkwyRlhfU0dMKEdldEludkludCh1aS1saSkpKTsKKworICAgICAgLyogU2V0IGFsbCBTdWJiYW5kIGVuZXJnaWVzIGluIHRoZSBTZmIgdG8gdGhlIGF2ZXJhZ2UgZW5lcmd5OiAqLworICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCisgICAgICAgIHN1bV9lID0gaW5wdXRfZSArIDQgLSBzaGlmdDsgIC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgc3VtX2UgPSBpbnB1dF9lICsgNCArIDEgLSBzaGlmdDsgIC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQ7ICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KKworICAgICAgc3VtX2UgLT0gMiAqIHByZVNoaWZ0OworICAgIH0gLyogbWF4VmFsIT0wICovCisgICAgZWxzZSB7CisKKyAgICAgIC8qIFByZXZlbnQgYSB6ZXJvLW1hbnRpc3NhLW51bWJlciBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCisgICAgICAgICBkdWUgdG8gaXRzIGV4cG9uZW50LiAqLworICAgICAgc3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBzdW1fZSA9IDA7CisgICAgfQorCisgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspCisgICAgeworICAgICAgKm5yZ0VzdCsrICAgPSBzdW07CisgICAgICAqbnJnRXN0X2UrKyA9IHN1bV9lOworICAgIH0KKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgIENhbGN1bGF0ZSBnYWluLCBub2lzZSwgYW5kIGFkZGl0aW9uYWwgc2luZSBsZXZlbCBmb3Igb25lIHN1YmJhbmQuCisKKyAgVGhlIHJlc3VsdGluZyBlbmVyZ3kgZ2FpbiBpcyBnaXZlbiBieSBtYW50aXNzYSBhbmQgZXhwb25lbnQuCisqLworLypzdGF0aWMqLyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCAgICAgICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBucmdSZWZfZSwgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgICAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICB0bXBOb2lzZV9lLCAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAoZXhwb25lbnQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgIHNpbmVQcmVzZW50RmxhZywgICAvKiE8IEluZGljYXRlcyBpZiBzaW5lIGlzIHByZXNlbnQgb24gYmFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLCAgICAgICAgLyohPCBJbmRpY2F0ZXMgaWYgc2luZSBtdXN0IGJlIGFkZGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnKSAgICAgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KK3sKKyAgRklYUF9EQkwgIG5yZ0VzdCAgICAgICAgICA9IG5yZ3MtPm5yZ0VzdFtpXTsgICAgICAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLworICBTQ0hBUiAgICAgbnJnRXN0X2UgICAgICAgID0gbnJncy0+bnJnRXN0X2VbaV07ICAgICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKnB0ck5yZ0dhaW4gICAgICA9ICZucmdzLT5ucmdHYWluW2ldOyAgICAgICAgICAvKiE8IFJlc3VsdGluZyBlbmVyZ3kgZ2FpbiAqLworICBTQ0hBUiAgICAqcHRyTnJnR2Fpbl9lICAgID0gJm5yZ3MtPm5yZ0dhaW5fZVtpXTsgICAgICAgIC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKnB0ck5vaXNlTGV2ZWwgICA9ICZucmdzLT5ub2lzZUxldmVsW2ldOyAgICAgICAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKi8KKyAgU0NIQVIgICAgKnB0ck5vaXNlTGV2ZWxfZSA9ICZucmdzLT5ub2lzZUxldmVsX2VbaV07ICAgICAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKGV4cG9uZW50KSAqLworICBGSVhQX0RCTCAqcHRyTnJnU2luZSAgICAgID0gJm5yZ3MtPm5yZ1NpbmVbaV07ICAgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAqLworICBTQ0hBUiAgICAqcHRyTnJnU2luZV9lICAgID0gJm5yZ3MtPm5yZ1NpbmVfZVtpXTsgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAoZXhwb25lbnQpICovCisKKyAgRklYUF9EQkwgYSwgYiwgYzsKKyAgU0NIQVIgICAgYV9lLCBiX2UsIGNfZTsKKworICAvKgorICAgICBUaGlzIGFkZGl0aW9uIG9mIDEgcHJldmVudHMgZGl2aXNpb25zIGJ5IHplcm8gaW4gdGhlIHJlZmVyZW5jZSBjb2RlLgorICAgICBGb3IgdmVyeSBzbWFsbCBlbmVyZ2llcyBpbiBucmdFc3QsIGl0IHByZXZlbnRzIHRoZSBnYWlucyBmcm9tIGJlY29taW5nCisgICAgIHZlcnkgaGlnaCB3aGljaCBjb3VsZCBjYXVzZSBzb21lIHRyb3VibGUgZHVlIHRvIHRoZSBzbW9vdGhpbmcuCisgICovCisgIGJfZSA9IChpbnQpKG5yZ0VzdF9lIC0gMSk7CisgIGlmIChiX2U+PTApIHsKKyAgICBucmdFc3QgPSAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gKElOVClmaXhNaW4oYl9lKzEsREZSQUNUX0JJVFMtMSkpICsgKG5yZ0VzdCA+PiAxKTsKKyAgICBucmdFc3RfZSArPSAxOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKworICB9IGVsc2UgeworICAgIG5yZ0VzdCA9IChucmdFc3QgPj4gKElOVCkoZml4TWluKC1iX2UrMSxERlJBQ1RfQklUUy0xKSkpICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOworICAgIG5yZ0VzdF9lID0gMjsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCisgIH0KKworICAvKiAgQSA9IE5yZ1JlZiAqIFRtcE5vaXNlICovCisgIGEgPSBmTXVsdChucmdSZWYsdG1wTm9pc2UpOworICBhX2UgPSBucmdSZWZfZSArIHRtcE5vaXNlX2U7CisKKyAgLyogIEIgPSAxICsgVG1wTm9pc2UgKi8KKyAgYl9lID0gKGludCkodG1wTm9pc2VfZSAtIDEpOworICBpZiAoYl9lPj0wKSB7CisgICAgYiA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UrMSxERlJBQ1RfQklUUy0xKSkgKyAodG1wTm9pc2UgPj4gMSk7CisgICAgYl9lID0gdG1wTm9pc2VfZSArIDE7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9IGVsc2UgeworICAgIGIgPSAodG1wTm9pc2UgPj4gKElOVCkoZml4TWluKC1iX2UrMSxERlJBQ1RfQklUUy0xKSkpICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOworICAgIGJfZSA9IDI7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgLyogIG5vaXNlTGV2ZWwgPSBBIC8gQiA9IChOcmdSZWYgKiBUbXBOb2lzZSkgLyAoMSArIFRtcE5vaXNlKSAqLworICBGREtfZGl2aWRlX01hbnRFeHAoIGEsICBhX2UsCisgICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJOb2lzZUxldmVsLCBwdHJOb2lzZUxldmVsX2UpOworCisgIGlmIChzaW5lUHJlc2VudEZsYWcpIHsKKworICAgIC8qICBDID0gKDEgKyBUbXBOb2lzZSkgKiBOcmdFc3QgKi8KKyAgICBjID0gZk11bHQoYixucmdFc3QpOworICAgIGNfZSA9IGJfZSArIG5yZ0VzdF9lOworCisgICAgLyogIGdhaW4gPSBBIC8gQyA9IChOcmdSZWYgKiBUbXBOb2lzZSkgLyAoMSArIFRtcE5vaXNlKSAqIE5yZ0VzdCAqLworICAgIEZES19kaXZpZGVfTWFudEV4cCggYSwgIGFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMsICBjX2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdHYWluLCBwdHJOcmdHYWluX2UpOworCisgICAgaWYgKHNpbmVNYXBwZWQpIHsKKworICAgICAgLyogIHNpbmVMZXZlbCA9IG5yZ1JlZi8gKDEgKyBUbXBOb2lzZSkgKi8KKyAgICAgIEZES19kaXZpZGVfTWFudEV4cCggbnJnUmVmLCAgbnJnUmVmX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGIsICBiX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ck5yZ1NpbmUsIHB0ck5yZ1NpbmVfZSk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmIChub05vaXNlRmxhZykgeworICAgICAgLyogIEIgPSBOcmdFc3QgKi8KKyAgICAgIGIgPSBucmdFc3Q7CisgICAgICBiX2UgPSBucmdFc3RfZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiAgQiA9IE5yZ0VzdCAqICgxICsgVG1wTm9pc2UpICovCisgICAgICBiID0gZk11bHQoYixucmdFc3QpOworICAgICAgYl9lID0gYl9lICsgbnJnRXN0X2U7CisgICAgfQorCisKKyAgICAvKiAgZ2FpbiA9IG5yZ1JlZiAvIEIgKi8KKyAgICBGREtfZGl2aWRlX01hbnRFeHAoIG5yZ1JlZiwgIG5yZ1JlZl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICBDYWxjdWxhdGUgImF2ZXJhZ2UgZ2FpbiIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViYmFuZCByYW5nZS4KKworICBUaGlzIGlzIHJhdGhlciBhIGdhaW4gb2YgdGhlIGF2ZXJhZ2UgbWFnbml0dWRlIHRoYW4gdGhlIGF2ZXJhZ2UKKyAgb2YgZ2FpbnMhCisgIFRoZSByZXN1bHQgaXMgdXNlZCBhcyBhIHJlbGF0aXZlIGxpbWl0IGZvciBhbGwgZ2FpbnMgd2l0aGluIHRoZQorICBjdXJyZW50ICJsaW1pdGVyIGJhbmQiIChhIGNlcnRhaW4gZnJlcXVlbmN5IHJhbmdlKS4KKyovCisvKnN0YXRpYyovIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBCZWdpbiBvZiB0aGUgbGltaXRlciBiYW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhpZ2hTdWJiYW5kLCAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJTdW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnB0clN1bVJlZl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluLCAgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChtYW50aXNzYSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqcHRyQXZnR2Fpbl9lKSAgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChleHBvbmVudCkgKi8KK3sKKyAgRklYUF9EQkwgICpucmdSZWYgICA9IG5yZ3MtPm5yZ1JlZjsgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCisgIFNDSEFSICAgICAqbnJnUmVmX2UgPSBucmdzLT5ucmdSZWZfZTsgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAoZXhwb25lbnQpICovCisgIEZJWFBfREJMICAqbnJnRXN0ICAgPSBucmdzLT5ucmdFc3Q7ICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsICovCisgIFNDSEFSICAgICAqbnJnRXN0X2UgPSBucmdzLT5ucmdFc3RfZTsgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KKworICBGSVhQX0RCTCBzdW1SZWYgPSAxOworICBGSVhQX0RCTCBzdW1Fc3QgPSAxOworICBTQ0hBUiAgICBzdW1SZWZfZSA9IC1GUkFDVF9CSVRTOworICBTQ0hBUiAgICBzdW1Fc3RfZSA9IC1GUkFDVF9CSVRTOworICBpbnQgICAgICBrOworCisgIGZvciAoaz1sb3dTdWJiYW5kOyBrPGhpZ2hTdWJiYW5kOyBrKyspeworICAgIC8qIEFkZCBucmdSZWZba10gdG8gc3VtUmVmOiAqLworICAgIEZES19hZGRfTWFudEV4cCggc3VtUmVmLCBzdW1SZWZfZSwKKyAgICAgICAgICAgICAgICAgICAgIG5yZ1JlZltrXSwgbnJnUmVmX2Vba10sCisgICAgICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UgKTsKKworICAgIC8qIEFkZCBucmdFc3Rba10gdG8gc3VtRXN0OiAqLworICAgIEZES19hZGRfTWFudEV4cCggc3VtRXN0LCBzdW1Fc3RfZSwKKyAgICAgICAgICAgICAgICAgICAgIG5yZ0VzdFtrXSwgbnJnRXN0X2Vba10sCisgICAgICAgICAgICAgICAgICAgICAmc3VtRXN0LCAmc3VtRXN0X2UgKTsKKyAgfQorCisgIEZES19kaXZpZGVfTWFudEV4cChzdW1SZWYsIHN1bVJlZl9lLAorICAgICAgICAgICAgICAgICAgICAgc3VtRXN0LCBzdW1Fc3RfZSwKKyAgICAgICAgICAgICAgICAgICAgIHB0ckF2Z0dhaW4sIHB0ckF2Z0dhaW5fZSk7CisKKyAgKnB0clN1bVJlZiA9IHN1bVJlZjsKKyAgKnB0clN1bVJlZl9lID0gc3VtUmVmX2U7Cit9CisKKworLyohCisgIFxicmllZiAgIEFtcGxpZnkgb25lIHRpbWVzbG90IG9mIHRoZSBzaWduYWwgd2l0aCB0aGUgY2FsY3VsYXRlZCBnYWlucworICAgICAgICAgICBhbmQgYWRkIHRoZSBub2lzZWZsb29yLgorKi8KKworLypzdGF0aWMqLyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgKnB0clJlYWwsICAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKnB0ckhhcm1JbmRleCwgIC8qITwgSGFybW9uaWMgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzLCAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNjYWxlX2NoYW5nZSwgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcsICAgLyohPCBGbGFnIHRvIHN1cHByZXNzIG5vaXNlIGFkZGl0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICpwdHJQaGFzZUluZGV4LCAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGZDbGRmYikgICAgICAgIC8qITwgQ0xERkIgODAgZmxhZyAqLworeworICBGSVhQX0RCTCAqcEdhaW4gICAgICAgPSBucmdzLT5ucmdHYWluOyAgICAgLyohPCBHYWlucyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpwTm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpwU2luZUxldmVsICA9IG5yZ3MtPm5yZ1NpbmU7ICAgICAvKiE8IFNpbmUgbGV2ZWxzICovCisKKyAgaW50ICAgIGs7CisgIGludCAgICBpbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBVQ0hBUiAgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKKyAgVUNIQVIgIGZyZXFJbnZGbGFnID0gKGxvd1N1YmJhbmQgJiAxKTsKKyAgRklYUF9EQkwgIHNpZ25hbFJlYWwsIHNpbmVMZXZlbCwgc2luZUxldmVsTmV4dCwgc2luZUxldmVsUHJldjsKKyAgaW50ICAgIHRvbmVfY291bnQgPSAwOworICBpbnQgICAgc2luZVNpZ24gPSAxOworCisgICNkZWZpbmUgQzEgICAoKEZJWFBfU0dMKUZMMkZYQ09OU1RfU0dMKDIuZiowLjAwODE1ZikpCisgICNkZWZpbmUgQzFfQ0xERkIgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYqMC4xNjc3M2YpKQorCisgIC8qCisgICAgRmlyc3QgcGFzcyBmb3Igaz0wIHB1bGxlZCBvdXQgb2YgdGhlIGxvb3A6CisgICovCisKKyAgaW5kZXggPSAoaW5kZXggKyAxKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworCisgIC8qCisgICAgVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50CisgICAgb2YgdGhlIHNpZ25hbCBhbmQgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHdpdGggZnVsbCBhY2N1cmFjeQorICAgIChzdXBwbHlpbmcgI0ZSQUNUX0JJVFMgdmFsaWQgYml0cykuCisgICovCisgIHNpZ25hbFJlYWwgICAgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgIHNpbmVMZXZlbCAgICAgPSAqcFNpbmVMZXZlbCsrOworICBzaW5lTGV2ZWxOZXh0ID0gKG5vU3ViYmFuZHMgPiAxKSA/IHBTaW5lTGV2ZWxbMF0gOiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICBpZiAoc2luZUxldmVsIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOworCisgIGVsc2UgaWYgKCFub05vaXNlRmxhZykKKyAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisKKyAgaWYgKGZDbGRmYikgeworCisgICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKKyAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KKyAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKKyAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLworICAgICAgaW50IHNoaWZ0ID0gKGludCkgKHNjYWxlX2NoYW5nZSsxKTsKKyAgICAgIHNoaWZ0ID0gKHNoaWZ0Pj0wKSA/IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KSA6IGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHNoaWZ0KTsKKworICAgICAgRklYUF9EQkwgdG1wMSA9IHNjYWxlVmFsdWUoIGZNdWx0RGl2MihDMV9DTERGQiwgc2luZUxldmVsKSwgLXNoaWZ0ICk7CisKKyAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzFfQ0xERkIsIHNpbmVMZXZlbE5leHQpOworCisKKyAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCisgICAgICBpZiAoICgoaGFybUluZGV4Pj4xKSYweDEpXmZyZXFJbnZGbGFnKSB7CisgICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7CisgICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOworICAgICAgICAgIHNpZ25hbFJlYWwgICArPSB0bXAyOworICAgICAgfQorICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKKyAgICB9CisKKyAgfSBlbHNlCisgIHsKKyAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgeworICAgICAgLyogaGFybUluZGV4IDAsMiAqLworICAgICAgc2lnbmFsUmVhbCArPSAoaGFybUluZGV4JjB4MikgPyAtc2luZUxldmVsIDogc2luZUxldmVsOworICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCisgICAgICBpbnQgc2hpZnQgPSAoaW50KSAoc2NhbGVfY2hhbmdlKzEpOworICAgICAgc2hpZnQgPSAoc2hpZnQ+PTApID8gZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpIDogZml4TWF4KC0oREZSQUNUX0JJVFMtMSksc2hpZnQpOworCisgICAgICBGSVhQX0RCTCB0bXAxID0gKHNoaWZ0Pj0wKSA/ICggZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpID4+IHNoaWZ0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCkgPDwgKC1zaGlmdCkgKTsKKyAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbE5leHQpOworCisKKyAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCisgICAgICBpZiAoICgoaGFybUluZGV4Pj4xKSYweDEpXmZyZXFJbnZGbGFnKSB7CisgICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7CisgICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOworICAgICAgICAgIHNpZ25hbFJlYWwgICArPSB0bXAyOworICAgICAgfQorICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKKyAgICB9CisgIH0KKworICBwTm9pc2VMZXZlbCsrOworCisgIGlmICggbm9TdWJiYW5kcyA+IDIgKSB7CisgICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKKyAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KKyAgICAgIGlmKCFoYXJtSW5kZXgpIAorICAgICAgeworICAgICAgICBzaW5lU2lnbiA9IDA7CisgICAgICB9CisKKyAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgeworICAgICAgICBGSVhQX0RCTCBzaW5lbGV2ZWwgPSAqcFNpbmVMZXZlbCsrOworICAgICAgICBpbmRleCsrOworICAgICAgICBpZiAoKChzaWduYWxSZWFsID0gKHNpbmVTaWduID8gLXNpbmVsZXZlbCA6IHNpbmVsZXZlbCkpID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAgJiYgIW5vTm9pc2VGbGFnKSAKKyAgICAgICAgeworICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCisgICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CisgICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLworICAgICAgICBzaWduYWxSZWFsICs9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKworICAgICAgICBwTm9pc2VMZXZlbCsrOworICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKKyAgICAgIH0gLyogZm9yIC4uLiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLworICAgICAgaWYgKGhhcm1JbmRleD09MSkgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CisKKyAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgeworICAgICAgICBpbmRleCsrOworICAgICAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YgdGhlIHNpZ25hbC4gKi8KKyAgICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKworICAgICAgICBpZiAoKnBTaW5lTGV2ZWwrKyE9RkwyRlhDT05TVF9EQkwoMC4wZikpIHRvbmVfY291bnQrKzsKKyAgICAgICAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKSB7CisgICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKKyAgICAgICAgfQorCisgICAgICAgIHBOb2lzZUxldmVsKys7CisKKyAgICAgICAgaWYgKHRvbmVfY291bnQgPD0gMTYpIHsKKyAgICAgICAgICBGSVhQX0RCTCBhZGRTaW5lID0gZk11bHREaXYyKChwU2luZUxldmVsWy0yXSAtIHBTaW5lTGV2ZWxbMF0pLCBDMSk7CisgICAgICAgICAgc2lnbmFsUmVhbCArPSAoZnJlcUludkZsYWcpID8gKC1hZGRTaW5lKSA6IChhZGRTaW5lKTsKKyAgICAgICAgfQorCisgICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOworICAgICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKKyAgICAgIH0gLyogZm9yIC4uLiAqLworICAgIH0KKyAgfQorCisgIGlmIChub1N1YmJhbmRzID4gLTEpIHsKKyAgICBpbmRleCsrOworICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLworICAgIHNpZ25hbFJlYWwgICAgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICAgIHNpbmVMZXZlbFByZXYgPSBmTXVsdERpdjIocFNpbmVMZXZlbFstMV0sRkwyRlhfU0dMKDAuMDE2M2YpKTsKKyAgICBzaW5lTGV2ZWwgICAgID0gcFNpbmVMZXZlbFswXTsKKworICAgIGlmIChwU2luZUxldmVsWzBdIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOworICAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykgeworICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLworICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgICAgc2lnbmFsUmVhbCA9IHNpZ25hbFJlYWwgKyAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgfQorCisgICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKKyAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KKyAgICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbCArICggKHNpbmVTaWduKSA/IC1zaW5lTGV2ZWwgOiBzaW5lTGV2ZWwpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLworICAgICAgaWYodG9uZV9jb3VudCA8PSAxNil7CisgICAgICAgIGlmIChmcmVxSW52RmxhZykgeworICAgICAgICAgICpwdHJSZWFsKysgICA9IHNpZ25hbFJlYWwgLSBzaW5lTGV2ZWxQcmV2OworICAgICAgICAgIGlmIChub1N1YmJhbmRzICsgbG93U3ViYmFuZCA8IDYzKQorICAgICAgICAgICAgKnB0clJlYWwgPSAqcHRyUmVhbCArIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbCArIHNpbmVMZXZlbFByZXY7CisgICAgICAgICAgaWYgKG5vU3ViYmFuZHMgKyBsb3dTdWJiYW5kIDwgNjMpCisgICAgICAgICAgICAqcHRyUmVhbCA9ICpwdHJSZWFsIC0gZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKKyAgICB9CisgIH0KKyAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CisgICpwdHJQaGFzZUluZGV4ID0gaW5kZXggJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKK30KK3ZvaWQgYWRqdXN0VGltZVNsb3RIUShGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyUmVhbCwgICAgICAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAgICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNjYWxlX2NoYW5nZSwgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIHNtb290aF9yYXRpbywgICAgICAgICAgLyohPCBJbXBhY3Qgb2YgbGFzdCBlbnZlbG9wZSAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCkgIC8qITwgU2hpZnQgZmFjdG9yIG9mIGZpbHRCdWZmZXJOb2lzZSAqLworeworCisgIEZJWFBfREJMICpSRVNUUklDVCBnYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAgICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgICAgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KKworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlciAgICAgID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcjsgICAgICAvKiE8IEdhaW5zIG9mIGxhc3QgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIGZpbHRCdWZmZXJOb2lzZSA9IGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZTsgLyohPCBOb2lzZSBsZXZlbHMgb2YgbGFzdCBlbnZlbG9wZSAqLworICBVQ0hBUiAgICAqUkVTVFJJQ1QgcHRySGFybUluZGV4ICAgID0maF9zYnJfY2FsX2Vudi0+aGFybUluZGV4OyAgICAgICAvKiE8IEhhcm1vbmljIGluZGV4ICovCisgIGludCAgICAgICpSRVNUUklDVCBwdHJQaGFzZUluZGV4ICAgPSZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4OyAgICAgIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLworCisgIGludCAgICBrOworICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzaWduYWxJbWFnOworICBGSVhQX0RCTCBub2lzZVJlYWwsICBub2lzZUltYWc7CisgIEZJWFBfREJMICBzbW9vdGhlZEdhaW4sIHNtb290aGVkTm9pc2U7CisgIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9IC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87CisgIGludCAgICBpbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBVQ0hBUiAgIGhhcm1JbmRleCA9ICpwdHJIYXJtSW5kZXg7CisgIHJlZ2lzdGVyIGludCBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CisgIEZJWFBfREJMIHNpbmVMZXZlbDsKKyAgaW50IHNoaWZ0OworCisgICpwdHJQaGFzZUluZGV4ID0gKGluZGV4K25vU3ViYmFuZHMpICYgKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CisgICpwdHJIYXJtSW5kZXggPSAoaGFybUluZGV4ICsgMSkgJiAzOworCisgIC8qCisgICAgUG9zc2libGUgb3B0aW1pemF0aW9uOgorICAgIHNtb290aF9yYXRpbyBhbmQgaGFybUluZGV4IHN0YXkgY29uc3RhbnQgZHVyaW5nIHRoZSBsb29wLgorICAgIEl0IG1pZ2h0IGJlIGZhc3RlciB0byBpbmNsdWRlIGEgc2VwYXJhdGUgbG9vcCBpbiBlYWNoIHBhdGguCisKKyAgICB0aGUgY2hlY2sgZm9yIHNtb290aF9yYXRpbyBpcyBub3cgb3V0c2lkZSB0aGUgbG9vcCBhbmQgdGhlIHdvcmtsb2FkCisgICAgb2YgdGhlIHdob2xlIGZ1bmN0aW9uIGRlY3JlYXNlZCBieSBhYm91dCAyMCAlCisgICovCisKKyAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgKz0gMTsgICAgICAvKiBkdWUgdG8gbGF0ZXIgdXNlIG9mIGZNdWx0RGl2MiBpbnN0ZWFkIG9mIGZNdWx0ICovCisgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKQorICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKyAgZWxzZQorICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKworICBpZiAoc21vb3RoX3JhdGlvID4gRkwyRlhDT05TVF9TR0woMC4wZikpIHsKKworICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgLyoKKyAgICAgICAgU21vb3RoaW5nOiBUaGUgb2xkIGVudmVsb3BlIGhhcyBiZWVuIGJ1ZmZlcmQgYW5kIGEgY2VydGFpbiByYXRpbworICAgICAgICBvZiB0aGUgb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgaXMgdXNlZC4KKyAgICAgICovCisKKyAgICAgIHNtb290aGVkR2FpbiA9IGZNdWx0KHNtb290aF9yYXRpbyxmaWx0QnVmZmVyW2tdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sZ2FpbltrXSk7CisKKyAgICAgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKSB7CisgICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbyxmaWx0QnVmZmVyTm9pc2Vba10pPj5zaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbyxub2lzZUxldmVsW2tdKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzbW9vdGhlZE5vaXNlID0gKGZNdWx0RGl2MihzbW9vdGhfcmF0aW8sZmlsdEJ1ZmZlck5vaXNlW2tdKTw8c2hpZnQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgIFRoZSBuZXh0IDIgbXVsdGlwbGljYXRpb25zIGNvbnN0aXR1dGUgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50CisgICAgICAgIG9mIHRoZSBzaWduYWwgYW5kIHNob3VsZCBiZSBjYXJyaWVkIG91dCB3aXRoIGZ1bGwgYWNjdXJhY3kKKyAgICAgICAgKHN1cHBseWluZyAjREZSQUNUX0JJVFMgdmFsaWQgYml0cykuCisgICAgICAqLworICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOworICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZyxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOworCisgICAgICBpbmRleCsrOworCisgICAgICBpZiAocFNpbmVMZXZlbFtrXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdOworCisgICAgICAgIHN3aXRjaChoYXJtSW5kZXgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIHNpbmVMZXZlbCk7CisgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCAtIHNpbmVMZXZlbCk7CisgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCk7CisgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnIC0gc2luZUxldmVsKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgc2luZUxldmVsKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKG5vTm9pc2VGbGFnKSB7CisgICAgICAgICAgLyogSnVzdCB0aGUgYW1wbGlmaWVkIHNpZ25hbCBpcyBzYXZlZCAqLworICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCk7CisgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLworICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICAgICAgICAgIG5vaXNlUmVhbCA9IGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBzbW9vdGhlZE5vaXNlKTw8NDsKKyAgICAgICAgICBub2lzZUltYWcgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVsxXSwgc21vb3RoZWROb2lzZSk8PDQ7CisgICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsICsgbm9pc2VSZWFsKTsKKyAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBub2lzZUltYWcpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmcmVxSW52RmxhZyBePSAxOworICAgIH0KKworICB9CisgIGVsc2UgCisgIHsKKyAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIAorICAgIHsKKyAgICAgIHNtb290aGVkR2FpbiAgPSBnYWluW2tdOworICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgc21vb3RoZWRHYWluKSA8PCBzY2FsZV9jaGFuZ2U7CisgICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8IHNjYWxlX2NoYW5nZTsKKworICAgICAgaW5kZXgrKzsKKworICAgICAgaWYgKChzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdKSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgCisgICAgICB7CisgICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSAKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCisgICAgICAgICAgICBzaWduYWxJbWFnIC09IHNpbmVMZXZlbDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIHNpZ25hbFJlYWwgLT0gc2luZUxldmVsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgc2lnbmFsSW1hZyArPSBzaW5lTGV2ZWw7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgCisgICAgICB7CisgICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICAgICAgICBzbW9vdGhlZE5vaXNlID0gbm9pc2VMZXZlbFtrXTsKKyAgICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSk7CisgICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpOworICAgICAgICAgIHNpZ25hbFJlYWwgKz0gbm9pc2VSZWFsPDw0OworICAgICAgICAgIHNpZ25hbEltYWcgKz0gbm9pc2VJbWFnPDw0OworICAgICAgICB9CisgICAgICB9CisgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKKyAgICAgICpwdHJJbWFnKysgPSBzaWduYWxJbWFnOworCisgICAgICBmcmVxSW52RmxhZyBePSAxOworICAgIH0KKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgICBSZXNldCBsaW1pdGVyIGJhbmRzLgorCisgIEJ1aWxkIGZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgZ2FpbiBsaW1pdGVyIGRlcGVuZGVudCBvbgorICB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgdHJhbnNwb3NlciBwYXRjaCBhcmVhcy4KKworICBccmV0dXJuICBTQlJERUNfT0sgaWYgb2ssICBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHIG9uIGVycm9yCisqLworU0JSX0VSUk9SCitSZXNldExpbWl0ZXJCYW5kcyAoIFVDSEFSICpsaW1pdGVyQmFuZFRhYmxlLCAgIC8qITwgUmVzdWx0aW5nIGJhbmQgYm9yZGVycyBpbiBRTUYgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vTGltaXRlckJhbmRzLCAgICAgLyohPCBSZXN1bHRpbmcgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZCAqLworICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAvKiE8IFRhYmxlIHdpdGggcG9zc2libGUgYmFuZCBib3JkZXJzICovCisgICAgICAgICAgICAgICAgICAgIGludCBub0ZyZXFCYW5kcywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gZnJlcUJhbmRUYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgICAgIC8qITwgVHJhbnNwb3NlciBwYXRjaCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAgICAgICAgIGludCBub1BhdGNoZXMsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdHJhbnNwb3NlciBwYXRjaGVzICovCisgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdGVyQmFuZHMpICAgICAgICAgICAgICAgICAgLyohPCBTZWxlY3RlZCAnYmFuZCBkZW5zaXR5JyBmcm9tIGJpdHN0cmVhbSAqLworeworICBpbnQgaSwgaywgaXNQYXRjaEJvcmRlclsyXSwgbG9MaW1JbmRleCwgaGlMaW1JbmRleCwgdGVtcE5vTGltLCBuQmFuZHM7CisgIFVDSEFSIHdvcmtMaW1pdGVyQmFuZFRhYmxlW01BWF9GUkVRX0NPRUZGUyAvIDIgKyBNQVhfTlVNX1BBVENIRVMgKyAxXTsKKyAgaW50IHBhdGNoQm9yZGVyc1tNQVhfTlVNX1BBVENIRVMgKyAxXTsKKyAgaW50IGt4LCBrMjsKKyAgRklYUF9EQkwgdGVtcDsKKworICBpbnQgbG93U3ViYmFuZCA9IGZyZXFCYW5kVGFibGVbMF07CisgIGludCBoaWdoU3ViYmFuZCA9IGZyZXFCYW5kVGFibGVbbm9GcmVxQmFuZHNdOworCisgIC8qIDEgbGltaXRlciBiYW5kLiAqLworICBpZihsaW1pdGVyQmFuZHMgPT0gMCkgeworICAgIGxpbWl0ZXJCYW5kVGFibGVbMF0gPSAwOworICAgIGxpbWl0ZXJCYW5kVGFibGVbMV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisgICAgbkJhbmRzID0gMTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbm9QYXRjaGVzOyBpKyspIHsKKyAgICAgIHBhdGNoQm9yZGVyc1tpXSA9IHBhdGNoUGFyYW1baV0uZ3VhcmRTdGFydEJhbmQgLSBsb3dTdWJiYW5kOworICAgIH0KKyAgICBwYXRjaEJvcmRlcnNbaV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisKKyAgICAvKiAxLjIsIDIsIG9yIDMgbGltaXRlciBiYW5kcy9vY3RhdmUgcGx1cyBiYW5kYm9yZGVycyBhdCBwYXRjaGJvcmRlcnMuICovCisgICAgZm9yIChrID0gMDsgayA8PSBub0ZyZXFCYW5kczsgaysrKSB7CisgICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtrXSA9IGZyZXFCYW5kVGFibGVba10gLSBsb3dTdWJiYW5kOworICAgIH0KKyAgICBmb3IgKGsgPSAxOyBrIDwgbm9QYXRjaGVzOyBrKyspIHsKKyAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW25vRnJlcUJhbmRzICsga10gPSBwYXRjaEJvcmRlcnNba107CisgICAgfQorCisgICAgdGVtcE5vTGltID0gbkJhbmRzID0gbm9GcmVxQmFuZHMgKyBub1BhdGNoZXMgLSAxOworICAgIHNoZWxsc29ydCh3b3JrTGltaXRlckJhbmRUYWJsZSwgdGVtcE5vTGltICsgMSk7CisKKyAgICBsb0xpbUluZGV4ID0gMDsKKyAgICBoaUxpbUluZGV4ID0gMTsKKworCisgICAgd2hpbGUgKGhpTGltSW5kZXggPD0gdGVtcE5vTGltKSB7CisgICAgICBrMiA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdICsgbG93U3ViYmFuZDsKKyAgICAgIGt4ID0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0gKyBsb3dTdWJiYW5kOworCisgICAgICB0ZW1wID0gRlhfU0dMMkZYX0RCTChGREtfZ2V0TnVtT2N0YXZlc0Rpdjgoa3gsazIpKTsgLyogTnVtYmVyIG9mIG9jdGF2ZXMgKi8KKyAgICAgIHRlbXAgPSBmTXVsdCh0ZW1wLCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NFtsaW1pdGVyQmFuZHNdKTsKKworICAgICAgaWYgKHRlbXAgPCBGTDJGWENPTlNUX0RCTCAoMC40OWYpPj41KSB7CisgICAgICAgIGlmICh3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9PSB3b3JrTGltaXRlckJhbmRUYWJsZVtsb0xpbUluZGV4XSkgeworICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CisgICAgICAgICAgbkJhbmRzLS07CisgICAgICAgICAgaGlMaW1JbmRleCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlzUGF0Y2hCb3JkZXJbMF0gPSBpc1BhdGNoQm9yZGVyWzFdID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8PSBub1BhdGNoZXM7IGsrKykgeworICAgICAgICAgIGlmICh3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9PSBwYXRjaEJvcmRlcnNba10pIHsKKyAgICAgICAgICAgIGlzUGF0Y2hCb3JkZXJbMV0gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNQYXRjaEJvcmRlclsxXSkgeworICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CisgICAgICAgICAgbkJhbmRzLS07CisgICAgICAgICAgaGlMaW1JbmRleCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoayA9IDA7IGsgPD0gbm9QYXRjaGVzOyBrKyspIHsKKyAgICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0gPT0gcGF0Y2hCb3JkZXJzW2tdKSB7CisgICAgICAgICAgICBpc1BhdGNoQm9yZGVyWzBdID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzUGF0Y2hCb3JkZXJbMF0pIHsKKyAgICAgICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtsb0xpbUluZGV4XSA9IGhpZ2hTdWJiYW5kOworICAgICAgICAgIG5CYW5kcy0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBsb0xpbUluZGV4ID0gaGlMaW1JbmRleDsKKyAgICAgIGhpTGltSW5kZXgrKzsKKworICAgIH0KKyAgICBzaGVsbHNvcnQod29ya0xpbWl0ZXJCYW5kVGFibGUsIHRlbXBOb0xpbSArIDEpOworCisgICAgLyogVGVzdCBpZiBhbGdvcml0aG0gZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIGxpbWl0ZXJiYW5kcyAqLworICAgIGlmKCBuQmFuZHMgPiBNQVhfTlVNX0xJTUlURVJTIHx8IG5CYW5kcyA8PSAwKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisKKyAgICAvKiBDb3B5IGxpbWl0ZXJiYW5kcyBmcm9tIHdvcmtpbmcgYnVmZmVyIGludG8gZmluYWwgZGVzdGluYXRpb24gKi8KKyAgICBmb3IgKGsgPSAwOyBrIDw9IG5CYW5kczsgaysrKSB7CisgICAgICBsaW1pdGVyQmFuZFRhYmxlW2tdID0gd29ya0xpbWl0ZXJCYW5kVGFibGVba107CisgICAgfQorICB9CisgICpub0xpbWl0ZXJCYW5kcyA9IG5CYW5kczsKKworICByZXR1cm4gU0JSREVDX09LOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5oIGIvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU0MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuaApAQCAtMCwwICsxLDE2NSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIEVudmVsb3BlIGNhbGN1bGF0aW9uIHByb3RvdHlwZXMgIAorKi8KKyNpZm5kZWYgX19FTlZfQ0FMQ19ICisjZGVmaW5lIF9fRU5WX0NBTENfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorI2luY2x1ZGUgImVudl9leHRyLmgiICAvKiBmb3IgSEFORExFX1NCUl9IRUFERVJfREFUQSAqLworI2luY2x1ZGUgInNicl9zY2FsZS5oIgorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMICBmaWx0QnVmZmVyW01BWF9GUkVRX0NPRUZGU107ICAgICAgICAgIC8qITwgcHJldmlvdXMgZ2FpbnMgKHJlcXVpcmVkIGZvciBzbW9vdGhpbmcpICovCisgIEZJWFBfREJMICBmaWx0QnVmZmVyTm9pc2VbTUFYX0ZSRVFfQ09FRkZTXTsgICAgIC8qITwgcHJldmlvdXMgbm9pc2UgbGV2ZWxzIChyZXF1aXJlZCBmb3Igc21vb3RoaW5nKSAqLworICBTQ0hBUiAgICAgZmlsdEJ1ZmZlcl9lW01BWF9GUkVRX0NPRUZGU107ICAgICAgICAvKiE8IEV4cG9uZW50cyBvZiBwcmV2aW91cyBnYWlucyAqLworICBTQ0hBUiAgICAgZmlsdEJ1ZmZlck5vaXNlX2U7ICAgICAgICAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBvZiBwcmV2aW91cyBub2lzZSBsZXZlbHMgKi8KKworICBpbnQgc3RhcnRVcDsgICAgICAgICAgICAgICAvKiE8IGZsYWcgdG8gc2lnbmFsIGluaXRpYWwgY29uZGl0aW9ucyBpbiBidWZmZXJzICovCisgIGludCBwaGFzZUluZGV4OyAgICAgICAgICAgIC8qITwgSW5kZXggZm9yIHJhbmRvbVBhc2UgYXJyYXkgKi8KKyAgaW50IHByZXZUcmFuRW52OyAgICAgICAgICAgLyohPCBUaGUgdHJhbnNpZW50IGVudmVsb3BlIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KKworICBpbnQgaGFybUZsYWdzUHJldlsoTUFYX0ZSRVFfQ09FRkZTKzE1KS8xNl07CisgIC8qITwgV29yZHMgd2l0aCAxNiBmbGFncyBlYWNoIGluZGljYXRpbmcgd2hlcmUgYSBzaW5lIHdhcyBhZGRlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUuKi8KKyAgVUNIQVIgaGFybUluZGV4OyAgICAgICAgICAgIC8qITwgQ3VycmVudCBwaGFzZSBvZiBzeW50aGV0aWMgc2luZSAqLworCit9CitTQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFOworCit0eXBlZGVmIFNCUl9DQUxDVUxBVEVfRU5WRUxPUEUgKkhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFOworCisKKwordm9pZAorY2FsY3VsYXRlU2JyRW52ZWxvcGUgKFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVySW1hZywgICAgICAgICAgICAgICAgIC8qITwgSW1hZyBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZUVycm9yRmxhZworICAgICAgICAgICAgICAgICAgICAgICk7CisKK1NCUl9FUlJPUgorY3JlYXRlU2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoU2JyQ2FsY3VsYXRlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKTsKKworaW50CitkZWxldGVTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhTYnJDYWxjdWxhdGVFbnZlbG9wZSk7CisKK3ZvaWQKK3Jlc2V0U2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoQ2FsRW52KTsKKworU0JSX0VSUk9SCitSZXNldExpbWl0ZXJCYW5kcyAoIFVDSEFSICpsaW1pdGVyQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9MaW1pdGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbm9GcmVxQmFuZHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBBVENIX1BBUkFNICpwYXRjaFBhcmFtLAorICAgICAgICAgICAgICAgICAgICBpbnQgbm9QYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXRlckJhbmRzKTsKKwordm9pZCByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIEZJWFBfREJMICoqIHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCBpbnQgbm9TdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcG9zLCAgaW50IG5leHRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCk7CisKK0ZJWFBfREJMIG1heFN1YmJhbmRTYW1wbGUoIEZJWFBfREJMICoqIGFuYWx5c0J1ZmZlclJlYWxfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGFuYWx5c0J1ZmZlckltYWdfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9wX3Bvcyk7CisKKyNlbmRpZiAvLyBfX0VOVl9DQUxDX0gKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiMmQzYgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwCkBAIC0wLDAgKzEsODUyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgZW52ZWxvcGUgZGVjb2RpbmcgIAorICBUaGlzIG1vZHVsZSBwcm92aWRlcyBlbnZlbG9wZSBkZWNvZGluZyBhbmQgZXJyb3IgY29uY2VhbG1lbnQgYWxnb3JpdGhtcy4gVGhlIG1haW4KKyAgZW50cnkgcG9pbnQgaXMgZGVjb2RlU2JyRGF0YSgpLgorCisgIFxzYSBkZWNvZGVTYnJEYXRhKCksXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKKyovCisKKyNpbmNsdWRlICJlbnZfZGVjLmgiCisKKyNpbmNsdWRlICJlbnZfZXh0ci5oIgorI2luY2x1ZGUgInRyYW5zY2VuZGVudC5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCitzdGF0aWMgdm9pZCBkZWNvZGVFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9vdGhlckNoYW5uZWwpOworc3RhdGljIHZvaWQgc2JyX2VudmVsb3BlX3VubWFwcGluZyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQpOworc3RhdGljIHZvaWQgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW1wUmVzb2x1dGlvbik7CitzdGF0aWMgdm9pZCBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgdm9pZCBkZWNvZGVOb2lzZUZsb29ybGV2ZWxzIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgdm9pZCB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgaW50IGNoZWNrRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CisKKworCisjZGVmaW5lIFNCUl9FTkVSR1lfUEFOX09GRlNFVCAgICgxMiA8PCBFTlZfRVhQX0ZSQUNUKQorI2RlZmluZSBTQlJfTUFYX0VORVJHWSAgICAgICAgICAoMzUgPDwgRU5WX0VYUF9GUkFDVCkKKworI2RlZmluZSBERUNBWSAgICAgICAgICAgICAgICAgICAoIDEgPDwgRU5WX0VYUF9GUkFDVCkKKworI2lmIEVOVl9FWFBfRlJBQ1QKKyNkZWZpbmUgREVDQVlfQ09VUExJTkcgICAgICAgICAgKCAxIDw8IChFTlZfRVhQX0ZSQUNULTEpICkgLyohPCBjb3JyZXNwb25kcyB0byBhIHZhbHVlIG9mIDAuNSAqLworI2Vsc2UKKyNkZWZpbmUgREVDQVlfQ09VUExJTkcgICAgICAgICAgICAxICAvKiE8IElmIHRoZSBlbmVyZ3kgZGF0YSBpcyBub3Qgc2hpZnRlZCwgdXNlIDEgaW5zdGVhZCBvZiAwLjUgKi8KKyNlbmRpZgorCisKKy8qIQorICBcYnJpZWYgIENvbnZlcnQgdGFibGUgaW5kZXgKKyovCitzdGF0aWMgaW50IGluZGV4TG93MkhpZ2goaW50IG9mZnNldCwgLyohPCBtYXBwaW5nIGZhY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgIC8qITwgaW5kZXggdG8gc2NhbGVmYWN0b3IgYmFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXMpICAgIC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KK3sKKyAgaWYocmVzID09IDApCisgIHsKKyAgICBpZiAob2Zmc2V0ID49IDApCisgICAgeworICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCisgICAgICAgICAgcmV0dXJuKGluZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybigyKmluZGV4IC0gb2Zmc2V0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICAgIHJldHVybigyKmluZGV4K2luZGV4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybigyKmluZGV4ICsgb2Zmc2V0KTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHJldHVybihpbmRleCk7Cit9CisKKworLyohCisgIFxicmllZiAgVXBkYXRlIHByZXZpb3VzIGVudmVsb3BlIHZhbHVlIGZvciBkZWx0YS1jb2RpbmcKKworICBUaGUgY3VycmVudCBlbnZlbG9wZSB2YWx1ZXMgbmVlZHMgdG8gYmUgc3RvcmVkIGZvciBkZWx0YS1jb2RpbmcKKyAgaW4gdGhlIG5leHQgZnJhbWUuICBUaGUgc3RvcmVkIGVudmVsb3BlIGlzIGFsd2F5cyByZXByZXNlbnRlZCB3aXRoCisgIHRoZSBoaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uLiAgSWYgdGhlIGN1cnJlbnQgZW52ZWxvcGUgdXNlcyB0aGUKKyAgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uLCB0aGUgZW5lcmd5IHZhbHVlIHdpbGwgYmUgbWFwcGVkIHRvIHRoZQorICBjb3JyZXNwb25kaW5nIGhpZ2gtcmVzIGJhbmRzLgorKi8KK3N0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbChGSVhQX1NHTCBjdXJyVmFsLCAgLyohPCBjdXJyZW50IGVuZXJneSB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMKiBwcmV2RGF0YSwvKiE8IHBvaW50ZXIgdG8gcHJldmlvdXMgZGF0YSB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCAgICAgIC8qITwgbWFwcGluZyBmYWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsICAgICAgIC8qITwgaW5kZXggdG8gc2NhbGVmYWN0b3IgYmFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXMpICAgICAgICAgLyohPCBmcmVxdWVueSByZXNvbHV0aW9uICovCit7CisgIGlmKHJlcyA9PSAwKQorICB7CisgICAgaWYgKG9mZnNldCA+PSAwKQorICAgIHsKKyAgICAgICAgaWYoaW5kZXggPCBvZmZzZXQpCisgICAgICAgICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggLSBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXgrMSAtIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleF0gPSBjdXJyVmFsOworICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleCsxXSA9IGN1cnJWYWw7CisgICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4KzJdID0gY3VyclZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggKyBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggKyAxICsgb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7Cit9CisKKworCisvKiEKKyAgXGJyaWVmICAgIENvbnZlcnQgcmF3IGVudmVsb3BlIGFuZCBub2lzZWZsb29yIGRhdGEgdG8gZW5lcmd5IGxldmVscworCisgIFRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGJ5IHNickRlY29kZXJfUGFyc2VFbGVtZW50KCkgYW5kIHByb3ZpZGVzIHR3byBpbXBvcnRhbnQgYWxnb3JpdGhtczoKKworICBGaXJzdCB0aGUgZnVuY3Rpb24gZGVjb2RlcyBlbnZlbG9wZXMgYW5kIG5vaXNlIGZsb29yIGxldmVscyBhcyBkZXNjcmliZWQgaW4gcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpCisgIGFuZCBzYnJfZW52ZWxvcGVfdW5tYXBwaW5nKCkuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgY29uY2VhbG1lbnQgYWxnb3JpdGhtcyBpbiBjYXNlIHRoZXJlIGFyZSBlcnJvcnMKKyAgd2l0aGluIHRoZSBzYnIgZGF0YS4gRm9yIGJvdGggb3BlcmF0aW9ucyBmcmFjdGlvbmFsIGFyaXRobWV0aWMgaXMgdXNlZC4KKyAgVGhlcmVmb3JlIHlvdSBtaWdodCBlbmNvdW50ZXIgZGlmZmVyZW50IG91dHB1dCB2YWx1ZXMgb24geW91ciB0YXJnZXQKKyAgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCisqLwordm9pZAorZGVjb2RlU2JyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgICAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gbGVmdCBjaGFubmVsIGZyYW1lIGRhdGEgKi8KKyAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX2xlZnQsIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLworICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCwgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgZnJhbWUgZGF0YSAqLworICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGFfcmlnaHQpLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLworeworICBGSVhQX1NHTCB0ZW1wU2ZiTnJnUHJldltNQVhfRlJFUV9DT0VGRlNdOworICBpbnQgZXJyTGVmdDsKKworICAvKiBTYXZlIHByZXZpb3VzIGVuZXJneSB2YWx1ZXMgdG8gYmUgYWJsZSB0byByZXVzZSB0aGVtIGxhdGVyIGZvciBjb25jZWFsbWVudC4gKi8KKyAgRkRLbWVtY3B5ICh0ZW1wU2ZiTnJnUHJldiwgaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKKworICBkZWNvZGVFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9yaWdodCk7CisgIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfbGVmdCk7CisKKyAgaWYoaF9kYXRhX3JpZ2h0ICE9IE5VTEwpIHsKKyAgICBlcnJMZWZ0ID0gaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnOworICAgIGRlY29kZUVudmVsb3BlIChoSGVhZGVyRGF0YSwgaF9kYXRhX3JpZ2h0LCBoX3ByZXZfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfbGVmdCk7CisgICAgZGVjb2RlTm9pc2VGbG9vcmxldmVscyAoaEhlYWRlckRhdGEsIGhfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfcmlnaHQpOworCisgICAgaWYgKCFlcnJMZWZ0ICYmIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZykgeworICAgICAgLyogSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSByaWdodCBjaGFubmVsIHdoZXJlIHRoZSBsZWZ0IGNoYW5uZWwgc2VlbWVkIG9rLAorICAgICAgICAgd2UgYXBwbHkgY29uY2VhbG1lbnQgYWxzbyBvbiB0aGUgbGVmdCBjaGFubmVsLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY291cGxpbmcKKyAgICAgICAgIG1vZGVzIG9mIGJvdGggY2hhbm5lbHMgbWF0Y2ggYW5kIHRoYXQgd2UgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW52ZWxvcGVzIGluCisgICAgICAgICBjb3VwbGluZyBtb2RlLgorICAgICAgICAgSG93ZXZlciwgYXMgdGhlIGxlZnQgY2hhbm5lbCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBiZWZvcmUsIHRoZSByZXN1bHRpbmcKKyAgICAgICAgIGVuZXJneSBsZXZlbHMgYXJlIG5vdCB0aGUgc2FtZSBhcyBpZiB0aGUgbGVmdCBjaGFubmVsIGhhZCBiZWVuIGNvbmNlYWxlZAorICAgICAgICAgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9mIGRlY29kZUVudmVsb3BlKCkuCisgICAgICAqLworICAgICAgLyogUmVzdG9yZSBwcmV2aW91cyBlbmVyZ3kgdmFsdWVzIGZvciBjb25jZWFsbWVudCwgYmVjYXVzZSB0aGUgdmFsdWVzIGhhdmUgYmVlbgorICAgICAgICAgb3ZlcndyaXR0ZW4gYnkgdGhlIGZpcnN0IGNhbGwgb2YgZGVjb2RlRW52ZWxvcGUoKS4gKi8KKyAgICAgIEZES21lbWNweSAoaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LCB0ZW1wU2ZiTnJnUHJldiwgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CisgICAgICAvKiBEbyBjb25jZWFsbWVudCAqLworICAgICAgZGVjb2RlRW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfcmlnaHQpOworICAgIH0KKworICAgIGlmIChoX2RhdGFfbGVmdC0+Y291cGxpbmcpIHsKKyAgICAgIHNicl9lbnZlbG9wZV91bm1hcHBpbmcgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9kYXRhX3JpZ2h0KTsKKyAgICB9CisgIH0KKworICAvKiBEaXNwbGF5IHRoZSBkYXRhIGZvciBkZWJ1Z2dpbmc6ICovCit9CisKKworLyohCisgIFxicmllZiAgIENvbnZlcnQgZnJvbSBjb3VwbGVkIGNoYW5uZWxzIHRvIGluZGVwZW5kZW50IEwvUiBkYXRhCisqLworc3RhdGljIHZvaWQKK3Nicl9lbnZlbG9wZV91bm1hcHBpbmcgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LCAgLyohPCBwb2ludGVyIHRvIGxlZnQgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCkgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgKi8KK3sKKyAgaW50IGk7CisgIEZJWFBfU0dMIHRlbXBMX20sIHRlbXBSX20sIHRlbXBScGx1czFfbSwgbmV3TF9tLCBuZXdSX207CisgIFNDSEFSICAgdGVtcExfZSwgdGVtcFJfZSwgdGVtcFJwbHVzMV9lLCBuZXdMX2UsIG5ld1JfZTsKKworCisgIC8qIDEuIFVubWFwIChhbHJlYWR5IGRlcXVhbnRpemVkKSBjb3VwbGVkIGVudmVsb3BlIGVuZXJnaWVzICovCisKKyAgZm9yIChpID0gMDsgaSA8IGhfZGF0YV9sZWZ0LT5uU2NhbGVGYWN0b3JzOyBpKyspIHsKKyAgICB0ZW1wUl9tID0gKEZJWFBfU0dMKSgoTE9ORyloX2RhdGFfcmlnaHQtPmlFbnZlbG9wZVtpXSAmIE1BU0tfTSk7CisgICAgdGVtcFJfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX3JpZ2h0LT5pRW52ZWxvcGVbaV0gJiBNQVNLX0UpOworCisgICAgdGVtcFJfZSAtPSAoMTggKyBOUkdfRVhQX09GRlNFVCk7ICAvKiAtMTggPSBsZChVTk1BUFBJTkdfU0NBTEUgLyBoX2RhdGFfcmlnaHQtPm5DaGFubmVscykgKi8KKyAgICB0ZW1wTF9tID0gKEZJWFBfU0dMKSgoTE9ORyloX2RhdGFfbGVmdC0+aUVudmVsb3BlW2ldICYgTUFTS19NKTsKKyAgICB0ZW1wTF9lID0gKFNDSEFSKSgoTE9ORyloX2RhdGFfbGVmdC0+aUVudmVsb3BlW2ldICYgTUFTS19FKTsKKworICAgIHRlbXBMX2UgLT0gTlJHX0VYUF9PRkZTRVQ7CisKKyAgICAvKiBDYWxjdWxhdGUgdGVtcFJpZ2h0KzEgKi8KKyAgICBGREtfYWRkX01hbnRFeHAoIHRlbXBSX20sIHRlbXBSX2UsCisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmKSwgMSwgIC8qIDEuMCAqLworICAgICAgICAgICAgICAgICAgICAgJnRlbXBScGx1czFfbSwgJnRlbXBScGx1czFfZSk7CisKKyAgICBGREtfZGl2aWRlX01hbnRFeHAoIHRlbXBMX20sIHRlbXBMX2UrMSwgIC8qICAyICogdGVtcExlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJwbHVzMV9tLCB0ZW1wUnBsdXMxX2UsCisgICAgICAgICAgICAgICAgICAgICAgICZuZXdSX20sICZuZXdSX2UgKTsKKworICAgIGlmIChuZXdSX20gPj0gKChGSVhQX1NHTClNQVhWQUxfU0dMIC0gUk9VTkRJTkcpKSB7CisgICAgICBuZXdSX20gPj49IDE7CisgICAgICBuZXdSX2UgKz0gMTsKKyAgICB9CisKKyAgICBuZXdMX20gPSBGWF9EQkwyRlhfU0dMKGZNdWx0KHRlbXBSX20sbmV3Ul9tKSk7CisgICAgbmV3TF9lID0gdGVtcFJfZSArIG5ld1JfZTsKKworICAgIGhfZGF0YV9yaWdodC0+aUVudmVsb3BlW2ldID0gKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9lICsgTlJHX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfbGVmdC0+aUVudmVsb3BlW2ldID0gICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5SR19FWFBfT0ZGU0VUKSAmIE1BU0tfRSk7CisgIH0KKworICAvKiAyLiBEZXF1YW50aXplIGFuZCB1bm1hcCBjb3VwbGVkIG5vaXNlIGZsb29yIGxldmVscyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIgKiBoX2RhdGFfbGVmdC0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisKKyAgICB0ZW1wTF9lID0gKFNDSEFSKSg2IC0gKExPTkcpaF9kYXRhX2xlZnQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSk7CisgICAgdGVtcFJfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX3JpZ2h0LT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gLSAxMikgLypTQlJfRU5FUkdZX1BBTl9PRkZTRVQqLzsKKworICAgIC8qIENhbGN1bGF0ZSB0ZW1wUisxICovCisgICAgRkRLX2FkZF9NYW50RXhwKCBGTDJGWENPTlNUX1NHTCgwLjVmKSwgMSt0ZW1wUl9lLCAvKiB0ZW1wUiAqLworICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiksIDEsICAgICAgICAgLyogIDEuMCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICZ0ZW1wUnBsdXMxX20sICZ0ZW1wUnBsdXMxX2UpOworCisgICAgLyogQ2FsY3VsYXRlIDIqdGVtcExlZnQvKHRlbXBSKzEpICovCisgICAgRkRLX2RpdmlkZV9NYW50RXhwKCBGTDJGWENPTlNUX1NHTCgwLjVmKSwgdGVtcExfZSsyLCAgLyogIDIgKiB0ZW1wTGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUnBsdXMxX20sIHRlbXBScGx1czFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JfbSwgJm5ld1JfZSApOworCisgICAgLyogaWYgKG5ld1JfbSA+PSAoKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBST1VORElORykpIHsKKyAgICAgIG5ld1JfbSA+Pj0gMTsKKyAgICAgIG5ld1JfZSArPSAxOworICAgIH0gKi8KKworICAgIC8qIEwgPSB0ZW1wUiAqIFIgKi8KKyAgICBuZXdMX20gPSBuZXdSX207CisgICAgbmV3TF9lID0gbmV3Ul9lICsgdGVtcFJfZTsKKyAgICBoX2RhdGFfcmlnaHQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9ICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfbGVmdC0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgICAgU2ltcGxlIGFsdGVybmF0aXZlIHRvIHRoZSByZWFsIFNCUiBjb25jZWFsbWVudAorCisgIElmIHRoZSByZWFsIGZyYW1lSW5mbyBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBhIGZyYW1lIGxvc3MsIGEgcmVwbGFjZW1lbnQgd2lsbAorICBiZSBjb25zdHJ1Y3RlZCB3aXRoIDEgZW52ZWxvcGUgc3Bhbm5pbmcgdGhlIHdob2xlIGZyYW1lIChGSVgtRklYKS4KKyAgVGhlIGRlbHRhLWNvZGVkIGVuZXJnaWVzIGFyZSBzZXQgdG8gbmVnYXRpdmUgdmFsdWVzLCByZXN1bHRpbmcgaW4gYSBmYWRlLWRvd24uCisgIEluIGNhc2Ugb2YgY291cGxpbmcsIHRoZSBiYWxhbmNlLWNoYW5uZWwgd2lsbCBtb3ZlIHRvd2FyZHMgdGhlIGNlbnRlci4KKyovCitzdGF0aWMgdm9pZAorbGVhblNickNvbmNlYWxtZW50KEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfc2JyX2RhdGEsICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhICAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgKQoreworICBGSVhQX1NHTCB0YXJnZXQ7ICAvKiB0YXJnZXRlZCBsZXZlbCBmb3Igc2ZiX25yZ19wcmV2IGR1cmluZyBmYWRlLWRvd24gKi8KKyAgRklYUF9TR0wgc3RlcDsgICAgLyogc3BlZWQgb2YgZmFkZSAqLworICBpbnQgaTsKKworICBpbnQgY3VycmVudFN0YXJ0UG9zID0gaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOworICBpbnQgY3VycmVudFN0b3BQb3MgPSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOworCisKKyAgLyogVXNlIHNvbWUgc2V0dGluZ3Mgb2YgdGhlIHByZXZpb3VzIGZyYW1lICovCisgIGhfc2JyX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPSBoX3ByZXZfZGF0YS0+YW1wUmVzOworICBoX3Nicl9kYXRhLT5jb3VwbGluZyA9IGhfcHJldl9kYXRhLT5jb3VwbGluZzsKKyAgZm9yKGk9MDtpPE1BWF9JTlZGX0JBTkRTO2krKykKKyAgICBoX3Nicl9kYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gaF9wcmV2X2RhdGEtPnNicl9pbnZmX21vZGVbaV07CisKKyAgLyogR2VuZXJhdGUgY29uY2VhbGluZyBjb250cm9sIGRhdGEgKi8KKworICBoX3Nicl9kYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlcyA9IDE7CisgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdID0gY3VycmVudFN0YXJ0UG9zOworICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc1sxXSA9IGN1cnJlbnRTdG9wUG9zOworICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uZnJlcVJlc1swXSA9IDE7CisgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby50cmFuRW52ID0gLTE7ICAvKiBubyB0cmFuc2llbnQgKi8KKyAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlcyA9IDE7CisgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbMF0gPSBjdXJyZW50U3RhcnRQb3M7CisgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbMV0gPSBjdXJyZW50U3RvcFBvczsKKworICBoX3Nicl9kYXRhLT5uU2NhbGVGYWN0b3JzID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOworCisgIC8qIEdlbmVyYXRlIGZha2UgZW52ZWxvcGUgZGF0YSAqLworCisgIGhfc2JyX2RhdGEtPmRvbWFpbl92ZWNbMF0gPSAxOworCisgIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19CQUwpIHsKKyAgICB0YXJnZXQgPSAoRklYUF9TR0wpU0JSX0VORVJHWV9QQU5fT0ZGU0VUOworICAgIHN0ZXAgPSAoRklYUF9TR0wpREVDQVlfQ09VUExJTkc7CisgIH0KKyAgZWxzZSB7CisgICAgdGFyZ2V0ID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgc3RlcCAgID0gKEZJWFBfU0dMKURFQ0FZOworICB9CisgIGlmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5hbXBSZXNvbHV0aW9uID09IDApIHsKKyAgICB0YXJnZXQgPDw9IDE7CisgICAgc3RlcCAgIDw8PSAxOworICB9CisKKyAgZm9yIChpPTA7IGkgPCBoX3Nicl9kYXRhLT5uU2NhbGVGYWN0b3JzOyBpKyspIHsKKyAgICBpZiAoaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA+IHRhcmdldCkKKyAgICAgIGhfc2JyX2RhdGEtPmlFbnZlbG9wZVtpXSA9IC1zdGVwOworICAgIGVsc2UKKyAgICAgIGhfc2JyX2RhdGEtPmlFbnZlbG9wZVtpXSA9IHN0ZXA7CisgIH0KKworICAvKiBOb2lzZWZsb29yIGxldmVscyBhcmUgYWx3YXlzIGNsZWFyZWQgLi4uICovCisKKyAgaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVswXSA9IDE7CisgIGZvciAoaT0wOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOyBpKyspCisgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisKKyAgLyogLi4uIGFuZCBzbyBhcmUgdGhlIHNpbmVzICovCisgIEZES21lbWNsZWFyKGhfc2JyX2RhdGEtPmFkZEhhcm1vbmljcywgTUFYX0ZSRVFfQ09FRkZTKTsKK30KKworCisvKiEKKyAgXGJyaWVmICAgQnVpbGQgcmVmZXJlbmNlIGVuZXJnaWVzIGFuZCBub2lzZSBsZXZlbHMgZnJvbSBiaXRzdHJlYW0gZWxlbWVudHMKKyovCitzdGF0aWMgdm9pZAorZGVjb2RlRW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfc2JyX2RhdGEsICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgb3RoZXJDaGFubmVsIC8qITwgb3RoZXIgY2hhbm5lbCdzIGxhc3QgZnJhbWUgZGF0YSAqLworICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGk7CisgIGludCBmRnJhbWVFcnJvciA9IGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZzsKKyAgRklYUF9TR0wgdGVtcFNmYk5yZ1ByZXZbTUFYX0ZSRVFfQ09FRkZTXTsKKworICBpZiAoIWZGcmFtZUVycm9yKSB7CisgICAgLyoKKyAgICAgIFRvIGF2b2lkIGRpc3RvcnRpb25zIGFmdGVyIGJhZCBmcmFtZXMsIHNldCB0aGUgZXJyb3IgZmxhZyBpZiBkZWx0YSBjb2RpbmcgaW4gdGltZSBvY2N1cnMuCisgICAgICBIb3dldmVyLCBTQlIgY2FuIHRha2UgYSBsaXR0bGUgbG9uZ2VyIHRvIGNvbWUgdXAgYWdhaW4uCisgICAgKi8KKyAgICBpZiAoIGhfcHJldl9kYXRhLT5mcmFtZUVycm9yRmxhZyApIHsKKyAgICAgIGlmIChoX3Nicl9kYXRhLT5kb21haW5fdmVjWzBdICE9IDApIHsKKyAgICAgICAgZkZyYW1lRXJyb3IgPSAxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBDaGVjayB0aGF0IHRoZSBwcmV2aW91cyBzdG9wIHBvc2l0aW9uIGFuZCB0aGUgY3VycmVudCBzdGFydCBwb3NpdGlvbiBtYXRjaC4KKyAgICAgICAgIChDb3VsZCBiZSBkb25lIGluIGNoZWNrRnJhbWVJbmZvKCksIGJ1dCB0aGUgcHJldmlvdXMgZnJhbWUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHRoZXJlKSAqLworICAgICAgaWYgKCBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc1swXSAhPSBoX3ByZXZfZGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKSB7CisgICAgICAgIC8qIEJvdGggdGhlIHByZXZpb3VzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgZnJhbWUgYXJlIGZsYWdnZWQgdG8gYmUgb2ssIGJ1dCB0aGV5IGRvIG5vdCBtYXRjaCEgKi8KKyAgICAgICAgaWYgKGhfc2JyX2RhdGEtPmRvbWFpbl92ZWNbMF0gPT0gMSkgeworICAgICAgICAgIC8qIFByZWZlciBjb25jZWFsbWVudCBvdmVyIGRlbHRhLXRpbWUgY29kaW5nIGJldHdlZW4gdGhlIG1pc21hdGNoaW5nIGZyYW1lcyAqLworICAgICAgICAgIGZGcmFtZUVycm9yID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBDbG9zZSB0aGUgZ2FwIGluIHRpbWUgYnkgdHJpZ2dlcmluZyB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUoKSAqLworICAgICAgICAgIGZGcmFtZUVycm9yID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgaWYgKGZGcmFtZUVycm9yKSAgICAgICAvKiBFcnJvciBpcyBkZXRlY3RlZCAqLworICAgIHsKKyAgICAgIGxlYW5TYnJDb25jZWFsbWVudChoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhfcHJldl9kYXRhKTsKKworICAgICAgLyogZGVjb2RlIHRoZSBlbnZlbG9wZSBkYXRhIHRvIGxpbmVhciBQQ00gKi8KKyAgICAgIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nIChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOworICAgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLypEbyBhIHRlbXBvcmFyeSBkdW1teSBkZWNvZGluZyBhbmQgY2hlY2sgdGhhdCB0aGUgZW52ZWxvcGUgdmFsdWVzIGFyZSB3aXRoaW4gbGltaXRzICovCisgICAgeworICAgICAgaWYgKGhfcHJldl9kYXRhLT5mcmFtZUVycm9yRmxhZykgeworICAgICAgICB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSk7CisgICAgICAgIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyAhPSBoX3ByZXZfZGF0YS0+Y291cGxpbmcpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAgQ291cGxpbmcgbW9kZSBoYXMgY2hhbmdlZCBkdXJpbmcgY29uY2VhbG1lbnQuCisgICAgICAgICAgICAgVGhlIHN0b3JlZCBlbmVyZ3kgbGV2ZWxzIG5lZWQgdG8gYmUgY29udmVydGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMV07IGkrKykgeworICAgICAgICAgICAgLyogRm9ybWVyIExldmVsLUNoYW5uZWwgd2lsbCBiZSB1c2VkIGZvciBib3RoIGNoYW5uZWxzICovCisgICAgICAgICAgICBpZiAoaF9wcmV2X2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkKKyAgICAgICAgICAgICAgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA9IG90aGVyQ2hhbm5lbC0+c2ZiX25yZ19wcmV2W2ldOworICAgICAgICAgICAgLyogRm9ybWVyIEwvUiB3aWxsIGJlIGNvbWJpbmVkIGFzIHRoZSBuZXcgTGV2ZWwtQ2hhbm5lbCAqLworICAgICAgICAgICAgZWxzZSBpZiAoaF9zYnJfZGF0YS0+Y291cGxpbmcgPT0gQ09VUExJTkdfTEVWRUwpCisgICAgICAgICAgICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSAoaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSArIG90aGVyQ2hhbm5lbC0+c2ZiX25yZ19wcmV2W2ldKSA+PiAxOworICAgICAgICAgICAgZWxzZSBpZiAoaF9zYnJfZGF0YS0+Y291cGxpbmcgPT0gQ09VUExJTkdfQkFMKQorICAgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gKEZJWFBfU0dMKVNCUl9FTkVSR1lfUEFOX09GRlNFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZES21lbWNweSAodGVtcFNmYk5yZ1ByZXYsIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXYsCisgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZiAoRklYUF9TR0wpKTsKKworICAgICAgZGVsdGFUb0xpbmVhclBjbUVudmVsb3BlRGVjb2RpbmcgKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSk7CisKKyAgICAgIGZGcmFtZUVycm9yID0gY2hlY2tFbnZlbG9wZURhdGEgKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSk7CisKKyAgICAgIGlmIChmRnJhbWVFcnJvcikKKyAgICAgICAgeworICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyA9IDE7CisgICAgICAgICAgRkRLbWVtY3B5IChoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2LCB0ZW1wU2ZiTnJnUHJldiwKKyAgICAgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZiAoRklYUF9TR0wpKTsKKyAgICAgICAgICBkZWNvZGVFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhLCBvdGhlckNoYW5uZWwpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICByZXF1YW50aXplRW52ZWxvcGVEYXRhIChoX3Nicl9kYXRhLCBoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lKTsKKworICBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgPSBmRnJhbWVFcnJvcjsKK30KKworCisvKiEKKyAgXGJyaWVmICAgVmVyaWZ5IHRoYXQgZW52ZWxvcGUgZW5lcmdpZXMgYXJlIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZQorICBccmV0dXJuICAwIGlmIGFsbCBpcyBmaW5lLCAxIGlmIGFuIGVudmVsb3BlIHZhbHVlIHdhcyB0b28gaGlnaAorKi8KK3N0YXRpYyBpbnQKK2NoZWNrRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSAgLyohPCBwb2ludGVyIHRvIGRhdGEgb2YgbGFzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICkKK3sKKyAgRklYUF9TR0wgKmlFbnZlbG9wZSA9IGhfc2JyX2RhdGEtPmlFbnZlbG9wZTsKKyAgRklYUF9TR0wgKnNmYl9ucmdfcHJldiA9IGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXY7CisgIGludCAgICBpID0gMCwgZXJyb3JGbGFnID0gMDsKKyAgRklYUF9TR0wgc2JyX21heF9lbmVyZ3kgPQorICAgIChoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID09IDEpID8gU0JSX01BWF9FTkVSR1kgOiAoU0JSX01BWF9FTkVSR1kgPDwgMSk7CisKKyAgLyoKKyAgICBSYW5nZSBjaGVjayBmb3IgY3VycmVudCBlbmVyZ2llcworICAqLworICBmb3IgKGkgPSAwOyBpIDwgaF9zYnJfZGF0YS0+blNjYWxlRmFjdG9yczsgaSsrKSB7CisgICAgaWYgKGlFbnZlbG9wZVtpXSA+IHNicl9tYXhfZW5lcmd5KSB7CisgICAgICBlcnJvckZsYWcgPSAxOworICAgIH0KKyAgICBpZiAoaUVudmVsb3BlW2ldIDwgRkwyRlhDT05TVF9TR0woMC4wZikpIHsKKyAgICAgIGVycm9yRmxhZyA9IDE7CisgICAgICAvKiBpRW52ZWxvcGVbaV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsgKi8KKyAgICB9CisgIH0KKworICAvKgorICAgIFJhbmdlIGNoZWNrIGZvciBwcmV2aW91cyBlbmVyZ2llcworICAqLworICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOyBpKyspIHsKKyAgICBzZmJfbnJnX3ByZXZbaV0gPSBmaXhNYXgoc2ZiX25yZ19wcmV2W2ldLCBGTDJGWENPTlNUX1NHTCgwLjBmKSk7CisgICAgc2ZiX25yZ19wcmV2W2ldID0gZml4TWluKHNmYl9ucmdfcHJldltpXSwgc2JyX21heF9lbmVyZ3kpOworICB9CisKKyAgcmV0dXJuIChlcnJvckZsYWcpOworfQorCisKKy8qIQorICBcYnJpZWYgICBWZXJpZnkgdGhhdCB0aGUgbm9pc2UgbGV2ZWxzIGFyZSB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UKKworICBUaGUgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBjaGVja0VudmVsb3BlRGF0YSgpLgorICBXaGVuIHRoZSBub2lzZS1sZXZlbHMgYXJlIGJlaW5nIGRlY29kZWQsIGl0IGlzIGFscmVhZHkgdG9vIGxhdGUgZm9yCisgIGNvbmNlYWxtZW50LiBUaGVyZWZvcmUgdGhlIG5vaXNlIGxldmVscyBhcmUgc2ltcGx5IGxpbWl0ZWQgaGVyZS4KKyovCitzdGF0aWMgdm9pZAorbGltaXROb2lzZUxldmVscyhIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhKSAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCit7CisgIGludCBpOworICBpbnQgbk5mYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsKKworICAvKgorICAgIFNldCByYW5nZSBsaW1pdHMuIFRoZSBleGFjdCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBjb3VwbGluZyBtb2RlLgorICAgIEhvd2V2ZXIgdGhpcyBsaW1pdGF0aW9uIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhdm9pZCB1bmxpbWl0ZWQKKyAgICBhY2N1bXVsYXRpb24gb2YgdGhlIGRlbHRhLWNvZGVkIG5vaXNlIGxldmVscy4KKyAgKi8KKyAgI2RlZmluZSBsb3dlckxpbWl0ICAgKChGSVhQX1NHTCkwKSAgICAgLyogbG93ZXJMaW1pdCBhY3R1YWxseSByZWZlcnMgdG8gdGhlIF9oaWdoZXN0XyBub2lzZSBlbmVyZ3kgKi8KKyAgI2RlZmluZSB1cHBlckxpbWl0ICAgKChGSVhQX1NHTCkzNSkgICAgLyogdXBwZXJMaW1pdCBhY3R1YWxseSByZWZlcnMgdG8gdGhlIF9sb3dlc3RfIG5vaXNlIGVuZXJneSAqLworCisgIC8qCisgICAgUmFuZ2UgY2hlY2sgZm9yIGN1cnJlbnQgbm9pc2UgbGV2ZWxzCisgICovCisgIGZvciAoaSA9IDA7IGkgPCBoX3Nicl9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzICogbk5mYjsgaSsrKSB7CisgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gZml4TWluKGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgdXBwZXJMaW1pdCk7CisgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gZml4TWF4KGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgbG93ZXJMaW1pdCk7CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICAgQ29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHRpbWluZyB0aGF0IG1pZ2h0IG9jY3VyIGFmdGVyIGEgZnJhbWUgZXJyb3IuCisqLworc3RhdGljIHZvaWQKK3RpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgIC8qITwgcG9pbnRlciB0byBhY3R1YWwgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KK3sKKyAgaW50IGksIG5TY2FsZWZhY3RvcnM7CisgIEZSQU1FX0lORk8gKnBGcmFtZUluZm8gPSAmaF9zYnJfZGF0YS0+ZnJhbWVJbmZvOworICBVQ0hBUiAqblNmYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYjsKKyAgaW50IGVzdGltYXRlZFN0YXJ0UG9zID0gaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOworICBpbnQgcmVmTGVuLCBuZXdMZW4sIHNoaWZ0OworICBGSVhQX1NHTCAgZGVsdGFFeHA7CisKKyAgLyogT3JpZ2luYWwgbGVuZ3RoIG9mIGZpcnN0IGVudmVsb3BlIGFjY29yZGluZyB0byBiaXRzdHJlYW0gKi8KKyAgcmVmTGVuID0gcEZyYW1lSW5mby0+Ym9yZGVyc1sxXSAtIHBGcmFtZUluZm8tPmJvcmRlcnNbMF07CisgIC8qIENvcnJlY3RlZCBsZW5ndGggb2YgZmlyc3QgZW52ZWxvcGUgKGNvbmNlYWxpbmcgY2FuIG1ha2UgdGhlIGZpcnN0IGVudmVsb3BlIGxvbmdlcikgKi8KKyAgbmV3TGVuID0gcEZyYW1lSW5mby0+Ym9yZGVyc1sxXSAtIGVzdGltYXRlZFN0YXJ0UG9zOworCisgIGlmIChuZXdMZW4gPD0gMCkgeworICAgIC8qIEFuIGVudmVsb3BlIGxlbmd0aCBvZiA8PSAwIHdvdWxkIG5vdCB3b3JrLCBzbyB3ZSBkb24ndCB1c2UgaXQuCisgICAgICAgTWF5IG9jY3VyIGlmIHRoZSBwcmV2aW91cyBmcmFtZSB3YXMgZmxhZ2dlZCBiYWQgZHVlIHRvIGEgbWlzbWF0Y2gKKyAgICAgICBvZiB0aGUgb2xkIGFuZCBuZXcgZnJhbWUgaW5mb3MuICovCisgICAgbmV3TGVuID0gcmVmTGVuOworICAgIGVzdGltYXRlZFN0YXJ0UG9zID0gcEZyYW1lSW5mby0+Ym9yZGVyc1swXTsKKyAgfQorCisgIGRlbHRhRXhwID0gRkRLX2dldE51bU9jdGF2ZXNEaXY4KG5ld0xlbiwgcmVmTGVuKTsKKworICAvKiBTaGlmdCBieSAtMyB0byByZXNjYWxlIGxkLXRhYmxlLCBhbXBSZXMtMSB0byBlbmFibGUgY29hcnNlciBzdGVwcyAqLworICBzaGlmdCA9IChGUkFDVF9CSVRTIC0gMSAtIEVOVl9FWFBfRlJBQ1QgLSAxICsgaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSAtIDMpOworICBkZWx0YUV4cCA9IGRlbHRhRXhwID4+IHNoaWZ0OworICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gZXN0aW1hdGVkU3RhcnRQb3M7CisgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGVzdGltYXRlZFN0YXJ0UG9zOworCisgIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyAhPSBDT1VQTElOR19CQUwpIHsKKyAgICBuU2NhbGVmYWN0b3JzID0gKHBGcmFtZUluZm8tPmZyZXFSZXNbMF0pID8gblNmYlsxXSA6IG5TZmJbMF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNjYWxlZmFjdG9yczsgaSsrKQorICAgICAgaF9zYnJfZGF0YS0+aUVudmVsb3BlW2ldID0gaF9zYnJfZGF0YS0+aUVudmVsb3BlW2ldICsgZGVsdGFFeHA7CisgIH0KK30KKworCisKKy8qIQorICBcYnJpZWYgICBDb252ZXJ0IGVhY2ggZW52ZWxvcGUgdmFsdWUgZnJvbSBsb2dhcml0aG1pYyB0byBsaW5lYXIgZG9tYWluCisKKyAgRW5lcmd5IGxldmVscyBhcmUgdHJhbnNtaXR0ZWQgaW4gcG93ZXJzIG9mIDIsIGkuZS4gb25seSB0aGUgZXhwb25lbnQKKyAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGJpdHN0cmVhbS4KKyAgVGhlcmVmb3JlLCBub3JtYWxseSBvbmx5IGludGVnZXIgZXhwb25lbnRzIGNhbiBvY2N1ci4gSG93ZXZlciBkdXJpbmcKKyAgZmFkaW5nIChpbiBjYXNlIG9mIGEgY29ycnVwdCBiaXRzdHJlYW0pLCBhIGZyYWN0aW9uYWwgcGFydCBjYW4gYWxzbworICBvY2N1ci4gVGhlIGRhdGEgaW4gdGhlIGFycmF5IGlFbnZlbG9wZSBpcyBzaGlmdGVkIGxlZnQgYnkgRU5WX0VYUF9GUkFDVAorICBjb21wYXJlZCB0byBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIHNvIHRoYXQgbnVtYmVycyBzbWFsbGVyIHRoYW4gMQorICBjYW4gYmUgcmVwcmVzZW50ZWQuCisKKyAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgbWFudGlzc2EgY29ycmVzcG9uZGluZyB0byB0aGUgZnJhY3Rpb25hbAorICBwYXJ0IG9mIHRoZSBleHBvbmVudCBmb3IgZWFjaCByZWZlcmVuY2UgZW5lcmd5LiBUaGUgYXJyYXkgaUVudmVsb3BlCisgIGlzIGNvbnZlcnRlZCBpbiBwbGFjZSB0byBzYXZlIG1lbW9yeS4gSW5wdXQgYW5kIG91dHB1dCBkYXRhIG11c3QKKyAgYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHksIGFzIHNob3duIGluIHRoZSBiZWxvdyBmaWd1cmU6CisKKyAgXGltYWdlIGh0bWwgIEVudmVsb3BlRGF0YS5wbmcKKworICBUaGUgZGF0YSBpcyB0aGVuIHVzZWQgaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKS4KKyovCitzdGF0aWMgdm9pZAorcmVxdWFudGl6ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsIGludCBhbXBSZXNvbHV0aW9uKQoreworICBpbnQgaTsKKyAgRklYUF9TR0wgbWFudGlzc2E7CisgIGludCBhbXBTaGlmdCA9IDEgLSBhbXBSZXNvbHV0aW9uOworICBpbnQgZXhwb25lbnQ7CisKKyAgLyogSW4gY2FzZSB0aGF0IEVOVl9FWFBfRlJBQ1QgaXMgY2hhbmdlZCB0byBzb21ldGhpbmcgZWxzZSBidXQgMCBvciA4LAorICAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBhcnJheSBoYXMgdG8gYmUgYWRhcHRlZCEKKyAgKi8KKyNpZiBFTlZfRVhQX0ZSQUNUCisgIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBwb3cyW0VOVl9FWFBfRlJBQ1RdID0KKyAgeworICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDEpKSksIC8qIDAuNzA3MSAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDIpKSksIC8qIDAuNTk0NiAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDMpKSksCisgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNCkpKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA1KSkpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDYpKSksCisgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNykpKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA4KSkpICAvKiAwLjUwMTMgKi8KKyAgfTsKKworICBpbnQgYml0LCBtYXNrOworI2VuZGlmCisKKyAgZm9yIChpID0gMDsgaSA8IGhfc2JyX2RhdGEtPm5TY2FsZUZhY3RvcnM7IGkrKykgeworICAgIGV4cG9uZW50ID0gKExPTkcpaF9zYnJfZGF0YS0+aUVudmVsb3BlW2ldOworCisjaWYgRU5WX0VYUF9GUkFDVAorCisgICAgZXhwb25lbnQgPSBleHBvbmVudCA+PiBhbXBTaGlmdDsKKyAgICBtYW50aXNzYSA9IDAuNWY7CisKKyAgICAvKiBBbXBsaWZ5IG1hbnRpc3NhIGFjY29yZGluZyB0byB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZQorICAgICAgIGV4cG9uZW50IChyZXN1bHQgd2lsbCBiZSBiZXR3ZWVuIDAuNTAwMDAwIGFuZCAwLjk5OTk5OSkKKyAgICAqLworICAgIG1hc2sgPSAxOyAgLyogYmVnaW4gd2l0aCBsb3dlc3QgYml0IG9mIGV4cG9uZW50ICovCisKKyAgICBmb3IgKCBiaXQ9RU5WX0VYUF9GUkFDVC0xOyBiaXQ+PTA7IGJpdC0tICkgeworICAgICAgaWYgKGV4cG9uZW50ICYgbWFzaykgeworICAgICAgICAvKiBUaGUgY3VycmVudCBiaXQgb2YgdGhlIGV4cG9uZW50IGlzIHNldCwKKyAgICAgICAgICAgbXVsdGlwbHkgbWFudGlzc2Egd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3I6ICovCisgICAgICAgIG1hbnRpc3NhID0gKEZJWFBfU0dMKSggKG1hbnRpc3NhICogcG93MltiaXRdKSA8PCAxKTsKKyAgICAgIH0KKyAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBiaXQgKi8KKyAgICAgIG1hc2sgPSBtYXNrIDw8IDE7CisgICAgfQorCisgICAgLyogTWFrZSBpbnRlZ2VyIHBhcnQgb2YgZXhwb25lbnQgcmlnaHQgYWxpZ25lZCAqLworICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj4gRU5WX0VYUF9GUkFDVDsKKworI2Vsc2UKKyAgICAvKiBJbiBjYXNlIG9mIHRoZSBoaWdoIGFtcGxpdHVkZSByZXNvbHV0aW9uLCAxIGJpdCBvZiB0aGUgZXhwb25lbnQgZ2V0cyBsb3N0IGJ5IHRoZSBzaGlmdC4KKyAgICAgICBUaGlzIHdpbGwgYmUgY29tcGVuc2F0ZWQgYnkgYSBtYW50aXNzYSBvZiAwLjUqc3FydCgyKSBpbnN0ZWFkIG9mIDAuNSBpZiB0aGF0IGJpdCBpcyAxLiAqLworICAgIG1hbnRpc3NhID0gKGV4cG9uZW50ICYgYW1wU2hpZnQpID8gRkwyRlhDT05TVF9TR0woMC43MDcxMDY3ODExODY1NDhmKSA6IEZMMkZYQ09OU1RfU0dMKDAuNWYpOworICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj4gYW1wU2hpZnQ7CisjZW5kaWYKKworICAgIC8qCisgICAgICBNYW50aXNzYSB3YXMgc2V0IHRvIDAuNSAoaW5zdGVhZCBvZiAxLjAsIHRoZXJlZm9yZSBpbmNyZWFzZSBleHBvbmVudCBieSAxKS4KKyAgICAgIE11bHRpcGx5IGJ5IEw9bkNoYW5uZWxzPTY0IGJ5IGluY3JlYXNpbmcgZXhwb25lbnQgYnkgYW5vdGhlciA2LgorICAgICAgPT4gSW5jcmVhc2UgZXhwb25lbnQgYnkgNworICAgICovCisgICAgZXhwb25lbnQgKz0gNyArIE5SR19FWFBfT0ZGU0VUOworCisgICAgLyogQ29tYmluZSBtYW50aXNzYSBhbmQgZXhwb25lbnQgYW5kIHdyaXRlIGJhY2sgdGhlIHJlc3VsdCAqLworICAgIGhfc2JyX2RhdGEtPmlFbnZlbG9wZVtpXSA9IChGSVhQX1NHTCkoKChMT05HKW1hbnRpc3NhICYgTUFTS19NKSB8IChleHBvbmVudCAmIE1BU0tfRSkpOworCisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICAgQnVpbGQgbmV3IHJlZmVyZW5jZSBlbmVyZ2llcyBmcm9tIG9sZCBvbmVzIGFuZCBkZWx0YSBjb2RlZCBkYXRhCisqLworc3RhdGljIHZvaWQKK2RlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIHByZXZpb3VzIGRhdGEgKi8KK3sKKyAgaW50IGksIGRvbWFpbiwgbm9fb2ZfYmFuZHMsIGJhbmQsIGZyZXFSZXM7CisKKyAgRklYUF9TR0wgKnNmYl9ucmdfcHJldiA9IGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXY7CisgIEZJWFBfU0dMICpwdHJfbnJnID0gaF9zYnJfZGF0YS0+aUVudmVsb3BlOworCisgIGludCBvZmZzZXQgPSAyICogaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzBdIC0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOworCisgIGZvciAoaSA9IDA7IGkgPCBoX3Nicl9kYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsgaSsrKSB7CisgICAgZG9tYWluID0gaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY1tpXTsKKyAgICBmcmVxUmVzID0gaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV07CisKKyAgICBGREtfQVNTRVJUKGZyZXFSZXMgPj0gMCAmJiBmcmVxUmVzIDw9IDEpOworCisgICAgbm9fb2ZfYmFuZHMgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbZnJlcVJlc107CisKKyAgICBGREtfQVNTRVJUKG5vX29mX2JhbmRzIDwgKDY0KSk7CisKKyAgICBpZiAoZG9tYWluID09IDApCisgICAgeworICAgICAgbWFwTG93UmVzRW5lcmd5VmFsKCpwdHJfbnJnLCBzZmJfbnJnX3ByZXYsIG9mZnNldCwgMCwgZnJlcVJlcyk7CisgICAgICBwdHJfbnJnKys7CisgICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykKKyAgICAgIHsKKyAgICAgICAgKnB0cl9ucmcgPSAqcHRyX25yZyArICoocHRyX25yZy0xKTsKKyAgICAgICAgbWFwTG93UmVzRW5lcmd5VmFsKCpwdHJfbnJnLCBzZmJfbnJnX3ByZXYsIG9mZnNldCwgYmFuZCwgZnJlcVJlcyk7CisgICAgICAgIHB0cl9ucmcrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKQorICAgICAgeworICAgICAgICAqcHRyX25yZyA9ICpwdHJfbnJnICsgc2ZiX25yZ19wcmV2W2luZGV4TG93MkhpZ2gob2Zmc2V0LCBiYW5kLCBmcmVxUmVzKV07CisgICAgICAgIG1hcExvd1Jlc0VuZXJneVZhbCgqcHRyX25yZywgc2ZiX25yZ19wcmV2LCBvZmZzZXQsIGJhbmQsIGZyZXFSZXMpOworICAgICAgICBwdHJfbnJnKys7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyohCisgIFxicmllZiAgIEJ1aWxkIG5ldyBub2lzZSBsZXZlbHMgZnJvbSBvbGQgb25lcyBhbmQgZGVsdGEgY29kZWQgZGF0YQorKi8KK3N0YXRpYyB2b2lkCitkZWNvZGVOb2lzZUZsb29ybGV2ZWxzIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpIC8qITwgcG9pbnRlciB0byBwcmV2aW91cyBkYXRhICovCit7CisgIGludCBpOworICBpbnQgbk5mYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsKKyAgaW50IG5Ob2lzZUZsb29yRW52ZWxvcGVzID0gaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsKKworICAvKiBEZWNvZGUgZmlyc3Qgbm9pc2UgZW52ZWxvcGUgKi8KKworICBpZiAoaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVswXSA9PSAwKSB7CisgICAgRklYUF9TR0wgbm9pc2VMZXZlbCA9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFswXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbk5mYjsgaSsrKSB7CisgICAgICBub2lzZUxldmVsICs9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXTsKKyAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9IG5vaXNlTGV2ZWw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuTmZiOyBpKyspIHsKKyAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSArPSBoX3ByZXZfZGF0YS0+cHJldk5vaXNlTGV2ZWxbaV07CisgICAgfQorICB9CisKKyAgLyogSWYgcHJlc2VudCwgZGVjb2RlIHRoZSBzZWNvbmQgbm9pc2UgZW52ZWxvcGUKKyAgICAgTm90ZTogIG5Ob2lzZUZsb29yRW52ZWxvcGVzIGNhbiBvbmx5IGJlIDEgb3IgMiAqLworCisgIGlmIChuTm9pc2VGbG9vckVudmVsb3BlcyA+IDEpIHsKKyAgICBpZiAoaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVsxXSA9PSAwKSB7CisgICAgICBGSVhQX1NHTCBub2lzZUxldmVsID0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW25OZmJdOworICAgICAgZm9yIChpID0gbk5mYiArIDE7IGkgPCAyKm5OZmI7IGkrKykgeworICAgICAgICBub2lzZUxldmVsICs9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXTsKKyAgICAgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gbm9pc2VMZXZlbDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbk5mYjsgaSsrKSB7CisgICAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICsgbk5mYl0gKz0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGxpbWl0Tm9pc2VMZXZlbHMoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEpOworCisgIC8qIFVwZGF0ZSBwcmV2Tm9pc2VMZXZlbCB3aXRoIHRoZSBsYXN0IG5vaXNlIGVudmVsb3BlICovCisgIGZvciAoaSA9IDA7IGkgPCBuTmZiOyBpKyspCisgICAgaF9wcmV2X2RhdGEtPnByZXZOb2lzZUxldmVsW2ldID0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKyBuTmZiKihuTm9pc2VGbG9vckVudmVsb3Blcy0xKV07CisKKworICAvKiBSZXF1YW50aXplIHRoZSBub2lzZSBmbG9vciBsZXZlbHMgaW4gQ09VUExJTkdfT0ZGLW1vZGUgKi8KKyAgaWYgKCFoX3Nicl9kYXRhLT5jb3VwbGluZykgeworICAgIGludCBuZl9lOworCisgICAgZm9yIChpID0gMDsgaSA8IG5Ob2lzZUZsb29yRW52ZWxvcGVzKm5OZmI7IGkrKykgeworICAgICAgbmZfZSA9IDYgLSAoTE9ORyloX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gKyAxICsgTk9JU0VfRVhQX09GRlNFVDsKKyAgICAgIC8qICsxIHRvIGNvbXBlbnNhdGUgZm9yIGEgbWFudGlzc2Egb2YgMC41IGluc3RlYWQgb2YgMS4wICovCisKKyAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9CisgICAgICAgIChGSVhQX1NHTCkoICgoTE9ORylGTDJGWENPTlNUX1NHTCgwLjVmKSkgKyAgLyogbWFudGlzc2EgKi8KKyAgICAgICAgICAgICAgICAgIChuZl9lICYgTUFTS19FKSApOyAvKiBleHBvbmVudCAqLworCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmggYi9hYWMvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2ZGFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9kZWMuaApAQCAtMCwwICsxLDEwMSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIEVudmVsb3BlIGRlY29kaW5nICAKKyovCisjaWZuZGVmIF9fRU5WX0RFQ19ICisjZGVmaW5lIF9fRU5WX0RFQ19ICisKKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAiZW52X2V4dHIuaCIKKwordm9pZCBkZWNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX2xlZnQsCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX3JpZ2h0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGIyOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuY3BwCkBAIC0wLDAgKzEsMTM5OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIEVudmVsb3BlIGV4dHJhY3Rpb24gIAorICBUaGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlIGFyZSBtb3N0bHkgY2FsbGVkIGJ5IGFwcGx5U0JSKCkuIEFmdGVyIGl0IGlzCisgIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyB2YWxpZCBTQlIgZGF0YSwgc2JyR2V0SGVhZGVyRGF0YSgpIG1pZ2h0IGJlIGNhbGxlZCBpZiB0aGUgY3VycmVudAorICBTQlIgZGF0YSBjb250YWlucyBhbiBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBhcyBvcHBvc2VkIHRvIGEgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4gVGhpcyBmdW5jdGlvbgorICBtYXkgcmV0dXJuIHZhcmlvdXMgZXJyb3IgY29kZXMgYXMgZGVmaW5lZCBpbiAjU0JSX0hFQURFUl9TVEFUVVMgLiBNb3N0IGltcG9ydGFudGx5IGl0IHJldHVybnMgSEVBREVSX1JFU0VUIHdoZW4gZGVjb2RlcgorICBzZXR0aW5ncyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFNCUiBzcGVjaWZpY2F0aW9ucy4gSW4gdGhhdCBjYXNlIGFwcGx5U0JSKCkKKyAgd2lsbCBpbml0aWF0aXRlIHRoZSByZXF1aXJlZCByZS1jb25maWd1cmF0aW9uLgorCisgIFRoZSBoZWFkZXIgZGF0YSBpcyBzdG9yZWQgaW4gYSAjU0JSX0hFQURFUl9EQVRBIHN0cnVjdHVyZS4KKworICBUaGUgYWN0dWFsIFNCUiBkYXRhIGZvciB0aGUgY3VycmVudCBmcmFtZSBpcyBkZWNvZGVkIGludG8gU0JSX0ZSQU1FX0RBVEEgc3R1Y3R1cmVzIGJ5IHNickdldENoYW5uZWxQYWlyRWxlbWVudCgpCisgIFtmb3Igc3RlcmVvIHN0cmVhbXNdIGFuZCBzYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCgpIFtmb3IgbW9ubyBzdHJlYW1zXS4gVGhlcmUgaXMgbm8gZnJhY3Rpb25hbCBhcml0aG1ldGljIGludm9sdmVkLgorCisgIE9uY2UgdGhlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCwgdGhlIGRhdGEgbmVlZHMgdG8gYmUgZnVydGhlciBwcmVwYXJlZCBiZWZvcmUgdGhlIGFjdHVhbCBkZWNvZGluZyBwcm9jZXNzLgorICBUaGlzIGlzIGRvbmUgaW4gZGVjb2RlU2JyRGF0YSgpLgorCisgIFxzYSBEZXNjcmlwdGlvbiBvZiBidWZmZXIgbWFuYWdlbWVudCBpbiBhcHBseVNCUigpLiBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworCisgIDxoMT5BYm91dCB0aGUgU0JSIGRhdGEgZm9ybWF0OjwvaDE+CisKKyAgRWFjaCBmcmFtZSBpbmNsdWRlcyBTQlIgZGF0YSAoc2lkZSBjaGFpbiBpbmZvcm1hdGlvbiksIGFuZCBjYW4gYmUgZWl0aGVyIHRoZSBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBvciB0aGUgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4KKyAgUGFydHMgb2YgdGhlIGRhdGEgY2FuIGJlIHByb3RlY3RlZCBieSBhIENSQyBjaGVja3N1bS4KKworICBcYW5jaG9yIFNCUl9IRUFERVJfRUxFTUVOVCA8aDI+VGhlIFNCUl9IRUFERVJfRUxFTUVOVDwvaDI+CisKKyAgVGhlIFNCUl9IRUFERVJfRUxFTUVOVCBjYW4gYmUgdHJhbnNtaXR0ZWQgd2l0aCBldmVyeSBmcmFtZSwgaG93ZXZlciwgaXQgdHlwaWNhbGx5IGlzIHNlbmQgZXZlcnkgc2Vjb25kIG9yIHNvLiBJdCBjb250YWlucyBmdW5kYW1lbnRhbAorICBpbmZvcm1hdGlvbiBzdWNoIGFzIFNCUiBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIGZyZXF1ZW5jeSByYW5nZSBhcyB3ZWxsIGFzIGNvbnRyb2wgc2lnbmFscyB0aGF0IGRvIG5vdCByZXF1aXJlIGZyZXF1ZW50IGNoYW5nZXMuIEl0IGFsc28KKyAgaW5jbHVkZXMgdGhlIFxyZWYgU0JSX1NUQU5EQVJEX0VMRU1FTlQuCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIGluIGEgY3VycmVudCBTQlJfSEVBREVSX0VMRU1FTlQgYW5kIHRoZSBwcmV2aW91cyBTQlJfSEVBREVSX0VMRU1FTlQsIHRoZSBTQlIgZGVjb2RlciBtaWdodCBuZWVkCisgIHRvIGJlIHJlc2V0IGFuZCByZWNvbmZpZ3VyZWQgKGUuZy4gbmV3IHRhYmxlcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQpLgorCisgIFxhbmNob3IgU0JSX1NUQU5EQVJEX0VMRU1FTlQgPGgyPlRoZSBTQlJfU1RBTkRBUkRfRUxFTUVOVDwvaDI+CisKKyAgVGhpcyBkYXRhIGNhbiBiZSBzdWJkaXZpZGVkIGludG8gInNpZGUgaW5mbyIgYW5kICJyYXcgZGF0YSIsIHdoZXJlIHNpZGUgaW5mbyBpcyBkZWZpbmVkIGFzIHNpZ25hbHMgbmVlZGVkIHRvIGRlY29kZSB0aGUgcmF3IGRhdGEKKyAgYW5kIHNvbWUgZGVjb2RlciB0dW5pbmcgc2lnbmFscy4gUmF3IGRhdGEgaXMgcmVmZXJyZWQgdG8gYXMgUENNIGFuZCBIdWZmbWFuIGNvZGVkIGVudmVsb3BlIGFuZCBub2lzZSBmbG9vciBlc3RpbWF0ZXMuIFRoZSBzaWRlIGluZm8gYWxzbworICBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGltZS1mcmVxdWVuY3kgZ3JpZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCisKKyAgXHNhIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CisqLworCisjaW5jbHVkZSAiZW52X2V4dHIuaCIKKworI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJzYnJfcm9tLmgiCisjaW5jbHVkZSAiaHVmZl9kZWMuaCIKKworCisjaW5jbHVkZSAicHNiaXRkZWMuaCIKKworI2RlZmluZSBEUk1fUEFSQU1FVFJJQ19TVEVSRU8gICAwCisjZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgIDIKKworCitzdGF0aWMgaW50IGV4dHJhY3RGcmFtZUluZm8gKEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBuck9mQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKK3N0YXRpYyBpbnQgc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CisKK3N0YXRpYyB2b2lkIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOworCitzdGF0aWMgdm9pZCBzYnJHZXROb2lzZUZsb29yRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcyk7CisKK3N0YXRpYyBpbnQgY2hlY2tGcmFtZUluZm8gKEZSQU1FX0lORk8gKnBGcmFtZUluZm8sIGludCBudW1iZXJPZlRpbWVTbG90cywgaW50IG92ZXJsYXAsIGludCB0aW1lU3RlcCk7CisKK1NCUl9FUlJPUgoraW5pdEhlYWRlckRhdGEgKAorICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBoSGVhZGVyRGF0YSwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgIGZsYWdzCisgICAgICAgICkKK3sKKyAgSEFORExFX0ZSRVFfQkFORF9EQVRBIGhGcmVxID0gJmhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGE7CisgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKKyAgaW50IG51bUFuYWx5c2lzQmFuZHM7CisKKyAgaWYgKCBzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCApIHsKKyAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlID0gc2FtcGxlUmF0ZU91dDw8MTsKKyAgICBudW1BbmFseXNpc0JhbmRzID0gMzI7CisgIH0gZWxzZSB7CisgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSA9IHNhbXBsZVJhdGVPdXQ7CisgICAgaWYgKCAoc2FtcGxlUmF0ZU91dD4+MSkgPT0gc2FtcGxlUmF0ZUluKSB7CisgICAgICAvKiAxOjIgKi8KKyAgICAgIG51bUFuYWx5c2lzQmFuZHMgPSAzMjsKKyAgICB9IGVsc2UgaWYgKCAoc2FtcGxlUmF0ZU91dD4+MikgPT0gc2FtcGxlUmF0ZUluICkgeworICAgICAgLyogMTo0ICovCisgICAgICBudW1BbmFseXNpc0JhbmRzID0gMzI7CisgICAgfSBlbHNlIGlmICggKHNhbXBsZVJhdGVPdXQqMyk+PjMgPT0gKHNhbXBsZVJhdGVJbio4KT4+MyApIHsKKyAgICAgIC8qIDM6OCwgMy80IGNvcmUgZnJhbWUgbGVuZ3RoICovCisgICAgICBudW1BbmFseXNpc0JhbmRzID0gMjQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICAvKiBGaWxsIGluIGRlZmF1bHQgdmFsdWVzIGZpcnN0ICovCisgIGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgICAgICAgICAgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOworICBoSGVhZGVyRGF0YS0+c3RhdHVzICAgICAgICAgICAgID0gMDsKKyAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnICAgICA9IDA7CisKKyAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiAgICAgPSAxOworICBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kICAgICAgICA9IDA7CisgIGhIZWFkZXJEYXRhLT5ic19pbmZvLnNicl9wcmVwcm9jZXNzaW5nID0gMDsKKworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdGFydEZyZXEgICAgICAgPSA1OworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdG9wRnJlcSAgICAgICAgPSAwOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGUgICAgICAgPSAyOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5hbHRlclNjYWxlICAgICAgPSAxOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyAgICAgPSAyOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMgICAgPSAyOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnMgICAgPSAyOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5pbnRlcnBvbEZyZXEgICAgPSAxOworICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zbW9vdGhpbmdMZW5ndGggPSAxOworCisgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCA9IChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgPyAxIDogMjsKKworICAvKiBTZXR1cCBwb2ludGVycyB0byBmcmVxdWVuY3kgYmFuZCB0YWJsZXMgKi8KKyAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0gID0gaEZyZXEtPmZyZXFCYW5kVGFibGVMbzsKKyAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0gPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZUhpOworCisgIC8qIFBhdGNoIHNvbWUgZW50cmllcyAqLworICBpZiAoc2FtcGxlUmF0ZU91dCA+IDI0MDAwKSB7ICAgIC8qIFRyaWdnZXIgYW4gZXJyb3IgaWYgU0JSIGlzIGdvaW5nIHRvIGJlIHByb2Nlc3NlZCB3aXRob3V0ICAgICAqLworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSA9IDc7ICAgLyogICBoYXZpbmcgcmVhZCB0aGVzZSBmcmVxdWVuY3kgdmFsdWVzIGZyb20gYml0IHN0cmVhbSBiZWZvcmUuICovCisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RvcEZyZXEgID0gMzsKKyAgfQorCisgIC8qIE9uZSBTQlIgdGltZXNsb3QgY29ycmVzcG9uZHMgdG8gdGhlIGFtb3VudCBvZiBzYW1wbGVzIGVxdWFsIHRvIHRoZSBhbW91bnQgb2YgYW5hbHlzaXMgYmFuZHMsIGRpdmlkZWQgYnkgdGhlIHRpbWVzdGVwLiAqLworICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzID0gKHNhbXBsZXNQZXJGcmFtZS9udW1BbmFseXNpc0JhbmRzKSA+PiAoaEhlYWRlckRhdGEtPnRpbWVTdGVwIC0gMSk7CisgIGlmIChoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzID4gKDE2KSkgeworICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgPSBudW1BbmFseXNpc0JhbmRzOworCitiYWlsOgorICByZXR1cm4gc2JyRXJyb3I7Cit9CisKKworLyohCisgIFxicmllZiAgIEluaXRpYWxpemUgdGhlIFNCUl9QUkVWX0ZSQU1FX0RBVEEgc3RydWN0CisqLwordm9pZAoraW5pdFNiclByZXZGcmFtZURhdGEgKEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX1BSRVZfRlJBTUVfREFUQSAqLworICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZyYW1lbGVuZ3RoIGluIFNCUi10aW1lc2xvdHMgKi8KK3sKKyAgaW50IGk7CisKKyAgLyogU2V0IHByZXZpb3VzIGVuZXJneSBhbmQgbm9pc2UgbGV2ZWxzIHRvIDAgZm9yIHRoZSBjYXNlCisgICAgIHRoYXQgZGVjb2Rpbmcgc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgYSBiaXRzdHJlYW0gKi8KKyAgZm9yIChpPTA7IGkgPCBNQVhfRlJFUV9DT0VGRlM7IGkrKykKKyAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gKEZJWFBfREJMKTA7CisgIGZvciAoaT0wOyBpIDwgTUFYX05PSVNFX0NPRUZGUzsgaSsrKQorICAgIGhfcHJldl9kYXRhLT5wcmV2Tm9pc2VMZXZlbFtpXSA9IChGSVhQX0RCTCkwOworICBmb3IgKGk9MDsgaSA8IE1BWF9JTlZGX0JBTkRTOyBpKyspCisgICAgaF9wcmV2X2RhdGEtPnNicl9pbnZmX21vZGVbaV0gPSBJTlZGX09GRjsKKworICBoX3ByZXZfZGF0YS0+c3RvcFBvcyA9IHRpbWVTbG90czsKKyAgaF9wcmV2X2RhdGEtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOworICBoX3ByZXZfZGF0YS0+YW1wUmVzID0gMDsKK30KKworCisvKiEKKyAgXGJyaWVmICAgUmVhZCBoZWFkZXIgZGF0YSBmcm9tIGJpdHN0cmVhbQorCisgIFxyZXR1cm4gIGVycm9yIHN0YXR1cyAtIDAgaWYgb2sKKyovCitTQlJfSEVBREVSX1NUQVRVUworc2JyR2V0SGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLAorICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgZklzU2JyRGF0YSkKK3sKKyAgU0JSX0hFQURFUl9EQVRBX0JTICpwQnNEYXRhOworICBTQlJfSEVBREVSX0RBVEFfQlMgbGFzdEhlYWRlcjsKKyAgU0JSX0hFQURFUl9EQVRBX0JTX0lORk8gbGFzdEluZm87CisgIGludCBoZWFkZXJFeHRyYTE9MCwgaGVhZGVyRXh0cmEyPTA7CisKKyAgLyogQ29weSBTQlIgYml0IHN0cmVhbSBoZWFkZXIgdG8gdGVtcG9yYXJ5IGhlYWRlciAqLworICBsYXN0SGVhZGVyID0gaEhlYWRlckRhdGEtPmJzX2RhdGE7CisgIGxhc3RJbmZvICAgPSBoSGVhZGVyRGF0YS0+YnNfaW5mbzsKKworICAvKiBSZWFkIG5ldyBoZWFkZXIgZnJvbSBiaXRzdHJlYW0gKi8KKyAgeworICAgIHBCc0RhdGEgPSAmaEhlYWRlckRhdGEtPmJzX2RhdGE7CisgIH0KKworICB7CisgICAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICB9CisKKyAgcEJzRGF0YS0+c3RhcnRGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgNCk7CisgIHBCc0RhdGEtPnN0b3BGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgNCk7CisKKyAgeworICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQgPSBGREtyZWFkQml0cyAoaEJzLCAzKTsKKyAgICBGREtyZWFkQml0cyAoaEJzLCAyKTsKKyAgfQorCisgIGhlYWRlckV4dHJhMSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICBoZWFkZXJFeHRyYTIgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKKworICAvKiBIYW5kbGUgZXh0cmEgaGVhZGVyIGluZm9ybWF0aW9uICovCisgIGlmKCBoZWFkZXJFeHRyYTEpIAorICB7CisgICAgcEJzRGF0YS0+ZnJlcVNjYWxlID0gRkRLcmVhZEJpdHMgKGhCcywgMik7CisgICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICAgIHBCc0RhdGEtPm5vaXNlX2JhbmRzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7CisgIH0KKyAgZWxzZSB7CisgICAgcEJzRGF0YS0+ZnJlcVNjYWxlICAgPSAyOworICAgIHBCc0RhdGEtPmFsdGVyU2NhbGUgID0gMTsKKyAgICBwQnNEYXRhLT5ub2lzZV9iYW5kcyA9IDI7CisgIH0KKworICBpZiAoaGVhZGVyRXh0cmEyKSB7CisgICAgcEJzRGF0YS0+bGltaXRlckJhbmRzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7CisgICAgcEJzRGF0YS0+bGltaXRlckdhaW5zID0gRkRLcmVhZEJpdHMgKGhCcywgMik7CisgICAgcEJzRGF0YS0+aW50ZXJwb2xGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgICAgcEJzRGF0YS0+c21vb3RoaW5nTGVuZ3RoID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgIH0KKyAgZWxzZSB7CisgICAgcEJzRGF0YS0+bGltaXRlckJhbmRzICAgID0gMjsKKyAgICBwQnNEYXRhLT5saW1pdGVyR2FpbnMgICAgPSAyOworICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSAgICA9IDE7CisgICAgcEJzRGF0YS0+c21vb3RoaW5nTGVuZ3RoID0gMTsKKyAgfQorCisgIC8qIExvb2sgZm9yIG5ldyBzZXR0aW5ncy4gSUVDIDE0NDk2LTMsIDQuNi4xOC4zLjEgKi8KKyAgaWYoaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSAhPSBTQlJfQUNUSVZFIHx8CisgICAgIGxhc3RIZWFkZXIuc3RhcnRGcmVxICAgIT0gcEJzRGF0YS0+c3RhcnRGcmVxICAgfHwKKyAgICAgbGFzdEhlYWRlci5zdG9wRnJlcSAgICAhPSBwQnNEYXRhLT5zdG9wRnJlcSAgICB8fAorICAgICBsYXN0SGVhZGVyLmZyZXFTY2FsZSAgICE9IHBCc0RhdGEtPmZyZXFTY2FsZSAgIHx8CisgICAgIGxhc3RIZWFkZXIuYWx0ZXJTY2FsZSAgIT0gcEJzRGF0YS0+YWx0ZXJTY2FsZSAgfHwKKyAgICAgbGFzdEhlYWRlci5ub2lzZV9iYW5kcyAhPSBwQnNEYXRhLT5ub2lzZV9iYW5kcyB8fAorICAgICBsYXN0SW5mby54b3Zlcl9iYW5kICAgICE9IGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQpIHsKKyAgICByZXR1cm4gSEVBREVSX1JFU0VUOyAvKiBOZXcgc2V0dGluZ3MgKi8KKyAgfQorCisgIHJldHVybiBIRUFERVJfT0s7Cit9CisKKy8qIQorICBcYnJpZWYgICBHZXQgbWlzc2luZyBoYXJtb25pY3MgcGFyYW1ldGVycyAob25seSB1c2VkIGZvciBBQUMrU0JSKQorCisgIFxyZXR1cm4gIGVycm9yIHN0YXR1cyAtIDAgaWYgb2sKKyovCitpbnQKK3NickdldFN5bnRoZXRpY0NvZGVkRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcykKK3sKKyAgaW50IGksIGJpdHNSZWFkID0gMDsKKworICBpbnQgZmxhZyA9IEZES3JlYWRCaXRzKGhCcywxKTsKKyAgYml0c1JlYWQrKzsKKworICBpZihmbGFnKXsKKyAgICBmb3IoaT0wO2k8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdO2krKyl7CisgICAgICBoRnJhbWVEYXRhLT5hZGRIYXJtb25pY3NbaV0gID0gRkRLcmVhZEJpdHMgKGhCcywgMSApOworICAgICAgYml0c1JlYWQrKzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZm9yKGk9MDsgaTxNQVhfRlJFUV9DT0VGRlM7IGkrKykKKyAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSAgPSAwOworICB9CisgIHJldHVybihiaXRzUmVhZCk7Cit9CisKKy8qIQorICBcYnJpZWYgICAgICBSZWFkcyBleHRlbnNpb24gZGF0YSBmcm9tIHRoZSBiaXRzdHJlYW0KKworICBUaGUgYml0c3RyZWFtIGZvcm1hdCBhbGxvd3MgdXAgdG8gNCBraW5kcyBvZiBleHRlbmRlZCBkYXRhIGVsZW1lbnQuCisgIEV4dGVuZGVkIGRhdGEgbWF5IGNvbnRhaW4gc2V2ZXJhbCBlbGVtZW50cywgZWFjaCBpZGVudGlmaWVkIGJ5IGEgMi1iaXQtSUQuCisgIFNvIGZhciwgbm8gZXh0ZW5kZWQgZGF0YSBlbGVtZW50cyBhcmUgZGVmaW5lZCBoZW5jZSB0aGUgZmlyc3QgMiBwYXJhbWV0ZXJzCisgIGFyZSB1bnVzZWQuIFRoZSBkYXRhIHNob3VsZCBiZSBza2lwcGVkIGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgbnVtYmVyCisgIG9mIHJlYWQgYml0cyBmb3IgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIGFwcGx5U0JSKCkuCisqLworc3RhdGljIGludCAgZXh0cmFjdEV4dGVuZGVkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgLyohPCBoYW5kbGUgdG8gU0JSIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcyAgICAgICAgICAgICAvKiE8IEhhbmRsZSB0byB0aGUgYml0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjICAgICAvKiE8IFBhcmFtZXRyaWMgU3RlcmVvIERlY29kZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIElOVCBuQml0c0xlZnQ7CisgIGludCBleHRlbmRlZF9kYXRhOworICBpbnQgaSwgZnJhbWVPayA9IDE7CisKKworICBleHRlbmRlZF9kYXRhID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICBpZiAoZXh0ZW5kZWRfZGF0YSkgeworICAgIGludCBjbnQ7CisgICAgaW50IGJQc1JlYWQgPSAwOworCisgICAgY250ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBpZiAoY250ID09ICgxPDw0KS0xKQorICAgICAgY250ICs9IEZES3JlYWRCaXRzKGhCcywgOCk7CisKKworICAgIG5CaXRzTGVmdCA9IDggKiBjbnQ7CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIGNudCAqLworICAgIGlmIChuQml0c0xlZnQgPiAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKSB7CisgICAgICAvKiBsaW1pdCBuQml0c0xlZnQgKi8KKyAgICAgIG5CaXRzTGVmdCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgICAvKiBzZXQgZnJhbWUgZXJyb3IgKi8KKyAgICAgIGZyYW1lT2sgPSAwOworICAgIH0KKworICAgIHdoaWxlIChuQml0c0xlZnQgPiA3KSB7CisgICAgICBpbnQgZXh0ZW5zaW9uX2lkID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgIG5CaXRzTGVmdCAtPSAyOworCisgICAgICBzd2l0Y2goZXh0ZW5zaW9uX2lkKSB7CisKKworCisgICAgICAgIGNhc2UgRVhURU5TSU9OX0lEX1BTX0NPRElORzoKKworICAgICAgICAvKiBSZWFkIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KKworICAgICAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgeworICAgICAgICAgIGlmKGJQc1JlYWQgJiYgIWhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic0RhdGFbaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3RdLm1wZWcuYlBzSGVhZGVyVmFsaWQpIHsKKyAgICAgICAgICAgIGNudCA9IG5CaXRzTGVmdCA+PiAzOyAvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykKKyAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgICAgICAgIG5CaXRzTGVmdCAtPSBjbnQgKiA4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuQml0c0xlZnQgLT0gUmVhZFBzRGF0YShoUGFyYW1ldHJpY1N0ZXJlb0RlYywgaEJzLCBuQml0c0xlZnQpOworICAgICAgICAgICAgYlBzUmVhZCA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZXRlY3RlZCwgY291bGQgc2V0IGNoYW5uZWxNb2RlIGFjY29yZGluZ2x5IGhlcmUgICovCisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qICJUaGUgdXNhZ2Ugb2YgdGhpcyBwYXJhbWV0cmljIHN0ZXJlbyBleHRlbnNpb24gdG8gSEUtQUFDIGlzICAgICAgICAgKi8KKyAgICAgICAgICAvKiBzaWduYWxsZWQgaW1wbGljaXRseSBpbiB0aGUgYml0c3RyZWFtLiBIZW5jZSwgaWYgYW4gc2JyX2V4dGVuc2lvbigpICovCisgICAgICAgICAgLyogd2l0aCBic19leHRlbnNpb25faWQ9PUVYVEVOU0lPTl9JRF9QUyBpcyBmb3VuZCBpbiB0aGUgU0JSIHBhcnQgb2YgICAqLworICAgICAgICAgIC8qIHRoZSBiaXRzdHJlYW0sIGEgZGVjb2RlciBzdXBwb3J0aW5nIHRoZSBjb21iaW5hdGlvbiBvZiBTQlIgYW5kIFBTICAgKi8KKyAgICAgICAgICAvKiBzaGFsbCBvcGVyYXRlIHRoZSBQUyB0b29sIHRvIGdlbmVyYXRlIGEgc3RlcmVvIG91dHB1dCBzaWduYWwuIiAgICAgICovCisgICAgICAgICAgLyogc291cmNlOiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNudCA9IG5CaXRzTGVmdCA+PiAzOyAvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzICovCisgICAgICAgIGZvciAoaT0wOyBpPGNudDsgaSsrKQorICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgIG5CaXRzTGVmdCAtPSBjbnQgKiA4OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobkJpdHNMZWZ0IDwgMCkgeworICAgICAgZnJhbWVPayA9IDA7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogUmVhZCBmaWxsIGJpdHMgZm9yIGJ5dGUgYWxpZ25tZW50ICovCisgICAgICBGREtyZWFkQml0cyhoQnMsIG5CaXRzTGVmdCk7CisgICAgfQorICB9CisKK2JhaWw6CisgIHJldHVybiAoZnJhbWVPayk7Cit9CisKKworLyohCisgIFxicmllZiAgIFJlYWQgYml0c3RyZWFtIGVsZW1lbnRzIG9mIG9uZSBjaGFubmVsCisKKyAgXHJldHVybiAgU2JyRnJhbWVPSzogIDE9b2ssIDA9ZXJyb3IKKyovCitpbnQKK3NickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsICAgICAgICAgICAvKiE8IENvbnRyb2wgZGF0YSBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgICAgICAgICAgLyohPCBIYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvRGVjLCAvKiE8IEhhbmRsZSB0byBQUyBkZWNvZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGk7CisKKworICBoRnJhbWVEYXRhLT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKKworICB7CisgICAgLyogUmVzZXJ2ZWQgYml0cyAqLworICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCisgICAgICBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgaWYgKGZsYWdzICYgU0JSREVDX1NZTlRBWF9TQ0FMKSB7CisgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGZsYWdzICYgU0JSREVDX1NZTlRBWF9TQ0FMKSB7CisgICAgRkRLcmVhZEJpdHMgKGhCcywgMSk7ICAgICAvKiBic19jb3VwbGluZyAqLworICB9CisKKyAgLyoKKyAgICBHcmlkIGNvbnRyb2wKKyAgKi8KKyAgaWYgKCAhZXh0cmFjdEZyYW1lSW5mbyAoIGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIDEsIGZsYWdzKSApCisgICByZXR1cm4gMDsKKworICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGEtPmZyYW1lSW5mbywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSApCisgICAgcmV0dXJuIDA7CisKKworICAvKgorICAgIEZldGNoIGRvbWFpbiB2ZWN0b3JzICh0aW1lIG9yIGZyZXF1ZW5jeSBkaXJlY3Rpb24gZm9yIGRlbHRhLWNvZGluZykKKyAgKi8KKyAgc2JyR2V0RGlyZWN0aW9uQ29udHJvbERhdGEgKGhGcmFtZURhdGEsIGhCcyk7CisKKyAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICBoRnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0KKyAgICAgIChJTlZGX01PREUpIEZES3JlYWRCaXRzIChoQnMsIDIpOworICB9CisKKworCisgIC8qIHJhdyBkYXRhICovCisgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YSwgaEJzLCBmbGFncykgKQorICAgIHJldHVybiAwOworCisKKyAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCBoQnMpOworCisgIHNickdldFN5bnRoZXRpY0NvZGVkRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YSwgaEJzKTsKKworICB7CisgICAgLyogc2JyIGV4dGVuZGVkIGRhdGEgKi8KKyAgICBpZiAoISBleHRyYWN0RXh0ZW5kZWREYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhQYXJhbWV0cmljU3RlcmVvRGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworCisvKiEKKyAgXGJyaWVmICAgICAgUmVhZCBiaXRzdHJlYW0gZWxlbWVudHMgb2YgYSBjaGFubmVsIHBhaXIKKyAgXHJldHVybiAgICAgU2JyRnJhbWVPSworKi8KK2ludAorc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhTGVmdCwgLyohPCBEeW5hbWljIGNvbnRyb2wgZGF0YSBmb3IgZmlyc3QgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFSaWdodCwvKiE8IER5bmFtaWMgY29udHJvbCBkYXRhIGZvciBzZWNvbmQgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCApCit7CisgIGludCBpLCBiaXQ7CisKKworICAvKiBSZXNlcnZlZCBiaXRzICovCisgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCisgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBGREtyZWFkQml0cyhoQnMsIDQpOworICB9CisKKyAgLyogUmVhZCBjb3VwbGluZyBmbGFnICovCisgIGJpdCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworCisgIGlmIChiaXQpIHsKKyAgICBoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcgPSBDT1VQTElOR19MRVZFTDsKKyAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfQkFMOworICB9CisgIGVsc2UgeworICAgIGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKKyAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOworICB9CisKKworICAvKgorICAgIEdyaWQgY29udHJvbAorICAqLworICBpZiAoICFleHRyYWN0RnJhbWVJbmZvIChoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgMiwgZmxhZ3MpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkgKQorICAgIHJldHVybiAwOworCisgIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKKyAgICBGREttZW1jcHkgKCZoRnJhbWVEYXRhUmlnaHQtPmZyYW1lSW5mbywgJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgaEZyYW1lRGF0YVJpZ2h0LT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID0gaEZyYW1lRGF0YUxlZnQtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCAhZXh0cmFjdEZyYW1lSW5mbyAoaEJzLCBoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCAyLCBmbGFncykgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGFSaWdodC0+ZnJhbWVJbmZvLCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzLCBvdmVybGFwLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXApICkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLyoKKyAgICBGZXRjaCBkb21haW4gdmVjdG9ycyAodGltZSBvciBmcmVxdWVuY3kgZGlyZWN0aW9uIGZvciBkZWx0YS1jb2RpbmcpCisgICovCisgIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChoRnJhbWVEYXRhTGVmdCwgaEJzKTsKKyAgc2JyR2V0RGlyZWN0aW9uQ29udHJvbERhdGEgKGhGcmFtZURhdGFSaWdodCwgaEJzKTsKKworICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgeworICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlW2ldID0gKElOVkZfTU9ERSkgRkRLcmVhZEJpdHMgKGhCcywgMik7CisgIH0KKworICBpZiAoaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nKSB7CisgICAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyX2ludmZfbW9kZVtpXSA9IGhGcmFtZURhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlW2ldOworICAgIH0KKworCisgICAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzLCBmbGFncykgKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzYnJHZXROb2lzZUZsb29yRGF0YSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOworCisgICAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpICkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGVsc2UgeworCisgICAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyX2ludmZfbW9kZVtpXSA9IChJTlZGX01PREUpIEZES3JlYWRCaXRzIChoQnMsIDIpOworICAgIH0KKworCisKKyAgICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKSApCisgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMsIGZsYWdzKSApCisgICAgICByZXR1cm4gMDsKKworICAgIHNickdldE5vaXNlRmxvb3JEYXRhIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7CisKKyAgfQorICBzYnJHZXROb2lzZUZsb29yRGF0YSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzKTsKKworICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOworICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzKTsKKworICB7CisgICAgaWYgKCEgZXh0cmFjdEV4dGVuZGVkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gMTsKK30KKworCisKKworLyohCisgIFxicmllZiAgIFJlYWQgZGlyZWN0aW9uIGNvbnRyb2wgZGF0YSBmcm9tIGJpdHN0cmVhbQorKi8KK3ZvaWQKK3NickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsgaSsrKSB7CisgICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2ldID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKKyAgICBoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0gPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKKyAgfQorfQorCisKKworLyohCisgIFxicmllZiAgIFJlYWQgbm9pc2UtZmxvb3ItbGV2ZWwgZGF0YSBmcm9tIGJpdHN0cmVhbQorKi8KK3ZvaWQKK3NickdldE5vaXNlRmxvb3JEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoX2ZyYW1lX2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfRlJBTUVfREFUQSAqLworICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworeworICBpbnQgaSxqOworICBpbnQgZGVsdGE7CisgIENPVVBMSU5HX01PREUgY291cGxpbmc7CisgIGludCBub05vaXNlQmFuZHMgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmI7CisKKyAgSHVmZm1hbiBoY2Jfbm9pc2VGOworICBIdWZmbWFuIGhjYl9ub2lzZTsKKyAgaW50IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CisKKyAgY291cGxpbmcgPSBoX2ZyYW1lX2RhdGEtPmNvdXBsaW5nOworCisKKyAgLyoKKyAgICBTZWxlY3QgaHVmZm1hbiBjb2RlYm9vayBkZXBlbmRpbmcgb24gY291cGxpbmcgbW9kZQorICAqLworICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CisgICAgaGNiX25vaXNlID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVQ7CisgICAgaGNiX25vaXNlRiA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExRjsgIC8qICJzYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFGIiAqLworICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAxOworICB9CisgIGVsc2UgeworICAgIGhjYl9ub2lzZSA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VMZXZlbDExVDsKKyAgICBoY2Jfbm9pc2VGID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsgICAgLyogInNicl9odWZmQm9va19Ob2lzZUxldmVsMTFGIiAqLworICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAwOworICB9CisKKyAgLyoKKyAgICBSZWFkIHJhdyBub2lzZS1lbnZlbG9wZSBkYXRhCisgICovCisgIGZvciAoaT0wOyBpPGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisKKworICAgIGlmIChoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0gPT0gMCkgeworICAgICAgaWYgKGNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgeworICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpKm5vTm9pc2VCYW5kc10gPQorICAgICAgICAgIChGSVhQX1NHTCkgKCgoaW50KUZES3JlYWRCaXRzIChoQnMsIDUpKSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpKm5vTm9pc2VCYW5kc10gPQorICAgICAgICAgIChGSVhQX1NHTCkgKGludClGREtyZWFkQml0cyAoaEJzLCA1KTsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMTsgaiA8IG5vTm9pc2VCYW5kczsgaisrKSB7CisgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZUYsIGhCcyk7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kqbm9Ob2lzZUJhbmRzK2pdID0gKEZJWFBfU0dMKSAoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yIChqID0gMDsgaiA8IG5vTm9pc2VCYW5kczsgaisrKSB7CisgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZSwgaEJzKTsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHMral0gPSAoRklYUF9TR0wpIChkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICAgUmVhZCBlbnZlbG9wZSBkYXRhIGZyb20gYml0c3RyZWFtCisqLworc3RhdGljIGludAorc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCisgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncykKK3sKKyAgaW50IGksIGo7CisgIFVDSEFSIG5vX2JhbmRbTUFYX0VOVkVMT1BFU107CisgIGludCBkZWx0YSA9IDA7CisgIGludCBvZmZzZXQgPSAwOworICBDT1VQTElOR19NT0RFIGNvdXBsaW5nID0gaF9mcmFtZV9kYXRhLT5jb3VwbGluZzsKKyAgaW50IGFtcFJlcyA9IGhIZWFkZXJEYXRhLT5ic19pbmZvLmFtcFJlc29sdXRpb247CisgIGludCBuRW52ZWxvcGVzID0gaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsKKyAgaW50IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CisgIGludCBzdGFydF9iaXRzLCBzdGFydF9iaXRzX2JhbGFuY2U7CisgIEh1ZmZtYW4gaGNiX3QsIGhjYl9mOworCisgIGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9ycyA9IDA7CisKKyAgaWYgKCAoaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJhbWVDbGFzcyA9PSAwKSAmJiAobkVudmVsb3BlcyA9PSAxKSApIHsKKyAgICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpCisgICAgICBhbXBSZXMgPSBoX2ZyYW1lX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7CisgICAgZWxzZQorICAgICAgYW1wUmVzID0gMDsKKyAgfQorICBoX2ZyYW1lX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPSBhbXBSZXM7CisKKyAgLyoKKyAgICBTZXQgbnVtYmVyIG9mIGJpdHMgZm9yIGZpcnN0IHZhbHVlIGRlcGVuZGluZyBvbiBhbXBsaXR1ZGUgcmVzb2x1dGlvbgorICAqLworICBpZihhbXBSZXMgPT0gMSkKKyAgeworICAgIHN0YXJ0X2JpdHMgPSA2OworICAgIHN0YXJ0X2JpdHNfYmFsYW5jZSA9IDU7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhcnRfYml0cyA9IDc7CisgICAgc3RhcnRfYml0c19iYWxhbmNlID0gNjsKKyAgfQorCisgIC8qCisgICAgQ2FsY3VsYXRlIG51bWJlciBvZiB2YWx1ZXMgZm9yIGVhY2ggZW52ZWxvcGUgYW5kIGFsbHRvZ2V0aGVyCisgICovCisgIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspIHsKKyAgICBub19iYW5kW2ldID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiW2hfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV1dOworICAgIGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9ycyArPSBub19iYW5kW2ldOworICB9CisgIGlmIChoX2ZyYW1lX2RhdGEtPm5TY2FsZUZhY3RvcnMgPiBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUykKKyAgICByZXR1cm4gMDsKKworICAvKgorICAgIFNlbGVjdCBIdWZmbWFuIGNvZGVib29rIGRlcGVuZGluZyBvbiBjb3VwbGluZyBtb2RlIGFuZCBhbXBsaXR1ZGUgcmVzb2x1dGlvbgorICAqLworICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CisgICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDE7CisgICAgaWYgKGFtcFJlcyA9PSAwKSB7CisgICAgICBoY2JfdCA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTEwVDsKKyAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBGOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFUOworICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUY7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAwOworICAgIGlmIChhbXBSZXMgPT0gMCkgeworICAgICAgaGNiX3QgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBUOworICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBGOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExVDsKKyAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsKKyAgICB9CisgIH0KKworICAvKgorICAgIE5vdyByZWFkIHJhdyBlbnZlbG9wZSBkYXRhCisgICovCisgIGZvciAoaiA9IDAsIG9mZnNldCA9IDA7IGogPCBuRW52ZWxvcGVzOyBqKyspIHsKKworCisgICAgaWYgKGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tqXSA9PSAwKSB7CisgICAgICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldF0gPQorICAgICAgICAgIChGSVhQX1NHTCkgKCggKGludClGREtyZWFkQml0cyhoQnMsIHN0YXJ0X2JpdHNfYmFsYW5jZSkpIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldF0gPQorICAgICAgICAgIChGSVhQX1NHTCkgKGludClGREtyZWFkQml0cyAoaEJzLCBzdGFydF9iaXRzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAoMSAtIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tqXSk7IGkgPCBub19iYW5kW2pdOyBpKyspIHsKKworICAgICAgaWYgKGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tqXSA9PSAwKSB7CisgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9mLCBoQnMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl90LCBoQnMpOworICAgICAgfQorCisgICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtvZmZzZXQgKyBpXSA9IChGSVhQX1NHTCkgKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOworICAgIH0KKyAgICBvZmZzZXQgKz0gbm9fYmFuZFtqXTsKKyAgfQorCisjaWYgRU5WX0VYUF9GUkFDVAorICAvKiBDb252ZXJ0IGZyb20gaW50IHRvIHNjYWxlZCBmcmFjdCAoRU5WX0VYUF9GUkFDVCBiaXRzIGZvciB0aGUgZnJhY3Rpb25hbCBwYXJ0KSAqLworICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzOyBpKyspIHsKKyAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtpXSA8PD0gRU5WX0VYUF9GUkFDVDsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIDE7Cit9CisKKworLy9zdGF0aWMgY29uc3QgRlJBTUVfSU5GTyB2X2ZyYW1lX2luZm8xXzggPSB7IDAsIDEsIHswLCA4fSwgezF9LCAtMSwgMSwgezAsIDh9IH07CitzdGF0aWMgY29uc3QgRlJBTUVfSU5GTyB2X2ZyYW1lX2luZm8yXzggPSB7IDAsIDIsIHswLCA0LCA4fSwgezEsIDF9LCAtMSwgMiwgezAsIDQsIDh9IH07CitzdGF0aWMgY29uc3QgRlJBTUVfSU5GTyB2X2ZyYW1lX2luZm80XzggPSB7IDAsIDQsIHswLCAyLCA0LCA2LCA4fSwgezEsIDEsIDEsIDF9LCAtMSwgMiwgezAsIDQsIDh9IH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgIEdlbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheSB2ZXJzaW9uCisKKyAgXHJldHVybiAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIHN0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seSAoIEZSQU1FX0lORk8gKmhTYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBpbnQgbkVudiwgaSwgdHJhbklkeDsKKyAgICBjb25zdCBpbnQgKnBUYWJsZTsKKworICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfOFt0cmFuUG9zSW50ZXJuYWxdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTZbdHJhblBvc0ludGVybmFsXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIC8qIGluIGNhc2UgYXNzZXJ0aW9uIGNoZWNrcyBhcmUgZGlzYWJsZWQsIGZvcmNlIGEgZGVmaW5pdGUgbWVtb3J5IGZhdWx0IGF0IGZpcnN0IGFjY2VzcyAqLworICAgICAgICAgICAgcFRhYmxlID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGxvb2sgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiB0YWJsZSAqLworICAgIG5FbnYgPSBwVGFibGVbMF07CisgICAgLyogbG9vayB1cCBlbnZlbG9wZSBkaXN0cmlidXRpb24gaW4gdGFibGUgKi8KKyAgICBmb3IgKGk9MTsgaTxuRW52OyBpKyspCisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSsyXTsKKyAgICAvKiBvcGVuIGFuZCBjbG9zZSBmcmFtZSBib3JkZXIgKi8KKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdICAgID0gMDsKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOworICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworCisgICAvKiB0cmFuc2llbnQgaWR4ICovCisgICAgdHJhbklkeCA9IGhTYnJGcmFtZUluZm8tPnRyYW5FbnYgPSBwVGFibGVbMV07CisKKyAgICAvKiBhZGQgbm9pc2UgZmxvb3JzICovCisgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gMDsKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHg/dHJhbklkeDoxXTsKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBudW1iZXJUaW1lU2xvdHM7CisgICAgLyogbkVudiBpcyBhbHdheXMgPiAxLCBzbyBuTm9pc2VFbnZlbG9wZXMgaXMgYWx3YXlzIDIgKElFQyAxNDQ5Ni0zIDQuNi4xOS4zLjIpICovCisgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKK30KKworLyohCisgIFxicmllZiAgRXh0cmFjdHMgTG93RGVsYXlTQlIgY29udHJvbCBkYXRhIGZyb20gdGhlIGJpdHN0cmVhbS4KKworICBccmV0dXJuIHplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgorKi8KK3N0YXRpYyBpbnQKK2V4dHJhY3RMb3dEZWxheUdyaWQgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgY29udGFpbnMgdGhlIEZSQU1FX0lORk8gc3RydWN0IHRvIGJlIGZpbGxlZCAqLworICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTbG90cworICAgICAgICAgICAgICAgICAgICApCit7CisgIEZSQU1FX0lORk8gKiBwRnJhbWVJbmZvID0gJmhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvOworICBJTlQgbnVtYmVyVGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKKyAgSU5UIHRlbXAgPSAwLCBrOworCisgICAgICAvKiBGSVhGSVhvbmx5IGZyYW1pbmcgY2FzZSAqLworICAgICAgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJhbWVDbGFzcyA9IDA7CisKKyAgICAgIC8qIGdldCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uIGZyb20gdGhlIGJpdHN0cmVhbSAqLworICAgICAgc3dpdGNoICh0aW1lU2xvdHMpeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgLyogM2JpdCB0cmFuc2llbnQgcG9zaXRpb24gKHRlbXA9ezA7Li47N30pICovCisgICAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKCBoQml0QnVmLCAzKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDE1OgorICAgICAgICAgIC8qIDRiaXQgdHJhbnNpZW50IHBvc2l0aW9uICh0ZW1wPXswOy4uOzE1fSkgKi8KKyAgICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoIGhCaXRCdWYsIDQpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBib3JkZXJzIGFjY29yZGluZyB0byB0aGUgdHJhbnNpZW50IHBvc2l0aW9uICovCisgICAgICBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBwRnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgIC8qIGRlY29kZSBmcmVxIHJlczogKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBwRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBrKyspIHsKKyAgICAgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovICAgICAgICAgIAorICAgICAgfQorCisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIQorICBcYnJpZWYgICBFeHRyYWN0IHRoZSBmcmFtZSBpbmZvcm1hdGlvbiAoc3RydWN0dXJlIEZSQU1FX0lORk8pIGZyb20gdGhlIGJpdHN0cmVhbQorICBccmV0dXJuICBaZXJvIGZvciBiaXRzdHJlYW0gZXJyb3IsIG9uZSBmb3IgY29ycmVjdC4KKyovCitpbnQKK2V4dHJhY3RGcmFtZUluZm8gKCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywgICAgICAgICAgLyohPCBiaXRidWZmZXIgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRoZSBmcmFtZS1pbmZvIHdpbGwgYmUgc3RvcmVkICovCisgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBuck9mQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncworICAgICAgICAgICAgICAgICApCit7CisgIEZSQU1FX0lORk8gKiBwRnJhbWVJbmZvID0gJmhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvOworICBpbnQgbnVtYmVyVGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKKyAgaW50IHBvaW50ZXJfYml0cyA9IDAsIG5FbnYgPSAwLCBiID0gMCwgYm9yZGVyLCBpLCBuID0gMCwKKyAgICBrLCBwLCBhTCwgYVIsIG5MLCBuUiwKKyAgICB0ZW1wID0gMCwgc3RhdGljRnJlcVJlczsKKyAgVUNIQVIgZnJhbWVDbGFzczsKKworICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpIHsKKyAgICAgIC8qIENPREVDX0FBQ0xEIChMRCtTQlIpIG9ubHkgdXNlcyB0aGUgbm9ybWFsIDAgR3JpZCBmb3Igbm9uLXRyYW5zaWVudCBGcmFtZXMgYW5kIHRoZSBMb3dEZWxheUdyaWQgZm9yIHRyYW5zaWVudCBGcmFtZXMgKi8KKyAgICAgIGZyYW1lQ2xhc3MgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsgLyogZnJhbWVDbGFzcyA9IFsxIGJpdF0gKi8KKyAgICAgIGlmICggZnJhbWVDbGFzcyA9PSAxICkgeworICAgICAgICAvKiBpZiBmcmFtZUNsYXNzID09IDEsIGV4dHJhY3QgTG93RGVsYXlTYnJHcmlkLCBvdGhlcndpc2UgZXh0cmFjdCBub3JtYWwgU0JSLUdyaWQgZm9yIEZJWElGWCAqLworICAgICAgICAvKiBleHRyYWN0IHRoZSBBQUNMRC1TYnItR3JpZCAqLworICAgICAgICBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKKyAgICAgICAgZXh0cmFjdExvd0RlbGF5R3JpZCAoaEJzLCBoSGVhZGVyRGF0YSwgaF9mcmFtZV9kYXRhLCBudW1iZXJUaW1lU2xvdHMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgfSBlbHNlCisgIHsKKyAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7IC8qIGZyYW1lQ2xhc3MgPSBDIFsyIGJpdHNdICovCisgIH0KKworCisgIHN3aXRjaCAoZnJhbWVDbGFzcykgeworICBjYXNlIDA6CisgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgLyogRSBbMiBiaXRzIF0gKi8KKyAgICBuRW52ID0gKGludCkgKDEgPDwgdGVtcCk7ICAgIC8qIEUgLT4gZSAqLworCisgICAgaWYgKChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgJiYgKG5FbnYgPT0gMSkpCisgICAgICBoX2ZyYW1lX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPSBGREtyZWFkQml0cyggaEJzLCAxKTsgLyogbmV3IEVMRCBTeW50YXggMDctMTEtMDkgKi8KKworICAgIHN0YXRpY0ZyZXFSZXMgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKKworICAgIHsKKyAgICAgIGlmIChuRW52ID4gTUFYX0VOVkVMT1BFU19IRUFBQykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYiA9IG5FbnYgKyAxOworICAgIHN3aXRjaCAobkVudikgeworICAgIGNhc2UgMToKKyAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1LCBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTUsIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE2LCBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgeworICAgICAgICBjYXNlIDE1OgorICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyNpZiAoTUFYX0VOVkVMT1BFUyA+PSA4KQorICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTUsIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE2LCBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbHNlCisgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBBcHBseSBjb3JyZWN0IGZyZXFSZXMgKEhpZ2ggaXMgZGVmYXVsdCkgKi8KKyAgICBpZiAoIXN0YXRpY0ZyZXFSZXMpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuRW52IDsgaSsrKQorICAgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gMDsKKyAgICB9CisKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICBjYXNlIDI6CisgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgLyogQSBbMiBiaXRzXSAqLworCisgICAgbiAgICA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgLyogbiA9IE4gWzIgYml0c10gKi8KKworICAgIG5FbnYgPSBuICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICMgZW52ZWxvcGVzICovCisgICAgYiA9IG5FbnYgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIyBib3JkZXJzICAgKi8KKworICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CisgIGNhc2UgMToKKyAgICAvKiBEZWNvZGUgYm9yZGVyczogKi8KKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gMDsgICAgICAgICAgICAgICAvKiBmaXJzdCBib3JkZXIgICAgICAgICAgKi8KKyAgICBib3JkZXIgPSB0ZW1wICsgbnVtYmVyVGltZVNsb3RzOyAgICAgICAgICAvKiBBIC0+IGFSICAgICAgICAgICAgICAgKi8KKyAgICBpID0gYi0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmFtZSBpbmZvIGluZGV4IGZvciBsYXN0IGJvcmRlciAqLworICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7ICAgICAgICAgIC8qIGxhc3QgYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgaysrKSB7CisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLworICAgICAgYm9yZGVyIC09ICgyICogdGVtcCArIDIpOyAgICAgICAgICAgICAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1stLWldID0gYm9yZGVyOworICAgIH0KKworCisgICAgLyogRGVjb2RlIHBvaW50ZXI6ICovCisgICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG4rMSkpOworICAgIHAgPSBGREtyZWFkQml0cyAoaEJzLCBwb2ludGVyX2JpdHMpOyAgICAgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLworCisgICAgaWYgKHAgPiBuKzEpCisgICAgICByZXR1cm4gMDsKKworICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwID8gbiArIDIgLSBwIDogLTE7CisKKworICAgIC8qIERlY29kZSBmcmVxIHJlczogKi8KKyAgICBmb3IgKGsgPSBuOyBrID49IDA7IGstLSkgeworICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLworICAgIH0KKworCisgICAgLyogQ2FsY3VsYXRlIG5vaXNlIGZsb29yIG1pZGRsZSBib3JkZXI6ICovCisgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25dOworICAgIGVsc2UKKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+dHJhbkVudl07CisKKyAgICBicmVhazsKKworICBjYXNlIDI6CisgICAgLyogRGVjb2RlIGJvcmRlcnM6ICovCisgICAgYm9yZGVyID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSAtPiBhTCAqLworICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7ICAgICAgICAgIC8qIGZpcnN0IGJvcmRlciAqLworCisgICAgZm9yIChrID0gMTsgayA8PSBuOyBrKyspIHsKKyAgICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsvKiBSIFsyIGJpdHNdICovCisgICAgICBib3JkZXIgKz0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gYm9yZGVyOworICAgIH0KKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gbnVtYmVyVGltZVNsb3RzOyAvKiBsYXN0IGJvcmRlciAqLworCisKKyAgICAvKiBEZWNvZGUgcG9pbnRlcjogKi8KKyAgICBwb2ludGVyX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobisxKSk7CisgICAgcCA9IEZES3JlYWRCaXRzIChoQnMsIHBvaW50ZXJfYml0cyk7ICAgICAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCisgICAgaWYgKHAgPiBuKzEpCisgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQorICAgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IC0xOworICAgIGVsc2UKKyAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwIC0gMTsKKworCisKKyAgICAvKiBEZWNvZGUgZnJlcSByZXM6ICovCisgICAgZm9yIChrID0gMDsgayA8PSBuOyBrKyspIHsKKyAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLworICAgIH0KKworCisKKyAgICAvKiBDYWxjdWxhdGUgbm9pc2UgZmxvb3IgbWlkZGxlIGJvcmRlcjogKi8KKyAgICBzd2l0Y2ggKHApIHsKKyAgICBjYXNlIDA6CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAzOgorICAgIC8qIHZfY3RybFNpZ25hbCA9IFtmcmFtZUNsYXNzLGFMLGFSLG5MLG5SLHZfckwsdl9yUixwLHZfZkxSXTsgKi8KKworICAgIGFMID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAgICAgIC8qIEFMIFsyIGJpdHNdLCBBTCAtPiBhTCAqLworCisgICAgYVIgPSBGREtyZWFkQml0cyAoaEJzLCAyKSArIG51bWJlclRpbWVTbG90czsgICAgIC8qIEFSIFsyIGJpdHNdLCBBUiAtPiBhUiAqLworCisgICAgbkwgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgICAgLyogbkwgPSBOTCBbMiBiaXRzXSAqLworCisgICAgblIgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgICAgLyogblIgPSBOUiBbMiBiaXRzXSAqLworCisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgQ2FsY3VsYXRlIGhlbHAgdmFyaWFibGVzCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiBnZW5lcmFsOiAqLworICAgIG5FbnYgPSBuTCArIG5SICsgMTsgICAgICAgICAgICAvKiAjIGVudmVsb3BlcyAqLworICAgIGlmIChuRW52ID4gTUFYX0VOVkVMT1BFUykKKyAgICAgIHJldHVybiAwOworICAgIGIgPSBuRW52ICsgMTsgICAgICAgICAgICAgICAgICAvKiAjIGJvcmRlcnMgICAqLworCisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRGVjb2RlIGVudmVsb3BlcworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAvKiBMLWJvcmRlcnM6ICAgKi8KKyAgICBib3JkZXIgICAgICAgICAgICA9IGFMOyAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBib3JkZXIgKi8KKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyOworCisgICAgZm9yIChrID0gMTsgayA8PSBuTDsgaysrKSB7CisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLworICAgICAgYm9yZGVyICs9ICgyICogdGVtcCArIDIpOyAgICAgICAgICAgICAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1trXSA9IGJvcmRlcjsKKyAgICB9CisKKworICAgIC8qIFItYm9yZGVyczogICovCisgICAgYm9yZGVyID0gYVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBib3JkZXIgKi8KKyAgICBpICAgICAgPSBuRW52OworCisgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKworICAgIGZvciAoayA9IDA7IGsgPCBuUjsgaysrKSB7CisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLworICAgICAgYm9yZGVyIC09ICgyICogdGVtcCArIDIpOyAgICAgICAgICAgICAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1stLWldID0gYm9yZGVyOworICAgIH0KKworCisgICAgLyogZGVjb2RlIHBvaW50ZXI6ICovCisgICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG5MK25SKzEpKTsKKyAgICBwID0gRkRLcmVhZEJpdHMgKGhCcywgcG9pbnRlcl9iaXRzKTsgICAgIC8qIHAgPSBQIFtwb2ludGVyX2JpdHMgYml0c10gKi8KKworICAgIGlmIChwID4gbkwrblIrMSkKKyAgICAgIHJldHVybiAwOworCisgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgPyBiIC0gcCA6IC0xOworCisKKworICAgIC8qIGRlY29kZSBmcmVxIHJlczogKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CisgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KKyAgICB9CisKKworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBEZWNvZGUgbm9pc2UgZmxvb3JzCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gYUw7CisKKyAgICBpZiAobkVudiA9PSAxKSB7CisgICAgICAvKiAxIG5vaXNlIGZsb29yIGVudmVsb3BlOiAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gYVI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogMiBub2lzZSBmbG9vciBlbnZlbG9wZXMgKi8KKyAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQorICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT50cmFuRW52XTsKKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGFSOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisKKyAgLyoKKyAgICBTdG9yZSBudW1iZXIgb2YgZW52ZWxvcGVzLCBub2lzZSBmbG9vciBlbnZlbG9wZXMgYW5kIGZyYW1lIGNsYXNzCisgICovCisgIHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworCisgIGlmIChuRW52ID09IDEpCisgICAgcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKKyAgZWxzZQorICAgIHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisKKyAgcEZyYW1lSW5mby0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisKKyAgaWYgKHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPT0gMiB8fCBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID09IDEpIHsKKyAgICAvKiBjYWxjdWxhdGUgbm9pc2UgZmxvb3IgZmlyc3QgYW5kIGxhc3QgYm9yZGVyczogKi8KKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOworICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXNdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKKyAgfQorCisKKyAgcmV0dXJuIDE7Cit9CisKKworLyohCisgIFxicmllZiAgIENoZWNrIGlmIHRoZSBmcmFtZUluZm8gdmVjdG9yIGhhcyByZWFzb25hYmxlIHZhbHVlcy4KKyAgXHJldHVybiAgWmVybyBmb3IgZXJyb3IsIG9uZSBmb3IgY29ycmVjdAorKi8KK3N0YXRpYyBpbnQKK2NoZWNrRnJhbWVJbmZvIChGUkFNRV9JTkZPICogcEZyYW1lSW5mbywgLyohPCBwb2ludGVyIHRvIGZyYW1lSW5mbyAqLworICAgICAgICAgICAgICAgIGludCBudW1iZXJPZlRpbWVTbG90cywgICAvKiE8IFFNRiB0aW1lIHNsb3RzIHBlciBmcmFtZSAqLworICAgICAgICAgICAgICAgIGludCBvdmVybGFwLCAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBvdmVybGFwIFFNRiB0aW1lIHNsb3RzICovCisgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwKSAgICAgICAgICAgIC8qITwgUU1GIHNsb3RzIHRvIFNCUiBzbG90cyBzdGVwIGZhY3RvciAqLworeworICBpbnQgbWF4UG9zLGksajsKKyAgaW50IHN0YXJ0UG9zOworICBpbnQgc3RvcFBvczsKKyAgaW50IHRyYW5FbnY7CisgIGludCBzdGFydFBvc05vaXNlOworICBpbnQgc3RvcFBvc05vaXNlOworICBpbnQgbkVudmVsb3BlcyA9IHBGcmFtZUluZm8tPm5FbnZlbG9wZXM7CisgIGludCBuTm9pc2VFbnZlbG9wZXMgPSBwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXM7CisKKyAgaWYobkVudmVsb3BlcyA8IDEgfHwgbkVudmVsb3BlcyA+IE1BWF9FTlZFTE9QRVMpCisgICAgcmV0dXJuIDA7CisKKyAgaWYobk5vaXNlRW52ZWxvcGVzID4gTUFYX05PSVNFX0VOVkVMT1BFUykKKyAgICByZXR1cm4gMDsKKworICBzdGFydFBvcyAgICAgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOworICBzdG9wUG9zICAgICAgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZlbG9wZXNdOworICB0cmFuRW52ICAgICAgICAgPSBwRnJhbWVJbmZvLT50cmFuRW52OworICBzdGFydFBvc05vaXNlICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF07CisgIHN0b3BQb3NOb2lzZSAgICA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtuTm9pc2VFbnZlbG9wZXNdOworCisgIGlmIChvdmVybGFwIDwgMCB8fCBvdmVybGFwID4gKDYpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHRpbWVTdGVwIDwgMSB8fCB0aW1lU3RlcCA+IDIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtYXhQb3MgPSBudW1iZXJPZlRpbWVTbG90cyArIChvdmVybGFwL3RpbWVTdGVwKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMgb2YgdGhlIGZyYW1lIGFyZSByZWFzb25hYmxlIHZhbHVlcy4gKi8KKyAgaWYoIChzdGFydFBvcyA8IDApIHx8IChzdGFydFBvcyA+PSBzdG9wUG9zKSApCisgICAgcmV0dXJuIDA7CisgIGlmKCBzdGFydFBvcyA+IG1heFBvcy1udW1iZXJPZlRpbWVTbG90cyApIC8qIEZpcnN0IGVudi4gbXVzdCBzdGFydCBpbiBvciBkaXJlY3RseSBhZnRlciB0aGUgb3ZlcmxhcCBidWZmZXIgKi8KKyAgICByZXR1cm4gMDsKKyAgaWYoIHN0b3BQb3MgPCBudW1iZXJPZlRpbWVTbG90cyApIC8qIE9uZSBjb21wbGV0ZSBmcmFtZSBtdXN0IGJlIHJlYWR5IGZvciBvdXRwdXQgYWZ0ZXIgcHJvY2Vzc2luZyAqLworICAgIHJldHVybiAwOworICBpZihzdG9wUG9zID4gbWF4UG9zKQorICAgIHJldHVybiAwOworCisgIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IGVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUgKi8KKyAgZm9yKGk9MDtpPG5FbnZlbG9wZXM7aSsrKSB7CisgICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA+PSBwRnJhbWVJbmZvLT5ib3JkZXJzW2krMV0pCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIGVudmVsb3BlIHRvIGJlIHNob3J0ZW5lZCBpcyBhY3R1YWxseSBhbW9uZyB0aGUgZW52ZWxvcGVzICovCisgIGlmKHRyYW5FbnY+bkVudmVsb3BlcykKKyAgICByZXR1cm4gMDsKKworCisgIC8qIENoZWNrIHRoZSBub2lzZSBib3JkZXJzICovCisgIGlmKG5FbnZlbG9wZXM9PTEgJiYgbk5vaXNlRW52ZWxvcGVzPjEpCisgICAgcmV0dXJuIDA7CisKKyAgaWYoc3RhcnRQb3MgIT0gc3RhcnRQb3NOb2lzZSB8fCBzdG9wUG9zICE9IHN0b3BQb3NOb2lzZSkKKyAgICByZXR1cm4gMDsKKworCisgIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IG5vaXNlLWVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUqLworICBmb3IoaT0wOyBpPG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2ldID49IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpKzFdKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDaGVjayB0aGF0IGV2ZXJ5IG5vaXNlIGJvcmRlciBpcyB0aGUgc2FtZSBhcyBhbiBlbnZlbG9wZSBib3JkZXIqLworICBmb3IoaT0wOyBpPG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgICAgc3RhcnRQb3NOb2lzZSA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpXTsKKworICAgIGZvcihqPTA7IGo8bkVudmVsb3BlczsgaisrKSB7CisgICAgICBpZihwRnJhbWVJbmZvLT5ib3JkZXJzW2pdID09IHN0YXJ0UG9zTm9pc2UpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZihqPT1uRW52ZWxvcGVzKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmggYi9hYWMvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCkBAIC0wLDAgKzEsMzIyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiBwcm90b3R5cGVzICAKKyovCisKKyNpZm5kZWYgX19FTlZFTE9QRV9FWFRSQUNUSU9OX0gKKyNkZWZpbmUgX19FTlZFTE9QRV9FWFRSQUNUSU9OX0gKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJscHBfdHJhbi5oIgorCisjaW5jbHVkZSAicHNkZWMuaCIKKworI2RlZmluZSBFTlZfRVhQX0ZSQUNUIDAKKy8qITwgU2hpZnQgcmF3IGVudmVsb3BlIGRhdGEgdG8gc3VwcG9ydCBmcmFjdGlvbmFsIG51bWJlcnMuCisgIENhbiBiZSBzZXQgdG8gOCBpbnN0ZWFkIG9mIDAgdG8gZW5oYW5jZSBhY2N1cmFjeSBkdXJpbmcgY29uY2VhbG1lbnQuCisgIFRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciBjb25mb3JtYW5jZSBhbmQgI3JlcXVhbnRpemVFbnZlbG9wZURhdGEoKSB3aWxsCisgIGJlY29tZSBtb3JlIGV4cGVuc2l2ZS4KKyovCisKKyNkZWZpbmUgRVhQX0JJVFMgNgorLyohPCBTaXplIG9mIGV4cG9uZW50LXBhcnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKHNob3VsZCBiZSBhdCBsZWFzdCA2KS4KKyAgVGhlIHJlbWFpbmluZyBiaXRzIGluIGVhY2ggd29yZCBhcmUgdXNlZCBmb3IgdGhlIG1hbnRpc3NhIChzaG91bGQgYmUgYXQgbGVhc3QgMTApLgorICBUaGlzIGZvcm1hdCBpcyB1c2VkIGluIHRoZSBhcnJheXMgaUVudmVsb3BlW10gYW5kIHNick5vaXNlRmxvb3JMZXZlbFtdCisgIGluIHRoZSBGUkFNRV9EQVRBIHN0cnVjdCB3aGljaCBtdXN0IGZpdCBpbiBhIGNlcnRhaW4gcGFydCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAoU2VlIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHNicl9kZWMuY3BwKS4KKyAgRXhwb25lbnRzIGFuZCBtYW50aXNzYXMgY291bGQgYWxzbyBiZSBzdG9yZWQgaW4gc2VwYXJhdGUgYXJyYXlzLgorICBBY2Nlc3NpbmcgdGhlIGV4cG9uZW50IG9yIHRoZSBtYW50aXNzYSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCB0aGUgbWFza3MgI01BU0tfRQorICByZXNwLiAjTUFTS19NIHdvdWxkICAgbm8gbG9uZ2VyIGJlIHJlcXVpcmVkLgorKi8KKworI2RlZmluZSBNQVNLX00gKCgoMSA8PCAoRlJBQ1RfQklUUyAtIEVYUF9CSVRTKSkgLSAxKSA8PCBFWFBfQklUUykgIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KKyNkZWZpbmUgTUFTS19FICgoMSA8PCBFWFBfQklUUykgLSAxKSAgICAgICAgICAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBleHBvbmVudCBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLworCisjZGVmaW5lIFNJR05fRVhUICggKChTQ0hBUiktMSkgXiBNQVNLX0UpICAgICAgICAvKiE8IGEgQ0hBUi1jb25zdGFudCB3aXRoIGFsbCBiaXRzIGFib3ZlIG91ciBzaWduLWJpdCBzZXQgKi8KKyNkZWZpbmUgUk9VTkRJTkcgKCAoRklYUF9TR0wpKDE8PChFWFBfQklUUy0xKSkgKSAvKiE8IDAuNS1vZmZzZXQgZm9yIHJvdW5kaW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkby1mbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLworI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ3kncyBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KKyNkZWZpbmUgTk9JU0VfRVhQX09GRlNFVCAgMzggICAgICAgICAgICAgICAgICAgLyohPCBXaWxsIGJlIGFkZGVkIHRvIHRoZSBub2lzZSBsZXZlbCBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KKwordHlwZWRlZiBlbnVtCit7CisgIEhFQURFUl9OT1RfUFJFU0VOVCwKKyAgSEVBREVSX09LLAorICBIRUFERVJfUkVTRVQKK30KK1NCUl9IRUFERVJfU1RBVFVTOworCit0eXBlZGVmIGVudW0KK3sKKyAgU0JSX05PVF9JTklUSUFMSVpFRCwKKyAgVVBTQU1QTElORywKKyAgU0JSX0hFQURFUiwKKyAgU0JSX0FDVElWRQorfQorU0JSX1NZTkNfU1RBVEU7CisKKwordHlwZWRlZiBlbnVtCit7CisgIENPVVBMSU5HX09GRiA9IDAsCisgIENPVVBMSU5HX0xFVkVMLAorICBDT1VQTElOR19CQUwKK30KK0NPVVBMSU5HX01PREU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVDSEFSIG5TZmJbMl07ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgZm9yIGxvdyBhbmQgaGlnaCBmcmVxLXJlc29sdXRpb24gKi8KKyAgVUNIQVIgbk5mYjsgICAgICAgICAgICAgIC8qITwgQWN0dWFsIG51bWJlciBvZiBub2lzZSBiYW5kcyB0byByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSovCisgIFVDSEFSIG51bU1hc3RlcjsgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgaW4gdl9rX21hc3RlciAqLworICBVQ0hBUiBsb3dTdWJiYW5kOyAgICAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIHN0YXJ0cyAqLworICBVQ0hBUiBoaWdoU3ViYmFuZDsgICAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIGVuZHMgKi8KKyAgVUNIQVIgbGltaXRlckJhbmRUYWJsZVtNQVhfTlVNX0xJTUlURVJTKzFdOyAvKiE8IExpbWl0ZXIgYmFuZCB0YWJsZS4gKi8KKyAgVUNIQVIgbm9MaW1pdGVyQmFuZHM7ICAgIC8qITwgTnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMuICovCisgIFVDSEFSIG5JbnZmQmFuZHM7ICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KKyAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07IC8qITwgUG9pbnRlcnMgdG8gZnJlcUJhbmRUYWJsZUxvIGFuZCBmcmVxQmFuZFRhYmxlSGkgKi8KKyAgVUNIQVIgZnJlcUJhbmRUYWJsZUxvW01BWF9GUkVRX0NPRUZGUy8yKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIGJhbmRzIHRvIFFNRiBiYW5kcyBmb3IgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgIFVDSEFSIGZyZXFCYW5kVGFibGVIaVtNQVhfRlJFUV9DT0VGRlMrMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgYmFuZHMgdG8gUU1GIGJhbmRzIGZvciBoaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgIFVDSEFSIGZyZXFCYW5kVGFibGVOb2lzZVtNQVhfTk9JU0VfQ09FRkZTKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLworICBVQ0hBUiB2X2tfbWFzdGVyW01BWF9GUkVRX0NPRUZGUysxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgQmFuZFRhYmxlIHdoaWNoIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tICovCit9CitGUkVRX0JBTkRfREFUQTsKKwordHlwZWRlZiBGUkVRX0JBTkRfREFUQSAqSEFORExFX0ZSRVFfQkFORF9EQVRBOworCisjZGVmaW5lIFNCUkRFQ19FTERfR1JJRCAgICAgICAgMQorI2RlZmluZSBTQlJERUNfU1lOVEFYX1NDQUwgICAgIDIKKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9VU0FDICAgICA0CisjZGVmaW5lIFNCUkRFQ19TWU5UQVhfUlNWRDUwICAgOAorI2RlZmluZSBTQlJERUNfTE9XX1BPV0VSICAgICAgMTYgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IExvdyBQb3dlciBRTUYgbW9kZSBzaGFsbCBiZSB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfUFNfREVDT0RFRCAgICAgMzIgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFBTIHdhcyBkZWNvZGVkIGFuZCByZW5kZXJlZC4gKi8KKyNkZWZpbmUgU0JSREVDX0xEX01QU19RTUYgICAgNTEyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgTEQtTVBTIFFNRiBzaGFsbCBiZSB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfRE9XTlNBTVBMRSAgIDgxOTIgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkb3duc2FtcGxpbmcgbW9kZSBpcyB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfRkxVU0ggICAgICAgMTYzODQgIC8qIEZsYWcgaXMgdXNlZCB0byBmbHVzaCBhbGwgZWxlbWVudHMgaW4gdXNlLiAqLworI2RlZmluZSBTQlJERUNfRk9SQ0VfUkVTRVQgMzI3NjggIC8qIEZsYWcgaXMgdXNlZCB0byBmb3JjZSBhIHJlc2V0IG9mIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCisKKyNkZWZpbmUgU0JSREVDX0hEUl9TVEFUX1JFU0VUICAxCisjZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9VUERBVEUgMgorCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGFtcFJlc29sdXRpb247ICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzICgwOiAxLjVkQiwgMTogM2RCKSAqLworICBVQ0hBUiB4b3Zlcl9iYW5kOyAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IGluICN2X2tfbWFzdGVyW10gdXNlZCBmb3IgZHluYW1pYyBjcm9zc292ZXIgZnJlcXVlbmN5ICovCisgIFVDSEFSIHNicl9wcmVwcm9jZXNzaW5nOyAgIC8qITwgU0JSIHByZXdoaXRlbmluZyBmbGFnLiAqLworfSBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBDaGFuZ2VzIGluIHRoZXNlIHZhcmlhYmxlcyBjYXVzZXMgYSByZXNldCBvZiB0aGUgZGVjb2RlciAqLworICBVQ0hBUiBzdGFydEZyZXE7ICAgICAgICAgICAvKiE8IEluZGV4IGZvciBTQlIgc3RhcnQgZnJlcXVlbmN5ICovCisgIFVDSEFSIHN0b3BGcmVxOyAgICAgICAgICAgIC8qITwgSW5kZXggZm9yIFNCUiBoaWdoZXN0IGZyZXF1ZW5jeSAqLworICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAvKiE8IDA6IGxpbmVhciBzY2FsZSwgIDEtMyBsb2dhcml0aG1pYyBzY2FsZXMgKi8KKyAgVUNIQVIgYWx0ZXJTY2FsZTsgICAgICAgICAgLyohPCBGbGFnIGZvciBjb2Fyc2VyIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgIFVDSEFSIG5vaXNlX2JhbmRzOyAgICAgICAgIC8qITwgTm9pc2UgYmFuZHMgcGVyIG9jdGF2ZSwgcmVhZCBmcm9tIGJpdHN0cmVhbSovCisKKyAgLyogZG9uJ3QgcmVxdWlyZSByZXNldCAqLworICBVQ0hBUiBsaW1pdGVyQmFuZHM7ICAgICAgICAvKiE8IEluZGV4IGZvciBudW1iZXIgb2YgbGltaXRlciBiYW5kcyBwZXIgb2N0YXZlICovCisgIFVDSEFSIGxpbWl0ZXJHYWluczsgICAgICAgIC8qITwgSW5kZXggdG8gc2VsZWN0IGdhaW4gbGltaXQgKi8KKyAgVUNIQVIgaW50ZXJwb2xGcmVxOyAgICAgICAgLyohPCBTZWxlY3QgZ2FpbiBjYWxjdWxhdGlvbiBtZXRob2QgKDE6IHBlciBRTUYgY2hhbm5lbCwgMDogcGVyIFNCUiBiYW5kKSAqLworICBVQ0hBUiBzbW9vdGhpbmdMZW5ndGg7ICAgICAvKiE8IFNtb290aGluZyBvZiBnYWlucyBvdmVyIHRpbWUgKDA6IG9uICAxOiBvZmYpICovCisKK30gU0JSX0hFQURFUl9EQVRBX0JTOworCit0eXBlZGVmIHN0cnVjdAoreworICBTQlJfU1lOQ19TVEFURSBzeW5jU3RhdGU7ICAgIC8qITwgVGhlIGN1cnJlbnQgaW5pdGlhbGl6YXRpb24gc3RhdHVzIG9mIHRoZSBoZWFkZXIgKi8KKworICBVQ0hBUiBzdGF0dXM7ICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgZmllbGQgdXNlZCBmb3Igc2lnbmFsaW5nIGEgcmVzZXQgcmlnaHQgYmVmb3JlIHRoZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYW4gdXBkYXRlIGZyb20gY29uZmlnIChlLmcuIEFTQykuICovCisgIFVDSEFSIGZyYW1lRXJyb3JGbGFnOyAgICAgICAgLyohPCBGcmFtZSBkYXRhIHZhbGlkIGZsYWcuIENBVVRJT046IFRoaXMgdmFyaWFibGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZmxhZyBzdG9yZWQgaW4gdGhlIGVsZW1lbnQgc3RydWN0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgZnJhbWUgZGVsYXkuIFRoZXJlIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IGRpZmZlcmVudCBzbG90cyB1c2UgdGhlIHNhbWUgaGVhZGVyLiAqLworICBVQ0hBUiBudW1iZXJUaW1lU2xvdHM7ICAgICAgIC8qITwgQUFDOiAxNiwxNSAqLworICBVQ0hBUiBudW1iZXJPZkFuYWx5c2lzQmFuZHM7IC8qITwgTnVtYmVyIG9mIFFNRiBhbmFseXNpcyBiYW5kcyAqLworICBVQ0hBUiB0aW1lU3RlcDsgICAgICAgICAgICAgIC8qITwgVGltZSByZXNvbHV0aW9uIG9mIFNCUiBpbiBRTUYtc2xvdHMgKi8KKyAgVUlOVCAgc2JyUHJvY1NtcGxSYXRlOyAgICAgICAvKiE8IFNCUiBwcm9jZXNzaW5nIHNhbXBsaW5nIGZyZXF1ZW5jeSAoIT0gT3V0cHV0U2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHdheXM6IENvcmVTYW1wbGluZ1JhdGUgKiBVcFNhbXBsaW5nRmFjdG9yOyBldmVuIGluIHNpbmdsZSByYXRlIG1vZGUpICovCisKKyAgU0JSX0hFQURFUl9EQVRBX0JTICAgICAgYnNfZGF0YTsgIC8qITwgY3VycmVudCBTQlIgaGVhZGVyLiAqLworICBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTyBic19pbmZvOyAgLyohPCBTQlIgaW5mby4gKi8KKworICBGUkVRX0JBTkRfREFUQSBmcmVxQmFuZERhdGE7ICAvKiE8IFBvaW50ZXIgdG8gc3RydWN0ICNGUkVRX0JBTkRfREFUQSAqLworfQorU0JSX0hFQURFUl9EQVRBOworCit0eXBlZGVmIFNCUl9IRUFERVJfREFUQSAqSEFORExFX1NCUl9IRUFERVJfREFUQTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBVQ0hBUiBmcmFtZUNsYXNzOyAgICAgICAgICAgICAgIC8qITwgU2VsZWN0IGdyaWQgdHlwZSAqLworICBVQ0hBUiBuRW52ZWxvcGVzOyAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVudmVsb3BlcyAqLworICBVQ0hBUiBib3JkZXJzW01BWF9FTlZFTE9QRVMrMV07IC8qITwgRW52ZWxvcGUgYm9yZGVycyAoaW4gU0JSLXRpbWVzbG90cywgZS5nLiBtcDNQUk86IDAuLjExKSAqLworICBVQ0hBUiBmcmVxUmVzW01BWF9FTlZFTE9QRVNdOyAgIC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGVhY2ggZW52ZWxvcGUgKDA9bG93LCAxPWhpZ2gpICovCisgIFNDSEFSICB0cmFuRW52OyAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgZW52ZWxvcGUsIC0xIGlmIG5vbmUgKi8KKyAgVUNIQVIgbk5vaXNlRW52ZWxvcGVzOyAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBlbnZlbG9wZXMgKi8KKyAgVUNIQVIgYm9yZGVyc05vaXNlW01BWF9OT0lTRV9FTlZFTE9QRVMrMV07LyohPCBib3JkZXJzIG9mIG5vaXNlIGVudmVsb3BlcyAqLworfQorRlJBTUVfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBGSVhQX1NHTCBzZmJfbnJnX3ByZXZbTUFYX0ZSRVFfQ09FRkZTXTsgICAgLyohPCBQcmV2aW91cyBlbnZlbG9wZSAocmVxdWlyZWQgZm9yIGRpZmZlcmVudGlhbC1jb2RlZCB2YWx1ZXMpICovCisgIEZJWFBfU0dMIHByZXZOb2lzZUxldmVsW01BWF9OT0lTRV9DT0VGRlNdOyAvKiE8IFByZXZpb3VzIG5vaXNlIGVudmVsb3BlIChyZXF1aXJlZCBmb3IgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KKyAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgICAgICAgICAgIC8qITwgU3RlcmVvLW1vZGUgb2YgcHJldmlvdXMgZnJhbWUgKi8KKyAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAgIC8qITwgUHJldmlvdXMgc3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KKyAgVUNIQVIgYW1wUmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJldmlvdXMgYW1wbGl0dWRlIHJlc29sdXRpb24gKDA6IDEuNWRCLCAxOiAzZEIpICovCisgIFVDSEFSIHN0b3BQb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvc2l0aW9uIGluIHRpbWUgd2hlcmUgbGFzdCBlbnZlbG9wZSBlbmRlZCAqLworICBVQ0hBUiBmcmFtZUVycm9yRmxhZzsgICAgICAgICAgICAgICAgICAgICAgLyohPCBQcmV2aW91cyBmcmFtZSBzdGF0dXMgKi8KK30KK1NCUl9QUkVWX0ZSQU1FX0RBVEE7CisKK3R5cGVkZWYgU0JSX1BSRVZfRlJBTUVfREFUQSAqSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEE7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IG5TY2FsZUZhY3RvcnM7ICAgICAgICAgICAgICAgICAgICAvKiE8IHRvdGFsIG51bWJlciBvZiBzY2FsZWZhY3RvcnMgaW4gZnJhbWUgKi8KKworICBGUkFNRV9JTkZPIGZyYW1lSW5mbzsgICAgICAgICAgICAgICAgIC8qITwgdGltZSBncmlkIGZvciBjdXJyZW50IGZyYW1lICovCisgIFVDSEFSIGRvbWFpbl92ZWNbTUFYX0VOVkVMT1BFU107ICAgICAgLyohPCBCaXRmaWVsZCBjb250YWluaW5nIGRpcmVjdGlvbiBvZiBkZWx0YS1jb2RpbmcgZm9yIGVhY2ggZW52ZWxvcGUgKDA6ZnJlcXVlbmN5LCAxOnRpbWUpICovCisgIFVDSEFSIGRvbWFpbl92ZWNfbm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFU107IC8qITwgU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBub2lzZSBlbnZlbG9wZXMgKi8KKworICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107IC8qITwgU3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KKyAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgICAgICAgICAvKiE8IFN0ZXJlby1tb2RlICovCisgIGludCBhbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOyAgICAgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZSB2YWx1ZXMgKDA6IDEuNWRCLCAxOiAzZEIpICovCisKKyAgVUNIQVIgYWRkSGFybW9uaWNzW01BWF9GUkVRX0NPRUZGU107ICAgICAvKiE8IEZsYWdzIGZvciBzeW50aGV0aWMgc2luZSBhZGRpdGlvbiAqLworCisgIEZJWFBfU0dMIGlFbnZlbG9wZVtNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFU107ICAgICAgIC8qITwgRW52ZWxvcGUgZGF0YSAqLworICBGSVhQX1NHTCBzYnJOb2lzZUZsb29yTGV2ZWxbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IE5vaXNlIGVudmVsb3BlIGRhdGEgKi8KK30KK1NCUl9GUkFNRV9EQVRBOworCit0eXBlZGVmIFNCUl9GUkFNRV9EQVRBICpIQU5ETEVfU0JSX0ZSQU1FX0RBVEE7CisKK3ZvaWQgaW5pdFNiclByZXZGcmFtZURhdGEgKEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTbG90cyk7CisKKworaW50IHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworaW50IHNickdldENoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXApOworCitTQlJfSEVBREVSX1NUQVRVUworc2JyR2V0SGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAorICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgZklzU2JyRGF0YSk7CisKKy8qIQorICBcYnJpZWYgICAgIEluaXRpYWxpemUgU0JSIGhlYWRlciBkYXRhCisKKyAgQ29weSBkZWZhdWx0IHZhbHVlcyB0byB0aGUgaGVhZGVyIGRhdGEgc3RydWN0IGFuZCBwYXRjaCBzb21lIGVudHJpZXMKKyAgZGVwZW5kaW5nIG9uIHRoZSBjb3JlIGNvZGVjLgorKi8KK1NCUl9FUlJPUgoraW5pdEhlYWRlckRhdGEgKAorICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBoSGVhZGVyRGF0YSwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgIGZsYWdzCisgICAgICAgICk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQ2ODZkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyICAKKyovCisKKyNpbmNsdWRlICJodWZmX2RlYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRGVjb2RlcyBvbmUgaHVmZm1hbiBjb2RlIHdvcmQKKworICBSZWFkcyBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB1bnRpbCBhIHZhbGlkIGNvZGV3b3JkIGlzIGZvdW5kLgorICBUaGUgdGFibGUgZW50cmllcyBhcmUgaW50ZXJwcmV0ZWQgZWl0aGVyIGFzIGluZGV4IHRvIHRoZSBuZXh0IGVudHJ5CisgIG9yIC0gaWYgbmVnYXRpdmUgLSBhcyB0aGUgY29kZXdvcmQuCisKKyAgXHJldHVybiAgICBkZWNvZGVkIHZhbHVlCisKKyAgXGF1dGhvcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitEZWNvZGVIdWZmbWFuQ1cgKEh1ZmZtYW4gaCwgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSAvKiE8IEhhbmRsZSB0byBCaXRidWZmZXIgKi8KK3sKKyAgU0NIQVIgaW5kZXggPSAwOworICBpbnQgdmFsdWUsIGJpdDsKKworICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgIGJpdCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICAgIGluZGV4ID0gaFtpbmRleF1bYml0XTsKKyAgfQorCisgIHZhbHVlID0gaW5kZXgrNjQ7IC8qIEFkZCBvZmZzZXQgKi8KKworCisgIHJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmggYi9hYWMvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDM2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5oCkBAIC0wLDAgKzEsMTAwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyICAKKyovCisjaWZuZGVmIF9fSFVGRl9ERUNfSAorI2RlZmluZSBfX0hVRkZfREVDX0gKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKK3R5cGVkZWYgY29uc3QgU0NIQVIgKCpIdWZmbWFuKVsyXTsKKworaW50CitEZWNvZGVIdWZmbWFuQ1cgKEh1ZmZtYW4gaCwKKyAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1Zik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExN2U3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5jcHAKQEAgLTAsMCArMSw5ODYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBMb3cgUG93ZXIgUHJvZmlsZSBUcmFuc3Bvc2VyLCAgCisgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSB0cmFuc3Bvc2VyLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBpcyBscHBUcmFuc3Bvc2VyKCkuIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMKKyAgaGlnaCBmcmVxdWVuY3kgY29udGVudCBieSBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgbG93IGJhbmQgKHByb3ZpZGVkIGJ5IGNvcmUgY29kZWMpIGludG8gdGhlIGhpZ2ggYmFuZC4KKyAgVGhpcyBwcm9jZXNzIGlzIGFsc28gcmVmZXJyZWQgdG8gYXMgInBhdGNoaW5nIi4gVGhlIGZ1bmN0aW9uIGFsc28gaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcgYnkgbWVhbnMgb2YKKyAgaW52ZXJzZSBmaWx0ZXJpbmcgYmFzZWQgb24gTFBDIGNvZWZmaWNpZW50cy4KKworICBUb2dldGhlciB3aXRoIHRoZSBRTUYgZmlsdGVyYmFuayB0aGUgdHJhbnNwb3NlciBjYW4gYmUgdGVzdGVkIHVzaW5nIGEgc3VwcGxpZWQgdGVzdCBwcm9ncmFtLiBTZWUgbWFpbl9hdWRpby5jcHAgZm9yIGRldGFpbHMuCisgIFRoaXMgbW9kdWxlIGRvZXMgdXNlIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZSBjb21wdXRhdGlvbnMgaGFzIGFuIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LgorICBUaGUgbW9kdWxlIGFsc28gbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVudCBzY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGEuCisKKyAgXHNhIGxwcFRyYW5zcG9zZXIoKSwgbWFpbl9hdWRpby5jcHAsIHNicl9zY2FsZS5oLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworKi8KKworI2luY2x1ZGUgImxwcF90cmFuLmgiCisKKyNpbmNsdWRlICJzYnJfcmFtLmgiCisjaW5jbHVkZSAic2JyX3JvbS5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgorCisKKworI2lmIGRlZmluZWQoX19hcm1fXykKKyNpbmNsdWRlICJhcm0vbHBwX3RyYW5fYXJtLmNwcCIKKyNlbmRpZgorCisKKworI2RlZmluZSBMUENfU0NBTEVfRkFDVE9SICAyCisKKworLyohCisgKgorICogXGJyaWVmIEdldCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciBmcm9tIGZpbHRlcmluZyBsZXZlbAorICoKKyAqIFJldHVybnMgYSBmaWx0ZXIgcGFyYW1ldGVyIChiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvcikgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBmaWx0ZXJpbmcgbGV2ZWwgc2lnbmFsbGVkIGluIHRoZSBiaXRzdHJlYW0uCisgKiBXaGVuIHN3aXRjaGluZyB0aGUgZmlsdGVyaW5nIGxldmVsIGZyb20gTE9XIHRvIE9GRiwgYW4gYWRkaXRpb25hbAorICogbGV2ZWwgaXMgYmVpbmcgaW5zZXJ0ZWQgdG8gYWNoaWV2ZSBhIHNtb290aCB0cmFuc2l0aW9uLgorICovCisKKyNpZm5kZWYgRlVOQ1RJT05fbWFwSW52Zk1vZGUKK3N0YXRpYyBGSVhQX0RCTAorbWFwSW52Zk1vZGUgKElOVkZfTU9ERSBtb2RlLAorICAgICAgICAgICAgIElOVkZfTU9ERSBwcmV2TW9kZSwKKyAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpCit7CisgIHN3aXRjaCAobW9kZSkgeworICBjYXNlIElOVkZfTE9XX0xFVkVMOgorICAgIGlmKHByZXZNb2RlID09IElOVkZfT0ZGKQorICAgICAgcmV0dXJuIHdoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWw7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHdoRmFjdG9ycy5sb3dMZXZlbDsKKworICBjYXNlIElOVkZfTUlEX0xFVkVMOgorICAgIHJldHVybiB3aEZhY3RvcnMubWlkTGV2ZWw7CisKKyAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6CisgICAgcmV0dXJuIHdoRmFjdG9ycy5oaWdoTGV2ZWw7CisKKyAgZGVmYXVsdDoKKyAgICBpZihwcmV2TW9kZSA9PSBJTlZGX0xPV19MRVZFTCkKKyAgICAgIHJldHVybiB3aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsOworICAgIGVsc2UKKyAgICAgIHJldHVybiB3aEZhY3RvcnMub2ZmOworICB9Cit9CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9tYXBJbnZmTW9kZSAqLworCisvKiEKKyAqCisgKiBcYnJpZWYgUGVyZm9ybSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCBlbXBoYXNpcworICoKKyAqIFJldHJpZXZlIGJhbmR3aWR0aCBleHBhbnNpb24gZmFjdG9yIGFuZCBhcHBseSBzbW9vdGhpbmcgZm9yIGVhY2ggZmlsdGVyIGJhbmQKKyAqCisgKi8KKworI2lmbmRlZiBGVU5DVElPTl9pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcworc3RhdGljIHZvaWQKK2ludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5JbnZmQmFuZHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2LCAvKiE8IFByZXZpb3VzIGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqIGJ3VmVjdG9yICAgICAgICAgICAgLyohPCBSZXN1bHRpbmcgZmlsdGVyaW5nIGxldmVscyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrKSB7CisgICAgRklYUF9EQkwgYWNjdTsKKyAgICBGSVhQX0RCTCBid1RtcCA9IG1hcEludmZNb2RlIChzYnJfaW52Zl9tb2RlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicl9pbnZmX21vZGVfcHJldltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKKworICAgIGlmKGJ3VG1wIDwgaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSkgeworICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksYndUbXApICsKKyAgICAgICAgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC4yNWYpLGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC45MDYyNWYpLGJ3VG1wKSArCisgICAgICAgICAgICAgZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSxoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKTsKKyAgICB9CisKKyAgICBpZiAoYWNjdSA8ICBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpPj4xKQorICAgICAgYndWZWN0b3JbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBlbHNlCisgICAgICBid1ZlY3RvcltpXSA9IGZpeE1pbihhY2N1PDwxLEZMMkZYQ09OU1RfREJMKDAuOTk2MDkzNzVmKSk7CisgIH0KK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX2ludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzICovCisKKy8qIFJlc3VsdGluZyBhdXRvY29ycmVsYXRpb24gZGV0ZXJtaW5hbnQgZXhwb25lbnQgKi8KKyNkZWZpbmUgQUNERVRfRVhQICgyKihERlJBQ1RfQklUUytzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUrMTAtYWMuZGV0X3NjYWxlKSkKKyNkZWZpbmUgQUNfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IpCisjZGVmaW5lIEFMUEhBX0VYUCAoLXNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZStMUENfU0NBTEVfRkFDVE9SKzEpCisvKiBSZXN1bHRpbmcgdHJhbnNwb3NlZCBRTUYgdmFsdWVzIGV4cG9uZW50IDE2IGJpdCBub3JtYWxpemVkIHNhbXBsZWJpdHMgYXNzdW1lZC4gKi8KKyNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTLTE1KS1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCisKKy8qIQorICoKKyAqIFxicmllZiBQZXJmb3JtIHRyYW5zcG9zaXRpb24gYnkgcGF0Y2hpbmcgb2Ygc3ViYmFuZCBzYW1wbGVzLgorICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgbW9kdWxlLiBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYXJlYXMgZm9yIHRoZQorICogcGF0Y2hpbmcgcHJvY2VzcyAodGhlc2UgYXJlIHRoZSBzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcKKyAqIGJ5IG1lYW5zIG9mIGludmVyc2UgZmlsdGVyaW5nLiBUaGUgZnVuY3Rpb24gYXV0b0NvcnJlbGF0aW9uMm5kKCkgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyB0aGUKKyAqIExQQyBjb2VmZmljaWVudHMgZm9yIHRoZSBmaWx0ZXJpbmcuICBUaGUgYWN0dWFsIGNhbGN1bGF0aW9uIG9mIHRoZSBMUEMgY29lZmZpY2llbnRzIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBmaWx0ZXJpbmcgYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCisgKgorICogTm90ZSB0aGF0IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBvbiBhbGwgYXZhaWxhYmxlIFFNRiBzdWJzYW1wbGVzLCB3aGVyZWFzIHRoZSBwYXRjaGluZyBpcyBvbmx5IGRvbmUgb24gdGhvc2UgUU1GCisgKiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IFFNRiBzeW50aGVzaXMuIFRoZSBmaWx0ZXJpbmcgaXMgYWxzbyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIHBhdGNoaW5nCisgKiBpbmNsdWRlcyBmdXJ0aGVyIGRlcGVuZGVuY2llcyBvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFNCUiBkYXRhLgorICoKKyAqLworCit2b2lkIGxwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgICAgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCisgICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byByZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIChzb3VyY2UpICovCisKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gaW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIChzb3VyY2UpICovCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlyc3RTbG90T2ZmcywgICAgICAgICAgIC8qITwgU3RhcnQgcG9zaXRpb24gaW4gdGltZSAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGFzdFNsb3RPZmZzLCAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG92ZXJsYXAtc2xvdHMgaW50byBuZXh0IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCisgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAgICAgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2ICAgICAgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCAgICBid0luZGV4W01BWF9OVU1fUEFUQ0hFU107CisgIEZJWFBfREJMICBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNdOyAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KKworICBpbnQgICAgaTsKKyAgaW50ICAgIGxvQmFuZCwgc3RhcnQsIHN0b3A7CisgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncyA9IGhMcHBUcmFucy0+cFNldHRpbmdzOworICBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSA9IHBTZXR0aW5ncy0+cGF0Y2hQYXJhbTsKKyAgaW50ICAgIHBhdGNoOworCisgIEZJWFBfU0dMICBhbHBoYXJbTFBDX09SREVSXSwgYTByLCBhMXI7CisgIEZJWFBfU0dMICBhbHBoYWlbTFBDX09SREVSXSwgYTBpPTAsIGExaT0wOworICBGSVhQX1NHTCAgYncgPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICBpbnQgICAgYXV0b0NvcnJMZW5ndGg7CisKKyAgRklYUF9EQkwgazEsIGsxX2JlbG93PTAsIGsxX2JlbG93Mj0wOworCisgIEFDT1JSX0NPRUZTIGFjOworICBpbnQgICAgc3RhcnRTYW1wbGU7CisgIGludCAgICBzdG9wU2FtcGxlOworICBpbnQgICAgc3RvcFNhbXBsZUNsZWFyOworCisgIGludCBjb21Mb3dCYW5kU2NhbGU7CisgIGludCBvdkxvd0JhbmRTaGlmdDsKKyAgaW50IGxvd0JhbmRTaGlmdDsKKy8qICBpbnQgb3ZIaWdoQmFuZFNoaWZ0OyovCisgIGludCB0YXJnZXRTdG9wQmFuZDsKKworCisgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworCisgIHN0YXJ0U2FtcGxlID0gZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwOworICBzdG9wU2FtcGxlICA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKworCisgIGludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzKGhMcHBUcmFucywgbkludmZCYW5kcywgc2JyX2ludmZfbW9kZSwgc2JyX2ludmZfbW9kZV9wcmV2LCBid1ZlY3Rvcik7CisKKyAgc3RvcFNhbXBsZUNsZWFyID0gc3RvcFNhbXBsZTsKKworICBhdXRvQ29yckxlbmd0aCA9IHBTZXR0aW5ncy0+bkNvbHMgKyBwU2V0dGluZ3MtPm92ZXJsYXA7CisKKyAgLyogU2V0IHVwcGVyIHN1YmJhbmRzIHRvIHplcm86CisgICAgIFRoaXMgaXMgcmVxdWlyZWQgaW4gY2FzZSB0aGF0IHRoZSBwYXRjaGVzIGRvIG5vdCBjb3ZlciB0aGUgY29tcGxldGUgaGlnaGJhbmQKKyAgICAgKGJlY2F1c2UgdGhlIGxhc3QgcGF0Y2ggd291bGQgYmUgdG9vIHNob3J0KS4KKyAgICAgUG9zc2libGUgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLworICB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcy0xXS50YXJnZXRTdGFydEJhbmQKKyAgICAgICAgICAgICAgICAgKyBwYXRjaFBhcmFtW3BTZXR0aW5ncy0+bm9PZlBhdGNoZXMtMV0ubnVtQmFuZHNJblBhdGNoOworCisgIGludCBtZW1TaXplID0gKCg2NCkgLSB0YXJnZXRTdG9wQmFuZCkgKiBzaXplb2YoRklYUF9EQkwpOworCisgIGlmICghdXNlTFApIHsKKyAgICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGVDbGVhcjsgaSsrKSB7CisgICAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOworICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlckltYWdbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKKyAgICB9CisgIH0gZWxzZQorICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGVDbGVhcjsgaSsrKSB7CisgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKKyAgfQorCisgIC8qIGluaXQgYndJbmRleCBmb3IgZWFjaCBwYXRjaCAqLworICBGREttZW1jbGVhcihid0luZGV4LCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzKnNpemVvZihJTlQpKTsKKworICAvKgorICAgIENhbGMgY29tbW9uIGxvdyBiYW5kIHNjYWxlIGZhY3RvcgorICAqLworICBjb21Mb3dCYW5kU2NhbGUgPSBmaXhNaW4oc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlLHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSk7CisKKyAgb3ZMb3dCYW5kU2hpZnQgPSAgc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlIC0gY29tTG93QmFuZFNjYWxlOworICBsb3dCYW5kU2hpZnQgICA9ICBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7CisgIC8qICBvdkhpZ2hCYW5kU2hpZnQgPSBmaXJzdFNsb3RPZmZzID09IDAgPyBvdkxvd0JhbmRTaGlmdDowOyovCisKKyAgLyogb3V0ZXIgbG9vcCBvdmVyIGJhbmRzIHRvIGRvIGFuYWx5c2lzIG9ubHkgb25jZSBmb3IgZWFjaCBiYW5kICovCisKKyAgaWYgKCF1c2VMUCkgeworICAgIHN0YXJ0ID0gcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmc7CisgICAgc3RvcCA9IHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmc7CisgIH0gZWxzZQorICB7CisgICAgc3RhcnQgPSBmaXhNYXgoMSwgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgLSAyKTsKKyAgICBzdG9wID0gcGF0Y2hQYXJhbVswXS50YXJnZXRTdGFydEJhbmQ7CisgIH0KKworCisgIGZvciAoIGxvQmFuZCA9IHN0YXJ0OyBsb0JhbmQgPCAgc3RvcDsgbG9CYW5kKysgKSB7CisKKyAgICBGSVhQX0RCTCAgbG93QmFuZFJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKStMUENfT1JERVJdOworICAgIEZJWFBfREJMICpwbG93QmFuZFJlYWwgPSBsb3dCYW5kUmVhbDsKKyAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJSZWFsID0gcW1mQnVmZmVyUmVhbDsKKyAgICBGSVhQX0RCTCAgbG93QmFuZEltYWdbKCgoMTAyNCkvKDMyKSkrKDYpKStMUENfT1JERVJdOworICAgIEZJWFBfREJMICpwbG93QmFuZEltYWcgPSBsb3dCYW5kSW1hZzsKKyAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJJbWFnID0gcW1mQnVmZmVySW1hZzsKKyAgICBpbnQgcmVzZXRMUENDb2VmZnM9MDsKKyAgICBpbnQgZHluYW1pY1NjYWxlID0gREZSQUNUX0JJVFMtMS1MUENfU0NBTEVfRkFDVE9SOworICAgIGludCBhY0RldFNjYWxlID0gMDsgLyogc2NhbGluZyBvZiBhdXRvY29ycmVsYXRpb24gZGV0ZXJtaW5hbnQgKi8KKworICAgIGZvcihpPTA7aTxMUENfT1JERVI7aSsrKXsKKyAgICAgICpwbG93QmFuZFJlYWwrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbFtpXVtsb0JhbmRdOworICAgICAgaWYgKCF1c2VMUCkKKyAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2xvQmFuZF07CisgICAgfQorCisgICAgLyoKKyAgICAgIFRha2Ugb2xkIHNsb3BlIGxlbmd0aCBxbWYgc2xvdCBzb3VyY2UgdmFsdWVzIG91dCBvZiAob3ZlcmxhcClxbWYgYnVmZmVyCisgICAgKi8KKyAgICBpZiAoIXVzZUxQKSB7CisgICAgICBmb3IoaT0wO2k8cFNldHRpbmdzLT5uQ29scytwU2V0dGluZ3MtPm92ZXJsYXA7aSsrKXsKKyAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOworICAgICAgICAqcGxvd0JhbmRJbWFnKysgPSAoKnBxbWZCdWZmZXJJbWFnKyspW2xvQmFuZF07CisgICAgICB9CisgICAgfSBlbHNlCisgICAgeworICAgICAgLyogcFNldHRpbmdzLT5vdmVybGFwIGlzIGFsd2F5cyBldmVuICovCisgICAgICBGREtfQVNTRVJUKChwU2V0dGluZ3MtPm92ZXJsYXAgJiAxKSA9PSAwKTsKKworICAgICAgZm9yKGk9MDtpPCgocFNldHRpbmdzLT5vdmVybGFwK3BTZXR0aW5ncy0+bkNvbHMpPj4xKTtpKyspIHsKKyAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOworICAgICAgICAqcGxvd0JhbmRSZWFsKysgPSAoKnBxbWZCdWZmZXJSZWFsKyspW2xvQmFuZF07CisgICAgICB9CisgICAgICBpZiAocFNldHRpbmdzLT5uQ29scyAmIDEpIHsKKyAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOworICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICBEZXRlcm1pbmUgZHluYW1pYyBzY2FsaW5nIHZhbHVlLgorICAgICAqLworICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1pbihkeW5hbWljU2NhbGUsIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRSZWFsLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwKSArIG92TG93QmFuZFNoaWZ0KTsKKyAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3RvcigmbG93QmFuZFJlYWxbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMpICsgbG93QmFuZFNoaWZ0KTsKKyAgICBpZiAoIXVzZUxQKSB7CisgICAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kSW1hZywgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCkgKyBvdkxvd0JhbmRTaGlmdCk7CisgICAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3RvcigmbG93QmFuZEltYWdbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMpICsgbG93QmFuZFNoaWZ0KTsKKyAgICB9CisgICAgZHluYW1pY1NjYWxlID0gZml4TWF4KDAsIGR5bmFtaWNTY2FsZS0xKTsgLyogb25lIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIHRvIHByZXZlbnQgLTEuMCAqLworCisgICAgLyoKKyAgICAgIFNjYWxlIHRlbXBvcmFsIFFNRiBidWZmZXIuCisgICAgICovCisgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsWzBdLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwLCBkeW5hbWljU2NhbGUtb3ZMb3dCYW5kU2hpZnQpOworICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kUmVhbFtMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlLWxvd0JhbmRTaGlmdCk7CisKKyAgICBpZiAoIXVzZUxQKSB7CisgICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbMF0sIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXAsIGR5bmFtaWNTY2FsZS1vdkxvd0JhbmRTaGlmdCk7CisgICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMsIGR5bmFtaWNTY2FsZS1sb3dCYW5kU2hpZnQpOworICAgIH0KKworCisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfY3BseCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgbG93QmFuZEltYWcrTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOworICAgICAgfQorCisgICAgICAvKiBFeGFtaW5lIGR5bmFtaWMgb2YgZGV0ZXJtaW5hbnQgaW4gYXV0b2NvcnJlbGF0aW9uLiAqLworICAgICAgYWNEZXRTY2FsZSArPSAyKihjb21Mb3dCYW5kU2NhbGUgKyBkeW5hbWljU2NhbGUpOworICAgICAgYWNEZXRTY2FsZSAqPSAyOyAgICAgICAgICAgICAgLyogdHdvIHRpbWVzIHJlZmxlY3Rpb24gY29lZmZpY2VudCBzY2FsaW5nICovCisgICAgICBhY0RldFNjYWxlICs9IGFjLmRldF9zY2FsZTsgICAvKiBhYyBzY2FsaW5nIG9mIGRldGVybWluYW50ICovCisKKyAgICAgIC8qIEluIGNhc2Ugb2YgZGV0ZXJtaW5hbnQgPCAxMF4tMzgsIHJlc2V0TFBDQ29lZmZzPTEgaGFzIHRvIGJlIGVuZm9yY2VkLiAqLworICAgICAgaWYgKGFjRGV0U2NhbGU+MTI2ICkgeworICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgICB9CisKKworICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApCisgICAgICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICAgIGlmIChhYy5kZXQgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIEZJWFBfREJMIHRtcCxhYnNUbXAsYWJzRGV0OworCisgICAgICBhYnNEZXQgPSBmaXhwX2FicyhhYy5kZXQpOworCisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIHRtcCA9ICggZk11bHREaXYyKGFjLnIwMXIsYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSAtCisgICAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMmkpICsgZk11bHREaXYyKGFjLnIwMnIsYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICk7CisgICAgICB9IGVsc2UKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIC0KKyAgICAgICAgICAgICAgKCBmTXVsdERpdjIoYWMucjAycixhYy5yMTFyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApOworICAgICAgfQorICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKKworICAgICAgLyoKKyAgICAgICAgUXVpY2sgY2hlY2s6IGlzIGZpcnN0IGZpbHRlciBjb2VmZiA+PSAxKDQpCisgICAgICAgKi8KKyAgICAgIHsKKyAgICAgICAgSU5UIHNjYWxlOworICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKKyAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CisKKyAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CisgICAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGFscGhhclsxXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpKTsKKyAgICAgICAgICBpZigodG1wPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0PEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICAgIGFscGhhclsxXSA9IC1hbHBoYXJbMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdXNlTFApCisgICAgICB7CisgICAgICAgIHRtcCA9ICAoIGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgKworICAgICAgICAgICAgICAgKCAoZk11bHREaXYyKGFjLnIwMXIsYWMucjEyaSkgLSAoRklYUF9EQkwpZk11bHREaXYyKGFjLnIwMmksYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgOworCisgICAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgUXVpY2sgY2hlY2s6IGlzIHNlY29uZCBmaWx0ZXIgY29lZmYgPj0gMSg0KQorICAgICAgICAqLworICAgICAgICB7CisgICAgICAgICAgSU5UIHNjYWxlOworICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgYWJzRGV0LCAmc2NhbGUpOworICAgICAgICAgIHNjYWxlID0gc2NhbGUrYWMuZGV0X3NjYWxlOworCisgICAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IC8qRkwyRlhDT05TVF9EQkwoMS5mKSovIChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CisgICAgICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYWxwaGFpWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSkpOworICAgICAgICAgICAgaWYoKHRtcDxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldDxGTDJGWF9EQkwoMC4wZikpKSB7CisgICAgICAgICAgICAgIGFscGhhaVsxXSA9IC1hbHBoYWlbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYWxwaGFyWzBdID0gIEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApCisgICAgICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICAgIGlmICggYWMucjExciAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKKworICAgICAgLyogYWMucjExciBpcyBhbHdheXMgPj0wICovCisgICAgICBGSVhQX0RCTCB0bXAsYWJzVG1wOworCisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKworICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEyaSkpOworICAgICAgfSBlbHNlCisgICAgICB7CisgICAgICAgIGlmKGFjLnIwMXI+PUZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOworICAgICAgICBlbHNlCisgICAgICAgICAgdG1wID0gLSgoLWFjLnIwMXIpPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOworICAgICAgfQorCisgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOworCisgICAgICAvKgorICAgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKKyAgICAgICovCisKKyAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7CisgICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgSU5UIHNjYWxlOworICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOworICAgICAgICBhbHBoYXJbMF0gPSAgRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSsxKSk7CisKKyAgICAgICAgaWYoKHRtcD5GTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXI8RkwyRlhfREJMKDAuMGYpKSkKKyAgICAgICAgICBhbHBoYXJbMF0gPSAtYWxwaGFyWzBdOworICAgICAgfQorCisgICAgICBpZiAoIXVzZUxQKQorICAgICAgeworICAgICAgICB0bXAgPSAoYWMucjAxaT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsKKyAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMmkpKTsKKworICAgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOworCisgICAgICAgIC8qCisgICAgICAgIFF1aWNrIGNoZWNrOiBpcyBzZWNvbmQgZmlsdGVyIGNvZWZmID49IDEoNCkKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExcj4+MSkpIHsKKyAgICAgICAgICByZXNldExQQ0NvZWZmcz0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIElOVCBzY2FsZTsKKyAgICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOworICAgICAgICAgIGFscGhhaVswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUrMSkpOworICAgICAgICAgIGlmKCh0bXA+RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpCisgICAgICAgICAgICBhbHBoYWlbMF0gPSAtYWxwaGFpWzBdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoIXVzZUxQKQorICAgIHsKKyAgICAgIC8qIE5vdyBjaGVjayB0aGUgcXVhZHJhdGljIGNyaXRlcmlhICovCisgICAgICBpZiggKGZNdWx0RGl2MihhbHBoYXJbMF0sYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sYWxwaGFpWzBdKSkgPj0gRkwyRlhDT05TVF9EQkwoMC41ZikgKQorICAgICAgICByZXNldExQQ0NvZWZmcz0xOworICAgICAgaWYoIChmTXVsdERpdjIoYWxwaGFyWzFdLGFscGhhclsxXSkgKyBmTXVsdERpdjIoYWxwaGFpWzFdLGFscGhhaVsxXSkpID49IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKKyAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKKyAgICB9CisKKyAgICBpZihyZXNldExQQ0NvZWZmcyl7CisgICAgICBhbHBoYXJbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgICAgaWYgKCF1c2VMUCkKKyAgICAgIHsKKyAgICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VMUCkKKyAgICB7CisKKyAgICAgIC8qIEFsaWFzaW5nIGRldGVjdGlvbiAqLworICAgICAgaWYoYWMucjExcj09RkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgazEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIGZpeHBfYWJzKGFjLnIwMXIpID49IGZpeHBfYWJzKGFjLnIxMXIpICkgeworICAgICAgICAgIGlmICggZk11bHREaXYyKGFjLnIwMXIsYWMucjExcikgPCBGTDJGWF9EQkwoMC4wZikpIHsKKyAgICAgICAgICAgIGsxID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX1NHTCgxLjBmKSovOworICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIC8qIFNpbmNlIHRoaXMgdmFsdWUgaXMgc3F1YXJlZCBsYXRlciwgaXQgbXVzdCBub3QgZXZlciBiZWNvbWUgLTEuMGYuICovCisgICAgICAgICAgICBrMSA9IChGSVhQX0RCTCkoTUlOVkFMX0RCTCsxKSAvKkZMMkZYQ09OU1RfU0dMKC0xLjBmKSovOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBJTlQgc2NhbGU7CisgICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oZml4cF9hYnMoYWMucjAxciksIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOworICAgICAgICAgIGsxID0gc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpOworCisgICAgICAgICAgaWYoISgoYWMucjAxcjxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXI8RkwyRlhfREJMKDAuMGYpKSkpIHsKKyAgICAgICAgICAgIGsxID0gLWsxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYobG9CYW5kID4gMSl7CisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBnYWluIHNob3VsZCBiZSBsb2NrZWQgKi8KKyAgICAgICAgRklYUF9EQkwgZGVnID0gLypGTDJGWENPTlNUX0RCTCgxLjBmKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gZlBvdzIoazFfYmVsb3cpOworICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDApICYmIChrMSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSl7CisgICAgICAgICAgaWYgKGsxX2JlbG93IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgICAgICAgICAvKiAyLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLzsKKyAgICAgICAgICAgIGlmICggazFfYmVsb3cyID4gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7ICAgIC8qIDMtQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCisgICAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZC0xXSA9IGRlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoIGsxX2JlbG93MiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAvKiAzLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSAgID0gZGVnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKChsb0JhbmQgJiAxKSA9PSAxKSAmJiAoazEgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkpeworICAgICAgICAgIGlmIChrMV9iZWxvdyA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7ICAgICAgICAgLyogMi1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi87CisgICAgICAgICAgICBpZiAoIGsxX2JlbG93MiA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAgICAvKiAzLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmQtMV0gPSBkZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIHJlbWVtYmVyIGsxIHZhbHVlcyBvZiB0aGUgMiBRTUYgY2hhbm5lbHMgYmVsb3cgdGhlIGN1cnJlbnQgY2hhbm5lbCAqLworICAgICAgazFfYmVsb3cyID0gazFfYmVsb3c7CisgICAgICBrMV9iZWxvdyA9IGsxOworICAgIH0KKworICAgIHBhdGNoID0gMDsKKworICAgIHdoaWxlICggcGF0Y2ggPCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzICkgeyAvKiBpbm5lciBsb29wIG92ZXIgZXZlcnkgcGF0Y2ggKi8KKworICAgICAgaW50IGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOworCisgICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAorICAgICAgICAgICB8fCBsb0JhbmQgPj0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQKKyAgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKKyAgICAgICAgICAgKSB7CisgICAgICAgIC8qIExvd2JhbmQgbm90IGluIGN1cnJlbnQgcGF0Y2ggLSBwcm9jZWVkICovCisgICAgICAgIHBhdGNoKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBGREtfQVNTRVJUKCBoaUJhbmQgPCAoNjQpICk7CisKKyAgICAgIC8qIGJ3SW5kZXhbcGF0Y2hdIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZSBmcm9tIHByZXZpb3VzIGJhbmQgaW5zaWRlIHRoaXMgcGF0Y2ggKi8KKyAgICAgIHdoaWxlIChoaUJhbmQgPj0gcFNldHRpbmdzLT5id0JvcmRlcnNbYndJbmRleFtwYXRjaF1dKQorICAgICAgICBid0luZGV4W3BhdGNoXSsrOworCisKKyAgICAgIC8qCisgICAgICAgIEZpbHRlciBTdGVwIDI6IGFkZCB0aGUgbGVmdCBzbG9wZSB3aXRoIHRoZSBjdXJyZW50IGZpbHRlciB0byB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgIHB1cmUgc291cmNlIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB0aGVyZQorICAgICAgKi8KKyAgICAgIGJ3ID0gRlhfREJMMkZYX1NHTChid1ZlY3Rvcltid0luZGV4W3BhdGNoXV0pOworCisgICAgICBhMHIgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhclswXSkpOyAvKiBBcHBseSBjdXJyZW50IGJhbmR3aWR0aCBleHBhbnNpb24gZmFjdG9yICovCisKKworICAgICAgaWYgKCF1c2VMUCkKKyAgICAgICAgYTBpID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYWlbMF0pKTsKKyAgICAgIGJ3ID0gIEZYX0RCTDJGWF9TR0woZlBvdzIoYncpKTsKKyAgICAgIGExciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFyWzFdKSk7CisgICAgICBpZiAoIXVzZUxQKQorICAgICAgICBhMWkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhaVsxXSkpOworCisKKworICAgICAgLyoKKyAgICAgICAgRmlsdGVyIFN0ZXAgMzogaW5zZXJ0IHRoZSBtaWRkbGUgcGFydCB3aGljaCB3b24ndCBiZSB3aW5kb3dlZAorICAgICAgKi8KKworICAgICAgaWYgKCBidyA8PSBGTDJGWENPTlNUX1NHTCgwLjBmKSApIHsKKyAgICAgICAgaWYgKCF1c2VMUCkgeworICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOworICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7CisgICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7CisgICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBsb3dCYW5kSW1hZ1tMUENfT1JERVIraV0+PmRlc2NhbGU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOworICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7CisgICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsgIC8qIGJ3IDw9IDAgKi8KKworICAgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CisjaWZkZWYgRlVOQ1RJT05fTFBQVFJBTlNQT1NFUl9mdW5jMQorICAgICAgICAgIGxwcFRyYW5zcG9zZXJfZnVuYzEobG93QmFuZFJlYWwrTFBDX09SREVSK3N0YXJ0U2FtcGxlLGxvd0JhbmRJbWFnK0xQQ19PUkRFUitzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWwrc3RhcnRTYW1wbGUscW1mQnVmZmVySW1hZytzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BTYW1wbGUtc3RhcnRTYW1wbGUsIChpbnQpIGhpQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSxkZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTByLCBhMGksIGExciwgYTFpKTsKKyNlbHNlCisgICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKKyAgICAgICAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKKworICAgICAgICAgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgLSBmTXVsdERpdjIoYTBpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFyLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTJdKSAtIGZNdWx0RGl2MihhMWksbG93QmFuZEltYWdbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOworICAgICAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSxsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgKyBmTXVsdERpdjIoYTByLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTJdKSArIGZNdWx0RGl2MihhMXIsbG93QmFuZEltYWdbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOworCisgICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7CisgICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSAobG93QmFuZEltYWdbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1Mjw8MSk7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CisKKyAgICAgICAgICBGREtfQVNTRVJUKGR5bmFtaWNTY2FsZSA+PSAwKTsKKyAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgeworICAgICAgICAgICAgRklYUF9EQkwgYWNjdTE7CisKKyAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CisKKyAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IChsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGUpICsgKGFjY3UxPDwxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogYncgPD0gMCAqLworCisgICAgICBwYXRjaCsrOworCisgICAgfSAgLyogaW5uZXIgbG9vcCBvdmVyIHBhdGNoZXMgKi8KKworICAgICAvKgorICAgICAqIHN0b3JlIHRoZSB1bm1vZGlmaWVkIGZpbHRlciBjb2VmZmljaWVudHMgaWYgdGhlcmUgaXMKKyAgICAgKiBhbiBvdmVybGFwcGluZyBlbnZlbG9wZQorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIH0gIC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyAobG9CYW5kKSAqLworCisgIGlmICh1c2VMUCkKKyAgeworICAgIGZvciAoIGxvQmFuZCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOyBsb0JhbmQgPCAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsgbG9CYW5kKysgKSB7CisgICAgICBwYXRjaCA9IDA7CisgICAgICB3aGlsZSAoIHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyApIHsKKworICAgICAgICBVQ0hBUiBoaUJhbmQgPSBsb0JhbmQgKyBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmczsKKworICAgICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAorICAgICAgICAgIHx8IGxvQmFuZCA+PSBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZAorICAgICAgICAgIHx8IGhpQmFuZCA+PSAoNjQpICAgICAgICAgICAgICAvKiBIaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKGJpdGVycm9yKSAqLworICAgICAgICAgICkgeworICAgICAgICAgIC8qIExvd2JhbmQgbm90IGluIGN1cnJlbnQgcGF0Y2ggb3IgaGlnaGJhbmQgb3V0IG9mIHJhbmdlIChtaWdodCBiZSBjYXVzZWQgYnkgYml0ZXJyb3JzKS0gcHJvY2VlZCAqLworICAgICAgICAgIHBhdGNoKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZihoaUJhbmQgIT0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kKQorICAgICAgICAgIGRlZ3JlZUFsaWFzW2hpQmFuZF0gPSBkZWdyZWVBbGlhc1tsb0JhbmRdOworCisgICAgICAgIHBhdGNoKys7CisgICAgICB9CisgICAgfS8qIGVuZCAgZm9yIGxvb3AgKi8KKyAgfQorCisgZm9yIChpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKyApIHsKKyAgIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0gPSBid1ZlY3RvcltpXTsKKyB9CisKKyAgLyoKKyAgICBzZXQgaGlnaCBiYW5kIHNjYWxlIGZhY3RvcgorICAqLworICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21Mb3dCYW5kU2NhbGUtKExQQ19TQ0FMRV9GQUNUT1IpOworCit9CisKKy8qIQorICoKKyAqIFxicmllZiBJbml0aWFsaXplIG9uZSBsb3cgcG93ZXIgdHJhbnNwb3NlciBpbnN0YW5jZQorICoKKyAqCisgKi8KK1NCUl9FUlJPUgorY3JlYXRlTHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaHMsIC8qITwgSGFuZGxlIG9mIGxvdyBwb3dlciB0cmFuc3Bvc2VyICAqLworICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCAvKiE8IFBvaW50ZXIgdG8gc2V0dGluZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgaGlnaEJhbmRTdGFydFNiLCAvKiE8ID8gKi8KKyAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtTWFzdGVyLCAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNiLCAgICAgICAgICAgICAvKiE8IEhpZ2hiYW5kIGFyZWEgc3RvcCBzdWJiYW5kICovCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZVNsb3RzLCAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzICovCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNvbHMsICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb2x1bXMgKGNvZGVjIHFtZiBiYW5rKSAqLworICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbm9Ob2lzZUJhbmRzLCAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMsICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSBGcmVxdWVuY3kgKi8KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwCisgICAgICAgICAgICAgICAgICAgICApCit7CisgIC8qIEZCIGludmVyc2UgZmlsdGVyaW5nIHNldHRpbmdzICovCisgIGhzLT5wU2V0dGluZ3MgPSBwU2V0dGluZ3M7CisKKyAgcFNldHRpbmdzLT5uQ29scyA9IG5Db2xzOworICBwU2V0dGluZ3MtPm92ZXJsYXAgPSBvdmVybGFwOworCisgIHN3aXRjaCAodGltZVNsb3RzKSB7CisKKyAgY2FzZSAxNToKKyAgY2FzZSAxNjoKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOyAvKiBVbmltcGxlbWVudGVkICovCisgIH0KKworICBpZiAoY2hhbj09MCkgeworICAgIC8qIEluaXQgY29tbW9uIGRhdGEgb25seSBvbmNlICovCisgICAgaHMtPnBTZXR0aW5ncy0+bkNvbHMgPSBuQ29sczsKKworICAgIHJldHVybiByZXNldExwcFRyYW5zcG9zZXIgKGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hCYW5kU3RhcnRTYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzKTsKKyAgfQorICByZXR1cm4gU0JSREVDX09LOworfQorCisKK3N0YXRpYyBpbnQgZmluZENsb3Nlc3RFbnRyeShVQ0hBUiBnb2FsU2IsIFVDSEFSICp2X2tfbWFzdGVyLCBVQ0hBUiBudW1NYXN0ZXIsIFVDSEFSIGRpcmVjdGlvbikKK3sKKyAgaW50IGluZGV4OworCisgIGlmKCBnb2FsU2IgPD0gdl9rX21hc3RlclswXSApCisgICAgcmV0dXJuIHZfa19tYXN0ZXJbMF07CisKKyAgaWYoIGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0gKQorICAgIHJldHVybiB2X2tfbWFzdGVyW251bU1hc3Rlcl07CisKKyAgaWYoZGlyZWN0aW9uKSB7CisgICAgaW5kZXggPSAwOworICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA8IGdvYWxTYiApIHsKKyAgICAgIGluZGV4Kys7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGV4ID0gbnVtTWFzdGVyOworICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA+IGdvYWxTYiApIHsKKyAgICAgIGluZGV4LS07CisgICAgfQorICB9CisKKyAgcmV0dXJuIHZfa19tYXN0ZXJbaW5kZXhdOworfQorCisKKy8qIQorICoKKyAqIFxicmllZiBSZXNldCBtZW1vcnkgZm9yIG9uZSBscHAgdHJhbnNwb3NlciBpbnN0YW5jZQorICoKKyAqIFxyZXR1cm4gU0JSREVDX09LIG9uIHN1Y2Nlc3MsIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUcgb24gZXJyb3IKKyAqLworU0JSX0VSUk9SCityZXNldExwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLworICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdGFydCBzdWJiYW5kICovCisgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgIFVDSEFSICBudW1NYXN0ZXIsICAgICAgICAgICAgICAgIC8qITwgVmFsaWQgZW50cmllcyBpbiBtYXN0ZXIgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG5vTm9pc2VCYW5kcywgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgIHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBIaWdoIGJhbmQgYXJlYTogc3RvcCBzdWJiYW5kICovCisgICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU0JSIG91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgICAgICAgICAgKQoreworICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKKyAgUEFUQ0hfUEFSQU0gICpwYXRjaFBhcmFtID0gcFNldHRpbmdzLT5wYXRjaFBhcmFtOworCisgIGludCBpLCBwYXRjaDsKKyAgaW50IHRhcmdldFN0b3BCYW5kOworICBpbnQgc291cmNlU3RhcnRCYW5kOworICBpbnQgcGF0Y2hEaXN0YW5jZTsKKyAgaW50IG51bUJhbmRzSW5QYXRjaDsKKworICBpbnQgbHNiID0gdl9rX21hc3RlclswXTsgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHN1YmJhbmQgZXhwcmVzc2VkIGluICJub24tY3JpdGljYWwiIHNhbXBsaW5nIHRlcm1zKi8KKyAgaW50IHhvdmVyT2Zmc2V0ID0gaGlnaEJhbmRTdGFydFNiIC0gbHNiOyAvKiBDYWxjdWxhdGUgZGlzdGFuY2UgaW4gUU1GIGJhbmRzIGJldHdlZW4gazAgYW5kIGt4ICovCisgIGludCBzdGFydEZyZXFIejsKKworICBpbnQgZGVzaXJlZEJvcmRlcjsKKworICB1c2IgPSBmaXhNaW4odXNiLCB2X2tfbWFzdGVyW251bU1hc3Rlcl0pOyAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIChjb21wYXJlIHdpdGggZmxvYXQgY29kZSkuICovCisKKyAgLyoKKyAgICogUGxhdXNpYmlsaXR5IGNoZWNrCisgICAqLworCisgIGlmICggbHNiIC0gU0hJRlRfU1RBUlRfU0IgPCA0ICkgeworICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKworICAvKgorICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKKyAgICovCisgIC8qIElTTy9JRUMgMTQ0OTYtMyAoRmlndXJlIDQuNDgpOiBnb2FsU2IgPSByb3VuZCggMi4wNDhlNiAvIGZzICkgKi8KKyAgZGVzaXJlZEJvcmRlciAgICA9ICgoKDIwNDgwMDAqMikgLyBmcykgKyAxKSA+PiAxOworCisgIGRlc2lyZWRCb3JkZXIgPSBmaW5kQ2xvc2VzdEVudHJ5KGRlc2lyZWRCb3JkZXIsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMSk7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KKworICAvKiBGaXJzdCBwYXRjaCAqLworICBzb3VyY2VTdGFydEJhbmQgPSBTSElGVF9TVEFSVF9TQiArIHhvdmVyT2Zmc2V0OworICB0YXJnZXRTdG9wQmFuZCA9IGxzYiArIHhvdmVyT2Zmc2V0OyAvKiB1cHBlckJhbmQgKi8KKworICAvKiBFdmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgbXVzdCBiZSBwYXRjaGVkIHRvIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCAqLworICBwYXRjaCA9IDA7CisgIHdoaWxlKHRhcmdldFN0b3BCYW5kIDwgdXNiKSB7CisKKyAgICAvKiBUb28gbWFueSBwYXRjaGVzPworICAgICAgIEFsbG93IE1BWF9OVU1fUEFUQ0hFUysxIHBhdGNoZXMgaGVyZS4KKyAgICAgICB3ZSBuZWVkIHRvIGNoZWNrIGxhdGVyIGFnYWluLCBzaW5jZSBwYXRjaCBtaWdodCBiZSB0aGUgaGlnaGVzdCBwYXRjaAorICAgICAgIEFORCBjb250YWluIGxlc3MgdGhhbiAzIGJhbmRzID0+IGFjdHVhbCBudW1iZXIgb2YgcGF0Y2hlcyB3aWxsIGJlIHJlZHVjZWQgYnkgMS4KKyAgICAqLworICAgIGlmIChwYXRjaCA+IE1BWF9OVU1fUEFUQ0hFUykgeworICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgfQorCisgICAgcGF0Y2hQYXJhbVtwYXRjaF0uZ3VhcmRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKKyAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKKworICAgIG51bUJhbmRzSW5QYXRjaCA9IGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZDsgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkZXNpcmVkIHJhbmdlIG9mIHRoZSBwYXRjaCAqLworCisgICAgaWYgKCBudW1CYW5kc0luUGF0Y2ggPj0gbHNiIC0gc291cmNlU3RhcnRCYW5kICkgeworICAgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIG5vdCBhdmFpbGFibGUgLT4gcGF0Y2ggd2hvbGUgc291cmNlIHJhbmdlICovCisgICAgICBwYXRjaERpc3RhbmNlICAgPSB0YXJnZXRTdG9wQmFuZCAtIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCisgICAgICBwYXRjaERpc3RhbmNlICAgPSBwYXRjaERpc3RhbmNlICYgfjE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIG9mZiBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLworICAgICAgbnVtQmFuZHNJblBhdGNoID0gbHNiIC0gKHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZSk7ICAvKiBVcGRhdGUgbnVtYmVyIG9mIGJhbmRzIHRvIGJlIHBhdGNoZWQgKi8KKyAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQ7ICAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCisgICAgfQorCisgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIGF2YWlsYWJsZSAtPiBnZXQgdGhlIG1pbmltYWwgZXZlbiBwYXRjaGluZyBkaXN0YW5jZSAqLworICAgIHBhdGNoRGlzdGFuY2UgICA9IG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAgLyogR2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KKyAgICBwYXRjaERpc3RhbmNlICAgPSAocGF0Y2hEaXN0YW5jZSArIDEpICYgfjE7ICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIHVwIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCisKKyAgICBpZiAobnVtQmFuZHNJblBhdGNoID4gMCkgeworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQgLSBwYXRjaERpc3RhbmNlOworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnMgID0gcGF0Y2hEaXN0YW5jZTsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA9IG51bUJhbmRzSW5QYXRjaDsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kICA9IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKKworICAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOworICAgICAgcGF0Y2grKzsKKyAgICB9CisKKyAgICAvKiBBbGwgcGF0Y2hlcyBidXQgZmlyc3QgKi8KKyAgICBzb3VyY2VTdGFydEJhbmQgPSBTSElGVF9TVEFSVF9TQjsKKworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBjbG9zZSB0byBkZXNpcmVkQm9yZGVyICovCisgICAgaWYoIGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZCA8IDMpICAvKiBNUEVHIGRvYyAqLworICAgIHsKKyAgICAgIGRlc2lyZWRCb3JkZXIgPSB1c2I7CisgICAgfQorCisgIH0KKworICBwYXRjaC0tOworCisgIC8qIElmIGhpZ2hlc3QgcGF0Y2ggY29udGFpbnMgbGVzcyB0aGFuIHRocmVlIHN1YmJhbmQ6IHNraXAgaXQgKi8KKyAgaWYgKCAocGF0Y2g+MCkgJiYgKHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMpICkgeworICAgIHBhdGNoLS07CisgICAgdGFyZ2V0U3RvcEJhbmQgPSBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgKyBwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2g7CisgIH0KKworICAvKiBub3cgY2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUgdG9vIG1hbnkgKi8KKyAgaWYgKHBhdGNoID49IE1BWF9OVU1fUEFUQ0hFUykgeworICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyA9IHBhdGNoICsgMTsKKworICAvKiBDaGVjayBsb3dlc3QgYW5kIGhpZ2hlc3Qgc291cmNlIHN1YmJhbmQgKi8KKyAgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgPSB0YXJnZXRTdG9wQmFuZDsKKyAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZyAgPSAwOworICBmb3IgKCBwYXRjaCA9IDA7IHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlczsgcGF0Y2grKyApIHsKKyAgICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9IGZpeE1pbiggcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcsIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCApOworICAgIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgID0gZml4TWF4KCBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nLCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZCApOworICB9CisKKyAgZm9yKGkgPSAwIDsgaSA8IG5vTm9pc2VCYW5kczsgaSsrKXsKKyAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IG5vaXNlQmFuZFRhYmxlW2krMV07CisgIH0KKworICAvKgorICAgKiBDaG9vc2Ugd2hpdGVuaW5nIGZhY3RvcnMKKyAgICovCisKKyAgc3RhcnRGcmVxSHogPSAoIChsc2IgKyB4b3Zlck9mZnNldCkqZnMgKSA+PiA3OyAgLyogU2hpZnQgZG9lcyBhIGRpdmlzaW9uIGJ5IDIqKDY0KSAqLworCisgIGZvciggaSA9IDE7IGkgPCBOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFUzsgaSsrICkKKyAgeworICAgIGlmKCBzdGFydEZyZXFIeiA8IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNJbmRleFtpXSkKKyAgICAgIGJyZWFrOworICB9CisgIGktLTsKKworICBwU2V0dGluZ3MtPndoRmFjdG9ycy5vZmYgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMF07CisgIHBTZXR0aW5ncy0+d2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbCA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVsxXTsKKyAgcFNldHRpbmdzLT53aEZhY3RvcnMubG93TGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMl07CisgIHBTZXR0aW5ncy0+d2hGYWN0b3JzLm1pZExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzNdOworICBwU2V0dGluZ3MtPndoRmFjdG9ycy5oaWdoTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bNF07CisKKyAgcmV0dXJuIFNCUkRFQ19PSzsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL2xwcF90cmFuLmggYi9hYWMvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2E1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5oCkBAIC0wLDAgKzEsMjQyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlciwgIAorKi8KKworI2lmbmRlZiBfTFBQX1RSQU5TX0gKKyNkZWZpbmUgX0xQUF9UUkFOU19ICisKKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAicW1mLmgiCisKKy8qCisgIENvbW1vbgorKi8KKyNkZWZpbmUgUU1GX09VVF9TQ0FMRSAgICAgICAgICAgIDgKKworLyoKKyAgRW52LUFkanVzdAorKi8KKyNkZWZpbmUgTUFYX05PSVNFX0VOVkVMT1BFUyAgICAgIDIKKyNkZWZpbmUgTUFYX05PSVNFX0NPRUZGUyAgICAgICAgIDUKKyNkZWZpbmUgTUFYX05VTV9OT0lTRV9WQUxVRVMgICAgIChNQVhfTk9JU0VfRU5WRUxPUEVTICogTUFYX05PSVNFX0NPRUZGUykKKyNkZWZpbmUgTUFYX05VTV9MSU1JVEVSUyAgICAgICAgIDEyCisKKy8qIFNldCBNQVhfRU5WRUxPUEVTIHRvIHRoZSBsYXJnZXN0IHZhbHVlIG9mIGFsbCBzdXBwb3J0ZWQgQlNGT1JNQVRzCisgICBieSBvdmVycmlkaW5nIE1BWF9FTlZFTE9QRVMgaW4gdGhlIGNvcnJlY3Qgb3JkZXI6ICovCisjZGVmaW5lIE1BWF9FTlZFTE9QRVNfSEVBQUMgICAgICA1CisjZGVmaW5lIE1BWF9FTlZFTE9QRVMgICAgICAgICAgICBNQVhfRU5WRUxPUEVTX0hFQUFDCisKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTICAgICAgICAgIDQ4CisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICAzNQorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCAgMzIKKworCisjZGVmaW5lIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTICAoTUFYX0VOVkVMT1BFUyAqIE1BWF9GUkVRX0NPRUZGUykKKworI2RlZmluZSBNQVhfR0FJTl9FWFAgICAgICAgICAgICAgMzQKKy8qIE1heGltdW0gZ2FpbiB3aWxsIGJlIHNxcnQoMC41ICogMl5NQVhfR0FJTl9FWFApCisgICBleGFtcGxlOiAzND05OWRCICAgKi8KKyNkZWZpbmUgTUFYX0dBSU5fQ09OQ0VBTF9FWFAgICAgIDEKKy8qIE1heGltdW0gZ2FpbiB3aWxsIGJlIHNxcnQoMC41ICogMl5NQVhfR0FJTl9DT05DRUFMX0VYUCkgaW4gY29uY2VhbG1lbnQgY2FzZSAoMGRCKSAqLworCisvKgorICBMUFAgVHJhbnNwb3NlcgorKi8KKyNkZWZpbmUgTFBDX09SREVSICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBNQVhfSU5WRl9CQU5EUyAgICAgICAgICAgTUFYX05PSVNFX0NPRUZGUworCisjZGVmaW5lIE1BWF9OVU1fUEFUQ0hFUyAgICAgICAgICA2CisjZGVmaW5lIFNISUZUX1NUQVJUX1NCICAgICAgICAgICAxICAgICAgICAgICAgICAvKiE8IGxvd2VzdCBzdWJiYW5kIG9mIHNvdXJjZSByYW5nZSAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5WRl9PRkYgPSAwLAorICBJTlZGX0xPV19MRVZFTCwKKyAgSU5WRl9NSURfTEVWRUwsCisgIElOVkZfSElHSF9MRVZFTCwKKyAgSU5WRl9TV0lUQ0hFRCAvKiBub3QgYSByZWFsIGNob2ljZSBidXQgdXNlZCBoZXJlIHRvIGNvbnRyb2wgYmVoYXZpb3VyICovCit9CitJTlZGX01PREU7CisKKworLyoqIHBhcmFtZXRlciBzZXQgZm9yIG9uZSBzaW5nbGUgcGF0Y2ggKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgIHNvdXJjZVN0YXJ0QmFuZDsgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hlcmUgdG8gdGFrZSB0aGUgc2FtcGxlcyBmcm9tICovCisgIFVDSEFSICBzb3VyY2VTdG9wQmFuZDsgICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggYW55bW9yZSAqLworICBVQ0hBUiAgZ3VhcmRTdGFydEJhbmQ7ICAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlIGludGVyZmVyZW5jZXMgYmV0d2VlbiBwYXRjaGVzICovCisgIFVDSEFSICB0YXJnZXRTdGFydEJhbmQ7ICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZCBsb3diYW5kIHNpZ25hbCAqLworICBVQ0hBUiAgdGFyZ2V0QmFuZE9mZnM7ICAgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZCAnc3RhcnRTb3VyY2VCYW5kJyAqLworICBVQ0hBUiAgbnVtQmFuZHNJblBhdGNoOyAgIC8qITwgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhbmRzIGluIHRoaXMgb25lIHBhdGNoICovCit9IFBBVENIX1BBUkFNOworCisKKy8qKiB3aGl0ZW5pbmcgZmFjdG9ycyBmb3IgZGlmZmVyZW50IGxldmVscyBvZiB3aGl0ZW5pbmcKKyAgICBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGNvcnJlc3BvbmRpbmcgdG8gY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCAgb2ZmOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBPRkYgKi8KKyAgRklYUF9EQkwgIHRyYW5zaXRpb25MZXZlbDsKKyAgRklYUF9EQkwgIGxvd0xldmVsOyAgICAgICAgICAgICAgICAgIC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgTE9XX0xFVkVMICovCisgIEZJWFBfREJMICBtaWRMZXZlbDsgICAgICAgICAgICAgICAgICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIE1JRF9MRVZFTCAqLworICBGSVhQX0RCTCAgaGlnaExldmVsOyAgICAgICAgICAgICAgICAgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBISUdIX0xFVkVMICovCit9IFdISVRFTklOR19GQUNUT1JTOworCisKKy8qISBUaGUgdHJhbnNwb3NlciBzZXR0aW5ncyBhcmUgY2FsY3VsYXRlZCBvbiBhIGhlYWRlciByZXNldCBhbmQgYXJlIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiAgbkNvbHM7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBzdWJzYW1wbGVzIG9mIGEgY29kZWMgZnJhbWUgKi8KKyAgVUNIQVIgIG5vT2ZQYXRjaGVzOyAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgcGF0Y2hlcyAqLworICBVQ0hBUiAgbGJTdGFydFBhdGNoaW5nOyAgICAgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgb2YgbG93YmFuZHMgdGhhdCB3aWxsIGJlIHBhdGNoZWQgKi8KKyAgVUNIQVIgIGxiU3RvcFBhdGNoaW5nOyAgICAgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIHRoYXQgd29uJ3QgYmUgcGF0Y2hlZCBhbnltb3JlKi8KKyAgVUNIQVIgIGJ3Qm9yZGVyc1tNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgc3BlY3RyYWwgYmFuZHMgd2l0aCBkaWZmZXJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzICovCisKKyAgUEFUQ0hfUEFSQU0gICAgcGF0Y2hQYXJhbVtNQVhfTlVNX1BBVENIRVNdOyAvKiE8IG5ldyBwYXJhbWV0ZXIgc2V0IGZvciBwYXRjaGluZyAqLworICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnM7ICAgICAgICAgICAgICAgIC8qITwgdGhlIHBvbGUgbW92aW5nIGZhY3RvcnMgZm9yIGNlcnRhaW4gd2hpdGVuaW5nIGxldmVscyBhcyBpbmRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXRzdHJlYW0gZGVwZW5kaW5nIG9uIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5ICovCisgIFVDSEFSICBvdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdmVybGFwIHNpemUgKi8KK30gVFJBTlNQT1NFUl9TRVRUSU5HUzsKKworCit0eXBlZGVmIHN0cnVjdAoreworICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3M7ICAgICAgICAgICAgICAgIC8qITwgQ29tbW9uIHNldHRpbmdzIGZvciBib3RoIGNoYW5uZWxzICovCisgIEZJWFBfREJMICBid1ZlY3Rvck9sZFtNQVhfTlVNX1BBVENIRVNdOyAgICAgICAgLyohPCBwb2xlIG1vdmluZyBmYWN0b3JzIG9mIHBhc3QgZnJhbWUgKi8KKyAgRklYUF9EQkwgIGxwY0ZpbHRlclN0YXRlc1JlYWxbTFBDX09SREVSXVsoMzIpXTsgICAgIC8qITwgcG9pbnRlciBhcnJheSB0byBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KKyAgRklYUF9EQkwgIGxwY0ZpbHRlclN0YXRlc0ltYWdbTFBDX09SREVSXVsoMzIpXTsgICAgIC8qITwgcG9pbnRlciBhcnJheSB0byBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KK30KK1NCUl9MUFBfVFJBTlM7CisKK3R5cGVkZWYgU0JSX0xQUF9UUkFOUyAqSEFORExFX1NCUl9MUFBfVFJBTlM7CisKKwordm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCisgICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpcnN0U2xvdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkludmZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLAorICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldgorICAgICAgICAgICAgICAgICAgICApOworCisKK1NCUl9FUlJPUgorY3JlYXRlTHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBoaWdoQmFuZFN0YXJ0U2IsCisgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICB1c2IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbkNvbHMsCisgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIG5vTm9pc2VCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwKTsKKworCitTQlJfRVJST1IKK3Jlc2V0THBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbm9Ob2lzZUJhbmRzLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgdXNiLAorICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMpOworCisKKworI2VuZGlmIC8qIF9MUFBfVFJBTlNfSCAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliZGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmNwcApAQCAtMCwwICsxLDU5MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJwc2JpdGRlYy5oIgorCisKKyNpbmNsdWRlICJzYnJfcm9tLmgiCisjaW5jbHVkZSAiaHVmZl9kZWMuaCIKKworLyogUFMgZGVjIHByaXZhdCBmdW5jdGlvbnMgKi8KK1NCUl9FUlJPUiBSZXNldFBzRGVjKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKK3ZvaWQgUmVzZXRQc0RlQ29yICAgKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgIGh1ZmZtYW4gZGVjb2RpbmcgYnkgY29kZWJvb2sgdGFibGUKKworICBccmV0dXJuIGluZGV4IG9mIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQ0hBUgorZGVjb2RlX2h1ZmZfY3cgKEh1ZmZtYW4gaCwgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KKyAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgIC8qITwgSGFuZGxlIHRvIEJpdGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGludCAqbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgLyohPCBsZW5ndGggb2YgaHVmZm1hbiBjb2Rld29yZCAob3IgTlVMTCkgKi8KK3sKKyAgVUNIQVIgYml0ID0gMDsKKyAgU0NIQVIgaW5kZXggPSAwOworICBVQ0hBUiBiaXRDb3VudCA9IDA7CisKKyAgd2hpbGUgKGluZGV4ID49IDApIHsKKyAgICBiaXQgPSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgYml0Q291bnQrKzsKKyAgICBpbmRleCA9IGhbaW5kZXhdW2JpdF07CisgIH0KKyAgaWYgKGxlbmd0aCkgeworICAgICpsZW5ndGggPSBiaXRDb3VudDsKKyAgfQorICByZXR1cm4oIGluZGV4KzY0ICk7IC8qIEFkZCBvZmZzZXQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgIGhlbHBlciBmdW5jdGlvbiAtIGxpbWl0aW5nIG9mIHZhbHVlIHRvIG1pbi9tYXggdmFsdWVzCisKKyAgXHJldHVybiBsaW1pdGVkIHZhbHVlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTQ0hBUgorbGltaXRNaW5NYXgoU0NIQVIgaSwKKyAgICAgICAgICAgIFNDSEFSIG1pbiwKKyAgICAgICAgICAgIFNDSEFSIG1heCkKK3sKKyAgaWYgKGk8bWluKQorICAgIHJldHVybiBtaW47CisgIGVsc2UgaWYgKGk+bWF4KQorICAgIHJldHVybiBtYXg7CisgIGVsc2UKKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgIERlY29kZXMgZGVsdGEgdmFsdWVzIGluLXBsYWNlIGFuZCB1cGRhdGVzCisgICAgICAgICAgZGF0YSBidWZmZXJzIGFjY29yZGluZyB0byBxdWFudGl6YXRpb24gY2xhc3Nlcy4KKworICBXaGVuIGRlbHRhIGNvZGVkIGluIGZyZXF1ZW5jeSB0aGUgZmlyc3QgZWxlbWVudCBpcyBkZWx0YWNvZGUgZnJvbSB6ZXJvLgorICBhSW5kZXggYnVmZmVyIGlzIGRlY29kZWQgZnJvbSBkZWx0YSB2YWx1ZXMgdG8gYWN0dWFsIHZhbHVlcy4KKworICBccmV0dXJuIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkZWx0YURlY29kZUFycmF5KFNDSEFSIGVuYWJsZSwKKyAgICAgICAgICAgICAgICAgU0NIQVIgKmFJbmRleCwgICAgICAgICAgLyohPCBJQ0MvSUlEIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgU0NIQVIgKmFQcmV2RnJhbWVJbmRleCwgLyohPCBJQ0MvSUlEIHBhcmFtZXRlcnMgIG9mIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICAgICAgIFNDSEFSIER0RGYsCisgICAgICAgICAgICAgICAgIFVDSEFSIG5yRWxlbWVudHMsICAgICAgIC8qITwgYXMgY29udmV5ZWQgaW4gYml0c3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgb3V0cHV0IGFycmF5IHNpemU6IG5yRWxlbWVudHMqc3RyaWRlICovCisgICAgICAgICAgICAgICAgIFVDSEFSIHN0cmlkZSwgICAgICAgICAgIC8qITwgMT1kZmx0LCAyPWhhbGYgZnJlcS4gcmVzb2x1dGlvbiAqLworICAgICAgICAgICAgICAgICBTQ0hBUiBtaW5JZHgsCisgICAgICAgICAgICAgICAgIFNDSEFSIG1heElkeCkKK3sKKyAgaW50IGk7CisKKyAgLyogRGVsdGEgZGVjb2RlICovCisgIGlmICggZW5hYmxlPT0xICkgeworICAgIGlmIChEdERmID09IDApICB7ICAgLyogRGVsdGEgY29kZWQgaW4gZnJlcSAqLworICAgICAgYUluZGV4WzBdID0gMCArIGFJbmRleFswXTsKKyAgICAgIGFJbmRleFswXSA9IGxpbWl0TWluTWF4KGFJbmRleFswXSxtaW5JZHgsbWF4SWR4KTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgYUluZGV4W2ldID0gYUluZGV4W2ktMV0gKyBhSW5kZXhbaV07CisgICAgICAgIGFJbmRleFtpXSA9IGxpbWl0TWluTWF4KGFJbmRleFtpXSxtaW5JZHgsbWF4SWR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7IC8qIERlbHRhIHRpbWUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgYUluZGV4W2ldID0gYVByZXZGcmFtZUluZGV4W2kqc3RyaWRlXSArIGFJbmRleFtpXTsKKyAgICAgICAgYUluZGV4W2ldID0gbGltaXRNaW5NYXgoYUluZGV4W2ldLG1pbklkeCxtYXhJZHgpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHsgLyogTm8gZGF0YSBpcyBzZW50LCBzZXQgaW5kZXggdG8gemVybyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGFJbmRleFtpXSA9IDA7CisgICAgfQorICB9CisgIGlmIChzdHJpZGU9PTIpIHsKKyAgICBmb3IgKGk9bnJFbGVtZW50cypzdHJpZGUtMTsgaT4wOyBpLS0pIHsKKyAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpPj4xXTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgTWFwcGluZyBvZiBJQ0MvSUlEIHBhcmFtZXRlcnMgdG8gMjAgc3RlcmVvIGJhbmRzCisKKyAgXHJldHVybiBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtYXAzNEluZGV4VG8yMCAoU0NIQVIgKmFJbmRleCwgLyohPCBkZWNvZGVkIElDQy9JSUQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5vQmlucykgIC8qITwgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyAgICAgKi8KK3sKKyAgYUluZGV4WzBdICA9ICgyKmFJbmRleFswXSthSW5kZXhbMV0pLzM7CisgIGFJbmRleFsxXSAgPSAoYUluZGV4WzFdKzIqYUluZGV4WzJdKS8zOworICBhSW5kZXhbMl0gID0gKDIqYUluZGV4WzNdK2FJbmRleFs0XSkvMzsKKyAgYUluZGV4WzNdICA9IChhSW5kZXhbNF0rMiphSW5kZXhbNV0pLzM7CisgIGFJbmRleFs0XSAgPSAoYUluZGV4WzZdK2FJbmRleFs3XSkvMjsKKyAgYUluZGV4WzVdICA9IChhSW5kZXhbOF0rYUluZGV4WzldKS8yOworICBhSW5kZXhbNl0gID0gYUluZGV4WzEwXTsKKyAgYUluZGV4WzddICA9IGFJbmRleFsxMV07CisgIGFJbmRleFs4XSAgPSAoYUluZGV4WzEyXSthSW5kZXhbMTNdKS8yOworICBhSW5kZXhbOV0gID0gKGFJbmRleFsxNF0rYUluZGV4WzE1XSkvMjsKKyAgYUluZGV4WzEwXSA9IGFJbmRleFsxNl07CisgIC8qIEZvciBJUEQvT1BEIGl0IHN0b3BzIGhlcmUgKi8KKworICBpZiAobm9CaW5zID09IE5PX0hJX1JFU19CSU5TKQorICB7CisgICAgYUluZGV4WzExXSA9IGFJbmRleFsxN107CisgICAgYUluZGV4WzEyXSA9IGFJbmRleFsxOF07CisgICAgYUluZGV4WzEzXSA9IGFJbmRleFsxOV07CisgICAgYUluZGV4WzE0XSA9IChhSW5kZXhbMjBdK2FJbmRleFsyMV0pLzI7CisgICAgYUluZGV4WzE1XSA9IChhSW5kZXhbMjJdK2FJbmRleFsyM10pLzI7CisgICAgYUluZGV4WzE2XSA9IChhSW5kZXhbMjRdK2FJbmRleFsyNV0pLzI7CisgICAgYUluZGV4WzE3XSA9IChhSW5kZXhbMjZdK2FJbmRleFsyN10pLzI7CisgICAgYUluZGV4WzE4XSA9IChhSW5kZXhbMjhdK2FJbmRleFsyOV0rYUluZGV4WzMwXSthSW5kZXhbMzFdKS80OworICAgIGFJbmRleFsxOV0gPSAoYUluZGV4WzMyXSthSW5kZXhbMzNdKS8yOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICBEZWNvZGVzIGRlbHRhIGNvZGVkIElJRCwgSUNDLCBJUEQgYW5kIE9QRCBpbmRpY2VzCisKKyAgXHJldHVybiBQUyBwcm9jZXNzaW5nIGZsYWcuIElmIHNldCB0byAxCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK0RlY29kZVBzKCBzdHJ1Y3QgUFNfREVDICpoX3BzX2QsICAgICAgLyohPCBQUyBoYW5kbGUgKi8KKyAgICAgICAgICBjb25zdCBVQ0hBUiAgICBmcmFtZUVycm9yICkgLyohPCBGbGFnIHRlbGxpbmcgdGhhdCBmcmFtZSBoYWQgZXJyb3JzICovCit7CisgIE1QRUdfUFNfQlNfREFUQSAqcEJzRGF0YTsKKyAgVUNIQVIgZ3IsIGVudjsKKyAgaW50ICAgYlBzSGVhZGVyVmFsaWQsIGJQc0RhdGFBdmFpbDsKKworICAvKiBTaG9ydGN1dHMgdG8gYXZvaWQgZGVmZXJlbmNpbmcgYW5kIGtlZXAgdGhlIGNvZGUgcmVhZGFibGUgKi8KKyAgcEJzRGF0YSA9ICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnOworICBiUHNIZWFkZXJWYWxpZCA9IHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkOworICBiUHNEYXRhQXZhaWwgPSAoaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5wcm9jZXNzU2xvdF0gPT0gcHB0X21wZWcpID8gMSA6IDA7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogRGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VzcyBvciB0byBjb25jZWFsIFBTIGRhdGEgb3Igbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBpZiAoICggaF9wc19kLT5wc0RlY29kZWRQcnYgJiYgIWZyYW1lRXJyb3IgJiYgIWJQc0RhdGFBdmFpbCkKKyAgICB8fCAoIWhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmIChmcmFtZUVycm9yIHx8ICFiUHNEYXRhQXZhaWwgfHwgIWJQc0hlYWRlclZhbGlkKSkgKSB7CisgICAgLyogRG9uJ3QgYXBwbHkgUFMgcHJvY2Vzc2luZy4KKyAgICAgKiBEZWNsYXJlIGN1cnJlbnQgUFMgaGVhZGVyIGFuZCBiaXRzdHJlYW0gZGF0YSBpbnZhbGlkLiAqLworICAgIHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkID0gMDsKKyAgICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPnByb2Nlc3NTbG90XSA9IHBwdF9ub25lOworICAgIHJldHVybiAoMCk7CisgIH0KKworICBpZiAoZnJhbWVFcnJvciB8fCAhYlBzSGVhZGVyVmFsaWQpCisgIHsgLyogbm8gbmV3IFBTIGRhdGEgYXZhaWxhYmxlIChlLmcuIGZyYW1lIGxvc3MpICovCisgICAgLyogPT4ga2VlcCBsYXRlc3QgZGF0YSBjb25zdGFudCAoaS5lLiBGSVggd2l0aCBub0Vudj0wKSAqLworICAgIHBCc0RhdGEtPm5vRW52ID0gMDsKKyAgfQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIERlY29kZSBiaXRzdHJlYW0gcGF5bG9hZCBvciBwcmVwYXJlIHBhcmFtZXRlciBmb3IgY29uY2VhbG1lbnQ6CisgICovCisgIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgICBTQ0hBUiAqYVByZXZJaWRJbmRleDsKKyAgICBTQ0hBUiAqYVByZXZJY2NJbmRleDsKKworICAgIFVDSEFSIG5vSWlkU3RlcHMgPSBwQnNEYXRhLT5iRmluZUlpZFE/Tk9fSUlEX1NURVBTX0ZJTkU6Tk9fSUlEX1NURVBTOworCisgICAgaWYgKGVudj09MCkgeworICAgICAgYVByZXZJaWRJbmRleCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleDsKKyAgICAgIGFQcmV2SWNjSW5kZXggPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYVByZXZJaWRJbmRleCA9IHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52LTFdOworICAgICAgYVByZXZJY2NJbmRleCA9IHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52LTFdOworICAgIH0KKworICAgIGRlbHRhRGVjb2RlQXJyYXkocEJzRGF0YS0+YkVuYWJsZUlpZCwKKyAgICAgICAgICAgICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgIGFQcmV2SWlkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBwQnNEYXRhLT5hYklpZER0RmxhZ1tlbnZdLAorICAgICAgICAgICAgICAgICAgICAgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1twQnNEYXRhLT5mcmVxUmVzSWlkXSwKKyAgICAgICAgICAgICAgICAgICAgIChwQnNEYXRhLT5mcmVxUmVzSWlkKT8xOjIsCisgICAgICAgICAgICAgICAgICAgICAtbm9JaWRTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgIG5vSWlkU3RlcHMpOworCisgICAgZGVsdGFEZWNvZGVBcnJheShwQnNEYXRhLT5iRW5hYmxlSWNjLAorICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdLAorICAgICAgICAgICAgICAgICAgICAgYVByZXZJY2NJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHBCc0RhdGEtPmFiSWNjRHRGbGFnW2Vudl0sCisgICAgICAgICAgICAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9hTm9JY2NCaW5zW3BCc0RhdGEtPmZyZXFSZXNJY2NdLAorICAgICAgICAgICAgICAgICAgICAgKHBCc0RhdGEtPmZyZXFSZXNJY2MpPzE6MiwKKyAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICBOT19JQ0NfU1RFUFMtMSk7CisgIH0gICAvKiBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSAqLworCisgIC8qIGhhbmRsaW5nIG9mIEZJWCBub0Vudj0wICovCisgIGlmIChwQnNEYXRhLT5ub0Vudj09MCkgeworICAgIC8qIHNldCBub0Vudj0xLCBrZWVwIGxhc3QgcGFyYW1ldGVycyBvciBmb3JjZSAwIGlmIG5vdCBlbmFibGVkICovCisgICAgcEJzRGF0YS0+bm9FbnYgPSAxOworCisgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKKyAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgeworICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXSA9CisgICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUlpZFByZXZGcmFtZUluZGV4W2dyXTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKKyAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl0gPSAwOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWNjKSB7CisgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKKyAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl0gPQorICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJY2NQcmV2RnJhbWVJbmRleFtncl07CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7CisgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBVcGRhdGUgcHJldmlvdXMgZnJhbWUgaW5kZXggYnVmZmVycyAqLworICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWlkUHJldkZyYW1lSW5kZXhbZ3JdID0KKyAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOworICB9CisgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JQ0NfQklOUzsgZ3IrKykgeworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJY2NQcmV2RnJhbWVJbmRleFtncl0gPQorICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl07CisgIH0KKworICAvKiBQUyBkYXRhIGZyb20gYml0c3RyZWFtIChpZiBhdmFpbCkgd2FzIGRlY29kZWQgbm93ICovCisgIGhfcHNfZC0+YlBzRGF0YUF2YWlsW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdID0gcHB0X25vbmU7CisKKyAgLyogaGFuZGxpbmcgb2YgZW52IGJvcmRlcnMgZm9yIEZJWCAmIFZBUiAqLworICBpZiAocEJzRGF0YS0+YkZyYW1lQ2xhc3MgPT0gMCkgeworICAgIC8qIEZJWF9CT1JERVJTIE5vRW52PTAsMSwyLDQgKi8KKyAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wWzBdID0gMDsKKyAgICBmb3IgKGVudj0xOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPQorICAgICAgICAoZW52ICogaF9wc19kLT5ub1N1YlNhbXBsZXMpIC8gcEJzRGF0YS0+bm9FbnY7CisgICAgfQorICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbcEJzRGF0YS0+bm9FbnZdID0gaF9wc19kLT5ub1N1YlNhbXBsZXM7CisgICAgLyogMTAyNCAoMzIgc2xvdHMpIGVudiBib3JkZXJzOiAgMCwgOCwgMTYsIDI0LCAzMiAqLworICAgIC8qICA5NjAgKDMwIHNsb3RzKSBlbnYgYm9yZGVyczogIDAsIDcsIDE1LCAyMiwgMzAgKi8KKyAgfQorICBlbHNlIHsgICAvKiBpZiAoaF9wc19kLT5iRnJhbWVDbGFzcyA9PSAwKSAqLworICAgIC8qIFZBUl9CT1JERVJTIE5vRW52PTEsMiwzLDQgKi8KKyAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wWzBdID0gMDsKKworICAgIC8qIGhhbmRsZSBjYXNlIGFFbnZTdGFydFN0b3Bbbm9FbnZdPG5vU3ViU2FtcGxlIGZvciBWQVJfQk9SREVSUyBieQorICAgICAgIGR1cGxpY2F0aW5nIGxhc3QgUFMgcGFyYW1ldGVycyBhbmQgaW5jcmVtZW50aW5nIG5vRW52ICovCisgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbcEJzRGF0YS0+bm9FbnZdIDwgaF9wc19kLT5ub1N1YlNhbXBsZXMpIHsKKyAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgeworICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52XVtncl0gPQorICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOworICAgICAgfQorICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7CisgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnZdW2dyXSA9CisgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl07CisgICAgICB9CisgICAgICBwQnNEYXRhLT5ub0VudisrOworICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtwQnNEYXRhLT5ub0Vudl0gPSBoX3BzX2QtPm5vU3ViU2FtcGxlczsKKyAgICB9CisKKyAgICAvKiBlbmZvcmNlIHN0cmljdGx5IG1vbm90b25pYyBpbmNyZWFzaW5nIGJvcmRlcnMgKi8KKyAgICBmb3IgKGVudj0xOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgICBVQ0hBUiB0aHI7CisgICAgICB0aHIgPSAoVUNIQVIpaF9wc19kLT5ub1N1YlNhbXBsZXMgLSAocEJzRGF0YS0+bm9FbnYgLSBlbnYpOworICAgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA+IHRocikgeworICAgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPSB0aHI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdGhyID0gcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnYtMV0rMTsKKyAgICAgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA8IHRocikgeworICAgICAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9IHRocjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAgIC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApIC4uLiBlbHNlICovCisKKyAgLyogY29weSBkYXRhIHByaW9yIHRvIHBvc3NpYmxlIDIwPC0+MzQgaW4tcGxhY2UgbWFwcGluZyAqLworICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgVUNIQVIgaTsKKyAgICBmb3IgKGk9MDsgaTxOT19ISV9SRVNfSUlEX0JJTlM7IGkrKykgeworICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl1baV0gPSBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1baV07CisgICAgfQorICAgIGZvciAoaT0wOyBpPE5PX0hJX1JFU19JQ0NfQklOUzsgaSsrKSB7CisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWNjSW5kZXhNYXBwZWRbZW52XVtpXSA9IHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XVtpXTsKKyAgICB9CisgIH0KKworCisgIC8qIE1QRUcgYmFzZWxpbmUgUFMgKi8KKyAgLyogQmFzZWxpbmUgdmVyc2lvbiBvZiBQUyBhbHdheXMgdXNlcyB0aGUgaHlicmlkIGZpbHRlciBzdHJ1Y3R1cmUgd2l0aCAyMCBzdGVyZW8gYmFuZHMuICovCisgIC8qIElmIElDQy9JSUQgcGFyYW1ldGVycyBmb3IgMzQgc3RlcmVvIGJhbmRzIGFyZSBkZWNvZGVkIHRoZXkgaGF2ZSB0byBiZSBtYXBwZWQgdG8gMjAgICAqLworICAvKiBzdGVyZW8gYmFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWRkaXRpb25hbHkgdGhlIElQRC9PUEQgcGFyYW1ldGVycyB3b24ndCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgeworICAgIGlmIChwQnNEYXRhLT5mcmVxUmVzSWlkID09IDIpCisgICAgICBtYXAzNEluZGV4VG8yMCAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl0sIE5PX0hJX1JFU19JSURfQklOUyk7CisgICAgaWYgKHBCc0RhdGEtPmZyZXFSZXNJY2MgPT0gMikKKyAgICAgIG1hcDM0SW5kZXhUbzIwIChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWNjSW5kZXhNYXBwZWRbZW52XSwgTk9fSElfUkVTX0lDQ19CSU5TKTsKKworICAgIC8qIElQRC9PUEQgaXMgZGlzYWJsZWQgaW4gYmFzZWxpbmUgdmVyc2lvbiBhbmQgdGh1cyB3YXMgcmVtb3ZlZCBoZXJlICovCisgIH0KKworICByZXR1cm4gKDEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKworICBcYnJpZWYgIFJlYWRzIHBhcmFtZXRyaWMgc3RlcmVvIGRhdGEgZnJvbSBiaXRzdHJlYW0KKworICBccmV0dXJuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQKK1JlYWRQc0RhdGEgKEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgUFNfREVDICovCisgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KKyAgICAgICAgICAgIGludCBuQml0c0xlZnQgICAgICAgICAgICAgICAgICAvKiE8IG1heCBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgKQoreworICBNUEVHX1BTX0JTX0RBVEEgKnBCc0RhdGE7CisKKyAgVUNIQVIgICAgIGdyLCBlbnY7CisgIFNDSEFSICAgICBkdEZsYWc7CisgIElOVCAgICAgICBzdGFydGJpdHM7CisgIEh1ZmZtYW4gICBDdXJyZW50VGFibGU7CisgIFNDSEFSICAgICBiRW5hYmxlSGVhZGVyOworCisgIGlmICghaF9wc19kKQorICAgIHJldHVybiAwOworCisgIHBCc0RhdGEgPSAmaF9wc19kLT5ic0RhdGFbaF9wc19kLT5ic1JlYWRTbG90XS5tcGVnOworCisgIGlmIChoX3BzX2QtPmJzUmVhZFNsb3QgIT0gaF9wc19kLT5ic0xhc3RTbG90KSB7CisgICAgLyogQ29weSBsYXN0IGhlYWRlciBkYXRhICovCisgICAgRkRLbWVtY3B5KHBCc0RhdGEsICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPmJzTGFzdFNsb3RdLm1wZWcsIHNpemVvZihNUEVHX1BTX0JTX0RBVEEpKTsKKyAgfQorCisKKyAgc3RhcnRiaXRzID0gKElOVCkgRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpOworCisgIGJFbmFibGVIZWFkZXIgPSAoU0NIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKKworICAvKiBSZWFkIGhlYWRlciAqLworICBpZiAoYkVuYWJsZUhlYWRlcikgeworICAgIHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkID0gMTsKKyAgICBwQnNEYXRhLT5iRW5hYmxlSWlkID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKKyAgICAgIHBCc0RhdGEtPm1vZGVJaWQgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAzKTsKKyAgICB9CisKKyAgICBwQnNEYXRhLT5iRW5hYmxlSWNjID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJY2MpIHsKKyAgICAgIHBCc0RhdGEtPm1vZGVJY2MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAzKTsKKyAgICB9CisKKyAgICBwQnNEYXRhLT5iRW5hYmxlRXh0ID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgIH0KKworICBwQnNEYXRhLT5iRnJhbWVDbGFzcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICBpZiAocEJzRGF0YS0+YkZyYW1lQ2xhc3MgPT0gMCkgeworICAgIC8qIEZJWF9CT1JERVJTIE5vRW52PTAsMSwyLDQgKi8KKyAgICBwQnNEYXRhLT5ub0VudiA9IEZES19zYnJEZWNvZGVyX2FGaXhOb0VudkRlY29kZVsoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAyKV07CisgICAgLyogYWxsIGFkZGl0aW9uYWwgaGFuZGxpbmcgb2YgZW52IGJvcmRlcnMgaXMgbm93IGluIERlY29kZVBzKCkgKi8KKyAgfQorICBlbHNlIHsKKyAgICAvKiBWQVJfQk9SREVSUyBOb0Vudj0xLDIsMyw0ICovCisgICAgcEJzRGF0YS0+bm9FbnYgPSAxKyhVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDIpOworICAgIGZvciAoZW52PTE7IGVudjxwQnNEYXRhLT5ub0VudisxOyBlbnYrKykKKyAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9ICgoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCA1KSkgKyAxOworICAgIC8qIGFsbCBhZGRpdGlvbmFsIGhhbmRsaW5nIG9mIGVudiBib3JkZXJzIGlzIG5vdyBpbiBEZWNvZGVQcygpICovCisgIH0KKworICAvKiB2ZXJpZnkgdGhhdCBJSUQgJiBJQ0MgbW9kZXMgKHF1YW50IGdyaWQsIGZyZXEgcmVzKSBhcmUgc3VwcG9ydGVkICovCisgIGlmICgocEJzRGF0YS0+bW9kZUlpZCA+IDUpIHx8IChwQnNEYXRhLT5tb2RlSWNjID4gNSkpIHsKKyAgICAvKiBubyB1c2VmdWwgUFMgZGF0YSBjb3VsZCBiZSByZWFkIGZyb20gYml0c3RyZWFtICovCisgICAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5ic1JlYWRTbG90XSA9IHBwdF9ub25lOworICAgIC8qIGRpc2NhcmQgYWxsIHJlbWFpbmluZyBiaXRzICovCisgICAgbkJpdHNMZWZ0IC09IHN0YXJ0Yml0cyAtIEZES2dldFZhbGlkQml0cyhoQml0QnVmKTsKKyAgICB3aGlsZSAobkJpdHNMZWZ0KSB7CisgICAgICBpbnQgaSA9IG5CaXRzTGVmdDsKKyAgICAgIGlmIChpPjgpIHsKKyAgICAgICAgaSA9IDg7CisgICAgICB9CisgICAgICBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgaSk7CisgICAgICBuQml0c0xlZnQgLT0gaTsKKyAgICB9CisgICAgcmV0dXJuIChzdGFydGJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOworICB9CisKKyAgaWYgKHBCc0RhdGEtPm1vZGVJaWQgPiAyKXsKKyAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZC0zOworICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IDE7CisgIH0KKyAgZWxzZXsKKyAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZDsKKyAgICBwQnNEYXRhLT5iRmluZUlpZFEgPSAwOworICB9CisKKyAgaWYgKHBCc0RhdGEtPm1vZGVJY2MgPiAyKXsKKyAgICBwQnNEYXRhLT5mcmVxUmVzSWNjID0gcEJzRGF0YS0+bW9kZUljYy0zOworICB9CisgIGVsc2V7CisgICAgcEJzRGF0YS0+ZnJlcVJlc0ljYyA9IHBCc0RhdGEtPm1vZGVJY2M7CisgIH0KKworCisgIC8qIEV4dHJhY3QgSUlEIGRhdGEgKi8KKyAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKKyAgICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgICBkdEZsYWcgPSAoU0NIQVIpRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgICAgaWYgKCFkdEZsYWcpCisgICAgICB7CisgICAgICAgIGlmIChwQnNEYXRhLT5iRmluZUlpZFEpCisgICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJaWRGaW5lRnJlcURlY29kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkRnJlcURlY29kZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKHBCc0RhdGEtPmJGaW5lSWlkUSkKKyAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkRmluZVRpbWVEZWNvZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZFRpbWVEZWNvZGU7CisgICAgICB9CisKKyAgICAgIGZvciAoZ3IgPSAwOyBnciA8IEZES19zYnJEZWNvZGVyX2FOb0lpZEJpbnNbcEJzRGF0YS0+ZnJlcVJlc0lpZF07IGdyKyspCisgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XVtncl0gPSBkZWNvZGVfaHVmZl9jdyhDdXJyZW50VGFibGUsaEJpdEJ1ZixOVUxMKTsKKyAgICAgIHBCc0RhdGEtPmFiSWlkRHRGbGFnW2Vudl0gPSBkdEZsYWc7CisgICAgfQorICB9CisKKyAgLyogRXh0cmFjdCBJQ0MgZGF0YSAqLworICBpZiAocEJzRGF0YS0+YkVuYWJsZUljYykgeworICAgIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgICAgIGR0RmxhZyA9IChTQ0hBUilGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgICBpZiAoIWR0RmxhZykKKyAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJY2NGcmVxRGVjb2RlOworICAgICAgZWxzZQorICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0ljY1RpbWVEZWNvZGU7CisKKyAgICAgIGZvciAoZ3IgPSAwOyBnciA8IEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbcEJzRGF0YS0+ZnJlcVJlc0ljY107IGdyKyspCisgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XVtncl0gPSBkZWNvZGVfaHVmZl9jdyhDdXJyZW50VGFibGUsaEJpdEJ1ZixOVUxMKTsKKyAgICAgIHBCc0RhdGEtPmFiSWNjRHRGbGFnW2Vudl0gPSBkdEZsYWc7CisgICAgfQorICB9CisKKyAgaWYgKHBCc0RhdGEtPmJFbmFibGVFeHQpIHsKKworICAgIC8qIQorICAgIERlY29kZXJzIHRoYXQgc3VwcG9ydCBvbmx5IHRoZSBiYXNlbGluZSB2ZXJzaW9uIG9mIHRoZSBQUyB0b29sIGFyZSBhbGxvd2VkCisgICAgdG8gaWdub3JlIHRoZSBJUEQvT1BEIGRhdGEsIGJ1dCBhY2NvcmRpbmcgaGVhZGVyIGRhdGEgaGFzIHRvIGJlIHBhcnNlZC4KKyAgICBJU08vSUVDIDE0NDk2LTMgU3VicGFydCA4IEFubmV4IDQKKyAgICAqLworCisgICAgaW50IGNudCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpOworICAgIGlmIChjbnQgPT0gKDE8PFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpLTEpIHsKKyAgICAgIGNudCArPSBGREtyZWFkQml0cyhoQml0QnVmLCBQU19FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMpOworICAgIH0KKyAgICB3aGlsZSAoY250LS0pCisgICAgICBGREtyZWFkQml0cyhoQml0QnVmLCA4KTsKKyAgfQorCisKKyAgLyogbmV3IFBTIGRhdGEgd2FzIHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KKyAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5ic1JlYWRTbG90XSA9IHBwdF9tcGVnOworCisKKworICByZXR1cm4gKHN0YXJ0Yml0cyAtIEZES2dldFZhbGlkQml0cyhoQml0QnVmKSk7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmggYi9hYWMvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDRkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5oCkBAIC0wLDAgKzEsMTAzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX1BTQklUREVDX0gKKyNkZWZpbmUgX19QU0JJVERFQ19ICisKKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisKKworI2luY2x1ZGUgInBzZGVjLmgiCisKKwordW5zaWduZWQgaW50CitSZWFkUHNEYXRhIChzdHJ1Y3QgUFNfREVDICAqaF9wc19kLAorICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKKyAgICAgICAgICAgIGludCBuQml0c0xlZnQpOworCitpbnQKK0RlY29kZVBzKHN0cnVjdCBQU19ERUMgKmhfcHNfZCwKKyAgICAgICAgIGNvbnN0IFVDSEFSICAgIGZyYW1lRXJyb3IpOworCisKKyNlbmRpZiAvKiBfX1BTQklUREVDX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU5MTdhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvcHNkZWMuY3BwCkBAIC0wLDAgKzEsMTQxNCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgIAorKi8KKworI2luY2x1ZGUgInBzZGVjLmgiCisKKworCisjaW5jbHVkZSAiRkRLX2JpdGJ1ZmZlci5oIgorI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgorCisjaW5jbHVkZSAic2JyX3JvbS5oIgorI2luY2x1ZGUgInNicl9yYW0uaCIKKworI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgTUxRVUFMIERFRklORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgI2RlZmluZSBGUkFDVF9aRVJPIEZSQUNUX0JJVFMtMQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTQlJfRVJST1IgUmVzZXRQc0RlYyggSEFORExFX1BTX0RFQyBoX3BzX2QgKTsKKwordm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICk7CisKKworLyoqKioqIEhFTFBFUlMgKioqKiovCisKK3N0YXRpYyB2b2lkIGFzc2lnblRpbWVTbG90c1BTIChGSVhQX0RCTCAqYnVmQWRyLCBGSVhQX0RCTCAqKmJ1ZlB0ciwgY29uc3QgaW50IG51bVNsb3RzLCBjb25zdCBpbnQgbnVtQ2hhbik7CisKKworCisvKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBESVYzIEZMMkZYQ09OU1RfREJMKDEuZi8zLmYpICAgICAvKiBkaXZpc2lvbiAzLjAgKi8KKyNkZWZpbmUgRElWMV81IEZMMkZYQ09OU1RfREJMKDIuZi8zLmYpICAgLyogZGl2aXNpb24gMS41ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICBDcmVhdGVzIG9uZSBpbnN0YW5jZSBvZiB0aGUgUFNfREVDIHN0cnVjdAorCisgIFxyZXR1cm4gRXJyb3IgaW5mbworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitDcmVhdGVQc0RlYyggSEFORExFX1BTX0RFQyAqaF9QU19ERUMsICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KKyAgICAgICAgICAgICBpbnQgYWFjU2FtcGxlc1BlckZyYW1lCisgICAgICAgICAgICkKK3sKKyAgU0JSX0VSUk9SIGVycm9ySW5mbyA9IFNCUkRFQ19PSzsKKyAgSEFORExFX1BTX0RFQyAgaF9wc19kOworICBpbnQgaTsKKworICBpZiAoKmhfUFNfREVDID09IE5VTEwpIHsKKyAgICAvKiBHZXQgcHMgZGVjIHJhbSAqLworICAgIGhfcHNfZCA9IEdldFJhbV9wc19kZWMoKTsKKyAgICBpZiAoaF9wc19kID09IE5VTEwpIHsKKyAgICAgIGVycm9ySW5mbyA9IFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBSZXNldCBhbiBvcGVuIGluc3RhbmNlICovCisgICAgaF9wc19kID0gKmhfUFNfREVDOworICB9CisKKyAgIC8qIGluaXRpYWxpc2F0aW9uICovCisgIHN3aXRjaCAoYWFjU2FtcGxlc1BlckZyYW1lKSB7CisgIGNhc2UgOTYwOgorICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzA7ICAgICAgICAgICAgICAvKiBjb2wgKi8KKyAgICBicmVhazsKKyAgY2FzZSAxMDI0OgorICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzI7ICAgICAgICAgICAgICAvKiBjb2wgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcyA9IC0xOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGhfcHNfZC0+bm9TdWJTYW1wbGVzID4gIE1BWF9OVU1fQ09MCisgICB8fCBoX3BzX2QtPm5vU3ViU2FtcGxlcyA8PSAwKQorICB7CisgICAgZ290byBiYWlsOworICB9CisgIGhfcHNfZC0+bm9DaGFubmVscyAgID0gTk9fUU1GX0NIQU5ORUxTOyAgIC8qIHJvdyAqLworCisgIGhfcHNfZC0+cHNEZWNvZGVkUHJ2ICAgPSAgMDsKKyAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IC0xOworICBmb3IgKGkgPSAwOyBpIDwgKDEpKzE7IGkrKykgeworICAgIGhfcHNfZC0+YlBzRGF0YUF2YWlsW2ldICA9ICBwcHRfbm9uZTsKKyAgfQorCisKKyAgZm9yIChpID0gMDsgaSA8ICgxKSsxOyBpKyspIHsKKyAgICBGREttZW1jbGVhcigmaF9wc19kLT5ic0RhdGFbaV0ubXBlZywgc2l6ZW9mKE1QRUdfUFNfQlNfREFUQSkpOworICB9CisKKyAgZXJyb3JJbmZvID0gUmVzZXRQc0RlYyggaF9wc19kICk7CisKKyAgaWYgKCBlcnJvckluZm8gIT0gU0JSREVDX09LICkKKyAgICBnb3RvIGJhaWw7CisKKyAgUmVzZXRQc0RlQ29yKCBoX3BzX2QgKTsKKworICAqaF9QU19ERUMgPSBoX3BzX2Q7CisKKworCisgIHJldHVybiAwOworCitiYWlsOgorICBEZWxldGVQc0RlYygmaF9wc19kKTsKKworICByZXR1cm4gLTE7Cit9IC8qRU5EIENyZWF0ZVBzRGVjICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICBEZWxldGUgb25lIGluc3RhbmNlIG9mIHRoZSBQU19ERUMgc3RydWN0CisKKyAgXHJldHVybiBFcnJvciBpbmZvCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK0RlbGV0ZVBzRGVjKCBIQU5ETEVfUFNfREVDICpoX1BTX0RFQykgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCit7CisgIGlmICgqaF9QU19ERUMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisKKyAgRnJlZVJhbV9wc19kZWMoaF9QU19ERUMpOworCisKKyAgcmV0dXJuIDA7Cit9IC8qRU5EIERlbGV0ZVBzRGVjICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmIHJlc2V0cyBzb21lIHZhbHVlcyBvZiB0aGUgUFMgaGFuZGxlIHRvIGRlZmF1bHQgc3RhdGVzCisKKyAgXHJldHVybgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0JSX0VSUk9SIFJlc2V0UHNEZWMoIEhBTkRMRV9QU19ERUMgaF9wc19kICkgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCit7CisgIFNCUl9FUlJPUiBlcnJvckluZm8gPSBTQlJERUNfT0s7CisgIElOVCBpOworCisgIGNvbnN0IFVDSEFSIG5vUW1mQmFuZHNJbkh5YnJpZDIwID0gMzsKKyAgLyogY29uc3QgVUNIQVIgbm9RbWZCYW5kc0luSHlicmlkMzQgPSA1OyAqLworCisgIGNvbnN0IFVDSEFSIGFIeWJyaWRSZXNvbHV0aW9uMjBbXSA9IHsgSFlCUklEXzhfQ1BMWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfMl9SRUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhZQlJJRF8yX1JFQUwgfTsKKworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4ICAgPSAwOworCisgIC8qIGV4cGxpY2l0bHkgaW5pdCBzdGF0ZSB2YXJpYWJsZXMgdG8gc2FmZSB2YWx1ZXMgKHVudGlsIGZpcnN0IHBzIGhlYWRlciBhcnJpdmVzKSAqLworCisgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IgICAgICAgID0gIDA7CisKKyAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyID0gLShERlJBQ1RfQklUUy0xKTsKKworICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlCdWZJbmRleERlbGF5UW1mLCAoTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSpzaXplb2YoVUNIQVIpKTsKKyAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheSA9IGRlbGF5SW5kZXhRbWZbMF07CisKKyAgZm9yIChpPTAgOyBpIDwgTk9fU0VSSUFMX0FMTFBBU1NfTElOS1M7IGkrKykgeworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlcltpXSA9IDA7CisgIH0KKworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0gPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVFtZkRlbGF5QnVmUmVhbDsKKworICBhc3NpZ25UaW1lU2xvdHNQUyAoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlswXSArIChOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpLAorICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5ub1NhbXBsZURlbGF5LTEsCisgICAgICAgICAgICAgICAgICAgICAgKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQikpOworCisgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlswXSA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUW1mRGVsYXlCdWZJbWFnOworCisgIGFzc2lnblRpbWVTbG90c1BTICggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdICsgKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQiksCisgICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzFdLAorICAgICAgICAgICAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXktMSwKKyAgICAgICAgICAgICAgICAgICAgICAoTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKSk7CisKKyAgLyogSHlicmlkIEZpbHRlciBCYW5rIDEgY3JlYXRpb24uICovCisgIGVycm9ySW5mbyA9IEluaXRIeWJyaWRGaWx0ZXJCYW5rICggJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9wc19kLT5ub1N1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHNJbkh5YnJpZDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHlicmlkUmVzb2x1dGlvbjIwICk7CisKKyAgZm9yICggaSA9IDA7IGkgPCBOT19JSURfR1JPVVBTOyBpKysgKQorICB7CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDExclByZXZbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTJyUHJldltpXSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOworICB9CisKKyAgRkRLbWVtY2xlYXIoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2LCBzaXplb2YoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2ICkgKTsKKyAgRkRLbWVtY2xlYXIoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2LCBzaXplb2YoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2ICkgKTsKKworICByZXR1cm4gZXJyb3JJbmZvOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgY2xlYXIgc29tZSBidWZmZXJzIHVzZWQgaW4gZGVjb3JyZWxhdGlvbiBwcm9jZXNzCisKKyAgXHJldHVybgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICkgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCit7CisgIElOVCBpOworCisgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW4sIE5PX01JRF9SRVNfQklOUypzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBvd2VyUHJldlNjYWwsIE5PX01JRF9SRVNfQklOUypzaXplb2YoU0NIQVIpKTsKKworICBmb3IgKGk9MCA7IGkgPCBGSVJTVF9ERUxBWV9TQiA7IGkrKykgeworICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOworICB9CisgIGZvciAoaT0wIDsgaSA8IE5PX1NVQl9RTUZfQ0hBTk5FTFMgOyBpKyspIHsKKyAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzbG90IGJhc2VkIGZ1bmNpb24gcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBkZUNvcnJlbGF0ZVNsb3RCYXNlZCggSEFORExFX1BTX0RFQyBoX3BzX2QsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZFJlYWxMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ0xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX21IeWJyaWRMZWZ0LAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICppSW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfSW50QnVmZmVyLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRJbWFnUmlnaHQsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqckludEJ1ZmZlclJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICppSW50QnVmZmVyUmlnaHQgKTsKKworc3RhdGljIHZvaWQgYXBwbHlTbG90QmFzZWRSb3RhdGlvbiggSEFORExFX1BTX0RFQyBoX3BzX2QsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkSW1hZ0xlZnQsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRJbWFnLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnUmlnaHQsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mUmlnaHRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodEltYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICBHZXQgc2NhbGUgZmFjdG9yIGZvciBhbGwgcHMgZGVsYXkgYnVmZmVyLgorCisgIFxyZXR1cm4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworaW50IGdldFNjYWxlRmFjdG9yUHNTdGF0ZXNCdWZmZXIoSEFORExFX1BTX0RFQyAgIGhfcHNfZCkKK3sKKyAgSU5UIGk7CisgIGludCBzY2FsZSA9IERGUkFDVF9CSVRTLTE7CisKKyAgZm9yIChpPTA7IGk8Tk9fUU1GX0JBTkRTX0hZQlJJRDIwOyBpKyspIHsKKyAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5tUW1mQnVmZmVyUmVhbFNsb3RbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKKyAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5tUW1mQnVmZmVySW1hZ1Nsb3RbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKKyAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBGSVJTVF9ERUxBWV9TQikpOworICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJRbWZbaV0sIEZJUlNUX0RFTEFZX1NCKSk7CisgIH0KKworICBmb3IgKGk9MDsgaTxOT19TQU1QTEVfREVMQVlfQUxMUEFTUzsgaSsrKSB7CisgICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclN1YlFtZltpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUykpOworICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPEZJUlNUX0RFTEFZX1NCOyBpKyspIHsKKyAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKSk7CisgICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOworICB9CisKKyAgZm9yIChpPTA7IGk8Tk9fU1VCX1FNRl9DSEFOTkVMUzsgaSsrKSB7CisgICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOworICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPE1BWF9ERUxBWV9CVUZGRVJfU0laRTsgaSsrKQorICB7CisgICAgSU5UIGxlbjsKKyAgICBpZiAoaT09MCkKKyAgICAgIGxlbiA9IE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQjsKKyAgICBlbHNlCisgICAgICBsZW4gPSBOT19ERUxBWV9CVUZGRVJfQkFORFMtRklSU1RfREVMQVlfU0I7CisKKyAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgbGVuKSk7CisgICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbaV0sIGxlbikpOworICB9CisKKyAgcmV0dXJuIChzY2FsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICBSZXNjYWxlIGFsbCBwcyBkZWxheSBidWZmZXIuCisKKyAgXHJldHVybgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkIHNjYWxlUHNTdGF0ZXNCdWZmZXIoSEFORExFX1BTX0RFQyBoX3BzX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBzY2FsZSkKK3sKKyAgSU5UIGk7CisKKyAgaWYgKHNjYWxlIDwgMCkKKyAgICBzY2FsZSA9IGZpeE1heCgoSU5UKXNjYWxlLChJTlQpLShERlJBQ1RfQklUUy0xKSk7CisgIGVsc2UKKyAgICBzY2FsZSA9IGZpeE1pbigoSU5UKXNjYWxlLChJTlQpREZSQUNUX0JJVFMtMSk7CisKKyAgZm9yIChpPTA7IGk8Tk9fUU1GX0JBTkRTX0hZQlJJRDIwOyBpKyspIHsKKyAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJSZWFsU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUywgc2NhbGUgKTsKKyAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJJbWFnU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUywgc2NhbGUgKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKKyAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJRbWZbaV0sIEZJUlNUX0RFTEFZX1NCLCBzY2FsZSApOworICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IsIHNjYWxlICk7CisgIH0KKworICBmb3IgKGk9MDsgaTxOT19TQU1QTEVfREVMQVlfQUxMUEFTUzsgaSsrKSB7CisgICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOworICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclN1YlFtZltpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUywgc2NhbGUgKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPEZJUlNUX0RFTEFZX1NCOyBpKyspIHsKKyAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7CisgICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOworICB9CisKKyAgZm9yIChpPTA7IGk8Tk9fU1VCX1FNRl9DSEFOTkVMUzsgaSsrKSB7CisgICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOworICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUywgc2NhbGUgKTsKKyAgfQorCisgIGZvciAoaT0wOyBpPE1BWF9ERUxBWV9CVUZGRVJfU0laRTsgaSsrKSB7CisgICAgSU5UIGxlbjsKKyAgICBpZiAoaT09MCkKKyAgICAgIGxlbiA9IE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQjsKKyAgICBlbHNlCisgICAgICBsZW4gPSBOT19ERUxBWV9CVUZGRVJfQkFORFMtRklSU1RfREVMQVlfU0I7CisKKyAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBsZW4sIHNjYWxlICk7CisgICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgbGVuLCBzY2FsZSApOworICB9CisKKyAgc2NhbGUgPDw9IDE7CisKKyAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluLCBOT19NSURfUkVTX0JJTlMsIHNjYWxlICk7CisgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluLCBOT19NSURfUkVTX0JJTlMsIHNjYWxlICk7CisgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbiwgTk9fTUlEX1JFU19CSU5TLCBzY2FsZSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgU2NhbGUgaW5wdXQgY2hhbm5lbCB0byB0aGUgc2FtZSBzY2FsZWZhY3RvciBhbmQgcmVzY2FsZSBoeWJyaWQKKyAgICAgICAgICBmaWx0ZXJiYW5rIHZhbHVlcworCisgIFxyZXR1cm4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnNjYWxlRmFjdG9yTG93QmFuZF9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfaGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqc2NhbGVGYWN0b3JIaWdoQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBtYXhTY2FsOworCisgIElOVCBpOworCisgIHNjYWxlRmFjdG9ySGlnaEJhbmRzICAgICAgICA9ICAtc2NhbGVGYWN0b3JIaWdoQmFuZHM7CisgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93ICA9ICAtc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3c7CisgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCA9ICAtc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoOworCisgIC8qIGdldCBtYXggc2NhbGUgZmFjdG9yICovCisgIG1heFNjYWwgPSBmaXhNYXgoc2NhbGVGYWN0b3JIaWdoQmFuZHMsZml4TWF4KHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93LCBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggKSk7CisKKyAgeworICAgIGludCBoZWFkcm9vbSAgPSBnZXRTY2FsZUZhY3RvclBzU3RhdGVzQnVmZmVyKGhfcHNfZCk7CisgICAgbWF4U2NhbCAgID0gZml4TWF4KG1heFNjYWwsKElOVCkoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyLWhlYWRyb29tKSk7CisgICAgbWF4U2NhbCAgKz0gMTsKKyAgfQorCisgIC8qIHNjYWxlIHdob2xlIGxlZnQgY2hhbm5lbCB0byB0aGUgc2FtZSBzY2FsZSBmYWN0b3IgKi8KKworICAvKiBsb3cgYmFuZCAoIG92ZXJsYXAgYnVmZmVyICkgKi8KKyAgaWYgKCBtYXhTY2FsICE9IHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93ICkgeworICAgIElOVCBzY2FsZSA9IHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93IC0gbWF4U2NhbDsKKyAgICBmb3IgKCBpPTA7IGk8KDYpOyBpKysgKSB7CisgICAgICBzY2FsZVZhbHVlcyggZml4cFFtZlJlYWxbaV0sIGxzYiwgc2NhbGUgKTsKKyAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mSW1hZ1tpXSwgbHNiLCBzY2FsZSApOworICAgIH0KKyAgfQorICAvKiBsb3cgYmFuZCAoIGN1cnJlbnQgZnJhbWUgKSAqLworICBpZiAoIG1heFNjYWwgIT0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoICkgeworICAgIElOVCBzY2FsZSA9IHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCAtIG1heFNjYWw7CisgICAgLyogZm9yICggaT0oNik7IGk8KDYpK01BWF9OVU1fQ09MOyBpKysgKSB7ICovCisgICAgZm9yICggaT0oNik7IGk8KDYpK25vQ29sczsgaSsrICkgeworICAgICAgc2NhbGVWYWx1ZXMoIGZpeHBRbWZSZWFsW2ldLCBsc2IsIHNjYWxlICk7CisgICAgICBzY2FsZVZhbHVlcyggZml4cFFtZkltYWdbaV0sIGxzYiwgc2NhbGUgKTsKKyAgICB9CisgIH0KKyAgLyogaGlnaCBiYW5kICovCisgIGlmICggbWF4U2NhbCAhPSBzY2FsZUZhY3RvckhpZ2hCYW5kcyApIHsKKyAgICBJTlQgc2NhbGUgPSBzY2FsZUZhY3RvckhpZ2hCYW5kcyAtIG1heFNjYWw7CisgICAgLyogZm9yICggaT0wOyBpPE1BWF9OVU1fQ09MOyBpKysgKSB7ICovCisgICAgZm9yICggaT0wOyBpPG5vQ29sczsgaSsrICkgeworICAgICAgc2NhbGVWYWx1ZXMoICZmaXhwUW1mUmVhbFtpXVtsc2JdLCAoNjQpLWxzYiwgc2NhbGUgKTsKKyAgICAgIHNjYWxlVmFsdWVzKCAmZml4cFFtZkltYWdbaV1bbHNiXSwgKDY0KS1sc2IsIHNjYWxlICk7CisgICAgfQorICB9CisKKyAgaWYgKCBtYXhTY2FsICE9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnNjYWxlRmFjdG9yUHNEZWxheUJ1ZmZlciApCisgICAgc2NhbGVQc1N0YXRlc0J1ZmZlcihoX3BzX2QsKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnNjYWxlRmFjdG9yUHNEZWxheUJ1ZmZlci1tYXhTY2FsKSk7CisKKyAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLnNmX21RbWZCdWZmZXIgPSBtYXhTY2FsOworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXIgPSBtYXhTY2FsOworCisgICpzY2FsZUZhY3RvckhpZ2hCYW5kICs9IG1heFNjYWwgLSBzY2FsZUZhY3RvckhpZ2hCYW5kczsKKworICBoX3BzX2QtPnJlc2NhbCA9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2g7CisgIGhfcHNfZC0+c2ZfSW50QnVmZmVyID0gbWF4U2NhbDsKKworICAqc2NhbGVGYWN0b3JMb3dCYW5kX2xiICs9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdzsKKyAgKnNjYWxlRmFjdG9yTG93QmFuZF9oYiArPSBtYXhTY2FsIC0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoOworfQorCit2b2lkIHJlc2NhbEZpbHRlckJhbmtWYWx1ZXMoIEhBTkRMRV9QU19ERUMgICBoX3BzX2QsICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqUW1mQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsc2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNiciBzdGFydCBzdWJiYW5kICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbm9Db2xzKQoreworICBpbnQgaTsKKyAgLyogc2NhbGUgYmFjayA2IHRpbWVzbG90cyBsb29rIGFoZWFkIGZvciBoeWJyaWQgZmlsdGVyYmFuayB0byBvcmlnaW5hbCB2YWx1ZSAqLworICBmb3IgKCBpPW5vQ29sczsgaTxub0NvbHMgKyAoNik7IGkrKyApIHsKKyAgICBzY2FsZVZhbHVlcyggUW1mQnVmZmVyUmVhbFtpXSwgbHNiLCBoX3BzX2QtPnJlc2NhbCApOworICAgIHNjYWxlVmFsdWVzKCBRbWZCdWZmZXJJbWFnW2ldLCBsc2IsIGhfcHNfZC0+cmVzY2FsICk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgIEdlbmVyYXRlIGRlY29ycmVsYXRlZCBzaWRlIGNoYW5uZWwgdXNpbmcgYWxscGFzcy9kZWxheQorCisgIFxyZXR1cm4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkZUNvcnJlbGF0ZVNsb3RCYXNlZCggSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KKworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkUmVhbExlZnQsICAgIC8qITwgbGVmdCAobW9ubykgaHlicmlkIHZhbHVlcyByZWFsICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRJbWFnTGVmdCwgICAgLyohPCBsZWZ0IChtb25vKSBoeWJyaWQgdmFsdWVzIGltYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfbUh5YnJpZExlZnQsICAgICAvKiE8IHNjYWxlZmFjdG9yIGZvciBsZWZ0IChtb25vKSBoeWJyaWQgYmFuZHMgKi8KKworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpySW50QnVmZmVyTGVmdCwgICAgIC8qITwgcmVhbCBxbWYgYmFuZHMgbGVmdCAobW9ubykgKDM4eDY0KSAqLworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICppSW50QnVmZmVyTGVmdCwgICAgIC8qITwgcmVhbCBxbWYgYmFuZHMgbGVmdCAobW9ubykgKDM4eDY0KSAqLworICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICBzZl9JbnRCdWZmZXIsICAgICAgIC8qITwgc2NhbGVmYWN0b3IgZm9yIGFsbCBsZWZ0IGFuZCByaWdodCBxbWYgYmFuZHMgICAqLworCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsUmlnaHQsICAgLyohPCByaWdodCAoZGVjb3JyZWxhdGVkKSBoeWJyaWQgdmFsdWVzIHJlYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZEltYWdSaWdodCwgICAvKiE8IHJpZ2h0IChkZWNvcnJlbGF0ZWQpIGh5YnJpZCB2YWx1ZXMgaW1hZyAqLworCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJSaWdodCwgICAgLyohPCByZWFsIHFtZiBiYW5kcyByaWdodCAoZGVjb3JyZWxhdGVkKSAoMzh4NjQpICovCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmlJbnRCdWZmZXJSaWdodCApICAgLyohPCByZWFsIHFtZiBiYW5kcyByaWdodCAoZGVjb3JyZWxhdGVkKSAoMzh4NjQpICovCit7CisKKyAgSU5UICBpLCBtLCBzYiwgZ3IsIGJpbjsKKworICBGSVhQX0RCTCBwZWFrRGlmZiwgbnJnLCB0cmFuc1JhdGlvOworCisgIEZJWFBfREJMICpSRVNUUklDVCBhYUxlZnRSZWFsOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFMZWZ0SW1hZzsKKworICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFSaWdodFJlYWw7CisgIEZJWFBfREJMICpSRVNUUklDVCBhYVJpZ2h0SW1hZzsKKworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFJlYWxEZWxheUJ1ZmZlcjsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnRGVsYXlCdWZmZXI7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFhUG93ZXJTbG90LCBGSVhQX0RCTCwgTk9fTUlEX1JFU19CSU5TKTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFhVHJhbnNSYXRpb1Nsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOworCisvKiEKKzxwcmU+CisgICBwYXJhbWV0ZXIgaW5kZXggICAgICAgcW1mIGJhbmRzICAgICAgICAgICAgIGh5YnJpZCBiYW5kcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAwICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgMCw3CisgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgMSw2CisgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgIEhZQlJJRCBCQU5EUworICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIDkKKyAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICA4CisgICAgICAgICA2ICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAxMAorICAgICAgICAgNyAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgMTEKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICA5ICAgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgMTAgICAgICAgICAgICAgICAgICAgNQorICAgICAgICAxMSAgICAgICAgICAgICAgICAgICA2CisgICAgICAgIDEyICAgICAgICAgICAgICAgICAgIDcKKyAgICAgICAgMTMgICAgICAgICAgICAgICAgICAgOAorICAgICAgICAxNCAgICAgICAgICAgICAgICAgICA5LDEwICAgICAgKDIgKSAgICAgICAgICAgICAgICAgICAgICBRTUYgQkFORFMKKyAgICAgICAgMTUgICAgICAgICAgICAgICAgICAgMTEgLSAxMyAgICgzICkKKyAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgMTQgLSAxNyAgICg0ICkKKyAgICAgICAgMTcgICAgICAgICAgICAgICAgICAgMTggLSAyMiAgICg1ICkKKyAgICAgICAgMTggICAgICAgICAgICAgICAgICAgMjMgLSAzNCAgICgxMikKKyAgICAgICAgMTkgICAgICAgICAgICAgICAgICAgMzUgLSA2MyAgICgyOSkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPC9wcmU+CisqLworCisgICNkZWZpbmUgRkxUUl9TQ0FMRSAzCisKKyAgLyogaHlicmlkIGJhbmRzIChwYXJhbWV0ZXIgaW5kZXggMCAtIDcpICovCisgIGFhTGVmdFJlYWwgID0gbUh5YnJpZFJlYWxMZWZ0OworICBhYUxlZnRJbWFnICA9IG1IeWJyaWRJbWFnTGVmdDsKKworICBhYVBvd2VyU2xvdFswXSA9ICggZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFswXSwgIGFhTGVmdFJlYWxbMF0pLCAgYWFMZWZ0SW1hZ1swXSwgIGFhTGVmdEltYWdbMF0gKSA+PiBGTFRSX1NDQUxFICkgKworICAgICAgICAgICAgICAgICAgICggZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFs3XSwgIGFhTGVmdFJlYWxbN10pLCAgYWFMZWZ0SW1hZ1s3XSwgIGFhTGVmdEltYWdbN10gKSA+PiBGTFRSX1NDQUxFICk7CisKKyAgYWFQb3dlclNsb3RbMV0gPSAoIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMV0sICBhYUxlZnRSZWFsWzFdKSwgIGFhTGVmdEltYWdbMV0sICBhYUxlZnRJbWFnWzFdICkgPj4gRkxUUl9TQ0FMRSApICsKKyAgICAgICAgICAgICAgICAgICAoIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbNl0sICBhYUxlZnRSZWFsWzZdKSwgIGFhTGVmdEltYWdbNl0sICBhYUxlZnRJbWFnWzZdICkgPj4gRkxUUl9TQ0FMRSApOworCisgIGFhUG93ZXJTbG90WzJdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzJdLCAgYWFMZWZ0UmVhbFsyXSksICBhYUxlZnRJbWFnWzJdLCAgYWFMZWZ0SW1hZ1syXSApID4+IEZMVFJfU0NBTEU7CisgIGFhUG93ZXJTbG90WzNdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzNdLCAgYWFMZWZ0UmVhbFszXSksICBhYUxlZnRJbWFnWzNdLCAgYWFMZWZ0SW1hZ1szXSApID4+IEZMVFJfU0NBTEU7CisKKyAgYWFQb3dlclNsb3RbNF0gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbOV0sICBhYUxlZnRSZWFsWzldKSwgIGFhTGVmdEltYWdbOV0sICBhYUxlZnRJbWFnWzldICkgPj4gRkxUUl9TQ0FMRTsKKyAgYWFQb3dlclNsb3RbNV0gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbOF0sICBhYUxlZnRSZWFsWzhdKSwgIGFhTGVmdEltYWdbOF0sICBhYUxlZnRJbWFnWzhdICkgPj4gRkxUUl9TQ0FMRTsKKworICBhYVBvd2VyU2xvdFs2XSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFsxMF0sIGFhTGVmdFJlYWxbMTBdKSwgYWFMZWZ0SW1hZ1sxMF0sIGFhTGVmdEltYWdbMTBdICkgPj4gRkxUUl9TQ0FMRTsKKyAgYWFQb3dlclNsb3RbN10gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMTFdLCBhYUxlZnRSZWFsWzExXSksIGFhTGVmdEltYWdbMTFdLCBhYUxlZnRJbWFnWzExXSApID4+IEZMVFJfU0NBTEU7CisKKyAgLyogcW1mIGJhbmRzIChwYXJhbWV0ZXIgaW5kZXggOCAtIDE5KSAqLworICBmb3IgKCBiaW4gPSA4OyBiaW4gPCBOT19NSURfUkVTX0JJTlM7IGJpbisrICkgeworICAgIEZJWFBfREJMIHNsb3ROcmcgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgZm9yICggaSA9IGdyb3VwQm9yZGVyczIwW2JpbisyXTsgaSA8IGdyb3VwQm9yZGVyczIwW2JpbiszXTsgaSsrICkgeyAgLyogbWF4IGxvb3BzOiAyOSAqLworICAgICAgc2xvdE5yZyArPSBmTXVsdEFkZERpdjIgKCBmTXVsdERpdjIockludEJ1ZmZlckxlZnRbaV0sIHJJbnRCdWZmZXJMZWZ0W2ldKSwgaUludEJ1ZmZlckxlZnRbaV0sIGlJbnRCdWZmZXJMZWZ0W2ldKSA+PiBGTFRSX1NDQUxFOworICAgIH0KKyAgICBhYVBvd2VyU2xvdFtiaW5dID0gc2xvdE5yZzsKKworICB9CisKKworICAvKiBjYWxjdWxhdGlvbiBvZiB0cmFuc2llbnQgcmF0aW8gKi8KKyAgZm9yIChiaW49MDsgYmluIDwgTk9fTUlEX1JFU19CSU5TOyBiaW4rKykgeyAgIC8qIG5vQmlucyA9IDIwICggQkFTRUxJTkVfUFMgKSAqLworCisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW5bYmluXSA9IGZNdWx0KCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dLCBQRUFLX0RFQ0FZX0ZBQ1RPUiApOworCisgICAgaWYgKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gPCBhYVBvd2VyU2xvdFtiaW5dKSB7CisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dID0gYWFQb3dlclNsb3RbYmluXTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgUFNtb290aFBlYWtEZWNheURpZmZOcmcgKi8KKyAgICBwZWFrRGlmZiA9IGZNdWx0QWRkICggKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW5bYmluXT4+MSksCisgICAgICAgICAgICAgICAgIElOVF9GSUxURVJfQ09FRkYsIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gLSBhYVBvd2VyU2xvdFtiaW5dIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbltiaW5dKTsKKworICAgIC8qIHNhdmUgcGVha0RpZmYgZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbltiaW5dID0gcGVha0RpZmY7CisKKyAgICBucmcgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbltiaW5dICsgZk11bHQoIElOVF9GSUxURVJfQ09FRkYsIGFhUG93ZXJTbG90W2Jpbl0gLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbltiaW5dICk7CisKKyAgICAvKiBOZWdhdGl2ZSBlbmVyZ2llcyBkb24ndCBleGlzdC4gQnV0IHNvbWV0aW1lcyB0aGV5IGFwcGVhciBkdWUgdG8gcm91bmRpbmcuICovCisKKyAgICBucmcgPSBmaXhNYXgobnJnLEZMMkZYQ09OU1RfREJMKDAuZikpOworCisgICAgLyogc2F2ZSBucmcgZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSA9IG5yZzsKKworICAgIG5yZyA9IGZNdWx0KCBucmcsIFRSQU5TSUVOVF9JTVBBQ1RfRkFDVE9SICk7CisKKyAgICAvKiBzYXZlIHRyYW5zaWVudCBpbXBhY3QgZmFjdG9yICovCisgICAgaWYgKCBwZWFrRGlmZiA8PSBucmcgfHwgcGVha0RpZmYgPT0gRkwyRlhDT05TVF9EQkwoMC4wKSApIHsKKyAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qIEZMMkZYQ09OU1RfREJMKDEuMGYpKi87CisgICAgfQorICAgIGVsc2UgaWYgKCBucmcgPD0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CisgICAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBzY2FsZSB0byBkZW5vbWluYXRvciAqLworICAgICAgSU5UIHNjYWxlX2xlZnQgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKHBlYWtEaWZmKSAtIDEpOworICAgICAgYWFUcmFuc1JhdGlvU2xvdFtiaW5dID0gc2NodXJfZGl2KCBucmc8PHNjYWxlX2xlZnQsIHBlYWtEaWZmPDxzY2FsZV9sZWZ0LCAxNik7CisgICAgfQorICB9IC8qIGJpbiAqLworCisKKworCisgICNkZWZpbmUgREVMQVlfR1JPVVBfT0ZGU0VUICAgIDIwCisgICNkZWZpbmUgTlJfT0ZfREVMQVlfR1JPVVBTICAgICAyCisKKyAgRklYUF9EQkwgclRtcCwgaVRtcCwgclRtcDAsIGlUbXAwLCByUjAsIGlSMDsKKworICBJTlQgVGVtcERlbGF5ICAgICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmRlbGF5QnVmSW5kZXg7ICAvKiBzZXQgZGVsYXkgaW5kaWNlcyAqLworCisgIHBSZWFsRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclN1YlFtZltUZW1wRGVsYXldOworICBwSW1hZ0RlbGF5QnVmZmVyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbVGVtcERlbGF5XTsKKworICBhYUxlZnRSZWFsICA9IG1IeWJyaWRSZWFsTGVmdDsKKyAgYWFMZWZ0SW1hZyAgPSBtSHlicmlkSW1hZ0xlZnQ7CisgIGFhUmlnaHRSZWFsID0gbUh5YnJpZFJlYWxSaWdodDsKKyAgYWFSaWdodEltYWcgPSBtSHlicmlkSW1hZ1JpZ2h0OworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIElDQyBncm91cHMgOiAgMCAtICA5ICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogZ3IgPSBJQ0MgZ3JvdXBzICovCisgIGZvciAoZ3I9MDsgZ3IgPCBTVUJRTUZfR1JPVVBTOyBncisrKSB7CisKKyAgICB0cmFuc1JhdGlvID0gYWFUcmFuc1JhdGlvU2xvdFtiaW5zMmdyb3VwTWFwMjBbZ3JdXTsKKworICAgIC8qIHNiID0gc3ViUU1GL1FNRiBzdWJiYW5kICovCisgICAgc2IgPSBncm91cEJvcmRlcnMyMFtncl07CisKKyAgICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVycywgc2FtcGxlIGRlbGF5IGFsbHBhc3MgPSAyICovCisgICAgclRtcDAgPSBwUmVhbERlbGF5QnVmZmVyW3NiXTsKKyAgICBpVG1wMCA9IHBJbWFnRGVsYXlCdWZmZXJbc2JdOworCisgICAgcFJlYWxEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRSZWFsW3NiXTsKKyAgICBwSW1hZ0RlbGF5QnVmZmVyW3NiXSA9IGFhTGVmdEltYWdbc2JdOworCisgICAgLyogZGVsYXkgYnkgZnJhY3Rpb24gKi8KKyAgICBjcGx4TXVsdERpdjIoJnJSMCwgJmlSMCwgclRtcDAsIGlUbXAwLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlU3ViUW1mMjBbc2JdLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltU3ViUW1mMjBbc2JdKTsKKyAgICByUjA8PD0xOworICAgIGlSMDw8PTE7CisKKyAgICBGSVhQX0RCTCAqcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3NiXTsKKyAgICBGSVhQX0RCTCAqcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3NiXTsKKworICAgIGZvciAobT0wOyBtPE5PX1NFUklBTF9BTExQQVNTX0xJTktTIDsgbSsrKSB7CisKKyAgICAgIElOVCB0bXBEZWxheVJTZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlSQnVmSW5kZXhTZXJbbV07CisKKyAgICAgIC8qIGdldCBkZWxheWVkIHZhbHVlcyBmcm9tIGFjY29yZGluZyBidWZmZXIgOiBtKDApPTM7IG0oMSk9NDsgbSgyKT01OyAqLworICAgICAgclRtcDAgPSBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZlt0bXBEZWxheVJTZXJdOworICAgICAgaVRtcDAgPSBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZlt0bXBEZWxheVJTZXJdOworCisgICAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLworICAgICAgY3BseE11bHREaXYyKCZyVG1wLCAmaVRtcCwgclRtcDAsIGlUbXAwLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlU3ViUW1mMjBbc2JdW21dLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltU3ViUW1mMjBbc2JdW21dKTsKKworICAgICAgclRtcCA9IChyVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByUjApKSA8PCAxOworICAgICAgaVRtcCA9IChpVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCBpUjApKSA8PCAxOworCisgICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZlt0bXBEZWxheVJTZXJdID0gclIwICsgZk11bHQoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJUbXApOworICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXSA9IGlSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCBpVG1wKTsKKworICAgICAgclIwID0gclRtcDsKKyAgICAgIGlSMCA9IGlUbXA7CisKKyAgICAgIHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mICs9IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dOworICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWYgKz0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV07CisKKyAgICB9IC8qIG0gKi8KKworICAgIC8qIGR1Y2sgaWYgYSBwYXN0IHRyYW5zaWVudCBpcyBmb3VuZCAqLworICAgIGFhUmlnaHRSZWFsW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIHJSMCk7CisgICAgYWFSaWdodEltYWdbc2JdID0gZk11bHQodHJhbnNSYXRpbywgaVIwKTsKKworICB9IC8qIGdyICovCisKKworICBzY2FsZVZhbHVlcyggbUh5YnJpZFJlYWxMZWZ0LCAgTk9fU1VCX1FNRl9DSEFOTkVMUywgLVNDQUxfSEVBRFJPT00gKTsKKyAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRJbWFnTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7CisgIHNjYWxlVmFsdWVzKCBtSHlicmlkUmVhbFJpZ2h0LCBOT19TVUJfUU1GX0NIQU5ORUxTLCAtU0NBTF9IRUFEUk9PTSApOworICBzY2FsZVZhbHVlcyggbUh5YnJpZEltYWdSaWdodCwgTk9fU1VCX1FNRl9DSEFOTkVMUywgLVNDQUxfSEVBRFJPT00gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgYWFMZWZ0UmVhbCAgPSBySW50QnVmZmVyTGVmdDsKKyAgYWFMZWZ0SW1hZyAgPSBpSW50QnVmZmVyTGVmdDsKKyAgYWFSaWdodFJlYWwgPSBySW50QnVmZmVyUmlnaHQ7CisgIGFhUmlnaHRJbWFnID0gaUludEJ1ZmZlclJpZ2h0OworCisgIHBSZWFsRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclFtZltUZW1wRGVsYXldOworICBwSW1hZ0RlbGF5QnVmZmVyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJRbWZbVGVtcERlbGF5XTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiBJQ0MgZ3JvdXBzIDogMTAgLSAxOSAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogZ3IgPSBJQ0MgZ3JvdXBzICovCisgIGZvciAoZ3I9U1VCUU1GX0dST1VQUzsgZ3IgPCBOT19JSURfR1JPVVBTIC0gTlJfT0ZfREVMQVlfR1JPVVBTOyBncisrKSB7CisKKyAgICB0cmFuc1JhdGlvID0gYWFUcmFuc1JhdGlvU2xvdFtiaW5zMmdyb3VwTWFwMjBbZ3JdXTsKKworICAgIC8qIHNiID0gc3ViUU1GL1FNRiBzdWJiYW5kICovCisgICAgZm9yIChzYiA9IGdyb3VwQm9yZGVyczIwW2dyXTsgc2IgPCBncm91cEJvcmRlcnMyMFtncisxXTsgc2IrKykgeworICAgICAgRklYUF9EQkwgcmVzUiwgcmVzSTsKKworICAgICAgLyogZGVjYXlTY2FsZUZhY3RvciA9IDEuMGYgKyBkZWNheV9jdXRvZmYgKiBERUNBWV9TTE9QRSAtIERFQ0FZX1NMT1BFICogc2I7IERFQ0FZX1NMT1BFID0gMC4wNSAqLworICAgICAgRklYUF9EQkwgZGVjYXlTY2FsZUZhY3RvciA9IGRlY2F5U2NhbGVGYWN0VGFibGVbc2JdOworCisgICAgICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVycywgc2FtcGxlIGRlbGF5IGFsbHBhc3MgPSAyICovCisgICAgICByVG1wMCA9IHBSZWFsRGVsYXlCdWZmZXJbc2JdOworICAgICAgaVRtcDAgPSBwSW1hZ0RlbGF5QnVmZmVyW3NiXTsKKworICAgICAgcFJlYWxEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRSZWFsW3NiXTsKKyAgICAgIHBJbWFnRGVsYXlCdWZmZXJbc2JdID0gYWFMZWZ0SW1hZ1tzYl07CisKKyAgICAgIC8qIGRlbGF5IGJ5IGZyYWN0aW9uICovCisgICAgICBjcGx4TXVsdERpdjIoJnJSMCwgJmlSMCwgclRtcDAsIGlUbXAwLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlUW1mW3NiXSwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVFtZltzYl0pOworICAgICAgclIwPDw9MTsKKyAgICAgIGlSMDw8PTE7CisKKyAgICAgIHJlc1IgPSBmTXVsdChkZWNheVNjYWxlRmFjdG9yLCByUjApOworICAgICAgcmVzSSA9IGZNdWx0KGRlY2F5U2NhbGVGYWN0b3IsIGlSMCk7CisKKyAgICAgIEZJWFBfREJMICpwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZiA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbc2JdOworICAgICAgRklYUF9EQkwgKnBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltzYl07CisKKyAgICAgIGZvciAobT0wOyBtPE5PX1NFUklBTF9BTExQQVNTX0xJTktTIDsgbSsrKSB7CisKKyAgICAgICAgSU5UIHRtcERlbGF5UlNlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlclttXTsKKworICAgICAgICAvKiBnZXQgZGVsYXllZCB2YWx1ZXMgZnJvbSBhY2NvcmRpbmcgYnVmZmVyIDogbSgwKT0zOyBtKDEpPTQ7IG0oMik9NTsgKi8KKyAgICAgICAgclRtcDAgPSBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZlt0bXBEZWxheVJTZXJdOworICAgICAgICBpVG1wMCA9IHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl07CisKKyAgICAgICAgLyogZGVsYXkgYnkgZnJhY3Rpb24gKi8KKyAgICAgICAgY3BseE11bHREaXYyKCZyVG1wLCAmaVRtcCwgclRtcDAsIGlUbXAwLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW3NiXVttXSwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVFtZltzYl1bbV0pOworCisgICAgICAgIHJUbXAgPSAoclRtcCAtIGZNdWx0RGl2MihhQWxscGFzc0xpbmtEZWNheVNlclttXSwgcmVzUikpPDwxOworICAgICAgICBpVG1wID0gKGlUbXAgLSBmTXVsdERpdjIoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJlc0kpKTw8MTsKKworICAgICAgICByZXNSID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgclRtcCk7CisgICAgICAgIHJlc0kgPSBmTXVsdChkZWNheVNjYWxlRmFjdG9yLCBpVG1wKTsKKworICAgICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZlt0bXBEZWxheVJTZXJdID0gclIwICsgZk11bHQoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJlc1IpOworICAgICAgICBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZlt0bXBEZWxheVJTZXJdID0gaVIwICsgZk11bHQoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJlc0kpOworCisgICAgICAgIHJSMCA9IHJUbXA7CisgICAgICAgIGlSMCA9IGlUbXA7CisKKyAgICAgICAgcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWYgKz0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV07CisgICAgICAgIHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mICs9IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dOworCisgICAgICB9IC8qIG0gKi8KKworICAgICAgLyogZHVjayBpZiBhIHBhc3QgdHJhbnNpZW50IGlzIGZvdW5kICovCisgICAgICBhYVJpZ2h0UmVhbFtzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCByUjApOworICAgICAgYWFSaWdodEltYWdbc2JdID0gZk11bHQodHJhbnNSYXRpbywgaVIwKTsKKworICAgIH0gLyogc2IgKi8KKyAgfSAvKiBnciAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIElDQyBncm91cHMgOiAyMCwgIDIxICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKiBnciA9IElDQyBncm91cHMgKi8KKyAgZm9yIChncj1ERUxBWV9HUk9VUF9PRkZTRVQ7IGdyIDwgTk9fSUlEX0dST1VQUzsgZ3IrKykgeworCisgICAgSU5UIHNiU3RhcnQgPSBncm91cEJvcmRlcnMyMFtncl07CisgICAgSU5UIHNiU3RvcCAgPSBncm91cEJvcmRlcnMyMFtncisxXTsKKworICAgIFVDSEFSICpwRGVsYXlCdWZJZHggPSAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5QnVmSW5kZXhEZWxheVFtZltzYlN0YXJ0LUZJUlNUX0RFTEFZX1NCXTsKKworICAgIHRyYW5zUmF0aW8gPSBhYVRyYW5zUmF0aW9TbG90W2JpbnMyZ3JvdXBNYXAyMFtncl1dOworCisgICAgLyogc2IgPSBzdWJRTUYvUU1GIHN1YmJhbmQgKi8KKyAgICBmb3IgKHNiID0gc2JTdGFydDsgc2IgPCBzYlN0b3A7IHNiKyspIHsKKworICAgICAgLyogVXBkYXRlIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICAgIHJSMCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlsqcERlbGF5QnVmSWR4XVtzYi1GSVJTVF9ERUxBWV9TQl07CisgICAgICBpUjAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdOworCisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdID0gYWFMZWZ0UmVhbFtzYl07CisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdID0gYWFMZWZ0SW1hZ1tzYl07CisKKyAgICAgIC8qIGR1Y2sgaWYgYSBwYXN0IHRyYW5zaWVudCBpcyBmb3VuZCAqLworICAgICAgYWFSaWdodFJlYWxbc2JdID0gZk11bHQodHJhbnNSYXRpbywgclIwKTsKKyAgICAgIGFhUmlnaHRJbWFnW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIGlSMCk7CisKKyAgICAgIGlmICgrKygqcERlbGF5QnVmSWR4KSA+PSBkZWxheUluZGV4UW1mW3NiXSkgeworICAgICAgICAqcERlbGF5QnVmSWR4ID0gMDsKKyAgICAgIH0KKyAgICAgIHBEZWxheUJ1ZklkeCsrOworCisgICAgfSAvKiBzYiAqLworICB9IC8qIGdyICovCisKKworICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVyIGluZGV4ICovCisgIGlmICgrK2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmRlbGF5QnVmSW5kZXggPj0gTk9fU0FNUExFX0RFTEFZX0FMTFBBU1MpCisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuZGVsYXlCdWZJbmRleCA9IDA7CisKKyAgZm9yIChtPTA7IG08Tk9fU0VSSUFMX0FMTFBBU1NfTElOS1MgOyBtKyspIHsKKyAgICBpZiAoKytoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlSQnVmSW5kZXhTZXJbbV0gPj0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV0pCisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlSQnVmSW5kZXhTZXJbbV0gPSAwOworICB9CisKKworICBzY2FsZVZhbHVlcyggJnJJbnRCdWZmZXJMZWZ0W05PX1FNRl9CQU5EU19IWUJSSUQyMF0sICBOT19RTUZfQ0hBTk5FTFMtTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCAtU0NBTF9IRUFEUk9PTSApOworICBzY2FsZVZhbHVlcyggJmlJbnRCdWZmZXJMZWZ0W05PX1FNRl9CQU5EU19IWUJSSUQyMF0sICBOT19RTUZfQ0hBTk5FTFMtTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCAtU0NBTF9IRUFEUk9PTSApOworICBzY2FsZVZhbHVlcyggJnJJbnRCdWZmZXJSaWdodFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCBOT19RTUZfQ0hBTk5FTFMtTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCAtU0NBTF9IRUFEUk9PTSApOworICBzY2FsZVZhbHVlcyggJmlJbnRCdWZmZXJSaWdodFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCBOT19RTUZfQ0hBTk5FTFMtTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCAtU0NBTF9IRUFEUk9PTSApOworCisgIC8qIGZyZWUgbWVtb3J5IG9uIHNjcmF0Y2ggKi8KKyAgQ19BTExPQ19TQ1JBVENIX0VORChhYVRyYW5zUmF0aW9TbG90LCBGSVhQX0RCTCwgTk9fTUlEX1JFU19CSU5TKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChhYVBvd2VyU2xvdCwgRklYUF9EQkwsIE5PX01JRF9SRVNfQklOUyk7Cit9CisKKwordm9pZCBpbml0U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLCAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworCisgIElOVCAgICAgZ3JvdXAgPSAwOworICBJTlQgICAgIGJpbiA9ICAwOworICBJTlQgICAgIG5vSWlkU3RlcHM7CisKKy8qICBjb25zdCBVQ0hBUiAqcFF1YW50aXplZElJRHM7Ki8KKworICBGSVhQX1NHTCAgaW52TDsKKyAgRklYUF9EQkwgIFNjYWxlTCwgU2NhbGVSOworICBGSVhQX0RCTCAgQWxwaGEsIEJldGE7CisgIEZJWFBfREJMICBoMTFyLCBoMTJyLCBoMjFyLCBoMjJyOworCisgIGNvbnN0IEZJWFBfREJMICAqUFNjYWxlRmFjdG9yczsKKworICAvKiBPdmVyd3JpdGUgb2xkIHZhbHVlcyBpbiBkZWxheSBidWZmZXJzIHdoZW4gdXBwZXIgc3ViYmFuZCBpcyBoaWdoZXIgdGhhbiBpbiBsYXN0IGZyYW1lICovCisgIGlmIChlbnYgPT0gMCkgeworCisgICAgaWYgKCh1c2IgPiBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiKSAmJiBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiKSB7CisKKyAgICAgIElOVCBpLGssbGVuZ3RoOworCisgICAgICBmb3IgKGk9aF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYiA7IGkgPCBGSVJTVF9ERUxBWV9TQjsgaSsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChrPTAgOyBrPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBrKyspIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2tdLCBGSVJTVF9ERUxBWV9TQipzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICAgIGxlbmd0aCA9ICh1c2ItRklSU1RfREVMQVlfU0IpKnNpemVvZihGSVhQX0RCTCk7CisgICAgICBpZihsZW5ndGg+MCkgeworICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0sIGxlbmd0aCk7CisgICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlswXSwgbGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGxlbmd0aCA9IChmaXhNaW4oTk9fREVMQVlfQlVGRkVSX0JBTkRTLChJTlQpdXNiKS1GSVJTVF9ERUxBWV9TQikqc2l6ZW9mKEZJWFBfREJMKTsKKyAgICAgIGlmKGxlbmd0aD4wKSB7CisgICAgICAgIGZvciAoaz0xIDsgayA8IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXk7IGsrKykgeworICAgICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZltrXSwgbGVuZ3RoKTsKKyAgICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZba10sIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYiA9IHVzYjsKKyAgfSAvKiBlbnYgPT0gMCAqLworCisgIGlmIChoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmJGaW5lSWlkUSkKKyAgeworICAgIFBTY2FsZUZhY3RvcnMgPSBTY2FsZUZhY3RvcnNGaW5lOyAvKiB2YWx1ZXMgYXJlIHNoaWZ0ZXQgcmlnaHQgYnkgb25lICovCisgICAgbm9JaWRTdGVwcyA9IE5PX0lJRF9TVEVQU19GSU5FOworICAgIC8qcFF1YW50aXplZElJRHMgPSBxdWFudGl6ZWRJSURzRmluZTsqLworICB9CisKKyAgZWxzZQorICB7CisgICAgUFNjYWxlRmFjdG9ycyA9IFNjYWxlRmFjdG9yczsgLyogdmFsdWVzIGFyZSBzaGlmdGV0IHJpZ2h0IGJ5IG9uZSAqLworICAgIG5vSWlkU3RlcHMgPSBOT19JSURfU1RFUFM7CisgICAgLypwUXVhbnRpemVkSUlEcyA9IHF1YW50aXplZElJRHM7Ki8KKyAgfQorCisKKyAgLyogZGVxdWFudGl6ZSBhbmQgZGVjb2RlICovCisgIGZvciAoIGdyb3VwID0gMDsgZ3JvdXAgPCBOT19JSURfR1JPVVBTOyBncm91cCsrICkgeworCisgICAgYmluID0gYmluczJncm91cE1hcDIwW2dyb3VwXTsKKworICAgIC8qIQorICAgIDxoMz4gdHlwZSAnQScgcm90YXRpb24gPC9oMz4KKyAgICBtaXhpbmcgcHJvY2VkdXJlIFJfYSwgdXNlZCBpbiBiYXNlbGluZSB2ZXJzaW9uPGJyPgorCisgICAgIFNjYWxlLWZhY3RvciB2ZWN0b3JzIGMxIGFuZCBjMiBhcmUgcHJlY2FsY3VsYXRlZCBpbiBpbml0UHNUYWJsZXMgKCkgYW5kIHN0b3JlZCBpbgorICAgICBzY2FsZUZhY3RvcnNbXSBhbmQgc2NhbGVGYWN0b3JzRmluZVtdID0gcFNjYWxlRmFjdG9ycyBbXS4KKyAgICAgRnJvbSB0aGUgbGluZWFyaXplZCBJSUQgcGFyYW1ldGVycyAoaW50ZW5zaXR5IGRpZmZlcmVuY2VzKSwgdHdvIHNjYWxlIGZhY3RvcnMgYXJlCisgICAgIGNhbGN1bGF0ZWQuIFRoZXkgYXJlIHVzZWQgdG8gb2J0YWluIHRoZSBjb2VmZmljaWVudHMgaDExLi4uIGgyMi4KKyAgICAqLworCisgICAgLyogU2NhbGVSIGFuZCBTY2FsZUwgYXJlIHNjYWxlZCBieSAxIHNoaWZ0IHJpZ2h0ICovCisKKyAgICBTY2FsZVIgPSBQU2NhbGVGYWN0b3JzW25vSWlkU3RlcHMgKyBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XVtiaW5dXTsKKyAgICBTY2FsZUwgPSBQU2NhbGVGYWN0b3JzW25vSWlkU3RlcHMgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XVtiaW5dXTsKKworICAgIEJldGEgICA9IGZNdWx0IChmTXVsdCggQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2Jpbl1dLCAoIFNjYWxlUiAtIFNjYWxlTCApKSwgRklYUF9TUVJUMDUpOworICAgIEFscGhhICA9IEFscGhhc1toX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWNjSW5kZXhNYXBwZWRbZW52XVtiaW5dXT4+MTsKKworICAgIC8qIEFscGhhIGFuZCBCZXRhIGFyZSBub3cgYm90aCBzY2FsZWQgYnkgMiBzaGlmdHMgcmlnaHQgKi8KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzIGgxMS4uLiBoMjIgZnJvbSBzY2FsZS1mYWN0b3JzIGFuZCBJQ0MgcGFyYW1ldGVycyAqLworCisgICAgLyogaCB2YWx1ZXMgYXJlIHNjYWxlZCBieSAxIHNoaWZ0IHJpZ2h0ICovCisgICAgeworICAgICAgRklYUF9EQkwgdHJpZ0RhdGFbNF07CisKKyAgICAgIGlubGluZV9maXhwX2Nvc19zaW4oQmV0YSArIEFscGhhLCBCZXRhIC0gQWxwaGEsIDIsIHRyaWdEYXRhKTsKKyAgICAgIGgxMXIgPSBmTXVsdCggU2NhbGVMLCB0cmlnRGF0YVswXSk7CisgICAgICBoMTJyID0gZk11bHQoIFNjYWxlUiwgdHJpZ0RhdGFbMl0pOworICAgICAgaDIxciA9IGZNdWx0KCBTY2FsZUwsIHRyaWdEYXRhWzFdKTsKKyAgICAgIGgyMnIgPSBmTXVsdCggU2NhbGVSLCB0cmlnRGF0YVszXSk7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbnRlcnBvbGF0aW9uIG9mIHRoZSBtYXRyaWNlcyBIMTEuLi4gSDIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEgxMShrLG4pID0gSDExKGssbltlXSkgKyAobi1uW2VdKSAqIChIMTEoayxuW2UrMV0gLSBIMTEoayxuW2VdKSkgLyAobltlKzFdIC0gbltlXSkgICAgKi8KKyAgICAvKiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogaW52TCA9IDEvKGxlbmd0aCBvZiBlbnZlbG9wZSkgKi8KKyAgICBpbnZMID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQoaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2VudiArIDFdIC0gaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2Vudl0pKTsKKworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDExclByZXZbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDEyclByZXZbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIxclByZXZbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXZbZ3JvdXBdOworCisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMXJbZ3JvdXBdICA9IGZNdWx0ICggaDExciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIGludkwgKTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDEycltncm91cF0gID0gZk11bHQgKCBoMTJyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgaW52TCApOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjFyW2dyb3VwXSAgPSBmTXVsdCAoIGgyMXIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBpbnZMICk7CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMnJbZ3JvdXBdICA9IGZNdWx0ICggaDIyciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIGludkwgKTsKKworICAgIC8qIHVwZGF0ZSBwcmV2IGNvZWZmaWNpZW50cyBmb3IgaW50ZXJwb2xhdGlvbiBpbiBuZXh0IGVudmVsb3BlICovCisKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltncm91cF0gPSBoMTFyOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMnJQcmV2W2dyb3VwXSA9IGgxMnI7CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIxclByZXZbZ3JvdXBdID0gaDIxcjsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldltncm91cF0gPSBoMjJyOworCisgIH0gLyogZ3JvdXAgbG9vcCAqLworfQorCisKK3N0YXRpYyB2b2lkIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkUmVhbExlZnQsICAvKiE8IGh5YnJpZCB2YWx1ZXMgcmVhbCBsZWZ0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkSW1hZ0xlZnQsICAvKiE8IGh5YnJpZCB2YWx1ZXMgaW1hZyBsZWZ0ICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRSZWFsLCAgICAgIC8qITwgcmVhbCBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRJbWFnLCAgICAgIC8qITwgaW1hZyBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxSaWdodCwgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgcmlnaHQgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnUmlnaHQsIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIHJpZ2h0ICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0UmVhbCwgICAgIC8qITwgcmVhbCBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodEltYWcgICAgICAvKiE8IGltYWcgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBJTlQgICAgIGdyb3VwOworICBJTlQgICAgIHN1YmJhbmQ7CisKKyAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJMZWZ0UmVhbDsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJMZWZ0SW1hZzsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJSaWdodFJlYWw7CisgIEZJWFBfREJMICpSRVNUUklDVCBIeWJyUmlnaHRJbWFnOworCisgIEZJWFBfREJMIHRtcExlZnQsIHRtcFJpZ2h0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIQorICA8aDI+IE1hcHBpbmcgPC9oMj4KKworICBUaGUgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGF2YWlsYmxlCisgIHBhcmFtZXRlcnMgZm9yIElJRCBhbmQgSUNDOgorICA8cHJlPgorICAgbnIuIG9mIElJRCBwYXJhLnwgbnIuIG9mIElDQyBwYXJhLiB8IG5yLiBvZiBTdGVyZW8gYmFuZHMKKyAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMTAsMjAgICAgICAgICB8ICAgICAxMCwyMCAgICAgICAgfCAgICAgICAgMjAKKyAgICAgMTAsMjAgICAgICAgICB8ICAgICAzNCAgICAgICAgICAgfCAgICAgICAgMzQKKyAgICAgMzQgICAgICAgICAgICB8ICAgICAxMCwyMCAgICAgICAgfCAgICAgICAgMzQKKyAgICAgMzQgICAgICAgICAgICB8ICAgICAzNCAgICAgICAgICAgfCAgICAgICAgMzQKKyAgPC9wcmU+CisgIEluIHRoZSBjYXNlIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3IgSUlTIGFuZCBJQ0MgZGlmZmVycyBmcm9tIHRoZSBudW1iZXIgb2Ygc3RlcmVvCisgIGJhbmRzLCBhIG1hcHBpbmcgZnJvbSB0aGUgbG93ZXIgbnVtYmVyIHRvIHRoZSBoaWdoZXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgYXBwbGllZC4KKyAgSW5kZXggbWFwcGluZyBvZiBJSUQgYW5kIElDQyBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgZG9uZSBpbiBwc2JpdGRlYy5jcHAuIEZ1cnRoZXIgbWFwcGluZyBpcworICBub3QgbmVlZGVkIGhlcmUgaW4gYmFzZWxpbmUgdmVyc2lvbi4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiEKKyAgPGgyPiBNaXhpbmcgPC9oMj4KKworICBUbyBnZW5lcmF0ZSB0aGUgUU1GIHN1YmJhbmQgc2lnbmFscyBmb3IgdGhlIHN1YmJhbmQgc2FtcGxlcyBuID0gbltlXSsxICwsLCBuX1tlKzFdIHRoZQorICBwYXJhbWV0ZXJzIGF0IHBvc2l0aW9uIG5bZV0gYW5kIG5bZSsxXSBhcmUgcmVxdWlyZWQgYXMgd2VsbCBhcyB0aGUgc3ViYmFuZCBkb21haW4gc2lnbmFscworICBzX2sobikgYW5kIGRfayhuKSBmb3IgbiA9IG5bZV0rMS4uLiBuX1tlKzFdLiBuW2VdIHJlcHJlc2VudHMgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvcgorICBlbnZlbG9wZSBlLiBUaGUgYm9yZGVyIHBvc2l0aW9ucyBuW2VdIGFyZSBoYW5kbGVkIGluIERlY29kZVBTKCkuCisKKyAgVGhlIHN0ZXJlbyBzdWIgc3ViYmFuZCBzaWduYWxzIGFyZSBjb25zdHJ1Y3RlZCBhczoKKyAgPHByZT4KKyAgbF9rKG4pID0gSDExKGssbikgc19rKG4pICsgSDIxKGssbikgZF9rKG4pCisgIHJfayhuKSA9IEgyMShrLG4pIHNfayhuKSArIEgyMihrLG4pIGRfayhuKQorICA8L3ByZT4KKyAgSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBtYXRyaWNlcyBIMTEoayxuKS4uLiBIMjIgKGssbiksIHRoZSB2ZWN0b3JzIGgxMShiKS4uLiBoMjIoYikgbmVlZCB0bworICBiZSBjYWxjdWxhdGVkIGZpcnN0IChiOiBwYXJhbWV0ZXIgaW5kZXgpLiBEZXBlbmRpbmcgb24gSUNDIG1vZGUgZWl0aGVyIG1peGluZyBwcm9jZWR1cmUgUl9hCisgIG9yIFJfYiBpcyB1c2VkIGZvciB0aGF0LiBGb3IgYm90aCBwcm9jZWR1cmVzLCB0aGUgcGFyYW1ldGVycyBmb3IgcGFyYW1ldGVyIHBvc2l0aW9uIG5bZSsxXQorICBpcyB1c2VkLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiEKKyAgPGgyPlBoYXNlIHBhcmFtZXRlcnMgPC9oMj4KKyAgV2l0aCBkaXNhYmxlZCBwaGFzZSBwYXJhbWV0ZXJzICh3aGljaCBpcyB0aGUgY2FzZSBpbiBiYXNlbGluZSB2ZXJzaW9uKSwgdGhlIEgtbWF0cmljZXMgYXJlCisgIGp1c3QgY2FsY3VsYXRlZCBieToKKworICA8cHJlPgorICBIMTEoayxuW2UrMV0gPSBoMTEoYihrKSkKKyAgKC4uLikKKyAgYihrKTogcGFyYW1ldGVyIGluZGV4IGFjY29yZGluZyB0byBtYXBwaW5nIHRhYmxlCisgIDwvcHJlPgorCisgIDxoMj5Qcm9jZXNzaW5nIG9mIHRoZSBzYW1wbGVzIGluIHRoZSBzdWIgc3ViYmFuZHMgPC9oMj4KKyAgdGhpcyBsb29wIGluY2x1ZGVzIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgSHh4CisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIGxvb3AgdGhydSBhbGwgZ3JvdXBzIC4uLiAqLworICBIeWJyTGVmdFJlYWwgID0gbUh5YnJpZFJlYWxMZWZ0OworICBIeWJyTGVmdEltYWcgID0gbUh5YnJpZEltYWdMZWZ0OworICBIeWJyUmlnaHRSZWFsID0gbUh5YnJpZFJlYWxSaWdodDsKKyAgSHliclJpZ2h0SW1hZyA9IG1IeWJyaWRJbWFnUmlnaHQ7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogY29uc3RydWN0IHN0ZXJlbyBzdWIgc3ViYmFuZCBzaWduYWxzIGFjY29yZGluZyB0bzogKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogbF9rKG4pID0gSDExKGssbikgc19rKG4pICsgSDIxKGssbikgZF9rKG4pICAgICAgICAgKi8KKyAgLyogcl9rKG4pID0gSDEyKGssbikgc19rKG4pICsgSDIyKGssbikgZF9rKG4pICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgZm9yICggZ3JvdXAgPSAwOyBncm91cCA8IFNVQlFNRl9HUk9VUFM7IGdyb3VwKysgKSB7CisKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTFyW2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjFyW2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjJyW2dyb3VwXTsKKworICAgIHN1YmJhbmQgPSBncm91cEJvcmRlcnMyMFtncm91cF07CisKKyAgICB0bXBMZWZ0ICA9IGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOworICAgIHRtcFJpZ2h0ID0gZk11bHRBZGREaXYyKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgSHlickxlZnRSZWFsW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSk7CisgICAgSHlickxlZnRSZWFsIFtzdWJiYW5kXSA9IHRtcExlZnQ8PDE7CisgICAgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSA9IHRtcFJpZ2h0PDwxOworCisgICAgdG1wTGVmdCAgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0SW1hZ1tzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodEltYWdbc3ViYmFuZF0pOworICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKKyAgICBIeWJyTGVmdEltYWcgW3N1YmJhbmRdID0gdG1wTGVmdDsKKyAgICBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdID0gdG1wUmlnaHQ7CisgIH0KKworICAvKiBjb250aW51ZSBpbiB0aGUgcW1mIGJ1ZmZlcnMgKi8KKyAgSHlickxlZnRSZWFsICA9IFFtZkxlZnRSZWFsOworICBIeWJyTGVmdEltYWcgID0gUW1mTGVmdEltYWc7CisgIEh5YnJSaWdodFJlYWwgPSBRbWZSaWdodFJlYWw7CisgIEh5YnJSaWdodEltYWcgPSBRbWZSaWdodEltYWc7CisKKyAgZm9yICg7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKyApIHsKKworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMXJbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMnJbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMnJbZ3JvdXBdOworCisgICAgZm9yICggc3ViYmFuZCA9IGdyb3VwQm9yZGVyczIwW2dyb3VwXTsgc3ViYmFuZCA8IGdyb3VwQm9yZGVyczIwW2dyb3VwICsgMV07IHN1YmJhbmQrKyApCisgICAgeworICAgICAgdG1wTGVmdCAgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOworICAgICAgdG1wUmlnaHQgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOworICAgICAgSHlickxlZnRSZWFsIFtzdWJiYW5kXSA9IHRtcExlZnQ7CisgICAgICBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdID0gdG1wUmlnaHQ7CisKKyAgICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKKyAgICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKKyAgICAgIEh5YnJMZWZ0SW1hZyBbc3ViYmFuZF0gPSB0bXBMZWZ0OworICAgICAgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSA9IHRtcFJpZ2h0OworCisgICAgfSAvKiBzdWJiYW5kICovCisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgQXBwbGllcyBJSUQsIElDQywgSVBEIGFuZCBPUEQgcGFyYW1ldGVycyB0byB0aGUgY3VycmVudCBmcmFtZS4KKworICBccmV0dXJuIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0FwcGx5UHNTbG90KCBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgICAvKiE8IGhhbmRsZSBQU19ERUMqLworICAgICAgICAgICAgIEZJWFBfREJMICAqKnJJbnRCdWZmZXJMZWZ0LCAgIC8qITwgcmVhbCBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICgzOHg2NCkgICovCisgICAgICAgICAgICAgRklYUF9EQkwgICoqaUludEJ1ZmZlckxlZnQsICAgLyohPCBpbWFnIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKDM4eDY0KSAgKi8KKyAgICAgICAgICAgICBGSVhQX0RCTCAgKnJJbnRCdWZmZXJSaWdodCwgICAvKiE8IHJlYWwgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKDM4eDY0KSAqLworICAgICAgICAgICAgIEZJWFBfREJMICAqaUludEJ1ZmZlclJpZ2h0ICAgIC8qITwgaW1hZyBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAoMzh4NjQpICovCisgICAgICAgICAgICkKK3sKKworICAvKiEKKyAgVGhlIDY0LWJhbmQgUU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb25hdXJhbCBzaWduYWwgZ2VuZXJhdGVkIGJ5IHRoZSBTQlIgdG9vbAorICBpcyB1c2VkIGFzIGlucHV0IG9mIHRoZSBQUyB0b29sLiBBZnRlciB0aGUgUFMgcHJvY2Vzc2luZywgdGhlIG91dHB1dHMgb2YgdGhlIGxlZnQKKyAgYW5kIHJpZ2h0IGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFua3MgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHN0ZXJlbyBvdXRwdXQKKyAgc2lnbmFsLgorCisgIDxwcmU+CisKKyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIHwgSHlicmlkICAgICAgfCBNX25bayxtXSB8ICAgICAgICAgIHwgTF9uW2ssbV0gfCBIeWJyaWQgICAgICB8IGxbbl0KKyAgIG1bbl0gLS0tPnwgYW5hbHlzaXMgICAgfC0tLS0tLS0tLT58ICAgICAgICAgIHwtLS0tLS0tLS0+fCBzeW50aGVzaXMgICB8LS0tLS0+CisgICAgICAgICAgICB8IGZpbHRlciBiYW5rIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgZmlsdGVyIGJhbmsgfAorICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgU3RlcmVvICAgfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgcmVjb24tICAgfAorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgc3R1Y3Rpb24gfAorICAgICAgICAgICAgICAgICAgXHwvICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgICAgfCBEZS0gICAgICAgICB8IERfbltrLG1dIHwgICAgICAgICAgfAorICAgICAgICAgICAgfCBjb3JyZWxhdGlvbiB8LS0tLS0tLS0tPnwgICAgICAgICAgfAorICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCBSX25bayxtXSB8IEh5YnJpZCAgICAgIHwgcltuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KKyAgIElJRCwgSUNDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgIHwgICAgICAgICAgfCBmaWx0ZXIgYmFuayB8CisgIChJUEQsIE9QRCkgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tCisKKyAgbVtuXTogICAgICBRTUYgcmVwcmVzYW50YXRpb24gb2YgdGhlIG1vbm8gaW5wdXQKKyAgTV9uW2ssbV06ICAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscyBvZiB0aGUgbW9ubyBpbnB1dAorICBEX25bayxtXTogIGRlY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscworICBMX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSBsZWZ0IG91dHB1dAorICBSX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSByaWdodCBvdXRwdXQKKyAgbFtuXSxyW25dOiBsZWZ0L3JpZ2h0IG91dHB1dCBzaWduYWxzCisKKyAgPC9wcmU+CisgICovCisKKyAgLyogZ2V0IHRlbXBvcmFyeSBoeWJyaWQgcW1mIHZhbHVlcyBvZiBvbmUgdGltZXNsb3QgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZFJlYWxMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChoeWJyaWRJbWFnTGVmdCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoaHlicmlkUmVhbFJpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChoeWJyaWRJbWFnUmlnaHQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKKworICBTQ0hBUiBzZl9JbnRCdWZmZXIgICAgID0gaF9wc19kLT5zZl9JbnRCdWZmZXI7CisKKyAgLyogY2xlYXIgd29ya2J1ZmZlciAqLworICBGREttZW1jbGVhcihoeWJyaWRSZWFsTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKGh5YnJpZEltYWdMZWZ0LCAgTk9fU1VCX1FNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIoaHlicmlkUmVhbFJpZ2h0LCBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihoeWJyaWRJbWFnUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CisKKworICAvKiEKKyAgSHlicmlkIGFuYWx5c2lzIGZpbHRlcmJhbms6CisgIFRoZSBsb3dlciAzICg1KSBvZiB0aGUgNjQgUU1GIHN1YmJhbmRzIGFyZSBmdXJ0aGVyIHNwbGl0IHRvIHByb3ZpZGUgYmV0dGVyIGZyZXF1ZW5jeSByZXNvbHV0aW9uLgorICBmb3IgUFMgcHJvY2Vzc2luZy4KKyAgRm9yIHRoZSAxMCBhbmQgMjAgc3RlcmVvIGJhbmRzIGNvbmZpZ3VyYXRpb24sIHRoZSBRTUYgYmFuZCBIXzAodykgaXMgc3BsaXQKKyAgdXAgaW50byA4IChzdWItKSBzdWItYmFuZHMgYW5kIHRoZSBRTUYgYmFuZHMgSF8xKHcpIGFuZCBIXzIodykgYXJlIHNwaXQgaW50byAyIChzdWItKQorICA0dGguIChTZWUgZmlndXJlcyA4LjIwIGFuZCA4LjIyIG9mIElTTy9JRUMgMTQ0OTYtMzoyMDAxL0ZEQU0gMjoyMDA0KEUpICkKKyAgKi8KKworCisgIGlmIChoX3BzX2QtPnByb2NGcmFtZUJhc2VkID09IDEpICAgIC8qIElmIHdlIGhhdmUgc3dpdGNoZWQgZnJvbSBmcmFtZSB0byBzbG90IGJhc2VkIHByb2Nlc3NpbmcgICovCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaHlicmlkIGRlbGF5IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IDA7CisKKyAgICBmaWxsSHlicmlkRGVsYXlMaW5lKCBySW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCApOworICB9CisKKyAgc2xvdEJhc2VkSHlicmlkQW5hbHlzaXMgKCBySW50QnVmZmVyTGVmdFtIWUJSSURfRklMVEVSX0RFTEFZXSwgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnRbSFlCUklEX0ZJTFRFUl9ERUxBWV0sIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxMZWZ0LCAgICAgICAgICAgICAgICAgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwgICAgICAgICAgICAgICAgICAgICAgLyogaHlicmlkIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkKTsgICAgICAgICAgLyogaHlicmlkIGZpbHRlcmJhbmsgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICovCisKKworICBTQ0hBUiBoeWJyaWRTY2FsID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLnNmX21RbWZCdWZmZXI7CisKKworICAvKiEKKyAgRGVjb3JyZWxhdGlvbjoKKyAgQnkgbWVhbnMgb2YgYWxsLXBhc3MgZmlsdGVyaW5nIGFuZCBkZWxheWluZywgdGhlIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgc19rKG4pIGFyZQorICBjb252ZXJ0ZWQgaW50byBkZS1jb3JyZWxhdGVkIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgZF9rKG4pLgorICAtIGs6IGZyZXF1ZW5jeSBpbiBoeWJyaWQgc3BlY3RydW0KKyAgLSBuOiB0aW1lIGluZGV4CisgICovCisKKyAgZGVDb3JyZWxhdGVTbG90QmFzZWQoIGhfcHNfZCwgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwgICAgICAvKiBsZWZ0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRTY2FsLCAgICAgIC8qIHNjYWxlIGZhY3RvciBvZiBsZWZ0IGh5YnJpZCB0aW1lIHNsb3QgICovCisgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyTGVmdFswXSwgICAvKiBsZWZ0IHFtZiB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBzZl9JbnRCdWZmZXIsICAgICAgICAvKiBzY2FsZSBmYWN0b3Igb2YgbGVmdCBhbmQgcmlnaHQgcW1mIHRpbWUgc2xvdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbFJpZ2h0LCAgICAgLyogcmlnaHQgaHlicmlkIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJSaWdodCwgICAgIC8qIHJpZ2h0IHFtZiB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyUmlnaHQgKTsKKworCisKKyAgLyohCisgIFN0ZXJlbyBQcm9jZXNzaW5nOgorICBUaGUgc2V0cyBvZiAoc3ViLSlzdWItYmFuZCBzYW1wbGVzIHNfayhuKSBhbmQgZF9rKG4pIGFyZSBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvCisgIHRoZSBzdGVyZW8gY3VlcyB3aGljaCBhcmUgZGVmaW5lZCBwZXIgc3RlcmVvIGJhbmQuCisgICovCisKKworICBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKCBoX3BzX2QsICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbExlZnQsICAgIC8qIGxlZnQgaHlicmlkIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyTGVmdFswXSwgLyogbGVmdCBxbWYgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxSaWdodCwgICAvKiByaWdodCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJSaWdodCwgICAvKiByaWdodCBxbWYgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyUmlnaHQgKTsKKworCisKKworICAvKiEKKyAgSHlicmlkIHN5bnRoZXNpcyBmaWx0ZXJiYW5rOgorICBUaGUgc3RlcmVvIHByb2Nlc3NlZCBoeWJyaWQgc3ViYmFuZCBzaWduYWxzIGxfayhuKSBhbmQgcl9rKG4pIGFyZSBmZWQgaW50byB0aGUgaHlicmlkIHN5bnRoZXNpcworICBmaWx0ZXJiYW5rcyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHRoZSA2NCBjb21wbGV4IHN5bnRoZXNpcyBmaWx0ZXJiYW5rIG9mIHRoZSBTQlIgdG9vbC4gVGhlCisgIGlucHV0IHRvIHRoZSBmaWx0ZXJiYW5rIGFyZSBzbG90cyBvZiA2NCBRTUYgc2FtcGxlcy4gRm9yIGVhY2ggc2xvdCB0aGUgZmlsdGVyYmFuayBvdXRwdXRzIG9uZQorICBibG9jayBvZiA2NCBzYW1wbGVzIG9mIG9uZSByZWNvbnN0cnVjdGVkIHN0ZXJlbyBjaGFubmVsLiBUaGUgaHlicmlkIHN5bnRoZXNpcyBmaWx0ZXJiYW5rIGlzCisgIGNvbXB1dGVkIHNlcGVyYXRseSBmb3IgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwuCisgICovCisKKworICAvKiBsZWZ0IGNoYW5uZWwgKi8KKyAgc2xvdEJhc2VkSHlicmlkU3ludGhlc2lzICggaHlicmlkUmVhbExlZnQsICAgICAgICAgLyogb25lIHRpbWVzbG90IG9mIGh5YnJpZCBmaWx0ZXJiYW5rIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlckxlZnRbMF0sICAgICAgLyogb25lIHRpbWVzbG90IG9mIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkICk7ICAgICAgLyogaHlicmlkIGZpbHRlcmJhbmsgaGFuZGxlICAgICAgICAgICAgICAgICAqLworCisgIC8qIHJpZ2h0IGNoYW5uZWwgKi8KKyAgc2xvdEJhc2VkSHlicmlkU3ludGhlc2lzICggaHlicmlkUmVhbFJpZ2h0LCAgICAgICAgLyogb25lIHRpbWVzbG90IG9mIGh5YnJpZCBmaWx0ZXJiYW5rIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJSaWdodCwgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlclJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQgKTsgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayBoYW5kbGUgICAgICAgICAgICAgICAgICovCisKKworCisKKworCisKKyAgLyogZnJlZSB0ZW1wb3JhcnkgaHlicmlkIHFtZiB2YWx1ZXMgb2Ygb25lIHRpbWVzbG90ICovCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkSW1hZ1JpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkUmVhbFJpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkSW1hZ0xlZnQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChoeWJyaWRSZWFsTGVmdCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOworCit9LyogRU5EIEFwcGx5UHNTbG90ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgYXNzaWducyB0aW1lc2xvdHMgdG8gYW4gYXJyYXkKKworICBccmV0dXJuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFzc2lnblRpbWVTbG90c1BTIChGSVhQX0RCTCAqYnVmQWRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYnVmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1TbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbikKK3sKKyAgRklYUF9EQkwgICpwdHI7CisgIGludCBzbG90OworICBwdHIgPSBidWZBZHI7CisgIGZvcihzbG90PTA7IHNsb3QgPCBudW1TbG90czsgc2xvdCsrKSB7CisgICBidWZQdHIgW3Nsb3RdID0gcHRyOworICAgIHB0ciArPSBudW1DaGFuOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3BzZGVjLmggYi9hYWMvbGliU0JSZGVjL3NyYy9wc2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYmM3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9wc2RlYy5oCkBAIC0wLDAgKzEsMzUyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgU2JyIGRlY29kZXIgIAorKi8KKyNpZm5kZWYgX19QU0RFQ19ICisjZGVmaW5lIF9fUFNERUNfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisKKworLyogVGhpcyBQUyBkZWNvZGVyIGltcGxlbWVudHMgdGhlIGJhc2VsaW5lIHZlcnNpb24uIFNvIGl0IGFsd2F5cyB1c2VzIHRoZSAgICAgKi8KKy8qIGh5YnJpZCBmaWx0ZXIgc3RydWN0dXJlIGZvciAyMCBzdGVyZW8gYmFuZHMgYW5kIGRvZXMgbm90IGltcGxlbWV0IElQRC9PUEQgICovCisvKiBzeW50aGVzaXMuIFRoZSBiYXNlbGluZSB2ZXJzaW9uIGhhcyB0byBzdXBwb3J0IHRoZSBjb21wbGV0ZSBQUyBiaXRzdHJlYW0gICAqLworLyogc3ludGF4LiBCdXQgSVBEL09QRCBkYXRhIGlzIGlnbm9yZWQgYW5kIHNldCB0byAwLiBJZiAzNCBzdGVyZW8gYmFuZCBjb25maWcgKi8KKy8qIGlzIHVzZWQgaW4gdGhlIGJpdHN0cmVhbSBmb3IgSUlTL0lDQyB0aGUgZGVjb2RlZCBwYXJhbWV0ZXJzIGFyZSBtYXBwZWQgdG8gICovCisvKiAyMCBzdGVyZW8gYmFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKyNpbmNsdWRlICJwc2RlY19oeWJyaWQuaCIKKworI2RlZmluZSBTQ0FMX0hFQURST09NICAgICAgICAgICAgICAgICAgICAgKCAyICkKKworI2RlZmluZSBQU19FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgKCA0ICkKKyNkZWZpbmUgUFNfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTICAgICAgICggOCApCisKKyNkZWZpbmUgTk9fUU1GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICggNjQgKQorI2RlZmluZSBNQVhfTlVNX0NPTCAgICAgICAgICAgICAgICAgICAgICAgKCAzMiApCisKKworICAjZGVmaW5lIE5PX1FNRl9CQU5EU19IWUJSSUQyMCAgICAgICAgICAgKCAzICApCisgICNkZWZpbmUgTk9fU1VCX1FNRl9DSEFOTkVMUyAgICAgICAgICAgICAoIDEyICkKKworICAjZGVmaW5lIE5SR19JTlRfQ09FRkYgICAgICAgICAgICAgICAgICAgKCAwLjc1ZiApCisgICNkZWZpbmUgSU5UX0ZJTFRFUl9DT0VGRiAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoIDEuMGYgLSBOUkdfSU5UX0NPRUZGICkpCisgICNkZWZpbmUgUEVBS19ERUNBWV9GQUNUT1IgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoIDAuNzY1OTI4MzM4MzY0NjQ5ZiApKQorICAjZGVmaW5lIFRSQU5TSUVOVF9JTVBBQ1RfRkFDVE9SICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAyLjAgLyAzLjAgKSkKKworICAjZGVmaW5lIE5PX1NFUklBTF9BTExQQVNTX0xJTktTICAgICAgICAgKCAzICkKKyAgI2RlZmluZSBNQVhfTk9fUFNfRU5WICAgICAgICAgICAgICAgICAgICggNCArIDEgKSAgIC8qICsxIG5lZWRlZCBmb3IgVkFSX0JPUkRFUiAqLworCisgICNkZWZpbmUgTUFYX0RFTEFZX0JVRkZFUl9TSVpFICAgICAgICAgICAoIDE0ICkKKyAgI2RlZmluZSBOT19ERUxBWV9CVUZGRVJfQkFORFMgICAgICAgICAgICggMzUgKQorCisgICNkZWZpbmUgTk9fSElfUkVTX0JJTlMgICAgICAgICAgICAgICAgICAoIDM0ICkKKyAgI2RlZmluZSBOT19NSURfUkVTX0JJTlMgICAgICAgICAgICAgICAgICggMjAgKQorICAjZGVmaW5lIE5PX0xPV19SRVNfQklOUyAgICAgICAgICAgICAgICAgKCAxMCApCisKKyAgI2RlZmluZSBGSVJTVF9ERUxBWV9TQiAgICAgICAgICAgICAgICAgICggMjMgKQorICAjZGVmaW5lIE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTICAgICAgICAgKCAyICkKKyAgI2RlZmluZSBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUyAgICAgICAgICggMTIgKSAgICAgLyogZChtKTogZCgwKT0zICsgZCgxKT00ICsgZCgyKT01ICovCisKKyAgI2RlZmluZSBOT19ISV9SRVNfSUlEX0JJTlMgICAgICAgICAgICAgICggTk9fSElfUkVTX0JJTlMgKQorICAjZGVmaW5lIE5PX0hJX1JFU19JQ0NfQklOUyAgICAgICAgICAgICAgKCBOT19ISV9SRVNfQklOUyApCisKKyAgI2RlZmluZSBOT19NSURfUkVTX0lJRF9CSU5TICAgICAgICAgICAgICggTk9fTUlEX1JFU19CSU5TICkKKyAgI2RlZmluZSBOT19NSURfUkVTX0lDQ19CSU5TICAgICAgICAgICAgICggTk9fTUlEX1JFU19CSU5TICkKKworICAjZGVmaW5lIE5PX0xPV19SRVNfSUlEX0JJTlMgICAgICAgICAgICAgKCBOT19MT1dfUkVTX0JJTlMgKQorICAjZGVmaW5lIE5PX0xPV19SRVNfSUNDX0JJTlMgICAgICAgICAgICAgKCBOT19MT1dfUkVTX0JJTlMgKQorCisgICNkZWZpbmUgU1VCUU1GX0dST1VQUyAgICAgICAgICAgICAgICAgICAoIDEwICkKKyAgI2RlZmluZSBRTUZfR1JPVVBTICAgICAgICAgICAgICAgICAgICAgICggMTIgKQorCisgICNkZWZpbmUgU1VCUU1GX0dST1VQU19ISV9SRVMgICAgICAgICAgICAoIDMyICkKKyAgI2RlZmluZSBRTUZfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICAgICggMTggKQorCisgICNkZWZpbmUgTk9fSUlEX0dST1VQUyAgICAgICAgICAgICAgICAgICAoIFNVQlFNRl9HUk9VUFMgKyBRTUZfR1JPVVBTICkKKyAgI2RlZmluZSBOT19JSURfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICggU1VCUU1GX0dST1VQU19ISV9SRVMgKyBRTUZfR1JPVVBTX0hJX1JFUyApCisKKyAgI2RlZmluZSBOT19JSURfU1RFUFMgICAgICAgICAgICAgICAgICAgICggNyApICAvKiAxIC4uICsgNyAqLworICAjZGVmaW5lIE5PX0lJRF9TVEVQU19GSU5FICAgICAgICAgICAgICAgKCAxNSApIC8qIDEgLi4gKzE1ICovCisgICNkZWZpbmUgTk9fSUNDX1NURVBTICAgICAgICAgICAgICAgICAgICAoIDggKSAgLyogMCAuLiArIDcgKi8KKworICAjZGVmaW5lIE5PX0lJRF9MRVZFTFMgICAgICAgICAgICAgICAgICAgKCAyICogTk9fSUlEX1NURVBTICsgMSApICAgICAgLyogLSA3IC4uICArIDcgKi8KKyAgI2RlZmluZSBOT19JSURfTEVWRUxTX0ZJTkUgICAgICAgICAgICAgICggMiAqIE5PX0lJRF9TVEVQU19GSU5FICsgMSApIC8qIC0xNSAuLiAgKzE1ICovCisgICNkZWZpbmUgTk9fSUNDX0xFVkVMUyAgICAgICAgICAgICAgICAgICAoIE5PX0lDQ19TVEVQUyApICAgICAgICAgICAgICAvKiAgIDAgLi4gICsgNyAqLworCisgICNkZWZpbmUgRklYUF9TUVJUMDUgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTB4NWE4Mjc5ODApIC8qIDEvU1FSVDIgKi8KKworICBzdHJ1Y3QgUFNfREVDX0NPRUZGSUNJRU5UUyB7CisKKyAgICBGSVhQX0RCTCBIMTFyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZJWFBfREJMIEgxMnJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgRklYUF9EQkwgSDIxcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGSVhQX0RCTCBIMjJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgRklYUF9EQkwgRGVsdGFIMTFyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGSVhQX0RCTCBEZWx0YUgxMnJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZJWFBfREJMIERlbHRhSDIxcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgRklYUF9EQkwgRGVsdGFIMjJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIFNDSEFSIGFhSWlkSW5kZXhNYXBwZWRbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lJRF9CSU5TXTsgICAgICAgLyohPCBUaGUgbWFwcGVkIElJRCBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQgYWxsIElJRCBiaW5zICovCisgICAgU0NIQVIgYWFJY2NJbmRleE1hcHBlZFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAvKiE8IFRoZSBtYXBwZWQgSUNDIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUNDIGJpbnMgKi8KKworICB9OworCisKKworCit0eXBlZGVmIGVudW0geworICBwcHRfbm9uZSA9IDAsCisgIHBwdF9tcGVnID0gMSwKKyAgcHB0X2RybSAgPSAyCit9IFBTX1BBWUxPQURfVFlQRTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGJQc0hlYWRlclZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBzZXQgaWYgbmV3IGhlYWRlciBpcyBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICovCisKKyAgVUNIQVIgYkVuYWJsZUlpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9uZSBiaXQgZGVub3RpbmcgdGhlIHByZXNlbmNlIG9mIElJRCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgYkVuYWJsZUljYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9uZSBiaXQgZGVub3RpbmcgdGhlIHByZXNlbmNlIG9mIElDQyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgYkVuYWJsZUV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBQUyBleHRlbnNpb24gbGF5ZXIgaXMgZW5hYmxlZCB1c2luZyB0aGUgZW5hYmxlX2V4dCBiaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCBpcyBzZXQgdG8gJTEgdGhlIElQRCBhbmQgT1BEIHBhcmFtZXRlcnMgYXJlIHNlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCBpcyBkaXNhYmxlZCwgaS5lLiAlMCwgdGhlIGV4dGVuc2lvbiBsYXllciBpcyBza2lwcGVkLiAgICovCisKKyAgVUNIQVIgbW9kZUlpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIElJRCBwYXJhbWV0ZXJzIChudW1iZXIgb2YgYmFuZHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGlzYXRpb24gZ3JpZCwgaWlkX3F1YW50KSBpcyBkZXRlcm1pbmVkIGJ5IGlpZF9tb2RlLiAgICAgICovCisgIFVDSEFSIG1vZGVJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY29uZmlndXJhdGlvbiBvZiBJbnRlci1jaGFubmVsIENvaGVyZW5jZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtYmVyIG9mIGJhbmRzIGFuZCBxdWFudGlzYXRpb24gZ3JpZCkgaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX21vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIFVDSEFSIGZyZXFSZXNJaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpaWQgICAgICAgICAgICovCisgIFVDSEFSIGZyZXFSZXNJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpY2MgICAgICAgICAgICovCisKKyAgVUNIQVIgYkZpbmVJaWRROyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVzZSBmaW5lIElpZCBxdWFudGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBVQ0hBUiBiRnJhbWVDbGFzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGZyYW1lX2NsYXNzIGJpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIG9mIHRoZSBjdXJyZW50IGZyYW1lIGFyZSB1bmlmb3JtbHkgc3BhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nyb3NzIHRoZSBmcmFtZSBvciB0aGV5IGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBwb3NpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBieSBib3JkZXJfcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBVQ0hBUiBub0VudjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBhRW52U3RhcnRTdG9wW01BWF9OT19QU19FTlYrMV07ICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW4gY2FzZSBvZiB2YXJpYWJsZSBwYXJhbWV0ZXIgc3BhY2luZyB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMgYXJlIGRldGVybWluZWQgYnkgYm9yZGVyX3Bvc2l0aW9uICAgICAgICAgICAgICAgICAgICovCisKKyAgU0NIQVIgYWJJaWREdEZsYWdbTUFYX05PX1BTX0VOVl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlbHRhY29kaW5nIHRpbWUvZnJlcSBmbGFnIGZvciBJSUQsIDAgPT4gZnJlcSAgICAgICAgICAgKi8KKyAgU0NIQVIgYWJJY2NEdEZsYWdbTUFYX05PX1BTX0VOVl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlbHRhY29kaW5nIHRpbWUvZnJlcSBmbGFnIGZvciBJQ0MsIDAgPT4gZnJlcSAgICAgICAgICAgKi8KKworICBTQ0hBUiBhYUlpZEluZGV4W01BWF9OT19QU19FTlZdW05PX0hJX1JFU19JSURfQklOU107ICAgICAgICAgICAgIC8qITwgVGhlIElJRCBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQgYWxsIElJRCBiaW5zICAgICAgICAqLworICBTQ0hBUiBhYUljY0luZGV4W01BWF9OT19QU19FTlZdW05PX0hJX1JFU19JQ0NfQklOU107ICAgICAgICAgICAgIC8qITwgVGhlIElDQyBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQgYWxsIElDQyBiaW5zICAgICAgICAqLworCit9IE1QRUdfUFNfQlNfREFUQTsKKworCisKK3N0cnVjdCBQU19ERUMgeworCisgIFNDSEFSIG5vU3ViU2FtcGxlczsKKyAgU0NIQVIgbm9DaGFubmVsczsKKworICBTQ0hBUiBwcm9jRnJhbWVCYXNlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSGVscGVyIHRvIGRldGVjdGVkIHN3aXRjaGluZyBmcm9tIGZyYW1lIGJhc2VkIHRvIHNsb3QgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBQU19QQVlMT0FEX1RZUEUgYlBzRGF0YUF2YWlsWygxKSsxXTsgICAvKiE8IHNldCBpZiBuZXcgZGF0YSBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgcHNEZWNvZGVkUHJ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHNldCBpZiBQUyBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gdGhlIGxhc3QgZnJhbWUgICAgICAgICAgICAgICAgKi8KKworICAvKiBoZWxwZXJzIGZvciBmcmFtZSBkZWxheSBsaW5lICovCisgIFVDSEFSIGJzTGFzdFNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBsYXN0IHJlYWQgc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIGJzUmVhZFNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHJlYWQgc2xvdCBmb3IgYWRkaXRpb25hbCBkZWxheS4gICAgICAgICAgICAgICovCisgIFVDSEFSIHByb2Nlc3NTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHNsb3QgZm9yIHByb2Nlc3NpbmcgKG5lZWQgZm9yIGFkZC4gZGVsYXkpLiAgICovCisKKworICBJTlQgIHJlc2NhbDsKKyAgSU5UICBzZl9JbnRCdWZmZXI7CisKKyAgdW5pb24geyAgLyogQml0c3RyZWFtIGRhdGEgKi8KKyAgICBNUEVHX1BTX0JTX0RBVEEgIG1wZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0cnVjdCBjb250YWluaW5nIGFsbCBNUEVHIHNwZWNpZmljIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0uICAgKi8KKyAgfSBic0RhdGFbKDEpKzFdOworCisgIHNob3VsZEJlVW5pb24geyAgLyogU3RhdGljIGRhdGEgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgU0NIQVIgYUlpZFByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JSURfQklOU107ICAgICAgICAgIC8qITwgVGhlIElJRCBpbmRleCBmb3IgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgU0NIQVIgYUljY1ByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JQ0NfQklOU107ICAgICAgICAgIC8qITwgVGhlIElDQyBpbmRleCBmb3IgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICBVQ0hBUiBkZWxheUJ1ZkluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHdoZXJlIHRoZSBsYXRlc3Qgc2FtcGxlIGlzIGluIGJ1ZmZlciAgICAgICAgICovCisgICAgICBVQ0hBUiBub1NhbXBsZURlbGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIb3cgbWFueSBRTUYgc2FtcGxlcyBkZWxheSBpcyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBVQ0hBUiBsYXN0VXNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlcm1vc3QgV01GIGRlbGF5IGJhbmQgb2YgbGFzdCBmcmFtZSAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIFVDSEFSIGFEZWxheVJCdWZJbmRleFNlcltOT19TRVJJQUxfQUxMUEFTU19MSU5LU107ICAgICAgICAgICAgIC8qITwgRGVsYXkgYnVmZmVyIGZvciByZXZlcmIgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFVDSEFSIGFEZWxheUJ1ZkluZGV4RGVsYXlRbWZbTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCXTsgIC8qITwgRGVsYXkgYnVmZmVyIGZvciBJQ0MgZ3JvdXAgMjAgJiAyMSAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgU0NIQVIgc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTY2FsZSBmYWN0b3IgZm9yIHBzIGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAvKiBoeWJyaWQgZmlsdGVyIGJhbmsgZGVsYXkgbGluZXMgKi8KKyAgICAgIEZJWFBfREJMIGFhUW1mRGVsYXlCdWZSZWFsWyhOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpICsgKE1BWF9ERUxBWV9CVUZGRVJfU0laRS0xKSooTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKV07CisgICAgICBGSVhQX0RCTCBhYVFtZkRlbGF5QnVmSW1hZ1soTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSArIChNQVhfREVMQVlfQlVGRkVSX1NJWkUtMSkqKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQildOworCisgICAgICBGSVhQX0RCTCAqcEFhUmVhbERlbGF5QnVmZmVyUW1mW01BWF9ERUxBWV9CVUZGRVJfU0laRV07ICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgKnBBYUltYWdEZWxheUJ1ZmZlclFtZltNQVhfREVMQVlfQlVGRkVSX1NJWkVdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgRklYUF9EQkwgYWFSZWFsRGVsYXlCdWZmZXJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW0ZJUlNUX0RFTEFZX1NCXTsgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLworICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW0ZJUlNUX0RFTEFZX1NCXTsgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIqLworCisgICAgICBGSVhQX0RCTCBhYVJlYWxEZWxheUJ1ZmZlclN1YlFtZltOT19TQU1QTEVfREVMQVlfQUxMUEFTU11bTk9fU1VCX1FNRl9DSEFOTkVMU107ICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW05PX1NVQl9RTUZfQ0hBTk5FTFNdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgKi8KKworICAgICAgRklYUF9EQkwgYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltGSVJTVF9ERUxBWV9TQl1bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgICAgICAgICAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIGFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbRklSU1RfREVMQVlfU0JdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgICAgICAgICAgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIgICAgICovCisKKyAgICAgIEZJWFBfREJMIGFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICovCisgICAgICBGSVhQX0RCTCBhYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLworCisgICAgICBIWUJSSUQgaHlicmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoeWJyaWQgZmlsdGVyIGJhbmsgc3RydWN0IDEgb3IgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIEZJWFBfREJMIGFQcmV2TnJnQmluW05PX01JRF9SRVNfQklOU107ICAgICAgICAgICAgICAvKiE8IGVuZXJneSBvZiBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBGSVhQX0RCTCBhUHJldlBlYWtEaWZmQmluW05PX01JRF9SRVNfQklOU107ICAgICAgICAgLyohPCBwZWFrIGRpZmZlcmVuY2Ugb2YgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgYVBlYWtEZWNheUZhc3RCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgIC8qITwgU2F2ZWQgbWF4LiBwZWFrIGRlY2F5IHZhbHVlIHBlciBiaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFNDSEFSIGFQb3dlclByZXZTY2FsW05PX01JRF9SRVNfQklOU107ICAgICAgICAgICAgICAvKiE8IExhc3QgcG93ZXIgdmFsdWUgKGVhY2ggYmluKSBvZiBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIEZJWFBfREJMIGgxMXJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBGSVhQX0RCTCBoMTJyUHJldltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgaDIxclByZXZbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgIC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIGgyMnJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIFBTX0RFQ19DT0VGRklDSUVOVFMgIGNvZWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdGVtcG9yYWwgY29lZmZpY2llbnRzIChyZXVzYWJsZSBzY3JhdGNoIG1lbW9yeSkgICAgICAgICAgICAgICAgICovCisKKyAgICB9IG1wZWc7CisKKyAgfSBzcGVjaWZpY1RvOworCisKK307CisKK3R5cGVkZWYgc3RydWN0IFBTX0RFQyAqSEFORExFX1BTX0RFQzsKKworCitpbnQgQ3JlYXRlUHNEZWMoSEFORExFX1BTX0RFQyAqaF9QU19ERUMsIGludCBhYWNTYW1wbGVzUGVyRnJhbWUpOworCitpbnQgRGVsZXRlUHNEZWMoSEFORExFX1BTX0RFQyAqaF9QU19ERUMpOworCit2b2lkCitzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqZml4cFFtZlJlYWwsICAgICAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mSW1hZywgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3csCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqc2NhbGVGYWN0b3JMb3dCYW5kX2xiLAorICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfaGIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpOworCit2b2lkCityZXNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLCAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpOworCisKK3ZvaWQKK2luaXRTbG90QmFzZWRSb3RhdGlvbiggSEFORExFX1BTX0RFQyBoX3BzX2QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IpOworCit2b2lkCitBcHBseVBzU2xvdCggSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgKi8KKyAgICAgICAgICAgICBGSVhQX0RCTCAqKnJJbnRCdWZmZXJMZWZ0LCAgICAgICAvKiByZWFsIHZhbHVlcyBvZiBsZWZ0IHFtZiB0aW1lc2xvdCAgICAqLworICAgICAgICAgICAgIEZJWFBfREJMICoqaUludEJ1ZmZlckxlZnQsICAgICAgIC8qIGltYWcgdmFsdWVzIG9mIGxlZnQgcW1mIHRpbWVzbG90ICAgICovCisgICAgICAgICAgICAgRklYUF9EQkwgKnJJbnRCdWZmZXJSaWdodCwgICAgICAgLyogcmVhbCB2YWx1ZXMgb2YgcmlnaHQgcW1mIHRpbWVzbG90ICAgKi8KKyAgICAgICAgICAgICBGSVhQX0RCTCAqaUludEJ1ZmZlclJpZ2h0KTsgICAgICAvKiBpbWFnIHZhbHVlcyBvZiByaWdodCBxbWYgdGltZXNsb3QgICAqLworCisKKworI2VuZGlmICAvKiBfX1BTREVDX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3BzZGVjX2h5YnJpZC5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDBlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuY3BwCkBAIC0wLDAgKzEsNjUyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgorCisKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJzYnJfcmFtLmgiCisKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisjaW5jbHVkZSAic2JyX3JvbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEluaXRIeWJyaWRGaWx0ZXJCYW5rCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246ICAgSW5pdCBvbmUgaW5zdGFuY2Ugb2YgSEFORExFX0hZQlJJRCBzdHVjdAorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOiAgICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK1NCUl9FUlJPUgorSW5pdEh5YnJpZEZpbHRlckJhbmsgKCBIQU5ETEVfSFlCUklEIGhzLCAgICAgICAgICAvKiE8IEhhbmRsZSB0byBIWUJSSUQgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBmcmFtZVNpemUsICAgICAgICAgICAvKiE8IEZyYW1lc2l6ZSAoaW4gUW1mIHP6YmJhbmQgc2FtcGxlcykuICovCisgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIG5vQmFuZHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFtZiBiYW5kcyBmb3IgaHlicmlkIGZpbHRlcmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBSZXNvbHV0aW9uICkgLyohPCBSZXNvbHV0aW9uIGluIFFtZiBiYW5kcyAobGVuZ3RoIG5vQmFuZHMpLiAqLworeworICBTQ0hBUiBpOworICBVQ0hBUiBtYXhOb0NoYW5uZWxzID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbm9CYW5kczsgaSsrKSB7CisgICAgaHMtPnBSZXNvbHV0aW9uW2ldID0gcFJlc29sdXRpb25baV07CisgICAgaWYocFJlc29sdXRpb25baV0gPiBtYXhOb0NoYW5uZWxzKQorICAgICAgbWF4Tm9DaGFubmVscyA9IHBSZXNvbHV0aW9uW2ldOworICB9CisKKyAgaHMtPm5RbWZCYW5kcyAgICAgPSBub0JhbmRzOworICBocy0+ZnJhbWVTaXplICAgICA9IGZyYW1lU2l6ZTsKKyAgaHMtPnFtZkJ1ZmZlck1vdmUgPSBIWUJSSURfRklMVEVSX0xFTkdUSCAtIDE7CisKKyAgaHMtPnNmX21RbWZCdWZmZXIgPSAwOworCisgIHJldHVybiBTQlJERUNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZHVhbENoYW5uZWxGaWx0ZXJpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogICBmYXN0IDItY2hhbm5lbCByZWFsLXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KKworIEFyZ3VtZW50czoKKworIFJldHVybjogICAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisyIGNoYW5uZWwgZmlsdGVyCis8cHJlPgorICAgRmlsdGVyIENvZWZzOgorICAgMC4wLAorICAgMC4wMTg5OTQ4NzUyNjA0OSwKKyAgIDAuMCwKKyAgIC0wLjA3MjkzMTM5MTY3NTM4LAorICAgMC4wLAorICAgMC4zMDU5NjYzMDU0NTE2OCwKKyAgIDAuNSwKKyAgIDAuMzA1OTY2MzA1NDUxNjgsCisgICAwLjAsCisgICAtMC4wNzI5MzEzOTE2NzUzOCwKKyAgIDAuMCwKKyAgIDAuMDE4OTk0ODc1MjYwNDksCisgICAwLjAKKworCisgICBGaWx0ZXIgZGVzaWduOgorICAgaFtxLG5dID0gZ1tuXSAqIGNvcygycGkvMiAqIHEgKiAobi02KSApOyAgbiA9IDAuLjEyLCAgcSA9IDAsMTsKKworICAgLT4gIGhbMCxuXSA9IGdbbl0gKiAxOworICAgLT4gIGhbMSxuXSA9IGdbbl0gKiBwb3coLTEsbik7Cis8L3ByZT4KKyovCisKK3N0YXRpYyB2b2lkIHNsb3RCYXNlZER1YWxDaGFubmVsRmlsdGVyaW5nKCBjb25zdCBGSVhQX0RCTCAqcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBRbWZJbWFnLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKm1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICptSHlicmlkSW1hZykKK3sKKworICBGSVhQX0RCTCAgdDEsIHQzLCB0NSwgdDY7CisKKyAgLyogc3ltbWV0cmljIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAvKiAgeW91IGRvbid0IGhhdmUgdG8gc2hpZnQgdGhlIHJlc3VsdCBhZnRlciBmTXVsdCBiZWNhdXNlIG9mIHAyXzEzXzIwIDw9IDAuNSAqLworICB0MSA9IGZNdWx0RGl2MihwMl8xM18yMFsxXSAsICggKHBRbWZSZWFsWzFdID4+IDEpICsgKHBRbWZSZWFsWzExXSA+PiAxKSkpOworICB0MyA9IGZNdWx0RGl2MihwMl8xM18yMFszXSAsICggKHBRbWZSZWFsWzNdID4+IDEpICsgKHBRbWZSZWFsWyA5XSA+PiAxKSkpOworICB0NSA9IGZNdWx0RGl2MihwMl8xM18yMFs1XSAsICggKHBRbWZSZWFsWzVdID4+IDEpICsgKHBRbWZSZWFsWyA3XSA+PiAxKSkpOworICB0NiA9IGZNdWx0RGl2MihwMl8xM18yMFs2XSAsICAgKHBRbWZSZWFsWzZdID4+IDEpICk7CisKKyAgbUh5YnJpZFJlYWxbMF0gPSAodDEgKyB0MyArIHQ1ICsgdDYpIDw8IDI7CisgIG1IeWJyaWRSZWFsWzFdID0gKC0gdDEgLSB0MyAtIHQ1ICsgdDYpIDw8IDI7CisKKyAgdDEgPSBmTXVsdERpdjIocDJfMTNfMjBbMV0gLCAoIChwUW1mSW1hZ1sxXSA+PiAxKSArIChwUW1mSW1hZ1sxMV0gPj4gMSkpKTsKKyAgdDMgPSBmTXVsdERpdjIocDJfMTNfMjBbM10gLCAoIChwUW1mSW1hZ1szXSA+PiAxKSArIChwUW1mSW1hZ1sgOV0gPj4gMSkpKTsKKyAgdDUgPSBmTXVsdERpdjIocDJfMTNfMjBbNV0gLCAoIChwUW1mSW1hZ1s1XSA+PiAxKSArIChwUW1mSW1hZ1sgN10gPj4gMSkpKTsKKyAgdDYgPSBmTXVsdERpdjIocDJfMTNfMjBbNl0gLCAgICBwUW1mSW1hZ1s2XSA+PiAxICk7CisKKyAgbUh5YnJpZEltYWdbMF0gPSAodDEgKyB0MyArIHQ1ICsgdDYpIDw8IDI7CisgIG1IeWJyaWRJbWFnWzFdID0gKC0gdDEgLSB0MyAtIHQ1ICsgdDYpIDw8IDI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBlaWdodENoYW5uZWxGaWx0ZXJpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogICBmYXN0IDgtY2hhbm5lbCBjb21wbGV4LXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KKworIEFyZ3VtZW50czoKKworIFJldHVybjogICAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICAgOCBjaGFubmVsIGZpbHRlcgorCisgICBJbXBsZW1lbnRhdGlvbiB1c2luZyBhIEZGVCBvZiBsZW5ndGggOAorPHByZT4KKyAgIHByb3RvdHlwZSBmaWx0ZXIgY29lZmZpY2llbnRzOgorICAgMC4wMDc0NjA4Mjk0OTgxMiAgIDAuMDIyNzA0MjA5NDk4MjUgICAwLjA0NTQ2ODY1OTMwNDczICAgMC4wNzI2NjExMzkyOTU5MSAgIDAuMDk4ODUxMDg1NzUyNjQgICAwLjExNzkzNzEwNTY3MjE3CisgICAwLjEyNQorICAgMC4xMTc5MzcxMDU2NzIxNyAgIDAuMDk4ODUxMDg1NzUyNjQgICAwLjA3MjY2MTEzOTI5NTkxICAgMC4wNDU0Njg2NTkzMDQ3MyAgIDAuMDIyNzA0MjA5NDk4MjUgICAwLjAwNzQ2MDgyOTQ5ODEyCisKKyAgIEZpbHRlciBkZXNpZ246CisgICBOID0gMTM7IFEgPSA4OworICAgaFtxLG5dICAgICAgID0gZ1tuXSAqIGV4cChqICogMiAqIHBpIC8gUSAqIChxICsgLjUpICogKG4gLSA2KSk7ICBuID0gMC4uKE4tMSksICBxID0gMC4uKFEtMSk7CisKKyAgIFRpbWUgU2lnbmFsOiAgIHhbdF07CisgICBGaWx0ZXIgQmFuayBPdXRwdXQKKyAgIHlbcSx0XSA9IGNvbnYoeFt0XSxoW3EsdF0pID0gY29udihoW3EsdF0seFt0XSkgPSBzdW0oeFtrXSAqIGhbcSwgdCAtIGtdICkgPSBzdW0oaFtxLCBrXSAqIHhbdCAtIGtdICk7IGsgPSAwLi4oTi0xKTsKKworICAgeVtxLHRdID0gICB4W3QgLSAxMl0qaFtxLCAxMl0gICsgIHhbdCAtIDExXSpoW3EsIDExXSAgKyAgeFt0IC0gMTBdKmhbcSwgMTBdICArICB4W3QgLSAgOV0qaFtxLCAgOV0KKyAgICAgICAgICAgKyAgeFt0IC0gIDhdKmhbcSwgIDhdICArICB4W3QgLSAgN10qaFtxLCAgN10KKyAgICAgICAgICAgKyAgeFt0IC0gIDZdKmhbcSwgIDZdCisgICAgICAgICAgICsgIHhbdCAtICA1XSpoW3EsICA1XSAgKyAgeFt0IC0gIDRdKmhbcSwgIDRdCisgICAgICAgICAgICsgIHhbdCAtICAzXSpoW3EsICAzXSAgKyAgeFt0IC0gIDJdKmhbcSwgIDJdICArICB4W3QgLSAgMV0qaFtxLCAgMV0gICsgIHhbdCAtICAwXSpoW3EsICAwXTsKKworICAgaCdbcSwgbl0gPSBoW3EsKE4tMSktbl0gPSBnW25dICogZXhwKGogKiAyICogcGkgLyBRICogKHEgKyAuNSkgKiAoNiAtIG4pKTsgIG4gPSAwLi4oTi0xKSwgIHEgPSAwLi4oUS0xKTsKKworICAgeVtxLHRdID0gICB4W3QgLSAxMl0qaCdbcSwgIDBdICArICB4W3QgLSAxMV0qaCdbcSwgIDFdICArICB4W3QgLSAxMF0qaCdbcSwgIDJdICArICB4W3QgLSAgOV0qaCdbcSwgIDNdCisgICAgICAgICAgICsgIHhbdCAtICA4XSpoJ1txLCAgNF0gICsgIHhbdCAtICA3XSpoJ1txLCAgNV0KKyAgICAgICAgICAgKyAgeFt0IC0gIDZdKmgnW3EsICA2XQorICAgICAgICAgICArICB4W3QgLSAgNV0qaCdbcSwgIDddICArICB4W3QgLSAgNF0qaCdbcSwgIDhdCisgICAgICAgICAgICsgIHhbdCAtICAzXSpoJ1txLCAgOV0gICsgIHhbdCAtICAyXSpoJ1txLCAxMF0gICsgIHhbdCAtICAxXSpoJ1txLCAxMV0gICsgIHhbdCAtICAwXSpoJ1txLCAxMl07CisKKyAgIFRyeSB0byBzcGxpdCBvZmYgRkZUIE1vZHVsYXRpb24gVGVybToKKyAgIEZGVCh4W3RdLCBxKSA9IHN1bSh4W3Qra10qZXhwKC1qKjIqcGkvTiAqcSAqIGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbQorICAgU3RlcCAxOiAgaCdbcSxuXSA9IGdbbl0gKiAoIGV4cChqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSkgKSAqICggZXhwIChqICogMiAqIHBpIC8gOCAqIHEgKiAoNiAtIG4pKSApOworCisgICAgaCdbcSxuXSA9IGdbbl0gKmNbbl0gKiBtW3Esbl07IChzZWUgYWJvdmUpCisgICAgY1tuXSAgICA9IGV4cCggaiAqIDIgKiBwaSAvIDggKiAuNSAqICg2IC0gbikgKTsKKyAgICBtW3Esbl0gID0gZXhwKCBqICogMiAqIHBpIC8gOCAqICBxICogKDYgLSBuKSApOworCisgICAgeVtxLHRdID0geFt0IC0gIDBdKmdbMF0qY1swXSptW3EsMF0gICsgIHhbdCAtICAxXSpnWzFdKmNbIDFdKm1bcSwgMV0gICsgLi4uCisgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICsgIHhbdCAtIDEyXSpnWzJdKmNbMTJdKm1bcSwxMl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICBuICAgICAgICAgICAgICAgICAgIG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4cCgtaioyKnBpKSAgICAgICAgICAgIHwgICBuJyAgICAgICAgICAgICAgICAgICBmZnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAwICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogNikgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikgICAgIHwgICAyICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAwKQorICAgIDEgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiA1KSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKSAgICAgfCAgIDMgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDEpCisgICAgMiAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDQpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDQpICAgICB8ICAgNCAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikKKyAgICAzICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMykgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkgICAgIHwgICA1ICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKQorICAgIDQgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiAyKSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KSAgICAgfCAgIDYgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDQpCisgICAgNSAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDEpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDcpICAgICB8ICAgNyAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkKKyAgICA2ICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAwICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KQorICAgIDcgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDcpCisgICAgOCAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMgorICAgIDkgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMKKyAgICAxMCAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0CisgICAgMTEgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNQorICAgIDEyICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDYKKworCisgICAgbm93IHVzZSBmZnQgbW9kdWxhdGlvbiBjb2VmZmljaWVudHMKKyAgICBtWzZdICA9ICAgICAgID0gZmZ0WzBdCisgICAgbVs3XSAgPSAgICAgICA9IGZmdFsxXQorICAgIG1bOF0gID0gbVsgMF0gPSBmZnRbMl0KKyAgICBtWzldICA9IG1bIDFdID0gZmZ0WzNdCisgICAgbVsxMF0gPSBtWyAyXSA9IGZmdFs0XQorICAgIG1bMTFdID0gbVsgM10gPSBmZnRbNV0KKyAgICBtWzEyXSA9IG1bIDRdID0gZmZ0WzZdCisgICAgICAgICAgICBtWyA1XSA9IGZmdFs3XQorCisgICAgeVtxLHRdID0gKCAgICAgICAgICAgICAgICAgICAgICAgeFt0LSA2XSpnWyA2XSpjWyA2XSApICogZmZ0W3EsMF0gICsKKyAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICB4W3QtIDddKmdbIDddKmNbIDddICkgKiBmZnRbcSwxXSAgKworICAgICAgICAgICAgICggeFt0LSAwXSpnWyAwXSpjWyAwXSArIHhbdC0gOF0qZ1sgOF0qY1sgOF0gKSAqIGZmdFtxLDJdICArCisgICAgICAgICAgICAgKCB4W3QtIDFdKmdbIDFdKmNbIDFdICsgeFt0LSA5XSpnWyA5XSpjWyA5XSApICogZmZ0W3EsM10gICsKKyAgICAgICAgICAgICAoIHhbdC0gMl0qZ1sgMl0qY1sgMl0gKyB4W3QtMTBdKmdbMTBdKmNbMTBdICkgKiBmZnRbcSw0XSAgKworICAgICAgICAgICAgICggeFt0LSAzXSpnWyAzXSpjWyAzXSArIHhbdC0xMV0qZ1sxMV0qY1sxMV0gKSAqIGZmdFtxLDVdICArCisgICAgICAgICAgICAgKCB4W3QtIDRdKmdbIDRdKmNbIDRdICsgeFt0LTEyXSpnWzEyXSpjWzEyXSApICogZmZ0W3EsNl0gICsKKyAgICAgICAgICAgICAoIHhbdC0gNV0qZ1sgNV0qY1sgNV0gICAgICAgICAgICAgICAgICAgICAgICkgKiBmZnRbcSw3XTsKKworICAgIHByZSB0d2lkZGxlIGZhY3RvcnMgY1tuXSA9IGV4cChqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSk7CisgICAgbiAgICAgICAgICAgICAgICBjXSAgICAgICAgICAgfCAgbiAgICAgICAgICAgICAgICBjW25dICAgICAgICAgfCAgbiAgICAgICAgICAgICAgICBjW25dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAwICAgICAgIGV4cCggaiAqIDYgKiBwaSAvIDgpICB8ICAxICAgICAgIGV4cCggaiAqIDUgKiBwaSAvIDgpICB8ICAyICAgICAgIGV4cCggaiAqIDQgKiBwaSAvIDgpCisgICAgMyAgICAgICBleHAoIGogKiAzICogcGkgLyA4KSAgfCAgNCAgICAgICBleHAoIGogKiAyICogcGkgLyA4KSAgfCAgNSAgICAgICBleHAoIGogKiAxICogcGkgLyA4KQorICAgIDYgICAgICAgZXhwKCBqICogMCAqIHBpIC8gOCkgIHwgIDcgICAgICAgZXhwKC1qICogMSAqIHBpIC8gOCkgIHwgIDggICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCkKKyAgICA5ICAgICAgIGV4cCgtaiAqIDMgKiBwaSAvIDgpICB8IDEwICAgICAgIGV4cCgtaiAqIDQgKiBwaSAvIDgpICB8IDExICAgICAgIGV4cCgtaiAqIDUgKiBwaSAvIDgpCisgICAxMiAgICAgICBleHAoLWogKiA2ICogcGkgLyA4KSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPC9wcmU+CisqLworCisvKiBkZWZpbmluZyByb3RhdGlvbiBmYWN0b3JzIGZvciAqQ2hhbm5lbEZpbHRlcmluZyAqLworCisjZGVmaW5lIGNvczBQaSAgICBGTDJGWENPTlNUX0RCTCggMS5mKQorI2RlZmluZSBzaW4wUGkgICAgRkwyRlhDT05TVF9EQkwoIDAuZikKKworI2RlZmluZSBjb3MxUGkgICAgRkwyRlhDT05TVF9EQkwoLTEuZikKKyNkZWZpbmUgc2luMVBpICAgIEZMMkZYQ09OU1RfREJMKCAwLmYpCisKKyNkZWZpbmUgY29zMVBpXzIgIEZMMkZYQ09OU1RfREJMKCAwLmYpCisjZGVmaW5lIHNpbjFQaV8yICBGTDJGWENPTlNUX0RCTCggMS5mKQorCisjZGVmaW5lIGNvczFQaV8zICBGTDJGWENPTlNUX0RCTCggMC41ZikKKyNkZWZpbmUgc2luMVBpXzMgIEZMMkZYQ09OU1RfREJMKCAwLjg2NjAyNTQwMzc4NDQ0ZikKKworI2RlZmluZSBjb3MwUGlfNCAgY29zMFBpCisjZGVmaW5lIGNvczFQaV80ICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZikKKyNkZWZpbmUgY29zMlBpXzQgIGNvczFQaV8yCisjZGVmaW5lIGNvczNQaV80ICAoLWNvczFQaV80KQorI2RlZmluZSBjb3M0UGlfNCAgKC1jb3MwUGlfNCkKKyNkZWZpbmUgY29zNVBpXzQgIGNvczNQaV80CisjZGVmaW5lIGNvczZQaV80ICBjb3MyUGlfNAorCisjZGVmaW5lIHNpbjBQaV80ICBzaW4wUGkKKyNkZWZpbmUgc2luMVBpXzQgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTVmKQorI2RlZmluZSBzaW4yUGlfNCAgc2luMVBpXzIKKyNkZWZpbmUgc2luM1BpXzQgIHNpbjFQaV80CisjZGVmaW5lIHNpbjRQaV80ICBzaW4wUGlfNAorI2RlZmluZSBzaW41UGlfNCAgKC1zaW4zUGlfNCkKKyNkZWZpbmUgc2luNlBpXzQgICgtc2luMlBpXzQpCisKKyNkZWZpbmUgY29zMFBpXzggIGNvczBQaQorI2RlZmluZSBjb3MxUGlfOCAgRkwyRlhDT05TVF9EQkwoMC45MjM4Nzk1MzI1MTEyOWYpCisjZGVmaW5lIGNvczJQaV84ICBjb3MxUGlfNAorI2RlZmluZSBjb3MzUGlfOCAgRkwyRlhDT05TVF9EQkwoMC4zODI2ODM0MzIzNjUwOWYpCisjZGVmaW5lIGNvczRQaV84ICBjb3MyUGlfNAorI2RlZmluZSBjb3M1UGlfOCAgKC1jb3MzUGlfOCkKKyNkZWZpbmUgY29zNlBpXzggICgtY29zMlBpXzgpCisKKyNkZWZpbmUgc2luMFBpXzggIHNpbjBQaQorI2RlZmluZSBzaW4xUGlfOCAgY29zM1BpXzgKKyNkZWZpbmUgc2luMlBpXzggIHNpbjFQaV80CisjZGVmaW5lIHNpbjNQaV84ICBjb3MxUGlfOAorI2RlZmluZSBzaW40UGlfOCAgc2luMlBpXzQKKyNkZWZpbmUgc2luNVBpXzggIHNpbjNQaV84CisjZGVmaW5lIHNpbjZQaV84ICBzaW4xUGlfNAorCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQorICAjZGVmaW5lIEZJWFBfSFlCIEZJWFBfU0dMCisgICNkZWZpbmUgRklYUF9DQVNUIEZYX0RCTDJGWF9TR0wKKyNlbHNlCisgICNkZWZpbmUgRklYUF9IWUIgRklYUF9EQkwKKyAgI2RlZmluZSBGSVhQX0NBU1QKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgRklYUF9IWUIgIGNyWzEzXSA9Cit7CisgICBGSVhQX0NBU1QoY29zNlBpXzgpLCBGSVhQX0NBU1QoY29zNVBpXzgpLCBGSVhQX0NBU1QoY29zNFBpXzgpLAorICAgRklYUF9DQVNUKGNvczNQaV84KSwgRklYUF9DQVNUKGNvczJQaV84KSwgRklYUF9DQVNUKGNvczFQaV84KSwKKyAgIEZJWFBfQ0FTVChjb3MwUGlfOCksCisgICBGSVhQX0NBU1QoY29zMVBpXzgpLCBGSVhQX0NBU1QoY29zMlBpXzgpLCBGSVhQX0NBU1QoY29zM1BpXzgpLAorICAgRklYUF9DQVNUKGNvczRQaV84KSwgRklYUF9DQVNUKGNvczVQaV84KSwgRklYUF9DQVNUKGNvczZQaV84KQorfTsKKworc3RhdGljIGNvbnN0IEZJWFBfSFlCICBjaVsxM10gPQoreworICAgRklYUF9DQVNUKCBzaW42UGlfOCksIEZJWFBfQ0FTVCggc2luNVBpXzgpLCBGSVhQX0NBU1QoIHNpbjRQaV84KSwKKyAgIEZJWFBfQ0FTVCggc2luM1BpXzgpLCBGSVhQX0NBU1QoIHNpbjJQaV84KSwgRklYUF9DQVNUKCBzaW4xUGlfOCksCisgICBGSVhQX0NBU1QoIHNpbjBQaV84KSAsCisgICBGSVhQX0NBU1QoLXNpbjFQaV84KSwgRklYUF9DQVNUKC1zaW4yUGlfOCksIEZJWFBfQ0FTVCgtc2luM1BpXzgpLAorICAgRklYUF9DQVNUKC1zaW40UGlfOCksIEZJWFBfQ0FTVCgtc2luNVBpXzgpLCBGSVhQX0NBU1QoLXNpbjZQaV84KQorfTsKKworc3RhdGljIHZvaWQgc2xvdEJhc2VkRWlnaHRDaGFubmVsRmlsdGVyaW5nKCBjb25zdCBGSVhQX0RCTCAqcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpwUW1mSW1hZywKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnKQoreworCisgIGludCBiaW47CisgIEZJWFBfREJMIF9mZnRbMTI4ICsgQUxJR05NRU5UX0RFRkFVTFQgLSAxXTsKKyAgRklYUF9EQkwgKmZmdCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihfZmZ0KTsKKworI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKKyAgY29uc3QgRklYUF9TR0wgKnAgPSBwOF8xM18yMDsgLyogQkFTRUxJTkVfUFMgKi8KKyNlbHNlCisgIGNvbnN0IEZJWFBfREJMICpwID0gcDhfMTNfMjA7IC8qIEJBU0VMSU5FX1BTICovCisjZW5kaWYKKworICAvKiBwcmUgdHdpZGRlbGluZyAqLworCisgIC8qICAgeCooYSpiICsgYypkKSA9IGZNdWx0RGl2Mih4LCBmTXVsdEFkZERpdjIoZk11bHREaXYyKGEsIGIpLCBjLCBkKSkgKi8KKyAgLyogICB4KihhKmIgLSBjKmQpID0gZk11bHREaXYyKHgsIGZNdWx0U3ViRGl2MihmTXVsdERpdjIoYSwgYiksIGMsIGQpKSAqLworICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKKworICAjZGVmaW5lIFRXSURETEVfMShuXzAsbl8xLG5fMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbbl8wXSwgcFFtZkltYWdbbl8wXSwgY3Jbbl8wXSwgY2lbbl8wXSk7ICBcCisgICAgICAgICBhY2N1MSA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgYWNjdTIgPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbbl8xXSwgcFFtZkltYWdbbl8xXSwgY3Jbbl8xXSwgY2lbbl8xXSk7ICBcCisgICAgICAgICBhY2N1MyA9IGZNdWx0RGl2MihwW25fMV0sIGFjY3UzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgYWNjdTQgPSBmTXVsdERpdjIocFtuXzFdLCBhY2N1NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfUihuXzIpXSA9IGFjY3UxICsgYWNjdTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmZnRbRklYUF9GRlRfSURYX0kobl8yKV0gPSBhY2N1MiArIGFjY3U0OworCisgICNkZWZpbmUgVFdJRERMRV8wKG5fMCxuXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtuXzBdLCBwUW1mSW1hZ1tuXzBdLCBjcltuXzBdLCBjaVtuXzBdKTsgIFwKKyAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfUihuXzEpXSA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmZnRbRklYUF9GRlRfSURYX0kobl8xKV0gPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1Mik7CisKKyAgVFdJRERMRV8wKCA2LCAwKQorICBUV0lERExFXzAoIDcsIDEpCisKKyAgVFdJRERMRV8xKCAwLCA4LCAyKQorICBUV0lERExFXzEoIDEsIDksIDMpCisgIFRXSURETEVfMSggMiwxMCwgNCkKKyAgVFdJRERMRV8xKCAzLDExLCA1KQorICBUV0lERExFXzEoIDQsMTIsIDYpCisKKyAgVFdJRERMRV8wKCA1LCA3KQorCisgIGZmdF84IChmZnQpOworCisgIC8qIHJlc29ydCBmZnQgZGF0YSBpbnRvIG91dHB1dCBhcnJheSovCisgIGZvcihiaW49MDsgYmluPDg7YmluKysgKSB7CisgICAgbUh5YnJpZFJlYWxbYmluXSA9IGZmdFtGSVhQX0ZGVF9JRFhfUihiaW4pXSA8PCA0OworICAgIG1IeWJyaWRJbWFnW2Jpbl0gPSBmZnRbRklYUF9GRlRfSURYX0koYmluKV0gPDwgNDsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZmlsbEh5YnJpZERlbGF5TGluZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiAgIFRoZSBkZWxheSBsaW5lIG9mIHRoZSBoeWJyaWQgZmlsdGVyIGlzIGZpbGxlZCBhbmQgY29waWVkIGZyb20KKyAgICAgICAgICAgICAgICBsZWZ0IHRvIHJpZ2h0LgorCisgUmV0dXJuOiAgICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitmaWxsSHlicmlkRGVsYXlMaW5lKCBGSVhQX0RCTCAqKmZpeHBRbWZSZWFsLCAgICAgICAgICAvKiE8IFFtZiByZWFsIFZhbHVlcyAgICAqLworICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipmaXhwUW1mSW1hZywgICAgICAgICAgLyohPCBRbWYgaW1hZyBWYWx1ZXMgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZExlZnRSWzEyXSwgIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzIGxlZnQgY2hhbm5lbCAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZExlZnRJWzEyXSwgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzIGxlZnQgY2hhbm5lbCAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0UlsxMl0sIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0SVsxMl0sIC8qITwgSHlicmlkIGltYWcgVmFsdWVzIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfRklMVEVSX0RFTEFZOyBpKyspIHsKKyAgICBzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIGZpeHBRbWZSZWFsW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4cFFtZlJlYWxbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwSHlicmlkTGVmdFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwSHlicmlkTGVmdEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSHlicmlkICk7CisgIH0KKworICBGREttZW1jcHkoZml4cEh5YnJpZFJpZ2h0UiwgZml4cEh5YnJpZExlZnRSLCBzaXplb2YoRklYUF9EQkwpKk5PX1NVQl9RTUZfQ0hBTk5FTFMpOworICBGREttZW1jcHkoZml4cEh5YnJpZFJpZ2h0SSwgZml4cEh5YnJpZExlZnRJLCBzaXplb2YoRklYUF9EQkwpKk5PX1NVQl9RTUZfQ0hBTk5FTFMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgc2xvdEJhc2VkSHlicmlkQW5hbHlzaXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogICBUaGUgbG93ZXIgUU1GIHN1YmJhbmRzIGFyZSBmdXJ0aGVyIHNwbGl0IHRvIHByb3ZpZGUgYmV0dGVyCisgICAgICAgICAgICAgICAgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIFBTIHByb2Nlc3NpbmcuCisKKyAgUmV0dXJuOiAgICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3ZvaWQKK3Nsb3RCYXNlZEh5YnJpZEFuYWx5c2lzICggRklYUF9EQkwgKmZpeHBRbWZSZWFsLCAgICAgIC8qITwgUW1mIHJlYWwgVmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpmaXhwUW1mSW1hZywgICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBmaXhwSHlicmlkUmVhbFsxMl0sICAgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGZpeHBIeWJyaWRJbWFnWzEyXSwgICAvKiE8IEh5YnJpZCBpbWFnIFZhbHVlcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCkKK3sKKyAgaW50ICBrLCBiYW5kOworICBIWUJSSURfUkVTIGh5YnJpZFJlczsKKyAgaW50ICBjaE9mZnNldCA9IDA7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBUZW1wUmVhbFNsb3QsIEZJWFBfREJMLCA0KkhZQlJJRF9GSUxURVJfTEVOR1RIKTsKKworICBGSVhQX0RCTCAqcFRlbXBJbWFnU2xvdCA9IHBUZW1wUmVhbFNsb3QgKyBIWUJSSURfRklMVEVSX0xFTkdUSDsKKyAgRklYUF9EQkwgKnBXb3JrUmVhbFNsb3QgPSBwVGVtcEltYWdTbG90ICsgSFlCUklEX0ZJTFRFUl9MRU5HVEg7CisgIEZJWFBfREJMICpwV29ya0ltYWdTbG90ID0gcFdvcmtSZWFsU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOworCisgIC8qIQorICBIeWJyaWQgZmlsdGVyaW5nIGlzIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGhIeWJyaWQtPm5RbWZCYW5kcyBRTUYgYmFuZHMgKDMgd2hlbiAxMCBvciAyMCBzdGVyZW8gYmFuZHMKKyAgYXJlIHVzZWQsIDUgd2hlbiAzNCBzdGVyZW8gYmFuZHMgYXJlIHVzZWQpLiBGb3IgdGhlIHJlbWFpbmluZyBRTUYgYmFuZHMgYSBkZWxheSB3b3VsZCBiZSBuZWNlc3NhcnkuCisgIEJ1dCB0aGVyZSBpcyBubyBuZWVkIHRvIGltcGxlbWVudCBhIGRlbGF5IGJlY2F1c2UgdGhlcmUgaXMgYSBsb29rLWFoZWFkIG9mIEhZQlJJRF9GSUxURVJfREVMQVkgPSA2CisgIFFNRiBzYW1wbGVzIGluIHRoZSBsb3ctYmFuZCBidWZmZXIuCisgICovCisKKyAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgaEh5YnJpZC0+blFtZkJhbmRzOyBiYW5kKyspIHsKKworICAgIC8qICBnZXQgaHlicmlkIHJlc29sdXRpb24gcGVyIHFtZiBiYW5kICAgICAgICAgICAgICAgICovCisgICAgLyogIGluIGNhc2Ugb2YgYmFzZWxpbmUgcHMgMTAvMjAgYmFuZCBzdGVyZW8gbW9kZSA6ICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgIHFtZkJhbmRbMF0gOiA4ICggSFlCUklEXzhfQ1BMWCApICAgICAgICovCisgICAgLyogICAgICAgICAgICAgcW1mQmFuZFsxXSA6IDIgKCBIWUJSSURfMl9SRUFMICkgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICBxbWZCYW5kWzJdIDogMiAoIEhZQlJJRF8yX1JFQUwgKSAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIChzcGxpdCB0aGUgMyBsb3dlciBxbWYgYmFuZCB0byAxMiBoeWJyaWQgYmFuZHMpICAgKi8KKworICAgIGh5YnJpZFJlcyA9IChIWUJSSURfUkVTKWhIeWJyaWQtPnBSZXNvbHV0aW9uW2JhbmRdOworCisgICAgRkRLbWVtY3B5KHBXb3JrUmVhbFNsb3QsIGhIeWJyaWQtPm1RbWZCdWZmZXJSZWFsU2xvdFtiYW5kXSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweShwV29ya0ltYWdTbG90LCBoSHlicmlkLT5tUW1mQnVmZmVySW1hZ1Nsb3RbYmFuZF0sIGhIeWJyaWQtPnFtZkJ1ZmZlck1vdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgIHBXb3JrUmVhbFNsb3RbaEh5YnJpZC0+cW1mQnVmZmVyTW92ZV0gPSBmaXhwUW1mUmVhbFtiYW5kXTsKKyAgICBwV29ya0ltYWdTbG90W2hIeWJyaWQtPnFtZkJ1ZmZlck1vdmVdID0gZml4cFFtZkltYWdbYmFuZF07CisKKyAgICBGREttZW1jcHkoaEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWxTbG90W2JhbmRdLCBwV29ya1JlYWxTbG90ICsgMSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweShoSHlicmlkLT5tUW1mQnVmZmVySW1hZ1Nsb3RbYmFuZF0sIHBXb3JrSW1hZ1Nsb3QgKyAxLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICBpZiAoZml4cFFtZlJlYWwpIHsKKworICAgICAgLyogYWN0dWFsIGZpbHRlcmluZyBvbmx5IGlmIG91dHB1dCBzaWduYWwgcmVxdWVzdGVkICovCisgICAgICBzd2l0Y2goIGh5YnJpZFJlcyApIHsKKworICAgICAgLyogSFlCUklEXzJfUkVBTCAmIEhZQlJJRF84X0NQTFggYXJlIG9ubHkgbmVlZGZ1bCBmb3IgYmFzZWxpbmUgcHMgKi8KKyAgICAgIGNhc2UgSFlCUklEXzJfUkVBTDoKKworICAgICAgICBzbG90QmFzZWREdWFsQ2hhbm5lbEZpbHRlcmluZyggcFdvcmtSZWFsU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFJlYWxTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBJbWFnU2xvdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhZQlJJRF84X0NQTFg6CisKKyAgICAgICAgc2xvdEJhc2VkRWlnaHRDaGFubmVsRmlsdGVyaW5nKCBwV29ya1JlYWxTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBSZWFsU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEltYWdTbG90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CisKKyAgICAgIGZvcihrID0gMDsgayA8IChTQ0hBUiloeWJyaWRSZXM7IGsrKykgeworICAgICAgICBmaXhwSHlicmlkUmVhbCBbY2hPZmZzZXQgKyBrXSA9IHBUZW1wUmVhbFNsb3Rba107CisgICAgICAgIGZpeHBIeWJyaWRJbWFnIFtjaE9mZnNldCArIGtdID0gcFRlbXBJbWFnU2xvdFtrXTsKKyAgICAgIH0KKyAgICAgIGNoT2Zmc2V0ICs9IGh5YnJpZFJlczsKKyAgICB9IC8qIGlmIChtSHlicmlkUmVhbCkgKi8KKyAgfQorCisgIC8qIGdyb3VwIGh5YnJpZCBjaGFubmVscyAzKzQgLT4gMyBhbmQgMis1IC0+IDIgKi8KKyAgZml4cEh5YnJpZFJlYWxbM10gKz0gZml4cEh5YnJpZFJlYWxbNF07CisgIGZpeHBIeWJyaWRJbWFnWzNdICs9IGZpeHBIeWJyaWRJbWFnWzRdOworICBmaXhwSHlicmlkUmVhbFs0XSA9IChGSVhQX0RCTCkwOworICBmaXhwSHlicmlkSW1hZ1s0XSA9IChGSVhQX0RCTCkwOworCisgIGZpeHBIeWJyaWRSZWFsWzJdICs9IGZpeHBIeWJyaWRSZWFsWzVdOworICBmaXhwSHlicmlkSW1hZ1syXSArPSBmaXhwSHlicmlkSW1hZ1s1XTsKKyAgZml4cEh5YnJpZFJlYWxbNV0gPSAoRklYUF9EQkwpMDsKKyAgZml4cEh5YnJpZEltYWdbNV0gPSAoRklYUF9EQkwpMDsKKworICAvKiBmcmVlIG1lbW9yeSBvbiBzY3JhdGNoICovCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocFRlbXBSZWFsU2xvdCwgRklYUF9EQkwsIDQqSFlCUklEX0ZJTFRFUl9MRU5HVEgpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogIFRoZSBjb2VmZmljaWVudHMgb2ZmZXJpbmcgaGlnaGVyIHJlc29sdXRpb24gZm9yIHRoZSBsb3dlciBRTUYKKyAgICAgICAgICAgICAgIGNoYW5uZWwgYXJlIHNpbXBseSBhZGRlZCBwcmlvciB0byB0aGUgc3ludGhlc2lzIHdpdGggdGhlIDU0CisgICAgICAgICAgICAgICBzdWJiYW5kcyBRTUYuCisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46ICAgICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qISA8cHJlPgorICAgICAgbCxyMChuKSAtLS1cCisgICAgICBsLHIxKG4pIC0tLS0gKyAtLVwKKyAgICAgIGwscjIobikgLS0tLyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICArIC0tPiBGMCh3KQorICAgICAgbCxyMyhuKSAtLS1cICAgICAgLworICAgICAgbCxyNChuKSAtLS0tICsgLS0vCisgICAgICBsLHI1KG4pIC0tLS8KKworCisgICAgICBsLHI2KG4pIC0tLVwKKyAgICAgICAgICAgICAgICAgICsgLS0tLS0tLS0tPiBGMSh3KQorICAgICAgbCxyNyhuKSAtLS0vCisKKworICAgICAgbCxyOChuKSAtLS1cCisgICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLT4gRjIodykKKyAgICAgIGwscjkobikgLS0tLworCisgICAgPC9wcmU+CisgICAgICBIeWJyaWQgUU1GIHN5bnRoZXNpcyBmaWx0ZXJiYW5rIGZvciB0aGUgMTAgYW5kIDIwIHN0ZXJlby1iYW5kcyBjb25maWd1cmF0aW9ucy4gVGhlCisgICAgICBjb2VmZmljaWVudHMgb2ZmZXJpbmcgaGlnaGVyIHJlc29sdXRpb24gZm9yIHRoZSBsb3dlciBRTUYgY2hhbm5lbCBhcmUgc2ltcGx5IGFkZGVkCisgICAgICBwcmlvciB0byB0aGUgc3ludGhlc2lzIHdpdGggdGhlIDU0IHN1YmJhbmRzIFFNRi4KKworICAgICAgW3NlZSBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAtIFBhZ2UgNTJdCisqLworCisKK3ZvaWQKK3Nsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcyAoIEZJWFBfREJMICAqZml4cEh5YnJpZFJlYWwsICAvKiE8IEh5YnJpZCByZWFsIFZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwSHlicmlkSW1hZywgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBRbWZSZWFsLCAgICAgLyohPCBRbWYgcmVhbCBWYWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZkltYWcsICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkICkgICAgIC8qITwgSGFuZGxlIHRvIEhZQlJJRCBzdHJ1Y3QuICovCit7CisgIGludCAgaywgYmFuZDsKKworICBIWUJSSURfUkVTIGh5YnJpZFJlczsKKyAgaW50ICBjaE9mZnNldCA9IDA7CisKKyAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgaEh5YnJpZC0+blFtZkJhbmRzOyBiYW5kKyspIHsKKworICAgIEZJWFBfREJMIHFtZlJlYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIEZJWFBfREJMIHFtZkltYWcgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIGh5YnJpZFJlcyA9IChIWUJSSURfUkVTKWhIeWJyaWQtPnBSZXNvbHV0aW9uW2JhbmRdOworCisgICAgZm9yKGsgPSAwOyBrIDwgKFNDSEFSKWh5YnJpZFJlczsgaysrKSB7CisgICAgICBxbWZSZWFsICs9IGZpeHBIeWJyaWRSZWFsW2NoT2Zmc2V0ICsga107CisgICAgICBxbWZJbWFnICs9IGZpeHBIeWJyaWRJbWFnW2NoT2Zmc2V0ICsga107CisgICAgfQorCisgICAgZml4cFFtZlJlYWxbYmFuZF0gPSBxbWZSZWFsOworICAgIGZpeHBRbWZJbWFnW2JhbmRdID0gcW1mSW1hZzsKKworICAgIGNoT2Zmc2V0ICs9IGh5YnJpZFJlczsKKyAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvcHNkZWNfaHlicmlkLmggYi9hYWMvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y5ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvcHNkZWNfaHlicmlkLmgKQEAgLTAsMCArMSwxNjUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9fSFlCUklEX0gKKyNkZWZpbmUgX19IWUJSSURfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisKKyNkZWZpbmUgSFlCUklEX0ZJTFRFUl9MRU5HVEggIDEzCisjZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgICAgNgorCisKKyNkZWZpbmUgRkFTVF9GSUxURVIyCisjZGVmaW5lIEZBU1RfRklMVEVSNAorI2RlZmluZSBGQVNUX0ZJTFRFUjgKKyNkZWZpbmUgRkFTVF9GSUxURVIxMgorCisjZGVmaW5lIEZGVF9JRFhfUihhKSAgKDIqYSkKKyNkZWZpbmUgRkZUX0lEWF9JKGEpICAoMiphKzEpCisKKyNkZWZpbmUgRklYUF9GRlRfSURYX1IoYSkgICAoYTw8MSkKKyNkZWZpbmUgRklYUF9GRlRfSURYX0koYSkgICgoYTw8MSkgKyAxKQorCisKK3R5cGVkZWYgZW51bSB7CisKKyAgSFlCUklEXzJfUkVBTCAgICAgPSAyLAorICBIWUJSSURfNF9DUExYICAgICA9IDQsCisgIEhZQlJJRF84X0NQTFggICAgID0gOCwKKyAgSFlCUklEXzEyX0NQTFggICAgPSAxMgorCit9IEhZQlJJRF9SRVM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFNDSEFSICAgblFtZkJhbmRzOworICBTQ0hBUiAgIGZyYW1lU2l6ZTsKKyAgU0NIQVIgICBxbWZCdWZmZXJNb3ZlOworCisgIFVDSEFSICAgcFJlc29sdXRpb25bM107CisKKyAgRklYUF9EQkwgbVFtZkJ1ZmZlclJlYWxTbG90WzNdW0hZQlJJRF9GSUxURVJfTEVOR1RIXTsgICAvKio8IFN0b3JlcyBvbGQgUW1mIHNhbXBsZXMuICovCisgIEZJWFBfREJMIG1RbWZCdWZmZXJJbWFnU2xvdFszXVtIWUJSSURfRklMVEVSX0xFTkdUSF07CisgIFNDSEFSIHNmX21RbWZCdWZmZXI7CisKK30gSFlCUklEOworCit0eXBlZGVmIEhZQlJJRCAqSEFORExFX0hZQlJJRDsKKwordm9pZAorZmlsbEh5YnJpZERlbGF5TGluZSggRklYUF9EQkwgKipmaXhwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqZml4cFFtZkltYWcsCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRMZWZ0UlsxMl0sCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRMZWZ0SVsxMl0sCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRSaWdodFJbMTJdLAorICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRJWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApOworCit2b2lkCitzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIEZJWFBfREJMICpmaXhwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmZpeHBRbWZJbWFnLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cEh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cEh5YnJpZEltYWcsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkKTsKKworCit2b2lkCitzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBGSVhQX0RCTCAgKmZpeHBIeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwSHlicmlkSW1hZywKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZkltYWcsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApOworCitTQlJfRVJST1IgSW5pdEh5YnJpZEZpbHRlckJhbmsgKCBIQU5ETEVfSFlCUklEICBoSHlicmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgbm9CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwUmVzb2x1dGlvbiApOworCisKKyNlbmRpZiAvKiBfX0hZQlJJRF9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9jcmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTVmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmNwcApAQCAtMCwwICsxLDE4MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIENSQyBjaGVjayBjb3V0aW5lcyAgCisqLworCisjaW5jbHVkZSAic2JyX2NyYy5oIgorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInRyYW5zY2VuZGVudC5oIgorCisjZGVmaW5lIE1BWENSQ1NURVAgICAgMTYKKyNkZWZpbmUgTUFYQ1JDU1RFUF9MRCAgNAorCisvKiEKKyAgXGJyaWVmICAgICBjcmMgY2FsY3VsYXRpb24KKyovCitzdGF0aWMgVUxPTkcKK2NhbGNDUkMgKEhBTkRMRV9DUkMgaENyY0J1ZiwgVUxPTkcgYlZhbHVlLCBpbnQgbkJpdHMpCit7CisgIGludCBpOworICBVTE9ORyBiTWFzayA9ICgxVUwgPDwgKG5CaXRzIC0gMSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBuQml0czsgaSsrLCBiTWFzayA+Pj0gMSkgeworICAgIFVTSE9SVCBmbGFnID0gKGhDcmNCdWYtPmNyY1N0YXRlICYgaENyY0J1Zi0+Y3JjTWFzaykgPyAxIDogMDsKKyAgICBVU0hPUlQgZmxhZzEgPSAoYk1hc2sgJiBiVmFsdWUpID8gMSA6IDA7CisKKyAgICBmbGFnIF49IGZsYWcxOworICAgIGhDcmNCdWYtPmNyY1N0YXRlIDw8PSAxOworICAgIGlmIChmbGFnKQorICAgICAgaENyY0J1Zi0+Y3JjU3RhdGUgXj0gaENyY0J1Zi0+Y3JjUG9seTsKKyAgfQorCisgIHJldHVybiAoaENyY0J1Zi0+Y3JjU3RhdGUpOworfQorCisKKy8qIQorICBcYnJpZWYgICAgIGNyYworKi8KK3N0YXRpYyBpbnQKK2dldENyYyAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBVTE9ORyBOckJpdHMpCit7CisgIGludCBpOworICBDUkNfQlVGRkVSIENyY0J1ZjsKKworICBDcmNCdWYuY3JjU3RhdGUgPSBTQlJfQ1JDX1NUQVJUOworICBDcmNCdWYuY3JjUG9seSAgPSBTQlJfQ1JDX1BPTFk7CisgIENyY0J1Zi5jcmNNYXNrICA9IFNCUl9DUkNfTUFTSzsKKworICBpbnQgQ3JjU3RlcCA9IE5yQml0cz4+TUFYQ1JDU1RFUF9MRDsKKworICBpbnQgQ3JjTnJCaXRzUmVzdCA9IChOckJpdHMgLSBDcmNTdGVwICogTUFYQ1JDU1RFUCk7CisgIFVMT05HIGJWYWx1ZTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ3JjU3RlcDsgaSsrKSB7CisgICAgYlZhbHVlID0gRkRLcmVhZEJpdHMgKGhCcywgTUFYQ1JDU1RFUCk7CisgICAgY2FsY0NSQyAoJkNyY0J1ZiwgYlZhbHVlLCBNQVhDUkNTVEVQKTsKKyAgfQorCisgIGJWYWx1ZSA9IEZES3JlYWRCaXRzIChoQnMsIENyY05yQml0c1Jlc3QpOworICBjYWxjQ1JDICgmQ3JjQnVmLCBiVmFsdWUsIENyY05yQml0c1Jlc3QpOworCisgIHJldHVybiAoQ3JjQnVmLmNyY1N0YXRlICYgU0JSX0NSQ19SQU5HRSk7CisKK30KKworCisvKiEKKyAgXGJyaWVmICAgY3JjIGludGVyZmFjZQorICBccmV0dXJuICAxOiBDUkMgT0ssIDA6IENSQyBjaGVjayBmYWlsdXJlCisqLworaW50CitTYnJDcmNDaGVjayAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAvKiE8IGhhbmRsZSB0byBiaXQtYnVmZmVyICAqLworICAgICAgICAgICAgIExPTkcgTnJCaXRzKSAgICAgICAgICAgICAgLyohPCBtYXguIENSQyBsZW5ndGggICAgICAgKi8KK3sKKyAgaW50IGNyY1Jlc3VsdCA9IDE7CisgIFVMT05HIE5yQ3JjQml0czsKKyAgVUxPTkcgY3JjQ2hlY2tSZXN1bHQ7CisgIExPTkcgTnJCaXRzQXZhaWxhYmxlOworICBVTE9ORyBjcmNDaGVja1N1bTsKKworICBjcmNDaGVja1N1bSA9IEZES3JlYWRCaXRzIChoQnMsIDEwKTsKKworICBOckJpdHNBdmFpbGFibGUgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgaWYgKE5yQml0c0F2YWlsYWJsZSA8PSAwKXsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE5yQ3JjQml0cyA9IGZpeE1pbiAoKElOVClOckJpdHMsIChJTlQpTnJCaXRzQXZhaWxhYmxlKTsKKworICBjcmNDaGVja1Jlc3VsdCA9IGdldENyYyAoaEJzLCBOckNyY0JpdHMpOworICBGREtwdXNoQmFjayhoQnMsIChOckJpdHNBdmFpbGFibGUgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSkgKTsKKworCisgIGlmIChjcmNDaGVja1Jlc3VsdCAhPSBjcmNDaGVja1N1bSkgeworICAgIGNyY1Jlc3VsdCA9IDA7CisgIH0KKworICByZXR1cm4gKGNyY1Jlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmggYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiODMyOQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9jcmMuaApAQCAtMCwwICsxLDEyMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIENSQyBjaGVja2luZyByb3V0aW5lcyAgCisqLworI2lmbmRlZiBfX1NCUl9DUkNfSAorI2RlZmluZSBfX1NCUl9DUkNfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisvKiBzb21lIHVzZWZ1bCBjcmMgcG9seW5vbXM6CisKK2NyYzU6IHheNSt4XjQreF4yK3heMSsxCitjcmM2OiB4XjYreF41K3heMyt4XjIreCsxCitjcmM3OiB4XjcreF42K3heMisxCitjcmM4OiB4XjgreF4yK3greCsxCisqLworCisvKiBkZWZhdWx0IFNCUiBDUkMgKi8gIC8qIEcoeCkgPSB4XjEwICsgeF45ICsgeF41ICsgeF40ICsgeCArIDEgKi8KKyNkZWZpbmUgU0JSX0NSQ19QT0xZICAgICAgICAgICAgICAgICAgMHgwMjMzCisjZGVmaW5lIFNCUl9DUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBTQlJfQ1JDX1NUQVJUICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0JSX0NSQ19SQU5HRSAgICAgICAgICAgICAgICAgMHgwM0ZGCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVTSE9SVCBjcmNTdGF0ZTsKKyAgVVNIT1JUIGNyY01hc2s7CisgIFVTSE9SVCBjcmNQb2x5OworfQorQ1JDX0JVRkZFUjsKKwordHlwZWRlZiBDUkNfQlVGRkVSICpIQU5ETEVfQ1JDOworCitpbnQgU2JyQ3JjQ2hlY2sgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgIExPTkcgICAgICAgICAgICAgICAgIE5yQ3JjQml0cyk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9zYnJfZGViLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9kZWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWZmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJfZGViLmNwcApAQCAtMCwwICsxLDkwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgUHJpbnQgc2VsZWN0ZWQgZGVidWcgbWVzc2FnZXMgICAKKyovCisKKyNpbmNsdWRlICJzYnJfZGViLmgiCisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaCBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk1NGJhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5oCkBAIC0wLDAgKzEsOTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBEZWJ1Z2dpbmcgYWlkcyAgIAorKi8KKworI2lmbmRlZiBfX1NCUl9ERUJfSAorI2RlZmluZSBfX1NCUl9ERUJfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwCkBAIC0wLDAgKzEsMTA1MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFNiciBkZWNvZGVyICAKKyAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBkZWNvZGVyIGltcGxlbWVudGF0aW9uLiBUaGUgU0JSIGRhdGEgKHNpZGUgaW5mb3JtYXRpb24pIGlzIGFscmVhZHkKKyAgZGVjb2RlZC4gT25seSB0aHJlZSBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgorCisgIFxsaSAxLikgY3JlYXRlU2JyRGVjKCk6IE9uZSB0aW1lIGluaXRpYWxpemF0aW9uCisgIFxsaSAyLikgcmVzZXRTYnJEZWMoKTogQ2FsbGVkIGJ5IHNicl9BcHBseSgpIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhbiBTQlJfSEVBREVSX0VMRU1FTlQgcmVxdWlyZXMgYSByZXNldAorICBhbmQgcmVjYWxjdWxhdGlvbiBvZiBpbXBvcnRhbnQgU0JSIHN0cnVjdHVyZXMuCisgIFxsaSAzLikgc2JyX2RlYygpOiBUaGUgYWN0dWFsIGRlY29kZXIuIENhbGxzIHRoZSBkaWZmZXJlbnQgdG9vbHMgc3VjaCBhcyBmaWx0ZXJiYW5rcywgbHBwVHJhbnNwb3NlcigpLCBhbmQgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQorICBbdGhlIGVudmVsb3BlIGFkanVzdGVyXS4KKworICBcc2Egc2JyX2RlYygpLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworKi8KKworI2luY2x1ZGUgInNicl9kZWMuaCIKKworI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJlbnZfZXh0ci5oIgorI2luY2x1ZGUgImVudl9jYWxjLmgiCisjaW5jbHVkZSAic2NhbGUuaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCisKKworCitzdGF0aWMgdm9pZCBhc3NpZ25MY1RpbWVTbG90cyggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKipRbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMgKQoreworICBpbnQgc2xvdCwgaTsKKyAgRklYUF9EQkwgICpwdHI7CisKKyAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLworICBwdHIgPSBoU2JyRGVjLT5wU2JyT3ZlcmxhcEJ1ZmZlcjsKKyAgZm9yKHNsb3Q9MDsgc2xvdDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IHNsb3QrKykgeworICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICB9CisKKyAgLyogQXNzaWduIHRpbWVzbG90cyB0byBXb3JrYnVmZmVyMSAqLworICBwdHIgPSBoU2JyRGVjLT5Xb3JrQnVmZmVyMTsKKyAgZm9yKGk9MDsgaTxub0NvbHM7IGkrKykgeworICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICAgIHNsb3QrKzsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGFzc2lnbkhxVGltZVNsb3RzKCBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKlFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqUW1mQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzICkKK3sKKyAgRklYUF9EQkwgICpwdHI7CisgIGludCBzbG90OworCisgIC8qIE51bWJlciBvZiBRTUYgdGltZXNsb3RzIGluIG9uZSBoYWxmIG9mIGEgZnJhbWUgKHNpemUgb2YgV29ya2J1ZmZlcjEgb3IgMik6ICovCisgIGludCBoYWxmbGVuID0gKG5vQ29scyA+PiAxKSArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKKyAgaW50IHRvdENvbHMgPSBub0NvbHMgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7CisKKyAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLworICBwdHIgPSBoU2JyRGVjLT5wU2JyT3ZlcmxhcEJ1ZmZlcjsKKyAgZm9yKHNsb3Q9MDsgc2xvdDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IHNsb3QrKykgeworICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICAgIFFtZkJ1ZmZlckltYWdbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICB9CisKKyAgLyogQXNzaWduIGZpcnN0IGhhbGYgb2YgdGltZXNsb3RzIHRvIFdvcmtidWZmZXIxICovCisgIHB0ciA9IGhTYnJEZWMtPldvcmtCdWZmZXIxOworICBmb3IoOyBzbG90PGhhbGZsZW47IHNsb3QrKykgeworICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICAgIFFtZkJ1ZmZlckltYWdbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICB9CisKKyAgLyogQXNzaWduIHNlY29uZCBoYWxmIG9mIHRpbWVzbG90cyB0byBXb3JrYnVmZmVyMiAqLworICBwdHIgPSBoU2JyRGVjLT5Xb3JrQnVmZmVyMjsKKyAgZm9yKDsgc2xvdDx0b3RDb2xzOyBzbG90KyspIHsKKyAgICBRbWZCdWZmZXJSZWFsW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKKyAgICBRbWZCdWZmZXJJbWFnW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIGFzc2lnblRpbWVTbG90cyggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZUxQICkKK3sKKyAvKiBhc3NpZ24gcW1mIHRpbWUgc2xvdHMgKi8KKyAgaFNickRlYy0+dXNlTFAgPSB1c2VMUDsKKyAgaWYgKHVzZUxQKSB7CisgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLmZsYWdzIHw9IFFNRl9GTEFHX0xQOworICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFncyB8PSBRTUZfRkxBR19MUDsKKyAgfSBlbHNlIHsKKyAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYuZmxhZ3MgJj0gflFNRl9GTEFHX0xQOworICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFncyAmPSB+UU1GX0ZMQUdfTFA7CisgIH0KKyAgaWYgKCF1c2VMUCkKKyAgICBhc3NpZ25IcVRpbWVTbG90cyggaFNickRlYywgaFNickRlYy0+UW1mQnVmZmVyUmVhbCwgaFNickRlYy0+UW1mQnVmZmVySW1hZywgbm9Db2xzICk7CisgIGVsc2UKKyAgeworICAgIGFzc2lnbkxjVGltZVNsb3RzKCBoU2JyRGVjLCBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsLCBub0NvbHMgKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VRbWZUeXBlKCBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZUxkVGltZUFsaWduICkKK3sKKyAgVUlOVCBzeW5RbWZGbGFncyA9IGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5mbGFnczsKKyAgVUlOVCBhbmFRbWZGbGFncyA9IGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFnczsKKyAgaW50ICByZXNldFN5blFtZiA9IDA7CisgIGludCAgcmVzZXRBbmFRbWYgPSAwOworCisgIC8qIGFzc2lnbiBxbWYgdHlwZSAqLworICBpZiAodXNlTGRUaW1lQWxpZ24pIHsKKyAgICBpZiAoc3luUW1mRmxhZ3MgJiBRTUZfRkxBR19DTERGQikgeworICAgICAgLyogY2hhbmdlIHRoZSB0eXBlIHRvIE1QU0xEICovCisgICAgICBzeW5RbWZGbGFncyAmPSB+UU1GX0ZMQUdfQ0xERkI7CisgICAgICBzeW5RbWZGbGFncyB8PSAgUU1GX0ZMQUdfTVBTTERGQjsKKyAgICAgIHJlc2V0U3luUW1mID0gMTsKKyAgICB9CisgICAgaWYgKGFuYVFtZkZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpIHsKKyAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBNUFNMRCAqLworICAgICAgYW5hUW1mRmxhZ3MgJj0gflFNRl9GTEFHX0NMREZCOworICAgICAgYW5hUW1mRmxhZ3MgfD0gIFFNRl9GTEFHX01QU0xERkI7CisgICAgICByZXNldEFuYVFtZiA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzeW5RbWZGbGFncyAmIFFNRl9GTEFHX01QU0xERkIpIHsKKyAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBDTERGQiAqLworICAgICAgc3luUW1mRmxhZ3MgJj0gflFNRl9GTEFHX01QU0xERkI7CisgICAgICBzeW5RbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7CisgICAgICByZXNldFN5blFtZiA9IDE7CisgICAgfQorICAgIGlmIChhbmFRbWZGbGFncyAmIFFNRl9GTEFHX01QU0xERkIpIHsKKyAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBDTERGQiAqLworICAgICAgYW5hUW1mRmxhZ3MgJj0gflFNRl9GTEFHX01QU0xERkI7CisgICAgICBhbmFRbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7CisgICAgICByZXNldEFuYVFtZiA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKHJlc2V0QW5hUW1mKSB7CisgICAgaW50IHFtZkVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsgKAorICAgICAgICAgICAmaFNickRlYy0+QW5hbHlzaXNjUU1GLAorICAgICAgICAgICAgaFNickRlYy0+YW5hUW1mU3RhdGVzLAorICAgICAgICAgICAgaFNickRlYy0+QW5hbHlzaXNjUU1GLm5vX2NvbCwKKyAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IsCisgICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYudXNiLAorICAgICAgICAgICAgaFNickRlYy0+QW5hbHlzaXNjUU1GLm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgYW5hUW1mRmxhZ3MgfCBRTUZfRkxBR19LRUVQX1NUQVRFUworICAgICAgICAgICAgKTsKKyAgICBpZiAocW1mRXJyICE9IDApIHsKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQorICB9CisKKyAgaWYgKHJlc2V0U3luUW1mKSB7CisgICAgaW50IHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rICgKKyAgICAgICAgICAgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwKKyAgICAgICAgICAgIGhTYnJEZWMtPnBTeW5RbWZTdGF0ZXMsCisgICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY29sLAorICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLmxzYiwKKyAgICAgICAgICAgIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi51c2IsCisgICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY2hhbm5lbHMsCisgICAgICAgICAgICBzeW5RbWZGbGFncyB8IFFNRl9GTEFHX0tFRVBfU1RBVEVTCisgICAgICAgICAgICApOworCisgICAgaWYgKHFtZkVyciAhPSAwKSB7CisgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgfQorfQorCisKKy8qIQorICBcYnJpZWYgICAgICBTQlIgZGVjb2RlciBjb3JlIGZ1bmN0aW9uIGZvciBvbmUgY2hhbm5lbAorCisgIFxpbWFnZSBodG1sICBCdWZmZXJNZ210RGV0YWlsZWQtMTYzMi5wbmcKKworICBCZXNpZGVzIHRoZSBmaWx0ZXIgc3RhdGVzIG9mIHRoZSBRTUYgZmlsdGVyIGJhbmsgYW5kIHRoZSBMUEMtc3RhdGVzIG9mCisgIHRoZSBMUFAtVHJhbnNwb3NlciwgcHJvY2Vzc2luZyBpcyBtYWlubHkgYmFzZWQgb24gZm91ciBidWZmZXJzOgorICAjdGltZUluLCAjdGltZU91dCwgI1dvcmtCdWZmZXIyIGFuZCAjT3ZlcmxhcEJ1ZmZlci4gVGhlICNXb3JrQnVmZmVyMgorICBpcyByZXVzZWQgZm9yIGFsbCBjaGFubmVscyBhbmQgbWlnaHQgYmUgdXNlZCBieSB0aGUgY29yZSBkZWNvZGVyLCBhCisgIHN0YXRpYyBvdmVybGFwIGJ1ZmZlciBpcyByZXF1aXJlZCBmb3IgZWFjaCBjaGFubmVsLiBEdSB0byBpbi1wbGFjZQorICBwcm9jZXNzaW5nLCAjdGltZUluIGFuZCAjdGltZU91dCBwb2ludCB0byBpZGVudGljYWwgbG9jYXRpb25zLgorCisgIFRoZSBzcGVjdHJhbCBkYXRhIGlzIG9yZ2FuaXplZCBpbiBzby1jYWxsZWQgc2xvdHMsIGVhY2ggc2xvdAorICBjb250YWluaW5nIDY0IGJhbmRzIG9mIGNvbXBsZXggZGF0YS4gVGhlIG51bWJlciBvZiBzbG90cyBwZXIgZnJhbWUgaXMKKyAgZGVwZW5kZW5kIG9uIHRoZSBmcmFtZSBzaXplLiBGb3IgbXAzUFJPLCB0aGVyZSBhcmUgMTggc2xvdHMgcGVyIGZyYW1lCisgIGFuZCA2IHNsb3RzIHBlciAjT3ZlcmxhcEJ1ZmZlci4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBoYXZlIHRoZSBzbG90cworICBpbiBsb2NhdGVkIGNvbnNlY3V0aXZlIGFkZHJlc3MgcmFuZ2VzLgorCisgIFRvIG9wdGltaXplIG1lbW9yeSB1c2FnZSBhbmQgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBtZW1vcnkKKyAgYWNjZXNzZXMsIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBvcmdhbml6ZWQgYXMgZm9sbG93cyAoU2xvdCBudW1iZXJzCisgIGJhc2VkIG9uIG1wM1BSTyk6CisKKyAgMS4pIElucHV0IHRpbWUgZG9tYWluIHNpZ25hbCBpcyBsb2NhdGVkIGluICN0aW1lSW4sIHRoZSBsYXN0IHNsb3RzCisgICgwLi41KSBvZiB0aGUgc3BlY3RyYWwgZGF0YSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgYXJlIGxvY2F0ZWQgaW4gdGhlCisgICNPdmVybGFwQnVmZmVyLiBJbiBhZGRpdGlvbiwgI2ZyYW1lRGF0YSBvZiB0aGUgY3VycmVudCBmcmFtZSByZXNpZGVzCisgIGluIHRoZSB1cHBlciBwYXJ0IG9mICN0aW1lSW4uCisKKyAgMi4pIER1cmluZyB0aGUgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCksIDMyIHNhbXBsZXMgZnJvbSAjdGltZUluIGFyZSB0cmFuc2Zvcm1lZAorICBpbnRvIGEgc2xvdCBvZiB1cCB0byAzMiBjb21wbGV4IHNwZWN0cmFsIGxvdyBiYW5kIHZhbHVlcyBhdCBhCisgIHRpbWUuIFRoZSBmaXJzdCBzcGVjdHJhbCBzbG90IC0tIG5yLiA2IC0tIGlzIHdyaXR0ZW4gYXQgc2xvdCBudW1iZXIKKyAgemVybyBvZiAjV29ya0J1ZmZlcjIuICNXb3JrQnVmZmVyMiB3aWxsIGJlIGNvbXBsZXRlbHkgZmlsbGVkIHdpdGgKKyAgc3BlY3RyYWwgZGF0YS4KKworICAzLikgTFBQLVRyYW5zcG9zaXRpb24gaW4gbHBwVHJhbnNwb3NlcigpIGlzIHByb2Nlc3NlZCBvbiAyNCBzbG90cy4gRHVyaW5nIHRoZQorICB0cmFuc3Bvc2l0aW9uLCB0aGUgaGlnaCBiYW5kIHBhcnQgb2YgdGhlIHNwZWN0cmFsIGRhdGEgaXMgcmVwbGljYXRlZAorICBiYXNlZCBvbiB0aGUgbG93IGJhbmQgZGF0YS4KKworICBFbnZlbG9wZSBBZGp1c3RtZW50IGlzIHByb2Nlc3NlZCBvbiB0aGUgaGlnaCBiYW5kIHBhcnQgb2YgdGhlIHNwZWN0cmFsCisgIGRhdGEgb25seSBieSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLgorCisgIDQuKSBUaGUgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpIGNyZWF0ZXMgNjQgdGltZSBkb21haW4gc2FtcGxlcyBvdXQKKyAgb2YgYSBzbG90IG9mIDY0IGNvbXBsZXggc3BlY3RyYWwgdmFsdWVzIGF0IGEgdGltZS4gVGhlIGZpcnN0IDYgc2xvdHMKKyAgaW4gI3RpbWVPdXQgYXJlIGZpbGxlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHNwZWN0cmFsIHNsb3RzIDAuLjUgaW4gdGhlCisgICNPdmVybGFwQnVmZmVyLiBUaGUgY29uc2VjdXRpdmUgc2xvdHMgaW4gdGltZU91dCBhcmUgbm93IGZpbGxlZCB3aXRoCisgIHRoZSByZXN1bHRzIG9mIHNwZWN0cmFsIHNsb3RzIDYuLjE3LgorCisgIDUuKSBUaGUgcHJlcHJvY2Vzc2VkIHNsb3RzIDE4Li4yMyBoYXZlIHRvIGJlIHN0b3JlZCBpbiB0aGUKKyAgI092ZXJsYXBCdWZmZXIuCisKKyovCisKK3ZvaWQKK3Nicl9kZWMgKCBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgICAgICAgIElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHRpbWUgc2lnbmFsICovCisgICAgICAgICAgSU5UX1BDTSAqdGltZU91dCwgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHRpbWUgc2lnbmFsICovCisgICAgICAgICAgSEFORExFX1NCUl9ERUMgaFNickRlY1JpZ2h0LCAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgcmlnaHQgKi8KKyAgICAgICAgICBJTlRfUENNICp0aW1lT3V0UmlnaHQsICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KKyAgICAgICAgICBjb25zdCBpbnQgc3RyaWRlSW4sICAgICAgICAgICAgICAgIC8qITwgVGltZSBkYXRhIHRyYXZlcnNhbCBzdHJpZGVJbiAqLworICAgICAgICAgIGNvbnN0IGludCBzdHJpZGVPdXQsICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZU91dCAqLworICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsICAvKiE8IENvbnRyb2wgZGF0YSBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICBjb25zdCBpbnQgYXBwbHlQcm9jZXNzaW5nLCAgICAgICAgIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLworICAgICAgICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLAorICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgICkKK3sKKyAgaW50IGksIHNsb3QsIHJlc2VydmU7CisgIGludCBzYXZlTGJTY2FsZTsKKyAgaW50IG92X2xlbjsKKyAgaW50IGxhc3RTbG90T2ZmczsKKyAgRklYUF9EQkwgbWF4VmFsOworCisgIC8qIDErMS8zIGZyYW1lcyBvZiBzcGVjdHJhbCBkYXRhOiAqLworICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwgPSBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsOworICBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcgPSBoU2JyRGVjLT5RbWZCdWZmZXJJbWFnOworCisgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLworIG92X2xlbiA9IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKKworIC8qIE51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCisgIGludCBub0NvbHMgPSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzICogaEhlYWRlckRhdGEtPnRpbWVTdGVwOworCisgLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCisgIGlmICggKChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIgKSA/IDEgOiAwKSAhPSAoKGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5mbGFncyAmIFFNRl9GTEFHX0xQKSA/IDEgOiAwKSApIHsKKyAgICBhc3NpZ25UaW1lU2xvdHMoIGhTYnJEZWMsIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUik7CisgIH0KKworICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpIHsKKyAgICAvKiBDaG9vc2UgdGhlIHJpZ2h0IGxvdyBkZWxheSBmaWx0ZXIgYmFuayAqLworICAgIGNoYW5nZVFtZlR5cGUoIGhTYnJEZWMsIChmbGFncyAmIFNCUkRFQ19MRF9NUFNfUU1GKSA/IDEgOiAwICk7CisgIH0KKworICAvKgorICAgIGxvdyBiYW5kIGNvZGVjIHNpZ25hbCBzdWJiYW5kIGZpbHRlcmluZworICAgKi8KKworICB7CisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKworICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nKCAmaFNickRlYy0+QW5hbHlzaXNjUU1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCArIG92X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcgKyBvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mVGVtcAorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKyAgfQorCisgIC8qCisgICAgQ2xlYXIgdXBwZXIgaGFsZiBvZiBzcGVjdHJ1bQorICAqLworICB7CisgICAgaW50IG5BbmFseXNpc0JhbmRzID0gaEhlYWRlckRhdGEtPm51bWJlck9mQW5hbHlzaXNCYW5kczsKKworICAgIGlmICghIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpKSB7CisgICAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMrb3ZfbGVuOyBzbG90KyspIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoJlFtZkJ1ZmZlclJlYWxbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLCgoNjQpLW5BbmFseXNpc0JhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoJlFtZkJ1ZmZlckltYWdbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLCgoNjQpLW5BbmFseXNpc0JhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMrb3ZfbGVuOyBzbG90KyspIHsKKyAgICAgIEZES21lbWNsZWFyKCZRbWZCdWZmZXJSZWFsW3Nsb3RdW25BbmFseXNpc0JhbmRzXSwoKDY0KS1uQW5hbHlzaXNCYW5kcykqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICB9CisKKworCisgIC8qCisgICAgU2hpZnQgc3BlY3RyYWwgZGF0YSBsZWZ0IHRvIGdhaW4gYWNjdXJhY3kgaW4gdHJhbnNwb3NlciBhbmQgYWRqdXN0b3IKKyAgKi8KKyAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggUW1mQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQ29scytvdl9sZW4gKTsKKworICByZXNlcnZlID0gZml4TWF4KDAsQ250TGVhZGluZ1plcm9zKG1heFZhbCktMSkgOworICByZXNlcnZlID0gZml4TWluKHJlc2VydmUsREZSQUNUX0JJVFMtMS1oU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZSk7CisKKyAgLyogSWYgYWxsIGRhdGEgaXMgemVybywgbGJfc2NhbGUgY291bGQgYmVjb21lIHRvbyBsYXJnZSAqLworICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIFFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogUW1mQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vQ29scytvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZSk7CisKKyAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3IubGJfc2NhbGUgKz0gcmVzZXJ2ZTsKKworICAvKgorICAgIHNhdmUgbG93IGJhbmQgc2NhbGUsIHdhdmVjb2Rpbmcgb3IgcGFyYW1ldHJpYyBzdGVyZW8gbWF5IG1vZGlmeSBpdAorICAqLworICBzYXZlTGJTY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlOworCisKKyAgaWYgKGFwcGx5UHJvY2Vzc2luZykKKyAgeworICAgIFVDSEFSICogYm9yZGVycyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzOworICAgIGxhc3RTbG90T2ZmcyA9ICBib3JkZXJzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzXSAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CisKKyAgICBGSVhQX0RCTCBkZWdyZWVBbGlhc1soNjQpXTsKKworICAgIC8qIFRoZSB0cmFuc3Bvc2VyIHdpbGwgb3ZlcnJpZGUgbW9zdCB2YWx1ZXMgaW4gZGVncmVlQWxpYXNbXS4KKyAgICAgICBUaGUgYXJyYXkgbmVlZHMgdG8gYmUgY2xlYXJlZCBhdCBsZWFzdCBmcm9tIGxvd1N1YmJhbmQgdG8gaGlnaFN1YmJhbmQgYmVmb3JlLiAqLworICAgIGlmIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpCisgICAgICBGREttZW1jbGVhcigmZGVncmVlQWxpYXNbaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kXSwgKGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQtaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kKSpzaXplb2YoRklYUF9EQkwpKTsKKworICAgIC8qCisgICAgICBJbnZlcnNlIGZpbHRlcmluZyBvZiBsb3diYW5kIGFuZCB0cmFuc3Bvc2l0aW9uIGludG8gdGhlIFNCUi1mcmVxdWVuY3kgcmFuZ2UKKyAgICAqLworCisgICAgbHBwVHJhbnNwb3NlciAoICZoU2JyRGVjLT5McHBUcmFucywKKyAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICBkZWdyZWVBbGlhcywgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZWQgaWYgdXNlTFAgPSAxCisgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUiwKKyAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwLAorICAgICAgICAgICAgICAgICAgICBib3JkZXJzWzBdLAorICAgICAgICAgICAgICAgICAgICBsYXN0U2xvdE9mZnMsCisgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgaFByZXZGcmFtZURhdGEtPnNicl9pbnZmX21vZGUgKTsKKworCisKKworCisgICAgLyoKKyAgICAgIEFkanVzdCBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgorICAgICovCisKKyAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlQWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnIHx8IGhQcmV2RnJhbWVEYXRhLT5mcmFtZUVycm9yRmxhZykpOworCisKKyAgICAvKgorICAgICAgVXBkYXRlIGhQcmV2RnJhbWVEYXRhICh0byBiZSB1c2VkIGluIHRoZSBuZXh0IGZyYW1lKQorICAgICovCisgICAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICAgIGhQcmV2RnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZVtpXTsKKyAgICB9CisgICAgaFByZXZGcmFtZURhdGEtPmNvdXBsaW5nID0gaEZyYW1lRGF0YS0+Y291cGxpbmc7CisgICAgaFByZXZGcmFtZURhdGEtPnN0b3BQb3MgPSBib3JkZXJzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzXTsKKyAgICBoUHJldkZyYW1lRGF0YS0+YW1wUmVzID0gaEZyYW1lRGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBSZXNldCBoYl9zY2FsZSBpZiBubyBoaWdoYmFuZCBpcyBwcmVzZW50LCBiZWNhdXNlIGhiX3NjYWxlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIFFNRi1zeW50aGVzaXMgKi8KKyAgICBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZSA9IHNhdmVMYlNjYWxlOworICB9CisKKworICBmb3IgKGk9MDsgaTxMUENfT1JERVI7IGkrKyl7CisgICAgLyoKKyAgICAgIFN0b3JlIHRoZSB1bm1vZGlmaWVkIHFtZiBTbG90cyB2YWx1ZXMgKHJlcXVpcmVkIGZvciBMUEMgZmlsdGVyaW5nKQorICAgICovCisgICAgaWYgKCEgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikpIHsKKyAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsW2ldLCBRbWZCdWZmZXJSZWFsW25vQ29scy1MUENfT1JERVIraV0sIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2Iqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ1tpXSwgUW1mQnVmZmVySW1hZ1tub0NvbHMtTFBDX09SREVSK2ldLCBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiKnNpemVvZihGSVhQX0RCTCkpOworICAgIH0gZWxzZQorICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsW2ldLCBRbWZCdWZmZXJSZWFsW25vQ29scy1MUENfT1JERVIraV0sIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2Iqc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKworICAvKgorICAgIFN5bnRoZXNpcyBzdWJiYW5kIGZpbHRlcmluZy4KKyAgKi8KKworICBpZiAoICEgKGZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpICkgeworCisgICAgeworICAgICAgaW50IG91dFNjYWxlZmFjdG9yID0gMDsKKworICAgICAgaWYgKGhfcHNfZCAhPSBOVUxMKSB7CisgICAgICAgIGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPSAxOyAgLyogd2UgaGVyZSBkbyBmcmFtZSBiYXNlZCBwcm9jZXNzaW5nICovCisgICAgICB9CisKKworICAgICAgc2JyRGVjb2Rlcl9kcmNBcHBseSgmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjYWxlZmFjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworCisgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3RvcigmaFNickRlYy0+U3ludGhlc2lzUU1GLCBvdXRTY2FsZWZhY3RvciApOworCisgICAgICB7CisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mVGVtcCwgRklYUF9EQkwsIDIqKDY0KSk7CisKKyAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nKCAmaFNickRlYy0+U3ludGhlc2lzUU1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZlRlbXApOworCisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyKig2NCkpOworICAgICAgfQorCisgICAgfQorCisgIH0gZWxzZSB7IC8qIChmbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSAqLworICAgIElOVCBpLCBzZGlmZiwgb3V0U2NhbGVmYWN0b3IsIHNjYWxlRmFjdG9yTG93QmFuZCwgc2NhbGVGYWN0b3JIaWdoQmFuZDsKKyAgICBTQ0hBUiBzY2FsZUZhY3Rvckxvd0JhbmRfb3YsIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKKworICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mICAgICAgPSAmaFNickRlYy0+U3ludGhlc2lzUU1GOworICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mUmlnaHQgPSAmaFNickRlY1JpZ2h0LT5TeW50aGVzaXNRTUY7CisKKyAgICAvKiBhZGFwdCBzY2FsaW5nICovCisgICAgc2RpZmYgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZSAtIHJlc2VydmU7ICAgICAgICAgICAgICAgICAgLyogU2NhbGluZyBkaWZmZXJlbmNlICAgICAgICAgKi8KKyAgICBzY2FsZUZhY3RvckhpZ2hCYW5kICAgPSBzZGlmZiAtIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmhiX3NjYWxlOyAgICAvKiBTY2FsZSBvZiBjdXJyZW50IGhpZ2ggYmFuZCAqLworICAgIHNjYWxlRmFjdG9yTG93QmFuZF9vdiA9IHNkaWZmIC0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGU7IC8qIFNjYWxlIG9mIGxvdyBiYW5kIG92ZXJsYXBwaW5nIFFNRiBkYXRhICovCisgICAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gc2RpZmYgLSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZTsgLyogU2NhbGUgb2YgbG93IGJhbmQgY3VycmVudCBRTUYgZGF0YSAgICAgKi8KKyAgICBvdXRTY2FsZWZhY3RvciAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIG91dHB1dCBzY2FsZSAqLworCisgICAgaWYgKGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPT0gMSkgICAgLyogSWYgd2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIGZyYW1lIHRvIHNsb3QgYmFzZWQgcHJvY2Vzc2luZyBjb3B5IGZpbHRlciBzdGF0ZXMgKi8KKyAgICB7IC8qIHByb2NGcmFtZUJhc2VkIHdpbGwgYmUgdW5zZXQgbGF0ZXIgKi8KKyAgICAgIC8qIGNvcHkgZmlsdGVyIHN0YXRlcyBmcm9tIGxlZnQgdG8gcmlnaHQgKi8KKyAgICAgIEZES21lbWNweShzeW5RbWZSaWdodC0+RmlsdGVyU3RhdGVzLCBzeW5RbWYtPkZpbHRlclN0YXRlcywgKCg2NDApLSg2NCkpKnNpemVvZihGSVhQX1FTUykpOworICAgIH0KKworICAgIC8qIHNjYWxlIEFMTCBxbWYgdmFsZXMgKCByZWFsIGFuZCBpbWFnICkgb2YgbW9ubyAvIGxlZnQgY2hhbm5lbCB0byB0aGUKKyAgICAgICBzYW1lIHNjYWxlIGZhY3RvciAoIG92X2xiX3NmLCBsYl9zZiBhbmQgaHFfc2YgKSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBoX3BzX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPmxzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3Rvckxvd0JhbmRfb3YsICAgICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YsICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZSwgICAvKiBjdXJyZW50IGZyYW1lICggaGlnaGJhbmQgKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NvbCk7CisKKyAgICAvKiB1c2UgdGhlIHNhbWUgc3ludGhlc2UgcW1mIHZhbHVlcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCAqLworICAgIHN5blFtZlJpZ2h0LT5ub19jb2wgPSBzeW5RbWYtPm5vX2NvbDsKKyAgICBzeW5RbWZSaWdodC0+bHNiICAgID0gc3luUW1mLT5sc2I7CisgICAgc3luUW1mUmlnaHQtPnVzYiAgICA9IHN5blFtZi0+dXNiOworCisgICAgaW50IGVudj0wOworCisgICAgICBvdXRTY2FsZWZhY3RvciArPSAoU0NBTF9IRUFEUk9PTSsxKTsgLyogcHNEaWZmU2NhbGUhICovCisKKyAgICB7CisgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgMiooNjQpKTsKKworICAgICAgaW50IG1heFNoaWZ0ID0gMDsKKworICAgICAgaWYgKGhTYnJEZWMtPnNickRyY0NoYW5uZWwuZW5hYmxlICE9IDApIHsKKyAgICAgICAgaWYgKGhTYnJEZWMtPnNickRyY0NoYW5uZWwucHJldkZhY3RfZXhwID4gbWF4U2hpZnQpIHsKKyAgICAgICAgICBtYXhTaGlmdCA9IGhTYnJEZWMtPnNickRyY0NoYW5uZWwucHJldkZhY3RfZXhwOworICAgICAgICB9CisgICAgICAgIGlmIChoU2JyRGVjLT5zYnJEcmNDaGFubmVsLmN1cnJGYWN0X2V4cCA+IG1heFNoaWZ0KSB7CisgICAgICAgICAgbWF4U2hpZnQgPSBoU2JyRGVjLT5zYnJEcmNDaGFubmVsLmN1cnJGYWN0X2V4cDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaFNickRlYy0+c2JyRHJjQ2hhbm5lbC5uZXh0RmFjdF9leHAgPiBtYXhTaGlmdCkgeworICAgICAgICAgIG1heFNoaWZ0ID0gaFNickRlYy0+c2JyRHJjQ2hhbm5lbC5uZXh0RmFjdF9leHA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogY29weSBEUkMgZGF0YSB0byByaWdodCBjaGFubmVsICh3aXRoIFBTIGJvdGggY2hhbm5lbHMgdXNlIHRoZSBzYW1lIERSQyBnYWlucykgKi8KKyAgICAgIEZES21lbWNweSgmaFNickRlY1JpZ2h0LT5zYnJEcmNDaGFubmVsLCAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwgc2l6ZW9mKFNCUkRFQ19EUkNfQ0hBTk5FTCkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3luUW1mLT5ub19jb2w7IGkrKykgeyAgLyogLS0tLS0gbm9fY29sIGxvb3AgLS0tLS0gKi8KKworICAgICAgICBJTlQgb3V0U2NhbGVmYWN0b3JSLCBvdXRTY2FsZWZhY3Rvckw7CisgICAgICAgIG91dFNjYWxlZmFjdG9yUiA9IG91dFNjYWxlZmFjdG9yTCA9IG91dFNjYWxlZmFjdG9yOworCisgICAgICAgIC8qIHFtZiB0aW1lc2xvdCBvZiByaWdodCBjaGFubmVsICovCisgICAgICAgIEZJWFBfREJMKiByUW1mUmVhbCA9IHBXb3JrQnVmZmVyOworICAgICAgICBGSVhQX0RCTCogclFtZkltYWcgPSBwV29ya0J1ZmZlciArIDY0OworCisKKyAgICAgICAgeworICAgICAgICAgIGlmICggaSA9PSBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52XSApIHsKKyAgICAgICAgICAgIGluaXRTbG90QmFzZWRSb3RhdGlvbiggaF9wc19kLCBlbnYsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQgKTsKKyAgICAgICAgICAgIGVudisrOworICAgICAgICAgIH0KKworICAgICAgICAgIEFwcGx5UHNTbG90KCBoX3BzX2QsICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAqLworICAgICAgICAgICAgICAgICAgICAgIChRbWZCdWZmZXJSZWFsICsgaSksICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgIChRbWZCdWZmZXJJbWFnICsgaSksICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICByUW1mUmVhbCwgICAgICAgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICByUW1mSW1hZyk7ICAgICAgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLworICAgICAgICB9CisKKworICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQgPSAoaTwoNikpID8gc2NhbGVGYWN0b3JMb3dCYW5kX292IDogc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OworCisKKyAgICAgICAgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QgKCAvKiByaWdodCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlY1JpZ2h0LT5zYnJEcmNDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mUmlnaHQtPm5vX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIG91dFNjYWxlZmFjdG9yUiArPSBtYXhTaGlmdDsKKworICAgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCAoIC8qIGxlZnQgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNickRyY0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFFtZkJ1ZmZlclJlYWwgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooUW1mQnVmZmVySW1hZyArIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5ub19jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBvdXRTY2FsZWZhY3RvckwgKz0gbWF4U2hpZnQ7CisKKworICAgICAgICAvKiBzY2FsZSBmaWx0ZXIgc3RhdGVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCisgICAgICAgIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCBzeW5RbWYsIG91dFNjYWxlZmFjdG9yTCApOworICAgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3Rvciggc3luUW1mUmlnaHQsIG91dFNjYWxlZmFjdG9yUiApOworCisgICAgICAgIHsKKworICAgICAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoIHN5blFtZlJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZSZWFsLCAgICAgICAgICAgICAgICAvKiBRTUYgcmVhbCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByUW1mSW1hZywgICAgICAgICAgICAgICAgLyogUU1GIGltYWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dFJpZ2h0KyhpKnN5blFtZi0+bm9fY2hhbm5lbHMqc3RyaWRlT3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOworCisgICAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCggc3luUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFFtZkJ1ZmZlclJlYWwgKyBpKSwgICAgICAvKiBRTUYgcmVhbCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihRbWZCdWZmZXJJbWFnICsgaSksICAgICAgLyogUU1GIGltYWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dCsoaSpzeW5RbWYtPm5vX2NoYW5uZWxzKnN0cmlkZU91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKKworICAgICAgICB9CisgICAgICB9IC8qIG5vX2NvbCBsb29wICBpICAqLworCisgICAgICAvKiBzY2FsZSBiYWNrICg2KSB0aW1lc2xvdHMgbG9vayBhaGVhZCBmb3IgaHlicmlkIGZpbHRlcmJhbmsgdG8gb3JpZ2luYWwgdmFsdWUgKi8KKyAgICAgIHJlc2NhbEZpbHRlckJhbmtWYWx1ZXMoIGhfcHNfZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5sc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NvbCApOworCisgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIqKDY0KSk7CisgICAgfQorICB9CisKKyAgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsKCAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCApOworCisKKyAgLyoKKyAgICBVcGRhdGUgb3ZlcmxhcCBidWZmZXIKKyAgICBFdmVuIGJhbmRzIGFib3ZlIHVzYiBhcmUgY29waWVkIHRvIGF2b2lkIG91dGRhdGVkIHNwZWN0cmFsIGRhdGEgaW4gY2FzZQorICAgIHRoZSBzdG9wIGZyZXF1ZW5jeSByYWlzZXMuCisgICovCisKKyAgaWYgKGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCA+IDApCisgIHsKKyAgICBpZiAoISAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSkgeworICAgICAgZm9yICggaT0wOyBpPGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrICkgeworICAgICAgICBGREttZW1jcHkoUW1mQnVmZmVyUmVhbFtpXSwgUW1mQnVmZmVyUmVhbFtpK25vQ29sc10sICg2NCkqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShRbWZCdWZmZXJJbWFnW2ldLCBRbWZCdWZmZXJJbWFnW2krbm9Db2xzXSwgKDY0KSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgIGZvciAoIGk9MDsgaTxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKyApIHsKKyAgICAgICAgRkRLbWVtY3B5KFFtZkJ1ZmZlclJlYWxbaV0sIFFtZkJ1ZmZlclJlYWxbaStub0NvbHNdLCAoNjQpKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorICB9CisKKyAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUgPSBzYXZlTGJTY2FsZTsKKworICAvKiBTYXZlIGN1cnJlbnQgZnJhbWUgc3RhdHVzICovCisgIGhQcmV2RnJhbWVEYXRhLT5mcmFtZUVycm9yRmxhZyA9IGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZzsKKworfSAvLyBzYnJfZGVjKCkKKworCisvKiEKKyAgXGJyaWVmICAgICBDcmVhdGVzIHNiciBkZWNvZGVyIHN0cnVjdHVyZQorICBccmV0dXJuICAgIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLworU0JSX0VSUk9SCitjcmVhdGVTYnJEZWMgKFNCUl9DSEFOTkVMICogaFNickNoYW5uZWwsCisgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsCisgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgZG93bnNhbXBsZUZhYywgICAgICAgIC8qITwgRG93bnNhbXBsaW5nIGZhY3RvciAqLworICAgICAgICAgICAgICBjb25zdCBVSU5UICAgIHFtZkZsYWdzLCAgICAgICAgICAgICAvKiE8IGZsYWdzIC0+IDE6IEhRL0xQIHNlbGVjdG9yLCAyOiBDTERGQiAqLworICAgICAgICAgICAgICBjb25zdCBVSU5UICAgIGZsYWdzLAorICAgICAgICAgICAgICBjb25zdCBpbnQgICAgIG92ZXJsYXAsIAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGNoYW4pICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgZm9yIHdoaWNoIHRvIGFzc2lnbiBidWZmZXJzIGV0Yy4gKi8KKworeworICBTQlJfRVJST1IgZXJyID0gU0JSREVDX09LOworICBpbnQgdGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsgICAvKiBOdW1iZXIgb2YgU0JSIHNsb3RzIHBlciBmcmFtZSAqLworICBpbnQgbm9Db2xzID0gdGltZVNsb3RzICogaEhlYWRlckRhdGEtPnRpbWVTdGVwOyAvKiBOdW1iZXIgb2YgUU1GIHNsb3RzIHBlciBmcmFtZSAqLworICBIQU5ETEVfU0JSX0RFQyBocyA9ICYoaFNickNoYW5uZWwtPlNickRlYyk7CisKKyAgLyogSW5pdGlhbGl6ZSBzY2FsZSBmYWN0b3JzICovCisgIGhzLT5zYnJTY2FsZUZhY3Rvci5vdl9sYl9zY2FsZSAgPSAwOworICBocy0+c2JyU2NhbGVGYWN0b3Iub3ZfaGJfc2NhbGUgID0gMDsKKyAgaHMtPnNiclNjYWxlRmFjdG9yLmhiX3NjYWxlICAgICA9IDA7CisKKworICAvKgorICAgIGNyZWF0ZSBlbnZlbG9wZSBjYWxjdWxhdG9yCisgICovCisgIGVyciA9IGNyZWF0ZVNickVudmVsb3BlQ2FsYyAoJmhzLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgaWYgKGVyciAhPSBTQlJERUNfT0spIHsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgLyoKKyAgICBjcmVhdGUgUU1GIGZpbHRlciBiYW5rcworICAqLworICB7CisgICAgaW50IHFtZkVycjsKKyAgICAvKiBBZGFwdGVkIFFNRiBhbmFseXNpcyBwb3N0LXR3aWRkbGVzIGZvciBkb3duLXNhbXBsZWQgSFEgU0JSICovCisgICAgY29uc3QgVUlOVCBkb3duU2FtcGxlZEZsYWcgPSAoZG93bnNhbXBsZUZhYz09MikgPyBRTUZfRkxBR19ET1dOU0FNUExFRCA6IDA7CisKKyAgICBxbWZFcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rICgKKyAgICAgICAgICAgICAgICAgICAgJmhzLT5BbmFseXNpc2NRTUYsCisgICAgICAgICAgICAgICAgICAgICBocy0+YW5hUW1mU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgbm9Db2xzLAorICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5oaWdoU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAocW1mRmxhZ3MgJiAoflFNRl9GTEFHX0tFRVBfU1RBVEVTKSkgfCBkb3duU2FtcGxlZEZsYWcKKyAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKHFtZkVyciAhPSAwKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisgIH0KKyAgaWYgKGhzLT5wU3luUW1mU3RhdGVzID09IE5VTEwpIHsKKyAgICBocy0+cFN5blFtZlN0YXRlcyA9IEdldFJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzKGNoYW4pOworICAgIGlmIChocy0+cFN5blFtZlN0YXRlcyA9PSBOVUxMKQorICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICB9CisKKyAgeworICAgIGludCBxbWZFcnI7CisKKyAgICBxbWZFcnIgPSBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAoCisgICAgICAgICAgICZocy0+U3ludGhlc2lzUU1GLAorICAgICAgICAgICAgaHMtPnBTeW5RbWZTdGF0ZXMsCisgICAgICAgICAgICBub0NvbHMsCisgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCisgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLAorICAgICAgICAgICAgKDY0KSAvIGRvd25zYW1wbGVGYWMsCisgICAgICAgICAgICBxbWZGbGFncyAmICh+UU1GX0ZMQUdfS0VFUF9TVEFURVMpCisgICAgICAgICAgICApOworCisgICAgaWYgKHFtZkVyciAhPSAwKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisgIH0KKyAgaW5pdFNiclByZXZGcmFtZURhdGEgKCZoU2JyQ2hhbm5lbC0+cHJldkZyYW1lRGF0YSwgdGltZVNsb3RzKTsKKworICAvKgorICAgIGNyZWF0ZSB0cmFuc3Bvc2VyCisgICovCisgIGVyciA9IGNyZWF0ZUxwcFRyYW5zcG9zZXIgKCZocy0+THBwVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocy0+U3ludGhlc2lzUU1GLnVzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocy0+QW5hbHlzaXNjUU1GLm5vX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCApOworICBpZiAoZXJyICE9IFNCUkRFQ19PSykgeworICAgIHJldHVybiBlcnI7CisgIH0KKworICAvKiBUaGUgQ0xERkIgZG9lcyBub3QgaGF2ZSBvdmVybGFwICovCisgIGlmICgocW1mRmxhZ3MgJiBRTUZfRkxBR19DTERGQikgPT0gMCkgeworICAgIGlmIChocy0+cFNick92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgaHMtPnBTYnJPdmVybGFwQnVmZmVyID0gR2V0UmFtX3Nicl9PdmVybGFwQnVmZmVyKGNoYW4pOworICAgICAgaWYgKGhzLT5wU2JyT3ZlcmxhcEJ1ZmZlciA9PSBOVUxMKSAgeworICAgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENsZWFyIG92ZXJsYXAgYnVmZmVyICovCisgICAgICBGREttZW1jbGVhciggaHMtPnBTYnJPdmVybGFwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiAyICogKDYpICogKDY0KQorICAgICAgICAgICAgICAgICApOworICAgIH0KKyAgfQorCisgIC8qIGFzc2lnbiBxbWYgdGltZSBzbG90cyAqLworICBhc3NpZ25UaW1lU2xvdHMoICZoU2JyQ2hhbm5lbC0+U2JyRGVjLCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzICogaEhlYWRlckRhdGEtPnRpbWVTdGVwLCBxbWZGbGFncyAmIFFNRl9GTEFHX0xQKTsKKworICByZXR1cm4gZXJyOworfQorCisvKiEKKyAgXGJyaWVmICAgICBEZWxldGUgc2JyIGRlY29kZXIgc3RydWN0dXJlCisgIFxyZXR1cm4gICAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQKK2RlbGV0ZVNickRlYyAoU0JSX0NIQU5ORUwgKiBoU2JyQ2hhbm5lbCkKK3sKKyAgSEFORExFX1NCUl9ERUMgaHMgPSAmaFNickNoYW5uZWwtPlNickRlYzsKKworICBkZWxldGVTYnJFbnZlbG9wZUNhbGMgKCZocy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUpOworCisgIC8qIGRlbGV0ZSBRTUYgZmlsdGVyIHN0YXRlcyAqLworICBpZiAoaHMtPnBTeW5RbWZTdGF0ZXMgIT0gTlVMTCkgeworICAgIEZyZWVSYW1fc2JyX1FtZlN0YXRlc1N5bnRoZXNpcygmaHMtPnBTeW5RbWZTdGF0ZXMpOworICB9CisKKworICBpZiAoaHMtPnBTYnJPdmVybGFwQnVmZmVyICE9IE5VTEwpIHsKKyAgICBGcmVlUmFtX3Nicl9PdmVybGFwQnVmZmVyKCZocy0+cFNick92ZXJsYXBCdWZmZXIpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyohCisgIFxicmllZiAgICAgcmVzZXRzIHNiciBkZWNvZGVyIHN0cnVjdHVyZQorICBccmV0dXJuICAgIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLworU0JSX0VSUk9SCityZXNldFNickRlYyAoSEFORExFX1NCUl9ERUMgaFNickRlYywKKyAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLAorICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKKyAgICAgICAgICAgICBjb25zdCBpbnQgZG93bnNhbXBsZUZhYworICAgICAgICAgICAgICkKK3sKKyAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOworICAKKyAgaW50IG9sZF9sc2IgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiOworICBpbnQgbmV3X2xzYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZDsKKyAgaW50IGwsIHN0YXJ0QmFuZCwgc3RvcEJhbmQsIHN0YXJ0U2xvdCwgc2l6ZTsKKworICBpbnQgc291cmNlX3NjYWxlLCB0YXJnZXRfc2NhbGUsIGRlbHRhX3NjYWxlLCB0YXJnZXRfbHNiLCB0YXJnZXRfdXNiLCByZXNlcnZlOworICBGSVhQX0RCTCBtYXhWYWw7CisKKyAgLyogb3ZlcmxhcEJ1ZmZlciBwb2ludCB0byBmaXJzdCAoNikgc2xvdHMgKi8KKyAgRklYUF9EQkwgICoqT3ZlcmxhcEJ1ZmZlclJlYWwgPSBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsOworICBGSVhQX0RCTCAgKipPdmVybGFwQnVmZmVySW1hZyA9IGhTYnJEZWMtPlFtZkJ1ZmZlckltYWc7CisKKyAgLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCisgIGFzc2lnblRpbWVTbG90cyggaFNickRlYywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgdXNlTFApOworCisKKworICByZXNldFNickVudmVsb3BlQ2FsYyAoJmhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlKTsKKworICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kOworICBoU2JyRGVjLT5TeW50aGVzaXNRTUYudXNiID0gZml4TWluKChJTlQpaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NoYW5uZWxzLCAoSU5UKWhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQpOworCisgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiOworICBoU2JyRGVjLT5BbmFseXNpc2NRTUYudXNiID0gaFNickRlYy0+U3ludGhlc2lzUU1GLnVzYjsKKworCisgIC8qCisgICAgVGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBvZiBzcGVjdHJhbCBkYXRhIGluIHRoZSBvdmVybGFwIGJ1ZmZlcgorICAgIGlzIHJlcXVpcmVkIGZvciBkeW5hbWljIHgtb3ZlciBvciBhIGNoYW5nZSBvZiB0aGUgc3RhcnQtZnJlcSBmb3IgMiByZWFzb25zOgorCisgICAgMS4gSWYgdGhlIGxvd2JhbmQgZ2V0cyBfd2lkZXJfLCB1bmFkanVzdGVkIGRhdGEgd291bGQgcmVtYWluCisKKyAgICAyLiBJZiB0aGUgbG93YmFuZCBiZWNvbWVzIF9zbWFsbGVyXywgdGhlIGhpZ2hlc3QgYmFuZHMgb2YgdGhlIG9sZCBsb3diYW5kCisgICAgICAgbXVzdCBiZSBjbGVhcmVkIGJlY2F1c2UgdGhlIHdoaXRlbmluZyB3b3VsZCBiZSBhZmZlY3RlZAorICAqLworICBzdGFydEJhbmQgPSBvbGRfbHNiOworICBzdG9wQmFuZCAgPSBuZXdfbHNiOworICBzdGFydFNsb3QgPSBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKiAoaFByZXZGcmFtZURhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKTsKKyAgc2l6ZSAgICAgID0gZml4TWF4KDAsc3RvcEJhbmQtc3RhcnRCYW5kKTsKKworICAvKiBrZWVwIGFscmVhZHkgYWRqdXN0ZWQgZGF0YSBpbiB0aGUgeC1vdmVyLWFyZWEgKi8KKyAgaWYgKCF1c2VMUCkgeworICAgIGZvciAobD1zdGFydFNsb3Q7IGw8aFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBsKyspIHsKKyAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVyUmVhbFtsXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoJk92ZXJsYXBCdWZmZXJJbWFnW2xdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICB9IGVsc2UKKyAgZm9yIChsPXN0YXJ0U2xvdDsgbDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgOyBsKyspIHsKKyAgICBGREttZW1jbGVhcigmT3ZlcmxhcEJ1ZmZlclJlYWxbbF1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCisKKyAgLyoKKyAgICByZXNldCBMUEMgZmlsdGVyIHN0YXRlcworICAqLworICBzdGFydEJhbmQgPSBmaXhNaW4ob2xkX2xzYixuZXdfbHNiKTsKKyAgc3RvcEJhbmQgID0gZml4TWF4KG9sZF9sc2IsbmV3X2xzYik7CisgIHNpemUgICAgICA9IGZpeE1heCgwLHN0b3BCYW5kLXN0YXJ0QmFuZCk7CisKKyAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxbMF1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxbMV1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgaWYgKCF1c2VMUCkgeworICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnWzBdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdbMV1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCisKKyAgLyoKKyAgICBSZXNjYWxlIGFscmVhZHkgcHJvY2Vzc2VkIHNwZWN0cmFsIGRhdGEgYmV0d2VlbiBvbGQgYW5kIG5ldyB4LW92ZXIgZnJlcXVlbmN5LgorICAgIFRoaXMgbXVzdCBiZSBkb25lIGJlY2F1c2Ugb2YgdGhlIHNlcGFyYXRlIHNjYWxlZmFjdG9ycyBmb3IgbG93YmFuZCBhbmQgaGlnaGJhbmQuCisgICovCisgIHN0YXJ0QmFuZCA9IGZpeE1pbihvbGRfbHNiLG5ld19sc2IpOworICBzdG9wQmFuZCA9ICBmaXhNYXgob2xkX2xzYixuZXdfbHNiKTsKKworICBpZiAobmV3X2xzYiA+IG9sZF9sc2IpIHsKKyAgICAvKiBUaGUgeC1vdmVyLWFyZWEgd2FzIHBhcnQgb2YgdGhlIGhpZ2hiYW5kIGJlZm9yZSBhbmQgd2lsbCBub3cgYmVsb25nIHRvIHRoZSBsb3diYW5kICovCisgICAgc291cmNlX3NjYWxlID0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfaGJfc2NhbGU7CisgICAgdGFyZ2V0X3NjYWxlID0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGU7CisgICAgdGFyZ2V0X2xzYiAgID0gMDsKKyAgICB0YXJnZXRfdXNiICAgPSBvbGRfbHNiOworICB9CisgIGVsc2UgeworICAgIC8qIFRoZSB4LW92ZXItYXJlYSB3YXMgcGFydCBvZiB0aGUgbG93YmFuZCBiZWZvcmUgYW5kIHdpbGwgbm93IGJlbG9uZyB0byB0aGUgaGlnaGJhbmQgKi8KKyAgICBzb3VyY2Vfc2NhbGUgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5vdl9sYl9zY2FsZTsKKyAgICB0YXJnZXRfc2NhbGUgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5vdl9oYl9zY2FsZTsKKyAgICAvKiBqZHI6IFRoZSB2YWx1ZXMgb2xkX2xzYiBhbmQgb2xkX3VzYiBtaWdodCBiZSB3cm9uZyBiZWNhdXNlIHRoZSBwcmV2aW91cyBmcmFtZSBtaWdodCBoYXZlIGJlZW4gInVwc2FtbGluZyIuICovCisgICAgdGFyZ2V0X2xzYiAgID0gaFNickRlYy0+U3ludGhlc2lzUU1GLmxzYjsKKyAgICB0YXJnZXRfdXNiICAgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYudXNiOworICB9CisKKyAgLyogU2hpZnQgbGVmdCBhbGwgc2FtcGxlcyBvZiB0aGUgeC1vdmVyLWFyZWEgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICBBbiB1bm5lY2Vzc2FyeSBjb2Fyc2Ugc2NhbGUgY291bGQgY2F1c2Ugb3ZfbGJfc2NhbGUgb3Igb3ZfaGJfc2NhbGUgdG8gYmUKKyAgICAgYWRhcHRlZCBhbmQgdGhlIGFjY3VyYWN5IGluIHRoZSBuZXh0IGZyYW1lIHdvdWxkIHNlcmlvdXNseSBzdWZmZXIhICovCisKKyAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggT3ZlcmxhcEJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogT3ZlcmxhcEJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2xvdCk7CisKKyAgcmVzZXJ2ZSA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CisgIHJlc2VydmUgPSBmaXhNaW4ocmVzZXJ2ZSxERlJBQ1RfQklUUy0xLXNvdXJjZV9zY2FsZSk7CisKKyAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBPdmVybGFwQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IE92ZXJsYXBCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlKTsKKyAgc291cmNlX3NjYWxlICs9IHJlc2VydmU7CisKKyAgZGVsdGFfc2NhbGUgPSB0YXJnZXRfc2NhbGUgLSBzb3VyY2Vfc2NhbGU7CisKKyAgaWYgKGRlbHRhX3NjYWxlID4gMCkgeyAvKiB4LW92ZXItYXJlYSBpcyBkb21pbmFudCAqLworICAgIGRlbHRhX3NjYWxlID0gLWRlbHRhX3NjYWxlOworICAgIHN0YXJ0QmFuZCA9IHRhcmdldF9sc2I7CisgICAgc3RvcEJhbmQgPSB0YXJnZXRfdXNiOworCisgICAgaWYgKG5ld19sc2IgPiBvbGRfbHNiKSB7CisgICAgICAvKiBUaGUgbG93YmFuZCBoYXMgdG8gYmUgcmVzY2FsZWQgKi8KKyAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlID0gc291cmNlX3NjYWxlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIFRoZSBoaWdoYmFuZCBoYXMgYmUgYmUgcmVzY2FsZWQgKi8KKyAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2hiX3NjYWxlID0gc291cmNlX3NjYWxlOworICAgIH0KKyAgfQorCisgIEZES19BU1NFUlQoc3RhcnRCYW5kIDw9IHN0b3BCYW5kKTsKKworICBpZiAoIXVzZUxQKSB7CisgICAgZm9yIChsPTA7IGw8c3RhcnRTbG90OyBsKyspIHsKKyAgICAgIHNjYWxlVmFsdWVzKCBPdmVybGFwQnVmZmVyUmVhbFtsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQtc3RhcnRCYW5kLCBkZWx0YV9zY2FsZSApOworICAgICAgc2NhbGVWYWx1ZXMoIE92ZXJsYXBCdWZmZXJJbWFnW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZC1zdGFydEJhbmQsIGRlbHRhX3NjYWxlICk7CisgICAgfQorICB9IGVsc2UKKyAgZm9yIChsPTA7IGw8c3RhcnRTbG90OyBsKyspIHsKKyAgICBzY2FsZVZhbHVlcyggT3ZlcmxhcEJ1ZmZlclJlYWxbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kLXN0YXJ0QmFuZCwgZGVsdGFfc2NhbGUgKTsKKyAgfQorCisKKyAgLyoKKyAgICBJbml0aWFsaXplIHRyYW5zcG9zZXIgYW5kIGxpbWl0ZXIKKyAgKi8KKyAgc2JyRXJyb3IgPSByZXNldExwcFRyYW5zcG9zZXIgKCZoU2JyRGVjLT5McHBUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSk7CisgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spCisgICAgcmV0dXJuIHNickVycm9yOworCisgIHNickVycm9yID0gUmVzZXRMaW1pdGVyQmFuZHMgKCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxpbWl0ZXJCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5ub0xpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+cGF0Y2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+bm9PZlBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMpOworCisKKyAgcmV0dXJuIHNickVycm9yOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NWU3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmgKQEAgLTAsMCArMSwyMTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBTYnIgZGVjb2RlciAgCisqLworI2lmbmRlZiBfX1NCUl9ERUNfSAorI2RlZmluZSBfX1NCUl9ERUNfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisjaW5jbHVkZSAibHBwX3RyYW4uaCIKKyNpbmNsdWRlICJxbWYuaCIKKyNpbmNsdWRlICJlbnZfY2FsYy5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisKKyNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCisKKyNkZWZpbmUgU0FDREVDX0FMSUdOTUVOVF9GSVgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUU1GX0ZJTFRFUl9CQU5LICAgICBBbmFseXNpc2NRTUY7CisgIFFNRl9GSUxURVJfQkFOSyAgICAgU3ludGhlc2lzUU1GOworCisgIFNCUl9DQUxDVUxBVEVfRU5WRUxPUEUgIFNickNhbGN1bGF0ZUVudmVsb3BlOworICBTQlJfTFBQX1RSQU5TICAgICAgICAgICBMcHBUcmFuczsKKworICBRTUZfU0NBTEVfRkFDVE9SIHNiclNjYWxlRmFjdG9yOworICBRTUZfU0NBTEVfRkFDVE9SIHNiclNjYWxlRmFjdG9yUmlnaHQ7CisKKyAgLyohIERlbGF5ZWQgc3BlY3RyYWwgZGF0YSBuZWVkZWQgZm9yIHRoZSBkeW5hbWljIGZyYW1pbmcgb2YgU0JSLiBOb3QgcmVxdWlyZWQgaW4gY2FzZSBvZiBDTERGQiAqLworICBGSVhQX0RCTCAqIHBTYnJPdmVybGFwQnVmZmVyOworCisgIC8qIFJlZmVyZW5jZXMgdG8gd29ya2J1ZmZlcnMgKi8KKyAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMTsKKyAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMjsKKworICAvKiBRTUYgZmlsdGVyIHN0YXRlcyAqLworICBGSVhQX1FBUyAgIGFuYVFtZlN0YXRlc1soMzIwKV07CisgIEZJWFBfUVNTICogcFN5blFtZlN0YXRlczsKKworICAvKiBSZWZlcmVuY2UgcG9pbnRlciBhcnJheXMgZm9yIFFNRiB0aW1lIHNsb3RzLAorICAgICBtaXhlZCBhbW9uZyBvdmVybGFwIGFuZCBjdXJyZW50IHNsb3RzLiAqLworICBGSVhQX0RCTCAqIFFtZkJ1ZmZlclJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKV07CisgIEZJWFBfREJMICogUW1mQnVmZmVySW1hZ1soKCgxMDI0KS8oMzIpKSsoNikpXTsKKyAgaW50IHVzZUxQOworCisgIC8qIFFNRiBkb21haW4gZXh0ZW5zaW9uIHRpbWUgc2xvdCByZWZlcmVuY2UgcG9pbnRlciBhcnJheSAqLworCisgIFNCUkRFQ19EUkNfQ0hBTk5FTCAgc2JyRHJjQ2hhbm5lbDsKKworfSBTQlJfREVDOworCit0eXBlZGVmIFNCUl9ERUMgKkhBTkRMRV9TQlJfREVDOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFNCUl9GUkFNRV9EQVRBICAgICAgZnJhbWVEYXRhWygxKSsxXTsKKyAgU0JSX1BSRVZfRlJBTUVfREFUQSBwcmV2RnJhbWVEYXRhOworICBTQlJfREVDIFNickRlYzsKK30KK1NCUl9DSEFOTkVMOworCit0eXBlZGVmIFNCUl9DSEFOTkVMICpIQU5ETEVfU0JSX0NIQU5ORUw7CisKK3ZvaWQKK1NickRlY29kZUFuZFByb2Nlc3MgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsCisgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lSW4sCisgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBhcHBseVByb2Nlc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE5yCisgICAgICAgICAgICAgICAgICAgICAsIFVDSEFSIHVzZUxQCisgICAgICAgICAgICAgICAgICAgICApOworCisKK3ZvaWQKK1NickNvbnN0cnVjdFRpbWVPdXRwdXQgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCAgLyohPCBTb21lIGNvbnRyb2wgZGF0YSBvZiBsYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE5yCisgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiB1c2VMUAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCit2b2lkCitzYnJfZGVjIChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgICAgICAgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBzaWduYWwgKi8KKyAgICAgICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLworICAgICAgICAgSEFORExFX1NCUl9ERUMgaFNickRlY1JpZ2h0LCAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgcmlnaHQgKi8KKyAgICAgICAgIElOVF9QQ00gKnRpbWVPdXRSaWdodCwgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLworICAgICAgICAgY29uc3QgaW50IHN0cmlkZUluLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgZGF0YSB0cmF2ZXJzYWwgc3RyaWRlSW4gKi8KKyAgICAgICAgIGNvbnN0IGludCBzdHJpZGVPdXQsICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZU91dCAqLworICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgIGNvbnN0IGludCBhcHBseVByb2Nlc3NpbmcsICAgICAgICAgLyohPCBGbGFnIGZvciBTQlIgb3BlcmF0aW9uICovCisgICAgICAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwKKyAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgKTsKKworCisKK1NCUl9FUlJPUgorY3JlYXRlU2JyRGVjIChTQlJfQ0hBTk5FTCAqIGhTYnJDaGFubmVsLAorICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsCisgICAgICAgICAgICAgIGNvbnN0IGludCBkb3duc2FtcGxlRmFjLAorICAgICAgICAgICAgICBjb25zdCBVSU5UIHFtZkZsYWdzLAorICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgaW50IGNoYW4pOworCitpbnQKK2RlbGV0ZVNickRlYyAoU0JSX0NIQU5ORUwgKiBoU2JyQ2hhbm5lbCk7CisKK1NCUl9FUlJPUgorcmVzZXRTYnJEZWMgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsCisgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwKKyAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCisgICAgICAgICAgICAgY29uc3QgaW50IGRvd25zYW1wbGVGYWMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yYW0uY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjMjQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yYW0uY3BwCkBAIC0wLDAgKzEsMTk0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiBNZW1vcnkgbGF5b3V0CisgICAKKworICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBhbGwgc3RhdGljIGFuZCBkeW5hbWljIG1lbW9yeSBzcGFjZXMKKyovCisKKyNpbmNsdWRlICJzYnJfcmFtLmgiCisKKworCisKKyNkZWZpbmUgV09SS0JVRkZFUjFfVEFHIDAKKyNkZWZpbmUgV09SS0JVRkZFUjJfVEFHIDEKKworLyohCisgIFxuYW1lIFN0YXRpY1NickRhdGEKKworICBTdGF0aWMgbWVtb3J5IGFyZWFzLCBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiBpbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUgZGVjb2RlcgorKi8KKy8qIEB7ICovCisKKy8qISBTQlIgRGVjb2RlciBtYWluIHN0cnVjdHVyZSAqLworQ19BTExPQ19NRU0oUmFtX1NickRlY29kZXIsIHN0cnVjdCBTQlJfREVDT0RFUl9JTlNUQU5DRSwgMSkKKy8qISBTQlIgRGVjb2RlciBlbGVtZW50IGRhdGEgIDxicj4KKyAgRGltZW5zaW9uOiAoOCkgKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyRGVjRWxlbWVudCwgU0JSX0RFQ09ERVJfRUxFTUVOVCwgMSwgKDgpKQorLyohIFNCUiBEZWNvZGVyIGluZGl2aWR1YWwgY2hhbm5lbCBkYXRhICA8YnI+CisgIERpbWVuc2lvbjogKDgpICovCitDX0FMTE9DX01FTTIoUmFtX1NickRlY0NoYW5uZWwsIFNCUl9DSEFOTkVMLCAxLCAoOCkrMSkKKworLyohIEZpbHRlciBzdGF0ZXMgZm9yIFFNRi1zeW50aGVzaXMuICA8YnI+CisgIERpbWVuc2lvbjogIyg4KSAqICgjUU1GX0ZJTFRFUl9TVEFURV9TWU5fU0laRS0jKDY0KSkgKi8KK0NfQUFMTE9DX01FTTJfTChSYW1fc2JyX1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9RU1MsICg2NDApLSg2NCksICg4KSsxLCBTRUNUX0RBVEFfTDEpCisKKy8qISBEZWxheWVkIHNwZWN0cmFsIGRhdGEgbmVlZGVkIGZvciB0aGUgZHluYW1pYyBmcmFtaW5nIG9mIFNCUi4KKyAgRm9yIG1wM1BSTywgMS8zIG9mIGEgZnJhbWUgaXMgYnVmZmVyZWQgKCMoNikgNikgKi8KK0NfQUFMTE9DX01FTTIoUmFtX3Nicl9PdmVybGFwQnVmZmVyLCBGSVhQX0RCTCwgMiAqICg2KSAqICg2NCksICg4KSsxKQorCisvKiEgU3RhdGljIERhdGEgb2YgUFMgKi8KKworQ19BTExPQ19NRU0oUmFtX3BzX2RlYywgUFNfREVDLCAxKQorCisKKy8qIEB9ICovCisKKworLyohCisgIFxuYW1lIER5bmFtaWNTYnJEYXRhCisKKyAgRHluYW1pYyBtZW1vcnkgYXJlYXMsIG1pZ2h0IGJlIHJldXNlZCBpbiBvdGhlciBhbGdvcml0aG0gc2VjdGlvbnMsCisgIGUuZy4gdGhlIGNvcmUgZGVjb2RlcgorICA8YnI+CisgIERlcGVuZGluZyBvbiB0aGUgbW9kZSBzZXQgYnkgRE9OVF9VU0VfQ09SRV9XT1JLQlVGRkVSLCB3b3JrYnVmZmVycyBhcmUKKyAgZGVmaW5lZCBhZGRpdGlvbmFsbHkgdG8gdGhlIENvcmVXb3JrYnVmZmVyLgorICA8YnI+CisgIFRoZSBzaXplIG9mIFdvcmtCdWZmZXJzIGlzICgoMTAyNCkvKDMyKSkqKDY0KSA9IDIwNDguCisgIDxicj4KKyAgV29ya0J1ZmZlcjIgaXMgYSBwb2ludGVyIHRvIHRoZSBDb3JlV29ya0J1ZmZlciB3aWNoIGlzIHJldXNlZCBoZXJlIGluIHRoZSBTQlIgcGFydC4gSW4gY2FzZSBvZgorICBET05UX1VTRV9DT1JFX1dPUktCVUZGRVIsIHRoZSBDb3JlV29ya2J1ZmZlciBpcyBub3QgdXNlZCBhbmQgdGhlIGFjY29yZGluZworICBXb3JrYnVmZmVyMiBpcyBkZWZpbmVkIGxvY2FsbHkgaW4gdGhpcyBmaWxlLgorICA8YnI+CisgIFdvcmtCdWZmZXIxIGlzIHJldXNlZCBpbiB0aGUgQUFDIGNvcmUgKC0+IGFhY2RlY29kZXIuY3BwLCBhYWNfcmFtLmNwcCkKKyAgPGJyPgorCisgIFVzZSBvZiBXb3JrQnVmZmVyczoKKyAgPHByZT4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBQUMgY29yZToKKworICAgICAgQ29yZVdvcmtidWZmZXI6IHNwZWN0cmFsIGNvZWZmaWNpZW50cworICAgICAgV29ya0J1ZmZlcjE6ICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyRHluYW1pY0RhdGEKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTQlIgcGFydDoKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIExvdyBQb3dlciBNb2RlICh1c2VMUD0xIG9yIExPV19QT1dFUl9TQlJfT05MWSksIHNlZSBhc3NpZ25MY1RpbWVTbG90cygpCisKKyAgICAgICAgU0xPVF9CQVNFRF9QUk9UT1RZUEVfU1lOX0ZJTFRFUgorCisgICAgICAgIFdvcmtCdWZmZXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrQnVmZmVyMig9Q29yZVdvcmtidWZmZXIpCisgICAgICAgICBfX19fX19fX19fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fXworICAgICAgICB8IFJlYWxMZWZ0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZWFsUmlnaHQgICAgICB8CisgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX19fX19fX3wKKworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgSGlnaCBRdWFsaXR5IE1vZGUgKCFMT1dfUE9XRVJfU0JSX09OTFkgYW5kIHVzZUxQPTApLCBzZWUgYXNzaWduSHFUaW1lU2xvdHMoKQorCisgICAgICAgICBTTE9UQkFTRURfUFMKKworICAgICAgICAgV29ya0J1ZmZlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtCdWZmZXIyKD1Db3JlV29ya2J1ZmZlcikKKyAgICAgICAgIF9fX19fX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fCisgICAgICAgIHwgUmVhbC9JbWFnICAgICAgfCAgaW50ZXJsZWF2ZWQgICAgICAgICAgICB8IFJlYWwvSW1hZyAgICAgIHwgIGludGVybGVhdmVkCisgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgZmlyc3QgaGFsZiBhY3R1YWwgY2ggICB8X19fX19fX19fX19fX19fX3wgIHNlY29uZCBoYWxmIGFjdHVhbCBjaAorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDwvcHJlPgorCisqLworLyogQHsgKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIxLCBGSVhQX0RCTCwgKCgxMDI0KS8oMzIpKSooNjQpLCBTRUNUX0RBVEFfTDEsIFdPUktCVUZGRVIxX1RBRykKK0NfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIyLCBGSVhQX0RCTCwgKCgxMDI0KS8oMzIpKSooNjQpLCBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVIyX1RBRykKKworLyogQH0gKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjYzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKQEAgLTAsMCArMSwxNTggQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKK1xmaWxlCitcYnJpZWYgTWVtb3J5IGxheW91dAorIAorKi8KKyNpZm5kZWYgX1NCUl9SQU1fSF8KKyNkZWZpbmUgX1NCUl9SQU1fSF8KKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworI2luY2x1ZGUgImVudl9leHRyLmgiCisjaW5jbHVkZSAic2JyX2RlYy5oIgorCisKKworI2RlZmluZSBTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UICAoMikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgU0JSX0NIQU5ORUwgICAgICAgICAgKnBTYnJDaGFubmVsW1NCUkRFQ19NQVhfQ0hfUEVSX0VMRU1FTlRdOworICBUUkFOU1BPU0VSX1NFVFRJTkdTICAgdHJhbnNwb3NlclNldHRpbmdzOyAvKiBDb21tb24gdHJhbnNwb3J0IHNldHRpbmdzIGZvciBlYWNoIGluZGl2aWR1YWwgY2hhbm5lbCBvZiBhbiBlbGVtZW50ICovCisgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnM7CisKKyAgTVA0X0VMRU1FTlRfSUQgICAgICAgIGVsZW1lbnRJRDsgICAgICAgICAgLyogRWxlbWVudCBJRCBzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBDYW4gYmUgdXNlZCBmb3IgY29uY2VhbG1lbnQgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgIG5DaGFubmVsczsgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIG91dHB1dCBjaGFubmVscyAoPTIgaW4gY2FzZSBvZiBQUykgKi8KKworICBVQ0hBUiBmcmFtZUVycm9yRmxhZ1soMSkrMV07ICAvKiBGcmFtZSBlcnJvciBzdGF0dXMgKGZvciBldmVyeSBzbG90IGluIHRoZSBkZWxheSBsaW5lKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGNvcGllZCBpbnRvIGhlYWRlciBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgZGVjb2RlRWxlbWVudCgpIHJvdXRpbmUuICovCisKKyAgVUNIQVIgdXNlRnJhbWVTbG90OyAgICAgICAgICAvKiBJbmRleCB3aGljaCBkZWZpbmVzIHdoaWNoIHNsb3Qgd2lsbCBiZSBkZWNvZGVkL2ZpbGxlZCBuZXh0ICh1c2VkIHdpdGggYWRkaXRpb25hbCBkZWxheSkgKi8KKyAgVUNIQVIgdXNlSGVhZGVyU2xvdFsoMSkrMV07ICAgLyogSW5kZXggYXJyYXkgdGhhdCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuIGhlYWRlciBhbmQgZnJhbWUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbXBvcnRhbnQgd2hlbiBwcm9jZXNzaW5nIHdpdGggYWRkaXRpb25hbCBkZWxheSkuICovCit9IFNCUl9ERUNPREVSX0VMRU1FTlQ7CisKKworc3RydWN0IFNCUl9ERUNPREVSX0lOU1RBTkNFCit7CisgIFNCUl9ERUNPREVSX0VMRU1FTlQgICpwU2JyRWxlbWVudFsoOCldOworICBTQlJfSEVBREVSX0RBVEEgICAgICAgc2JySGVhZGVyWyg4KV1bKDEpKzFdOyAgICAgIC8qIFNiciBoZWFkZXIgZm9yIGVhY2ggaW5kaXZpZHVhbCBjaGFubmVsIG9mIGFuIGVsZW1lbnQgKi8KKworICBGSVhQX0RCTCAqd29ya0J1ZmZlcjE7CisgIEZJWFBfREJMICp3b3JrQnVmZmVyMjsKKworICBIQU5ETEVfUFNfREVDICBoUGFyYW1ldHJpY1N0ZXJlb0RlYzsKKworICAvKiBHbG9iYWwgcGFyYW1ldGVycyAqLworICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWM7IC8qIEFPVCBvZiBjb3JlIGNvZGVjICovCisgIGludCBudW1TYnJFbGVtZW50czsKKyAgaW50IG51bVNickNoYW5uZWxzOworICBJTlQgc2FtcGxlUmF0ZUluOyAgICAgICAgICAgIC8qIFNCUiBkZWNvZGVyIGlucHV0IHNhbXBsaW5nIHJhdGU7IG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3Bvc2VyIGlucHV0IHNhbXBsaW5nIHJhdGUuICovCisgIElOVCBzYW1wbGVSYXRlT3V0OyAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgU0JSIGRlY29kZXIgb3V0cHV0IGF1ZGlvIHNhbXBsZXMuICovCisgIFVTSE9SVCBjb2RlY0ZyYW1lU2l6ZTsKKyAgVUNIQVIgc3luRG93bnNhbXBsZUZhYzsKKyAgVUNIQVIgbnVtRGVsYXlGcmFtZXM7ICAgICAgICAvKiBUaGUgY3VycmVudCBudW1iZXIgb2YgYWRkaXRpb25hbCBkZWxheSBmcmFtZXMgdXNlZCBmb3IgcHJvY2Vzc2luZy4gKi8KKworICBVSU5UIGZsYWdzOworCit9OworCitIX0FMTE9DX01FTShSYW1fU2JyRGVjRWxlbWVudCwgU0JSX0RFQ09ERVJfRUxFTUVOVCkKK0hfQUxMT0NfTUVNKFJhbV9TYnJEZWNDaGFubmVsLCBTQlJfQ0hBTk5FTCkKK0hfQUxMT0NfTUVNKFJhbV9TYnJEZWNvZGVyLCBzdHJ1Y3QgU0JSX0RFQ09ERVJfSU5TVEFOQ0UpCisKK0hfQUxMT0NfTUVNKFJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX1FTUykKK0hfQUxMT0NfTUVNKFJhbV9zYnJfT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwpCisKKworSF9BTExPQ19NRU0oUmFtX3BzX2RlYywgUFNfREVDKQorCisKK0hfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIxLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIyLCBGSVhQX0RCTCkKKworCisjZW5kaWYgLyogX1NCUl9SQU1fSF8gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0YzNjZAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwCkBAIC0wLDAgKzEsMTQxNCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCisgICAKKworICBUaGlzIG1vZHVsZSBjb250YWlucyBtb3N0IG9mIHRoZSBjb25zdGFudCBkYXRhIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBST00uCisqLworCisjaW5jbHVkZSAic2JyX3JvbS5oIgorCisKKworCisvKiEKKyAgXG5hbWUgICBTdGFydFN0b3BCYW5kcworICBcYnJpZWYgIFN0YXJ0IGFuZCBzdG9wIHN1YmJhbmRzIG9mIHRoZSBoaWdoYmFuZC4KKworICBrX28gPSBzdGFydE1pbiArIG9mZnNldFtic19zdGFydF9mcmVxXTsKKyAgc3RhcnRNaW4gPSB7MzAwMCw0MDAwLDUwMDB9ICogKDEyOC9GU19zYnIpIC8gRlNfc2JyIDwgMzJLaHosIDMyS2h6IDw9IEZTX3NiciA8IDY0S0h6LCA2NEtIeiA8PSBGU19zYnIKKyAgVGhlIHN0b3Agc3ViYmFuZCBjYW4gYWxzbyBiZSBjYWxjdWxhdGVkIHRvIHNhdmUgbWVtb3J5IGJ5IGRlZmluaW5nICNDQUxDX1NUT1BfQkFORC4KKyovCisvL0B7Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNlsxNl0gPSB7MTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzF9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbMTZdID0gezEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwfTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0WzE2XSA9IHsxMSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjcsIDI5LCAzMn07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMlsxNl0gPSB7MTAsIDEyLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjUsIDI3LCAyOSwgMzJ9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbMTZdID0gezEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyfTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0WzE2XSA9IHsgOCwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI4LCAzMn07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFsxNl0gPSB7IDcsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAyMCwgMjIsIDI0LCAyNywgMzF9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbMTZdID0geyA2LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTksIDIxLCAyMywgMjYsIDMwfTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4WzE2XSA9IHsgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE4LCAyMCwgMjMsIDI3LCAzMX07CisvL0B9CisKKworLyohCisgIFxuYW1lICAgV2hpdGVuaW5nCisgIFxicmllZiAgQ29lZmZpY2llbnRzIGZvciBzcGVjdHJhbCB3aGl0ZW5pbmcgaW4gdGhlIHRyYW5zcG9zZXIKKyovCisvL0B7CisvKiEgQXNzaWdubWVudCBvZiB3aGl0ZW5pbmcgdHVuaW5nIGRlcGVuZGluZyBvbiB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLworY29uc3QgVVNIT1JUIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNJbmRleFtOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFU10gPSB7CisgIDAsCisgIDUwMDAsCisgIDYwMDAsCisgIDY1MDAsCisgIDcwMDAsCisgIDc1MDAsCisgIDgwMDAsCisgIDkwMDAsCisgIDEwMDAwCit9OworCisvKiEKKyAgXGJyaWVmIFdoaXRoZW5pbmcgbGV2ZWxzIHR1bmluZyB0YWJsZQorCisgIFdpdGggdGhlIGN1cnJlbnQgdHVuaW5nLCB0aGVyZSBhcmUgc29tZSByZWR1bmRhbnQgZW50cmllczoKKworICBcbGkgIE5VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTIGNhbiBiZSByZWR1Y2VkIGJ5IDMsCisgIFxsaSAgdGhlIGZpcnN0IGNvbG91bW4gY2FuIGJlIGVsaW1pbmF0ZWQuCisKKyovCitjb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdWzZdID0geworICAvKiBPRkZfTEVWRUwsIFRSQU5TSVRJT05fTEVWRUwsIExPV19MRVZFTCwgTUlEX0xFVkVMLCBISUdIX0xFVkVMICovCisgIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogPCA1MDAwICovCisgIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogNTAwMCA8IDYwMDAgKi8KKyAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA2MDAwIDwgNjUwMCAqLworICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDY1MDAgPCA3MDAwICovCisgIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogNzAwMCA8IDc1MDAgKi8KKyAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA3NTAwIDwgODAwMCAqLworICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDgwMDAgPCA5MDAwICovCisgIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogOTAwMCA8IDEwMDAwICovCisgIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogPiAxMDAwMCAqLworfTsKKworCisvL0B9CisKKworLyohCisgIFxuYW1lICAgRW52QWRqCisgIFxicmllZiAgQ29uc3RhbnRzIGFuZCB0YWJsZXMgdXNlZCBmb3IgZW52ZWxvcGUgYWRqdXN0bWVudAorKi8KKy8vQHsKKworLyohIE1hbnRpc3NhcyBvZiBnYWluIGxpbWl0cyAqLworY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF0gPQoreworICBGTDJGWENPTlNUX1NHTCgwLjUwMTE5MzIwMjVmKSwgICAvKiE8IC0zIGRCLiBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluIGZyYW1lRGF0YSBpcyAwICovCisgIEZMMkZYQ09OU1RfU0dMKDAuNWYpLCAgICAgICAgICAgIC8qITwgMCBkQi4gIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4gZnJhbWVEYXRhIGlzIDEgKi8KKyAgRkwyRlhDT05TVF9TR0woMC45OTc2MzQ2MjU4ZiksICAgLyohPCArMyBkQi4gR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbiBmcmFtZURhdGEgaXMgMiAqLworICBGTDJGWENPTlNUX1NHTCgwLjY3NzYyNjM1NzhmKSAgICAvKiE8IEluZi4gICBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluIGZyYW1lRGF0YSBpcyAzICovCit9OworCisvKiEgRXhwb25lbnRzIG9mIGdhaW4gbGltaXRzICovCitjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVs0XSA9Cit7CisgIDAsIDEsIDEsIDY3Cit9OworCisvKiEgQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgKi8KK2NvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0WzRdID0KK3sKKyAgRkwyRlhDT05TVF9TR0woMS4wZiAvIDQuMGYpLAorICBGTDJGWENPTlNUX1NHTCgxLjJmIC8gNC4wZiksCisgIEZMMkZYQ09OU1RfU0dMKDIuMGYgLyA0LjBmKSwKKyAgRkwyRlhDT05TVF9TR0woMy4wZiAvIDQuMGYpCit9OworCisvKiEgUmF0aW8gb2Ygb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgZm9yIHRoZSBmaXJzdCA0IHRpbWVzbG90cyBvZiBhbiBlbnZlbG9wZSAqLworY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XSA9IHsKKyAgRkwyRlhDT05TVF9TR0woMC42NjY2NjY2NjY2NjY2NmYpLAorICBGTDJGWENPTlNUX1NHTCgwLjM2NTE2MzgzNDI3MDg0ZiksCisgIEZMMkZYQ09OU1RfU0dMKDAuMTQ2OTk0MzM1MjA4MzVmKSwKKyAgRkwyRlhDT05TVF9TR0woMC4wMzE4MzA1MDA5Mzc1MWYpCit9OworCisKKy8qISBSZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBvZiByYW5kb20gbm9pc2Ugd2hpY2ggd2lsbCBiZSBtb2R1bGF0ZWQKKyAgdG8gdGhlIGRlc2lyZWQgbGV2ZWwuIEFuIGFjY3VyYWN5IG9mIDEzIGJpdHMgaXMgc3VmZmljaWVudCBmb3IgdGhlc2UKKyAgcmFuZG9tIG51bWJlcnMuCisqLworY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW1NCUl9ORl9OT19SQU5ET01fVkFMXVsyXSA9IHsKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTk0ODE1MzI3ODI5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41OTQ4MzQxNzUxNjYwN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTcxMTM0NTQzOTM5OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjc1Mjg1MTUyMjU2NDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE0MTMwMDUxNzU4NDg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk1MDkwOTgzNTc1Njg5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40NzAwNTQ5NjcwMTY5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNzM0MDU0OTcyODY0N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODA3MDUwNjM3NjkzNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjk2NTM2NjgyODQ0MDhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM4OTgxNDc4ODk2OTI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg5NTcyNjA1NzE3MDg3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMTA1MzA0OTg2MjAyMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42Njk1OTA1ODAzNjE2NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTEyNjYzNjc5NTcyOTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTE1MjI5MzgxNDAwMzRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU0ODQwNDIyOTEwMzA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc1MjIxMzY3MTc2MzAyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC40MDAwOTI1Mjg2Nzk1NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODkyOTQwMDMzNDQyMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4Njc5NzQ3MTE4NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODgxNDcwNjg2NDUzNThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1NTMxMDc2ODA1MDQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwOTA4NzU3MTU0NTkzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40NTcyNTkzMzMxNzE0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NjcxNjMyMzY0Njc2MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzI5Mjk2NzUwMjkyNzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTgwMDgyNzI3MjczMjRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1NjIyODAxMzk5MDM2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIwOTUwMzI5OTk1NTQ5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4wNzA2OTQ0MjYwMTA1MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43ODI0Nzg5ODQ3MDcwNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzQ0OTYyNTI5MjYwNTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTExNjkwMDQ0NDU4MDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2NDQwMTgyNzAzODU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0NzM5OTE4Mjk2NjIyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zMDQyNDYyOTM2OTUzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40OTQzODI2NzAxMjQ3OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjY1NjUwMzM3NDY5MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjQ2NTI5MzU1NDI0OTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNjk3MDA4MDIwNTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjE3NTE0MDk3MzMyMDA5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDc3NDkxODc2MDQyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MjU0ODY1MzQxNjU0M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzAwNTE0MTUzNDU1NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDUzNDAwMjg4MDg3NjNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NDk2NTEzMDU0Nzk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkwMDcxOTA4MDY2OTczZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45ODE2NDQ5MDc5MDEyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NzQ2MzE1NTUyODY5N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNTQ2NzE1ODA1NDgxODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDI1NzA5Mjg1MzYwMDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjAxNjg5NjI5MDY1Mzg5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAwMjg3NTA2NDQ1NzMyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44NjExMDM0OTUzMTk4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MjU0ODU4MzcyNjQ3N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTg4OTI5ODA1ODYwMzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODc4ODExMzIyNjc1NTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUxNzU2NjI3Njc4NjkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY2OTI2Nzg0NzEwMTM5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTYzNTAyNjQwOTY0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41ODEwNzczMDU3NDc2NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk5NjkzNzA4NjIxNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgzNjk5ODkzNjAyNTBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU1MjY2MjU4NjI3MTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU5NDQ5MDU3NDY1NTkxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zNDU4MTE3Nzc0MTY3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDg3OTQyMTA2MTg2NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjI2NjQyMDk1Nzc5OTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQ0MDI5NzA5MDY0NzFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc3MTQ5NzAxNDA0OTczZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMzODgzNjU4MDQyODAxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45MTU5MjI0NDI1NDQzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMzY4NzkwMTM3NjcxM2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzYyODU0OTIzNTc4ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTEzNzE4Njc5MTkxMjRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc5Nzg4MzM3MTk1MzMxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzMTgwOTcxMTk5ODQ5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC41NDQ3MzA4MDYxMDIwMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xMTkxOTIwNjAzNzE4NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODU2MzkyODE2NzEwNThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDI0Mjk4NTQ3NjA0NTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkyODgyNDAyOTcxNDIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI3ODcxODA5MDc4NjA5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMTcwODM3MTA0Njc3NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTgwMDg0MzQ0NDk2NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMjEzNTY3NDk4MTc0OTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTA3MTYyOTU2MjcwMzNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc2MTkxNjkyNTczOTA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5NzY4MTE4MzU2MjY1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45ODExMTA0MzEwMDg4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTg1NDQ1OTczNDQwN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODU5MTMyNjk4OTU1NzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTU3NjY1NjYxNjg4ODBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzMzA3MjQyMjUzNjkyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ5NDMxNzU3Njk2NDY2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zMDQ4NTc1NDg3OTYzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43MDU0MDAzNDM1NzUyOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODUyODk2NTA5MjUxOTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDY3NjYxMzE3OTEwNDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxMzI4MDgyNjE4MTI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5ODM5NTk3MzYxNzY5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNTg5MDE5OTkyNDE1NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MDc0MTgyNzgxOTQ5N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMjgzOTg2ODYxNTAxNDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzQ2MzM1NTU3MDIxODhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1MjU4MTY0NTM5NjEyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0ODkzNDE2MDI2OTM5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43ODU2NjMyNDE2ODUwN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NTU2ODU0MTA3OTY5MWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTU3ODk0OTU0NDc4NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjA0MjMxOTQ2OTY5NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgyNDExMTU4NzExMTk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NjU0NjE4NDMyNTYyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42NTE4NTQ0NjczNTg4NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44ODczNDk5MDc3MzI4OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTM2NDM2MDMxMzQ2NjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4NzA3OTA0NDIzODVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNDI3MTU5NTI5NjE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4MjkwNTA1NTQ0NDQ0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDM5NTY4NDAzNjg4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODc5Njc5ODIyMTAzOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDA1NjM3NzE5NjkzNjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjE3NjgxOTY3MjcyNDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg5MDY1MDUxOTMxODk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyNzgzMzUyNjk3NTg1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42ODY4MzcwNzcxMjc2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MDgwNjk0NDcxMDMzOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzIxNjUzNDI1MTg3MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjkyNTk4NTczNDk1NjRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYyOTI4MjQ3NzMwNjY3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjEzNjI3MDM3NDA3MzM1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yOTkzODQzNDA2NTUxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NjA1MTMyOTY4MjI0NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTE3ODE5NTg4NzkyODBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQwMTI3MTY2ODQxODZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5Mjk4NzE3MDQzNjg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQwODE2NjEwMDc1NjYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44MjM2ODI5ODYyMjc0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDAzNjA0NzE5MDE3M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTg1MTI4MzMzODY4MzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk5NzIzMzA3MDk1OTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1OTE1MzY4MjQyMjU3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5MjM3ODAwNDY2MDQwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMTQxMTEyNjU3Mjc5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzQyNDgxOTA1MjU0NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjg4MjE0NzYxMDY4ODRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjY4OTIzMDYzMTU0NTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxODUxOTk3OTgyMzE3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA5MzU4MjI4OTAxNzg1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NjA2Mjc2OTU1OTEyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNjA5OTA5NTEzMzczOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNTE2NDYxODQ5MjIyODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzEzNzMzMzI4NzM5MTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYxMTMwNzIxMTM5NjY5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ2OTUwMTQxMTc1OTE3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC40NzMzNjEyOTM3MTI5OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNzMzMzE3ODI5NjE2MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTA5OTgzMDg3MDM1MTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY3MTU2NjI5MzgxMzJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0ODQ0Nzk5MTk0MzU3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5MjExNTc0NjI4MzA2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC42NjYxNDg5MTA3OTA5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjU5MDE3NjE2OTEyMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzQ5MjIyMzkxMjkyMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODk4Nzk4NTg4MjYwODdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NTcxNTg4NTA2NDg1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyNzg1NTIxNDk0MzQ5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NzQwMTA4MjQ3NzU2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjg1NTg3MDA3NTE5MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzI2ODM3NDc3MzM4NzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDgwNjA3NzQ0MzIyNTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NDMyMTkzNDU3MTI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY4ODQ5NjAzNDA4NDQxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43Mjk2MjIwODQyNTE5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NjYwODQ0MzQyMDkxN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODUzNTk0NzkyMzM1MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODg3MzgxMjU5MDE1NzlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgxNDEyNDMwMzM4NTM1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NDgwNzY4MDQ5NjM3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44NzkzMDc3MjM1Njc4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43NDc0ODMwNzY5MDQzNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzE1NzMzMzEwNjQ5NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg1NzA2MDgxNzg5MjNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzNTI0MzAwMDI4MjI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgzNzAyNTM3MDc1MTYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40ODA4NjA2NTYwMTQyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODg0ODUwNDkyMzUzMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTcxMzkxMjg1NzQ3NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODAwOTM2MjExOTgyMzZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUxOTkyODI1MzQ3ODk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgwMjQ3NjMxNDAwNTEwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMDg0ODU5MTE5NTMyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NjY3MDEyODAwMDQ4NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzAyOTQzNzQzMDMwMzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTUzNTk5MTA0NDU1NzdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1ODk0NDI4MTY4MTQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQzMjY1NTA0MzQ0NzgzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NzA3OTI1Mjk1MDMyMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wOTMyNTg1NzIzODY4MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTI0MDQyOTM2NzA3OTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODU1MDc3MDQwMjc4NTVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY5NTA2NDY5NTAwNDUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4NjMzNDEyNjI1NDU5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yNjU1OTIwMzYyMDAyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MzMxNDMwNzk2NjUyNGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMjgwMzg0NDMzMzY5NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTQ1Mzc5MTM2NTQ0MjdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc0MTM4MTI0ODI1NTIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5MzEwMzM5ODA3NzYyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMTc1Mjc5NTk5NTQ0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44MjYxNjYzNTI4NDE3OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNTUxMjY3NzMwOTQ5MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg4OTg1NDM4NjIxNTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3OTYwODk4ODUwOTk2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0MDIxNDQ2NzUyODUxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTE5NjMwOTE0NjkzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NzAxOTAxNzM1ODQ1NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjc2ODQ5MjgwODUyNjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTI2MzE0OTE2NDkzNzhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA5MTQwMDM5NDY1NTAwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIwNTM3NzMxNDUzMTA4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MTY1ODk2NTc1MTk5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Nzc4ODIwMDM5MTIyNGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODEwMTQ2NDAwNzg5MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTM3MjI2NDgzNjI0NDNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQwNjE2OTkxNjcxMjA1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2NDY5MDA4NTk4NDQ5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42NzY4MDE4ODY4Mjk3MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDUwMjA1MjMzNzY5NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODY4NDk3NzQzNDg3NDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTgzMzM1OTg2NDc4OTlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NTAwMzgxMjg0ODUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAyNjM0MTIyMDY4NTUwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44NDMyOTE4OTM0MDY2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMDQwNjk1NzQ2MjIxM2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMDkyMTU5Njg1MzE0NDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjk1NDAwMTIxMDEyNTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTU2MTczMzI3MjA2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEyMzU4NTQyMDAxNDA0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTczMjc3OTQ3MzUzNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTU4MjUyNDczNjE1OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTYzNDk5NzM2NDI0MDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY2NDA0NTgwNDEwMDBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc5OTQyNzc4NDk2NTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0MzIzOTAyODIyODU3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMTU2NjAzOTg1Mzg5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yODU4Nzg0NjI1MzcyNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzk5MjI5NTQ1MTQ2NjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQxMjk2MDE2MTY5NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MDg5MTk3NTY1OTg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyMDYyNjI1NTgxNTg3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yODYzMTI4NTE3OTkwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTAzNTA0NzE0MzYwM2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODMzMDI3MjU2MDU2MDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjczMzA0MTA4OTIwODRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NDA0NDQzNDAyMDcyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ5MTYyNzY1Mzk4NzQzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNjQ0OTg2MzU3OTQzNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMzI1MDU2MDgxMzEzNWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk1NzUwNTQ0ODYzMTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDIzODk3ODQ0Njk1MDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1NTAxMTQyNzkwODQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgyNTQ2MTE0NjU1NjI0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44MTI1NDQ0MTkwODg4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41MTYyNzIzNDY2MDYyOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk2NDYzNjk0ODU0ODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODQ0OTA1MzM1MjA3NTJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAwMjg3ODQwNjAzMzQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0NzY4MjYxMTU4MTY2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43MDE3Njk4OTQwODQ1NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMDQ1MzAyODU3MzMyMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTYzNjE4ODIyNzAxOTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDA3MDY5NjcxNDA5ODlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY4ODgzNzU4MTkyNDI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkxMzM4OTU4ODQwNzcyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNDg3NTU4NTUwMjIzOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MTQ3MjI5MDY5MzMwMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTE5ODAwODEyNDMwODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjY1MDc0NTU2NDQ5MTlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5MDA5MDQ4MzQzODgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1ODY4MDIxNjA0ODQ4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC42ODg2NTc5MTQ1ODM5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NTY2MDMxNjgwOTY3OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk0ODQ0MDIxMjkzNjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjAwNTI1NTkyNTQ5MzRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0MjE0NTExNDA4MDIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5Njk2NDI1MzY3NDYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42NzQxNDYyNjc5MzU0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40OTU0ODIyMTE4MDA3OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDczMzkzNTM2ODQ2NjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODU5MDQzMjg4MzQwNDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE0MzIzNjUxMzg3MzYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0MTQ1NTk4MjIyNDg4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yOTI2ODI5MzU3NTY3MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wNTc1OTIyNDkyNzk1MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDM3OTM4NjE0NTg3NTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzg5MDQ5Njk4OTI3MjRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM2MzQ1MTI2Mzc0NDQxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0ODc0NDM1MzU3MTYyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wODc1MDYwNDY1NjgyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzY4Njk0NDM2MjUyN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTY0OTUyNjc4MTI1MTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTM5NjAzMDU5NDY1MTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU1NTI2OTQwNjU5OTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc4ODkxNTIzNzM0Nzc0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43MzUzODIxNTc1MjYzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjQ1MjA3MjM3MzQwNGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzA4ODk3NzM5MTk0MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODA2NjQzODk3NzY4NjBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAzNTc0OTk1NjI2MTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3MzI1NjE2OTAwOTU5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45ODcyMDY4NDY2MDQ4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40ODQwOTEzMzY5MTk2MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODE2ODkyOTYyNzEyMDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTA4Mjc3MDM2MjgyOThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY3ODY2ODYwMTE4MjE1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgxMjg0NTAzODcwODU2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNTgwODU2OTczMjU4M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NTI3OTU1NTAyNDM4MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODA3MjMzOTUxMTQzNzFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjQ3MTc0MTg1MTQ2MDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ3Nzg4NzU3MzI5MDM4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ2MzMzMTQ3ODM5Mjk1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NjM2NzU1NDc2MzIwMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zODQ4Njc0OTMwMzI0MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTkxNDM4NzU3MTY4MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjQ5NDUyNzcyMzk4MDlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzMDgxODc2OTI1ODMzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0NzgwODUxNDE0NzYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC41ODc1MzE5MTkwNTM0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTI5MDc3MjM4OTE2M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTU1MzgxMDgyMjA5NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODU1NTcwNTIwOTY1MzhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2NDkwOTIwNDc2MjExZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY0MDIwOTcwOTIzMTAyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzMyNzEwMTAyODUyMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMjM3ODEyODEzMzExMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTE0MDAzNjYwMjIxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTc5NzI0NzEzNDY5MzBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5OTI1ODM3MzYzODI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcxMDg0ODQ3ODY0MDY3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44Njg3NTkwMzUwNzMxM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMDI5MTY5OTIwMzU2NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMjYyNDAwMzQ3OTUxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjgyNjQ1NTQzNjkxMDhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI0NjY0NDEyOTUzMzg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3NjQyMjczMTE1MTgzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4wMjQxNjI3NTgwNjg2OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yNzE5MjkxNDI4ODkwNWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODIwNjg2MTk1OTA1MTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODUwODc3ODc5OTQ0NzZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg4NTQ3MzczNzYwNzU5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg5NjM2ODAyOTAxNDY5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xODE3MzA3ODE1MjIyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNjE1MjE0NTE1NjgwMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDkzNTU0NzY1NTg1MzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ4NDUxMjMwNDU2MDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU0NjY4NDE0MjI0MDkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk1OTgwNzc0MDIwMjIxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zNzA1MDk5MDYwNDA5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41OTkxMDE0MDM4MzE3MWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzAzNzM1OTQyNjI4OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTEyMjc2NjU4MjcwODFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM0NjAwNzg1ODc5NTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NDQxNDI2MTQ0MjAwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42ODc3NDQ4MTczMTAwOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zMDIzODgzNzk1NjI5OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMjY4NDMyOTEyNTEyMzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODMxMTU2NjgwMDQzNjJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ5MDcyMzM0NjEzMjQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ1MzU5NzA4NzM3Nzc1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zODk3NTk5MzA5Mzk3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NTUxNTM1ODA5OTEyMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTc3NTcxMjUyMjQxNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDUzMDU4OTQ1ODA2MDZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjE3MzI1NTUyODU5NjE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyNzcwNjcyMjUwNDk0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk0ODAzNTAyNTc0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODI4NTU0NTU2MzQyNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjQ5NDYyNDY1Mjc0NThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjg2NDU1MDcxMDQ5NjBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjEyMDE2OTIwNTc2NDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU3MTQ3MzIyMTUzMzEyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC41ODk0NzQ1NjUxNzc1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNDg0NzEzMjQ1NDM4OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDE4MTUxNDA0NTQ0NjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTYyNzY0MjIzNTg4NjFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5ODg1NjUwMjA0ODg0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjExMTM2MDk1NDkwNDQ0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC41NjY0OTYxNDEyODM4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MDQ5NDg2NjM2MTU4N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTQxMzgwMjEwMzIzMzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzUyODE5MTY3MzMwMThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc1NzI1MDc2NTM0NjQxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUzNjUwNTQ5NjQwNTg3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yMDU0MTk3MzY5MjYzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDQzNTE0NDM2OTkxOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5ODAzNzEwMjMzNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzk4MzU5MTM1NjU1OTlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI5MDc4Mjc3NjA1Nzc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM1MzkzNzc3OTIxNTIwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42Mjg1ODc3MjEwMzAzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zODc2NTY5MzM4NzEwMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDM0NDA5MDQ0Njc2ODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg1NDYzMzA0NjMyMzJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4Mjk4NTgzNzYyMzkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMDIxNTI0NjI1MjA5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4xOTUxMzAyOTE0NjkzNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDIzOTgzMjI1MTg2N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTU0NzY2NjI0MDAxMDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgzNjQ1NTQxNzkxNDNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzMzc5NjM1MzA0ODEwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcwODgxOTk0NTgzNjgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44NTIzNTQxMDU3MzMzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wODM0MjM0Nzk2NjQxMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODY0MjUwOTMwMTEyNDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDU3OTUwMjUwMjk0NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjM4ODc5Nzc5MDU5MDQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3Mjc0NDI5MzQ0NTkzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45MjA0NTEyNDczNTQ5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42MjQzMzY1MjUyNDIyMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODkxNjI1MzIyNTE4NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ5NTA5NTU1NzA1NjNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM2ODM0MzM2OTQ5MjUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NDU4Mjk4MDIwOTc1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45Mzg5MTc2MDk4ODA0NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTk2ODM1Mzc0MDM4OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTkyNjc2NTc1NjUwOTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDM3NTcwMzQzMTY5NThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk0MDYzNDcxNjE0MTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxMzMyMzM4NTM4OTYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTc0MDIyNDExNzAxOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjgzMDQ5NDk5NjM3MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzU4OTk0MTMxNzA1NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDY2MzMyMjY2NDk2MTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1MjM3MjM3Mjc0OTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI1NjQwMzYxNjAyNjYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zNjcwMzU4Mzk1NzQyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zODY1MzI2NTY0MTg3NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTE2NTMxODAzNjc5MTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzA1ODc2Mjg3MjY1OTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY5MDAwODAzNDk5MzE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwOTUyMTcxMzg2MTMyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODY1ODc1MTEzMzUyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTUwMTU3MTIwODk4NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMjkyNTA4MTQwMjk4NTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzc0NDQ5OTQzNDQ2MTVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYwMTgyMjA0Njc3NjA4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg2Nzc5NjUxMDM2MTIzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzQxODU4ODE2MzIxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjQ2ODUyMzY2NjQ3NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODg0NjE1NzQwMDM5NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTc1MDg0MDUyNzY0MTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1MTk4OTMzMDU1MTYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMjY5NjYxNjY5OTY0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC41MzQ5OTYyMTk3OTcyMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzI0MTU1MzczMTIzN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDk0Mjk1NjAyMjY0OTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgxODM4NjUyOTE5MDNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4OTM1MTQyMzM5MTM5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQwMjQ5MTU5MDA2OTMzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODA4MTM4MDA5MTEzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43Mjg1Njg5NTUzNDA0MWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMjczMzgxNDg4MzU1MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5NTA5MjI0NDcyMDlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA2MzEwODAyMzM4MzAyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0NTM5NTg3NTI5NjE4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMDQ2MTY3NzE5OTUzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNDIwOTk3NzYyODQ4OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjYyMjM4NDMxNDE2NDdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzI1Mjg1Nzk5NDAzMjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg0NzY0MzQ1NDgzNjY1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAyMzcyMzE2ODAxMjYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44OTAzOTg2MzQ4MzgxMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44ODg2NjU4MTQ4NDYwMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTU5MDMzMDg0Nzc5ODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzY3NDQ5MjcxNzM4NzNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjczNTA0MTIzOTA5ODc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAzNzQ3MjAzMTczMTkyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zMTc0NDQzNDk2NjA1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjgzNDExMTg4MzY1MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzQxMTA4Mjc1OTE2MjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDAyMTEyMjI4MDc2OTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ3ODAzODgzNzE0MTk5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM5NDIzMjE5Nzg2Mjg4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45ODI5OTE5NTg3OTUxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTk4OTc5MTM5MDA0N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzA5NjMwNzMxMjk3NTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTgwNzY3MjA1OTkzMzZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTkyNTg4MjI5MDE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2MjgxODcyMDk0Mjg5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45MzE0OTczMTA4MDc2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODMxMzE2MjU3MDQ5MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5MjM0NzIzMDI3NzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODAxNDI5OTM3Njc1NTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI2MDI0MTY5NjMzNDE3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc1OTk5NzU5ODU1NzUyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNTcxMjUxNDc0MzU2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xOTI5ODk2Mzc2ODU3NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4OTkwODQ1MDk1MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzQ2NDUxNTY5OTI0OTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg2NTU3MTcxNTc5NDUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU1NTkzODY2Njk2Mjk5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zMzQwODA0MjQzODc1MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NjE4NTk1Mzg3NDcwOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTkwMTA3MzYzNzQ3MTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDQ2MDIzOTc1NzY2MjNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY2Njk0MjY5NjkxMTk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxNjQzNjExODEwMTQ4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC42NDAxNjc5MjA3OTQ4MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xNTY0OTUzMDgzNjg1NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk1NzA1MzQ4MDQ4MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDU4NDQ1ODYwMzgxMTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYzNDMxNDY2OTQ3MzQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMDc5MTE2NDU5MjM0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNzcwNjg0NzAwNTkzMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTU4MTQzNzEwMTMyOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTg1OTAwOTA1Nzc3MjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODgyNDE3MjExMzM5ODFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwMDk5MzM1MjU0Njc4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM2ODUxODk2NzEwODUzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43ODM2ODEzMTM5MjY2NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40NTUwNjk5OTgwMjU5N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDg3MDc4MDY2NzE2OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODA5Mzg5OTQ5MTg3NDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg2ODExODgzMDgwNzEyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM5MzQ3MzA4NjU0NzA1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zOTQ2NjUyOTc0MDM3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NjgwOTQzMjExNDQ1NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTc4NzUzMjU2NDk2ODNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzI0Njc4NDA5Njc3NDZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1MDM4NTYwMjg4ODY0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg5NTYzMjE5NTg3NjI1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4xNzAwNTIzOTQyNDIxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NDY4MzA1Mzk2MjY1OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzY5MTA3OTIwMjY4NDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTYyMjY2MTc1NDkyOThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NzQzMjgxMDE2ODQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQyNjk3MTU3MDM3NTY3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQzNzM4MzU0OTk3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzAwMjMyNDEwOTk1MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk1Nzg5MDUzNjU1NjlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTQxMDY4MjYyNTczNTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI4MDU4MjU5ODI5OTkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1MzYxNDIwNjM0MDM2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44NTI1NjUyNDQ3MDU3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NDU2NzYwNzczNTU4OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNTA2MDg1NDAxMDUxMjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjU4NDYwMTU0ODAzMDBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3MjEwNzM1MTgzMjQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIzMDk1MjEzMDY3NzkxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQyNDA0ODIzNDQ0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTI0MDE0NzA5MTIxOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTY5MjY1NzA1MjQwMjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzM3NzU2NTQ4OTY1NzRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjMwODcyMTYzMjE0NzI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxNTE0OTYwNTU2MTI2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNDUyMzgzOTU3MjYzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MzIwNjYzMzM5NDgwN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzM4MTMyNjUwODYwMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzg2NjE3Nzk0NDE4OTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA1ODI2ODI4NDIwMTQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA2OTQwNzc0MTg4MDI5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMjg5ODQ2MTQ1NTA1NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzA1NDg1MzMxNjMxNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMTg1MDk5MTUwMTk4ODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDc1NjU3NjI4OTIwODRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjEwNDg4MjM4MDQ1MDA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3NzY5OTQ3NDAyMzk0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MTg4NjU4NjE4MjAzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43ODAzMDk4MjQ4MDUzOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk3OTM4NzM3Mzg2NTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTAwNDEzMTA0OTE0OTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU3NTYzMzA3NjI2MTIwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxMDM0MzM3MzUyMDk3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yODkwOTY0NjM4MzcxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjMwNzc4Mzk3MDUzNGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDIxODg5OTgzMTI1MjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDgxNDg2NTEyMzA0MzdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzMzM1MDQ5NjgxMDQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQzNTM3MDIzODgzNTg4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzA4NzM3NDQxODI2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NjYzNjQ0NTcxMTM2NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMzY3MjI4NzEyODY5MjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjUyOTE2NTQxNzI5NjFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgxMDkzMDI1NjY1Njk2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA4Nzc4MzcwMjI5MzYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNjI0MDYwMzA2MjIzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Mjc3NDA5NTM3OTA5OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODM5OTY0OTc5ODQ2MDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTU4Mzk4NDkxMzk2NDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5OTA5NjE1NzIwMjI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2MDI0NjA1NzEzOTcwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43NDY0OTQ2NDE1NTA2MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMjE0NDg5MzYwNjQ2MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzQ3NzQ1OTU1Njk4MDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjY4OTgwNjIwMDg5NTlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NzgxNjY3NDY5NTY3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc5MDQ3OTI3MDUyNjI4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQ3MjMwODcxMzA5OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wODU4ODc3NjAxOTU1MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDg3MDgzMzI3NDYyOTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5OTkwNDE1Nzk0MzJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ2MzMyMDM4MjQ3NDk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjEwOTY0MTI2MTg1MDYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43NjQ5NzAwNDk0MDE2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44OTIxMDkyOTI0MjIzOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNTczOTczODkzNjQzMzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzUyODk3MDMzNzM3NjBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1Mzc0MzE2OTc0NDk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NzA1MjE0NjUxMzM1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC41OTE3NDM5NzY4NTcxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTQwNTM3MDQyMjc1MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzUwODc5MDY2OTE4OTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjk2MTI2NzI5ODIzOTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4NjA3ODU3MzM2MjMwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI1MDM0OTExNzMwMDIzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40MDc2MTA1NjY0MDUwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MDA0NTU3MzQ0NDY5NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjY5MjkyNjY3NDA0NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg2Mjk0OTM0MDE3NDhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3NDYzNjk1MjU3MzEwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAwMTkwMjIzMzAxMzAxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45MDE0NTUwOTQwOTg1OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTc4MTM5MDM2NTQ0NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODcyNTkyODkwNDgwNDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTkyMzM1ODczNTM2NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkxNTI5NDYxNDQ3NjkyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE1Njk4NzA3NTM0MjA2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMzMwNTczODg0MDcwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNzIwNTI2Mjg1OTc2NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDcyMjMwNTEzNjgzMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODg4MDUwMDE3MzM2MjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NDk4MDEyMTg4MzUzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3MDk0MzU4MTEzMzg3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43NDkwNDkzOTUwMDUxOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTk4NTQ4MzY0MTUyMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDQ1ODUyMjg1NzQyMTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4MTIzMzc0NDQwODJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5MDU0OTU0MjU3OTkzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMxNzkxOTEzMTg4MDY0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44Mzc4MjE0NDY1MTI1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzYzNzYzMjU0NzQ2NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMzM0NTQ4MDQ5MzM4MDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODYyMzE1MTY4MDA0MDhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NzA3NTc5MzYyODI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkzMjM3OTkwMDc5NDQxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMjgyNzUyNzg0Mzk5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xODg3NDc1OTM5Nzk5N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjcyNDgwNDYyODkxNDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDM2NDYyMTEzOTA1NjlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA1MTQ2NTM4MTg3OTQ0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyNTk5NzAwMTIwNjc5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk0NzI5NTc0OTkwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzYyNTIyOTcwNzkxMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjY5NTExMjQzOTAzNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg5MDU4MjU2MjM4OTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NjAyOTU2NTU5MTc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ0NjU0NzE1NzU3Njg4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44MjEwNDkwNTQ4MzU5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTU0MDc0MTcyNDkyOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTkxODY1MTA5ODg3ODJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzIwMjMwMDEzMTI5NDdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1Mjg0NTkyMzkyOTE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyMTg2NzIzMjUzNjM3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45Mzg4NTQ0Mzc5ODE4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDg5NTMxMjYxNTI1OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTY3MzUyNDg3MzgzODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTA4OTE4MTY5Nzg2MjlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjIyMjI1OTY4ODQxMTE0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU3MTI0MDI5NzgxMjI4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40NDEzMjc4Mzc1MzQxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MjY4ODg0MDY1OTI4MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODU2OTQ5NzQyMTk1NzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODg4NDQ1MzI3MTk4NDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNzgzMDQyMDkxNzYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ2MzU2ODkyMzgzOTcwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43MjU1Njk3NDQxNTY5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTg5OTU1NTc3MDc0N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk3MTE1ODE4MzQ1MDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTgyMTE1NjAxODA0MjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc3NjM4OTc2MzcxOTY2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk0MzIxODM0ODczODE5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4wNzcxNzMyNDI1MzkyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODYzODM5OTg1NjU5NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNTYwNDk4MjkxOTQxNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODI1MjIzMDE1NjkwMzZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4Mzk4ODkzNjM5OTg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM5NDY3NDQwNDIwNTY5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC40NzU0Njk0Njg0NDkzOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42ODYxMzA0NDgzNjgxMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjU2NzUwODkzMTQ2MzFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTgzMzE2MzcxMzQ4ODBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAzMjczMzc1NDU3OTgwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc0OTMzMTA5NTY0MTA4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODY4NDE0NDc4NDczOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MTMzNzM0OTAzMDQwNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTczNDYyNjc5NDQ1NDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTY1NDkzNjQzODQwOThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUzMjgyMTU2MDYxOTQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxNDIzMjY1MDkxMzU0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTgxNzMxMDczMTE3NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MTEzMzU3MjQ4MjE0OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNTAyNTQ1MDA3NzI2MzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODg4MjkzMzgxMzQyOTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAxOTk1ODczMjM4ODU1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1MjIzNTE1MDk2NzY1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTkzMDM4MTk3MzgwNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDU3ODg5NjI5NjY0OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODI5MDc3Njc2MDA3ODNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDYzMjM0NDI1OTgxMjhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU4NjYwNzA5NjY5NzI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2ODQwNzczODA2NTgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNzU3MzczNjY2NzI2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40ODE2NjkyMDg1OTQ4NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODM0MzQyOTI0MDEzNDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTMwMjM0NTA2NDY5OTdmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1OTQ2NDkxMzA3MDI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIwNTExMDQ3MDc0ODY2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44MTUwNTQ4NDU3NDYwMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDY4NTk0Nzg2MTM2OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDQ5NzYzODA5NTQ4NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDA4OTQ1NzI2NzE1NDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5NzQ2NDc0NjI1NjcxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5ODQ2NTc4ODM4NTM3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4zOTY3NzI1NjEzMDc5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDg1NDY2ODYwOTM1OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMDc1ODg5NDg1NjMwNzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzQwOTYyMTQwODQxNzBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc2MzQzMTk4OTUxNDQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxNzQ2NjI5NDIyNjM0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43NDQ5MDEwNDY5OTYyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDcyNTkxMTc0NDYxMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjQ4ODAxMTk3OTI3NTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDEzMzY2NjA4MzA1NzFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYyMzE5NTM3NDYyNTQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzMDk4MzEzNTUyNTk5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC40MjIxNTgxNzU5NDgwN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wNzcxMjc4NzM4NTIwOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDI3MDQ1NTQxNDE4ODVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDU0MTc1MTgwNTM2NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwMDAxNzczNTY2ODE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkxNTQyMTk1MTQxMDM5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTM1MTgzMjM0ODgxNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjIwODg5Nzk4OTEzNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjM4NzIzNTkxNTE2MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDgxMjgyNTI0OTM0NDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUyODkwNTIwOTYwMjk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjYwMDQ4ODcyNDU1NTkyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC43NDIzODU1MjkxNDU4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wNDQ5MTkxNTI5MTA0NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTkwOTYxMzE0NDkyNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTk0NTExODI4NTQ0MDJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgwNDEyMzI5NjQzMTA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg4NTEzODE4MTk5NDU3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42NDYxMjYxNjEyOTczNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MjE5ODY3NDgwNDU0NGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMTE2NTc3NzA2NjMxOTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODM2NjI4MzM4MTUwNDFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1MDUzMTgyNDg4MTAxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2OTM5OTA1MTM4MDgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC42MjIyODg3MjkyODYyMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44Mjc2NzI2Mjg0NjY2MWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMDMwMDQ0NzU3ODczMTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk3Mzg4OTYzMzMzODRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3OTg3MjE0MzQxMDM0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM2NTI2MTI5Njg2NDI1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTk4Njk4MDc0NjIwMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjAyMTYxMDI5OTcxNWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODkxMTA2NDg1OTk4NzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTc4OTQyNTAzNDMwNDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjEwNDA3OTYwNTEwNTgyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc3MzU3NzkzODExNjE5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NTk2NDczNzgyMTcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNTQzNTgxODI4NTUwMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNTA4NDMyMzMxNTkxNjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTYxMDc2OTEyNjYyMDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE3MDA2MzM0NjcwNjE1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc2ODU0MDI1MzE0ODI5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yNTg3MjY3NTA2MzM2MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTg5MzMwMzkzMzgxNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMDExMTU5OTg2ODE5MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg0OTYwMTk3NDI0NDRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc5NTk4NzAyOTczMjYxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3MTM4NDExMzE4ODk0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTI2NDcwODk0ODEwMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTU0MjgyMjQwMjUzNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4Mjk2NjM3NTI4MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDE4NzcxMzg4MjQzMTFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwODAxMDE2NTQ4MTg0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjMzNjgwNjg1OTQ4MTE3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDQ2NzA1Nzc4NjgyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzI3Mjc3NzUwMTg1N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTk4NDYwMjE5MDUyNTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg3MjU3NDYyNTQ0MzNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYzMzY0OTY4NTM0NjUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE2NDczNTk0NDIzNzQ2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNjI1ODIxNzUwMDc5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTkzOTEyNTQwMDgwMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDM2NDU1OTQzNjA2MzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ4MDUwMzAxMTMyODRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5ODQ4NDcxNzAyOTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2MjQ1MTY2OTIzODA5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNjc5NjQ1ODk2ODk5OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODk4NzUxMTg5MDQ3MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODc5NzkyMjU3NDUyMTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzE3MjU3MjUwNDE2ODBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0MTgzMDk5MDIxNzg2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzNTY4OTc0NDk4NzYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45MzMxMDE4MDEyNTUzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTkxMzMwODA2ODI0NmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTM5NDE5MzE3ODIwMDJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTY0MDkzNzk2NDAzNTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg4NTkwMDAzMTg4Njc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ3NjI0NjAwNDkxMzgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk3MTQ2MzcwMzY5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44Mzg4OTk1NDI1MzQ2MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNzUzNzYzODU2Mzk5NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDA4MTQ2NDM0Mzg2MjVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzODg3Njg1NjE1ODc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjExMjg0NTI4MjA0NjM2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44NTEyNjQzNTc4MjMwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MjM0OTI1MTU0MzU0N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMzk3MDE0MjE0NDYzODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODE3Nzk2MzQxNzQzMTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM3MDI0NDY0MTg3NDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3MDcxNjU2MjIyOTU5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNjAyNDgyODI0Mjg5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNDY1NTczNTY0ODI4N2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTMzODg4MTI1NDkyMDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODQ0NzY1NDEwOTY0MjlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1Mjk4ODA0NTUyMTE5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE4NDM5NTc1NDUwOTIxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4xMTk2MDMxOTAwNjg0M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTg5OTM0Njc4MDE2OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTQyOTI1NjU1NTMxNjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODMxNjM5MDY1MTgyOTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1MDgxMTQ1Mjg2OTQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM1NTMzMjIzMTQyMjY1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC41NjcyMTk3OTc0ODM5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNDA3NjgzNjQxNDQ5OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDY4NTc3NjY3NDYwMjlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzAxNDAyMzM0NTcxOThmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3MzEyMzEzOTIzNjM1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NTQ4MTkxNjMwMDMxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODI5OTk3NjU2NzAxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45ODUxNjkwOTcxNTQyN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDEwMjU4MDAwMTk0NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDIxMTY3MzY5MzU3MzRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA5NjM4MDYyMDA4MDQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA0NDExOTg0MzgxNDU3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44NTI4MzI0OTI3NTM5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTQ3NTU2MzkyMjQyMWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODg4NjY4MDg5NTgxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk3MzUyNjcwODMyMjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ4MjAyNDI5NTM2OTg5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2ODA1NjA4ODg0MTY0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yNzU3MjU4MjQxNjU2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODYzNDc1MzMzNTgzMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjU4ODkxMjk2NTkxNjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTg4MzU2MzQxMzg1ODNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4ODM4MDg2OTUzNzMyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5OTk0MzQ5NjAwMjM2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMDY1MTM0OTYyMDY4OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NDU5MzA0NDA2NjM1NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjIxMjY0MTYzNTY5MjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTk4OTM2ODE3MDAzOTJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjIwMzIwMTA1NDEwNDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg2ODc5MTgwMzU1Mjg5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45Nzc5MDU0ODYwMDU4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjI5MDgwNjk5OTI0MmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuMTExMTI1MzQ3MzUxMjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjE0ODQ3NjMzMTMzMDFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQxMzY4MzM3MzE0MTgyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI4MjE2ODM3NjgwMzY1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4yNDEzMzAzODk5Mjk2MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MTI5NDM2MjYzMDIzOGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNjYzOTM0MTA2NzQ4ODVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDgyNDk2Nzk2MjkwODFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUzNjk3ODI5MTc4NzUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NjQ5OTAzOTM2MjI4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzIyNDczNzg4OTM0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMjA4MTMzMzU3OTgzN2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODczOTI0NzcxNDQ1NDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTI3OTYxNzM3NDAzNjFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE5MDUwMzYxMDE1NzUzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAxNjAyNjE1Mzg3MTk1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40NjM1MzQ0MTIxMjcyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTI0OTA0MTUzOTAwNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMDcwNjQwOTYzMzkwMjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ0Nzk4MDMyMDU4ODZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkyNDQ0MDg1NDg0NDY2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEwNDU3NTkwMTg3NDM2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44MzgyMjU5MzU3ODcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMTY5NTA0MzIwODg4NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzUyMTQ2ODE4MTExNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk5NTU2ODEwNDI2NjVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQyMTAyOTk4ODI5MzM5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5NzIwOTQxOTk5Mzk0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC43MjA5NDc4NjIzNzY5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNTAwODk2MTkzNDI1NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzg4NDMzMTEwMTkyNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTI4NTEzOTg5NTgyNzFmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3Mzk0MDI3ODk3NDQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2Njk1OTQ0MDg2NTYxZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTIwNjQ2MzQ3Nzk0NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NzAxMDEyMDg0OTQyOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNzY3ODk2MDk0NjE3OTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzY1MTkzNTY3MzA5NjZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgyMDAyNDIxODM2NDA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjczNTMwMTc5NTUzNzY3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC44MTkyNDk5MDAyNTcyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTY5ODQyNTI1MDU3OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMjY3MTk4NTA4NzMzNTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjg5MDMzNjk3NzYxOTNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQzMzExMjYwMzgwOTc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1MzIxODE1OTQ3NDkwZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTE5NDk3OTY3MzgzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTg3NjI0OTc2NjQyMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODA2OTIwMDEyNDg0ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzI2Mjc1NDA2NjMyMTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQzMDgwMDAzNjQ5OTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIxOTE5MDk1NjM2NjM4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC42NzcwOTQ5MTkzNzM1N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTQ3ODA3NTgyMjkwNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNTYxNTE3NzA1NjgzMTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzA2OTM4MTE3NDc3NzhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjEwODMxODYyODEwNzQ5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA4NjI4ODM3MTc0NTkyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45MTIyOTQxNzU0MDQzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NTk4NzM1MTQwODQxMGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDg5NzI4OTM5MzIyNzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTYyODkyNDYzNjI2ODZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5MDMzNjU4Njg5Njk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcxNjU2NTYzOTg3MDgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC42NTI2OTQ0NzQ3NTA5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NTkxNjAwNDgzMzkzMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjc0Mzk0NzgxNDExMjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODE2ODQzODA4NDY3OTZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ3NzcwODMyNDE2OTczZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE2Nzg5NTU2MjAzMDI1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTcxNTk3OTI2MDg3OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzU2NTc4NDAwNzY0OGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuOTA4ODk1OTM2MDI1NDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjIwMzQzOTcwNTQzODBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA2NjE4NjIyNTQ4MTc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIzODEyMjE3MjIxMzU5ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45OTQzMDI2NjkxOTcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xODgxMjU1NTMxNzU1M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTc2ODY0MDIzODE4NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjg2NjQ1MzQzNjY2MjBmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0ODEzNjUwMjIxMjY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NTA2NjQwMDI3MTI4ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTQzNDQ5NzQ5Mjg1M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43OTYwNzk3ODUwMTk4M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDkxMDQ3ODMxMzcxNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzI4OTUyMTQzNTk2NjNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5ODgxMTc1MTIwNzUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg4OTkzOTgzODMxMzU0ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC41MDQ0OTE2Njc2MDMwM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44NTk5NTA3MjQwODQzNGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNDcxNjI4OTEwNjUxMDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTg2ODAyMDQwNDk1NjlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYyMDgxNTgxMzYxODQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc1MDAwNjc2MjE4OTU2ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC40Mzg2NzAxNTI1MDgxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTk5ODA2OTI0NDMyMmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTg2MzA1NjMyMzIwNzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTM1Nzg4OTk2MDA2NjJmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYxNTEwMzYyMjc3Mzc0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg5NTE1MDE5ODk5OTk3ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMzg0MTUxNzYwMTg0M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42OTg4ODgxNTY4MTE3OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzAxMDIxNTczMDQ2NDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDc2Njc4MDg5MjIyMDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQxODgxMjg0MTgyNjgzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAyMTg4MDk4OTIyMjgyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC44NjEzNTQ1NDk0MTIzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45ODk0NzQ4MDkwOTM1OWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNjcyMjY4NjEzOTM3ODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTM0OTQzODkwMTEwMTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwNzM3Mzk4ODQyMDY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc2NTQ3MzQ5MzI1OTkyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NDA0NDk0NjY4Nzk2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wOTAyNjIwMTE1NzQxNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuODIzODYzNTI1MzQzMjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDg5MjQ3Njg4MjM2NzZmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMyMDcwNjY2Njk4NjU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUwMTQzNDIxOTA4NzUzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC41NzU5MzE2MzIyNDQ4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODk2NjQyMjkyMTUwOWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuMzYzMjYwMTg0MTk5NjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDc0NDAyNDMxMjMyMjhmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTc5MDQ0Njc0MzUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE0MTMwMjg3MzQ3NDA1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45MjM2NjAyMzMyNjkzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Nzk3OTI5ODA2ODE4MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woLTAuNDQ2MDcxNzg1MTg1OThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTQyMzMyNTIwMTYzOTRmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0MjI2ODAwOTMyOTU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcxMzI2NzU2NzQyNzUyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC4wMzY3MTkwNzE1ODMxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MzYwNjM4OTM2NjY3NWYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuNTIxNzU0MjQ2ODIxOTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODUzOTY4MjY3MzU3MDVmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk0NzAxMTM5NjkwOTU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAxODI2MzQ4MTk0MjU1ZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODc1OTYwNjk0NjA0OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MjI4ODcxNDMwMzA3M2YgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuODc0MzQ3OTQ3NDM2MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODkzOTk0OTU2NTU0MzNmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzNDEyMDQxNzU4NzQ0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxMzc0MDUyMDI0MzYzZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggMC45NjA2Mzk0MzMxNTUxMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzExNjcwOTU0MTI4MGYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTc1MzQyNTM0NTc4MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODYxNTA5MzA4MTI2ODlmIC8gOC4wKSB9LAorICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NjQyNDY2NTA0MTYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcwMTkwMDQzNDI3NTEyZiAvIDguMCkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCgtMC45NDcwNTA4OTY2NTk4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yOTU4MDA0MjgxNDMwNmYgLyA4LjApIH0sCisgIHsgRkwyRlhDT05TVF9TR0woIDAuOTE1OTk4MDcwODczNzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTgxNDc4MzAzODU3ODFmIC8gOC4wKSB9Cit9OworLy9AfQorCisvKgorc3RhdGljIGNvbnN0IEZJWFBfU0dMIGhhcm1vbmljUGhhc2UgWzJdWzRdID0geworICB7IDEuMCwgMC4wLCAtMS4wLCAgMC4wfSwKKyAgeyAwLjAsIDEuMCwgIDAuMCwgLTEuMH0KK307CisqLworCisKKy8qIFRoZSBDTERGQi04MCBpcyBub3QgbGluZWFyIHBoYXNlICh1bnN5bW1ldHJpYyksIGJ1dCB0aGUgZXhhY3QKKyAgIHBoYXNlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCBiYW5kcywgYXQgZXhhY3QgcG9zaXRpb25zCisgICAoaW4gdGhpcyBjYXNlIGV4YWN0bHkgaW4gdGhlIGZyZXF1ZW5jeSBiYW5kIGNlbnRyZSksIGNhbiBvZgorICAgY291cnNlIGJlIGRldGVybWluZWQgYW55d2F5LiBXaGlsZSB0aGUgc3RhbmRhcmQgc3ltbWV0cmljIFFNRgorICAgYmFuayBoYXMgYSBwaGFzZSBkaWZmZXJlbmNlIG9mIDAuNSpwaSwgdGhlIENMREZCLTgwCisgICBiYW5rIGhhcyB0aGUgZGlmZmVyZW5jZSAwLjIzMzcqcGkuICovCitjb25zdCBGSVhQX1NHTCBoYXJtb25pY1BoYXNlWCBbMl1bNF0gPSB7CisgIHsgRkwyRlhDT05TVF9TR0woIDcuNDIzNzM1NDk0Nzc4MTUxZS0wMDEpLCBGTDJGWENPTlNUX1NHTCgtNi42OTk4NjIwMzYxNTk0NzVlLTAwMSksCisgICAgRkwyRlhDT05TVF9TR0woLTcuNDIzNzM1NDk0Nzc4MTUyZS0wMDEpLCBGTDJGWENPTlNUX1NHTCggNi42OTk4NjIwMzYxNTk0NzRlLTAwMSkgfSwKKyAgeyBGTDJGWENPTlNUX1NHTCggNy40MjM3MzU0OTQ3NzgxNTFlLTAwMSksIEZMMkZYQ09OU1RfU0dMKCA2LjY5OTg2MjAzNjE1OTQ3NmUtMDAxKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtNy40MjM3MzU0OTQ3NzgxNTFlLTAwMSksIEZMMkZYQ09OU1RfU0dMKC02LjY5OTg2MjAzNjE1OTQ3NmUtMDAxKSB9Cit9OworCisvKiB0YWJsZXMgZm9yIFNCUiBhbmQgQUFDIExEICovCisvKiB0YWJsZSBmb3IgOCB0aW1lIHNsb3QgaW5kZXggKi8KK2NvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzggWzhdWzVdID0geworLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KKy8qIGJvcmRlcnMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLworICAgIC8qW3xULXwtLS0tLS1dKi8gIHsgMiwgMCwgMCwgMSwgLTEgfSwKKyAgICAvKlt8LVQtfC0tLS0tXSovICB7IDIsIDAsIDAsIDIsIC0xIH0sCisgICAgLypbLS18VC18LS0tLV0qLyAgeyAzLCAxLCAxLCAyLCAgNCB9LAorICAgIC8qWy0tLXxULXwtLS1dKi8gIHsgMywgMSwgMSwgMywgIDUgfSwKKyAgICAvKlstLS0tfFQtfC0tXSovICB7IDMsIDEsIDEsIDQsICA2IH0sCisgICAgLypbLS0tLS18VC0tfF0qLyAgeyAyLCAxLCAxLCA1LCAtMSB9LAorICAgIC8qWy0tLS0tLXxULXxdKi8gIHsgMiwgMSwgMSwgNiwgLTEgfSwKKyAgICAvKlstLS0tLS0tfFR8XSovICB7IDIsIDEsIDEsIDcsIC0xIH0sCit9OworCisvKiB0YWJsZSBmb3IgMTUgdGltZSBzbG90IGluZGV4ICovCitjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNSBbMTVdWzZdID0geworICAgIC8qIHRyYW5zaWVudEluZGV4ICBuRW52LCB0cmFuSWR4LCBzaG9ydEVudiwgYm9yZGVyMSwgYm9yZGVyMiwgLi4uICovCisgICAgLyogbGVuZ3RoIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KKyAgICAvKlt8VC0tLXwtLS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAorICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDUsIC0xLCAtMX0sCisgICAgLypbfC0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMiwgIDYsIC0xfSwKKyAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDQsICA4LCAtMX0sCisgICAgLypbfC0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNSwgIDksIC0xfSwKKyAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDcsIDExLCAtMX0sCisgICAgLypbfC0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOCwgMTIsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTAsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMSwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTMsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNCwgLTEsIC0xfSwKK307CisKKy8qIHRhYmxlIGZvciAxNiB0aW1lIHNsb3QgaW5kZXggKi8KK2NvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2IFsxNl1bNl0gPSB7CisgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KKyAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLworICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAorICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAorICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAorICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAorICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAorICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE1LCAtMSwgLTF9LAorfTsKKworLyohCisgIFxuYW1lIEZyYW1lSW5mb0RlZmF1bHRzCisKKyAgUHJlZGVmaW5lZCBlbnZlbG9wZSBwb3NpdGlvbnMgZm9yIHRoZSBGSVgtRklYIGNhc2UgKHN0YXRpYyBmcmFtaW5nKQorKi8KKy8vQHsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1ID0geyAwLCAxLCB7MCwgMTUsICAwLCAgMCwgIDAsIDB9LCB7MSwgMCwgMCwgMCwgMH0sIC0xLCAxLCB7MCwgMTUsICAwfSB9OworY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTUgPSB7IDAsIDIsIHswLCAgOCwgMTUsICAwLCAgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCAgOCwgMTV9IH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSA9IHsgMCwgNCwgezAsICA0LCAgOCwgMTIsIDE1LCAwfSwgezEsIDEsIDEsIDEsIDB9LCAtMSwgMiwgezAsICA4LCAxNX0gfTsKKyNpZiAoTUFYX0VOVkVMT1BFUyA+PSA4KQorY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTUgPSB7IDAsIDgsIHswLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNX0sIHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwgLTEsIDIsIHswLCA4LCAxNX0gfTsKKyNlbmRpZgorCitjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiA9IHsgMCwgMSwgezAsIDE2LCAgMCwgIDAsICAwLCAwfSwgezEsIDAsIDAsIDAsIDB9LCAtMSwgMSwgezAsIDE2LCAwfSB9OworY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTYgPSB7IDAsIDIsIHswLCAgOCwgMTYsICAwLCAgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCA4LCAxNn0gfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2ID0geyAwLCA0LCB7MCwgIDQsICA4LCAxMiwgMTYsIDB9LCB7MSwgMSwgMSwgMSwgMH0sIC0xLCAyLCB7MCwgOCwgMTZ9IH07CisKKyNpZiAoTUFYX0VOVkVMT1BFUyA+PSA4KQorY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTYgPSB7IDAsIDgsIHswLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNn0sIHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwgLTEsIDIsIHswLCA4LCAxNn0gfTsKKyNlbmRpZgorCisKKy8vQH0KKworLyohCisgIFxuYW1lIFNCUl9IdWZmbWFuVGFibGVzCisKKyAgU0JSIEh1ZmZtYW4gVGFibGUgT3ZlcnZpZXc6ICAgICAgICBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgbyBlbnZlbG9wZSBsZXZlbCwgICAxLjUgZEI6ICAgICAgICAgXG4KKyAgICAxKSAgc2JyX2h1ZmZCb29rX0VudkxldmVsMTBUWzEyMF1bMl0gICBcbgorICAgIDIpICBzYnJfaHVmZkJvb2tfRW52TGV2ZWwxMEZbMTIwXVsyXSAgIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyBvIGVudmVsb3BlIGJhbGFuY2UsIDEuNSBkQjogICAgICAgICBcbgorICAgIDMpICBzYnJfaHVmZkJvb2tfRW52QmFsYW5jZTEwVFs0OF1bMl0gIFxuCisgICAgNCkgIHNicl9odWZmQm9va19FbnZCYWxhbmNlMTBGWzQ4XVsyXSAgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorIG8gZW52ZWxvcGUgbGV2ZWwsICAgMy4wIGRCOiAgICAgICAgIFxuCisgICAgNSkgIHNicl9odWZmQm9va19FbnZMZXZlbDExVFs2Ml1bMl0gICAgXG4KKyAgICA2KSAgc2JyX2h1ZmZCb29rX0VudkxldmVsMTFGWzYyXVsyXSAgICBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCisgbyBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEI6ICAgICAgICAgXG4KKyAgICA3KSAgc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMVRbMjRdWzJdICBcbgorICAgIDgpICBzYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExRlsyNF1bMl0gIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyBvIG5vaXNlIGxldmVsLCAgICAgIDMuMCBkQjogICAgICAgICBcbgorICAgIDkpICBzYnJfaHVmZkJvb2tfTm9pc2VMZXZlbDExVFs2Ml1bMl0gIFxuCisgICAgLSkgKHNicl9odWZmQm9va19FbnZMZXZlbDExRls2Ml1bMl0gaXMgdXNlZCBmb3IgZnJlcSBkaXIpXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgorIG8gbm9pc2UgYmFsYW5jZSwgICAgMy4wIGRCOiAgICAgICAgIFxuCisgICAxMCkgIHNicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVRbMjRdWzJdXG4KKyAgICAtKSAoc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUZbMjRdWzJdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKVxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KKyAgKDEuNSBkQiBpcyBuZXZlciB1c2VkIGZvciBub2lzZSkKKworKi8KKy8vQHsKK2NvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDEwVFsxMjBdWzJdID0geworICB7ICAgMSwgICAyIH0sICAgIHsgLTY0LCAtNjUgfSwgICAgeyAgIDMsICAgNCB9LCAgICB7IC02MywgLTY2IH0sCisgIHsgICA1LCAgIDYgfSwgICAgeyAtNjIsIC02NyB9LCAgICB7ICAgNywgICA4IH0sICAgIHsgLTYxLCAtNjggfSwKKyAgeyAgIDksICAxMCB9LCAgICB7IC02MCwgLTY5IH0sICAgIHsgIDExLCAgMTIgfSwgICAgeyAtNTksIC03MCB9LAorICB7ICAxMywgIDE0IH0sICAgIHsgLTU4LCAtNzEgfSwgICAgeyAgMTUsICAxNiB9LCAgICB7IC01NywgLTcyIH0sCisgIHsgIDE3LCAgMTggfSwgICAgeyAtNzMsIC01NiB9LCAgICB7ICAxOSwgIDIxIH0sICAgIHsgLTc0LCAgMjAgfSwKKyAgeyAtNTUsIC03NSB9LCAgICB7ICAyMiwgIDI2IH0sICAgIHsgIDIzLCAgMjQgfSwgICAgeyAtNTQsIC03NiB9LAorICB7IC03NywgIDI1IH0sICAgIHsgLTUzLCAtNzggfSwgICAgeyAgMjcsICAzNCB9LCAgICB7ICAyOCwgIDI5IH0sCisgIHsgLTUyLCAtNzkgfSwgICAgeyAgMzAsICAzMSB9LCAgICB7IC04MCwgLTUxIH0sICAgIHsgIDMyLCAgMzMgfSwKKyAgeyAtODMsIC04MiB9LCAgICB7IC04MSwgLTUwIH0sICAgIHsgIDM1LCAgNTcgfSwgICAgeyAgMzYsICA0MCB9LAorICB7ICAzNywgIDM4IH0sICAgIHsgLTg4LCAtODQgfSwgICAgeyAtNDgsICAzOSB9LCAgICB7IC05MCwgLTg1IH0sCisgIHsgIDQxLCAgNDYgfSwgICAgeyAgNDIsICA0MyB9LCAgICB7IC00OSwgLTg3IH0sICAgIHsgIDQ0LCAgNDUgfSwKKyAgeyAtODksIC04NiB9LCAgICB7LTEyNCwtMTIzIH0sICAgIHsgIDQ3LCAgNTAgfSwgICAgeyAgNDgsICA0OSB9LAorICB7LTEyMiwtMTIxIH0sICAgIHstMTIwLC0xMTkgfSwgICAgeyAgNTEsICA1NCB9LCAgICB7ICA1MiwgIDUzIH0sCisgIHstMTE4LC0xMTcgfSwgICAgey0xMTYsLTExNSB9LCAgICB7ICA1NSwgIDU2IH0sICAgIHstMTE0LC0xMTMgfSwKKyAgey0xMTIsLTExMSB9LCAgICB7ICA1OCwgIDg5IH0sICAgIHsgIDU5LCAgNzQgfSwgICAgeyAgNjAsICA2NyB9LAorICB7ICA2MSwgIDY0IH0sICAgIHsgIDYyLCAgNjMgfSwgICAgey0xMTAsLTEwOSB9LCAgICB7LTEwOCwtMTA3IH0sCisgIHsgIDY1LCAgNjYgfSwgICAgey0xMDYsLTEwNSB9LCAgICB7LTEwNCwtMTAzIH0sICAgIHsgIDY4LCAgNzEgfSwKKyAgeyAgNjksICA3MCB9LCAgICB7LTEwMiwtMTAxIH0sICAgIHstMTAwLCAtOTkgfSwgICAgeyAgNzIsICA3MyB9LAorICB7IC05OCwgLTk3IH0sICAgIHsgLTk2LCAtOTUgfSwgICAgeyAgNzUsICA4MiB9LCAgICB7ICA3NiwgIDc5IH0sCisgIHsgIDc3LCAgNzggfSwgICAgeyAtOTQsIC05MyB9LCAgICB7IC05MiwgLTkxIH0sICAgIHsgIDgwLCAgODEgfSwKKyAgeyAtNDcsIC00NiB9LCAgICB7IC00NSwgLTQ0IH0sICAgIHsgIDgzLCAgODYgfSwgICAgeyAgODQsICA4NSB9LAorICB7IC00MywgLTQyIH0sICAgIHsgLTQxLCAtNDAgfSwgICAgeyAgODcsICA4OCB9LCAgICB7IC0zOSwgLTM4IH0sCisgIHsgLTM3LCAtMzYgfSwgICAgeyAgOTAsIDEwNSB9LCAgICB7ICA5MSwgIDk4IH0sICAgIHsgIDkyLCAgOTUgfSwKKyAgeyAgOTMsICA5NCB9LCAgICB7IC0zNSwgLTM0IH0sICAgIHsgLTMzLCAtMzIgfSwgICAgeyAgOTYsICA5NyB9LAorICB7IC0zMSwgLTMwIH0sICAgIHsgLTI5LCAtMjggfSwgICAgeyAgOTksIDEwMiB9LCAgICB7IDEwMCwgMTAxIH0sCisgIHsgLTI3LCAtMjYgfSwgICAgeyAtMjUsIC0yNCB9LCAgICB7IDEwMywgMTA0IH0sICAgIHsgLTIzLCAtMjIgfSwKKyAgeyAtMjEsIC0yMCB9LCAgICB7IDEwNiwgMTEzIH0sICAgIHsgMTA3LCAxMTAgfSwgICAgeyAxMDgsIDEwOSB9LAorICB7IC0xOSwgLTE4IH0sICAgIHsgLTE3LCAtMTYgfSwgICAgeyAxMTEsIDExMiB9LCAgICB7IC0xNSwgLTE0IH0sCisgIHsgLTEzLCAtMTIgfSwgICAgeyAxMTQsIDExNyB9LCAgICB7IDExNSwgMTE2IH0sICAgIHsgLTExLCAtMTAgfSwKKyAgeyAgLTksICAtOCB9LCAgICB7IDExOCwgMTE5IH0sICAgIHsgIC03LCAgLTYgfSwgICAgeyAgLTUsICAtNCB9Cit9OworCitjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMEZbMTIwXVsyXSA9IHsKKyAgeyAgIDEsICAgMiB9LCAgICB7IC02NCwgLTY1IH0sICAgIHsgICAzLCAgIDQgfSwgICAgeyAtNjMsIC02NiB9LAorICB7ICAgNSwgICA2IH0sICAgIHsgLTY3LCAtNjIgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02OCwgLTYxIH0sCisgIHsgICA5LCAgMTAgfSwgICAgeyAtNjksIC02MCB9LCAgICB7ICAxMSwgIDEzIH0sICAgIHsgLTcwLCAgMTIgfSwKKyAgeyAtNTksIC03MSB9LCAgICB7ICAxNCwgIDE2IH0sICAgIHsgLTU4LCAgMTUgfSwgICAgeyAtNzIsIC01NyB9LAorICB7ICAxNywgIDE5IH0sICAgIHsgLTczLCAgMTggfSwgICAgeyAtNTYsIC03NCB9LCAgICB7ICAyMCwgIDIzIH0sCisgIHsgIDIxLCAgMjIgfSwgICAgeyAtNTUsIC03NSB9LCAgICB7IC01NCwgLTUzIH0sICAgIHsgIDI0LCAgMjcgfSwKKyAgeyAgMjUsICAyNiB9LCAgICB7IC03NiwgLTUyIH0sICAgIHsgLTc3LCAtNTEgfSwgICAgeyAgMjgsICAzMSB9LAorICB7ICAyOSwgIDMwIH0sICAgIHsgLTUwLCAtNzggfSwgICAgeyAtNzksIC00OSB9LCAgICB7ICAzMiwgIDM2IH0sCisgIHsgIDMzLCAgMzQgfSwgICAgeyAtNDgsIC00NyB9LCAgICB7IC04MCwgIDM1IH0sICAgIHsgLTgxLCAtODIgfSwKKyAgeyAgMzcsICA0NyB9LCAgICB7ICAzOCwgIDQxIH0sICAgIHsgIDM5LCAgNDAgfSwgICAgeyAtODMsIC00NiB9LAorICB7IC00NSwgLTg0IH0sICAgIHsgIDQyLCAgNDQgfSwgICAgeyAtODUsICA0MyB9LCAgICB7IC00NCwgLTQzIH0sCisgIHsgIDQ1LCAgNDYgfSwgICAgeyAtODgsIC04NyB9LCAgICB7IC04NiwgLTkwIH0sICAgIHsgIDQ4LCAgNjYgfSwKKyAgeyAgNDksICA1NiB9LCAgICB7ICA1MCwgIDUzIH0sICAgIHsgIDUxLCAgNTIgfSwgICAgeyAtOTIsIC00MiB9LAorICB7IC00MSwgLTM5IH0sICAgIHsgIDU0LCAgNTUgfSwgICAgey0xMDUsIC04OSB9LCAgICB7IC0zOCwgLTM3IH0sCisgIHsgIDU3LCAgNjAgfSwgICAgeyAgNTgsICA1OSB9LCAgICB7IC05NCwgLTkxIH0sICAgIHsgLTQwLCAtMzYgfSwKKyAgeyAgNjEsICA2MyB9LCAgICB7IC0yMCwgIDYyIH0sICAgIHstMTE1LC0xMTAgfSwgICAgeyAgNjQsICA2NSB9LAorICB7LTEwOCwtMTA3IH0sICAgIHstMTAxLCAtOTcgfSwgICAgeyAgNjcsICA4OSB9LCAgICB7ICA2OCwgIDc1IH0sCisgIHsgIDY5LCAgNzIgfSwgICAgeyAgNzAsICA3MSB9LCAgICB7IC05NSwgLTkzIH0sICAgIHsgLTM0LCAtMjcgfSwKKyAgeyAgNzMsICA3NCB9LCAgICB7IC0yMiwgLTE3IH0sICAgIHsgLTE2LC0xMjQgfSwgICAgeyAgNzYsICA4MiB9LAorICB7ICA3NywgIDc5IH0sICAgIHstMTIzLCAgNzggfSwgICAgey0xMjIsLTEyMSB9LCAgICB7ICA4MCwgIDgxIH0sCisgIHstMTIwLC0xMTkgfSwgICAgey0xMTgsLTExNyB9LCAgICB7ICA4MywgIDg2IH0sICAgIHsgIDg0LCAgODUgfSwKKyAgey0xMTYsLTExNCB9LCAgICB7LTExMywtMTEyIH0sICAgIHsgIDg3LCAgODggfSwgICAgey0xMTEsLTEwOSB9LAorICB7LTEwNiwtMTA0IH0sICAgIHsgIDkwLCAxMDUgfSwgICAgeyAgOTEsICA5OCB9LCAgICB7ICA5MiwgIDk1IH0sCisgIHsgIDkzLCAgOTQgfSwgICAgey0xMDMsLTEwMiB9LCAgICB7LTEwMCwgLTk5IH0sICAgIHsgIDk2LCAgOTcgfSwKKyAgeyAtOTgsIC05NiB9LCAgICB7IC0zNSwgLTMzIH0sICAgIHsgIDk5LCAxMDIgfSwgICAgeyAxMDAsIDEwMSB9LAorICB7IC0zMiwgLTMxIH0sICAgIHsgLTMwLCAtMjkgfSwgICAgeyAxMDMsIDEwNCB9LCAgICB7IC0yOCwgLTI2IH0sCisgIHsgLTI1LCAtMjQgfSwgICAgeyAxMDYsIDExMyB9LCAgICB7IDEwNywgMTEwIH0sICAgIHsgMTA4LCAxMDkgfSwKKyAgeyAtMjMsIC0yMSB9LCAgICB7IC0xOSwgLTE4IH0sICAgIHsgMTExLCAxMTIgfSwgICAgeyAtMTUsIC0xNCB9LAorICB7IC0xMywgLTEyIH0sICAgIHsgMTE0LCAxMTcgfSwgICAgeyAxMTUsIDExNiB9LCAgICB7IC0xMSwgLTEwIH0sCisgIHsgIC05LCAgLTggfSwgICAgeyAxMTgsIDExOSB9LCAgICB7ICAtNywgIC02IH0sICAgIHsgIC01LCAgLTQgfQorfTsKKworY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMFRbNDhdWzJdID0geworICB7IC02NCwgICAxIH0sICAgIHsgLTYzLCAgIDIgfSwgICAgeyAtNjUsICAgMyB9LCAgICB7IC02MiwgICA0IH0sCisgIHsgLTY2LCAgIDUgfSwgICAgeyAtNjEsICAgNiB9LCAgICB7IC02NywgICA3IH0sICAgIHsgLTYwLCAgIDggfSwKKyAgeyAtNjgsICAgOSB9LCAgICB7ICAxMCwgIDExIH0sICAgIHsgLTY5LCAtNTkgfSwgICAgeyAgMTIsICAxMyB9LAorICB7IC03MCwgLTU4IH0sICAgIHsgIDE0LCAgMjggfSwgICAgeyAgMTUsICAyMSB9LCAgICB7ICAxNiwgIDE4IH0sCisgIHsgLTU3LCAgMTcgfSwgICAgeyAtNzEsIC01NiB9LCAgICB7ICAxOSwgIDIwIH0sICAgIHsgLTg4LCAtODcgfSwKKyAgeyAtODYsIC04NSB9LCAgICB7ICAyMiwgIDI1IH0sICAgIHsgIDIzLCAgMjQgfSwgICAgeyAtODQsIC04MyB9LAorICB7IC04MiwgLTgxIH0sICAgIHsgIDI2LCAgMjcgfSwgICAgeyAtODAsIC03OSB9LCAgICB7IC03OCwgLTc3IH0sCisgIHsgIDI5LCAgMzYgfSwgICAgeyAgMzAsICAzMyB9LCAgICB7ICAzMSwgIDMyIH0sICAgIHsgLTc2LCAtNzUgfSwKKyAgeyAtNzQsIC03MyB9LCAgICB7ICAzNCwgIDM1IH0sICAgIHsgLTcyLCAtNTUgfSwgICAgeyAtNTQsIC01MyB9LAorICB7ICAzNywgIDQxIH0sICAgIHsgIDM4LCAgMzkgfSwgICAgeyAtNTIsIC01MSB9LCAgICB7IC01MCwgIDQwIH0sCisgIHsgLTQ5LCAtNDggfSwgICAgeyAgNDIsICA0NSB9LCAgICB7ICA0MywgIDQ0IH0sICAgIHsgLTQ3LCAtNDYgfSwKKyAgeyAtNDUsIC00NCB9LCAgICB7ICA0NiwgIDQ3IH0sICAgIHsgLTQzLCAtNDIgfSwgICAgeyAtNDEsIC00MCB9Cit9OworCitjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTEwRls0OF1bMl0gPSB7CisgIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKKyAgeyAtNjIsICAgNSB9LCAgICB7IC02MSwgICA2IH0sICAgIHsgLTY3LCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAorICB7IC02MCwgICA5IH0sICAgIHsgIDEwLCAgMTEgfSwgICAgeyAtNjksIC01OSB9LCAgICB7IC03MCwgIDEyIH0sCisgIHsgLTU4LCAgMTMgfSwgICAgeyAgMTQsICAxNyB9LCAgICB7IC03MSwgIDE1IH0sICAgIHsgLTU3LCAgMTYgfSwKKyAgeyAtNTYsIC03MyB9LCAgICB7ICAxOCwgIDMyIH0sICAgIHsgIDE5LCAgMjUgfSwgICAgeyAgMjAsICAyMiB9LAorICB7IC03MiwgIDIxIH0sICAgIHsgLTg4LCAtODcgfSwgICAgeyAgMjMsICAyNCB9LCAgICB7IC04NiwgLTg1IH0sCisgIHsgLTg0LCAtODMgfSwgICAgeyAgMjYsICAyOSB9LCAgICB7ICAyNywgIDI4IH0sICAgIHsgLTgyLCAtODEgfSwKKyAgeyAtODAsIC03OSB9LCAgICB7ICAzMCwgIDMxIH0sICAgIHsgLTc4LCAtNzcgfSwgICAgeyAtNzYsIC03NSB9LAorICB7ICAzMywgIDQwIH0sICAgIHsgIDM0LCAgMzcgfSwgICAgeyAgMzUsICAzNiB9LCAgICB7IC03NCwgLTU1IH0sCisgIHsgLTU0LCAtNTMgfSwgICAgeyAgMzgsICAzOSB9LCAgICB7IC01MiwgLTUxIH0sICAgIHsgLTUwLCAtNDkgfSwKKyAgeyAgNDEsICA0NCB9LCAgICB7ICA0MiwgIDQzIH0sICAgIHsgLTQ4LCAtNDcgfSwgICAgeyAtNDYsIC00NSB9LAorICB7ICA0NSwgIDQ2IH0sICAgIHsgLTQ0LCAtNDMgfSwgICAgeyAtNDIsICA0NyB9LCAgICB7IC00MSwgLTQwIH0KK307CisKK2NvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExVFs2Ml1bMl0gPSB7CisgIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKKyAgeyAtNjIsICAgNSB9LCAgICB7IC02NywgICA2IH0sICAgIHsgLTYxLCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAorICB7IC02MCwgICA5IH0sICAgIHsgIDEwLCAgMTEgfSwgICAgeyAtNjksIC01OSB9LCAgICB7ICAxMiwgIDE0IH0sCisgIHsgLTcwLCAgMTMgfSwgICAgeyAtNzEsIC01OCB9LCAgICB7ICAxNSwgIDE4IH0sICAgIHsgIDE2LCAgMTcgfSwKKyAgeyAtNzIsIC01NyB9LCAgICB7IC03MywgLTc0IH0sICAgIHsgIDE5LCAgMjIgfSwgICAgeyAtNTYsICAyMCB9LAorICB7IC01NSwgIDIxIH0sICAgIHsgLTU0LCAtNzcgfSwgICAgeyAgMjMsICAzMSB9LCAgICB7ICAyNCwgIDI1IH0sCisgIHsgLTc1LCAtNzYgfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC03OCwgLTUzIH0sICAgIHsgIDI4LCAgMjkgfSwKKyAgeyAtNTIsIC05NSB9LCAgICB7IC05NCwgIDMwIH0sICAgIHsgLTkzLCAtOTIgfSwgICAgeyAgMzIsICA0NyB9LAorICB7ICAzMywgIDQwIH0sICAgIHsgIDM0LCAgMzcgfSwgICAgeyAgMzUsICAzNiB9LCAgICB7IC05MSwgLTkwIH0sCisgIHsgLTg5LCAtODggfSwgICAgeyAgMzgsICAzOSB9LCAgICB7IC04NywgLTg2IH0sICAgIHsgLTg1LCAtODQgfSwKKyAgeyAgNDEsICA0NCB9LCAgICB7ICA0MiwgIDQzIH0sICAgIHsgLTgzLCAtODIgfSwgICAgeyAtODEsIC04MCB9LAorICB7ICA0NSwgIDQ2IH0sICAgIHsgLTc5LCAtNTEgfSwgICAgeyAtNTAsIC00OSB9LCAgICB7ICA0OCwgIDU1IH0sCisgIHsgIDQ5LCAgNTIgfSwgICAgeyAgNTAsICA1MSB9LCAgICB7IC00OCwgLTQ3IH0sICAgIHsgLTQ2LCAtNDUgfSwKKyAgeyAgNTMsICA1NCB9LCAgICB7IC00NCwgLTQzIH0sICAgIHsgLTQyLCAtNDEgfSwgICAgeyAgNTYsICA1OSB9LAorICB7ICA1NywgIDU4IH0sICAgIHsgLTQwLCAtMzkgfSwgICAgeyAtMzgsIC0zNyB9LCAgICB7ICA2MCwgIDYxIH0sCisgIHsgLTM2LCAtMzUgfSwgICAgeyAtMzQsIC0zMyB9Cit9OworCitjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMUZbNjJdWzJdID0geworICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCisgIHsgLTYyLCAgIDUgfSwgICAgeyAtNjcsICAgNiB9LCAgICB7ICAgNywgICA4IH0sICAgIHsgLTYxLCAtNjggfSwKKyAgeyAgIDksICAxMCB9LCAgICB7IC02MCwgLTY5IH0sICAgIHsgIDExLCAgMTIgfSwgICAgeyAtNTksIC03MCB9LAorICB7ICAxMywgIDE0IH0sICAgIHsgLTU4LCAtNzEgfSwgICAgeyAgMTUsICAxNiB9LCAgICB7IC01NywgLTcyIH0sCisgIHsgIDE3LCAgMTkgfSwgICAgeyAtNTYsICAxOCB9LCAgICB7IC01NSwgLTczIH0sICAgIHsgIDIwLCAgMjQgfSwKKyAgeyAgMjEsICAyMiB9LCAgICB7IC03NCwgLTU0IH0sICAgIHsgLTUzLCAgMjMgfSwgICAgeyAtNzUsIC03NiB9LAorICB7ICAyNSwgIDMwIH0sICAgIHsgIDI2LCAgMjcgfSwgICAgeyAtNTIsIC01MSB9LCAgICB7ICAyOCwgIDI5IH0sCisgIHsgLTc3LCAtNzkgfSwgICAgeyAtNTAsIC00OSB9LCAgICB7ICAzMSwgIDM5IH0sICAgIHsgIDMyLCAgMzUgfSwKKyAgeyAgMzMsICAzNCB9LCAgICB7IC03OCwgLTQ2IH0sICAgIHsgLTgyLCAtODggfSwgICAgeyAgMzYsICAzNyB9LAorICB7IC04MywgLTQ4IH0sICAgIHsgLTQ3LCAgMzggfSwgICAgeyAtODYsIC04NSB9LCAgICB7ICA0MCwgIDQ3IH0sCisgIHsgIDQxLCAgNDQgfSwgICAgeyAgNDIsICA0MyB9LCAgICB7IC04MCwgLTQ0IH0sICAgIHsgLTQzLCAtNDIgfSwKKyAgeyAgNDUsICA0NiB9LCAgICB7IC0zOSwgLTg3IH0sICAgIHsgLTg0LCAtNDAgfSwgICAgeyAgNDgsICA1NSB9LAorICB7ICA0OSwgIDUyIH0sICAgIHsgIDUwLCAgNTEgfSwgICAgeyAtOTUsIC05NCB9LCAgICB7IC05MywgLTkyIH0sCisgIHsgIDUzLCAgNTQgfSwgICAgeyAtOTEsIC05MCB9LCAgICB7IC04OSwgLTgxIH0sICAgIHsgIDU2LCAgNTkgfSwKKyAgeyAgNTcsICA1OCB9LCAgICB7IC00NSwgLTQxIH0sICAgIHsgLTM4LCAtMzcgfSwgICAgeyAgNjAsICA2MSB9LAorICB7IC0zNiwgLTM1IH0sICAgIHsgLTM0LCAtMzMgfQorfTsKKworY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMVRbMjRdWzJdID0geworICB7IC02NCwgICAxIH0sICAgIHsgLTYzLCAgIDIgfSwgICAgeyAtNjUsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCisgIHsgLTYyLCAgIDUgfSwgICAgeyAtNjEsICAgNiB9LCAgICB7IC02NywgICA3IH0sICAgIHsgLTY4LCAgIDggfSwKKyAgeyAtNjAsICAgOSB9LCAgICB7ICAxMCwgIDE2IH0sICAgIHsgIDExLCAgMTMgfSwgICAgeyAtNjksICAxMiB9LAorICB7IC03NiwgLTc1IH0sICAgIHsgIDE0LCAgMTUgfSwgICAgeyAtNzQsIC03MyB9LCAgICB7IC03MiwgLTcxIH0sCisgIHsgIDE3LCAgMjAgfSwgICAgeyAgMTgsICAxOSB9LCAgICB7IC03MCwgLTU5IH0sICAgIHsgLTU4LCAtNTcgfSwKKyAgeyAgMjEsICAyMiB9LCAgICB7IC01NiwgLTU1IH0sICAgIHsgLTU0LCAgMjMgfSwgICAgeyAtNTMsIC01MiB9Cit9OworCitjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExRlsyNF1bMl0gPSB7CisgIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKKyAgeyAtNjIsICAgNSB9LCAgICB7IC02MSwgICA2IH0sICAgIHsgLTY3LCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAorICB7IC02MCwgICA5IH0sICAgIHsgIDEwLCAgMTMgfSwgICAgeyAtNjksICAxMSB9LCAgICB7IC01OSwgIDEyIH0sCisgIHsgLTU4LCAtNzYgfSwgICAgeyAgMTQsICAxNyB9LCAgICB7ICAxNSwgIDE2IH0sICAgIHsgLTc1LCAtNzQgfSwKKyAgeyAtNzMsIC03MiB9LCAgICB7ICAxOCwgIDIxIH0sICAgIHsgIDE5LCAgMjAgfSwgICAgeyAtNzEsIC03MCB9LAorICB7IC01NywgLTU2IH0sICAgIHsgIDIyLCAgMjMgfSwgICAgeyAtNTUsIC01NCB9LCAgICB7IC01MywgLTUyIH0KK307CisKK2NvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUxldmVsMTFUWzYyXVsyXSA9IHsKKyAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAorICB7IC02MiwgICA1IH0sICAgIHsgLTY3LCAgIDYgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02MSwgLTY4IH0sCisgIHsgICA5LCAgMzAgfSwgICAgeyAgMTAsICAxNSB9LCAgICB7IC02MCwgIDExIH0sICAgIHsgLTY5LCAgMTIgfSwKKyAgeyAgMTMsICAxNCB9LCAgICB7IC01OSwgLTUzIH0sICAgIHsgLTk1LCAtOTQgfSwgICAgeyAgMTYsICAyMyB9LAorICB7ICAxNywgIDIwIH0sICAgIHsgIDE4LCAgMTkgfSwgICAgeyAtOTMsIC05MiB9LCAgICB7IC05MSwgLTkwIH0sCisgIHsgIDIxLCAgMjIgfSwgICAgeyAtODksIC04OCB9LCAgICB7IC04NywgLTg2IH0sICAgIHsgIDI0LCAgMjcgfSwKKyAgeyAgMjUsICAyNiB9LCAgICB7IC04NSwgLTg0IH0sICAgIHsgLTgzLCAtODIgfSwgICAgeyAgMjgsICAyOSB9LAorICB7IC04MSwgLTgwIH0sICAgIHsgLTc5LCAtNzggfSwgICAgeyAgMzEsICA0NiB9LCAgICB7ICAzMiwgIDM5IH0sCisgIHsgIDMzLCAgMzYgfSwgICAgeyAgMzQsICAzNSB9LCAgICB7IC03NywgLTc2IH0sICAgIHsgLTc1LCAtNzQgfSwKKyAgeyAgMzcsICAzOCB9LCAgICB7IC03MywgLTcyIH0sICAgIHsgLTcxLCAtNzAgfSwgICAgeyAgNDAsICA0MyB9LAorICB7ICA0MSwgIDQyIH0sICAgIHsgLTU4LCAtNTcgfSwgICAgeyAtNTYsIC01NSB9LCAgICB7ICA0NCwgIDQ1IH0sCisgIHsgLTU0LCAtNTIgfSwgICAgeyAtNTEsIC01MCB9LCAgICB7ICA0NywgIDU0IH0sICAgIHsgIDQ4LCAgNTEgfSwKKyAgeyAgNDksICA1MCB9LCAgICB7IC00OSwgLTQ4IH0sICAgIHsgLTQ3LCAtNDYgfSwgICAgeyAgNTIsICA1MyB9LAorICB7IC00NSwgLTQ0IH0sICAgIHsgLTQzLCAtNDIgfSwgICAgeyAgNTUsICA1OCB9LCAgICB7ICA1NiwgIDU3IH0sCisgIHsgLTQxLCAtNDAgfSwgICAgeyAtMzksIC0zOCB9LCAgICB7ICA1OSwgIDYwIH0sICAgIHsgLTM3LCAtMzYgfSwKKyAgeyAtMzUsICA2MSB9LCAgICB7IC0zNCwgLTMzIH0KK307CisKK2NvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVRbMjRdWzJdID0geworICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7ICAgNCwgICA5IH0sCisgIHsgLTY2LCAgIDUgfSwgICAgeyAtNjIsICAgNiB9LCAgICB7ICAgNywgICA4IH0sICAgIHsgLTc2LCAtNzUgfSwKKyAgeyAtNzQsIC03MyB9LCAgICB7ICAxMCwgIDE3IH0sICAgIHsgIDExLCAgMTQgfSwgICAgeyAgMTIsICAxMyB9LAorICB7IC03MiwgLTcxIH0sICAgIHsgLTcwLCAtNjkgfSwgICAgeyAgMTUsICAxNiB9LCAgICB7IC02OCwgLTY3IH0sCisgIHsgLTYxLCAtNjAgfSwgICAgeyAgMTgsICAyMSB9LCAgICB7ICAxOSwgIDIwIH0sICAgIHsgLTU5LCAtNTggfSwKKyAgeyAtNTcsIC01NiB9LCAgICB7ICAyMiwgIDIzIH0sICAgIHsgLTU1LCAtNTQgfSwgICAgeyAtNTMsIC01MiB9Cit9OworLy9AfQorCisKKworCisvKiEKKyAgXG5hbWUgIHBhcmFtZXRyaWMgc3RlcmVvCisgIFxicmllZiBjb25zdGFudHMgdXNlZCBieSB0aGUgcGFyYW1ldHJpYyBzdGVyZW8gcGFydCBvZiB0aGUgZGVjb2RlcgorCisqLworCisKKy8qIGNvbnN0YW50cyB1c2VkIGluIHBzYml0ZGVjLmNwcCAqLworCisvKiBGSVhfQk9SREVSIGNhbiBoYXZlIDAsIDEsIDIsIDQgZW52ZWxvcGVzICovCitjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hRml4Tm9FbnZEZWNvZGVbNF0gPSB7MCwgMSwgMiwgNH07CisKKworLyogSUlEICYgSUNDIEh1ZmZtYW4gY29kZWJvb2tzICovCitjb25zdCBTQ0hBUiBhQm9va1BzSWlkVGltZURlY29kZVsyOF1bMl0gPSB7CisgIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKKyAgeyAtNjIsICAgNSB9LCAgICB7IC02NywgICA2IH0sICAgIHsgLTYxLCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAorICB7IC02MCwgICA5IH0sICAgIHsgLTY5LCAgMTAgfSwgICAgeyAtNTksICAxMSB9LCAgICB7IC03MCwgIDEyIH0sCisgIHsgLTU4LCAgMTMgfSwgICAgeyAtNTcsICAxNCB9LCAgICB7IC03MSwgIDE1IH0sICAgIHsgIDE2LCAgMTcgfSwKKyAgeyAtNTYsIC03MiB9LCAgICB7ICAxOCwgIDIxIH0sICAgIHsgIDE5LCAgMjAgfSwgICAgeyAtNTUsIC03OCB9LAorICB7IC03NywgLTc2IH0sICAgIHsgIDIyLCAgMjUgfSwgICAgeyAgMjMsICAyNCB9LCAgICB7IC03NSwgLTc0IH0sCisgIHsgLTczLCAtNTQgfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC01MywgLTUyIH0sICAgIHsgLTUxLCAtNTAgfQorfTsKKworY29uc3QgU0NIQVIgYUJvb2tQc0lpZEZyZXFEZWNvZGVbMjhdWzJdID0geworICB7IC02NCwgICAxIH0sICAgIHsgICAyLCAgIDMgfSwgICAgeyAtNjMsIC02NSB9LCAgICB7ICAgNCwgICA1IH0sCisgIHsgLTYyLCAtNjYgfSwgICAgeyAgIDYsICAgNyB9LCAgICB7IC02MSwgLTY3IH0sICAgIHsgICA4LCAgIDkgfSwKKyAgeyAtNjgsIC02MCB9LCAgICB7IC01OSwgIDEwIH0sICAgIHsgLTY5LCAgMTEgfSwgICAgeyAtNTgsICAxMiB9LAorICB7IC03MCwgIDEzIH0sICAgIHsgLTcxLCAgMTQgfSwgICAgeyAtNTcsICAxNSB9LCAgICB7ICAxNiwgIDE3IH0sCisgIHsgLTU2LCAtNzIgfSwgICAgeyAgMTgsICAxOSB9LCAgICB7IC01NSwgLTU0IH0sICAgIHsgIDIwLCAgMjEgfSwKKyAgeyAtNzMsIC01MyB9LCAgICB7ICAyMiwgIDI0IH0sICAgIHsgLTc0LCAgMjMgfSwgICAgeyAtNzUsIC03OCB9LAorICB7ICAyNSwgIDI2IH0sICAgIHsgLTc3LCAtNzYgfSwgICAgeyAtNTIsICAyNyB9LCAgICB7IC01MSwgLTUwIH0KK307CisKK2NvbnN0IFNDSEFSIGFCb29rUHNJY2NUaW1lRGVjb2RlWzE0XVsyXSA9IHsKKyAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjIsICAgNCB9LAorICB7IC02NiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02MCwgICA4IH0sCisgIHsgLTY4LCAgIDkgfSwgICAgeyAtNTksICAxMCB9LCAgICB7IC02OSwgIDExIH0sICAgIHsgLTU4LCAgMTIgfSwKKyAgeyAtNzAsICAxMyB9LCAgICB7IC03MSwgLTU3IH0KK307CisKK2NvbnN0IFNDSEFSIGFCb29rUHNJY2NGcmVxRGVjb2RlWzE0XVsyXSA9IHsKKyAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjIsICAgNCB9LAorICB7IC02NiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02MCwgICA4IH0sCisgIHsgLTU5LCAgIDkgfSwgICAgeyAtNjgsICAxMCB9LCAgICB7IC01OCwgIDExIH0sICAgIHsgLTY5LCAgMTIgfSwKKyAgeyAtNTcsICAxMyB9LCAgICB7IC03MCwgLTcxIH0KK307CisKKy8qIElJRC1maW5lIEh1ZmZtYW4gY29kZWJvb2tzICovCisKK2NvbnN0IFNDSEFSIGFCb29rUHNJaWRGaW5lVGltZURlY29kZVs2MF1bMl0gPSB7CisgIHsgICAxLCAtNjQgfSwgICAgeyAtNjMsICAgMiB9LCAgICB7ICAgMywgLTY1IH0sICAgIHsgICA0LCAgNTkgfSwKKyAgeyAgIDUsICAgNyB9LCAgICB7ICAgNiwgLTY3IH0sICAgIHsgLTY4LCAtNjAgfSwgICAgeyAtNjEsICAgOCB9LAorICB7ICAgOSwgIDExIH0sICAgIHsgLTU5LCAgMTAgfSwgICAgeyAtNzAsIC01OCB9LCAgICB7ICAxMiwgIDQxIH0sCisgIHsgIDEzLCAgMjAgfSwgICAgeyAgMTQsIC03MSB9LCAgICB7IC01NSwgIDE1IH0sICAgIHsgLTUzLCAgMTYgfSwKKyAgeyAgMTcsIC03NyB9LCAgICB7ICAxOCwgIDE5IH0sICAgIHsgLTg1LCAtODQgfSwgICAgeyAtNDYsIC00NSB9LAorICB7IC01NywgIDIxIH0sICAgIHsgIDIyLCAgNDAgfSwgICAgeyAgMjMsICAyOSB9LCAgICB7IC01MSwgIDI0IH0sCisgIHsgIDI1LCAgMjYgfSwgICAgeyAtODMsIC04MiB9LCAgICB7ICAyNywgIDI4IH0sICAgIHsgLTkwLCAtMzggfSwKKyAgeyAtOTIsIC05MSB9LCAgICB7ICAzMCwgIDM3IH0sICAgIHsgIDMxLCAgMzQgfSwgICAgeyAgMzIsICAzMyB9LAorICB7IC0zNSwgLTM0IH0sICAgIHsgLTM3LCAtMzYgfSwgICAgeyAgMzUsICAzNiB9LCAgICB7IC05NCwgLTkzIH0sCisgIHsgLTg5LCAtMzkgfSwgICAgeyAgMzgsIC03OSB9LCAgICB7ICAzOSwgLTgxIH0sICAgIHsgLTg4LCAtNDAgfSwKKyAgeyAtNzQsIC01NCB9LCAgICB7ICA0MiwgLTY5IH0sICAgIHsgIDQzLCAgNDQgfSwgICAgeyAtNzIsIC01NiB9LAorICB7ICA0NSwgIDUyIH0sICAgIHsgIDQ2LCAgNTAgfSwgICAgeyAgNDcsIC03NiB9LCAgICB7IC00OSwgIDQ4IH0sCisgIHsgLTQ3LCAgNDkgfSwgICAgeyAtODcsIC00MSB9LCAgICB7IC01MiwgIDUxIH0sICAgIHsgLTc4LCAtNTAgfSwKKyAgeyAgNTMsIC03MyB9LCAgICB7ICA1NCwgLTc1IH0sICAgIHsgIDU1LCAgNTcgfSwgICAgeyAgNTYsIC04MCB9LAorICB7IC04NiwgLTQyIH0sICAgIHsgLTQ4LCAgNTggfSwgICAgeyAtNDQsIC00MyB9LCAgICB7IC02NiwgLTYyIH0KK307CisKKworY29uc3QgU0NIQVIgYUJvb2tQc0lpZEZpbmVGcmVxRGVjb2RlWzYwXVsyXSA9IHsKKyAgeyAgIDEsIC02NCB9LCAgICB7ICAgMiwgICA0IH0sICAgIHsgICAzLCAtNjUgfSwgICAgeyAtNjYsIC02MiB9LAorICB7IC02MywgICA1IH0sICAgIHsgICA2LCAgIDcgfSwgICAgeyAtNjcsIC02MSB9LCAgICB7ICAgOCwgICA5IH0sCisgIHsgLTY4LCAtNjAgfSwgICAgeyAgMTAsICAxMSB9LCAgICB7IC02OSwgLTU5IH0sICAgIHsgIDEyLCAgMTMgfSwKKyAgeyAtNzAsIC01OCB9LCAgICB7ICAxNCwgIDE4IH0sICAgIHsgLTU3LCAgMTUgfSwgICAgeyAgMTYsIC03MiB9LAorICB7IC01NCwgIDE3IH0sICAgIHsgLTc1LCAtNTMgfSwgICAgeyAgMTksICAzNyB9LCAgICB7IC01NiwgIDIwIH0sCisgIHsgIDIxLCAtNzMgfSwgICAgeyAgMjIsICAyOSB9LCAgICB7ICAyMywgLTc2IH0sICAgIHsgIDI0LCAtNzggfSwKKyAgeyAgMjUsICAyOCB9LCAgICB7ICAyNiwgIDI3IH0sICAgIHsgLTg1LCAtNDMgfSwgICAgeyAtODMsIC00NSB9LAorICB7IC04MSwgLTQ3IH0sICAgIHsgLTUyLCAgMzAgfSwgICAgeyAtNTAsICAzMSB9LCAgICB7ICAzMiwgLTc5IH0sCisgIHsgIDMzLCAgMzQgfSwgICAgeyAtODIsIC00NiB9LCAgICB7ICAzNSwgIDM2IH0sICAgIHsgLTkwLCAtODkgfSwKKyAgeyAtOTIsIC05MSB9LCAgICB7ICAzOCwgLTcxIH0sICAgIHsgLTU1LCAgMzkgfSwgICAgeyAgNDAsIC03NCB9LAorICB7ICA0MSwgIDUwIH0sICAgIHsgIDQyLCAtNzcgfSwgICAgeyAtNDksICA0MyB9LCAgICB7ICA0NCwgIDQ3IH0sCisgIHsgIDQ1LCAgNDYgfSwgICAgeyAtODYsIC00MiB9LCAgICB7IC04OCwgLTg3IH0sICAgIHsgIDQ4LCAgNDkgfSwKKyAgeyAtMzksIC0zOCB9LCAgICB7IC00MSwgLTQwIH0sICAgIHsgLTUxLCAgNTEgfSwgICAgeyAgNTIsICA1OSB9LAorICB7ICA1MywgIDU2IH0sICAgIHsgIDU0LCAgNTUgfSwgICAgeyAtMzUsIC0zNCB9LCAgICB7IC0zNywgLTM2IH0sCisgIHsgIDU3LCAgNTggfSwgICAgeyAtOTQsIC05MyB9LCAgICB7IC04NCwgLTQ0IH0sICAgIHsgLTgwLCAtNDggfQorfTsKKworLyogY29uc3RhbnRzIHVzZWQgaW4gcHNkZWMuY3BwICovCisKK2NvbnN0IEZJWFBfREJMIGRlY2F5U2NhbGVGYWN0VGFibGVbNjRdID0geworCisgRkwyRlhDT05TVF9EQkwoMS4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgxLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMS4wMDAwMDApLAorIEZMMkZYQ09OU1RfREJMKDAuOTUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC45MDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjg1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuODAwMDAwKSwKKyBGTDJGWENPTlNUX0RCTCgwLjc1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNzAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYwMDAwMCksCisgRkwyRlhDT05TVF9EQkwoMC41NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNDUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC40MDAwMDApLAorIEZMMkZYQ09OU1RfREJMKDAuMzUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4zMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjI1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMjAwMDAwKSwKKyBGTDJGWENPTlNUX0RCTCgwLjE1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMTAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wNTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCisgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAorIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKKyBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCisgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAorIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKKyBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCisgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAorIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKKyBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCisgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApIH07CisKKy8qIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyAzIHRhYmxlcyBhcmUgc2hpZnRldCByaWdodCBieSAxICEgKi8KK2NvbnN0IEZJWFBfREJMIFNjYWxlRmFjdG9yc1tOT19JSURfTEVWRUxTXSA9IHsKKworICAgIDB4NWE1ZGVkMDAsIDB4NTljZDA0MDAsIDB4NThjMjk2ODAsIDB4NTY0YzJlODAsIDB4NTJhM2Q0ODAsCisgICAgMHg0YzhiZTA4MCwgMHg0NmRmMzA4MCwgMHg0MDAwMDAwMCwgMHgzODRiYTVjMCwgMHgzMDRjMjk4MCwKKyAgICAweDI0ZTlmNjQwLCAweDFiNGEyOTQwLCAweDExYjVjMGEwLCAweDBiNGUyNTQwLCAweDA1MTRlYTkwCit9OworCitjb25zdCBGSVhQX0RCTCBTY2FsZUZhY3RvcnNGaW5lW05PX0lJRF9MRVZFTFNfRklORV0gPSB7CisKKyAgICAweDVhODI1YzAwLCAweDVhODIxYzAwLCAweDVhODE1MTAwLCAweDVhN2VkMDAwLCAweDVhNzZlNjAwLAorICAgIDB4NWE1ZGVkMDAsIDB4NWEzOWI4ODAsIDB4NTlmMWZkMDAsIDB4NTk2NGQ2ODAsIDB4NTg1MmNhMDAsCisgICAgMHg1NjRjMmU4MCwgMHg1NDE3NDQ4MCwgMHg1MGVhNzUwMCwgMHg0YzhiZTA4MCwgMHg0NmRmMzA4MCwKKyAgICAweDQwMDAwMDAwLCAweDM4NGJhNWMwLCAweDMwNGMyOTgwLCAweDI4OGRkMjQwLCAweDIxN2EyOTAwLAorICAgIDB4MWI0YTI5NDAsIDB4MTNjNWVjZTAsIDB4MGUyYjAwOTAsIDB4MGExNzhlZjAsIDB4MDcyYWI3OTgsCisgICAgMHgwNTE0ZWE5MCwgMHgwMmRjNTk0NCwgMHgwMTliZjg3YywgMHgwMGU3YjE3MywgMHgwMDgyNGI4YiwKKyAgICAweDAwNDk0NTY4Cit9OworY29uc3QgRklYUF9EQkwgQWxwaGFzW05PX0lDQ19MRVZFTFNdID0geworCisgICAgMHgwMDAwMDAwMCwgMHgwYjZiNWJlMCwgMHgxMjQ4NWY4MCwgMHgxZGEyZmE0MCwKKyAgICAweDI2MzdlYmMwLCAweDMyNDNmNmMwLCAweDQ2NmI3NDgwLCAweDY0ODdlZDgwCit9OworCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQorI2RlZmluZSAgRklYUF9QUyBGSVhQX1NHTAorI2RlZmluZSAgRlhQX0NBU1QoYSkgRlhfREJMMkZYX1NHTCgoRklYUF9EQkwpYSkKKyNkZWZpbmUgIEZMMkZYQ09OU1RfUFMgRkwyRlhDT05TVF9TR0wKKyNlbHNlCisjZGVmaW5lICBGSVhQX1BTIEZJWFBfREJMCisjZGVmaW5lICBGWFBfQ0FTVAorI2RlZmluZSAgRkwyRlhDT05TVF9QUyBGTDJGWENPTlNUX0RCTAorI2VuZGlmCisKK2NvbnN0IEZJWFBfUFMgYUFsbHBhc3NMaW5rRGVjYXlTZXJbTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0geworRlhQX0NBU1QoMHg1MzYyNWIwMCksIEZYUF9DQVNUKDB4NDg0OGFmMDApLCBGWFBfQ0FTVCgweDNlYTk0ZDAwKSB9OworCitjb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVRbWZbTk9fUU1GX0NIQU5ORUxTXSA9IHsKK0ZYUF9DQVNUKDB4NjhiOTIxODApLCBGWFBfQ0FTVCgweGRlMzk2OTAwKSwgRlhQX0NBU1QoMHg4MDY1MDM4MCksIEZYUF9DQVNUKDB4Y2I1MzdlNDApLCBGWFBfQ0FTVCgweDViZWI4ZjAwKSwgRlhQX0NBU1QoMHg3MmYyOTIwMCksIEZYUF9DQVNUKDB4ZjFmNDNjNTApLCBGWFBfQ0FTVCgweDgzODk2MjgwKSwKK0ZYUF9DQVNUKDB4YjliOTljMDApLCBGWFBfQ0FTVCgweDRjZGE4ZjAwKSwgRlhQX0NBU1QoMHg3YTU3NmUwMCksIEZYUF9DQVNUKDB4MDYwNzk5ZTApLCBGWFBfQ0FTVCgweDg5YmU1MjgwKSwgRlhQX0NBU1QoMHhhOWRhYjYwMCksIEZYUF9DQVNUKDB4M2JlNTFiMDApLCBGWFBfQ0FTVCgweDdlYjkxOTAwKSwKK0ZYUF9DQVNUKDB4MTlmNGY1NDApLCBGWFBfQ0FTVCgweDkyZGNiMzgwKSwgRlhQX0NBU1QoMHg5YzFhZDcwMCksIEZYUF9DQVNUKDB4Mjk3NjE5NDApLCBGWFBfQ0FTVCgweDdmZmJmNTAwKSwgRlhQX0NBU1QoMHgyZDNlYjE4MCksIEZYUF9DQVNUKDB4OWVhYjBhMDApLCBGWFBfQ0FTVCgweDkwZDBhYTgwKSwKK0ZYUF9DQVNUKDB4MTYwMWJjYzApLCBGWFBfQ0FTVCgweDdlMTgwZTgwKSwgRlhQX0NBU1QoMHgzZjZiMzk0MCksIEZYUF9DQVNUKDB4YWNkZWViMDApLCBGWFBfQ0FTVCgweDg4NDM1YjAwKSwgRlhQX0NBU1QoMHgwMjAyYTc2OCksIEZYUF9DQVNUKDB4NzkxOTRmODApLCBGWFBfQ0FTVCgweDUwMDdmZDAwKSwKK0ZYUF9DQVNUKDB4YmQxZWNmMDApLCBGWFBfQ0FTVCgweDgyYThkMTAwKSwgRlhQX0NBU1QoMHhlZGY2ZTVlMCksIEZYUF9DQVNUKDB4NzExZjM1MDApLCBGWFBfQ0FTVCgweDVlYWM0NDgwKSwgRlhQX0NBU1QoMHhjZjA0NDdjMCksIEZYUF9DQVNUKDB4ODAyNDVmODApLCBGWFBfQ0FTVCgweGRhNWNkNGMwKSwKK0ZYUF9DQVNUKDB4NjY1YzA4MDApLCBGWFBfQ0FTVCgweDZhZmJjNTAwKSwgRlhQX0NBU1QoMHhlMjFlODVlMCksIEZYUF9DQVNUKDB4ODBjNWU1MDApLCBGWFBfQ0FTVCgweGM3YjAwM2MwKSwgRlhQX0NBU1QoMHg1OTEzOWY4MCksIEZYUF9DQVNUKDB4NzRhOGU0MDApLCBGWFBfQ0FTVCgweGY1ZjUxZjQwKSwKK0ZYUF9DQVNUKDB4ODQ4OTY2ODApLCBGWFBfQ0FTVCgweGI2NjYyYjAwKSwgRlhQX0NBU1QoMHg0OTk5YjYwMCksIEZYUF9DQVNUKDB4N2I3NmEzMDApLCBGWFBfQ0FTVCgweDBhMGIwNjUwKSwgRlhQX0NBU1QoMHg4YjU3MmI4MCksIEZYUF9DQVNUKDB4YTZlYzQ1ODApLCBGWFBfQ0FTVCgweDM4NGZkYTgwKSwKK0ZYUF9DQVNUKDB4N2YzYTFmMDApLCBGWFBfQ0FTVCgweDFkZTE5ZWMwKSwgRlhQX0NBU1QoMHg5NTA0NTAwMCksIEZYUF9DQVNUKDB4OTlhM2UxODApLCBGWFBfQ0FTVCgweDI1YTMwNzQwKSwgRlhQX0NBU1QoMHg3ZmRiOWU4MCksIEZYUF9DQVNUKDB4MzBmYmRiMDApLCBGWFBfQ0FTVCgweGExNTNkNTAwKSB9OworCitjb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1RbWZbTk9fUU1GX0NIQU5ORUxTXSA9IHsKK0ZYUF9DQVNUKDB4YjY2NjNhODApLCBGWFBfQ0FTVCgweDg0ODk2MjAwKSwgRlhQX0NBU1QoMHhmNWY1MGM3MCksIEZYUF9DQVNUKDB4NzRhOGRjODApLCBGWFBfQ0FTVCgweDU5MTNhZDAwKSwgRlhQX0NBU1QoMHhjN2IwMTQ4MCksIEZYUF9DQVNUKDB4ODBjNWUzMDApLCBGWFBfQ0FTVCgweGUyMWU3M2EwKSwKK0ZYUF9DQVNUKDB4NmFmYmJhODApLCBGWFBfQ0FTVCgweDY2NWMxMzgwKSwgRlhQX0NBU1QoMHhkYTVjZTZjMCksIEZYUF9DQVNUKDB4ODAyNDYwODApLCBGWFBfQ0FTVCgweGNmMDQzNjQwKSwgRlhQX0NBU1QoMHg1ZWFjMzgwMCksIEZYUF9DQVNUKDB4NzExZjNlMDApLCBGWFBfQ0FTVCgweGVkZjZmOGEwKSwKK0ZYUF9DQVNUKDB4ODJhOGQ1MDApLCBGWFBfQ0FTVCgweGJkMWViZTgwKSwgRlhQX0NBU1QoMHg1MDA3ZWUwMCksIEZYUF9DQVNUKDB4NzkxOTU1ODApLCBGWFBfQ0FTVCgweDAyMDJiYTQwKSwgRlhQX0NBU1QoMHg4ODQzNjE4MCksIEZYUF9DQVNUKDB4YWNkZWRjODApLCBGWFBfQ0FTVCgweDNmNmIyOGMwKSwKK0ZYUF9DQVNUKDB4N2UxODExODApLCBGWFBfQ0FTVCgweDE2MDFjZjQwKSwgRlhQX0NBU1QoMHg5MGQwYjM4MCksIEZYUF9DQVNUKDB4OWVhYWZkODApLCBGWFBfQ0FTVCgweDJkM2U5ZmMwKSwgRlhQX0NBU1QoMHg3ZmZiZjU4MCksIEZYUF9DQVNUKDB4Mjk3NjJiMDApLCBGWFBfQ0FTVCgweDljMWFlMjgwKSwKK0ZYUF9DQVNUKDB4OTJkY2E5ODApLCBGWFBfQ0FTVCgweDE5ZjRlMmMwKSwgRlhQX0NBU1QoMHg3ZWI5MTY4MCksIEZYUF9DQVNUKDB4M2JlNTJiODApLCBGWFBfQ0FTVCgweGE5ZGFjNDAwKSwgRlhQX0NBU1QoMHg4OWJlNGI4MCksIEZYUF9DQVNUKDB4MDYwNzg3MTApLCBGWFBfQ0FTVCgweDdhNTc2ODgwKSwKK0ZYUF9DQVNUKDB4NGNkYTllMDApLCBGWFBfQ0FTVCgweGI5YjlhYzAwKSwgRlhQX0NBU1QoMHg4Mzg5NWUwMCksIEZYUF9DQVNUKDB4ZjFmNDI5OTApLCBGWFBfQ0FTVCgweDcyZjI4YTAwKSwgRlhQX0NBU1QoMHg1YmViOWMwMCksIEZYUF9DQVNUKDB4Y2I1MzhmNDApLCBGWFBfQ0FTVCgweDgwNjUwMjAwKSwKK0ZYUF9DQVNUKDB4ZGUzOTU2YzApLCBGWFBfQ0FTVCgweDY4YjkxNjgwKSwgRlhQX0NBU1QoMHg2OGI5MmMwMCksIEZYUF9DQVNUKDB4ZGUzOTdiNDApLCBGWFBfQ0FTVCgweDgwNjUwNTAwKSwgRlhQX0NBU1QoMHhjYjUzNmQwMCksIEZYUF9DQVNUKDB4NWJlYjgxODApLCBGWFBfQ0FTVCgweDcyZjI5YTgwKSwKK0ZYUF9DQVNUKDB4ZjFmNDRmMTApLCBGWFBfQ0FTVCgweDgzODk2NzAwKSwgRlhQX0NBU1QoMHhiOWI5OGM4MCksIEZYUF9DQVNUKDB4NGNkYTgwMDApLCBGWFBfQ0FTVCgweDdhNTc3MzgwKSwgRlhQX0NBU1QoMHgwNjA3YWNiOCksIEZYUF9DQVNUKDB4ODliZTVhMDApLCBGWFBfQ0FTVCgweGE5ZGFhODAwKSB9OworCitjb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXSA9IHsKK0ZYUF9DQVNUKDB4N2U4MDczODApLCBGWFBfQ0FTVCgweDcyYjliYjAwKSwgRlhQX0NBU1QoMHg1YzQ0ZWU4MCksIEZYUF9DQVNUKDB4M2QzOTM4YzApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCksCitGWFBfQ0FTVCgweDcyYjliYjAwKSwgRlhQX0NBU1QoMHg3ZTgwNzM4MCksIEZYUF9DQVNUKDB4YmE5MTQ3MDApLCBGWFBfQ0FTVCgweDA1MDY3N2IwKSwgRlhQX0NBU1QoMHg4OTVjYzM4MCksIEZYUF9DQVNUKDB4ODM0ZTQ5MDApIH07CisKK2NvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdID0geworRlhQX0NBU1QoMHhlYzc5MTcyMCksIEZYUF9DQVNUKDB4YzczY2EwODApLCBGWFBfQ0FTVCgweGE3NDhlYTAwKSwgRlhQX0NBU1QoMHg4Zjk3Njk4MCksIEZYUF9DQVNUKDB4MDAwMDAwMDApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKSwKK0ZYUF9DQVNUKDB4MzhjMzVmODApLCBGWFBfQ0FTVCgweDEzODZlOGUwKSwgRlhQX0NBU1QoMHg5NDc3ZDAwMCksIEZYUF9DQVNUKDB4ODAxOTQzODApLCBGWFBfQ0FTVCgweGNmZjI2MTQwKSwgRlhQX0NBU1QoMHgxY2U3MGQ0MCkgfTsKKworY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewore0ZYUF9DQVNUKDB4NjNlNTI0ODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg2ZDczYWYwMCl9LCB7RlhQX0NBU1QoMHhjN2IwMTI4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGY3YzMxY2IwKX0sIHtGWFBfQ0FTVCgweDgzODk2MjAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OGFlZTI3MDApfSwKK3tGWFBfQ0FTVCgweDAyMDJiMzMwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4OWJmYWI1MDApfSwge0ZYUF9DQVNUKDB4N2Q1NzJjODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgxODkzYjk2MCl9LCB7RlhQX0NBU1QoMHgzNGFjN2ZjMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDdhYmY3OTgwKX0sCit7RlhQX0NBU1QoMHg5OWEzZWUwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDU4ZWVhZDgwKX0sIHtGWFBfQ0FTVCgweDllYWIwNTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ZDc3ZGFlNDApfSwge0ZYUF9DQVNUKDB4M2JlNTIxNDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4MTliODUwMCl9LAore0ZYUF9DQVNUKDB4N2I3NjlkODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhiM2ExMjI4MCl9LCB7RlhQX0NBU1QoMHhmOWY4Njg3OCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDM3YzUxOWMwKX0sIHtGWFBfQ0FTVCgweDgxZTdlZjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4N2ZmMTY4ODApfSwKK3tGWFBfQ0FTVCgweGNmMDQzY2MwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4M2U4YjIzNDApfSwge0ZYUF9DQVNUKDB4NjhiOTIyODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhiOWU0YTkwMCl9LCB7RlhQX0NBU1QoMHg1ZWFjMzk4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDgwYTA1MjAwKX0sCit7RlhQX0NBU1QoMHhjMDk0Y2QwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGQwNTFkYzgwKX0sIHtGWFBfQ0FTVCgweDg1YTg5NDAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NTM0ODNiMDApfSwge0ZYUF9DQVNUKDB4MGEwYWY1ZTApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg3Y2IxYjY4MCl9LAore0ZYUF9DQVNUKDB4N2ViOTE5MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHgyMDA2ZThjMCl9LCB7RlhQX0NBU1QoMHgyZDNlYTY4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGEwZWMxYzAwKX0sIHtGWFBfQ0FTVCgweDk1MDQ0MTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODgwZDIxODApfSwKK3tGWFBfQ0FTVCgweGE0MTQ3MzAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ZjAyODI4NzApfSwge0ZYUF9DQVNUKDB4NDJlMTNmODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg2OTRjNGEwMCl9LCB7RlhQX0NBU1QoMHg3OTE5NTIwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDcxMzc0NzgwKX0sCit7RlhQX0NBU1QoMHhmMWY0MzU1MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGZmNjU5M2VhKX0sIHtGWFBfQ0FTVCgweDgwYzVlMjgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4OGUzOWVjMDApfSwge0ZYUF9DQVNUKDB4ZDY4OWU0ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg5NzY0ODEwMCl9LAore0ZYUF9DQVNUKDB4NmQyMzUzMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgxMTBhMjBjMCl9LCB7RlhQX0NBU1QoMHg1OTEzYTgwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDc4NWQ0ZjgwKX0sIHtGWFBfQ0FTVCgweGI5Yjk5YTAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NWU0NDA4ODApfSwKK3tGWFBfQ0FTVCgweDg4NDM2MTAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4ZGVjZTcwMDApfSwge0ZYUF9DQVNUKDB4MTIwOTEzMjApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4MzA5ZjgwMCl9LCB7RlhQX0NBU1QoMHg3ZjlhZmQwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGFkYTMzZjAwKX0sCit7RlhQX0NBU1QoMHgyNWEzMTcwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDMwY2MzNjAwKX0sIHtGWFBfQ0FTVCgweDkwZDBhYjgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4N2Y3Y2JlODApfSwge0ZYUF9DQVNUKDB4YTlkYWJmMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0NTE4MjU4MCl9LAore0ZYUF9DQVNUKDB4NDk5OWNiODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhjMDY4MWM4MCl9LCB7RlhQX0NBU1QoMHg3NjQxYWM4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDgwMTk0MzgwKX0sIHtGWFBfQ0FTVCgweGU5ZmUzMzAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4Yzk1MTg0YzApfSwKK3tGWFBfQ0FTVCgweDgwMjQ2MDAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NGQ1NWQ4MDApfSwge0ZYUF9DQVNUKDB4ZGUzOTZmYzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3ZTMyNDAwMCl9LCB7RlhQX0NBU1QoMHg3MTFmM2YwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDI3NWNlNDgwKX0sCit7RlhQX0NBU1QoMHg1MzIxMTcwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGE2MzQzNTgwKX0sIHtGWFBfQ0FTVCgweGIzMjU2NzgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODU5OTdiODApfSwge0ZYUF9DQVNUKDB4OGI1NzI2ODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhlODliYTY2MCl9LAore0ZYUF9DQVNUKDB4MTlmNGY3ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg2NGM0ZTEwMCl9LCB7RlhQX0NBU1QoMHg3ZmZiZjU4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDc0OTNhMzgwKX0sIHtGWFBfQ0FTVCgweDFkZTE4MTAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MDcwODk3ZjApfSwKK3tGWFBfQ0FTVCgweDhkMGQ2YTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4OTFlZDZmMDApfSwge0ZYUF9DQVNUKDB4YWZmODEzODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg5MzJkYjAwMCl9LCB7RlhQX0NBU1QoMHg1MDA3ZmIwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDA5NzBmZWIwKX0sCit7RlhQX0NBU1QoMHg3MmYyOGQwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDc1OGQ2NTAwKX0sIHtGWFBfQ0FTVCgweGUyMWU2Y2MwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NjM0MzZmODApfSwge0ZYUF9DQVNUKDB4ODAwNDBiMDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhlNjNkNzYwMCl9LAore0ZYUF9DQVNUKDB4ZTYwYjFhZTApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg4NGVhNWM4MCl9LCB7RlhQX0NBU1QoMHg3NGE4ZTEwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGE3ZjA3NTAwKX0sIHtGWFBfQ0FTVCgweDRjZGE4OTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MjlhNmQzNDApfSwKK3tGWFBfQ0FTVCgweGFjZGVkYTgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4N2U5M2Q2MDApfSwge0ZYUF9DQVNUKDB4OGVlMGM5ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg0YjY2MjY4MCl9LCB7RlhQX0NBU1QoMHgyMWM2YTI4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGM3MjU4YzgwKX0sCit7RlhQX0NBU1QoMHg3ZmRiOWYwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDgwMDZkNTAwKX0sIHtGWFBfQ0FTVCgweDE2MDFiYTYwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4YzI4MzA5NDApfSwge0ZYUF9DQVNUKDB4ODliZTRjODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg0NzFjZjEwMCl9LAore0ZYUF9DQVNUKDB4YjY2NjQ0MDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3ZjNmYjgwMCl9fTsKKworY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewore0ZYUF9DQVNUKDB4YWZmODBjODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhiZGEyOWUwMCl9LCB7RlhQX0NBU1QoMHg4ZDBkNmYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDgwNDNlZTgwKX0sIHtGWFBfQ0FTVCgweDFkZTE4YTIwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4Y2MzZTc4NDApfSwKK3tGWFBfQ0FTVCgweDdmZmJmNTAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NGZkZmMxODApfSwge0ZYUF9DQVNUKDB4MTlmNGVlNDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3ZDllNGMwMCl9LCB7RlhQX0NBU1QoMHg4YjU3MjMwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDI0NGEyOTQwKX0sCit7RlhQX0NBU1QoMHhiMzI1NmYwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGEzZjBhNTAwKX0sIHtGWFBfQ0FTVCgweDUzMjExZTAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ODY5NDQ1MDApfSwge0ZYUF9DQVNUKDB4NzExZjNhODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhlYmM3MjA0MCl9LAore0ZYUF9DQVNUKDB4ZGUzOTY2YzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg2NmI4N2UwMCl9LCB7RlhQX0NBU1QoMHg4MDI0NjA4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDczMzYyYzAwKX0sIHtGWFBfQ0FTVCgweGU5ZmUzYzQwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4MDNkMWQxMTApfSwKK3tGWFBfQ0FTVCgweDc2NDFiMDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OTA1MjBjODApfSwge0ZYUF9DQVNUKDB4NDk5OWMzODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg5NGU4MGE4MCl9LCB7RlhQX0NBU1QoMHhhOWRhYjgwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDBjYTU3MGUwKX0sCit7RlhQX0NBU1QoMHg5MGQwYjAwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDc2YzliYzgwKX0sIHtGWFBfQ0FTVCgweDI1YTMyMDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NjEzMzg1MDApfSwge0ZYUF9DQVNUKDB4N2Y5YWZjODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhlMzE4ZjA2MCl9LAore0ZYUF9DQVNUKDB4MTIwOTA5YzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4NDEyNGUwMCl9LCB7RlhQX0NBU1QoMHg4ODQzNWQ4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGFhNGQyZjgwKX0sIHtGWFBfQ0FTVCgweGI5YjlhMjAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4MmNhZTE4MDApfSwKK3tGWFBfQ0FTVCgweDU5MTNhZTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4N2YwNDA2ODApfSwge0ZYUF9DQVNUKDB4NmQyMzRlMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0OGM2YTEwMCl9LCB7RlhQX0NBU1QoMHhkNjg5ZGI4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGM0NDg2MGMwKX0sCit7RlhQX0NBU1QoMHg4MGM1ZTM4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDgwMDA1ZDAwKX0sIHtGWFBfQ0FTVCgweGYxZjQzZWIwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4YzU1YTNhMDApfSwge0ZYUF9DQVNUKDB4NzkxOTU1MDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg0OWMzZGUwMCl9LAore0ZYUF9DQVNUKDB4NDJlMTM3MDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg3ZWRjNWIwMCl9LCB7RlhQX0NBU1QoMHhhNDE0NmM4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDJiOGMyYzAwKX0sIHtGWFBfQ0FTVCgweDk1MDQ0NjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4YTk2OGMxMDApfSwKK3tGWFBfQ0FTVCgweDJkM2VhZjQwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODQ2MGZkODApfSwge0ZYUF9DQVNUKDB4N2ViOTE3ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhlNDQ2MjFlMCl9LCB7RlhQX0NBU1QoMHgwYTBhZWM4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDYxZmI1YzAwKX0sCit7RlhQX0NBU1QoMHg4NWE4OTEwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDc2NTU1NzgwKX0sIHtGWFBfQ0FTVCgweGMwOTRkNTAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MGI3MWY3OTApfSwge0ZYUF9DQVNUKDB4NWVhYzQwMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg5NDQwMWE4MCl9LAore0ZYUF9DQVNUKDB4NjhiOTFkODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg5MGVhMzk4MCl9LCB7RlhQX0NBU1QoMHhjZjA0MzQ0MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDA1MDY3YTA4KX0sIHtGWFBfQ0FTVCgweDgxZTdmMTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NzNiYjZkMDApfSwKK3tGWFBfQ0FTVCgweGY5Zjg3MWUwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NjVmZjBlMDApfSwge0ZYUF9DQVNUKDB4N2I3NmEwMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhlYTk2NjRjMCl9LCB7RlhQX0NBU1QoMHgzYmU1MThjMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDg2MzNlODgwKX0sCit7RlhQX0NBU1QoMHg5ZWFhZmYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGE0Yzg0NTAwKX0sIHtGWFBfQ0FTVCgweDk5YTNmNDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4MjU3MWVhYzApfSwge0ZYUF9DQVNUKDB4MzRhYzg4NDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3ZGQ4MmIwMCl9LAore0ZYUF9DQVNUKDB4N2Q1NzJhODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0ZWVkODQwMCl9LCB7RlhQX0NBU1QoMHgwMjAyYTljNCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGNiMjQ5NzAwKX0sIHtGWFBfQ0FTVCgweDgzODk2MDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ODAzMTgyMDApfSwKK3tGWFBfQ0FTVCgweGM3YjAxYjAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4YmVhYjc1ODApfSwge0ZYUF9DQVNUKDB4NjNlNTJhODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg0MzY0YjcwMCl9LCB7RlhQX0NBU1QoMHg2M2U1MWYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDdmYTZiZDAwKX0sCit7RlhQX0NBU1QoMHhjN2IwMGEwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDMyYTY3OTQwKX0sIHtGWFBfQ0FTVCgweDgzODk2NDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4YWYyZmQyMDApfSwge0ZYUF9DQVNUKDB4MDIwMmJjOWMpLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg4MjllNmU4MCl9LAore0ZYUF9DQVNUKDB4N2Q1NzJlODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhkY2RlNmI4MCl9LCB7RlhQX0NBU1QoMHgzNGFjNzcwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDVjZTRlMjgwKX0sIHtGWFBfQ0FTVCgweDk5YTNlODgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NzkwODljMDApfSwKK3tGWFBfQ0FTVCgweDllYWIwYjgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MTMwN2FlODApfSwge0ZYUF9DQVNUKDB4M2JlNTI5ODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg5ODkwNjg4MCl9LCB7RlhQX0NBU1QoMHg3Yjc2OWIwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDhkNTFiMzAwKX0sCit7RlhQX0NBU1QoMHhmOWY4NWYxMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGZkNjJlZTI0KX0sIHtGWFBfQ0FTVCgweDgxZTdlZTAwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NzA0Mzk2ODApfSwge0ZYUF9DQVNUKDB4Y2YwNDQ1ODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg2YTZkOTYwMCl9LAore0ZYUF9DQVNUKDB4NjhiOTI4MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhmMjI3NWY4MCl9fTsKKworY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewore0ZYUF9DQVNUKDB4N2UyZGYwMDApLCBGWFBfQ0FTVCgweDdhN2QwNTgwKSwgRlhQX0NBU1QoMHg3ZWQwM2UwMCl9LCB7RlhQX0NBU1QoMHg2ZmVjOWE4MCksIEZYUF9DQVNUKDB4NTEzM2NjODApLCBGWFBfQ0FTVCgweDc1NzNkZjAwKX0sIHtGWFBfQ0FTVCgweDU1MDYzOTAwKSwgRlhQX0NBU1QoMHgwYzhiZDM2MCksIEZYUF9DQVNUKDB4NjM2YzA0MDApfSwKK3tGWFBfQ0FTVCgweDMwODRjYTAwKSwgRlhQX0NBU1QoMHhjM2E5NDU4MCksIEZYUF9DQVNUKDB4NGEwZDY3MDApfSwge0ZYUF9DQVNUKDB4ODAwMDAwMDApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCl9LCB7RlhQX0NBU1QoMHg4MDAwMDAwMCksIEZYUF9DQVNUKDB4ODAwMDAwMDApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKX0sCit7RlhQX0NBU1QoMHg2ZmVjOWE4MCksIEZYUF9DQVNUKDB4NTEzM2NjODApLCBGWFBfQ0FTVCgweDc1NzNkZjAwKX0sIHtGWFBfQ0FTVCgweDdlMmRmMDAwKSwgRlhQX0NBU1QoMHg3YTdkMDU4MCksIEZYUF9DQVNUKDB4N2VkMDNlMDApfSwge0ZYUF9DQVNUKDB4YTRjODQyODApLCBGWFBfQ0FTVCgweGI4ZTMxMzAwKSwgRlhQX0NBU1QoMHhkNWFmMDE0MCl9LAore0ZYUF9DQVNUKDB4ZjBmNDg4YTApLCBGWFBfQ0FTVCgweDgyNzVhMTAwKSwgRlhQX0NBU1QoMHgxYTcyZTM2MCl9LCB7RlhQX0NBU1QoMHg4MGFhYTY4MCksIEZYUF9DQVNUKDB4NDcxY2VkMDApLCBGWFBfQ0FTVCgweDlkMmVhZDgwKX0sIHtGWFBfQ0FTVCgweDk0NzdkMTAwKSwgRlhQX0NBU1QoMHg3ZDhhNWYwMCksIEZYUF9DQVNUKDB4ODE1MWRmODApfX07CisKK2NvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKK3tGWFBfQ0FTVCgweGVhN2QwOGEwKSwgRlhQX0NBU1QoMHhkYWQ3ZjNjMCksIEZYUF9DQVNUKDB4ZWU5YzlmNjApfSwge0ZYUF9DQVNUKDB4YzFlNTQxNDApLCBGWFBfQ0FTVCgweDlkMGRmZTgwKSwgRlhQX0NBU1QoMHhjZDFlNzMwMCl9LCB7RlhQX0NBU1QoMHhhMDUxYTU4MCksIEZYUF9DQVNUKDB4ODA5ZGM5ODApLCBGWFBfQ0FTVCgweGFmNjFjNDAwKX0sCit7RlhQX0NBU1QoMHg4OThkNGUwMCksIEZYUF9DQVNUKDB4OGYxZDM0MDApLCBGWFBfQ0FTVCgweDk3OTg4MjgwKX0sIHtGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCksIEZYUF9DQVNUKDB4MDAwMDAwMDApfSwge0ZYUF9DQVNUKDB4MDAwMDAwMDApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCl9LAore0ZYUF9DQVNUKDB4M2UxYWJlYzApLCBGWFBfQ0FTVCgweDYyZjIwMTgwKSwgRlhQX0NBU1QoMHgzMmUxOGQwMCl9LCB7RlhQX0NBU1QoMHgxNTgyZjc2MCksIEZYUF9DQVNUKDB4MjUyODBjNDApLCBGWFBfQ0FTVCgweDExNjM2MGEwKX0sIHtGWFBfQ0FTVCgweGE2MzQzODAwKSwgRlhQX0NBU1QoMHg2YTZkOTg4MCksIEZYUF9DQVNUKDB4ODczMjdhMDApfSwKK3tGWFBfQ0FTVCgweDgwZTMyMjAwKSwgRlhQX0NBU1QoMHhlNzA3NDdjMCksIEZYUF9DQVNUKDB4ODJjMzJiMDApfSwge0ZYUF9DQVNUKDB4ZjJmNDI0MjApLCBGWFBfQ0FTVCgweDZhNmQ5ODgwKSwgRlhQX0NBU1QoMHhhZWE0NzA4MCl9LCB7RlhQX0NBU1QoMHg0NTZlYmEwMCksIEZYUF9DQVNUKDB4ZTcwNzQ3YzApLCBGWFBfQ0FTVCgweGVkYWE4NjQwKX19OworCitjb25zdCBGSVhQX1BTIHA4XzEzXzIwWzEzXSA9Cit7CisgIEZMMkZYQ09OU1RfUFMoMC4wMDc0NjA4Mjk0OTgxMmYpLCAgRkwyRlhDT05TVF9QUygwLjAyMjcwNDIwOTQ5ODI1ZiksICBGTDJGWENPTlNUX1BTKDAuMDQ1NDY4NjU5MzA0NzNmKSwgIEZMMkZYQ09OU1RfUFMoMC4wNzI2NjExMzkyOTU5MWYpLAorICBGTDJGWENPTlNUX1BTKDAuMDk4ODUxMDg1NzUyNjRmKSwgIEZMMkZYQ09OU1RfUFMoMC4xMTc5MzcxMDU2NzIxN2YpLCAgRkwyRlhDT05TVF9QUygwLjEyNWYgICAgICAgICAgICksICBGTDJGWENPTlNUX1BTKDAuMTE3OTM3MTA1NjcyMTdmKSwKKyAgRkwyRlhDT05TVF9QUygwLjA5ODg1MTA4NTc1MjY0ZiksICBGTDJGWENPTlNUX1BTKDAuMDcyNjYxMTM5Mjk1OTFmKSwgIEZMMkZYQ09OU1RfUFMoMC4wNDU0Njg2NTkzMDQ3M2YpLCAgRkwyRlhDT05TVF9QUygwLjAyMjcwNDIwOTQ5ODI1ZiksCisgIEZMMkZYQ09OU1RfUFMoMC4wMDc0NjA4Mjk0OTgxMmYpCit9OworCitjb25zdCBGSVhQX1BTIHAyXzEzXzIwWzEzXSA9Cit7CisgIEZMMkZYQ09OU1RfUFMoMC4wZiksIEZMMkZYQ09OU1RfUFMoIDAuMDE4OTk0ODc1MjYwNDlmKSwgIEZMMkZYQ09OU1RfUFMoMC4wZiksIEZMMkZYQ09OU1RfUFMoLTAuMDcyOTMxMzkxNjc1MzhmKSwKKyAgRkwyRlhDT05TVF9QUygwLjBmKSwgRkwyRlhDT05TVF9QUyggMC4zMDU5NjYzMDU0NTE2OGYpLCAgRkwyRlhDT05TVF9QUygwLjVmKSwgRkwyRlhDT05TVF9QUyggMC4zMDU5NjYzMDU0NTE2OGYpLAorICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKC0wLjA3MjkzMTM5MTY3NTM4ZiksICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKCAwLjAxODk5NDg3NTI2MDQ5ZiksCisgIEZMMkZYQ09OU1RfUFMoMC4wZikKK307CisKKworCitjb25zdCBVQ0hBUiBhQWxscGFzc0xpbmtEZWxheVNlcltdID0geyAgICAzLCAgICAgNCwgICAgIDV9OworCitjb25zdCBVQ0hBUiBkZWxheUluZGV4UW1mW05PX1FNRl9DSEFOTkVMU10gPSB7CisgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgMTQsIDE0LCAxNCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxCit9OworCitjb25zdCBVQ0hBUiBncm91cEJvcmRlcnMyMFtOT19JSURfR1JPVVBTICsgMV0gPQoreworICAgNiwgIDcsICAwLCAgMSwgIDIsICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLworICAgOSwgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLworICAxMCwgMTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLworICAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICAgOSwgIDExLCAxNCwgMTgsIDIzLCAzNSwgNjQKK307CisKK2NvbnN0IFVDSEFSIGdyb3VwQm9yZGVyczM0W05PX0lJRF9HUk9VUFNfSElfUkVTICsgMV0gPQoreworICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgICAvKiAxMiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KKyAgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAgICAgICAgICAgICAgICAgICAgLyogIDggc3VicW1mIHN1YmJhbmRzIC0gMXN0IHFtZiBzdWJiYW5kICovCisgIDIwLCAyMSwgMjIsIDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0IHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLworICAyNCwgMjUsIDI2LCAyNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBzdWJxbWYgc3ViYmFuZHMgLSAzbmQgcW1mIHN1YmJhbmQgKi8KKyAgMjgsIDI5LCAzMCwgMzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDQgc3VicW1mIHN1YmJhbmRzIC0gNG5kIHFtZiBzdWJiYW5kICovCisgIDMyLTI3LCAzMy0yNywgMzQtMjcsIDM1LTI3LCAzNi0yNywgMzctMjcsIDM4LTI3LAorICA0MC0yNywgNDItMjcsIDQ0LTI3LCA0Ni0yNywgNDgtMjcsIDUxLTI3LCA1NC0yNywKKyAgNTctMjcsIDYwLTI3LCA2NC0yNywgNjgtMjcsIDkxLTI3Cit9OworCitjb25zdCBVQ0hBUiBiaW5zMmdyb3VwTWFwMjBbTk9fSUlEX0dST1VQU10gPQoreworICAxLCAwLAorICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOQorfTsKKworY29uc3QgVUNIQVIgcXVhbnRpemVkSUlEc1tOT19JSURfU1RFUFNdID0KK3sKKyAgICAyLCA0LCA3LCAxMCwgMTQsIDE4LCAyNQorfTsKK2NvbnN0IFVDSEFSIHF1YW50aXplZElJRHNGaW5lW05PX0lJRF9TVEVQU19GSU5FXSA9Cit7CisgICAgMiwgNCwgNiwgOCwgMTAsIDEzLCAxNiwgMTksIDIyLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwCit9OworCitjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zWzNdID0ge05PX0xPV19SRVNfSUlEX0JJTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19NSURfUkVTX0lJRF9CSU5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fSElfUkVTX0lJRF9CSU5TfTsKKworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1szXSA9IHtOT19MT1dfUkVTX0lDQ19CSU5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fTUlEX1JFU19JQ0NfQklOUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0hJX1JFU19JQ0NfQklOU307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgICBcYnJpZWYgICBDcmVhdGUgbG9va3VwIHRhYmxlcyBmb3Igc29tZSBhcml0aG1ldGljIGZ1bmN0aW9ucworCisgICBUaGUgdGFibGVzIHdvdWxkIG5vcm1hbGx5IGJlIGRlZmluZWQgYXMgY29uc3QgYXJyYXlzLAorICAgYnV0IGluaXRpYWxpemF0aW9uIGF0IHJ1biB0aW1lIGFsbG93cyB0byBzcGVjaWZ5IHRoZWlyIGFjY3VyYWN5LgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICAgMS94LXRhYmxlOiAgKGV4YW1wbGUgZm9yIElOVl9UQUJMRV9CSVRTIDgpCisKKyAgICAgVGhlIHRhYmxlIGNvdmVycyBhbiBpbnB1dCByYW5nZSBmcm9tIDAuNSB0byAxLjAgd2l0aCBhIHN0ZXAgc2l6ZSBvZiAxLzUxMiwKKyAgICAgc3RhcnRpbmcgYXQgMC41ICsgMS81MTIuCisgICAgIEVhY2ggdGFibGUgZW50cnkgY29ycmVzcG9uZHMgdG8gYW4gaW5wdXQgaW50ZXJ2YWwgc3RhcnRpbmcgMS8xMDI0IGJlbG93IHRoZQorICAgICBleGFjdCB2YWx1ZSBhbmQgZW5kaW5nIDEvMTAyNCBhYm92ZSBpdC4KKworICAgICBUaGUgdGFibGUgaXMgYWN0dWFsbHkgYSAwLjUveC10YWJsZSwgc28gdGhhdCB0aGUgb3V0cHV0IHJhbmdlIGlzIGFnYWluCisgICAgIDAuNS4uLjEuMCBhbmQgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgbXVzdCBiZSBpbmNyZWFzZWQgYnkgMS4KKworICAgICBJbnB1dCByYW5nZSAgICAgICAgICAgSW5kZXggaW4gdGFibGUgICAgICByZXN1bHQKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAwLjUwMDAwMC4uLjAuNTAwOTc2ICAgICAgICAgIC0gICAgICAgICAgICAwLjUgLyAwLjUwMDAwMCA9IDEuMDAwMDAwCisgICAgIDAuNTAwOTc2Li4uMC41MDI5MzAgICAgICAgICAgMCAgICAgICAgICAgIDAuNSAvIDAuNTAxOTUzID0gMC45OTYxMDkKKyAgICAgMC41MDI5MzAuLi4wLjUwMDQ4OCAgICAgICAgICAxICAgICAgICAgICAgMC41IC8gMC41MDM5MDYgPSAwLjk5MjI0OAorICAgICAgICAgICAgIC4uLgorICAgICAwLjk5OTAyMy4uLjEuMDAwMDAwICAgICAgICAgMjU1ICAgICAgICAgICAwLjUgLyAxLjAwMDAwMCA9IDAuNTAwMDAwCisKKyAgICAgICBmb3IgKGk9MDsgaTxJTlZfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgICBkID0gMC41ZiAvICggMC41ZisoZG91YmxlKShpKzEpLyhJTlZfVEFCTEVfU0laRSoyKSApIDsKKyAgICAgICAgIGludlRhYmxlW2ldID0gRkwyRlhfU0dMKGQpOworICAgICAgIH0KKyovCitjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9pbnZUYWJsZVtJTlZfVEFCTEVfU0laRV0gPQoreworICAweDdmODAsIDB4N2YwMSwgMHg3ZTgzLCAweDdlMDcsIDB4N2Q4YiwgMHg3ZDExLCAweDdjOTcsIDB4N2MxZSwKKyAgMHg3YmE2LCAweDdiMmYsIDB4N2FiOSwgMHg3YTQ0LCAweDc5Y2YsIDB4Nzk1YywgMHg3OGU5LCAweDc4NzgsCisgIDB4NzgwNywgMHg3Nzk2LCAweDc3MjcsIDB4NzZiOSwgMHg3NjRiLCAweDc1ZGUsIDB4NzU3MiwgMHg3NTA2LAorICAweDc0OWMsIDB4NzQzMiwgMHg3M2M5LCAweDczNjAsIDB4NzJmOSwgMHg3MjkyLCAweDcyMmMsIDB4NzFjNiwKKyAgMHg3MTYxLCAweDcwZmQsIDB4NzA5YSwgMHg3MDM3LCAweDZmZDUsIDB4NmY3NCwgMHg2ZjEzLCAweDZlYjMsCisgIDB4NmU1NCwgMHg2ZGY1LCAweDZkOTcsIDB4NmQzOSwgMHg2Y2RjLCAweDZjODAsIDB4NmMyNCwgMHg2YmM5LAorICAweDZiNmYsIDB4NmIxNSwgMHg2YWJjLCAweDZhNjMsIDB4NmEwYiwgMHg2OWIzLCAweDY5NWMsIDB4NjkwNiwKKyAgMHg2OGIwLCAweDY4NWEsIDB4NjgwNiwgMHg2N2IxLCAweDY3NWUsIDB4NjcwYSwgMHg2NmI4LCAweDY2NjYsCisgIDB4NjYxNCwgMHg2NWMzLCAweDY1NzIsIDB4NjUyMiwgMHg2NGQyLCAweDY0ODMsIDB4NjQzNCwgMHg2M2U2LAorICAweDYzOTksIDB4NjM0YiwgMHg2MmZlLCAweDYyYjIsIDB4NjI2NiwgMHg2MjFiLCAweDYxZDAsIDB4NjE4NSwKKyAgMHg2MTNiLCAweDYwZjIsIDB4NjBhOCwgMHg2MDYwLCAweDYwMTcsIDB4NWZjZiwgMHg1Zjg4LCAweDVmNDEsCisgIDB4NWVmYSwgMHg1ZWI0LCAweDVlNmUsIDB4NWUyOCwgMHg1ZGUzLCAweDVkOWYsIDB4NWQ1YSwgMHg1ZDE3LAorICAweDVjZDMsIDB4NWM5MCwgMHg1YzRkLCAweDVjMGIsIDB4NWJjOSwgMHg1Yjg3LCAweDViNDYsIDB4NWIwNSwKKyAgMHg1YWM0LCAweDVhODQsIDB4NWE0NCwgMHg1YTA1LCAweDU5YzYsIDB4NTk4NywgMHg1OTQ5LCAweDU5MGEsCisgIDB4NThjZCwgMHg1ODhmLCAweDU4NTIsIDB4NTgxNSwgMHg1N2Q5LCAweDU3OWQsIDB4NTc2MSwgMHg1NzI1LAorICAweDU2ZWEsIDB4NTZhZiwgMHg1Njc1LCAweDU2M2IsIDB4NTYwMSwgMHg1NWM3LCAweDU1OGUsIDB4NTU1NSwKKyAgMHg1NTFjLCAweDU0ZTMsIDB4NTRhYiwgMHg1NDczLCAweDU0M2MsIDB4NTQwNSwgMHg1M2NlLCAweDUzOTcsCisgIDB4NTM2MCwgMHg1MzJhLCAweDUyZjQsIDB4NTJiZiwgMHg1Mjg5LCAweDUyNTQsIDB4NTIxZiwgMHg1MWViLAorICAweDUxYjcsIDB4NTE4MywgMHg1MTRmLCAweDUxMWIsIDB4NTBlOCwgMHg1MGI1LCAweDUwODIsIDB4NTA1MCwKKyAgMHg1MDFkLCAweDRmZWIsIDB4NGZiYSwgMHg0Zjg4LCAweDRmNTcsIDB4NGYyNiwgMHg0ZWY1LCAweDRlYzQsCisgIDB4NGU5NCwgMHg0ZTY0LCAweDRlMzQsIDB4NGUwNCwgMHg0ZGQ1LCAweDRkYTYsIDB4NGQ3NywgMHg0ZDQ4LAorICAweDRkMTksIDB4NGNlYiwgMHg0Y2JkLCAweDRjOGYsIDB4NGM2MSwgMHg0YzM0LCAweDRjMDcsIDB4NGJkOSwKKyAgMHg0YmFkLCAweDRiODAsIDB4NGI1NCwgMHg0YjI3LCAweDRhZmIsIDB4NGFjZiwgMHg0YWE0LCAweDRhNzgsCisgIDB4NGE0ZCwgMHg0YTIyLCAweDQ5ZjcsIDB4NDljZCwgMHg0OWEyLCAweDQ5NzgsIDB4NDk0ZSwgMHg0OTI0LAorICAweDQ4ZmEsIDB4NDhkMSwgMHg0OGE3LCAweDQ4N2UsIDB4NDg1NSwgMHg0ODJkLCAweDQ4MDQsIDB4NDdkYywKKyAgMHg0N2IzLCAweDQ3OGIsIDB4NDc2MywgMHg0NzNjLCAweDQ3MTQsIDB4NDZlZCwgMHg0NmM1LCAweDQ2OWUsCisgIDB4NDY3NywgMHg0NjUxLCAweDQ2MmEsIDB4NDYwNCwgMHg0NWRlLCAweDQ1YjgsIDB4NDU5MiwgMHg0NTZjLAorICAweDQ1NDYsIDB4NDUyMSwgMHg0NGZjLCAweDQ0ZDcsIDB4NDRiMiwgMHg0NDhkLCAweDQ0NjgsIDB4NDQ0NCwKKyAgMHg0NDFmLCAweDQzZmIsIDB4NDNkNywgMHg0M2IzLCAweDQzOTAsIDB4NDM2YywgMHg0MzQ5LCAweDQzMjUsCisgIDB4NDMwMiwgMHg0MmRmLCAweDQyYmMsIDB4NDI5OSwgMHg0Mjc3LCAweDQyNTQsIDB4NDIzMiwgMHg0MjEwLAorICAweDQxZWUsIDB4NDFjYywgMHg0MWFhLCAweDQxODksIDB4NDE2NywgMHg0MTQ2LCAweDQxMjUsIDB4NDEwNCwKKyAgMHg0MGUzLCAweDQwYzIsIDB4NDBhMSwgMHg0MDgxLCAweDQwNjAsIDB4NDA0MCwgMHg0MDIwLCAweDQwMDAKK307CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yb20uaCBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE4ODcwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5oCkBAIC0wLDAgKzEsMjM0IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCitcZmlsZQorXGJyaWVmIERlY2xhcmF0aW9uIG9mIGNvbnN0YW50IHRhYmxlcworCisqLworI2lmbmRlZiBfX3JvbV9ICisjZGVmaW5lIF9fcm9tX0gKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKyNpbmNsdWRlICJlbnZfZXh0ci5oIgorI2luY2x1ZGUgInFtZi5oIgorCisjZGVmaW5lIElOVl9JTlRfVEFCTEVfU0laRSAgICAgIDQ5CisjZGVmaW5lIFNCUl9ORl9OT19SQU5ET01fVkFMICA1MTIgICAvKiE8IFNpemUgb2YgcmFuZG9tIG51bWJlciBhcnJheSBmb3Igbm9pc2UgZmxvb3IgKi8KKworLyoKKyAgRnJlcXVlbmN5IHNjYWxlcworKi8KK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNlsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0WzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMlsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0WzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4WzE2XTsKKworLyoKKyAgTG93LVBvd2VyLVByb2ZpbGUgVHJhbnNwb3NlcgorKi8KKyNkZWZpbmUgTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVMgIDkKK2V4dGVybiBjb25zdCBVU0hPUlQgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdWzZdOworCisKKworLyoKKyAgRW52ZWxvcGUgQWRqdXN0b3IKKyovCitleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF07CitleHRlcm4gY29uc3QgVUNIQVIgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF07CitleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbNF07CitleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XTsKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbU0JSX05GX05PX1JBTkRPTV9WQUxdWzJdOworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGhhcm1vbmljUGhhc2VYIFsyXVs0XTsKKworLyoKKyAgRW52ZWxvcGUgRXh0cmFjdG9yCisqLworZXh0ZXJuIGNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzggIFs4XVs1XTsKK2V4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNSBbMTVdWzZdOworZXh0ZXJuIGNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2IFsxNl1bNl07CisKK2V4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNTsKK2V4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNTsKK2V4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNTsKK2V4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNTsKKworZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE2OworZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE2OworZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2OworZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE2OworCitleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBUWzEyMF1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBGWzEyMF1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMFRbNDhdWzJdOworZXh0ZXJuIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBGWzQ4XVsyXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMVRbNjJdWzJdOworZXh0ZXJuIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRls2Ml1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMVRbMjRdWzJdOworZXh0ZXJuIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFGWzI0XVsyXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VMZXZlbDExVFs2Ml1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlQmFsYW5jZTExVFsyNF1bMl07CisKKworLyoKKyBQYXJhbWV0cmljIHN0ZXJlbworKi8KKworCitleHRlcm4gY29uc3QgRklYUF9EQkwgZGVjYXlTY2FsZUZhY3RUYWJsZVtOT19RTUZfQ0hBTk5FTFNdOworCisvKiBGSVhfQk9SREVSIGNhbiBoYXZlIDAsIDEsIDIsIDQgZW52ZWxvcHMgKi8KK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hRml4Tm9FbnZEZWNvZGVbNF07CisKKy8qIElJRCAmIElDQyBIdWZmbWFuIGNvZGVib29rcyAqLworZXh0ZXJuIGNvbnN0IFNDSEFSIGFCb29rUHNJaWRUaW1lRGVjb2RlWzI4XVsyXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBhQm9va1BzSWlkRnJlcURlY29kZVsyOF1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgYUJvb2tQc0ljY1RpbWVEZWNvZGVbMTRdWzJdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGFCb29rUHNJY2NGcmVxRGVjb2RlWzE0XVsyXTsKKworLyogSUlELWZpbmUgSHVmZm1hbiBjb2RlYm9va3MgKi8KKworZXh0ZXJuIGNvbnN0IFNDSEFSIGFCb29rUHNJaWRGaW5lVGltZURlY29kZVs2MF1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgYUJvb2tQc0lpZEZpbmVGcmVxRGVjb2RlWzYwXVsyXTsKKworLyogdGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIDMgdGFibGVzIGFyZSBzaGlmdGV0IHJpZ2h0IGJ5IDEgISAqLworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIFNjYWxlRmFjdG9yc1tOT19JSURfTEVWRUxTXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBTY2FsZUZhY3RvcnNGaW5lW05PX0lJRF9MRVZFTFNfRklORV07CitleHRlcm4gY29uc3QgRklYUF9EQkwgQWxwaGFzW05PX0lDQ19MRVZFTFNdOworCisjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQorZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFBbGxwYXNzTGlua0RlY2F5U2VyW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlUW1mW05PX1FNRl9DSEFOTkVMU107CitleHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVFtZltOT19RTUZfQ0hBTk5FTFNdOworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXTsKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU107CisKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1RbWZbTk9fUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107CitleHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOworCitleHRlcm4gY29uc3QgRklYUF9TR0wgcDhfMTNfMjBbMTNdOworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIHAyXzEzXzIwWzEzXTsKKworI2Vsc2UKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBhQWxscGFzc0xpbmtEZWNheVNlcltOT19TRVJJQUxfQUxMUEFTU19MSU5LU107CitleHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVFtZltOT19RTUZfQ0hBTk5FTFNdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1RbWZbTk9fUU1GX0NIQU5ORUxTXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU107CitleHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdOworCitleHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVFtZltOT19RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VyUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107CitleHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIHA4XzEzXzIwWzEzXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBwMl8xM18yMFsxM107CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IFVDSEFSIGFBbGxwYXNzTGlua0RlbGF5U2VyWzNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGRlbGF5SW5kZXhRbWZbTk9fUU1GX0NIQU5ORUxTXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBncm91cEJvcmRlcnMyMFtOT19JSURfR1JPVVBTICsgMV07CitleHRlcm4gY29uc3QgVUNIQVIgZ3JvdXBCb3JkZXJzMzRbTk9fSUlEX0dST1VQU19ISV9SRVMgKyAxXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBiaW5zMmdyb3VwTWFwMjBbTk9fSUlEX0dST1VQU107CitleHRlcm4gY29uc3QgVUNIQVIgcXVhbnRpemVkSUlEc1tOT19JSURfU1RFUFNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIHF1YW50aXplZElJRHNGaW5lW05PX0lJRF9TVEVQU19GSU5FXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zWzNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbM107CisKKworLyogTG9va3VwIHRhYmxlcyBmb3Igc29tZSBhcml0aG1ldGljIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIElOVl9UQUJMRV9CSVRTIDgKKyNkZWZpbmUgSU5WX1RBQkxFX1NJWkUgKDE8PElOVl9UQUJMRV9CSVRTKQorZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX2ludlRhYmxlW0lOVl9UQUJMRV9TSVpFXTsKKworI2VuZGlmIC8vIF9fcm9tX0gKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9zY2FsZS5oIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyX3NjYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjY2Q3MQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3Nicl9zY2FsZS5oCkBAIC0wLDAgKzEsMTIzIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCitcZmlsZQorXGJyaWVmIFNiciBzY2FsaW5nIGZhY3RvcnMsICAKK1RvIGRlYWwgd2l0aCB0aGUgZHluYW1pYyByYW5nZSBpbiB0aGUgZGlmZmVyZW50IHByb2Nlc3Npbmcgc3RhZ2VzLCBhCitmaXhlZCBwb2ludCBzcGVjaWZpYyBjb2RlIGhhcyB0byByZWx5IG9uIHNjYWxpbmcgZmFjdG9ycy4gQSBmbG9hdGluZworcG9pbnQgY29kZSBjYXJyaWVzIGEgc2NhbGluZyBmYWN0b3IgLS0gdGhlIGV4cG9uZW50IC0tIGZvciBlYWNoIHZhbHVlLAorc28gc2NhbGluZyBpcyBub3QgbmVjZXNzYXJ5IHRoZXJlLgorCitUaGUgb3V0cHV0IG9mIHRoZSBjb3JlIGRlY29kZXIgKGxvdyBiYW5kKSBpcyBzY2FsZWQgdXAgdG8gY292ZXIgYXMgbXVjaAorYXMgcG9zc2libGUgYml0cyBmb3IgZWFjaCB2YWx1ZS4gQXMgaGlnaCBiYW5kIGFuZCBsb3cgYmFuZCBhcmUgcHJvY2Vzc2VkCitpbiBkaWZmZXJlbnQgYWxnb3JpdGhtIHNlY3Rpb25zLCB0aGV5IHJlcXVpcmUgdGhlaXIgb3duIHNjYWxpbmcKK2ZhY3RvcnMuIEluIGFkZGl0aW9uLCBhbnkgc3RhdGljIGJ1ZmZlcnMsIGUuZy4gZmlsdGVyIHN0YXRlcywgcmVxdWlyZSBhCitzZXBhcmF0ZSBzY2FsaW5nIGZhY3RvciBhcyB3ZWxsLiBUaGUgY29kZSB0YWtlcyBjYXJlIHRvIGRvIHRoZSBwcm9wZXIKK2FkanVzdG1lbnQsIGlmIHNjYWxpbmcgZmFjdG9ycyBvZiBhIGZpbHRlciBzdGF0ZSBhbmQgdGhlIHRpbWUgc2lnbmFsIGRpZmZlci4KKworXHNhICNRTUZfU0NBTEVfRkFDVE9SLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworKi8KKworI2lmbmRlZiBfX1NCUl9TQ0FMRV9ICisjZGVmaW5lIF9fU0JSX1NDQUxFX0gKKworLyohCitcdmVyYmF0aW0KKyAgc2NhbGU6CisgICAgMCAgICAgICAgICAgICBsZWZ0IGFsaWduZWQgZS5nLiB8bWF4fCA+PTAuNQorICAgIEZSQUNUX0JJVFMtMSAgemVybyBlLmcgfG1heHwgPSAwCitcZW5kdmVyYmF0aW0KKworICBEeW5hbWljIHNjYWxpbmcgaXMgdXNlZCB0byBhY2hpZXZlIHN1ZmZpY2llbnQgYWNjdXJhY3kgZXZlbiB3aGVuIHRoZSBzaWduYWwKKyAgZW5lcmd5IGlzIGxvdy4gIFRoZSBkeW5hbWljIGZyYW1pbmcgb2YgU0JSIHByb2R1Y2VzIGEgdmFyaWFibGUgb3ZlcmxhcCBhcmVhCisgIHdoZXJlIHNhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgUU1GLUFuYWx5c2lzIGFyZSBzdG9yZWQuIERlcGVuZGluZyBvbiB0aGUKKyAgc3RhcnQgcG9zaXRpb24gYW5kIHN0b3AgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgU0JSIGVudmVsb3BlcywgdGhlIHByb2Nlc3NpbmcKKyAgYnVmZmVyIGNvbnNpc3RzIG9mIGRpZmZlcmVudGx5IHNjYWxlZCByZWdpb25zIGxpa2UgaWxsdXN0cmF0ZWQgaW4gdGhlIGJlbG93CisgIGZpZ3VyZS4KKworICBcaW1hZ2UgaHRtbCBzY2FsZXMucG5nIFNjYWxlCisqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM0YzBiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5jcHAKQEAgLTAsMCArMSw1MjUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgU0JSCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNicmRlY19kcmMuaCIKKworCisvKiBEUkMgLSBPZmZzZXQgdGFibGUgZm9yIFFNRiBpbnRlcnBvbGF0aW9uLiAqLworc3RhdGljIGNvbnN0IGludCBvZmZzZXRUYWJbMl1bMTZdID0KK3sKKyAgeyAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgIC8qIDEwMjQgZnJhbWluZyAqLworICB7IDAsIDQsIDgsIDEyLCAxNiwgMTksIDIyLCAyNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9ICAgLyogIDk2MCBmcmFtaW5nICovCit9OworCisvKiEKKyAgXGJyaWVmIEluaXRpYWxpemUgRFJDIFFNRiBmYWN0b3JzCisKKyAgXGhEcmNEYXRhIEhhbmRsZSB0byBEUkMgY2hhbm5lbCBkYXRhLgorCisgIFxyZXR1cm4gbm9uZQorKi8KK3ZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCAoCisgICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKQoreworICBpbnQgYmFuZDsKKworICBpZiAoaERyY0RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAoNjQpOyBiYW5kKyspIHsKKyAgICBoRHJjRGF0YS0+cHJldkZhY3RfbWFnW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgIH0KKworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgU0JSREVDX01BWF9EUkNfQkFORFM7IGJhbmQrKykgeworICAgIGhEcmNEYXRhLT5jdXJyRmFjdF9tYWdbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKKyAgICBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgIH0KKworICBoRHJjRGF0YS0+cHJldkZhY3RfZXhwID0gMTsKKyAgaERyY0RhdGEtPmN1cnJGYWN0X2V4cCA9IDE7CisgIGhEcmNEYXRhLT5uZXh0RmFjdF9leHAgPSAxOworCisgIGhEcmNEYXRhLT5udW1CYW5kc0N1cnIgPSAxOworICBoRHJjRGF0YS0+bnVtQmFuZHNOZXh0ID0gMTsKKworICBoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyID0gMDsKKyAgaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dCA9IDA7CisKKyAgaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVDdXJyID0gMDsKKyAgaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0ID0gMDsKKworICBoRHJjRGF0YS0+ZW5hYmxlID0gMDsKK30KKworCisvKiEKKyAgXGJyaWVmIFN3YXAgRFJDIFFNRiBzY2FsaW5nIGZhY3RvcnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYXBwbGllZC4KKworICBcaERyY0RhdGEgSGFuZGxlIHRvIERSQyBjaGFubmVsIGRhdGEuCisKKyAgXHJldHVybiBub25lCisqLwordm9pZCBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwgKAorICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhICkKK3sKKyAgaWYgKGhEcmNEYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGhEcmNEYXRhLT5lbmFibGUgIT0gMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIHN3YXAgcHJldmlvdXMgZGF0YSAqLworICBGREttZW1jcHkoIGhEcmNEYXRhLT5jdXJyRmFjdF9tYWcsCisgICAgICAgICAgICAgaERyY0RhdGEtPm5leHRGYWN0X21hZywKKyAgICAgICAgICAgICBTQlJERUNfTUFYX0RSQ19CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkgKTsKKworICBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKKworICBoRHJjRGF0YS0+bnVtQmFuZHNDdXJyID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKKworICBGREttZW1jcHkoIGhEcmNEYXRhLT5iYW5kVG9wQ3VyciwKKyAgICAgICAgICAgICBoRHJjRGF0YS0+YmFuZFRvcE5leHQsCisgICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoVVNIT1JUKSApOworCisgIGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VyciA9IGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dDsKKworICBoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyID0gaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dDsKK30KKworCisvKiEKKyAgXGJyaWVmIEFwcGx5IERSQyBmYWN0b3JzIHNsb3QgYmFzZWQuCisKKyAgXGhEcmNEYXRhIEhhbmRsZSB0byBEUkMgY2hhbm5lbCBkYXRhLgorICBccW1mUmVhbFNsb3QgUG9pbnRlciB0byByZWFsIHZhbHVlZCBRTUYgZGF0YSBvZiBvbmUgdGltZSBzbG90LgorICBccW1mSW1hZ1Nsb3QgUG9pbnRlciB0byB0aGUgaW1hZ2luYXJ5IFFNRiBkYXRhIG9mIG9uZSB0aW1lIHNsb3QuCisgIFxjb2wgTnVtYmVyIG9mIHRoZSB0aW1lIHNsb3QuCisgIFxudW1RbWZTdWJTYW1wbGVzIFRvdGFsIG51bWJlciBvZiB0aW1lIHNsb3RzIGZvciBvbmUgZnJhbWUuCisgIFxzY2FsZUZhY3RvciBQb2ludGVyIHRvIHRoZSBvdXQgc2NhbGUgZmFjdG9yIG9mIHRoZSB0aW1lIHNsb3QuCisKKyAgXHJldHVybiBOb25lLgorKi8KK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QgKAorICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhLAorICAgIEZJWFBfREJMICAgKnFtZlJlYWxTbG90LAorICAgIEZJWFBfREJMICAgKnFtZkltYWdTbG90LAorICAgIGludCAgY29sLAorICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKKyAgICBpbnQgIG1heFNoaWZ0CisgICkKK3sKKyAgY29uc3QgaW50ICpvZmZzZXQ7CisKKyAgaW50IGJhbmQsIGJvdHRvbU1kY3QsIHRvcE1kY3QsIGJpbiwgdXNlTFA7CisgIGludCBpbmR4ID0gbnVtUW1mU3ViU2FtcGxlcyAtIChudW1RbWZTdWJTYW1wbGVzID4+IDEpIC0gMTA7ICAgLyogbF9ib3JkZXIgKi8KKyAgaW50IGZyYW1lTGVuRmxhZyA9IChudW1RbWZTdWJTYW1wbGVzID09IDMwKSA/IDEgOiAwOworCisgIGNvbnN0IEZJWFBfREJMICpmYWN0X21hZyA9IE5VTEw7CisgIElOVCBmYWN0X2V4cCA9IDA7CisgIFVJTlQgbnVtQmFuZHMgPSAwOworICBVU0hPUlQgKmJhbmRUb3AgPSBOVUxMOworICBpbnQgc2hvcnREcmMgPSAwOworCisgIEZJWFBfREJMIGFscGhhVmFsdWUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICBpZiAoaERyY0RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoaERyY0RhdGEtPmVuYWJsZSAhPSAxKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgb2Zmc2V0ID0gb2Zmc2V0VGFiW2ZyYW1lTGVuRmxhZ107CisKKyAgdXNlTFAgPSAocW1mSW1hZ1Nsb3QgPT0gTlVMTCkgPyAxIDogMDsKKworICBjb2wgKz0gaW5keDsKKyAgYm90dG9tTWRjdCA9IDA7CisgIGJpbiA9IDA7CisKKyAgLyogZ2V0IHJlc3BlY3RpdmUgZGF0YSBhbmQgY2FsYyBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLworICBpZiAoY29sIDwgKG51bVFtZlN1YlNhbXBsZXM+PjEpKSB7ICAvKiBmaXJzdCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlQ3VyciAhPSAyKSB7IC8qIGxvbmcgd2luZG93ICovCisgICAgICBpbnQgaiA9IGNvbCArIChudW1RbWZTdWJTYW1wbGVzPj4xKTsKKworICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VyciA9PSAwKSB7CisgICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDQgOiAweDQwMDAwMDA7CisKKyAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgLSAxXSkgeworICAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KKyAgICAgIHNob3J0RHJjID0gMTsKKyAgICB9CisKKyAgICBmYWN0X21hZyA9IGhEcmNEYXRhLT5jdXJyRmFjdF9tYWc7CisgICAgZmFjdF9leHAgPSBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwOworICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzQ3VycjsKKyAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BDdXJyOworICB9CisgIGVsc2UgaWYgKGNvbCA8IG51bVFtZlN1YlNhbXBsZXMpIHsgIC8qIHNlY29uZCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dCAhPSAyKSB7IC8qIG5leHQ6IGxvbmcgd2luZG93ICovCisgICAgICBpbnQgaiA9IGNvbCAtIChudW1RbWZTdWJTYW1wbGVzPj4xKTsKKworICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9PSAwKSB7CisgICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDQgOiAweDQwMDAwMDA7CisKKyAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgLSAxXSkgeworICAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmYWN0X21hZyA9IGhEcmNEYXRhLT5uZXh0RmFjdF9tYWc7CisgICAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CisgICAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CisgICAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BOZXh0OworICAgIH0KKyAgICBlbHNlIHsgIC8qIG5leHQ6IHNob3J0IHdpbmRvd3MgKi8KKyAgICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyICE9IDIpIHsgIC8qIGN1cnJlbnQ6IGxvbmcgd2luZG93ICovCisgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpMDsKKworICAgICAgICBmYWN0X21hZyA9IGhEcmNEYXRhLT5uZXh0RmFjdF9tYWc7CisgICAgICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKKyAgICAgICAgbnVtQmFuZHMgPSBoRHJjRGF0YS0+bnVtQmFuZHNOZXh0OworICAgICAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BOZXh0OworICAgICAgfQorICAgICAgZWxzZSB7ICAvKiBjdXJyZW50OiBzaG9ydCB3aW5kb3dzICovCisgICAgICAgIHNob3J0RHJjID0gMTsKKworICAgICAgICBmYWN0X21hZyA9IGhEcmNEYXRhLT5jdXJyRmFjdF9tYWc7CisgICAgICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPmN1cnJGYWN0X2V4cDsKKyAgICAgICAgbnVtQmFuZHMgPSBoRHJjRGF0YS0+bnVtQmFuZHNDdXJyOworICAgICAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BDdXJyOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHsgIC8qIGZpcnN0IGhhbGYgb2YgbmV4dCBmcmFtZSAqLworICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VOZXh0ICE9IDIpIHsgLyogbG9uZyB3aW5kb3cgKi8KKyAgICAgIGludCBqID0gY29sIC0gKG51bVFtZlN1YlNhbXBsZXM+PjEpOworCisgICAgICBpZiAoaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0ID09IDApIHsKKyAgICAgICAgSU5UIGsgPSAoZnJhbWVMZW5GbGFnKSA/IDB4NDQ0NDQ0NCA6IDB4NDAwMDAwMDsKKworICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKShqICogayk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGogPj0gb2Zmc2V0W2hEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCAtIDFdKSB7CisgICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgLyogc2hvcnQgd2luZG93cyAqLworICAgICAgc2hvcnREcmMgPSAxOworICAgIH0KKworICAgIGZhY3RfbWFnID0gaERyY0RhdGEtPm5leHRGYWN0X21hZzsKKyAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CisgICAgbnVtQmFuZHMgPSBoRHJjRGF0YS0+bnVtQmFuZHNOZXh0OworICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcE5leHQ7CisKKyAgICBjb2wgLT0gbnVtUW1mU3ViU2FtcGxlczsKKyAgfQorCisKKyAgLyogcHJvY2VzcyBiYW5kcyAqLworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgKGludCludW1CYW5kczsgYmFuZCsrKSB7CisgICAgaW50IGJvdHRvbVFtZiwgdG9wUW1mOworCisgICAgRklYUF9EQkwgZHJjRmFjdF9tYWcgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKworICAgIHRvcE1kY3QgPSAoYmFuZFRvcFtiYW5kXSsxKSA8PCAyOworCisgICAgaWYgKCFzaG9ydERyYykgeyAgLyogbG9uZyB3aW5kb3cgKi8KKyAgICAgIGlmIChmcmFtZUxlbkZsYWcpIHsKKyAgICAgICAgLyogOTYwIGZyYW1pbmcgKi8KKyAgICAgICAgYm90dG9tTWRjdCA9IDMwICogKGJvdHRvbU1kY3QgLyAzMCk7CisgICAgICAgIHRvcE1kY3QgICAgPSAzMCAqICh0b3BNZGN0IC8gMzApOworCisgICAgICAgIGJvdHRvbVFtZiA9IGZNdWx0SWZsb29yKChGSVhQX0RCTCkweDQ0NDQ0NDQsIGJvdHRvbU1kY3QpOworICAgICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ0LCB0b3BNZGN0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiAxMDI0IGZyYW1pbmcgKi8KKyAgICAgICAgYm90dG9tTWRjdCAmPSB+MHgxZjsKKyAgICAgICAgdG9wTWRjdCAgICAmPSB+MHgxZjsKKworICAgICAgICBib3R0b21RbWYgPSBib3R0b21NZGN0ID4+IDU7CisgICAgICAgIHRvcFFtZiAgICA9IHRvcE1kY3QgPj4gNTsKKyAgICAgIH0KKworICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMtMSkpIHsKKyAgICAgICAgdG9wUW1mID0gKDY0KTsKKyAgICAgIH0KKyAgICAKKyAgICAgIGZvciAoYmluID0gYm90dG9tUW1mOyBiaW4gPCB0b3BRbWY7IGJpbisrKSB7CisgICAgICAgIEZJWFBfREJMIGRyY0ZhY3QxX21hZyA9IGhEcmNEYXRhLT5wcmV2RmFjdF9tYWdbYmluXTsKKyAgICAgICAgRklYUF9EQkwgZHJjRmFjdDJfbWFnID0gZmFjdF9tYWdbYmFuZF07CisKKyAgICAgICAgLyogbm9ybWFsaXplIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgICAgaWYgKGhEcmNEYXRhLT5wcmV2RmFjdF9leHAgPCBtYXhTaGlmdCkgeworICAgICAgICAgIGRyY0ZhY3QxX21hZyA+Pj0gbWF4U2hpZnQgLSBoRHJjRGF0YS0+cHJldkZhY3RfZXhwOworICAgICAgICB9CisgICAgICAgIGlmIChmYWN0X2V4cCA8IG1heFNoaWZ0KSB7CisgICAgICAgICAgZHJjRmFjdDJfbWFnID4+PSBtYXhTaGlmdCAtIGZhY3RfZXhwOworICAgICAgICB9CisKKyAgICAgICAgLyogaW50ZXJwb2xhdGUgKi8KKyAgICAgICAgaWYgKGFscGhhVmFsdWUgPT0gKEZJWFBfREJMKTApIHsKKyAgICAgICAgICBkcmNGYWN0X21hZyA9IGRyY0ZhY3QxX21hZzsKKyAgICAgICAgfSBlbHNlIGlmIChhbHBoYVZhbHVlID09IChGSVhQX0RCTClNQVhWQUxfREJMKSB7CisgICAgICAgICAgZHJjRmFjdF9tYWcgPSBkcmNGYWN0Ml9tYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZHJjRmFjdF9tYWcgPSBmTXVsdChhbHBoYVZhbHVlLCBkcmNGYWN0Ml9tYWcpICsgZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGFWYWx1ZSksIGRyY0ZhY3QxX21hZyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBhcHBseSBzY2FsaW5nICovCisgICAgICAgIHFtZlJlYWxTbG90W2Jpbl0gPSBmTXVsdChxbWZSZWFsU2xvdFtiaW5dLCBkcmNGYWN0X21hZyk7CisgICAgICAgIGlmICghdXNlTFApIHsKKyAgICAgICAgICBxbWZJbWFnU2xvdFtiaW5dID0gZk11bHQocW1mSW1hZ1Nsb3RbYmluXSwgZHJjRmFjdF9tYWcpOworICAgICAgICB9CisKKyAgICAgICAgLyogc2F2ZSBwcmV2aW91cyBmYWN0b3JzICovCisgICAgICAgIGlmIChjb2wgPT0gKG51bVFtZlN1YlNhbXBsZXM+PjEpLTEpIHsKKyAgICAgICAgICBoRHJjRGF0YS0+cHJldkZhY3RfbWFnW2Jpbl0gPSBmYWN0X21hZ1tiYW5kXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KKyAgICAgIGludCBzdGFydFNhbXBsZSwgc3RvcFNhbXBsZTsKKyAgICAgIEZJWFBfREJMIGludkZyYW1lU2l6ZURpdjggPSAoZnJhbWVMZW5GbGFnKSA/IChGSVhQX0RCTCkweDExMTExMTEgOiAoRklYUF9EQkwpMHgxMDAwMDAwOworCisgICAgICBpZiAoZnJhbWVMZW5GbGFnKSB7CisgICAgICAgIC8qICA5NjAgZnJhbWluZyAqLworICAgICAgICBib3R0b21NZGN0ID0gMzAvOCAqIChib3R0b21NZGN0KjgvMzApOworICAgICAgICB0b3BNZGN0ICAgID0gMzAvOCAqICh0b3BNZGN0KjgvMzApOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qIDEwMjQgZnJhbWluZyAqLworICAgICAgICBib3R0b21NZGN0ICY9IH4weDAzOworICAgICAgICB0b3BNZGN0ICAgICY9IH4weDAzOworICAgICAgfQorCisgICAgICAvKiBzdGFydFNhbXBsZSBpcyB0cnVuY2F0ZWQgdG8gdGhlIG5lYXJlc3QgY29ycmVzcG9uZGluZyBzdGFydCBzdWJzYW1wbGUgaW4KKyAgICAgICAgIHRoZSBRTUYgb2YgdGhlIHNob3J0IHdpbmRvdyBib3R0b20gaXMgcHJlc2VudCBpbjoqLworICAgICAgc3RhcnRTYW1wbGUgID0gKChmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgYm90dG9tTWRjdCApICYgMHg3KSAqIG51bVFtZlN1YlNhbXBsZXMpID4+IDM7CisKKyAgICAgIC8qIHN0b3BTYW1wbGUgaXMgcm91bmRlZCB1cHdhcmRzIHRvIHRoZSBuZWFyZXN0IGNvcnJlc3BvbmRpbmcgc3RvcCBzdWJzYW1wbGUKKyAgICAgICAgIGluIHRoZSBRTUYgb2YgdGhlIHNob3J0IHdpbmRvdyB0b3AgaXMgcHJlc2VudCBpbi4gKi8KKyAgICAgIHN0b3BTYW1wbGUgID0gKChmTXVsdEljZWlsKCBpbnZGcmFtZVNpemVEaXY4LCB0b3BNZGN0ICkgJiAweGYpICogbnVtUW1mU3ViU2FtcGxlcykgPj4gMzsKKworICAgICAgYm90dG9tUW1mID0gZk11bHRJZmxvb3IoIGludkZyYW1lU2l6ZURpdjgsICgoYm90dG9tTWRjdCUobnVtUW1mU3ViU2FtcGxlczw8MikpIDw8IDUpICk7CisgICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgKCh0b3BNZGN0JShudW1RbWZTdWJTYW1wbGVzPDwyKSkgPDwgNSkgKTsKKworICAgICAgLyogZXh0ZW5kIGxhc3QgYmFuZCAqLworICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMtMSkpIHsKKyAgICAgICAgdG9wUW1mID0gKDY0KTsKKyAgICAgICAgc3RvcFNhbXBsZSA9IG51bVFtZlN1YlNhbXBsZXM7CisgICAgICB9CisKKyAgICAgIGlmICh0b3BRbWYgPT0gMCkgeworICAgICAgICB0b3BRbWYgPSAoNjQpOworICAgICAgfQorCisgICAgICAvKiBzYXZlIHByZXZpb3VzIGZhY3RvcnMgKi8KKyAgICAgIGlmIChzdG9wU2FtcGxlID09IG51bVFtZlN1YlNhbXBsZXMpIHsKKyAgICAgICAgaW50IHRtcEJvdHRvbSA9IGJvdHRvbVFtZjsKKworICAgICAgICBpZiAoKChudW1RbWZTdWJTYW1wbGVzLTEpICYgfjB4MDMpID4gc3RhcnRTYW1wbGUpIHsKKyAgICAgICAgICAgIHRtcEJvdHRvbSA9IDA7ICAgIC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLworICAgICAgICB9CisKKyAgICAgICAgZm9yIChiaW4gPSB0bXBCb3R0b207IGJpbiA8IHRvcFFtZjsgYmluKyspIHsKKyAgICAgICAgICBoRHJjRGF0YS0+cHJldkZhY3RfbWFnW2Jpbl0gPSBmYWN0X21hZ1tiYW5kXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBhcHBseSAqLworICAgICAgaWYgKChjb2wgPj0gc3RhcnRTYW1wbGUpICYmIChjb2wgPCBzdG9wU2FtcGxlKSkgeworICAgICAgICBpZiAoKGNvbCAmIH4weDAzKSA+IHN0YXJ0U2FtcGxlKSB7CisgICAgICAgICAgICBib3R0b21RbWYgPSAwOyAgICAvKiBiYW5kIHN0YXJ0cyBpbiBwcmV2aW91cyBzaG9ydCB3aW5kb3cgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoY29sIDwgKChzdG9wU2FtcGxlLTEpICYgfjB4MDMpKSB7CisgICAgICAgICAgICB0b3BRbWYgPSAoNjQpOyAgIC8qIGJhbmQgZW5kcyBpbiBuZXh0IHNob3J0IHdpbmRvdyAqLworICAgICAgICB9CisKKyAgICAgICAgZHJjRmFjdF9tYWcgPSBmYWN0X21hZ1tiYW5kXTsKKworICAgICAgICAvKiBub3JtYWxpemUgc2NhbGUgZmFjdG9yICovCisgICAgICAgIGlmIChmYWN0X2V4cCA8IG1heFNoaWZ0KSB7CisgICAgICAgICAgZHJjRmFjdF9tYWcgPj49IG1heFNoaWZ0IC0gZmFjdF9leHA7CisgICAgICAgIH0KKworICAgICAgICAvKiBhcHBseSBzY2FsaW5nICovCisgICAgICAgIGZvciAoYmluID0gYm90dG9tUW1mOyBiaW4gPCB0b3BRbWY7IGJpbisrKSB7CisgICAgICAgICAgcW1mUmVhbFNsb3RbYmluXSA9IGZNdWx0KHFtZlJlYWxTbG90W2Jpbl0sIGRyY0ZhY3RfbWFnKTsKKyAgICAgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgICAgICBxbWZJbWFnU2xvdFtiaW5dID0gZk11bHQocW1mSW1hZ1Nsb3RbYmluXSwgZHJjRmFjdF9tYWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGJvdHRvbU1kY3QgPSB0b3BNZGN0OworICB9ICAgLyogZW5kIG9mIGJhbmRzIGxvb3AgKi8KKworICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzPj4xKS0xKSB7CisgICAgaERyY0RhdGEtPnByZXZGYWN0X2V4cCA9IGZhY3RfZXhwOworICB9Cit9CisKKworLyohCisgIFxicmllZiBBcHBseSBEUkMgZmFjdG9ycyBmcmFtZSBiYXNlZC4KKworICBcaERyY0RhdGEgSGFuZGxlIHRvIERSQyBjaGFubmVsIGRhdGEuCisgIFxxbWZSZWFsU2xvdCBQb2ludGVyIHRvIHJlYWwgdmFsdWVkIFFNRiBkYXRhIG9mIHRoZSB3aG9sZSBmcmFtZS4KKyAgXHFtZkltYWdTbG90IFBvaW50ZXIgdG8gdGhlIGltYWdpbmFyeSBRTUYgZGF0YSBvZiB0aGUgd2hvbGUgZnJhbWUuCisgIFxudW1RbWZTdWJTYW1wbGVzIFRvdGFsIG51bWJlciBvZiB0aW1lIHNsb3RzIGZvciBvbmUgZnJhbWUuCisgIFxzY2FsZUZhY3RvciBQb2ludGVyIHRvIHRoZSBvdXQgc2NhbGUgZmFjdG9yIG9mIHRoZSBmcmFtZS4KKworICBccmV0dXJuIE5vbmUuCisqLwordm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5ICgKKyAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsCisgICAgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAorICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKKyAgICBpbnQgKnNjYWxlRmFjdG9yCisgICkKK3sKKyAgaW50IGNvbDsKKyAgaW50IG1heFNoaWZ0ID0gMDsKKworICBpZiAoaERyY0RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoaERyY0RhdGEtPmVuYWJsZSA9PSAwKSB7CisgICAgcmV0dXJuOyAgLyogQXZvaWQgY2hhbmdpbmcgdGhlIHNjYWxlRmFjdG9yIGV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkLiAqLworICB9CisKKyAgLyogZ2V0IG1heCBzY2FsZSBmYWN0b3IgKi8KKyAgaWYgKGhEcmNEYXRhLT5wcmV2RmFjdF9leHAgPiBtYXhTaGlmdCkgeworICAgIG1heFNoaWZ0ID0gaERyY0RhdGEtPnByZXZGYWN0X2V4cDsKKyAgfQorICBpZiAoaERyY0RhdGEtPmN1cnJGYWN0X2V4cCA+IG1heFNoaWZ0KSB7CisgICAgbWF4U2hpZnQgPSBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwOworICB9CisgIGlmIChoRHJjRGF0YS0+bmV4dEZhY3RfZXhwID4gbWF4U2hpZnQpIHsKKyAgICBtYXhTaGlmdCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CisgIH0KKworICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bVFtZlN1YlNhbXBsZXM7IGNvbCsrKQorICB7CisgICAgRklYUF9EQkwgKnFtZlNsb3RSZWFsID0gUW1mQnVmZmVyUmVhbFtjb2xdOworICAgIEZJWFBfREJMICpxbWZTbG90SW1hZyA9IChRbWZCdWZmZXJJbWFnID09IE5VTEwpID8gTlVMTCA6IFFtZkJ1ZmZlckltYWdbY29sXTsKKworICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKKyAgICAgIGhEcmNEYXRhLAorICAgICAgcW1mU2xvdFJlYWwsCisgICAgICBxbWZTbG90SW1hZywKKyAgICAgIGNvbCwKKyAgICAgIG51bVFtZlN1YlNhbXBsZXMsCisgICAgICBtYXhTaGlmdAorICAgICk7CisgIH0KKworICAqc2NhbGVGYWN0b3IgKz0gbWF4U2hpZnQ7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuaCBiL2FhYy9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVkNTNhCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5oCkBAIC0wLDAgKzEsMTUxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBkZWNvZGVyIHRvb2wgZm9yIFNCUgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NCUkRFQ19EUkNfSF8KKyNkZWZpbmUgX1NCUkRFQ19EUkNfSF8KKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworCisKKyNkZWZpbmUgU0JSREVDX01BWF9EUkNfQ0hBTk5FTFMgICg4KQorI2RlZmluZSBTQlJERUNfTUFYX0RSQ19CQU5EUyAgICAgKCAxNiApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMIHByZXZGYWN0X21hZ1soNjQpXTsKKyAgSU5UICAgICAgcHJldkZhY3RfZXhwOworCisgIEZJWFBfREJMIGN1cnJGYWN0X21hZ1tTQlJERUNfTUFYX0RSQ19CQU5EU107CisgIEZJWFBfREJMIG5leHRGYWN0X21hZ1tTQlJERUNfTUFYX0RSQ19CQU5EU107CisgIElOVCAgICAgIGN1cnJGYWN0X2V4cDsKKyAgSU5UICAgICAgbmV4dEZhY3RfZXhwOworCisgIFVJTlQgICAgIG51bUJhbmRzQ3VycjsKKyAgVUlOVCAgICAgbnVtQmFuZHNOZXh0OworICBVU0hPUlQgICBiYW5kVG9wQ3VycltTQlJERUNfTUFYX0RSQ19CQU5EU107CisgIFVTSE9SVCAgIGJhbmRUb3BOZXh0W1NCUkRFQ19NQVhfRFJDX0JBTkRTXTsKKworICBTSE9SVCAgICBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VycjsKKyAgU0hPUlQgICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQ7CisKKyAgU0hPUlQgICAgZW5hYmxlOworCisgIFVDSEFSICAgIHdpblNlcXVlbmNlQ3VycjsKKyAgVUNIQVIgICAgd2luU2VxdWVuY2VOZXh0OworCit9IFNCUkRFQ19EUkNfQ0hBTk5FTDsKKwordHlwZWRlZiBTQlJERUNfRFJDX0NIQU5ORUwgKiBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMOworCisKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCAoCisgICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKTsKKwordm9pZCBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwgKAorICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhICk7CisKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QgKAorICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhLAorICAgIEZJWFBfREJMICpxbWZSZWFsU2xvdCwKKyAgICBGSVhQX0RCTCAqcW1mSW1hZ1Nsb3QsCisgICAgaW50ICBjb2wsCisgICAgaW50ICBudW1RbWZTdWJTYW1wbGVzLAorICAgIGludCAgbWF4U2hpZnQgKTsKKwordm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5ICgKKyAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsCisgICAgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAorICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKKyAgICBpbnQgKnNjYWxlRmFjdG9yICk7CisKKworI2VuZGlmICAvKiBfU0JSREVDX0RSQ19IXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmNwcCBiL2FhYy9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZmJiMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5jcHAKQEAgLTAsMCArMSw4MTIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBGcmVxdWVuY3kgc2NhbGUgY2FsY3VsYXRpb24gIAorKi8KKworI2luY2x1ZGUgInNicmRlY19mcmVxX3NjYS5oIgorCisjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCisjaW5jbHVkZSAic2JyX3JvbS5oIgorI2luY2x1ZGUgImVudl9leHRyLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIiAgICAgIC8qIG5lZWQgbG9nKCkgZm9yIGRlYnVnLWNvZGUgb25seSAqLworCisjZGVmaW5lIE1BWF9PQ1RBVkUgICAgICAgICAyOQorI2RlZmluZSBNQVhfU0VDT05EX1JFR0lPTiAgNTAKKworCitzdGF0aWMgaW50ICBudW1iZXJPZkJhbmRzKEZJWFBfU0dMIGJwb19kaXYxNiwgaW50IHN0YXJ0LCBpbnQgc3RvcCwgaW50IHdhcnBGbGFnKTsKK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhVQ0hBUiAqIGRpZmYsIFVDSEFSIHN0YXJ0LCBVQ0hBUiBzdG9wLCBVQ0hBUiBudW1fYmFuZHMpOworc3RhdGljIFNCUl9FUlJPUiBtb2RpZnlCYW5kcyhVQ0hBUiBtYXhfYmFuZCwgVUNIQVIgKiBkaWZmLCBVQ0hBUiBsZW5ndGgpOworc3RhdGljIHZvaWQgY3VtU3VtKFVDSEFSIHN0YXJ0X3ZhbHVlLCBVQ0hBUiogZGlmZiwgVUNIQVIgbGVuZ3RoLCBVQ0hBUiAqc3RhcnRfYWRyZXNzKTsKKworCisKKy8qIQorICBcYnJpZWYgICAgIFJldHJpZXZlIFFNRi1iYW5kIHdoZXJlIHRoZSBTQlIgcmFuZ2Ugc3RhcnRzCisKKyAgQ29udmVydCBzdGFydEZyZXEgd2hpY2ggd2FzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIGludG8gYQorICBRTUYtY2hhbm5lbCBudW1iZXIuCisKKyAgXHJldHVybiAgTnVtYmVyIG9mIHN0YXJ0IGJhbmQKKyovCitzdGF0aWMgVUNIQVIKK2dldFN0YXJ0QmFuZChVSU5UICAgZnMsICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAgVUNIQVIgIHN0YXJ0RnJlcSwgICAgICAgIC8qITwgSW5kZXggdG8gdGFibGUgb2YgcG9zc2libGUgc3RhcnQgYmFuZHMgKi8KKyAgICAgICAgICAgICBVSU5UICAgaGVhZGVyRGF0YUZsYWdzKSAgLyohPCBJbmZvIHRvIFNCUiBtb2RlICovCit7CisgIElOVCAgYmFuZDsKKyAgVUlOVCBmc01hcHBlZDsKKworICAgIGZzTWFwcGVkID0gZnM7CisKKyAgc3dpdGNoIChmc01hcHBlZCkgeworICAgIGNhc2UgOTYwMDA6CisgICAgY2FzZSA4ODIwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV84OFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV82NFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80NFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMltzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yNFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yMltzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNltzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJhbmQgPSAyNTU7CisgIH0KKworICByZXR1cm4gYmFuZDsKK30KKworCisvKiEKKyAgXGJyaWVmICAgICBSZXRyaWV2ZSBRTUYtYmFuZCB3aGVyZSB0aGUgU0JSIHJhbmdlIHN0YXJ0cworCisgIENvbnZlcnQgc3RhcnRGcmVxIHdoaWNoIHdhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSBpbnRvIGEKKyAgUU1GLWNoYW5uZWwgbnVtYmVyLgorCisgIFxyZXR1cm4gIE51bWJlciBvZiBzdGFydCBiYW5kCisqLworc3RhdGljIFVDSEFSCitnZXRTdG9wQmFuZChVSU5UICAgZnMsICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgICAgICAgICBVQ0hBUiAgc3RvcEZyZXEsICAgICAgICAgLyohPCBJbmRleCB0byB0YWJsZSBvZiBwb3NzaWJsZSBzdGFydCBiYW5kcyAqLworICAgICAgICAgICAgVUlOVCAgIGhlYWRlckRhdGFGbGFncywgIC8qITwgSW5mbyB0byBTQlIgbW9kZSAqLworICAgICAgICAgICAgVUNIQVIgIGswKSAgICAgICAgICAgICAgIC8qITwgU3RhcnQgZnJlcSBpbmRleCAqLworeworICBVQ0hBUiBrMjsKKworICBpZiAoc3RvcEZyZXEgPCAxNCkgeworICAgIElOVCAgICBzdG9wTWluOworICAgIFVDSEFSICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOworICAgIFVDSEFSICpkaWZmMCA9IGRpZmZfdG90OworICAgIFVDSEFSICpkaWZmMSA9IGRpZmZfdG90K01BWF9PQ1RBVkU7CisKKyAgICBpZiAoZnMgPCAzMjAwMCkgeworICAgICAgc3RvcE1pbiA9ICgoKDIqNjAwMCoyKig2NCkpIC8gZnMpICsgMSkgPj4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoZnMgPCA2NDAwMCkgeworICAgICAgICBzdG9wTWluID0gKCgoMio4MDAwKjIqKDY0KSkgLyBmcykgKyAxKSA+PiAxOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHN0b3BNaW4gPSAoKCgyKjEwMDAwKjIqKDY0KSkgLyBmcykgKyAxKSA+PiAxOworICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICBDaG9vc2UgYSBzdG9wIGJhbmQgYmV0d2VlbiBrMSBhbmQgNjQgZGVwZW5kaW5nIG9uIHN0b3BGcmVxICgwLi4xMyksCisgICAgICBiYXNlZCBvbiBhIGxvZ2FyaXRobWljIHNjYWxlLgorICAgICAgVGhlIHZlY3RvcnMgZGlmZjAgYW5kIGRpZmYxIGFyZSB1c2VkIHRlbXBvcmFyaWx5IGhlcmUuCisgICAgKi8KKyAgICBDYWxjQmFuZHMoIGRpZmYwLCBzdG9wTWluLCA2NCwgMTMpOworICAgIHNoZWxsc29ydCggZGlmZjAsIDEzKTsKKyAgICBjdW1TdW0oc3RvcE1pbiwgZGlmZjAsIDEzLCBkaWZmMSk7CisgICAgazIgPSBkaWZmMVtzdG9wRnJlcV07CisgIH0KKyAgZWxzZSBpZiAoc3RvcEZyZXE9PTE0KQorICAgIGsyID0gMiprMDsKKyAgZWxzZQorICAgIGsyID0gMyprMDsKKworICAvKiBMaW1pdCB0byBOeXF1aXN0ICovCisgIGlmIChrMiA+ICg2NCkpCisgICAgazIgPSAoNjQpOworCisKKyAgLyogUmFuZ2UgY2hlY2tzICovCisgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSA0ODsgMSA8PSBmcyA8PSA5NjAwMCAqLworICBpZiAoICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlMpIHx8IChrMiA8PSBrMCkgKSB7CisgICAgcmV0dXJuIDI1NTsKKyAgfQorCisgIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDfFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzNTsgNDIwMDAgPD0gZnMgPD0gOTYwMDAgKi8KKyAgICBpZiAoIChmcyA+PSA0MjAwMCkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCApICkgeworICAgICAgcmV0dXJuIDI1NTsKKyAgICB9CisgICAgLyogMSA8PSBkaWZmZXJlbmNlIDw9IDMyOyA0NjAwOSA8PSBmcyA8PSA5NjAwMCAqLworICAgIGlmICggKGZzID49IDQ2MDA5KSAmJiAoIChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICkgKSB7CisgICAgICByZXR1cm4gMjU1OworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvKiAxIDw9IGRpZmZlcmVuY2UgPD0gMzU7IGZzID09IDQ0MTAwICovCisgICAgaWYgKCAoZnMgPT0gNDQxMDApICYmICggKGsyIC0gazApID4gTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDAgKSApIHsKKyAgICAgIHJldHVybiAyNTU7CisgICAgfQorICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzMjsgNDgwMDAgPD0gZnMgPD0gOTYwMDAgKi8KKyAgICBpZiAoIChmcyA+PSA0ODAwMCkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCApICkgeworICAgICAgcmV0dXJuIDI1NTsKKyAgICB9CisgIH0KKworICByZXR1cm4gazI7Cit9CisKKworLyohCisgIFxicmllZiAgICAgR2VuZXJhdGVzIG1hc3RlciBmcmVxdWVuY3kgdGFibGVzCisKKyAgRnJlcXVlbmN5IHRhYmxlcyBhcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGRvbWFpbgorICAobGluZWFyL2xvZ2FyaXRobWljKSBhbmQgZ3JhbnVsYXJpdHkuCisgIElFQyAxNDQ5Ni0zIDQuNi4xOC4zLjIuMQorCisgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLworU0JSX0VSUk9SCitzYnJkZWNVcGRhdGVGcmVxU2NhbGUoVUNIQVIgKiB2X2tfbWFzdGVyLCAgICAvKiE8IE1hc3RlciB0YWJsZSB0byBiZSBjcmVhdGVkICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm51bU1hc3RlciwgICAgICAvKiE8IE51bWJlciBvZiBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcywgICAgICAgICAgICAgLyohPCBTQlIgd29ya2luZyBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBDb250cm9sIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICBVSU5UIGZsYWdzKQoreworICBGSVhQX1NHTCBicG9fZGl2MTY7ICAgICAgICAvKiBiYW5kc19wZXJfb2N0YXZlIGRpdmlkZWQgYnkgMTYgKi8KKyAgSU5UICAgICAgZGs9MDsKKworICAvKiBJbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgVUNIQVIgIGswLCBrMiwgaTsKKyAgVUNIQVIgIG51bV9iYW5kczAgPSAwOworICBVQ0hBUiAgbnVtX2JhbmRzMSA9IDA7CisgIFVDSEFSICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOworICBVQ0hBUiAqZGlmZjAgPSBkaWZmX3RvdDsKKyAgVUNIQVIgKmRpZmYxID0gZGlmZl90b3QrTUFYX09DVEFWRTsKKyAgSU5UICAgIGsyX2FjaGl2ZWQ7CisgIElOVCAgICBrMl9kaWZmOworICBJTlQgICAgaW5jcj0wOworCisgIC8qCisgICAgRGV0ZXJtaW5lIHN0YXJ0IGJhbmQKKyAgKi8KKyAgazAgPSBnZXRTdGFydEJhbmQoZnMsIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSwgZmxhZ3MpOworICBpZiAoazAgPT0gMjU1KSB7CisgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworICAvKgorICAgIERldGVybWluZSBzdG9wIGJhbmQKKyAgKi8KKyAgazIgPSBnZXRTdG9wQmFuZChmcywgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RvcEZyZXEsIGZsYWdzLCBrMCk7CisgIGlmIChrMiA9PSAyNTUpIHsKKyAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIGlmKGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZT4wKSB7IC8qIEJhcmsgKi8KKyAgICBJTlQgazE7CisKKyAgICBpZihoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGU9PTEpIHsKKyAgICAgIGJwb19kaXYxNiA9IEZMMkZYQ09OU1RfU0dMKDEyLjBmLzE2LjBmKTsKKyAgICB9CisgICAgZWxzZSBpZihoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGU9PTIpIHsKKyAgICAgIGJwb19kaXYxNiA9IEZMMkZYQ09OU1RfU0dMKDEwLjBmLzE2LjBmKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBicG9fZGl2MTYgPSAgRkwyRlhDT05TVF9TR0woOC4wZi8xNi4wZik7CisgICAgfQorCisKKyAgICBpZiggMTAwMCAqIGsyID4gMjI0NSAqIGswICkgeyAvKiBUd28gb3IgbW9yZSByZWdpb25zICovCisgICAgICBrMSA9IDIqazA7CisKKyAgICAgIG51bV9iYW5kczAgPSBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazAsIGsxLCAwKTsKKyAgICAgIG51bV9iYW5kczEgPSBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazEsIGsyLCBoSGVhZGVyRGF0YS0+YnNfZGF0YS5hbHRlclNjYWxlICk7CisgICAgICBpZiAoIG51bV9iYW5kczAgPCAxKSB7CisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgfQorICAgICAgaWYgKCBudW1fYmFuZHMxIDwgMSApIHsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICB9CisKKyAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsKKyAgICAgIHNoZWxsc29ydCggZGlmZjAsIG51bV9iYW5kczApOworICAgICAgaWYgKGRpZmYwWzBdID09IDApIHsKKyNpZmRlZiBERUJVR19UT09MUworI2VuZGlmCisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgfQorCisgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsKKworICAgICAgQ2FsY0JhbmRzKGRpZmYxLCBrMSwgazIsIG51bV9iYW5kczEpOworICAgICAgc2hlbGxzb3J0KCBkaWZmMSwgbnVtX2JhbmRzMSk7CisgICAgICBpZihkaWZmMFtudW1fYmFuZHMwLTFdID4gZGlmZjFbMF0pIHsKKyAgICAgICAgU0JSX0VSUk9SIGVycjsKKworICAgICAgICBlcnIgPSBtb2RpZnlCYW5kcyhkaWZmMFtudW1fYmFuZHMwLTFdLGRpZmYxLCBudW1fYmFuZHMxKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIH0KKworICAgICAgLyogQWRkIDJuZCByZWdpb24gKi8KKyAgICAgIGN1bVN1bShrMSwgZGlmZjEsIG51bV9iYW5kczEsICZ2X2tfbWFzdGVyW251bV9iYW5kczBdKTsKKyAgICAgICpudW1NYXN0ZXIgPSBudW1fYmFuZHMwICsgbnVtX2JhbmRzMTsgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworCisgICAgfQorICAgIGVsc2UgeyAvKiBPbmx5IG9uZSByZWdpb24gKi8KKyAgICAgIGsxPWsyOworCisgICAgICBudW1fYmFuZHMwID0gbnVtYmVyT2ZCYW5kcyhicG9fZGl2MTYsIGswLCBrMSwgMCk7CisgICAgICBpZiAoIG51bV9iYW5kczAgPCAxKSB7CisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgfQorICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOworICAgICAgc2hlbGxzb3J0KGRpZmYwLCBudW1fYmFuZHMwKTsKKyAgICAgIGlmIChkaWZmMFswXSA9PSAwKSB7CisjaWZkZWYgREVCVUdfVE9PTFMKKyNlbmRpZgorICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIH0KKworICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7CisgICAgICAqbnVtTWFzdGVyID0gbnVtX2JhbmRzMDsgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworCisgICAgfQorICB9CisgIGVsc2UgeyAvKiBMaW5lYXIgbW9kZSAqLworICAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuYWx0ZXJTY2FsZT09MCkgeworICAgICAgICBkayA9IDE7CisgICAgICAgIC8qIEZMT09SIHRvIGdldCB0byBmZXcgbnVtYmVyIG9mIGJhbmRzIChuZXh0IGxvd2VyIGV2ZW4gbnVtYmVyKSAqLworICAgICAgICBudW1fYmFuZHMwID0gKGsyIC0gazApICYgMjU0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGsgPSAyOworICAgICAgICBudW1fYmFuZHMwID0gKCAoKGsyIC0gazApID4+IDEpICsgMSApICYgMjU0OyAvKiBST1VORCB0byB0aGUgY2xvc2VzdCBmaXQgKi8KKyAgICAgIH0KKworICAgICAgaWYgKG51bV9iYW5kczAgPCAxKSB7CisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgICAvKiBXZSBtdXN0IHJldHVybiBhbHJlYWR5IGhlcmUgYmVjYXVzZSAnaScgY2FuIGJlY29tZSBuZWdhdGl2ZSBiZWxvdy4gKi8KKyAgICAgIH0KKworICAgICAgazJfYWNoaXZlZCA9IGswICsgbnVtX2JhbmRzMCpkazsKKyAgICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7CisKKyAgICAgIGZvcihpPTA7aTxudW1fYmFuZHMwO2krKykKKyAgICAgICAgZGlmZl90b3RbaV0gPSBkazsKKworICAgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpZXZlZCAqLworICAgICAgLyogYW5kIHdlIGdvdCB0b28gd2lkZSBTQlIgYXJlYSAqLworICAgICAgaWYgKGsyX2RpZmYgPCAwKSB7CisgICAgICAgICAgaW5jciA9IDE7CisgICAgICAgICAgaSA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaWV2ZWQgKi8KKyAgICAgIC8qIGFuZCB3ZSBnb3QgdG9vIHNtYWxsIFNCUiBhcmVhICovCisgICAgICBpZiAoazJfZGlmZiA+IDApIHsKKyAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgICAgaSA9IG51bV9iYW5kczAtMTsKKyAgICAgIH0KKworICAgICAgLyogQWRqdXN0IGRpZmYgdmVjdG9yIHRvIGdldCBzZXBjLiBTQlIgcmFuZ2UgKi8KKyAgICAgIHdoaWxlIChrMl9kaWZmICE9IDApIHsKKyAgICAgICAgZGlmZl90b3RbaV0gPSBkaWZmX3RvdFtpXSAtIGluY3I7CisgICAgICAgIGkgPSBpICsgaW5jcjsKKyAgICAgICAgazJfZGlmZiA9IGsyX2RpZmYgKyBpbmNyOworICAgICAgfQorCisgICAgICBjdW1TdW0oazAsIGRpZmZfdG90LCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsvKiBjdW1zdW0gKi8KKyAgICAqbnVtTWFzdGVyID0gbnVtX2JhbmRzMDsgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworICB9CisKKyAgaWYgKCpudW1NYXN0ZXIgPCAxKSB7CisgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworCisgIC8qCisgICAgUHJpbnQgb3V0IHRoZSBjYWxjdWxhdGVkIHRhYmxlCisgICovCisKKyAgcmV0dXJuIFNCUkRFQ19PSzsKK30KKworCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGUgZnJlcXVlbmN5IHJhdGlvIG9mIG9uZSBTQlIgYmFuZAorCisgIEFsbCBTQlIgYmFuZHMgc2hvdWxkIHNwYW4gYSBjb25zdGFudCBmcmVxdWVuY3kgcmFuZ2UgaW4gdGhlIGxvZ2FyaXRobWljCisgIGRvbWFpbi4gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSByYXRpbyBvZiBhbnkgU0JSIGJhbmQncyB1cHBlciBhbmQgbG93ZXIKKyAgZnJlcXVlbmN5LgorCisgXHJldHVybiAgICBudW1fYmFuZC10aCByb290IG9mIGtfc3RhcnQva19zdG9wCisqLworc3RhdGljIEZJWFBfU0dMIGNhbGNGYWN0b3JQZXJCYW5kKGludCBrX3N0YXJ0LCBpbnQga19zdG9wLCBpbnQgbnVtX2JhbmRzKQoreworLyogU2NhbGVkIGJhbmRmYWN0b3IgYW5kIHN0ZXAgMSBiaXQgcmlnaHQgdG8gYXZvaWQgb3ZlcmZsb3cKKyAqIHVzZSBkb3VibGUgZGF0YSB0eXBlICovCisgIEZJWFBfREJMIGJhbmRmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLjI1Zik7IC8qIFN0YXJ0IHZhbHVlICovCisgIEZJWFBfREJMIHN0ZXAgPSBGTDJGWENPTlNUX0RCTCgwLjEyNWYpOyAgICAgIC8qIEluaXRpYWwgaW5jcmVtZW50IGZvciBmYWN0b3IgKi8KKworICBpbnQgICAgZGlyZWN0aW9uID0gMTsKKworLyogQmVjYXVzZSBzYXR1cmF0aW9uIGNhbid0IGJlIGRvbmUgaW4gSU5UIElJUywKKyAqIGNoYW5nZWQgc3RhcnQgYW5kIHN0b3AgZGF0YSB0eXBlIGZyb20gRklYUF9TR0wgdG8gRklYUF9EQkwgKi8KKyAgRklYUF9EQkwgc3RhcnQgPSBrX3N0YXJ0IDw8IChERlJBQ1RfQklUUy04KTsKKyAgRklYUF9EQkwgc3RvcCA9IGtfc3RvcCA8PCAoREZSQUNUX0JJVFMtOCk7CisKKyAgRklYUF9EQkwgdGVtcDsKKworICBpbnQgICBqLCBpPTA7CisKKyAgd2hpbGUgKCBzdGVwID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICBpKys7CisgICAgdGVtcCA9IHN0b3A7CisKKyAgICAvKiBDYWxjdWxhdGUgdGVtcF5udW1fYmFuZHM6ICovCisgICAgZm9yIChqPTA7IGo8bnVtX2JhbmRzOyBqKyspCisgICAgICAvL3RlbXAgPSBmTXVsdCh0ZW1wLGJhbmRmYWN0b3IpOworICAgICAgdGVtcCA9IGZNdWx0RGl2Mih0ZW1wLGJhbmRmYWN0b3IpPDwyOworCisgICAgaWYgKHRlbXA8c3RhcnQpIHsgLyogRmFjdG9yIHRvbyBzdHJvbmcsIG1ha2UgaXQgd2Vha2VyICovCisgICAgICBpZiAoZGlyZWN0aW9uID09IDApCisgICAgICAgIC8qIEhhbGZlbiBzdGVwLiBSaWdodCBzaGlmdCBpcyBub3QgZG9uZSBhcyBmcmFjdCBiZWNhdXNlIG90aGVyd2lzZSB0aGUKKyAgICAgICAgICAgbG93ZXN0IGJpdCBjYW5ub3QgYmUgY2xlYXJlZCBkdWUgdG8gcm91bmRpbmcgKi8KKyAgICAgICAgc3RlcCA9IChGSVhQX0RCTCkoKExPTkcpc3RlcCA+PiAxKTsKKyAgICAgIGRpcmVjdGlvbiA9IDE7CisgICAgICBiYW5kZmFjdG9yID0gYmFuZGZhY3RvciArIHN0ZXA7CisgICAgfQorICAgIGVsc2UgeyAgLyogRmFjdG9yIGlzIHRvbyB3ZWFrOiBtYWtlIGl0IHN0cm9uZ2VyICovCisgICAgICBpZiAoZGlyZWN0aW9uID09IDEpCisgICAgICAgIHN0ZXAgPSAoRklYUF9EQkwpKChMT05HKXN0ZXAgPj4gMSk7CisgICAgICBkaXJlY3Rpb24gPSAwOworICAgICAgYmFuZGZhY3RvciA9IGJhbmRmYWN0b3IgLSBzdGVwOworICAgIH0KKworICAgIGlmIChpPjEwMCkgeworICAgICAgc3RlcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIH0KKyAgfQorICByZXR1cm4gRlhfREJMMkZYX1NHTChiYW5kZmFjdG9yPDwxKTsKK30KKworCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGUgbnVtYmVyIG9mIFNCUiBiYW5kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBzdG9wIGJhbmQKKworICBHaXZlbiB0aGUgbnVtYmVyIG9mIGJhbmRzIHBlciBvY3RhdmUsIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBob3cgbWFueQorICBiYW5kcyBmaXQgaW4gdGhlIGdpdmVuIGZyZXF1ZW5jeSByYW5nZS4KKyAgV2hlbiB0aGUgd2FycEZsYWcgaXMgc2V0LCB0aGUgJ2JhbmQgZGVuc2l0eScgaXMgZGVjcmVhc2VkIGJ5IGEgZmFjdG9yCisgIG9mIDEvMS4zCisKKyAgXHJldHVybiAgICBudW1iZXIgb2YgYmFuZHMKKyovCitzdGF0aWMgaW50CitudW1iZXJPZkJhbmRzKEZJWFBfU0dMIGJwb19kaXYxNiwgLyohPCBJbnB1dDogbnVtYmVyIG9mIGJhbmRzIHBlciBvY3RhdmUgZGl2aWRlZCBieSAxNiAqLworICAgICAgICAgICAgICBpbnQgICAgc3RhcnQsICAgICAvKiE8IEZpcnN0IFFNRiBiYW5kIG9mIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgaW50ICAgIHN0b3AsICAgICAgLyohPCBMYXN0IFFNRiBiYW5kIG9mIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKyAxICovCisgICAgICAgICAgICAgIGludCAgICB3YXJwRmxhZykgIC8qITwgU3RyZXRjaGluZyBmbGFnICovCit7CisgIEZJWFBfU0dMIG51bV9iYW5kc19kaXYxMjg7CisgIGludCAgICBudW1fYmFuZHM7CisKKyAgbnVtX2JhbmRzX2RpdjEyOCA9IEZYX0RCTDJGWF9TR0woZk11bHQoRkRLX2dldE51bU9jdGF2ZXNEaXY4KHN0YXJ0LHN0b3ApLGJwb19kaXYxNikpOworCisgIGlmICh3YXJwRmxhZykgeworICAgIC8qIEFwcGx5IHRoZSB3YXJwIGZhY3RvciBvZiAxLjMgdG8gZ2V0IHdpZGVyIGJhbmRzLiAgV2UgdXNlIGEgdmFsdWUKKyAgICAgICBvZiAzMjc2OC8yNTIwMCBpbnN0ZWFkIG9mIHRoZSBleGFjdCB2YWx1ZSB0byBhdm9pZCBjcml0aWNhbCBjYXNlcworICAgICAgIG9mIHJvdW5kaW5nLgorICAgICovCisgICAgbnVtX2JhbmRzX2RpdjEyOCA9IEZYX0RCTDJGWF9TR0woZk11bHQobnVtX2JhbmRzX2RpdjEyOCwgRkwyRlhDT05TVF9TR0woMjUyMDAuMC8zMjc2OC4wKSkpOworICB9CisKKyAgLyogYWRkIHNjYWxlZCAxIGZvciByb3VuZGluZyB0byBldmVuIG51bWJlcnM6ICovCisgIG51bV9iYW5kc19kaXYxMjggPSBudW1fYmFuZHNfZGl2MTI4ICsgRkwyRlhDT05TVF9TR0woIDEuMGYvMTI4LjBmICk7CisgIC8qIHNjYWxlIGJhY2sgdG8gcmlnaHQgYWxpZ25lZCBpbnRlZ2VyIGFuZCBkb3VibGUgdGhlIHZhbHVlOiAqLworICBudW1fYmFuZHMgPSAyICogKChMT05HKW51bV9iYW5kc19kaXYxMjggPj4gKEZSQUNUX0JJVFMgLSA3KSk7CisKKyAgcmV0dXJuKG51bV9iYW5kcyk7Cit9CisKKworLyohCisgIFxicmllZiAgICAgQ2FsY3VsYXRlIHdpZHRoIG9mIFNCUiBiYW5kcworCisgIEdpdmVuIHRoZSBkZXNpcmVkIG51bWJlciBvZiBiYW5kcyB3aXRoaW4gdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UsCisgIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgZWFjaCBTQlIgYmFuZCBpbiBRTUYgY2hhbm5lbHMuCisgIFRoZSBiYW5kcyBnZXQgd2lkZXIgZnJvbSBzdGFydCB0byBzdG9wIChiYXJrIHNjYWxlKS4KKyovCitzdGF0aWMgdm9pZAorQ2FsY0JhbmRzKFVDSEFSICogZGlmZiwgICAgLyohPCBWZWN0b3Igb2Ygd2lkdGhzIHRvIGJlIGNhbGN1bGF0ZWQgKi8KKyAgICAgICAgICBVQ0hBUiBzdGFydCwgICAgIC8qITwgTG93ZXIgZW5kIG9mIHN1YmJhbmQgcmFuZ2UgKi8KKyAgICAgICAgICBVQ0hBUiBzdG9wLCAgICAgIC8qITwgVXBwZXIgZW5kIG9mIHN1YmJhbmQgcmFuZ2UgKi8KKyAgICAgICAgICBVQ0hBUiBudW1fYmFuZHMpIC8qITwgRGVzaXJlZCBudW1iZXIgb2YgYmFuZHMgKi8KK3sKKyAgaW50IGk7CisgIGludCBwcmV2aW91czsKKyAgaW50IGN1cnJlbnQ7CisgIEZJWFBfU0dMIGV4YWN0LCB0ZW1wOworICBGSVhQX1NHTCBiYW5kZmFjdG9yID0gY2FsY0ZhY3RvclBlckJhbmQoc3RhcnQsIHN0b3AsIG51bV9iYW5kcyk7CisKKyAgcHJldmlvdXMgPSBzdG9wOyAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgUU1GIGNoYW5uZWwgKi8KKyAgZXhhY3QgPSAoRklYUF9TR0wpKHN0b3AgPDwgKEZSQUNUX0JJVFMtOCkpOyAvKiBTaGlmdCBsZWZ0IHRvIGdhaW4gc29tZSBhY2N1cmFjeSAqLworCisgIGZvcihpPW51bV9iYW5kcy0xOyBpPj0wOyBpLS0pIHsKKyAgICAvKiBDYWxjdWxhdGUgYm9yZGVyIG9mIG5leHQgbG93ZXIgc2JyIGJhbmQgKi8KKyAgICBleGFjdCA9IEZYX0RCTDJGWF9TR0woZk11bHQoZXhhY3QsYmFuZGZhY3RvcikpOworCisgICAgLyogQWRkIHNjYWxlZCAwLjUgZm9yIHJvdW5kaW5nOgorICAgICAgIFdlIHVzZSBhIHZhbHVlIDEyOC8yNTYgaW5zdGVhZCBvZiAwLjUgdG8gYXZvaWQgc29tZSBjcml0aWNhbCBjYXNlcyBvZiByb3VuZGluZy4gKi8KKyAgICB0ZW1wID0gZXhhY3QgKyAgRkwyRlhDT05TVF9TR0woMTI4LjAvMzI3NjguMCk7CisKKyAgICAvKiBzY2FsZSBiYWNrIHRvIHJpZ2h0IGFsaW5nZWQgaW50ZWdlcjogKi8KKyAgICBjdXJyZW50ID0gKExPTkcpdGVtcCA+PiAoRlJBQ1RfQklUUy04KTsKKworICAgIC8qIFNhdmUgd2lkdGggb2YgYmFuZCBpICovCisgICAgZGlmZltpXSA9IHByZXZpb3VzIC0gY3VycmVudDsKKyAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgIH0KK30KKworCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGUgY3VtdWxhdGVkIHN1bSB2ZWN0b3IgZnJvbSBkZWx0YSB2ZWN0b3IKKyovCitzdGF0aWMgdm9pZAorY3VtU3VtKFVDSEFSIHN0YXJ0X3ZhbHVlLCBVQ0hBUiogZGlmZiwgVUNIQVIgbGVuZ3RoLCBVQ0hBUiAqc3RhcnRfYWRyZXNzKQoreworICBpbnQgaTsKKyAgc3RhcnRfYWRyZXNzWzBdPXN0YXJ0X3ZhbHVlOworICBmb3IoaT0xOyBpPD1sZW5ndGg7IGkrKykKKyAgICBzdGFydF9hZHJlc3NbaV0gPSBzdGFydF9hZHJlc3NbaS0xXSArIGRpZmZbaS0xXTsKK30KKworCisvKiEKKyAgXGJyaWVmICAgICBBZGFwdCB3aWR0aCBvZiBmcmVxdWVuY3kgYmFuZHMgaW4gdGhlIHNlY29uZCByZWdpb24KKworICBJZiBTQlIgc3BhbnMgbW9yZSB0aGFuIDIgb2N0YXZlcywgdGhlIHVwcGVyIHBhcnQgb2YgYSBiYXJrLWZyZXF1ZW5jeS1zY2FsZQorICBpcyBjYWxjdWxhdGVkIHNlcGFyYXRlbHkuIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gYXZvaWQgdGhhdCB0aGUgc2Vjb25kIHJlZ2lvbgorICBzdGFydHMgd2l0aCBhIGJhbmQgc21hbGxlciB0aGFuIHRoZSBoaWdoZXN0IGJhbmQgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KKyovCitzdGF0aWMgU0JSX0VSUk9SCittb2RpZnlCYW5kcyhVQ0hBUiBtYXhfYmFuZF9wcmV2aW91cywgVUNIQVIgKiBkaWZmLCBVQ0hBUiBsZW5ndGgpCit7CisgIGludCBjaGFuZ2UgPSBtYXhfYmFuZF9wcmV2aW91cyAtIGRpZmZbMF07CisKKyAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdCBvbmUgKi8KKyAgaWYgKCBjaGFuZ2UgPiAoZGlmZltsZW5ndGgtMV0tZGlmZlswXSk+PjEgKQorICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aC0xXS1kaWZmWzBdKT4+MTsKKworICBkaWZmWzBdICs9IGNoYW5nZTsKKyAgZGlmZltsZW5ndGgtMV0gLT0gY2hhbmdlOworICBzaGVsbHNvcnQoZGlmZiwgbGVuZ3RoKTsKKworICByZXR1cm4gU0JSREVDX09LOworfQorCisKKy8qIQorICBcYnJpZWYgICBVcGRhdGUgaGlnaCByZXNvbHV0aW9uIGZyZXF1ZW5jeSBiYW5kIHRhYmxlCisqLworc3RhdGljIHZvaWQKK3NicmRlY1VwZGF0ZUhpUmVzKFVDSEFSICogaF9oaXJlcywKKyAgICAgICAgICAgICAgICAgIFVDSEFSICogbnVtX2hpcmVzLAorICAgICAgICAgICAgICAgICAgVUNIQVIgKiB2X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgVUNIQVIgbnVtX2JhbmRzLAorICAgICAgICAgICAgICAgICAgVUNIQVIgeG92ZXJfYmFuZCkKK3sKKyAgVUNIQVIgaTsKKworICAqbnVtX2hpcmVzID0gbnVtX2JhbmRzLXhvdmVyX2JhbmQ7CisKKyAgZm9yKGk9eG92ZXJfYmFuZDsgaTw9bnVtX2JhbmRzOyBpKyspIHsKKyAgICBoX2hpcmVzW2kteG92ZXJfYmFuZF0gPSB2X2tfbWFzdGVyW2ldOworICB9Cit9CisKKworLyohCisgIFxicmllZiAgQnVpbGQgbG93IHJlc29sdXRpb24gdGFibGUgb3V0IG9mIGhpZ2ggcmVzb2x1dGlvbiB0YWJsZQorKi8KK3N0YXRpYyB2b2lkCitzYnJkZWNVcGRhdGVMb1JlcyhVQ0hBUiAqIGhfbG9yZXMsCisgICAgICAgICAgICAgICAgICBVQ0hBUiAqIG51bV9sb3JlcywKKyAgICAgICAgICAgICAgICAgIFVDSEFSICogaF9oaXJlcywKKyAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9oaXJlcykKK3sKKyAgVUNIQVIgaTsKKworICBpZiggKG51bV9oaXJlcyAmIDEpID09IDApIHsKKyAgICAvKiBJZiBldmVuIG51bWJlciBvZiBoaXJlcyBiYW5kcyAqLworICAgICpudW1fbG9yZXMgPSBudW1faGlyZXMgPj4gMTsKKyAgICAvKiBVc2UgZXZlcnkgc2Vjb25kIGxvcmVzPWhpcmVzWzAsMiw0Li4uXSAqLworICAgIGZvcihpPTA7IGk8PSpudW1fbG9yZXM7IGkrKykKKyAgICAgIGhfbG9yZXNbaV0gPSBoX2hpcmVzW2kqMl07CisgIH0KKyAgZWxzZSB7CisgICAgLyogT2RkIG51bWJlciBvZiBoaXJlcywgd2hpY2ggbWVhbnMgeG92ZXIgaXMgb2RkICovCisgICAgKm51bV9sb3JlcyA9IChudW1faGlyZXMrMSkgPj4gMTsKKyAgICAvKiBVc2UgbG9yZXM9aGlyZXNbMCwxLDMsNSAuLi5dICovCisgICAgaF9sb3Jlc1swXSA9IGhfaGlyZXNbMF07CisgICAgZm9yKGk9MTsgaTw9Km51bV9sb3JlczsgaSsrKSB7CisgICAgICBoX2xvcmVzW2ldID0gaF9oaXJlc1tpKjItMV07CisgICAgfQorICB9Cit9CisKKworLyohCisgIFxicmllZiAgIERlcml2ZSBhIGxvdy1yZXNvbHV0aW9uIGZyZXF1ZW5jeS10YWJsZSBmcm9tIHRoZSBtYXN0ZXIgZnJlcXVlbmN5IHRhYmxlCisqLwordm9pZAorc2JyZGVjRG93blNhbXBsZUxvUmVzKFVDSEFSICp2X3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBudW1fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9SZWYpCit7CisgIGludCBzdGVwOworICBpbnQgaSxqOworICBpbnQgb3JnX2xlbmd0aCxyZXN1bHRfbGVuZ3RoOworICBpbnQgdl9pbmRleFtNQVhfRlJFUV9DT0VGRlM+PjFdOworCisgIC8qIGluaXQgKi8KKyAgb3JnX2xlbmd0aCA9IG51bV9SZWY7CisgIHJlc3VsdF9sZW5ndGggPSBudW1fcmVzdWx0OworCisgIHZfaW5kZXhbMF0gPSAwOyAgIC8qIEFsd2F5cyB1c2UgbGVmdCBib3JkZXIgKi8KKyAgaT0wOworICB3aGlsZShvcmdfbGVuZ3RoID4gMCkgeworICAgIC8qIENyZWF0ZSBkb3duc2FtcGxlIHZlY3RvciAqLworICAgIGkrKzsKKyAgICBzdGVwID0gb3JnX2xlbmd0aCAvIHJlc3VsdF9sZW5ndGg7CisgICAgb3JnX2xlbmd0aCA9IG9yZ19sZW5ndGggLSBzdGVwOworICAgIHJlc3VsdF9sZW5ndGgtLTsKKyAgICB2X2luZGV4W2ldID0gdl9pbmRleFtpLTFdICsgc3RlcDsKKyAgfQorCisgIGZvcihqPTA7ajw9aTtqKyspIHsKKyAgICAvKiBVc2UgZG93bnNhbXBsZSB2ZWN0b3IgdG8gaW5kZXggTG9SZXNvbHV0aW9uIHZlY3RvciAqLworICAgIHZfcmVzdWx0W2pdPWZyZXFCYW5kVGFibGVSZWZbdl9pbmRleFtqXV07CisgIH0KKworfQorCisKKy8qIQorICBcYnJpZWYgICBTb3J0aW5nIHJvdXRpbmUKKyovCit2b2lkIHNoZWxsc29ydChVQ0hBUiAqaW4sIFVDSEFSIG4pCit7CisKKyAgaW50IGksIGosIHYsIHc7CisgIGludCBpbmMgPSAxOworCisgIGRvCisgICAgaW5jID0gMyAqIGluYyArIDE7CisgIHdoaWxlIChpbmMgPD0gbik7CisKKyAgZG8geworICAgIGluYyA9IGluYyAvIDM7CisgICAgZm9yIChpID0gaW5jOyBpIDwgbjsgaSsrKSB7CisgICAgICB2ID0gaW5baV07CisgICAgICBqID0gaTsKKyAgICAgIHdoaWxlICgodz1pbltqLWluY10pID4gdikgeworICAgICAgICBpbltqXSA9IHc7CisgICAgICAgIGogLT0gaW5jOworICAgICAgICBpZiAoaiA8IGluYykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGluW2pdID0gdjsKKyAgICB9CisgIH0gd2hpbGUgKGluYyA+IDEpOworCit9CisKKworCisvKiEKKyAgXGJyaWVmICAgUmVzZXQgZnJlcXVlbmN5IGJhbmQgdGFibGVzCisgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCisqLworU0JSX0VSUk9SCityZXNldEZyZXFCYW5kVGFibGVzKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IFVJTlQgZmxhZ3MpCit7CisgIFNCUl9FUlJPUiBlcnIgPSBTQlJERUNfT0s7CisgIGludCBrMixreCwgbHNiLCB1c2I7CisgIGludCAgICAgaW50VGVtcDsKKyAgVUNIQVIgICAgbkJhbmRzTG8sIG5CYW5kc0hpOworICBIQU5ETEVfRlJFUV9CQU5EX0RBVEEgaEZyZXEgPSAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YTsKKworICAvKiBDYWxjdWxhdGUgbWFzdGVyIGZyZXF1ZW5jeSBmdW5jdGlvbiAqLworICBlcnIgPSBzYnJkZWNVcGRhdGVGcmVxU2NhbGUoaEZyZXEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEZyZXEtPm51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworICBpZiAoIGVyciB8fCAoaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA+IGhGcmVxLT5udW1NYXN0ZXIpICkgeworICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgLyogRGVyaXZlIEhpcmVzb2x1dGlvbiBmcm9tIG1hc3RlciBmcmVxdWVuY3kgZnVuY3Rpb24gKi8KKyAgc2JyZGVjVXBkYXRlSGlSZXMoaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0sICZuQmFuZHNIaSwgaEZyZXEtPnZfa19tYXN0ZXIsIGhGcmVxLT5udW1NYXN0ZXIsIGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQgKTsKKyAgLyogRGVyaXZlIExvcmVzb2x1dGlvbiBmcm9tIEhpcmVzb2x1dGlvbiAqLworICBzYnJkZWNVcGRhdGVMb1JlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXSwgJm5CYW5kc0xvLCBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwgbkJhbmRzSGkpOworCisKKyAgaEZyZXEtPm5TZmJbMF0gPSBuQmFuZHNMbzsKKyAgaEZyZXEtPm5TZmJbMV0gPSBuQmFuZHNIaTsKKworICAvKiBDaGVjayBpbmRleCB0byBmcmVxQmFuZFRhYmxlWzBdICovCisgIGlmICggIShuQmFuZHNMbyA+IDApIHx8IChuQmFuZHNMbyA+IChNQVhfRlJFUV9DT0VGRlM+PjEpKSApIHsKKyAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIGxzYiA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdWzBdOworICB1c2IgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXVtuQmFuZHNMb107CisKKyAgLyogQWRkaXRpb25hbCBjaGVjayBmb3IgbHNiICovCisgIGlmICggKGxzYiA+ICgzMikpIHx8IChsc2IgPj0gdXNiKSApIHsKKyAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisKKyAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcyAqLworCisgIGsyID0gaEZyZXEtPmZyZXFCYW5kVGFibGVbMV1bbkJhbmRzSGldOworICBreCA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdWzBdOworCisgIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyA9PSAwKQorICB7CisgICAgaEZyZXEtPm5OZmIgPSAxOworICB9CisgIGVsc2UgLyogQ2FsY3VsYXRlIG5vIG9mIG5vaXNlIGJhbmRzIDEsMiBvciAzIGJhbmRzL29jdGF2ZSAqLworICB7CisgICAgLyogRmV0Y2ggbnVtYmVyIG9mIG9jdGF2ZXMgZGl2aWRlZCBieSAzMiAqLworICAgIGludFRlbXAgPSAoTE9ORylGREtfZ2V0TnVtT2N0YXZlc0Rpdjgoa3gsazIpID4+IDI7CisKKyAgICAvKiBJbnRlZ2VyLU11bHRpcGxpY2F0aW9uIHdpdGggbnVtYmVyIG9mIGJhbmRzOiAqLworICAgIGludFRlbXAgPSBpbnRUZW1wICogaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHM7CisKKyAgICAvKiBBZGQgc2NhbGVkIDAuNSBmb3Igcm91bmRpbmc6ICovCisgICAgaW50VGVtcCA9IGludFRlbXAgKyAoTE9ORylGTDJGWENPTlNUX1NHTCgwLjVmLzMyLjBmKTsKKworICAgIC8qIENvbnZlcnQgdG8gcmlnaHQtYWxpZ25lZCBpbnRlZ2VyOiAqLworICAgIGludFRlbXAgPSBpbnRUZW1wID4+IChGUkFDVF9CSVRTIC0gMSAvKnNpZ24qLyAtIDUgLyogcmVzY2FsZSAqLyk7CisKKyAgICAvKiBDb21wYXJlIHdpdGggZmxvYXQgY2FsY3VsYXRpb24gKi8KKyAgICBGREtfQVNTRVJUKCBpbnRUZW1wID09ICAoaW50KSgoaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHMgKiBGREtsb2coIChmbG9hdClrMi9reCkgLyAoZmxvYXQpKEZES2xvZygyLjApKSkrMC41KSApOworCisgICAgaWYoIGludFRlbXA9PTApCisgICAgICBpbnRUZW1wPTE7CisKKyAgICBoRnJlcS0+bk5mYiA9IGludFRlbXA7CisgIH0KKworICBoRnJlcS0+bkludmZCYW5kcyA9IGhGcmVxLT5uTmZiOworCisgIGlmKCBoRnJlcS0+bk5mYiA+IE1BWF9OT0lTRV9DT0VGRlMgKSB7CisgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworICAvKiBHZXQgbm9pc2UgYmFuZHMgKi8KKyAgc2JyZGVjRG93blNhbXBsZUxvUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoRnJlcS0+bk5mYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgbkJhbmRzTG8pOworCisKKworCisgIGhGcmVxLT5sb3dTdWJiYW5kICA9IGxzYjsKKyAgaEZyZXEtPmhpZ2hTdWJiYW5kID0gdXNiOworCisgIHJldHVybiBTQlJERUNfT0s7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuaCBiL2FhYy9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTRmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuaApAQCAtMCwwICsxLDEwNyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgICBGcmVxdWVuY3kgc2NhbGUgcHJvdG90eXBlcyAgCisqLworI2lmbmRlZiBfX0ZSRVFfU0NBX0gKKyNkZWZpbmUgX19GUkVRX1NDQV9ICisKKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAiZW52X2V4dHIuaCIKKworaW50CitzYnJkZWNVcGRhdGVGcmVxU2NhbGUoVUNIQVIgKiB2X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhKTsKKwordm9pZCBzYnJkZWNEb3duU2FtcGxlTG9SZXMoVUNIQVIgKnZfcmVzdWx0LCBVQ0hBUiBudW1fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmZyZXFCYW5kVGFibGVSZWYsIFVDSEFSIG51bV9SZWYpOworCit2b2lkIHNoZWxsc29ydChVQ0hBUiAqaW4sIFVDSEFSIG4pOworCitTQlJfRVJST1IKK3Jlc2V0RnJlcUJhbmRUYWJsZXMoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgVUlOVCBmbGFncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAgYi9hYWMvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTllNGZkCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxNjIyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgU0JSIGRlY29kZXIgZnJvbnRlbmQKKyAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmcm9udGVuZCB0byB0aGUgU0JSIGRlY29kZXIuIFRoZSBmdW5jdGlvbiBvcGVuU0JSKCkgaXMgY2FsbGVkIGZvcgorICBpbml0aWFsaXphdGlvbi4gVGhlIGZ1bmN0aW9uIHNickRlY29kZXJfQXBwbHkoKSBpcyBjYWxsZWQgZm9yIGVhY2ggZnJhbWUuIHNicl9BcHBseSgpIHdpbGwgY2FsbCB0aGUKKyAgcmVxdWlyZWQgZnVuY3Rpb25zIHRvIGRlY29kZSB0aGUgcmF3IFNCUiBkYXRhIChwcm92aWRlZCBieSBlbnZfZXh0ci5jcHApLCB0byBkZWNvZGUgdGhlIGVudmVsb3BlIGRhdGEgYW5kIG5vaXNlIGZsb29yIGxldmVscyBbZGVjb2RlU2JyRGF0YSgpXSwKKyAgYW5kIHRvIGZpbmFsbHkgYXBwbHkgU0JSIHRvIHRoZSBjdXJyZW50IGZyYW1lIFtzYnJfZGVjKCldLgorCisgIFxzYSBzYnJEZWNvZGVyX0FwcGx5KCksIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CisqLworCisvKiEKKyAgXHBhZ2UgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3IE92ZXJ2aWV3IG9mIGltcG9ydGFudCBpbmZvcm1hdGlvbiByZXNvdXJjZXMgYW5kIHNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24KKworICBUaGUgcHJpbWFyeSBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGlzIGJhc2VkIG9uIGdlbmVyYXRlZCBhbmQgY3Jvc3MtcmVmZXJlbmNlZCBIVE1MIGZpbGVzIHVzaW5nCisgIDxhIEhSRUY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmciPmRveHlnZW48L2E+LiBBcyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnRhdGlvbgorICB5b3UgY2FuIGZpbmQgbW9yZSBleHRlbnNpdmUgZGVzY3JpcHRpb25zIGFib3V0IGtleSBjb25jZXB0cyBhbmQgYWxnb3JpdGhtcyBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKworICA8aDI+UHJvZ3JhbW1pbmc8L2gyPgorCisgIFxsaSBCdWZmZXIgbWFuYWdlbWVudDogc2JyRGVjb2Rlcl9BcHBseSgpIGFuZCBzYnJfZGVjKCkKKyAgXGxpIEludGVybmFsIHNjYWxlIGZhY3RvcnMgdG8gbWF4aW1pemUgU05SIG9uIGZpeGVkIHBvaW50IHByb2Nlc3NvcnM6ICNRTUZfU0NBTEVfRkFDVE9SCisgIFxsaSBTcGVjaWFsIG1hbnRpc3NhLWV4cG9uZW50IGZvcm1hdDogQ3JlYXRlZCBpbiByZXF1YW50aXplRW52ZWxvcGVEYXRhKCkgYW5kIHVzZWQgaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQorCisgIDxoMj5BbGdvcml0aG1pYyBkZXRhaWxzPC9oMj4KKyAgXGxpIEFib3V0IHRoZSBTQlIgZGF0YSBmb3JtYXQ6IFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFuZCBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5UCisgIFxsaSBEZXRhaWxzIGFib3V0IHRoZSBiaXRzdHJlYW0gZGVjb2RlcjogZW52X2V4dHIuY3BwCisgIFxsaSBEZXRhaWxzIGFib3V0IHRoZSBRTUYgZmlsdGVyYmFuayBhbmQgdGhlIHByb3ZpZGVkIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbjogcW1mX2RlYy5jcHAKKyAgXGxpIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zcG9zZXI6IGxwcF90cmFuLmNwcAorICBcbGkgRGV0YWlscyBhYm91dCB0aGUgZW52ZWxvcGUgYWRqdXN0ZXI6IGVudl9jYWxjLmNwcAorCisqLworCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisjaW5jbHVkZSAic2JyZGVjX2ZyZXFfc2NhLmgiCisjaW5jbHVkZSAiZW52X2V4dHIuaCIKKyNpbmNsdWRlICJzYnJfZGVjLmgiCisjaW5jbHVkZSAiZW52X2RlYy5oIgorI2luY2x1ZGUgInNicl9jcmMuaCIKKyNpbmNsdWRlICJzYnJfcmFtLmgiCisjaW5jbHVkZSAic2JyX3JvbS5oIgorI2luY2x1ZGUgImxwcF90cmFuLmgiCisjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCisKKworI2luY2x1ZGUgInNicmRlY19kcmMuaCIKKworI2luY2x1ZGUgInBzYml0ZGVjLmgiCisKKworLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwwIDIKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwxIDIKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDYKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVElUTEUgIlNCUiBEZWNvZGVyIgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFNCUkRFQ09ERVJfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBTQlJERUNPREVSX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKKworCisKKworc3RhdGljIFVDSEFSIGdldEhlYWRlclNsb3QoIFVDSEFSIGN1cnJlbnRTbG90LCBVQ0hBUiBoZHJTbG90VXNhZ2VbKDEpKzFdICkKK3sKKyAgVUlOVCAgb2NjdXBpZWQgPSAwOworICBpbnQgICBzOworICBVQ0hBUiBzbG90ID0gaGRyU2xvdFVzYWdlW2N1cnJlbnRTbG90XTsKKworICBGREtfQVNTRVJUKCgxKSsxIDwgMzIpOworCisgIGZvciAocyA9IDA7IHMgPCAoMSkrMTsgcysrKSB7CisgICAgaWYgKCAoaGRyU2xvdFVzYWdlW3NdID09IHNsb3QpCisgICAgICAmJiAocyAhPSBzbG90KSApIHsKKyAgICAgIG9jY3VwaWVkID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChvY2N1cGllZCkgeworICAgIG9jY3VwaWVkID0gMDsKKworICAgIGZvciAocyA9IDA7IHMgPCAoMSkrMTsgcysrKSB7CisgICAgICBvY2N1cGllZCB8PSAxIDw8IGhkclNsb3RVc2FnZVtzXTsKKyAgICB9CisgICAgZm9yIChzID0gMDsgcyA8ICgxKSsxOyBzKyspIHsKKyAgICAgIGlmICggIShvY2N1cGllZCAmIDB4MSkgKSB7CisgICAgICAgIHNsb3QgPSBzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG9jY3VwaWVkID4+PSAxOworICAgIH0KKyAgfQorCisgIHJldHVybiBzbG90OworfQorCitzdGF0aWMgdm9pZCBjb3B5U2JySGVhZGVyKCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhEc3QsIGNvbnN0IEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNyYyApCit7CisgIC8qIGNvcHkgdGhlIHdob2xlIGhlYWRlciBtZW1vcnkgKGluY2x1ZGluZyBwb2ludGVycykgKi8KKyAgRkRLbWVtY3B5KCBoRHN0LCBoU3JjLCBzaXplb2YoU0JSX0hFQURFUl9EQVRBKSApOworCisgIC8qIHVwZGF0ZSBwb2ludGVycyAqLworICBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSAgPSBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvOworICBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVsxXSA9IGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlSGk7Cit9CisKKworLyohCisgIFxicmllZiBSZXNldCBTQlIgZGVjb2Rlci4KKworICBSZXNldCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgU0JSIGhhcyBiZWVuIHN1Y2Vzc2Z1bGx5IGRldGVjdGVkIGJ5CisgIGFuIGFwcHJvcHJpYXRlIGNoZWNrRm9yUGF5bG9hZCgpIGZ1bmN0aW9uLgorCisgIFxyZXR1cm4gRXJyb3IgY29kZS4KKyovCitzdGF0aWMKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX1Jlc2V0RWxlbWVudCAoCisgICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYsCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGVsZW1lbnRJbmRleCwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgb3ZlcmxhcAorICAgICAgICApCit7CisgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKKyAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOworICBVSU5UIHFtZkZsYWdzID0gMDsKKworICBpbnQgaSwgc3luRG93bnNhbXBsZUZhYzsKKworICAvKiBDaGVjayBpbi9vdXQgc2FtcGxlcmF0ZXMgKi8KKyAgaWYgKCBzYW1wbGVSYXRlSW4gPCA2NDAwCisgICAgfHwgc2FtcGxlUmF0ZUluID4gNDgwMDAKKyAgICAgKQorICB7CisgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICggc2FtcGxlUmF0ZU91dCA+IDk2MDAwICkKKyAgeworICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBTZXQgUU1GIG1vZGUgZmxhZ3MgKi8KKyAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0xPV19QT1dFUikKKyAgICBxbWZGbGFncyB8PSBRTUZfRkxBR19MUDsKKworICBpZiAoc2VsZi0+Y29yZUNvZGVjID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpIHsKKyAgICAgIHFtZkZsYWdzIHw9ICBRTUZfRkxBR19NUFNMREZCOworICAgIH0gZWxzZSB7CisgICAgICBxbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7CisgICAgfQorICB9CisKKyAgLyogU2V0IGRvd25zYW1wbGluZyBmYWN0b3IgZm9yIHN5bnRoZXNpcyBmaWx0ZXIgYmFuayAqLworICBpZiAoc2FtcGxlUmF0ZU91dCA9PSAwKQorICB7CisgICAgLyogbm8gc2luZ2xlIHJhdGUgbW9kZSAqLworICAgICAgc2FtcGxlUmF0ZU91dCA9IHNhbXBsZVJhdGVJbjw8MTsgLyogSW4gY2FzZSBvZiBpbXBsaWNpdCBzaWduYWxsaW5nLCBhc3N1bWUgZHVhbCByYXRlIFNCUiAqLworICB9CisKKyAgaWYgKCBzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCApIHsKKyAgICBzeW5Eb3duc2FtcGxlRmFjID0gMjsKKyAgICBzZWxmLT5mbGFncyB8PSAgU0JSREVDX0RPV05TQU1QTEU7CisgIH0gZWxzZSB7CisgICAgc3luRG93bnNhbXBsZUZhYyA9IDE7CisgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19ET1dOU0FNUExFOworICB9CisKKyAgc2VsZi0+c3luRG93bnNhbXBsZUZhYyA9IHN5bkRvd25zYW1wbGVGYWM7CisgIHNlbGYtPnNhbXBsZVJhdGVPdXQgPSBzYW1wbGVSYXRlT3V0OworCisgIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoMSkrMTsgaSsrKQorICAgIHsKKyAgICAgIGhTYnJIZWFkZXIgPSAmKHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2ldKTsKKworICAgICAgLyogaW5pdCBhIGRlZmF1bHQgaGVhZGVyIHN1Y2ggdGhhdCB3ZSBjYW4gYXQgbGVhc3QgZG8gdXBzYW1wbGluZyBsYXRlciAqLworICAgICAgc2JyRXJyb3IgPSBpbml0SGVhZGVyRGF0YSgKKyAgICAgICAgICAgICAgaFNickhlYWRlciwKKyAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgIHNlbGYtPmZsYWdzCisgICAgICAgICAgICAgICk7CisgICAgfQorICB9CisKKyAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEluaXQgU0JSIGNoYW5uZWxzIGdvaW5nIHRvIGJlIGFzc2lnbmVkIHRvIGEgU0JSIGVsZW1lbnQgKi8KKyAgeworICAgIGludCBjaDsKKworICAgIGZvciAoY2g9MDsgY2g8c2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+bkNoYW5uZWxzOyBjaCsrKQorICAgIHsKKyAgICAgIC8qIGFuZCBjcmVhdGUgc2JyRGVjICovCisgICAgICBzYnJFcnJvciA9IGNyZWF0ZVNickRlYyAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JySGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT50cmFuc3Bvc2VyU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bkRvd25zYW1wbGVGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggKTsKKworICAgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy9GREttZW1jbGVhcihzYnJfT3ZlcmxhcEJ1ZmZlciwgc2l6ZW9mKHNicl9PdmVybGFwQnVmZmVyKSk7CisKKyAgaWYgKHNlbGYtPm51bVNickVsZW1lbnRzID09IDEpIHsKKyAgICBzd2l0Y2ggKCBzZWxmLT5jb3JlQ29kZWMgKSB7CisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgIGNhc2UgQU9UX1NCUjoKKyAgICBjYXNlIEFPVF9QUzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgIGNhc2UgQU9UX0RSTV9TVVJST1VORDoKKyAgICAgIGlmIChDcmVhdGVQc0RlYyAoICZzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYywgc2FtcGxlc1BlckZyYW1lICkpIHsKKyAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfQ1JFQVRFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogSW5pdCBmcmFtZSBkZWxheSBzbG90IGhhbmRsaW5nICovCisgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoKDEpKzEpOyBpKyspIHsKKyAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VIZWFkZXJTbG90W2ldID0gaTsKKyAgfQorCitiYWlsOgorCisgIHJldHVybiBzYnJFcnJvcjsKK30KKworCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9PcGVuICggSEFORExFX1NCUkRFQ09ERVIgICogcFNlbGYgKQoreworICBIQU5ETEVfU0JSREVDT0RFUiAgICBzZWxmID0gTlVMTDsKKyAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOworCisgIC8qIEdldCBtZW1vcnkgZm9yIHRoaXMgaW5zdGFuY2UgKi8KKyAgc2VsZiA9IEdldFJhbV9TYnJEZWNvZGVyKCk7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICBzYnJFcnJvciA9IFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIHNlbGYtPndvcmtCdWZmZXIxID0gR2V0UmFtX1NickRlY1dvcmtCdWZmZXIxKCk7CisgIHNlbGYtPndvcmtCdWZmZXIyID0gR2V0UmFtX1NickRlY1dvcmtCdWZmZXIyKCk7CisKKyAgaWYgKCAgc2VsZi0+d29ya0J1ZmZlcjEgPT0gTlVMTAorICAgICB8fCBzZWxmLT53b3JrQnVmZmVyMiA9PSBOVUxMICkKKyAgeworICAgIHNickVycm9yID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyoKKyAgQWxyZWFkeSB6ZXJvIGJlY2F1c2Ugb2YgY2FsbG9jCisgIHNlbGYtPm51bVNickVsZW1lbnRzID0gMDsKKyAgc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPSAwOworICBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSA9IDA7CisgICovCisKKyAgc2VsZi0+bnVtRGVsYXlGcmFtZXMgPSAoMSk7ICAvKiBzZXQgdG8gdGhlIG1heCB2YWx1ZSBieSBkZWZhdWx0ICovCisKKyAgKnBTZWxmID0gc2VsZjsKKworYmFpbDoKKyAgcmV0dXJuIHNickVycm9yOworfQorCisvKioKKyAqIFxicmllZiBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIGNvcmUgY29kZWMgQU9UIGNhbiBiZSBwcm9jZXNzZWQgb3Igbm90LgorICogXHBhcmFtIGNvcmVDb2RlYyBjb3JlIGNvZGVjIGF1ZGlvIG9iamVjdCB0eXBlLgorICogXHJldHVybiAxIGlmIFNCUiBjYW4gYmUgcHJvY2Vzc2VkLCAwIGlmIFNCUiBjYW5ub3QgYmUgcHJvY2Vzc2VkL2FwcGxpZWQuCisgKi8KK3N0YXRpYworaW50IHNickRlY29kZXJfaXNDb3JlQ29kZWNWYWxpZChBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMpCit7CisgIHN3aXRjaCAoY29yZUNvZGVjKSB7CisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgIGNhc2UgQU9UX1NCUjoKKyAgICBjYXNlIEFPVF9QUzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYwordm9pZCBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50ICgKKyAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgZWxlbWVudEluZGV4CisgICAgICAgICkKK3sKKyAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCkgeworICAgIGludCBjaDsKKworICAgIGZvciAoY2g9MDsgY2g8U0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVDsgY2grKykgeworICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZVNickRlYyggc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7CisgICAgICAgIEZyZWVSYW1fU2JyRGVjQ2hhbm5lbCggJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSApOworICAgICAgICBzZWxmLT5udW1TYnJDaGFubmVscyAtPSAxOworICAgICAgfQorICAgIH0KKyAgICBGcmVlUmFtX1NickRlY0VsZW1lbnQoICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICk7CisgICAgc2VsZi0+bnVtU2JyRWxlbWVudHMgLT0gMTsKKyAgfQorfQorCisKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50ICgKKyAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKKyAgICAgICAgKQoreworICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CisgIGludCBjaENudD0wOworICBpbnQgblNickVsZW1lbnRzU3RhcnQgPSBzZWxmLT5udW1TYnJFbGVtZW50czsKKworICAvKiBDaGVjayBjb3JlIGNvZGVjIEFPVCAqLworICBpZiAoISBzYnJEZWNvZGVyX2lzQ29yZUNvZGVjVmFsaWQoY29yZUNvZGVjKSB8fCBlbGVtZW50SW5kZXggPj0gKDgpKSB7CisgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICggZWxlbWVudElEICE9IElEX1NDRSAmJiBlbGVtZW50SUQgIT0gSURfQ1BFICYmIGVsZW1lbnRJRCAhPSBJRF9MRkUgKQorICB7CisgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICggIHNlbGYtPnNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlSW4KKyAgICAgJiYgc2VsZi0+Y29kZWNGcmFtZVNpemUgPT0gc2FtcGxlc1BlckZyYW1lCisgICAgICYmIHNlbGYtPmNvcmVDb2RlYyA9PSBjb3JlQ29kZWMKKyAgICAgJiYgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMCisgICAgICYmIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmVsZW1lbnRJRCA9PSBlbGVtZW50SUQKKyAgICAgJiYgIShzZWxmLT5mbGFncyAmIFNCUkRFQ19GT1JDRV9SRVNFVCkKKyAgICAgKQorICB7CisgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgcmV0dXJuIFNCUkRFQ19PSzsKKyAgfQorCisgIHNlbGYtPnNhbXBsZVJhdGVJbiA9IHNhbXBsZVJhdGVJbjsKKyAgc2VsZi0+Y29kZWNGcmFtZVNpemUgPSBzYW1wbGVzUGVyRnJhbWU7CisgIHNlbGYtPmNvcmVDb2RlYyA9IGNvcmVDb2RlYzsKKworICBzZWxmLT5mbGFncyA9IDA7CisgIHNlbGYtPmZsYWdzIHw9IChjb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19FTEQpID8gU0JSREVDX0VMRF9HUklEIDogMDsKKworICAvKiBJbml0IFNCUiBlbGVtZW50cyAqLworICB7CisgICAgaW50IGVsQ2hhbm5lbHMsIGNoOworCisgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gPT0gTlVMTCkgeworICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSA9IEdldFJhbV9TYnJEZWNFbGVtZW50KGVsZW1lbnRJbmRleCk7CisgICAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSA9PSBOVUxMKSB7CisgICAgICAgIHNickVycm9yID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIHNlbGYtPm51bVNickVsZW1lbnRzICsrOworICAgIH0gZWxzZSB7CisgICAgICBzZWxmLT5udW1TYnJDaGFubmVscyAtPSBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5uQ2hhbm5lbHM7CisgICAgfQorCisgICAgLyogU2F2ZSBlbGVtZW50IElEIGZvciBzYW5pdHkgY2hlY2tzIGFuZCB0byBoYXZlIGEgZmFsbGJhY2sgZm9yIGNvbmNlYWxtZW50LiAqLworICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmVsZW1lbnRJRCA9IGVsZW1lbnRJRDsKKworICAgIC8qIERldGVybWluZSBhbW91bnQgb2YgY2hhbm5lbHMgZm9yIHRoaXMgZWxlbWVudCAqLworICAgIHN3aXRjaCAoZWxlbWVudElEKSB7CisgICAgICBjYXNlIElEX05PTkU6CisgICAgICBjYXNlIElEX0NQRTogZWxDaGFubmVscz0yOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfTEZFOgorICAgICAgY2FzZSBJRF9TQ0U6IGVsQ2hhbm5lbHM9MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBlbENoYW5uZWxzPTA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEhhbmRsZSBjYXNlIG9mIFBhcmFtZXRyaWMgU3RlcmVvICovCisgICAgaWYgKCBlbGVtZW50SW5kZXggPT0gMCAmJiBlbGVtZW50SUQgPT0gSURfU0NFICkgeworICAgICAgc3dpdGNoIChjb3JlQ29kZWMpIHsKKyAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICBjYXNlIEFPVF9TQlI6CisgICAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICAgICAgY2FzZSBBT1RfRFJNX0FBQzoKKyAgICAgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgorICAgICAgICAgIGVsQ2hhbm5lbHMgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPm5DaGFubmVscyA9IGVsQ2hhbm5lbHM7CisKKyAgICBmb3IgKGNoPTA7IGNoPGVsQ2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9PSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9IEdldFJhbV9TYnJEZWNDaGFubmVsKGNoQ250KTsKKyAgICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzICsrOworCisgICAgICBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsKCAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLT5TYnJEZWMuc2JyRHJjQ2hhbm5lbCApOworCisgICAgICAvKiBBZGQgcmVmZXJlbmNlIHBvaW50ZXIgdG8gd29ya2J1ZmZlcnMuICovCisgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0tPlNickRlYy5Xb3JrQnVmZmVyMSA9IHNlbGYtPndvcmtCdWZmZXIxOworICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLT5TYnJEZWMuV29ya0J1ZmZlcjIgPSBzZWxmLT53b3JrQnVmZmVyMjsKKyAgICAgIGNoQ250Kys7CisgICAgfQorICAgIGlmIChlbENoYW5uZWxzID09IDEgJiYgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICE9IE5VTEwpIHsKKyAgICAgIGRlbGV0ZVNickRlYyggc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7CisgICAgICBGcmVlUmFtX1NickRlY0NoYW5uZWwoICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gKTsKKyAgICB9CisgIH0KKworICAvKiBjbGVhciBlcnJvciBmbGFncyBmb3IgYWxsIGRlbGF5IHNsb3RzICovCisgIEZES21lbWNsZWFyKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmZyYW1lRXJyb3JGbGFnLCAoKDEpKzEpKnNpemVvZihVQ0hBUikpOworCisgIC8qIEluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSAqLworICBzYnJFcnJvciA9IHNickRlY29kZXJfUmVzZXRFbGVtZW50KAorICAgICAgICAgIHNlbGYsCisgICAgICAgICAgc2FtcGxlUmF0ZUluLAorICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICBlbGVtZW50SW5kZXgsCisgICAgICAgICAgKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyAwIDogKDYpCisgICAgICAgICAgKTsKKworCisKK2JhaWw6CisgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKKyAgICBpZiAoblNickVsZW1lbnRzU3RhcnQgPCBzZWxmLT5udW1TYnJFbGVtZW50cykgeworICAgICAgLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhpcyBlbGVtZW50ICovCisgICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KCBzZWxmLCBlbGVtZW50SW5kZXggKTsKKyAgICB9IGVsc2UgaWYgKCAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMKQorICAgICAgICAgICAgICYmIChlbGVtZW50SW5kZXggPCAoOCkpKQorICAgIHsgLyogU2V0IGVycm9yIGZsYWcgdG8gdHJpZ2dlciBjb25jZWFsbWVudCAqLworICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWdbc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlRnJhbWVTbG90XSA9IDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNickVycm9yOworfQorCisvKioKKyAqIFxicmllZiBBcHBseSBkZWNvZGVkIFNCUiBoZWFkZXIgZm9yIG9uZSBlbGVtZW50LgorICogXHBhcmFtIHNlbGYgU0JSIGRlY29kZXIgaW5zdGFuY2UgaGFuZGxlCisgKiBccGFyYW0gaFNickhlYWRlciBTQlIgaGVhZGVyIGhhbmRsZSB0byBiZSBwcm9jZXNzZWQuCisgKiBccGFyYW0gaFNickNoYW5uZWwgcG9pbnRlciBhcnJheSB0byB0aGUgU0JSIGVsZW1lbnQgY2hhbm5lbHMgY29ycmVzcG9uZGluZyB0byB0aGUgU0JSIGhlYWRlci4KKyAqIFxwYXJhbSBoZWFkZXJTdGF0dXMgaGVhZGVyIHN0YXR1cyB2YWx1ZSByZXR1cm5lZCBmcm9tIFNCUiBoZWFkZXIgcGFyc2VyLgorICogXHBhcmFtIG51bUVsZW1lbnRDaGFubmVscyBhbW91bnQgb2YgY2hhbm5lbHMgZm9yIHRoZSBTQlIgZWxlbWVudCB3aG9zIGhlYWRlciBpcyB0byBiZSBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYworU0JSX0VSUk9SIHNickRlY29kZXJfSGVhZGVyVXBkYXRlKAorICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiBzZWxmLAorICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIsCisgICAgICAgIFNCUl9IRUFERVJfU1RBVFVTIGhlYWRlclN0YXR1cywKKyAgICAgICAgSEFORExFX1NCUl9DSEFOTkVMIGhTYnJDaGFubmVsW10sCisgICAgICAgIGNvbnN0IGludCBudW1FbGVtZW50Q2hhbm5lbHMKKyAgICAgICAgKQoreworICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CisKKyAgLyoKKyAgICBjaGFuZ2Ugb2YgY29udHJvbCBkYXRhLCByZXNldCBkZWNvZGVyCisgICovCisgIGVycm9yU3RhdHVzID0gcmVzZXRGcmVxQmFuZFRhYmxlcyhoU2JySGVhZGVyLCBzZWxmLT5mbGFncyk7CisKKyAgaWYgKGVycm9yU3RhdHVzID09IFNCUkRFQ19PSykgeworICAgIGlmIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gVVBTQU1QTElORyAmJiBoZWFkZXJTdGF0dXMgIT0gSEVBREVSX1JFU0VUKQorICAgIHsKKyAgICAgIC8qIEFzIHRoZSBkZWZhdWx0IGhlYWRlciB3b3VsZCBsaW1pdCB0aGUgZnJlcXVlbmN5IHJhbmdlLAorICAgICAgICAgbG93U3ViYmFuZCBhbmQgaGlnaFN1YmJhbmQgbXVzdCBiZSBwYXRjaGVkLiAqLworICAgICAgaFNickhlYWRlci0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQgPSBoU2JySGVhZGVyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHM7CisgICAgICBoU2JySGVhZGVyLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQgPSBoU2JySGVhZGVyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHM7CisgICAgfQorCisgICAgLyogVHJpZ2dlciBhIHJlc2V0IGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMgc2xvdCAqLworICAgIGhTYnJIZWFkZXItPnN0YXR1cyB8PSBTQlJERUNfSERSX1NUQVRfUkVTRVQ7CisgIH0KKworICByZXR1cm4gZXJyb3JTdGF0dXM7Cit9CisKK0lOVCBzYnJEZWNvZGVyX0hlYWRlciAoCisgICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgICAgIHNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwKKyAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKKyAgICAgICAgKQoreworICBTQlJfSEVBREVSX1NUQVRVUyBoZWFkZXJTdGF0dXM7CisgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlcjsKKyAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOworICBpbnQgaGVhZGVySW5kZXg7CisKKyAgaWYgKCBzZWxmID09IE5VTEwgfHwgZWxlbWVudEluZGV4ID4gKDgpICkKKyAgeworICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgaWYgKCEgc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKGNvcmVDb2RlYykpIHsKKyAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKKyAgICAgICAgICBzZWxmLAorICAgICAgICAgIHNhbXBsZVJhdGVJbiwKKyAgICAgICAgICBzYW1wbGVSYXRlT3V0LAorICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICBjb3JlQ29kZWMsCisgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgIGVsZW1lbnRJbmRleAorICAgICAgICAgICk7CisKKyAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGhlYWRlckluZGV4ID0gZ2V0SGVhZGVyU2xvdChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VIZWFkZXJTbG90KTsKKyAgaFNickhlYWRlciA9ICYoc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdKTsKKworICBoZWFkZXJTdGF0dXMgPSBzYnJHZXRIZWFkZXJEYXRhICggaFNickhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKworICB7CisgICAgU0JSX0RFQ09ERVJfRUxFTUVOVCAqcFNickVsZW1lbnQ7CisKKyAgICBwU2JyRWxlbWVudCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF07CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAocFNickVsZW1lbnQgIT0gTlVMTCkgeworICAgICAgaWYgKCAoZWxlbWVudElEID09IElEX0NQRSAmJiBwU2JyRWxlbWVudC0+bkNoYW5uZWxzICE9IDIpCisgICAgICAgIHx8IChlbGVtZW50SUQgIT0gSURfQ1BFICYmIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMgIT0gMSkgKQorICAgICAgeworICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGlmICggaGVhZGVyU3RhdHVzID09IEhFQURFUl9SRVNFVCApIHsKKworICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKAorICAgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgICBoU2JySGVhZGVyLAorICAgICAgICAgICAgICBoZWFkZXJTdGF0dXMsCisgICAgICAgICAgICAgIHBTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgcFNickVsZW1lbnQtPm5DaGFubmVscworICAgICAgICAgICAgICApOworCisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfSEVBREVSOworICAgICAgICAgIGhTYnJIZWFkZXItPnN0YXR1cyAgIHw9IFNCUkRFQ19IRFJfU1RBVF9VUERBVEU7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSB7CisgICAgICAgICAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlIG92ZXJ3cml0dGVuIHRoZSBvbGQgU0JSIGhlYWRlciB0aGUgb25seSB3YXkgb3V0IGlzIFVQU0FNUExJTkchCisgICAgICAgICAgVGhpcyB3aWxsIGJlIHByZXBhcmVkIGluIHRoZSBuZXh0IHN0ZXAuCisgICAgICAgIH0gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK2JhaWw6CisgIHJldHVybiBzYnJFcnJvcjsKK30KKworCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9TZXRQYXJhbSAoSEFORExFX1NCUkRFQ09ERVIgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUkRFQ19QQVJBTSAgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZSApCit7CisgIFNCUl9FUlJPUiBlcnJvclN0YXR1cyA9IFNCUkRFQ19PSzsKKworICAvKiBjb25maWd1cmUgdGhlIHN1YnN5c3RlbXMgKi8KKyAgc3dpdGNoIChwYXJhbSkKKyAgeworICBjYXNlIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZOgorICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAoMSkpIHsKKyAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi0+bnVtRGVsYXlGcmFtZXMgPSAoVUNIQVIpdmFsdWU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFNCUl9RTUZfTU9ERToKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh2YWx1ZSA9PSAxKSB7CisgICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19MT1dfUE9XRVI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0xPV19QT1dFUjsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX0xEX1FNRl9USU1FX0FMSUdOOgorICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHZhbHVlID09IDEpIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0xEX01QU19RTUY7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0xEX01QU19RTUY7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFNCUl9GTFVTSF9EQVRBOgorICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19GTFVTSDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX0NMRUFSX0hJU1RPUlk6CisgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0ZPUkNFX1JFU0VUOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBTQlJfQlNfSU5URVJSVVBUSU9OOgorICAgIHsKKyAgICAgIGludCBlbGVtZW50SW5kZXg7CisKKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogTG9vcCBvdmVyIFNCUiBlbGVtZW50cyAqLworICAgICAgZm9yIChlbGVtZW50SW5kZXggPSAwOyBlbGVtZW50SW5kZXggPCBzZWxmLT5udW1TYnJFbGVtZW50czsgZWxlbWVudEluZGV4KyspIHsKKyAgICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlcjsKKyAgICAgICAgaW50IGhlYWRlckluZGV4ID0gZ2V0SGVhZGVyU2xvdChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdCk7CisKKyAgICAgICAgaFNickhlYWRlciA9ICYoc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdKTsKKworICAgICAgICAvKiBTZXQgc3luYyBzdGF0ZSBVUFNBTVBMSU5HIGZvciB0aGUgY29ycmVzcG9uZGluZyBzbG90LgorICAgICAgICAgICBUaGlzIHN3aXRjaGVzIG9mZiBiaXRzdHJlYW0gcGFyc2luZyB1bnRpbCBhIG5ldyBoZWFkZXIgYXJyaXZlcy4gKi8KKyAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKKyAgICAgICAgaFNickhlYWRlci0+c3RhdHVzICAgfD0gU0JSREVDX0hEUl9TVEFUX1VQREFURTsKKyAgICAgIH0gfQorICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICBicmVhazsKKyAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworCisgIHJldHVybiAoZXJyb3JTdGF0dXMpOworfQorCitzdGF0aWMKK1NCUkRFQ19EUkNfQ0hBTk5FTCAqIHNickRlY29kZXJfZHJjR2V0Q2hhbm5lbCggY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgSU5UIGNoYW5uZWwgKQoreworICBTQlJERUNfRFJDX0NIQU5ORUwgKnBTYnJEcmNDaGFubmVsRGF0YSA9IE5VTEw7CisgIGludCBlbGVtZW50SW5kZXgsIGVsQ2hhbklkeD0wLCBudW1DaD0wOworCisgIGZvciAoZWxlbWVudEluZGV4ID0gMDsgKGVsZW1lbnRJbmRleCA8ICg4KSkgJiYgKG51bUNoIDw9IGNoYW5uZWwpOyBlbGVtZW50SW5kZXgrKykKKyAgeworICAgIFNCUl9ERUNPREVSX0VMRU1FTlQgKnBTYnJFbGVtZW50ID0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XTsKKyAgICBpbnQgYywgZWxDaGFubmVsczsKKworICAgIGVsQ2hhbklkeCA9IDA7CisgICAgaWYgKHBTYnJFbGVtZW50ID09IE5VTEwpIGJyZWFrOworCisgICAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBjaGFubmVscyBmb3IgdGhpcyBlbGVtZW50ICovCisgICAgc3dpdGNoIChwU2JyRWxlbWVudC0+ZWxlbWVudElEKSB7CisgICAgICBjYXNlIElEX0NQRTogZWxDaGFubmVscyA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRF9MRkU6CisgICAgICBjYXNlIElEX1NDRTogZWxDaGFubmVscyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRF9OT05FOgorICAgICAgZGVmYXVsdDogZWxDaGFubmVscyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIExpbWl0IHdpdGggYWN0dWFsIGFsbG9jYXRlZCBlbGVtZW50IGNoYW5uZWxzICovCisgICAgZWxDaGFubmVscyA9IEZES21pbihlbENoYW5uZWxzLCBwU2JyRWxlbWVudC0+bkNoYW5uZWxzKTsKKworICAgIGZvciAoYyA9IDA7IChjIDwgZWxDaGFubmVscykgJiYgKG51bUNoIDw9IGNoYW5uZWwpOyBjKyspIHsKKyAgICAgIGlmIChwU2JyRWxlbWVudC0+cFNickNoYW5uZWxbZWxDaGFuSWR4XSAhPSBOVUxMKSB7CisgICAgICAgIG51bUNoKys7CisgICAgICAgIGVsQ2hhbklkeCsrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbGVtZW50SW5kZXggLT0gMTsKKyAgZWxDaGFuSWR4IC09IDE7CisKKyAgaWYgKGVsQ2hhbklkeCA8IDAgfHwgZWxlbWVudEluZGV4IDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwgKSB7CisgICAgaWYgKCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdICE9IE5VTEwgKQorICAgIHsKKyAgICAgIHBTYnJEcmNDaGFubmVsRGF0YSA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdLT5TYnJEZWMuc2JyRHJjQ2hhbm5lbDsKKyAgICB9CisgIH0KKworICByZXR1cm4gKHBTYnJEcmNDaGFubmVsRGF0YSk7Cit9CisKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX2RyY0ZlZWRDaGFubmVsICggSEFORExFX1NCUkRFQ09ERVIgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAqcE5leHRGYWN0X21hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIG5leHRGYWN0X2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgIGRyY0ludGVycG9sYXRpb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICB3aW5TZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgKnBCYW5kVG9wICkKK3sKKyAgU0JSREVDX0RSQ19DSEFOTkVMICpwU2JyRHJjQ2hhbm5lbERhdGEgPSBOVUxMOworICBpbnQgYmFuZCwgaXNWYWxpZERhdGEgPSAwOworCisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgfQorICBpZiAoY2ggPiAoOCkgfHwgcE5leHRGYWN0X21hZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFNCUkRFQ19TRVRfUEFSQU1fRkFJTDsKKyAgfQorCisgIC8qIFNlYXJjaCBmb3IgZ2FpbiB2YWx1ZXMgZGlmZmVyZW50IHRvIDEuMGYgKi8KKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bUJhbmRzOyBiYW5kICs9IDEpIHsKKyAgICBpZiAoICEoKHBOZXh0RmFjdF9tYWdbYmFuZF0gPT0gRkwyRlhDT05TVF9EQkwoMC41KSkgICYmIChuZXh0RmFjdF9leHAgPT0gMSkpCisgICAgICAmJiAhKChwTmV4dEZhY3RfbWFnW2JhbmRdID09IChGSVhQX0RCTClNQVhWQUxfREJMKSAmJiAobmV4dEZhY3RfZXhwID09IDApKSApIHsKKyAgICAgIGlzVmFsaWREYXRhID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEZpbmQgdGhlIHJpZ2h0IFNCUiBjaGFubmVsICovCisgIHBTYnJEcmNDaGFubmVsRGF0YSA9IHNickRlY29kZXJfZHJjR2V0Q2hhbm5lbCggc2VsZiwgY2ggKTsKKworICBpZiAoIHBTYnJEcmNDaGFubmVsRGF0YSAhPSBOVUxMICkgeworICAgIGlmICggcFNickRyY0NoYW5uZWxEYXRhLT5lbmFibGUgfHwgaXNWYWxpZERhdGEgKQorICB7IC8qIEFjdGl2YXRlIHByb2Nlc3Npbmcgb25seSB3aXRoIHJlYWwgYW5kIHZhbGlkIGRhdGEgKi8KKyAgICBpbnQgaTsKKworICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+ZW5hYmxlICAgPSAxOworICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+bnVtQmFuZHNOZXh0ID0gbnVtQmFuZHM7CisKKyAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPndpblNlcXVlbmNlTmV4dCAgICAgICAgICAgID0gd2luU2VxdWVuY2U7CisgICAgcFNickRyY0NoYW5uZWxEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9IGRyY0ludGVycG9sYXRpb25TY2hlbWU7CisgICAgcFNickRyY0NoYW5uZWxEYXRhLT5uZXh0RmFjdF9leHAgICAgICAgICAgICAgICA9IG5leHRGYWN0X2V4cDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KW51bUJhbmRzOyBpKyspIHsKKyAgICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+YmFuZFRvcE5leHRbaV0gID0gcEJhbmRUb3BbaV07CisgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm5leHRGYWN0X21hZ1tpXSA9IHBOZXh0RmFjdF9tYWdbaV07CisgICAgfQorICB9CisgIH0KKworICByZXR1cm4gU0JSREVDX09LOworfQorCisKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNEaXNhYmxlICggSEFORExFX1NCUkRFQ09ERVIgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaCApCit7CisgIFNCUkRFQ19EUkNfQ0hBTk5FTCAqcFNickRyY0NoYW5uZWxEYXRhID0gTlVMTDsKKworICBpZiAoIChzZWxmID09IE5VTEwpCisgICAgfHwgKGNoID4gKDgpKQorICAgIHx8IChzZWxmLT5udW1TYnJFbGVtZW50cyA9PSAwKQorICAgIHx8IChzZWxmLT5udW1TYnJDaGFubmVscyA9PSAwKSApIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBGaW5kIHRoZSByaWdodCBTQlIgY2hhbm5lbCAqLworICBwU2JyRHJjQ2hhbm5lbERhdGEgPSBzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoIHNlbGYsIGNoICk7CisKKyAgaWYgKCBwU2JyRHJjQ2hhbm5lbERhdGEgIT0gTlVMTCApIHsKKyAgICBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsKCBwU2JyRHJjQ2hhbm5lbERhdGEgKTsKKyAgfQorfQorCisKKworU0JSX0VSUk9SIHNickRlY29kZXJfUGFyc2UoCisgICAgICAgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCisgICAgICAgIGludCAqY291bnQsCisgICAgICAgIGludCAgYnNQYXlMZW4sCisgICAgICAgIGludCAgY3JjRmxhZywKKyAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldkVsZW1lbnQsCisgICAgICAgIGludCBlbGVtZW50SW5kZXgsCisgICAgICAgIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZworICAgICAgICApCit7CisgIFNCUl9ERUNPREVSX0VMRU1FTlQgICAqaFNickVsZW1lbnQ7CisgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlcjsKKyAgSEFORExFX1NCUl9DSEFOTkVMICAgICpwU2JyQ2hhbm5lbDsKKworICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YUxlZnQ7CisgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhUmlnaHQ7CisKKyAgU0JSX0VSUk9SIGVycm9yU3RhdHVzID0gU0JSREVDX09LOworICBTQlJfU1lOQ19TVEFURSBpbml0aWFsU3luY1N0YXRlOworICBTQlJfSEVBREVSX1NUQVRVUyBoZWFkZXJTdGF0dXMgPSBIRUFERVJfTk9UX1BSRVNFTlQ7CisKKyAgSU5UICBzdGFydFBvczsKKyAgSU5UICBDUkNMZW4gPSAwOworCisgIGludCAgc3RlcmVvOworICBpbnQgIGZEb0RlY29kZVNickRhdGEgPSAxOworCisgIGludCBsYXN0U2xvdCwgbGFzdEhkclNsb3QgPSAwLCB0aGlzSGRyU2xvdDsKKworICAvKiBSZW1lbWJlciBzdGFydCBwb3NpdGlvbiBvZiAgU0JSIGVsZW1lbnQgKi8KKyAgc3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICAvKiBTQlIgc2FuaXR5IGNoZWNrcyAqLworICBpZiAoIHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdID09IE5VTEwgKSB7CisgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgIGdvdG8gYmFpbDsKKyAgfSAKKworICBoU2JyRWxlbWVudCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF07CisKKyAgbGFzdFNsb3QgICAgPSAoaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA+IDApID8gaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdC0xIDogc2VsZi0+bnVtRGVsYXlGcmFtZXM7CisgIGxhc3RIZHJTbG90ID0gIGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2xhc3RTbG90XTsKKyAgdGhpc0hkclNsb3QgPSAgZ2V0SGVhZGVyU2xvdCggaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCwgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3QgKTsgIC8qIEdldCBhIGZyZWUgaGVhZGVyIHNsb3Qgbm90IHVzZWQgYnkgZnJhbWVzIG5vdCBwcm9jZXNzZWQgeWV0LiAqLworCisgIC8qIEFzc2lnbiB0aGUgZnJlZSBzbG90IHRvIHN0b3JlIGEgbmV3IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICovCisgIGhTYnJIZWFkZXIgPSAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1bdGhpc0hkclNsb3RdOworCisgIHBTYnJDaGFubmVsID0gaFNickVsZW1lbnQtPnBTYnJDaGFubmVsOworICBzdGVyZW8gPSAoaFNickVsZW1lbnQtPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMSA6IDA7CisKKyAgaEZyYW1lRGF0YUxlZnQgID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgIGhGcmFtZURhdGFSaWdodCA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworCisgIGluaXRpYWxTeW5jU3RhdGUgPSBoU2JySGVhZGVyLT5zeW5jU3RhdGU7CisKKyAgLyogcmVzZXQgUFMgZmxhZzsgd2lsbCBiZSBzZXQgYWZ0ZXIgUFMgd2FzIGZvdW5kICovCisgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKKworICBpZiAoaFNickhlYWRlci0+c3RhdHVzICYgU0JSREVDX0hEUl9TVEFUX1VQREFURSkgeworICAgIC8qIEdvdCBhIG5ldyBoZWFkZXIgZnJvbSBleHRlcm4gKGUuZy4gZnJvbSBhbiBBU0MpICovCisgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX09LOworICAgIGhTYnJIZWFkZXItPnN0YXR1cyAmPSB+U0JSREVDX0hEUl9TVEFUX1VQREFURTsKKyAgfQorICBlbHNlIGlmICh0aGlzSGRyU2xvdCAhPSBsYXN0SGRyU2xvdCkgeworICAgIC8qIENvcHkgdGhlIGxhc3QgaGVhZGVyIGludG8gdGhpcyBzbG90IG90aGVyd2lzZSB0aGUKKyAgICAgICBoZWFkZXIgY29tcGFyZSB3aWxsIHRyaWdnZXIgbW9yZSBIRUFERVJfUkVTRVRzIHRoYW4gbmVlZGVkLiAqLworICAgIGNvcHlTYnJIZWFkZXIoIGhTYnJIZWFkZXIsICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtsYXN0SGRyU2xvdF0gKTsKKyAgfQorCisgIC8qCisgICAgIENoZWNrIGlmIGJpdCBzdHJlYW0gZGF0YSBpcyB2YWxpZCBhbmQgbWF0Y2hlcyB0aGUgZWxlbWVudCBjb250ZXh0CisgICovCisgIGlmICggKChwcmV2RWxlbWVudCAhPSBJRF9TQ0UpICYmIChwcmV2RWxlbWVudCAhPSBJRF9DUEUpKSB8fCBwcmV2RWxlbWVudCAhPSBoU2JyRWxlbWVudC0+ZWxlbWVudElEKSB7CisgICAgLyogSW4gY2FzZSBvZiBMRkUgd2UgYWxzbyBsYW5kIGhlcmUsIHNpbmNlIHRoZXJlIGlzIG5vIExGRSBTQlIgZWxlbWVudCAoZG8gdXBzYW1wbGluZyBvbmx5KSAqLworICAgIGZEb0RlY29kZVNickRhdGEgPSAwOworICB9CisKKyAgaWYgKGZEb0RlY29kZVNickRhdGEpCisgIHsKKyAgICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8PSAwKSB7CisgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICB9CisgIH0KKworICAvKgorICAgICBTQlIgQ1JDLWNoZWNrCisgICovCisgIGlmIChmRG9EZWNvZGVTYnJEYXRhKQorICB7CisgICAgaWYgKGNyY0ZsYWcgPT0gMSkgeworICAgICAgc3dpdGNoIChzZWxmLT5jb3JlQ29kZWMpIHsKKyAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgIEZES3B1c2hGb3IgKGhCcywgMTApOworICAgICAgICAvKiBjaGVjayBzYnJjcmMgbGF0ZXI6IHdlIGRvbid0IGtub3cgdGhlIHBheWxvYWQgbGVuZ3RoIG5vdyAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIENSQ0xlbiA9IGJzUGF5TGVuIC0gMTA7ICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlOiAwID0+IGkgKi8KKyAgICAgICAgaWYgKENSQ0xlbiA8IDApIHsKKyAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gU2JyQ3JjQ2hlY2sgKGhCcywgQ1JDTGVuKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogaWYgKGZEb0RlY29kZVNickRhdGEpICovCisKKyAgLyoKKyAgICAgUmVhZCBpbiB0aGUgaGVhZGVyIGRhdGEgYW5kIGlzc3VlIGEgcmVzZXQgaWYgY2hhbmdlIG9jY3VyZWQKKyAgKi8KKyAgaWYgKGZEb0RlY29kZVNickRhdGEpCisgIHsKKyAgICBpbnQgc2JySGVhZGVyUHJlc2VudDsKKworICAgIHsKKyAgICAgIHNickhlYWRlclByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CisgICAgfQorCisgICAgaWYgKCBzYnJIZWFkZXJQcmVzZW50ICkgeworICAgICAgaGVhZGVyU3RhdHVzID0gc2JyR2V0SGVhZGVyRGF0YSAoaFNickhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgfQorCisgICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfUkVTRVQpCisgICAgeworICAgICAgZXJyb3JTdGF0dXMgPSBzYnJEZWNvZGVyX0hlYWRlclVwZGF0ZSgKKyAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICBoU2JySGVhZGVyLAorICAgICAgICAgICAgaGVhZGVyU3RhdHVzLAorICAgICAgICAgICAgcFNickNoYW5uZWwsCisgICAgICAgICAgICBoU2JyRWxlbWVudC0+bkNoYW5uZWxzIAorICAgICAgICAgICAgKTsKKworICAgICAgaWYgKGVycm9yU3RhdHVzID09IFNCUkRFQ19PSykgeworICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfSEVBREVSOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX05PVF9JTklUSUFMSVpFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyb3JTdGF0dXMgIT0gU0JSREVDX09LKSB7CisgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICB9CisgIH0gLyogaWYgKGZEb0RlY29kZVNickRhdGEpICovCisKKyAgLyoKKyAgICBQcmludCBkZWJ1Z2dpbmcgb3V0cHV0IG9ubHkgaWYgc3RhdGUgaGFzIGNoYW5nZWQKKyAgKi8KKworICAvKiByZWFkIGZyYW1lIGRhdGEgKi8KKyAgaWYgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPj0gU0JSX0hFQURFUikgJiYgZkRvRGVjb2RlU2JyRGF0YSkgeworICAgIGludCBzYnJGcmFtZU9rOworICAgIC8qIHJlYWQgdGhlIFNCUiBlbGVtZW50IGRhdGEgKi8KKyAgICBpZiAoc3RlcmVvKSB7CisgICAgICBzYnJGcmFtZU9rID0gc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50KGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnRyYW5zcG9zZXJTZXR0aW5ncy5vdmVybGFwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgeworICAgICAgICAvKiB1cGRhdGUgc2xvdCBpbmRleCBmb3IgUFMgYml0c3RyZWFtIHBhcnNpbmcgKi8KKyAgICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzTGFzdFNsb3QgPSBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdDsKKyAgICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3QgPSBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90OworICAgICAgfQorICAgICAgc2JyRnJhbWVPayA9IHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50KGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnRyYW5zcG9zZXJTZXR0aW5ncy5vdmVybGFwKTsKKyAgICB9CisgICAgaWYgKCFzYnJGcmFtZU9rKSB7CisgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBJTlQgdmFsQml0czsKKworICAgICAgaWYgKGJzUGF5TGVuID4gMCkgeworICAgICAgICB2YWxCaXRzID0gYnNQYXlMZW4gLSAoKElOVClzdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgICB9CisKKyAgICAgIGlmICggY3JjRmxhZyA9PSAxICkgeworICAgICAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgeworICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGxhdGUgY3JjIGNoZWNrIGZvciBlbGQgKi8KKyAgICAgICAgICAgIElOVCBwYXlsb2FkYml0cyA9IChJTlQpc3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIC0gc3RhcnRQb3M7CisgICAgICAgICAgICBJTlQgY3JjTGVuICAgICAgPSBwYXlsb2FkYml0cyAtIDEwOworICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBwYXlsb2FkYml0cyk7CisgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhICAgICAgPSBTYnJDcmNDaGVjayAoaEJzLCBjcmNMZW4pOworICAgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIGNyY0xlbik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHNhbml0eSBjaGVjayBvZiByZW1haW5pbmcgYml0cyAqLworICAgICAgaWYgKHZhbEJpdHMgPCAwKSB7CisgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzZWxmLT5jb3JlQ29kZWMpIHsKKyAgICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgICBjYXNlIEFPVF9QUzoKKyAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2FuaXR5IGNoZWNrIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIEdlbmVyYWwgQXVkaW8gYml0c3RyZWFtcyAqLworICAgICAgICAgICAgaW50IGFsaWduQml0cyA9IHZhbEJpdHMgJiAweDc7CisKKyAgICAgICAgICAgIGlmICh2YWxCaXRzID4gYWxpZ25CaXRzKSB7CisgICAgICAgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvKiBObyBzYW5pdHkgY2hlY2sgYXZhaWxhYmxlICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogVGhlIHJldHVybmVkIGJpdCBjb3VudCB3aWxsIG5vdCBiZSB0aGUgYWN0dWFsIHBheWxvYWQgc2l6ZSBzaW5jZSB3ZSBkaWQgbm90CisgICAgICAgcGFyc2UgdGhlIGZyYW1lIGRhdGEuIFJldHVybiBhbiBlcnJvciBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIHJlYWN0IHJlc3BlY3RpdmVseS4gKi8KKyAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGlmICghZkRvRGVjb2RlU2JyRGF0YSkgeworICAgIC8qIFNldCBlcnJvciBmbGFnIGZvciB0aGlzIHNsb3QgdG8gdHJpZ2dlciBjb25jZWFsbWVudCAqLworICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmZyYW1lRXJyb3JGbGFnW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdID0gMTsKKyAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19QQVJTRV9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICAvKiBFdmVyeXRoaW5nIHNlZW1zIHRvIGJlIG9rIHNvIGNsZWFyIHRoZSBlcnJvciBmbGFnICovCisgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWdbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSAwOworICB9CisKKyAgaWYgKCFzdGVyZW8pIHsKKyAgICAvKiBUdXJuIGNvdXBsaW5nIG9mZiBleHBsaWNpdGVseSB0byBhdm9pZCBhY2Nlc3MgdG8gYWJzZW50IHJpZ2h0IGZyYW1lIGRhdGEKKyAgICAgICB0aGF0IG1pZ2h0IG9jY3VyIHdpdGggY29ycnVwdCBiaXRzdHJlYW1zLiAqLworICAgIGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKKyAgfQorCitiYWlsOgorICBpZiAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX09LKSB7CisgICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpIHsKKyAgICAgIC8qIFVzZSB0aGUgb2xkIGhlYWRlciBmb3IgdGhpcyBmcmFtZSAqLworICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSBsYXN0SGRyU2xvdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogVXNlIHRoZSBuZXcgaGVhZGVyIGZvciB0aGlzIGZyYW1lICovCisgICAgICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IHRoaXNIZHJTbG90OworICAgIH0KKworICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCisgICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90KzEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzKzEpOworICB9CisKKyAgKmNvdW50IC09IHN0YXJ0UG9zIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgcmV0dXJuIGVycm9yU3RhdHVzOworfQorCisKKy8qKgorICogXGJyaWVmIFJlbmRlciBvbmUgU0JSIGVsZW1lbnQgaW50byB0aW1lIGRvbWFpbiBzaWduYWwuCisgKiBccGFyYW0gc2VsZiBTQlIgZGVjb2RlciBoYW5kbGUKKyAqIFxwYXJhbSB0aW1lRGF0YSBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIKKyAqIFxwYXJhbSBpbnRlcmxlYXZlZCBmbGFnIGluZGljYXRpbmcgaW50ZXJsZWF2ZWQgY2hhbm5lbCBvdXRwdXQKKyAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyBwb2ludGVyIHRvIFVDSEFSIGFycmF5IHdoZXJlIG5leHQgMiBjaGFubmVsIG9mZnNldHMgYXJlIHN0b3JlZC4gCisgKiBccGFyYW0gZWxlbWVudEluZGV4IGVudW1lcmF0aW5nIGluZGV4IG9mIHRoZSBTQlIgZWxlbWVudCB0byByZW5kZXIuCisgKiBccGFyYW0gbnVtSW5DaGFubmVscyBudW1iZXIgb2YgY2hhbm5lbHMgZnJvbSBjb3JlIGNvZGVyIChyZWFkaW5nIHN0cmlkZSkuCisgKiBccGFyYW0gbnVtT3V0Q2hhbm5lbHMgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRvIHJldHVybiBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgorICogXHBhcmFtIHBzUG9zc2libGUgZmxhZyBpbmRpY2F0aW5nIGlmIFBTIGlzIHBvc3NpYmxlIG9yIG5vdC4KKyAqIFxyZXR1cm4gU0JSREVDX09LIGlmIHN1Y2Nlc3NmdWxsLCBlbHNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIFNCUl9FUlJPUgorc2JyRGVjb2Rlcl9EZWNvZGVFbGVtZW50ICgKKyAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgc2VsZiwKKyAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqdGltZURhdGEsCisgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGludGVybGVhdmVkLAorICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICpjaGFubmVsTWFwcGluZywKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgZWxlbWVudEluZGV4LAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBudW1JbkNoYW5uZWxzLAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpudW1PdXRDaGFubmVscywKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgcHNQb3NzaWJsZQorICAgICAgICApCit7CisgIFNCUl9ERUNPREVSX0VMRU1FTlQgKmhTYnJFbGVtZW50ID0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XTsKKyAgSEFORExFX1NCUl9DSEFOTkVMICAgICpwU2JyQ2hhbm5lbCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsOworICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPSAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF1dOworICBIQU5ETEVfUFNfREVDIGhfcHNfZCA9IHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjOworCisgIC8qIGdldCBtZW1vcnkgZm9yIGZyYW1lIGRhdGEgZnJvbSBzY3JhdGNoICovCisgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhTGVmdCAgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhUmlnaHQgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzFdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisKKyAgU0JSX0VSUk9SIGVycm9yU3RhdHVzID0gU0JSREVDX09LOworCisKKyAgSU5UICBzdHJpZGVJbiwgc3RyaWRlT3V0LCBvZmZzZXQwLCBvZmZzZXQxOworICBJTlQgIGNvZGVjRnJhbWVTaXplID0gc2VsZi0+Y29kZWNGcmFtZVNpemU7CisKKyAgaW50ICBzdGVyZW8gPSAoaFNickVsZW1lbnQtPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMSA6IDA7CisgIGludCAgbnVtRWxlbWVudENoYW5uZWxzID0gaFNickVsZW1lbnQtPm5DaGFubmVsczsgLyogTnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBjdXJyZW50IFNCUiBlbGVtZW50ICovCisKKyAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0ZMVVNIKSB7CisgICAgLyogTW92ZSBmcmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0IHNsb3Qgd2hpY2ggaXMgdXAgdG8gYmUgZGVjb2RlZC9hcHBsaWVkIG5leHQgKi8KKyAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QrMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMrMSk7CisgICAgLyogVXBkYXRlIGhlYWRlciBhbmQgZnJhbWUgZGF0YSBwb2ludGVyIGJlY2F1c2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbiBzZXQgKi8KKyAgICBoU2JySGVhZGVyID0gJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdXTsKKyAgICBoRnJhbWVEYXRhTGVmdCAgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgaEZyYW1lRGF0YVJpZ2h0ID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBoZWFkZXIgZXJyb3IgZmxhZyAqLworICBoU2JySGVhZGVyLT5mcmFtZUVycm9yRmxhZyA9IGhTYnJFbGVtZW50LT5mcmFtZUVycm9yRmxhZ1toU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKworICAvKgorICAgICBQcmVwYXJlIGZpbHRlcmJhbmsgZm9yIHVwc2FtcGxpbmcgaWYgbm8gdmFsaWQgYml0IHN0cmVhbSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICovCisgIGlmICggaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9OT1RfSU5JVElBTElaRUQgKQorICB7CisgICAgZXJyb3JTdGF0dXMgPSBpbml0SGVhZGVyRGF0YSgKKyAgICAgICAgICAgIGhTYnJIZWFkZXIsCisgICAgICAgICAgICBzZWxmLT5zYW1wbGVSYXRlSW4sCisgICAgICAgICAgICBzZWxmLT5zYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgY29kZWNGcmFtZVNpemUsCisgICAgICAgICAgICBzZWxmLT5mbGFncworICAgICAgICAgICAgKTsKKworICAgIGlmIChlcnJvclN0YXR1cyAhPSBTQlJERUNfT0spIHsKKyAgICAgIHJldHVybiBlcnJvclN0YXR1czsKKyAgICB9CisKKyAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOworCisgICAgZXJyb3JTdGF0dXMgPSBzYnJEZWNvZGVyX0hlYWRlclVwZGF0ZSgKKyAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICBoU2JySGVhZGVyLAorICAgICAgICAgICAgSEVBREVSX05PVF9QUkVTRU5ULAorICAgICAgICAgICAgcFNickNoYW5uZWwsCisgICAgICAgICAgICBoU2JyRWxlbWVudC0+bkNoYW5uZWxzCisgICAgICAgICAgICApOworCisgICAgaWYgKGVycm9yU3RhdHVzICE9IFNCUkRFQ19PSykgeworICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX05PVF9JTklUSUFMSVpFRDsKKyAgICAgIHJldHVybiBlcnJvclN0YXR1czsKKyAgICB9CisgIH0KKworICAvKiByZXNldCAqLworICBpZiAoaFNickhlYWRlci0+c3RhdHVzICYgU0JSREVDX0hEUl9TVEFUX1JFU0VUKSB7CisgICAgaW50IGNoOworICAgIGZvciAoY2ggPSAwIDsgY2ggPCBudW1FbGVtZW50Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFNCUl9FUlJPUiBlcnJvclN0YXR1c1RtcCA9IFNCUkRFQ19PSzsKKworICAgICAgZXJyb3JTdGF0dXNUbXAgPSByZXNldFNickRlYyAoCisgICAgICAgICAgICAgJnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLAorICAgICAgICAgICAgICBoU2JySGVhZGVyLAorICAgICAgICAgICAgICZwU2JyQ2hhbm5lbFtjaF0tPnByZXZGcmFtZURhdGEsCisgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgU0JSREVDX0xPV19QT1dFUiwKKyAgICAgICAgICAgICAgc2VsZi0+c3luRG93bnNhbXBsZUZhYworICAgICAgICAgICAgICApOworCisgICAgICBpZiAoZXJyb3JTdGF0dXNUbXAgIT0gU0JSREVDX09LKSB7CisgICAgICAgIGVycm9yU3RhdHVzID0gZXJyb3JTdGF0dXNUbXA7CisgICAgICB9CisgICAgfQorICAgIGhTYnJIZWFkZXItPnN0YXR1cyAmPSB+U0JSREVDX0hEUl9TVEFUX1JFU0VUOworICB9CisKKyAgLyogZGVjb2RpbmcgKi8KKyAgaWYgKCAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpCisgICAgfHwgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0hFQURFUikgJiYgKGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnID09IDApKSApCisgIHsKKyAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19PSzsKKworICAgIGRlY29kZVNickRhdGEgKGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAmcFNickNoYW5uZWxbMF0tPnByZXZGcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICAgKHN0ZXJlbykgPyBoRnJhbWVEYXRhUmlnaHQgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgIChzdGVyZW8pID8gJnBTYnJDaGFubmVsWzFdLT5wcmV2RnJhbWVEYXRhIDogTlVMTCk7CisKKworICAgIC8qIE5vdyB3ZSBoYXZlIGEgZnVsbCBwYXJhbWV0ZXIgc2V0IGFuZCBjYW4gZG8gcGFyYW1ldGVyCisgICAgICAgYmFzZWQgY29uY2VhbG1lbnQgaW5zdGVhZCBvZiBwbGFpbiB1cHNhbXBsaW5nLiAqLworICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9BQ1RJVkU7CisgIH0KKworICAvKiBkZWNvZGUgUFMgZGF0YSBpZiBhdmFpbGFibGUgKi8KKyAgaWYgKGhfcHNfZCAhPSBOVUxMICYmIHBzUG9zc2libGUpIHsKKyAgICBpbnQgYXBwbHlQcyA9IDE7CisKKyAgICAvKiBkZWZpbmUgd2hpY2ggZnJhbWUgZGVsYXkgbGluZSBzbG90IHRvIHByb2Nlc3MgKi8KKyAgICBoX3BzX2QtPnByb2Nlc3NTbG90ID0gaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdDsKKworICAgIGFwcGx5UHMgPSBEZWNvZGVQcyhoX3BzX2QsIGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnKTsKKyAgICBzZWxmLT5mbGFncyB8PSAoYXBwbHlQcykgPyBTQlJERUNfUFNfREVDT0RFRCA6IDA7CisgIH0KKworICAvKiBTZXQgc3RyaWRlcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworICBpZiAoaW50ZXJsZWF2ZWQpIHsKKyAgICBzdHJpZGVJbiA9IG51bUluQ2hhbm5lbHM7CisgICAgaWYgKCBwc1Bvc3NpYmxlICkKKyAgICAgIHN0cmlkZU91dCA9IChudW1JbkNoYW5uZWxzIDwgMikgPyAyIDogbnVtSW5DaGFubmVsczsKKyAgICBlbHNlCisgICAgICBzdHJpZGVPdXQgPSBudW1JbkNoYW5uZWxzOworICAgIG9mZnNldDAgPSBjaGFubmVsTWFwcGluZ1swXTsKKyAgICBvZmZzZXQxID0gY2hhbm5lbE1hcHBpbmdbMV07CisgIH0gZWxzZSB7CisgICAgc3RyaWRlSW4gID0gMTsKKyAgICBzdHJpZGVPdXQgPSAxOworICAgIG9mZnNldDAgPSBjaGFubmVsTWFwcGluZ1swXSoyKmNvZGVjRnJhbWVTaXplOworICAgIG9mZnNldDEgPSBjaGFubmVsTWFwcGluZ1sxXSoyKmNvZGVjRnJhbWVTaXplOworICB9CisKKyAgLyogdXNlIHNhbWUgYnVmZmVycyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhbmQgYXBwbHkgUFMgcGVyIHRpbWVzbG90ICovCisgIC8qIFByb2Nlc3MgbGVmdCBjaGFubmVsICovCisvL0ZES3ByaW50Zigic2VsZi0+Y29kZWNGcmFtZVNpemUgJWRcdCVkXG4iLHNlbGYtPmNvZGVjRnJhbWVTaXplLHNlbGYtPnNhbXBsZVJhdGVJbik7CisgIHNicl9kZWMgKCZwU2JyQ2hhbm5lbFswXS0+U2JyRGVjLAorICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQwLAorICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQwLAorICAgICAgICAgICAmcFNickNoYW5uZWxbMV0tPlNickRlYywKKyAgICAgICAgICAgIHRpbWVEYXRhICsgb2Zmc2V0MSwKKyAgICAgICAgICAgIHN0cmlkZUluLAorICAgICAgICAgICAgc3RyaWRlT3V0LAorICAgICAgICAgICAgaFNickhlYWRlciwKKyAgICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAmcFNickNoYW5uZWxbMF0tPnByZXZGcmFtZURhdGEsCisgICAgICAgICAgICAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpLAorICAgICAgICAgICAgaF9wc19kLAorICAgICAgICAgICAgc2VsZi0+ZmxhZ3MKKyAgICAgICAgICApOworCisgIGlmIChzdGVyZW8pIHsKKyAgICAvKiBQcm9jZXNzIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICBzYnJfZGVjICgmcFNickNoYW5uZWxbMV0tPlNickRlYywKKyAgICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLAorICAgICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDEsCisgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgIHN0cmlkZUluLAorICAgICAgICAgICAgICBzdHJpZGVPdXQsCisgICAgICAgICAgICAgIGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgIGhGcmFtZURhdGFSaWdodCwKKyAgICAgICAgICAgICAmcFNickNoYW5uZWxbMV0tPnByZXZGcmFtZURhdGEsCisgICAgICAgICAgICAgIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSksCisgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgIHNlbGYtPmZsYWdzCisgICAgICAgICAgICApOworICB9CisKKyAgaWYgKGhfcHNfZCAhPSBOVUxMKSB7CisgICAgLyogc2F2ZSBQUyBzdGF0dXMgZm9yIG5leHQgcnVuICovCisgICAgaF9wc19kLT5wc0RlY29kZWRQcnYgPSAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAxIDogMCA7CisgIH0KKworICBpZiAoIHBzUG9zc2libGUgCisgICAgKQorICB7CisgICAgRkRLX0FTU0VSVChzdHJpZGVPdXQgPiAxKTsKKyAgICBpZiAoICEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgKSB7CisgICAgICAvKiBBIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBkZWNvZGUgUFMgaGFzIHRvIHByb2R1Y2UgYSBzdGVyZW8gb3V0cHV0IGV2ZW4gaWYgbm8gUFMgZGF0YSBpcyBhdmFpbGJsZS4gKi8KKyAgICAgIC8qIFNvIGNvcHkgbGVmdCBjaGFubmVsIHRvIHJpZ2h0IGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKGludGVybGVhdmVkKSB7CisgICAgICAgIElOVF9QQ00gKnB0cjsKKyAgICAgICAgSU5UIGk7CisgICAgICAgIEZES19BU1NFUlQoc3RyaWRlT3V0ID09IDIpOworCisgICAgICAgIHB0ciA9IHRpbWVEYXRhOworICAgICAgICBmb3IgKGkgPSBjb2RlY0ZyYW1lU2l6ZTsgaS0tOyApIAorICAgICAgICB7CisgICAgICAgICAgSU5UX1BDTSB0bXA7IC8qIFRoaXMgdGVtcG9yYWwgdmFyaWFibGUgaXMgcmVxdWlyZWQgYmVjYXVzZSBzb21lIGNvbXBpbGVycyBjYW4ndCBkbyAqcHRyKysgPSAqcHRyKysgY29ycmVjdGx5LiAqLworICAgICAgICAgIHRtcCA9ICpwdHIrKzsgKnB0cisrID0gdG1wOworICAgICAgICAgIHRtcCA9ICpwdHIrKzsgKnB0cisrID0gdG1wOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBGREttZW1jcHkoIHRpbWVEYXRhKzIqY29kZWNGcmFtZVNpemUsIHRpbWVEYXRhLCAyKmNvZGVjRnJhbWVTaXplKnNpemVvZihJTlRfUENNKSApOworICAgICAgfQorICAgIH0KKyAgICAqbnVtT3V0Q2hhbm5lbHMgPSAyOyAgLyogT3V0cHV0IG1pbmltdW0gdHdvIGNoYW5uZWxzIHdoZW4gUFMgaXMgZW5hYmxlZC4gKi8KKyAgfQorCisgIHJldHVybiBlcnJvclN0YXR1czsKK30KKworCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9BcHBseSAoIEhBTkRMRV9TQlJERUNPREVSICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICp0aW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgIGNoYW5uZWxNYXBwaW5nWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgaW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgY29yZURlY29kZWRPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpwc0RlY29kZWQgKQoreworICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CisKKyAgaW50ICAgcHNQb3NzaWJsZSA9IDA7CisgIGludCAgIHNickVsZW1lbnROdW07CisgIGludCAgIG51bUNvcmVDaGFubmVscyA9ICpudW1DaGFubmVsczsKKyAgaW50ICAgbnVtU2JyQ2hhbm5lbHMgID0gMDsKKworICBwc1Bvc3NpYmxlID0gKnBzRGVjb2RlZDsKKworICBpZiAoc2VsZi0+bnVtU2JyRWxlbWVudHMgPCAxKSB7CisgICAgLyogZXhpdCBpbW1lZGlhdGVseSB0byBhdm9pZCBhY2Nlc3MgdmlvbGF0aW9ucyAqLworICAgIHJldHVybiBTQlJERUNfQ1JFQVRFX0VSUk9SOworICB9CisKKyAgLyogU2FuaXR5IGNoZWNrIG9mIGFsbG9jYXRlZCBTQlIgZWxlbWVudHMuICovCisgIGZvciAoc2JyRWxlbWVudE51bT0wOyBzYnJFbGVtZW50TnVtPHNlbGYtPm51bVNickVsZW1lbnRzOyBzYnJFbGVtZW50TnVtKyspIHsKKyAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFNCUkRFQ19DUkVBVEVfRVJST1I7CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPm51bVNickVsZW1lbnRzICE9IDEgfHwgc2VsZi0+cFNickVsZW1lbnRbMF0tPmVsZW1lbnRJRCAhPSBJRF9TQ0UpIHsKKyAgICBwc1Bvc3NpYmxlID0gMDsKKyAgfQorCisKKyAgLyogSW4gY2FzZSBvZiBub24taW50ZXJsZWF2ZWQgdGltZSBkb21haW4gZGF0YSBhbmQgdXBzYW1wbGluZywgbWFrZSByb29tIGZvciBiaWdnZXIgU0JSIG91dHB1dC4gKi8KKyAgaWYgKHNlbGYtPnN5bkRvd25zYW1wbGVGYWMgPT0gMSAmJiBpbnRlcmxlYXZlZCA9PSAwKSB7CisgICAgaW50IGMsIG91dHB1dEZyYW1lU2l6ZTsKKworICAgIG91dHB1dEZyYW1lU2l6ZSA9CisgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFswXS0+cFNickNoYW5uZWxbMF0tPlNickRlYy5TeW50aGVzaXNRTUYubm9fY2hhbm5lbHMKKyAgICAgICAgICAgICogc2VsZi0+cFNickVsZW1lbnRbMF0tPnBTYnJDaGFubmVsWzBdLT5TYnJEZWMuU3ludGhlc2lzUU1GLm5vX2NvbDsKKworICAgIGZvciAoYz1udW1Db3JlQ2hhbm5lbHMtMTsgYz4wOyBjLS0pIHsKKyAgICAgIEZES21lbW1vdmUodGltZURhdGEgKyBjKm91dHB1dEZyYW1lU2l6ZSwgdGltZURhdGEgKyBjKnNlbGYtPmNvZGVjRnJhbWVTaXplICwgc2VsZi0+Y29kZWNGcmFtZVNpemUqc2l6ZW9mKElOVF9QQ00pKTsKKyAgICB9CisgIH0KKworCisgIC8qIE1ha2Ugc3VyZSB0aGF0IGV2ZW4gaWYgbm8gU0JSIGRhdGEgd2FzIGZvdW5kL3BhcnNlZCAqcHNEZWNvZGVkIGlzIHJldHVybmVkIDEgaWYgcHNQb3NzaWJsZSB3YXMgMC4gKi8KKyAgaWYgKHBzUG9zc2libGUgPT0gMCkgeworICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKKyAgfQorCisgIC8qIExvb3Agb3ZlciBTQlIgZWxlbWVudHMgKi8KKyAgZm9yIChzYnJFbGVtZW50TnVtID0gMDsgc2JyRWxlbWVudE51bTxzZWxmLT5udW1TYnJFbGVtZW50czsgc2JyRWxlbWVudE51bSsrKQorICB7CisgICAgaW50IG51bUVsZW1lbnRDaGFuOworCisgICAgaWYgKHBzUG9zc2libGUgJiYgc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPnBTYnJDaGFubmVsWzFdID09IE5VTEwpIHsKKyAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBudW1FbGVtZW50Q2hhbiA9IChzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+ZWxlbWVudElEID09IElEX0NQRSkgPyAyIDogMTsKKworICAgIC8qIElmIGNvcmUgc2lnbmFsIGlzIGJhZCB0aGVuIGZvcmNlIHVwc2FtcGxpbmcgKi8KKyAgICBpZiAoICEgY29yZURlY29kZWRPayApIHsKKyAgICAgIHNlbGYtPnBTYnJFbGVtZW50W3NickVsZW1lbnROdW1dLT5mcmFtZUVycm9yRmxhZ1tzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+dXNlRnJhbWVTbG90XSA9IDE7CisgICAgfQorCisgICAgZXJyb3JTdGF0dXMgPSBzYnJEZWNvZGVyX0RlY29kZUVsZW1lbnQgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVsZW1lbnROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db3JlQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1FbGVtZW50Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzUG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgaWYgKGVycm9yU3RhdHVzICE9IFNCUkRFQ19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIG51bVNickNoYW5uZWxzICs9IG51bUVsZW1lbnRDaGFuOworICAgIGNoYW5uZWxNYXBwaW5nICs9IG51bUVsZW1lbnRDaGFuOworCisgICAgaWYgKG51bVNickNoYW5uZWxzID49IG51bUNvcmVDaGFubmVscykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogVXBkYXRlIG51bUNoYW5uZWxzIGFuZCBzYW1wbGVyYXRlICovCisgICpudW1DaGFubmVscyA9IG51bVNickNoYW5uZWxzOworICAqc2FtcGxlUmF0ZSA9IHNlbGYtPnNhbXBsZVJhdGVPdXQ7CisgICpwc0RlY29kZWQgPSAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAxIDogMDsKKworCisKKyAgLyogQ2xlYXIgcmVzZXQgYW5kIGZsdXNoIGZsYWcgYmVjYXVzZSBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIGRvbmUgc3VjY2Vzc2Z1bGx5LiAqLworICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0ZPUkNFX1JFU0VUOworICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0ZMVVNIOworCitiYWlsOgorCisgIHJldHVybiBlcnJvclN0YXR1czsKK30KKworCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9TQlJERUNPREVSICpwU2VsZiApCit7CisgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYgPSAqcFNlbGY7CisgIGludCBpOworCisgIGlmIChzZWxmICE9IE5VTEwpCisgIHsKKyAgICBpZiAoc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgeworICAgICAgRGVsZXRlUHNEZWMgKCAmc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+d29ya0J1ZmZlcjEgIT0gTlVMTCkgeworICAgICAgRnJlZVJhbV9TYnJEZWNXb3JrQnVmZmVyMSgmc2VsZi0+d29ya0J1ZmZlcjEpOworICAgIH0KKyAgICBpZiAoc2VsZi0+d29ya0J1ZmZlcjIgIT0gTlVMTCkgeworICAgICAgRnJlZVJhbV9TYnJEZWNXb3JrQnVmZmVyMigmc2VsZi0+d29ya0J1ZmZlcjIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAoOCk7IGkrKykgeworICAgICAgc2JyRGVjb2Rlcl9EZXN0cm95RWxlbWVudCggc2VsZiwgaSApOworICAgIH0KKworICAgIEZyZWVSYW1fU2JyRGVjb2RlcihwU2VsZik7CisgIH0KKworICByZXR1cm4gU0JSREVDX09LOworfQorCisKK0lOVCBzYnJEZWNvZGVyX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpCisgICAgcmV0dXJuIC0xOworICBpbmZvICs9IGk7CisKKyAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1NCUkRFQzsKKyAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNCUkRFQ09ERVJfTElCX1ZMMCwgU0JSREVDT0RFUl9MSUJfVkwxLCBTQlJERUNPREVSX0xJQl9WTDIpOworICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyk7CisgIGluZm8tPmJ1aWxkX2RhdGUgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX0JVSUxEX0RBVEU7CisgIGluZm8tPmJ1aWxkX3RpbWUgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX0JVSUxEX1RJTUU7CisgIGluZm8tPnRpdGxlICAgICAgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX1RJVExFOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvLT5mbGFncyA9IDAKKyAgICB8IENBUEZfU0JSX0hRCisgICAgfCBDQVBGX1NCUl9MUAorICAgIHwgQ0FQRl9TQlJfUFNfTVBFRworICAgIHwgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQKKyAgICB8IENBUEZfU0JSX0RSQworICAgICAgOworICAvKiBFbmQgb2YgZmxhZ3MgKi8KKworICByZXR1cm4gMDsKK30KKworCitVSU5UIHNickRlY29kZXJfR2V0RGVsYXkoIGNvbnN0IEhBTkRMRV9TQlJERUNPREVSIHNlbGYgKQoreworICBVSU5UIG91dHB1dERlbGF5ID0gMDsKKworICBpZiAoIHNlbGYgIT0gTlVMTCkgeworICAgIFVJTlQgZmxhZ3MgPSBzZWxmLT5mbGFnczsKKworICAgIC8qIFNlZSBjaGFwdGVyIDEuNi43LjIgb2YgSVNPL0lFQyAxNDQ5Ni0zIGZvciB0aGUgR0EtU0JSIGZpZ3VyZXMgYmVsb3cuICovCisKKyAgICAvKiBBcmUgd2UgaW5pdGlhbGl6ZWQ/ICovCisgICAgaWYgKCAoc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPiAwKQorICAgICAgJiYgKHNlbGYtPm51bVNickVsZW1lbnRzID4gMCkgKQorICAgIHsKKyAgICAgIC8qIEFkZCBRTUYgc3ludGhlc2lzIGRlbGF5ICovCisgICAgICBpZiAoIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkKKyAgICAgICAgJiYgSVNfTE9XREVMQVkoc2VsZi0+Y29yZUNvZGVjKSApIHsKKyAgICAgICAgLyogTG93IGRlbGF5IFNCUjogKi8KKyAgICAgICAgeworICAgICAgICAgIG91dHB1dERlbGF5ICs9IChmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDMyIDogNjQ7ICAgLyogUU1GIHN5bnRoZXNpcyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICghSVNfVVNBQyhzZWxmLT5jb3JlQ29kZWMpKSB7CisgICAgICAgIC8qIEJ5IHRoZSBtZXRob2Qgb2YgZWxpbWluYXRpb24gdGhpcyBpcyB0aGUgR0EgKEFBQy1MQywgSEUtQUFDLCAuLi4pIGJyYW5jaDogKi8KKyAgICAgICAgb3V0cHV0RGVsYXkgKz0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gNDgxIDogOTYyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAob3V0cHV0RGVsYXkpOworfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmRlYy9zcmMvdHJhbnNjZW5kZW50LmggYi9hYWMvbGliU0JSZGVjL3NyYy90cmFuc2NlbmRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg4YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmRlYy9zcmMvdHJhbnNjZW5kZW50LmgKQEAgLTAsMCArMSwzNTUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBGREsgRml4ZWQgUG9pbnQgQXJpdGhtZXRpYyBMaWJyYXJ5IEludGVyZmFjZSAgCisqLworCisjaWZuZGVmIF9fVFJBTlNDRU5ERU5UX0gKKyNkZWZpbmUgX19UUkFOU0NFTkRFTlRfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorI2luY2x1ZGUgInNicl9yb20uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICBHZXQgbnVtYmVyIG9mIG9jdGF2ZXMgYmV0d2VlbiBmcmVxdWVuY2llcyBhIGFuZCBiCisKKyAgVGhlIFJlc3VsdCBpcyBzY2FsZWQgd2l0aCAxLzguCisgIFRoZSB2YWxpZCByYW5nZSBmb3IgYSBhbmQgYiBpcyAxIHRvIExPR19EVUFMSVNfVEFCTEVfU0laRS4KKworICBccmV0dXJuICAgbGQoYS9iKSAvIDgKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSBGSVhQX1NHTCBGREtfZ2V0TnVtT2N0YXZlc0RpdjgoSU5UIGEsIC8qITwgbG93ZXIgYmFuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGIpIC8qITwgdXBwZXIgYmFuZCAqLworeworICByZXR1cm4gKCAoU0hPUlQpKChMT05HKShDYWxjTGRJbnQoYikgLSBDYWxjTGRJbnQoYSkpPj4oRlJBQ1RfQklUUy0zKSkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgIEFkZCB0d28gdmFsdWVzIGdpdmVuIGJ5IG1hbnRpc3NhIGFuZCBleHBvbmVudC4KKworICBNYW50aXNzYXMgYXJlIGluIGZyYWN0IGZvcm1hdCB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuIDxicj4KKyAgVGhlIGJhc2UgZm9yIGV4cG9uZW50cyBpcyAyLiAgRXhhbXBsZTogIFxmJCAgYSA9IGFcX20gKiAyXnthXF9lfSAgXGYkPGJyPgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbmxpbmUgdm9pZCBGREtfYWRkX01hbnRFeHAoRklYUF9TR0wgYV9tLCAvKiE8IE1hbnRpc3NhIG9mIDFzdCBvcGVyYW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBhX2UsICAgICAgIC8qITwgRXhwb25lbnQgb2YgMXN0IG9wZXJhbmQgYSAqLworICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIGJfbSwgICAgICAgLyohPCBNYW50aXNzYSBvZiAybmQgb3BlcmFuZCBiICovCisgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYl9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDJuZCBvcGVyYW5kIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpwdHJTdW1fbSwgIC8qITwgTWFudGlzc2Egb2YgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqcHRyU3VtX2UpICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdCAqLworeworICBGSVhQX0RCTCBhY2N1OworICBpbnQgICBzaGlmdDsKKyAgaW50ICAgc2hpZnRBYnM7CisKKyAgRklYUF9EQkwgc2hpZnRlZE1hbnRpc3NhOworICBGSVhQX0RCTCBvdGhlck1hbnRpc3NhOworCisgIC8qIEVxdWFsaXplIGV4cG9uZW50cyBvZiB0aGUgc3VtbWFuZHMuCisgICAgIEZvciB0aGUgc21hbGxlciBzdW1tYW5kLCB0aGUgZXhwb25lbnQgaXMgYWRhcHRlZCBhbmQKKyAgICAgZm9yIGNvbXBlbnNhdGlvbiwgdGhlIG1hbnRpc3NhIGlzIHNoaWZ0ZWQgcmlnaHQuICovCisKKyAgc2hpZnQgPSAoaW50KShhX2UgLSBiX2UpOworCisgIHNoaWZ0QWJzID0gKHNoaWZ0PjApPyBzaGlmdCA6IC1zaGlmdDsKKyAgc2hpZnRBYnMgPSAoc2hpZnRBYnMgPCBERlJBQ1RfQklUUy0xKT8gc2hpZnRBYnMgOiBERlJBQ1RfQklUUy0xOworICBzaGlmdGVkTWFudGlzc2EgPSAoc2hpZnQ+MCk/IChGWF9TR0wyRlhfREJMKGJfbSkgPj4gc2hpZnRBYnMpIDogKEZYX1NHTDJGWF9EQkwoYV9tKSA+PiBzaGlmdEFicyk7CisgIG90aGVyTWFudGlzc2EgPSAoc2hpZnQ+MCk/IEZYX1NHTDJGWF9EQkwoYV9tKSA6IEZYX1NHTDJGWF9EQkwoYl9tKTsKKyAgKnB0clN1bV9lID0gKHNoaWZ0PjApPyBhX2UgOiBiX2U7CisKKyAgYWNjdSA9IChzaGlmdGVkTWFudGlzc2EgPj4gMSkgKyAob3RoZXJNYW50aXNzYSA+PiAxKTsKKyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKworICBpZiAoIChhY2N1ID49IChGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChGSVhQX0RCTCkxKSkgfHwgKGFjY3UgPD0gRkwyRlhDT05TVF9EQkwoLTAuNWYpKSApCisgICAgKnB0clN1bV9lICs9IDE7CisgIGVsc2UKKyAgICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSArIG90aGVyTWFudGlzc2EpOworCisgICpwdHJTdW1fbSA9IEZYX0RCTDJGWF9TR0woYWNjdSk7CisKK30KKworaW5saW5lIHZvaWQgRkRLX2FkZF9NYW50RXhwKEZJWFBfREJMIGEsICAgLyohPCBNYW50aXNzYSBvZiAxc3Qgb3BlcmFuZCBhICovCisgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDFzdCBvcGVyYW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBiLCAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgMm5kIG9wZXJhbmQgYiAqLworICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgLyohPCBFeHBvbmVudCBvZiAybmQgb3BlcmFuZCBiICovCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcHRyU3VtLCAgICAvKiE8IE1hbnRpc3NhIG9mIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clN1bV9lKSAgLyohPCBFeHBvbmVudCBvZiByZXN1bHQgKi8KK3sKKyAgRklYUF9EQkwgYWNjdTsKKyAgaW50ICAgc2hpZnQ7CisgIGludCAgIHNoaWZ0QWJzOworCisgIEZJWFBfREJMIHNoaWZ0ZWRNYW50aXNzYTsKKyAgRklYUF9EQkwgb3RoZXJNYW50aXNzYTsKKworICAvKiBFcXVhbGl6ZSBleHBvbmVudHMgb2YgdGhlIHN1bW1hbmRzLgorICAgICBGb3IgdGhlIHNtYWxsZXIgc3VtbWFuZCwgdGhlIGV4cG9uZW50IGlzIGFkYXB0ZWQgYW5kCisgICAgIGZvciBjb21wZW5zYXRpb24sIHRoZSBtYW50aXNzYSBpcyBzaGlmdGVkIHJpZ2h0LiAqLworCisgIHNoaWZ0ID0gKGludCkoYV9lIC0gYl9lKTsKKworICBzaGlmdEFicyA9IChzaGlmdD4wKT8gc2hpZnQgOiAtc2hpZnQ7CisgIHNoaWZ0QWJzID0gKHNoaWZ0QWJzIDwgREZSQUNUX0JJVFMtMSk/IHNoaWZ0QWJzIDogREZSQUNUX0JJVFMtMTsKKyAgc2hpZnRlZE1hbnRpc3NhID0gKHNoaWZ0PjApPyAoYiA+PiBzaGlmdEFicykgOiAoYSA+PiBzaGlmdEFicyk7CisgIG90aGVyTWFudGlzc2EgPSAoc2hpZnQ+MCk/IGEgOiBiOworICAqcHRyU3VtX2UgPSAoc2hpZnQ+MCk/IGFfZSA6IGJfZTsKKworICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSA+PiAxKSArIChvdGhlck1hbnRpc3NhID4+IDEpOworICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworCisgIGlmICggKGFjY3UgPj0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKEZJWFBfREJMKTEpKSB8fCAoYWNjdSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpICkKKyAgICAqcHRyU3VtX2UgKz0gMTsKKyAgZWxzZQorICAgIGFjY3UgPSAoc2hpZnRlZE1hbnRpc3NhICsgb3RoZXJNYW50aXNzYSk7CisKKyAgKnB0clN1bSA9IGFjY3U7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICBEaXZpZGUgdHdvIHZhbHVlcyBnaXZlbiBieSBtYW50aXNzYSBhbmQgZXhwb25lbnQuCisKKyAgTWFudGlzc2FzIGFyZSBpbiBmcmFjdCBmb3JtYXQgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLiA8YnI+CisgIFRoZSBiYXNlIGZvciBleHBvbmVudHMgaXMgMi4gIEV4YW1wbGU6ICBcZiQgIGEgPSBhXF9tICogMl57YVxfZX0gIFxmJDxicj4KKworICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGRpdmlzaW9uIGlzIGJhc2VkIG9uIGEgdGFibGUgbG9va3VwCisgIHdoaWNoIGxpbWl0cyBhY2N1cmFjeS4KKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIEZES19kaXZpZGVfTWFudEV4cChGSVhQX1NHTCBhX20sICAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlkZW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGFfZSwgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpZGVuZCBhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICBiX20sICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aXNvciBiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBiX2UsICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aXNvciBiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpwdHJSZXN1bHRfbSwgIC8qITwgTWFudGlzc2Egb2YgcXVvdGllbnQgYS9iICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpwdHJSZXN1bHRfZSkgIC8qITwgRXhwb25lbnQgb2YgcXVvdGllbnQgYS9iICovCisKK3sKKyAgaW50IHByZVNoaWZ0LCBwb3N0U2hpZnQsIGluZGV4LCBzaGlmdDsKKyAgRklYUF9EQkwgcmF0aW9fbTsKKyAgRklYUF9TR0wgIGJJbnZfbSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworCisgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKEZYX1NHTDJGWF9EQkwoYl9tKSk7CisKKyAgLyoKKyAgICBTaGlmdCBiIGludG8gdGhlIHJhbmdlIGZyb20gMC4uSU5WX1RBQkxFX1NJWkUtMSwKKworICAgIEUuZy4gMTAgYml0cyBtdXN0IGJlIHNraXBwZWQgZm9yIElOVl9UQUJMRV9CSVRTIDg6CisgICAgLSBsZWF2ZSA4IGJpdHMgYXMgaW5kZXggZm9yIHRhYmxlCisgICAgLSBza2lwIHNpZ24gYml0LAorICAgIC0gc2tpcCBmaXJzdCBiaXQgb2YgbWFudGlzc2EsIGJlY2F1c2UgdGhpcyBpcyBhbHdheXMgdGhlIHNhbWUgKD4wLjUpCisKKyAgICBXZSBhcmUgZGVhbGluZyB3aXRoIGVuZXJnaWVzLCBzbyB3ZSBuZWVkIG5vdCBjYXJlCisgICAgYWJvdXQgbmVnYXRpdmUgbnVtYmVycworICAqLworCisgIC8qCisgICAgVGhlIGZpcnN0IGludGVydmFsIGhhcyBoYWxmIHdpZHRoIHNvIHRoZSBsb3dlc3QgYml0IG9mIHRoZSBpbmRleCBpcworICAgIG5lZWRlZCBmb3IgYSBkb3VibGVkIHJlc29sdXRpb24uCisgICovCisgIHNoaWZ0ID0gKEZSQUNUX0JJVFMgLSAyIC0gSU5WX1RBQkxFX0JJVFMgLSBwcmVTaGlmdCk7CisKKyAgaW5kZXggPSAoc2hpZnQ8MCk/IChMT05HKWJfbSA8PCAoLXNoaWZ0KSA6IChMT05HKWJfbSA+PiBzaGlmdDsKKworCisgIC8qIFRoZSBpbmRleCBoYXMgSU5WX1RBQkxFX0JJVFMgKzEgdmFsaWQgYml0cyBoZXJlLiBDbGVhciB0aGUgb3RoZXIgYml0cy4gKi8KKyAgaW5kZXggJj0gKDEgPDwgKElOVl9UQUJMRV9CSVRTKzEpKSAtIDE7CisKKyAgICAvKiBSZW1vdmUgb2Zmc2V0IG9mIGhhbGYgYW4gaW50ZXJ2YWwgKi8KKyAgaW5kZXgtLTsKKworICAgIC8qIE5vdyB0aGUgbG93ZXN0IGJpdCBpcyBzaGlmdGVkIG91dCAqLworICBpbmRleCA9IGluZGV4ID4+IDE7CisKKyAgICAvKiBGZXRjaCBpbnZlcnNlZCBtYW50aXNzYSBmcm9tIHRhYmxlOiAqLworICBiSW52X20gPSAoaW5kZXg8MCk/IGJJbnZfbSA6IEZES19zYnJEZWNvZGVyX2ludlRhYmxlW2luZGV4XTsKKworICAgIC8qIE11bHRpcGx5IGEgd2l0aCB0aGUgaW52ZXJzZSBvZiBiOiAqLworICByYXRpb19tID0gKGluZGV4PDApPyBGWF9TR0wyRlhfREJMKGFfbSA+PiAxKSA6IGZNdWx0RGl2MihiSW52X20sYV9tKTsKKworICBwb3N0U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MocmF0aW9fbSktMTsKKworICAqcHRyUmVzdWx0X20gPSBGWF9EQkwyRlhfU0dMKHJhdGlvX20gPDwgcG9zdFNoaWZ0KTsKKyAgKnB0clJlc3VsdF9lID0gYV9lIC0gYl9lICsgMSArIHByZVNoaWZ0IC0gcG9zdFNoaWZ0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRkRLX2RpdmlkZV9NYW50RXhwKEZJWFBfREJMIGFfbSwgICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aWRlbmQgYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGRpdmlkZW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGJfbSwgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpc29yIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpc29yIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnB0clJlc3VsdF9tLCAgLyohPCBNYW50aXNzYSBvZiBxdW90aWVudCBhL2IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clJlc3VsdF9lKSAgLyohPCBFeHBvbmVudCBvZiBxdW90aWVudCBhL2IgKi8KKworeworICBpbnQgcHJlU2hpZnQsIHBvc3RTaGlmdCwgaW5kZXgsIHNoaWZ0OworICBGSVhQX0RCTCByYXRpb19tOworICBGSVhQX1NHTCAgYkludl9tID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisKKyAgcHJlU2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYl9tKTsKKworICAvKgorICAgIFNoaWZ0IGIgaW50byB0aGUgcmFuZ2UgZnJvbSAwLi5JTlZfVEFCTEVfU0laRS0xLAorCisgICAgRS5nLiAxMCBiaXRzIG11c3QgYmUgc2tpcHBlZCBmb3IgSU5WX1RBQkxFX0JJVFMgODoKKyAgICAtIGxlYXZlIDggYml0cyBhcyBpbmRleCBmb3IgdGFibGUKKyAgICAtIHNraXAgc2lnbiBiaXQsCisgICAgLSBza2lwIGZpcnN0IGJpdCBvZiBtYW50aXNzYSwgYmVjYXVzZSB0aGlzIGlzIGFsd2F5cyB0aGUgc2FtZSAoPjAuNSkKKworICAgIFdlIGFyZSBkZWFsaW5nIHdpdGggZW5lcmdpZXMsIHNvIHdlIG5lZWQgbm90IGNhcmUKKyAgICBhYm91dCBuZWdhdGl2ZSBudW1iZXJzCisgICovCisKKyAgLyoKKyAgICBUaGUgZmlyc3QgaW50ZXJ2YWwgaGFzIGhhbGYgd2lkdGggc28gdGhlIGxvd2VzdCBiaXQgb2YgdGhlIGluZGV4IGlzCisgICAgbmVlZGVkIGZvciBhIGRvdWJsZWQgcmVzb2x1dGlvbi4KKyAgKi8KKyAgc2hpZnQgPSAoREZSQUNUX0JJVFMgLSAyIC0gSU5WX1RBQkxFX0JJVFMgLSBwcmVTaGlmdCk7CisKKyAgaW5kZXggPSAoc2hpZnQ8MCk/IChMT05HKWJfbSA8PCAoLXNoaWZ0KSA6IChMT05HKWJfbSA+PiBzaGlmdDsKKworCisgIC8qIFRoZSBpbmRleCBoYXMgSU5WX1RBQkxFX0JJVFMgKzEgdmFsaWQgYml0cyBoZXJlLiBDbGVhciB0aGUgb3RoZXIgYml0cy4gKi8KKyAgaW5kZXggJj0gKDEgPDwgKElOVl9UQUJMRV9CSVRTKzEpKSAtIDE7CisKKyAgICAvKiBSZW1vdmUgb2Zmc2V0IG9mIGhhbGYgYW4gaW50ZXJ2YWwgKi8KKyAgaW5kZXgtLTsKKworICAgIC8qIE5vdyB0aGUgbG93ZXN0IGJpdCBpcyBzaGlmdGVkIG91dCAqLworICBpbmRleCA9IGluZGV4ID4+IDE7CisKKyAgICAvKiBGZXRjaCBpbnZlcnNlZCBtYW50aXNzYSBmcm9tIHRhYmxlOiAqLworICBiSW52X20gPSAoaW5kZXg8MCk/IGJJbnZfbSA6IEZES19zYnJEZWNvZGVyX2ludlRhYmxlW2luZGV4XTsKKworICAgIC8qIE11bHRpcGx5IGEgd2l0aCB0aGUgaW52ZXJzZSBvZiBiOiAqLworICByYXRpb19tID0gKGluZGV4PDApPyAoYV9tID4+IDEpIDogZk11bHREaXYyKGJJbnZfbSxhX20pOworCisgIHBvc3RTaGlmdCA9IENudExlYWRpbmdaZXJvcyhyYXRpb19tKS0xOworCisgICpwdHJSZXN1bHRfbSA9IHJhdGlvX20gPDwgcG9zdFNoaWZ0OworICAqcHRyUmVzdWx0X2UgPSBhX2UgLSBiX2UgKyAxICsgcHJlU2hpZnQgLSBwb3N0U2hpZnQ7Cit9CisKKy8qIQorICBcYnJpZWYgICBDYWxjdWxhdGUgdGhlIHNxdWFyZXJvb3Qgb2YgYSBudW1iZXIgZ2l2ZW4gYnkgbWFudGlzc2EgYW5kIGV4cG9uZW50CisKKyAgTWFudGlzc2EgaXMgaW4gZnJhY3QgZm9ybWF0IHdpdGggdmFsdWVzIGJldHdlZW4gMCBhbmQgMS4gPGJyPgorICBUaGUgYmFzZSBmb3IgdGhlIGV4cG9uZW50IGlzIDIuICBFeGFtcGxlOiAgXGYkICBhID0gYVxfbSAqIDJee2FcX2V9ICBcZiQ8YnI+CisgIFRoZSBvcGVyYW5kIGlzIGFkZHJlc3NlZCB2aWEgcG9pbnRlcnMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgcmVzdWx0LgorCisgIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgc3F1YXJlIHJvb3QgaXMgYmFzZWQgb24gYSB0YWJsZSBsb29rdXAKKyAgd2hpY2ggbGltaXRzIGFjY3VyYWN5LgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBGREtfc3FydF9NYW50RXhwKEZJWFBfREJMICptYW50aXNzYSwgICAgLyohPCBQb2ludGVyIHRvIG1hbnRpc3NhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAqZGVzdFNjYWxlKQoreworICBGSVhQX0RCTCBpbnB1dF9tID0gKm1hbnRpc3NhOworICBpbnQgICBpbnB1dF9lID0gKGludCkgKmV4cG9uZW50OworICBGSVhQX0RCTCByZXN1bHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgaW50ICAgIHJlc3VsdF9lID0gLUZSQUNUX0JJVFM7CisKKyAgLyogQ2FsbCBsb29rdXAgc3F1YXJlIHJvb3QsIHdoaWNoIGRvZXMgaW50ZXJuYWxseSBub3JtYWxpemF0aW9uLiAqLworICByZXN1bHQgICA9IHNxcnRGaXhwX2xvb2t1cChpbnB1dF9tLCAmaW5wdXRfZSk7CisgIHJlc3VsdF9lID0gaW5wdXRfZTsKKworICAvKiBXcml0ZSByZXN1bHQgKi8KKyAgaWYgKGV4cG9uZW50PT1kZXN0U2NhbGUpIHsKKyAgICAqbWFudGlzc2EgPSByZXN1bHQ7CisgICAgKmV4cG9uZW50ID0gcmVzdWx0X2U7CisgIH0gZWxzZSB7CisgICAgaW50IHNoaWZ0ID0gcmVzdWx0X2UgLSAqZGVzdFNjYWxlOworICAgICptYW50aXNzYSA9IChzaGlmdD49MCkgPyByZXN1bHQgPDwgKElOVClmaXhNaW4oREZSQUNUX0JJVFMtMSxzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzdWx0ID4+IChJTlQpZml4TWluKERGUkFDVF9CSVRTLTEsLXNoaWZ0KTsKKyAgICAqZXhwb25lbnQgPSAqZGVzdFNjYWxlOworICB9Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaCBiL2FhYy9saWJTQlJlbmMvaW5jbHVkZS9zYnJfZW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGM0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaApAQCAtMCwwICsxLDQxOSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICoqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBTQlIgZW5jb2RlciB0b3AgbGV2ZWwgcHJvY2Vzc2luZyBwcm90b3R5cGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fU0JSX0VOQ09ERVJfSAorI2RlZmluZSBfX1NCUl9FTkNPREVSX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworLyogY29yZSBjb2RlciBoZWxwZXJzICovCisjZGVmaW5lIE1BWF9UUkFOU19GQUMgICAgICAgICA4CisjZGVmaW5lIE1BWF9DT0RFQ19GUkFNRV9SQVRJTyAyCisjZGVmaW5lIE1BWF9QQVlMT0FEX1NJWkUgICAgMjU2CisKK3R5cGVkZWYgZW51bSBjb2RlY1R5cGUKK3sKKyAgQ09ERUNfQUFDPTAsCisgIENPREVDX0FBQ0xEPTEsCisgIENPREVDX1VOU1BFQ0lGSUVEPTk5Cit9IENPREVDX1RZUEU7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIGJpdFJhdGU7CisgIElOVCBuQ2hhbm5lbHM7CisgIElOVCBzYW1wbGVGcmVxOworICBJTlQgdHJhbnNGYWM7CisgIElOVCBzdGFuZGFyZEJpdHJhdGU7Cit9IENPREVDX1BBUkFNOworCit0eXBlZGVmIGVudW0KK3sKKyAgU0JSX01PTk8sCisgIFNCUl9MRUZUX1JJR0hULAorICBTQlJfQ09VUExJTkcsCisgIFNCUl9TV0lUQ0hfTFJDCit9IFNCUl9TVEVSRU9fTU9ERTsKKworLyogYml0c3RyZWFtIHN5bnRheCBmbGFncyAqLworZW51bQoreworICBTQlJfU1lOVEFYX0xPV19ERUxBWSA9IDB4MDAwMSwKKyAgU0JSX1NZTlRBWF9TQ0FMQUJMRSAgPSAweDAwMDIsCisgIFNCUl9TWU5UQVhfQ1JDICAgICAgID0gMHgwMDA0LAorICBTQlJfU1lOVEFYX0RSTV9DUkMgICA9IDB4MDAwOAorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ09ERUNfVFlQRSAgICAgICBjb3JlQ29kZXI7ICAgICAgICAvKiE8IExDIG9yIEVMRCAqLworICBVSU5UICAgICAgICAgICAgIGJpdHJhdGVGcm9tOyAgICAgIC8qITwgaW5jbHVzaXZlICovCisgIFVJTlQgICAgICAgICAgICAgYml0cmF0ZVRvOyAgICAgICAgLyohPCBleGNsdXNpdmUgKi8KKworICBVSU5UICAgICAgICAgICAgIHNhbXBsZVJhdGU7ICAgICAgIC8qITwgICAqLworICBVQ0hBUiAgICAgICAgICAgIG51bUNoYW5uZWxzOyAgICAgIC8qITwgICAqLworCisgIFVDSEFSICAgICAgICAgICAgc3RhcnRGcmVxOyAgICAgICAgLyohPCBic19zdGFydF9mcmVxICovCisgIFVDSEFSICAgICAgICAgICAgc3RhcnRGcmVxU3BlZWNoOyAgLyohPCBic19zdGFydF9mcmVxIGZvciBzcGVlY2ggY29uZmlnIGZsYWcgKi8KKyAgVUNIQVIgICAgICAgICAgICBzdG9wRnJlcTsgICAgICAgICAvKiE8IGJzX3N0b3BfZnJlcSAqLworICBVQ0hBUiAgICAgICAgICAgIHN0b3BGcmVxU3BlZWNoOyAgIC8qITwgYnNfc3RvcF9mcmVxIGZvciBzcGVlY2ggY29uZmlnIGZsYWcgKi8KKworICBVQ0hBUiAgICAgICAgICAgIG51bU5vaXNlQmFuZHM7ICAgIC8qITwgICAqLworICBVQ0hBUiAgICAgICAgICAgIG5vaXNlRmxvb3JPZmZzZXQ7IC8qITwgICAqLworICBTQ0hBUiAgICAgICAgICAgIG5vaXNlTWF4TGV2ZWw7ICAgIC8qITwgICAqLworICBTQlJfU1RFUkVPX01PREUgIHN0ZXJlb01vZGU7ICAgICAgIC8qITwgICAqLworICBVQ0hBUiAgICAgICAgICAgIGZyZXFTY2FsZTsgICAgICAgIC8qITwgICAqLworfSBzYnJUdW5pbmdUYWJsZV90OworCit0eXBlZGVmIHN0cnVjdCBzYnJDb25maWd1cmF0aW9uCit7CisgIC8qCisgICAgIGNvcmUgY29kZXIgZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zCisgICovCisgIENPREVDX1BBUkFNIGNvZGVjU2V0dGluZ3M7ICAvKiE8IENvcmUgY29kZXIgc2V0dGluZ3MuIFRvIGJlIHNldCBmcm9tIGNvcmUgY29kZXIuICovCisgIElOVCBTZW5kSGVhZGVyRGF0YVRpbWU7ICAgICAvKiE8IFNCUiBoZWFkZXIgc2VuZCB1cGRhdGUgZnJlcXVlbmN5IGluIG1zLiAqLworICBJTlQgdXNlV2F2ZUNvZGluZzsgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiB3YXZlY29kaW5nIHRvb2wuICovCisgIElOVCBjcmNTYnI7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUi1DUkMuICovCisgIElOVCBkeW5Cd1N1cHBvcnRlZDsgICAgICAgICAvKiE8IEZsYWc6IHN1cHBvcnQgZm9yIGR5bmFtaWMgYmFuZHdpZHRoIGluIHRoaXMgY29tYmluYXRpb24uICovCisgIElOVCBwYXJhbWV0cmljQ29kaW5nOyAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIHRvb2wuICovCisgIElOVCBkb3duU2FtcGxlRmFjdG9yOyAgICAgICAvKiE8IFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZSBlbmNvZGVyLiAqLworICBpbnQgZnJlcV9yZXNfZml4Zml4WzNdOyAgICAgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZXMgaW4gZnJhbWUgY2xhc3MgRklYRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPTEgRW52OyAxPTIgRW52OyAyPTQgRW52OyAqLworICAvKgorICAgICBjb3JlIGNvZGVyIGRlcGVuZGVudCB0dW5pbmcgcGFyYW1ldGVycworICAqLworICBJTlQgdHJhbl90aHI7ICAgICAgICAgICAgIC8qITwgU0JSIHRyYW5zaWVudCBkZXRlY3RvciB0aHJlc2hvbGQgKCogMTAwKS4gKi8KKyAgSU5UIG5vaXNlRmxvb3JPZmZzZXQ7ICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gICAgICAqLworICBVSU5UIHVzZVNwZWVjaENvbmZpZzsgICAgIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaC4gKi8KKworCisKKyAgLyoKKyAgICAgY29yZSBjb2RlciBpbmRlcGVuZGVudCBjb25maWd1cmF0aW9ucworICAqLworICBJTlQgc2JyRnJhbWVTaXplOyAgICAgICAgICAgLyohPCBTQlIgZnJhbWUgc2l6ZSBpbiBzYW1wbGVzLiBXaWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBjb3JlIGNvZGVyIHNldHRpbmdzLiAqLworICBJTlQgc2JyX2RhdGFfZXh0cmE7ICAgICAgICAgLyohPCBGbGFnIHVzYWdlIG9mIGRhdGEgZXh0cmEuICovCisgIElOVCBhbXBfcmVzOyAgICAgICAgICAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uLiAqLworICBJTlQgYW5hX21heF9sZXZlbDsgICAgICAgICAgLyohPCBOb2lzZSBpbnNlcnRpb24gbWF4aW11bSBsZXZlbC4gKi8KKyAgSU5UIHRyYW5fZmM7ICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KKyAgSU5UIHRyYW5fZGV0X21vZGU7ICAgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIG1vZGUuICovCisgIElOVCBzcHJlYWQ7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUiBzcHJlYWQuICovCisgIElOVCBzdGF0OyAgICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHN0YXRpYyBmcmFtaW5nLiAqLworICBJTlQgZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzIHdoZW4gc3RhdGljIGZyYW1pbmcgaXMgY2hvc2VuLiAqLworICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZTsgLyohPCBTQlIgc3RlcmVvIG1vZGUuICovCisgIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXM7ICAgICAvKiE8IEZsYWc6IGFsbG93IHRpbWUtZGVsdGEgY29kaW5nLiAqLworICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudjsgICAgLyohPCBFeHRyYSBmcmFjdGlvbiBkZWx0YS1GIGNvZGluZyBpcyBhbGxvd2VkIHRvIGJlIG1vcmUgZXhwZW5zaXZlLiAqLworICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7ICAgICAgLyohPCBJbmNyZW1lbnQgZEZfZWRnZV8xc3RFbnYgdGhpcyBtdWNoIGlmIGRULWNvZGluZyB3YXMgdXNlZCB0aGlzIGZyYW1lLiAqLworICBJTlQgc2JyX2ludmZfbW9kZTsgICAgICAgICAgLyohPCBJbnZlcnNlIGZpbHRlcmluZyBtb2RlLiAqLworICBJTlQgc2JyX3hwb3NfbW9kZTsgICAgICAgICAgLyohPCBUcmFuc3Bvc2VyIG1vZGUuICovCisgIElOVCBzYnJfeHBvc19jdHJsOyAgICAgICAgICAvKiE8IFRyYW5zcG9zZXIgY29udHJvbC4gKi8KKyAgSU5UIHNicl94cG9zX2xldmVsOyAgICAgICAgIC8qITwgVHJhbnNwb3NlciAzcmQgb3JkZXIgbGV2ZWwuICovCisgIElOVCBzdGFydEZyZXE7ICAgICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBmcmVxdWVuY3kgdGFibGUgaW5kZXguICovCisgIElOVCBzdG9wRnJlcTsgICAgICAgICAgICAgICAvKiE8IFRoZSBzdG9wIGZyZXF1ZW5jeSB0YWJsZSBpbmRleC4gKi8KKyAgSU5UIHVzZVNhUGFuOyAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0FQQU4gc3RlcmVvLiAqLworICBJTlQgZHluQndFbmFibGVkOyAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBkeW5hbWljIGJhbmR3aWR0aC4gKi8KKyAgSU5UIGJQYXJhbWV0cmljU3RlcmVvOyAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gY29kaW5nIHRvb2wuICovCisKKyAgLyoKKyAgICAgaGVhZGVyX2V4dHJhMSBjb25maWd1cmF0aW9uCisgICovCisgIFVDSEFSIGZyZXFTY2FsZTsgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBncm91cGluZy4gKi8KKyAgSU5UIGFsdGVyU2NhbGU7ICAgICAgICAgICAgIC8qITwgU2NhbGUgcmVzb2x1dGlvbi4gKi8KKyAgSU5UIHNicl9ub2lzZV9iYW5kczsgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzLiAqLworCisKKyAgLyoKKyAgICAgaGVhZGVyX2V4dHJhMiBjb25maWd1cmF0aW9uCisgICovCisgIElOVCBzYnJfbGltaXRlcl9iYW5kczsgICAgICAvKiE8IE51bWJlciBvZiBsaW1pdGVyIGJhbmRzLiAqLworICBJTlQgc2JyX2xpbWl0ZXJfZ2FpbnM7ICAgICAgLyohPCBHYWluIG9mIGxpbWl0ZXIuICovCisgIElOVCBzYnJfaW50ZXJwb2xfZnJlcTsgICAgICAvKiE8IEZsYWc6IHVzZSBpbnRlcnBvbGF0aW9uIGluIGZyZXEuIGRpcmVjdGlvbi4gKi8KKyAgSU5UIHNicl9zbW9vdGhpbmdfbGVuZ3RoOyAgIC8qITwgRmxhZzogY2hvb3NlIGxlbmd0aCA0IG9yIDAgKD1vbiwgb2ZmKS4gKi8KKyAgVUNIQVIgaW5pdF9hbXBfcmVzX0ZGOworfSBzYnJDb25maWd1cmF0aW9uLCAqc2JyQ29uZmlndXJhdGlvblB0ciA7CisKK3R5cGVkZWYgc3RydWN0IFNCUl9DT05GSUdfREFUQQoreworICBVSU5UIHNiclN5bnRheEZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgU0JSIHN5bnRheCBmbGFncyBkZXJpdmVkIGZyb20gQU9ULiAqLworICBJTlQgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzLiAgKi8KKworICBJTlQgblNmYlsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNCUiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgTE9fUkVTIGFuZCBISV9SRVMgKD8pICovCisgIElOVCBudW1fTWFzdGVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdl9rX21hc3Rlci4gKi8KKyAgSU5UIHNhbXBsZUZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNCUiBzYW1wbGluZyBmcmVxdWVuY3kuICovCisgIElOVCBmcmFtZVNpemU7CisgIElOVCB4T3ZlckZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgU0JSIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KKyAgSU5UIGR5blhPdmVyRnJlcTsgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZWQgY3Jvc3NvdmVyIGZyZXF1ZW5jeSB3aGVuIGR5bmFtaWMgYmFuZHdpZHRoIGlzIGVuYWJsZWQuICovCisgIElOVCBub1FtZkJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgUU1GIGZyZXF1ZW5jeSBiYW5kcy4gKi8KKyAgSU5UIG5vUW1mU2xvdHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRTUYgc2xvdHMuICovCisKKyAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07ICAgICAgICAgICAgICAvKio8IEZyZXF1ZW5jeSB0YWJsZSBmb3IgbG93IGFuZCBoaXJlcywgb25seSBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VlZnMgYWN0dWFsbHkgbmVlZGVkIGZvciBsb3dyZXMuICovCisgIFVDSEFSICp2X2tfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLworCisKKyAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7CisgIElOVCBub0VudkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW52ZWxvcGUgY2hhbm5lbHMuICovCisKKyAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHdhdmUgY29kaW5nIGF0IGFsbC4gICAgICAqLworICBJTlQgdXNlUGFyYW1ldHJpY0NvZGluZzsgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgcGFyYSBjb2RpbmcgYXQgYWxsLiAgICAgICovCisgIElOVCB4cG9zQ3RybFN3aXRjaDsgICAgICAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHN3aXRjaCB4cG9zIGN0cmwgb24gdGhlIGZseS4gKi8KKyAgSU5UIHN3aXRjaFRyYW5zcG9zZXJzOyAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3Mgb24gdGhlIGZseSAuICAgICAqLworICBVQ0hBUiBpbml0QW1wUmVzRkY7Cit9IFNCUl9DT05GSUdfREFUQSwgKkhBTkRMRV9TQlJfQ09ORklHX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgTVA0X0VMRU1FTlRfSUQgZWxUeXBlOworICBJTlQgYml0UmF0ZTsKKyAgaW50IGluc3RhbmNlVGFnOworICBVQ0hBUiBmUGFyYW1ldHJpY1N0ZXJlbzsKKyAgVUNIQVIgbkNoYW5uZWxzSW5FbDsKKyAgVUNIQVIgQ2hhbm5lbEluZGV4WzJdOworfSBTQlJfRUxFTUVOVF9JTkZPOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFNCUl9FTkNPREVSICpIQU5ETEVfU0JSX0VOQ09ERVI7CisKKy8qKgorICogXGJyaWVmICBHZXQgdGhlIG1heCByZXF1aXJlZCBpbnB1dCBidWZmZXIgc2l6ZSBpbmNsdWRpbmcgZGVsYXkgYmFsYW5jaW5nIHNwYWNlCisgKiAgICAgICAgIGZvciBOIGF1ZGlvIGNoYW5uZWxzLgorICogXHBhcmFtIG5vQ2hhbm5lbHMgIE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KKyAqIFxyZXR1cm4gICAgICAgICAgICBNYXggcmVxdWlyZWQgaW5wdXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0dldEluQnVmZmVyU2l6ZShpbnQgbm9DaGFubmVscyk7CisKK0lOVCBzYnJFbmNvZGVyX09wZW4oCisgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgKnBoU2JyRW5jb2RlciwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUworICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICAgR2V0IGNsb3Nlc3Qgd29ya2luZyBiaXRyYXRlIHRvIHNwZWNpZmllZCBkZXNpcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgZm9yIGEgc2luZ2xlIFNCUiBlbGVtZW50LgorICogXHBhcmFtIGJpdFJhdGUgICAgICAgICBUaGUgZGVzaXJlZCB0YXJnZXQgYml0IHJhdGUKKyAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgVGhlIGFtb3VudCBvZiBhdWRpbyBjaGFubmVscworICogXHBhcmFtIGNvcmVTYW1wbGVSYXRlICBUaGUgc2FtcGxlIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIKKyAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgVGhlIGN1cnJlbnQgQXVkaW8gT2JqZWN0IFR5cGUKKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgQ2xvc2VzdCB3b3JraW5nIGJpdCByYXRlIHRvIGJpdFJhdGUgdmFsdWUKKyAqLworVUlOVCBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShVSU5UIGJpdFJhdGUsIFVJTlQgbnVtQ2hhbm5lbHMsIFVJTlQgY29yZVNhbXBsZVJhdGUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCk7CisKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBkb3duc2FtcGxlZCBTQlIgc2luZ2xlIHJhdGUgaXMgcG9zc2libGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGdpdmVuIGF1ZGlvIG9iamVjdCB0eXBlLgorICogXHBhcmFtIGFvdCAgICAgICAgICAgIFRoZSBBdWRpbyBvYmplY3QgdHlwZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIHdoZW4gZG93bnNhbXBsZWQgU0JSIGlzIG5vdCBwb3NzaWJsZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAxIHdoZW4gZG93bnNhbXBsZWQgU0JSIGlzIHBvc3NpYmxlLgorICovCitVSU5UIHNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoQVVESU9fT0JKRUNUX1RZUEUgYW90KTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgICBJbml0aWFsaXplIFNCUiBFbmNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBoU2JyRW5jb2RlciAgICAgUG9pbnRlciB0byBhIFNCUiBFbmNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIGVsSW5mbyAgICAgICAgICAgU3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIHRoZSBlbGVtZW50L2NoYW5uZWwgYXJyYW5nZW1lbnQuCisgKiBccGFyYW0gbm9FbGVtZW50cyAgICAgICBBbW91bnQgb2YgZWxlbWVudHMgZGVzY3JpYmVkIGluIGVsSW5mby4KKyAqIFxwYXJhbSBpbnB1dEJ1ZmZlciAgICAgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgYXVkaW8gYnVmZmVyCisgKiBccGFyYW0gYmFuZHdpZHRoICAgICAgICBSZXR1cm5zIHRoZSBjb3JlIGF1ZGlvIGVuY29kZXIgYmFuZHdpZHRoIChvdXRwdXQpCisgKiBccGFyYW0gYnVmZmVyT2Zmc2V0ICAgICBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBhdWRpbyBpbnB1dCBkYXRhIGluIG9yZGVyIHRvIGRvIGRlbGF5IGJhbGFuY2luZy4KKyAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgIElucHV0OiBFbmNvZGVyIGlucHV0IGNoYW5uZWxzLiBvdXRwdXQ6IGNvcmUgZW5jb2RlciBjaGFubmVscy4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgIElucHV0OiBFbmNvZGVyIHNhbXBsZXJhdGUuIG91dHB1dCBjb3JlIGVuY29kZXIgc2FtcGxlcmF0ZS4KKyAqIFxwYXJhbSBkb3duU2FtcGxlRmFjdG9yIElucHV0OiBSZWxhdGlvbiBiZXR3ZWVuIFNCUiBhbmQgY29yZSBjb2RlciBzYW1wbGluZyByYXRlOworICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgSW5wdXQ6IEVuY29kZXIgZnJhbWVMZW5ndGguIG91dHB1dCBjb3JlIGVuY29kZXIgZnJhbWVMZW5ndGguCisgKiBccGFyYW0gYW90ICAgICAgICAgICAgICBJbnB1dDogRGVzaXJlZCBBT1QuIG91dHB1dCBBT1QgdG8gYmUgdXNlZCBhZnRlciBwYXJhbWV0ZXIgY2hlY2tpbmcuCisgKiBccGFyYW0gZGVsYXkgICAgICAgICAgICBJbnB1dDogY29yZSBlbmNvZGVyIGRlbGF5LiBPdXRwdXQ6IHRvdGFsIGRlbGF5IGJlY2F1c2Ugb2YgU0JSLgorICogXHBhcmFtIHRyYW5zZm9ybUZhY3RvciAgVGhlIGNvcmUgZW5jb2RlciB0cmFuc2Zvcm0gZmFjdG9yIChibG9ja3N3aXRjaGluZykuCisgKiBccGFyYW0gaGVhZGVyUGVyaW9kICAgICBSZXBldGl0aW9uIHJhdGUgb2YgdGhlIFNCUiBoZWFkZXI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKC0xKSBtZWFucyBpbnRlcm4gY29uZmlndXJhdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoMS0xMCkgY29ycmVzcG9uZHMgdG8gaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSBpbiBmcmFtZXMuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0luaXQoCisgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAorICAgICAgICBTQlJfRUxFTUVOVF9JTkZPICAgICBlbEluZm9bKDgpXSwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbm9FbGVtZW50cywKKyAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqaW5wdXRCdWZmZXIsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNvcmVCYW5kd2lkdGgsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmlucHV0QnVmZmVyT2Zmc2V0LAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSwKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqZnJhbWVMZW5ndGgsCisgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgIGFvdCwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqZGVsYXksCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUZhY3RvciwKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgaGVhZGVyUGVyaW9kLAorICAgICAgICBVTE9ORyAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZworICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICBEbyBkZWxheSBsaW5lIGJ1ZmZlcnMgaG91c2VrZWVwaW5nLiBUbyBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbmNvZGVkIGF1ZGlvIGZyYW1lLgorICogXHBhcmFtIGhFbnZFbmMgICAgIFNCUiBFbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSB0aW1lQnVmZmVyICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGF1ZGlvIGJ1ZmZlci4KKyAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCisgKi8KK0lOVCBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgIENsb3NlIFNCUiBlbmNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBoRWJyRW5jb2RlciAgSGFuZGxlIG9mIFNCUiBlbmNvZGVyIGluc3RhbmNlIHRvIGJlIGNsb3NlZC4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKKyAqLwordm9pZCBzYnJFbmNvZGVyX0Nsb3NlKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhFYnJFbmNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICBFbmNvZGUgU0JSIGRhdGEgb2Ygb25lIGNvbXBsZXRlIGF1ZGlvIGZyYW1lLgorICogXHBhcmFtIGhFbnZFbmNvZGVyICAgSGFuZGxlIG9mIFNCUiBlbmNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHNhbXBsZXMgICAgICAgVGltZSBzYW1wbGVzLCBhbHdheXMgaW50ZXJsZWF2ZWQuCisgKiBccGFyYW0gdGltZUluU3RyaWRlICBDaGFubmVsIHN0cmlkZSBmYWN0b3Igb2Ygc2FtcGxlcyBidWZmZXIuCisgKiBccGFyYW0gc2JyRGF0YUJpdHMgICBTaXplIG9mIFNCUiBwYXlsb2FkIGluIGJpdHMuCisgKiBccGFyYW0gc2JyRGF0YSAgICAgICBTQlIgcGF5bG9hZC4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KKyAqLworSU5UIHNickVuY29kZXJfRW5jb2RlRnJhbWUoSEFORExFX1NCUl9FTkNPREVSICBoRW52RW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzYnJEYXRhQml0c1soOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICBXcml0ZSBTQlIgaGVhZGVycyBvZiBvbmUgU0JSIGVsZW1lbnQuCisgKiBccGFyYW0gc2JyRW5jb2RlciAgICBIYW5kbGUgb2YgdGhlIFNCUiBlbmNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIGhCcyAgICAgICAgICAgSGFuZGxlIG9mIGJpdCBzdHJlYW0gaGFuZGxlIHRvIHdyaXRlIFNCUiBoZWFkZXIgdG8uCisgKiBccGFyYW0gZWxlbWVudF9pbmRleCBJbmRleCBvZiB0aGUgU0JSIGVsZW1lbnQgd2hpY2ggaGVhZGVyIHNob3VsZCBiZSB3cml0dGVuLgorICogXHBhcmFtIGZTZW5kSGVhZGVycyAgRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIFNCUiBlbmNvZGVyIHNob3VsZCBzZW5kIG1vcmUgaGVhZGVycyBpbiB0aGUgU0JSIHBheWxvYWQgb3Igbm90LgorICogXHJldHVybiAgICAgICAgICAgICAgdm9pZAorICovCit2b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKEhBTkRMRV9TQlJfRU5DT0RFUiAgIHNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZlNlbmRIZWFkZXJzKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIFNCUiBlbmNvZGVyIGJpdHJhdGUgZXN0aW1hdGlvbi4KKyAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICBFc3RpbWF0ZWQgYml0cmF0ZS4KKyAqLworSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CisKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIERlbGF5IGJldHdlZW4gaW5wdXQgZGF0YSBhbmQgZG93bnNhbXBsZWQgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgRGVsYXkuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CisKKy8qKgorICogXGJyaWVmICAgICAgIEdldCBkZWNvZGVyIGxpYnJhcnkgdmVyc2lvbiBpbmZvLgorICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdCwgd2hlcmUgbGlicmFyeSBpbmZvIGlzIHdyaXR0ZW4gdG8uCisgKiBccmV0dXJuICAgICAgMCBvbiBzdWNlc3MuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOworCit2b2lkIHNiclByaW50UkFNKHZvaWQpOworCit2b2lkIHNiclByaW50Uk9NKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBpZm5kZWYgX19TQlJfTUFJTl9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL2JpdF9zYnIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2FlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcApAQCAtMCwwICsxLDEwNTkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBTQlIgYml0IHdyaXRpbmcgcm91dGluZXMgIAorKi8KKworCisjaW5jbHVkZSAiYml0X3Nici5oIgorCisjaW5jbHVkZSAiY29kZV9lbnYuaCIKKyNpbmNsdWRlICJjbW9uZGF0YS5oIgorI2luY2x1ZGUgInNici5oIgorCisjaW5jbHVkZSAicHNfbWFpbi5oIgorCit0eXBlZGVmIGVudW0geworICBTQlJfSURfU0NFID0gMSwKKyAgU0JSX0lEX0NQRQorfSBTQlJfRUxFTUVOVF9UWVBFOworCisKK3N0YXRpYyBJTlQgZW5jb2RlU2JyRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgY21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICAgICAgc2JyRWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKK3N0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpOworCisKK3N0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0pOworCitzdGF0aWMgSU5UIGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworCitzdGF0aWMgSU5UIGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgIHNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZyk7CisKKworc3RhdGljIElOVCBlbmNvZGVTYnJHcmlkIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0pOworCitzdGF0aWMgaW50IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zbWl0RnJlcXMpOworCitzdGF0aWMgSU5UIGVuY29kZVNickR0ZGYgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSk7CisKK3N0YXRpYyBJTlQgd3JpdGVOb2lzZUxldmVsRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOworCitzdGF0aWMgSU5UIHdyaXRlRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nKTsKKworc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7CisKKworc3RhdGljIElOVCBlbmNvZGVFeHRlbmRlZERhdGEgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdFN0cmVhbSk7CisKKworCitzdGF0aWMgSU5UIGdldFNickV4dGVuZGVkRGF0YVNpemUgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQKKyAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBwdXJlIFNCUiBzaW5nbGUgY2hhbm5lbCBkYXRhIGVsZW1lbnQKKyAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UCitGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgICAgICAgIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgICAgICAgICBjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworeworICBJTlQgcGF5bG9hZEJpdHMgPSAwOworCisgIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CisgIGNtb25EYXRhLT5zYnJEYXRhQml0cyA9IDA7CisKKyAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLworICBpZiAoc2JyRW52RGF0YSAhPSBOVUxMKSB7CisKKyAgICAvKiB3cml0ZSBoZWFkZXIgKi8KKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXIgKHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEpOworCisKKyAgICAvKiB3cml0ZSBkYXRhICovCisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9JRF9TQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKKyAgfQorICByZXR1cm4gcGF5bG9hZEJpdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQKKyAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBwdXJlIFNCUiBjaGFubmVsIHBhaXIgZGF0YSBlbGVtZW50CisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQorCit7CisgIElOVCBwYXlsb2FkQml0cyA9IDA7CisgIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CisgIGNtb25EYXRhLT5zYnJEYXRhQml0cyA9IDA7CisKKyAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLworICBpZiAoKHNickVudkRhdGFMZWZ0ICE9IE5VTEwpICYmIChzYnJFbnZEYXRhUmlnaHQgIT0gTlVMTCkpIHsKKworICAgIC8qIHdyaXRlIGhlYWRlciAqLworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlciAoc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSk7CisKKyAgICAvKiB3cml0ZSBkYXRhICovCisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9JRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOworCisgIH0KKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCitJTlQKK0ZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKK3sKKyAgSU5UIHBheWxvYWRCaXRzOworICBJTlQgYml0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKCZjbW9uRGF0YS0+c2JyQml0YnVmKTsKKworICBwYXlsb2FkQml0cyA9IEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKKworICBGREtwdXNoQmFjaygmY21vbkRhdGEtPnNickJpdGJ1ZiwgKEZES2dldFZhbGlkQml0cygmY21vbkRhdGEtPnNickJpdGJ1ZikgLSBiaXRQb3MpICk7CisKKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCisKK3ZvaWQgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoU0JSX0VOQ09ERVIgICAqc2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBlbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmU2VuZEhlYWRlcnMpCit7CisgIGludCBiaXRzOworCisgIGJpdHMgPSBlbmNvZGVTYnJIZWFkZXJEYXRhICgmc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JySGVhZGVyRGF0YSwgaEJzKTsKKyAgICAKKyAgaWYgKGZTZW5kSGVhZGVycyA9PSAwKSB7CisgICAgLyogUHJldmVudCBoZWFkZXIgYmVpbmcgZW1iZWRkZWQgaW50byB0aGUgU0JSIHBheWxvYWQuICovCisgICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gLTE7CisgICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmUgPSAwOworICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IC0xOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickhlYWRlcgorICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlcyBTQlIgSGVhZGVyIGluZm9ybWF0aW9uCisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2VuY29kZVNickhlYWRlciAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpCit7CisgIElOVCBwYXlsb2FkQml0cyA9IDA7CisKKyAgaWYgKHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSkgeworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDEsIDEpOworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlckRhdGEgKHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtb25EYXRhLT5zYnJCaXRidWYpOworICB9CisgIGVsc2UgeworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDAsIDEpOworICB9CisKKyAgY21vbkRhdGEtPnNickhkckJpdHMgPSBwYXlsb2FkQml0czsKKworICByZXR1cm4gcGF5bG9hZEJpdHM7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JySGVhZGVyRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIHNicl9oZWFkZXIoKQorICAgICAgICAgICAgICAgICAgYnNfcHJvdG9jb2xfdmVyc2lvbiB0aHJvdWdoIGJzX2hlYWRlcl9leHRyYV8yCisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2VuY29kZVNickhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCisKK3sKKyAgSU5UIHBheWxvYWRCaXRzID0gMDsKKyAgaWYgKHNickhlYWRlckRhdGEgIT0gTlVMTCkgeworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQU1QX1JFU19CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfU1RBUlRfRlJFUV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMpOworCisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1JFU0VSVkVEX0JJVFMpOworCisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0hFQURFUl9FWFRSQV8yX0JJVFMpOworCisKKyAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEpIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0FMVEVSX1NDQUxFX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTKTsKKyAgICB9IC8qIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xICovCisKKyAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIpIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9MSU1JVEVSX0JBTkRTX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbGltaXRlcl9nYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9pbnRlcnBvbF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5URVJQT0xfRlJFUV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3Ntb290aGluZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TTU9PVEhJTkdfTEVOR1RIX0JJVFMpOworCisgICAgfSAvKiBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMiAqLworICB9IC8qIHNickhlYWRlckRhdGEgIT0gTlVMTCAqLworCisgIHJldHVybiBwYXlsb2FkQml0czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JyRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlcyBzYnIgRGF0YSBpbmZvcm1hdGlvbgorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgorICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitlbmNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgY21vbkRhdGEsCisgICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9UWVBFICAgICAgc2JyRWxlbSwKKyAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZywKKyAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKK3sKKyAgSU5UIHBheWxvYWRCaXRzID0gMDsKKworICBzd2l0Y2ggKHNickVsZW0pIHsKKyAgY2FzZSBTQlJfSURfU0NFOgorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChzYnJFbnZEYXRhTGVmdCwgJmNtb25EYXRhLT5zYnJCaXRidWYsIGhQYXJhbWV0cmljU3RlcmVvLCBzYnJTeW50YXhGbGFncyk7CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX0lEX0NQRToKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKHNickVudkRhdGFMZWZ0LCBzYnJFbnZEYXRhUmlnaHQsIGhQYXJhbWV0cmljU3RlcmVvLCAmY21vbkRhdGEtPnNickJpdGJ1ZiwgY291cGxpbmcpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8qIHdlIG5ldmVyIHNob3VsZCBhcHBseSBTQlIgdG8gYW55IG90aGVyIGVsZW1lbnQgdHlwZSAqLworICAgIEZES19BU1NFUlQgKDApOworICB9CisKKyAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gcGF5bG9hZEJpdHM7CisKKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCisjZGVmaW5lIE1PREVfRlJFUV9UQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREVfTk9fRlJFUV9UUkFOICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExEX1RSQU5TTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICBNT0RFX0ZSRVFfVEFOUworc3RhdGljIGludCBlbmNvZGVGcmVxcyAoaW50IG1vZGUpIHsKKyAgICByZXR1cm4gKChtb2RlICYgTU9ERV9GUkVRX1RBTlMpID8gMSA6IDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudAorICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlcyBzYnIgU0NFIGluZm9ybWF0aW9uCisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2VuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpLCBwYXlsb2FkQml0cyA9IDA7CisKKyAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLCBTSV9TQlJfREFUQV9FWFRSQV9CSVRTKTsgLyogbm8gcmVzZXJ2ZWQgYml0cyAqLworCisgIGlmIChzYnJFbnZEYXRhLT5sZEdyaWQpIHsKKyAgICAgIGlmICggc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5ICkgeworICAgICAgICAvKiBlbmNvZGUgbm9ybWFsIFNickdyaWQgKi8KKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB1c2UgRklYRklYb25seSBmcmFtZSBHcmlkICovCisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGEsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfU0NBTEFCTEUpIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMSwgU0lfU0JSX0NPVVBMSU5HX0JJVFMpOworICAgIH0KKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKKyAgfQorCisgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOworCisgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsgaSsrKSB7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgfQorCisgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCAwKTsKKyAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CisKKyAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhLGhCaXRTdHJlYW0pOworCisgIHBheWxvYWRCaXRzICs9IGVuY29kZUV4dGVuZGVkRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CisKKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQKKyAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgc2JyIENQRSBpbmZvcm1hdGlvbgorICAgIHJldHVybnM6CisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2VuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZykKK3sKKyAgSU5UIHBheWxvYWRCaXRzID0gMDsKKyAgSU5UIGkgPSAwOworCisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KKworICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGNvdXBsaW5nLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CisKKyAgaWYgKGNvdXBsaW5nKSB7CisgICAgaWYgKHNickVudkRhdGFMZWZ0LT5sZEdyaWQpIHsKKyAgICAgICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkgKSB7CisgICAgICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCisgICAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKKyAgICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGFMZWZ0LT5ub09mbm9pc2ViYW5kczsgaSsrKSB7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgICB9CisKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwxKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDEpOworCisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhTGVmdCxoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFSaWdodCxoQml0U3RyZWFtKTsKKworICB9IGVsc2UgeyAvKiBubyBjb3VwbGluZyAqLworICAgIEZES19BU1NFUlQoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCA9PSBzYnJFbnZEYXRhUmlnaHQtPmxkR3JpZCk7CisKKyAgICBpZiAoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCB8fCBzYnJFbnZEYXRhUmlnaHQtPmxkR3JpZCkgeworICAgIC8qIHNickVudkRhdGFMZWZ0IChsZWZ0IGNoYW5uZWwpICovCisgICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKKyAgICAgICAgLyogbm8gRklYRklYb25seSBGcmFtZSBzbyB3ZSBkb250IG5lZWQgZW5jb2RlTG93RGVsYXlTYnJHcmlkICovCisgICAgICAgIC8qIG5vcm1hbCBTYnJHcmlkICovCisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLworICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKKyAgICAgIH0KKworICAgICAgLyogc2JyRW52RGF0YVJpZ2h0IChyaWdodCBjaGFubmVsKSAqLworICAgICAgaWYgKCBzYnJFbnZEYXRhUmlnaHQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgeworICAgICAgICAvKiBubyBGSVhGSVhvbmx5IEZyYW1lIHNvIHdlIGRvbnQgbmVlZCBlbmNvZGVMb3dEZWxheVNickdyaWQgKi8KKyAgICAgICAgLyogbm9ybWFsIFNickdyaWQgKi8KKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCisgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSk7CisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CisgICAgfQorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhTGVmdC0+bm9PZm5vaXNlYmFuZHM7IGkrKykgeworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhTGVmdC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhUmlnaHQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgICB9CisKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMCk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDApOworCisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhTGVmdCxoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFSaWdodCxoQml0U3RyZWFtKTsKKworICB9IC8qIGNvdXBsaW5nICovCisKKyAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlRXh0ZW5kZWREYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBoQml0U3RyZWFtKTsKKworICByZXR1cm4gcGF5bG9hZEJpdHM7Cit9CisKK3N0YXRpYyBJTlQgY2VpbF9sbjIoSU5UIHgpCit7CisgIElOVCB0bXA9LTE7CisgIHdoaWxlKCgxPDwrK3RtcCkgPCB4KTsKKyAgcmV0dXJuKHRtcCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickdyaWQKKyAgICBkZXNjcmlwdGlvbjogIGlmIGhCaXRTdHJlYW0gIT0gTlVMTCB3cml0ZXMgYml0cyB0aGF0IGRlc2NyaWJlcyB0aGUKKyAgICAgICAgICAgICAgICAgIHRpbWUvZnJlcXVlbmN5IGdyb3VwaW5nIG9mIGEgZnJhbWU7IGVsc2UgY291bnRzIHRoZW0gb25seQorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBvciBjb3VudGVkCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2VuY29kZVNickdyaWQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKK3sKKyAgSU5UIHBheWxvYWRCaXRzID0gMDsKKyAgSU5UIGksIHRlbXA7CisgIElOVCBidWZmZXJGcmFtZVN0YXJ0ID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnVmZmVyRnJhbWVTdGFydDsKKyAgSU5UIG51bWJlclRpbWVTbG90cyAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5udW1iZXJUaW1lU2xvdHM7CisKKyAgaWYgKHNickVudkRhdGEtPmxkR3JpZCkKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NMQV9CSVRTX0xEKTsKKyAgZWxzZQorICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ0xBX0JJVFMpOworCisgIHN3aXRjaCAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcykgeworICBjYXNlIEZJWEZJWG9ubHk6CisgICAgRkRLX0FTU0VSVCgwIC8qIEZhdGFsIGVycm9yIGluIGVuY29kZVNickdyaWQhICovKTsKKyAgICBicmVhazsKKyAgY2FzZSBGSVhGSVg6CisgICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9lbnYpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0VOVl9CSVRTKTsKKyAgICBpZiAoKHNickVudkRhdGEtPmxkR3JpZCkgJiYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9lbnY9PTEpKQorICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmN1cnJlbnRBbXBSZXNGRiwgU0lfU0JSX0FNUF9SRVNfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbMF0sIFNCUl9SRVNfQklUUyk7CisKKyAgICBicmVhazsKKworICBjYXNlIEZJWFZBUjoKKyAgY2FzZSBWQVJGSVg6CisgICAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYVkFSKQorICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0gKGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpOworICAgIGVsc2UKKyAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CisKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uLCBTQlJfTlVNX0JJVFMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm47IGkrKykgeworICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZFtpXSAtIDIpID4+IDE7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7CisgICAgfQorCisgICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4gKyAyKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOworCisgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4gKyAxOyBpKyspIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFZBUlZBUjoKKyAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOworICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZF8xIC0gKGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKKworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wLCBTQlJfTlVNX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xLCBTQlJfTlVNX0JJVFMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMDsgaSsrKSB7CisgICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkXzBbaV0gLSAyKSA+PiAxOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzE7IGkrKykgeworICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZF8xW2ldIC0gMikgPj4gMTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKKyAgICB9CisKKyAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xICsgMik7CisgICAgcGF5bG9hZEJpdHMgKz0gIEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+cCwgdGVtcCk7CisKKyAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKKyAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xICsgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wOyBpKyspIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mTFJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCisjZGVmaW5lIFNCUl9DTEFfQklUU19MRCAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlTG93RGVsYXlTYnJHcmlkCisgICAgZGVzY3JpcHRpb246ICBpZiBoQml0U3RyZWFtICE9IE5VTEwgd3JpdGVzIGJpdHMgdGhhdCBkZXNjcmliZXMgdGhlCisgICAgICAgICAgICAgICAgICB0aW1lL2ZyZXF1ZW5jeSBncm91cGluZyBvZiBhIGZyYW1lOworICAgICAgICAgICAgICAgICAgZWxzZSBjb3VudHMgdGhlbSBvbmx5CisgICAgICAgICAgICAgICAgICAodGhpcyBmdW5jdGlvbiBvbmx5IHdyaXRlIHRoZSBGSVhGSVhvbmx5IEJpdHN0cmVhbSBkYXRhKQorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBvciBjb3VudGVkCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2VuY29kZUxvd0RlbGF5U2JyR3JpZCAoICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNtaXRGcmVxcworICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGludCBwYXlsb2FkQml0cyA9IDA7CisgIGludCBpOworCisgIC8qIHdyaXRlIEZJWEZJWG9ubHkgR3JpZCAqLworICAvKiB3cml0ZSBmcmFtZUNsYXNzIFsxIGJpdF0gZm9yIEZJWEZJWG9ubHkgR3JpZCAqLworICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgU0JSX0NMQV9CSVRTX0xEKTsKKworICAvKiBhYnNvbHV0ZSBCb3JkZXJzIGFyZSBmaXg6IDAsWCxYLFgsblRpbWVTbG90czsgc28gd2UgZG9udCBoYXZlIHRvIHRyYW5zbWl0IHRoZW0gKi8KKyAgLyogb25seSB0cmFuc21pdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uISAqLworICAvKiB3aXRoIHRoaXMgaW5mbyAoYjEpIHdlIGNhbiByZWNvbnN0cnVjdCB0aGUgRnJhbWUgb24gRGVjb2RlciBzaWRlIDogKi8KKyAgLyogYm9yZGVyWzBdID0gMDsgYm9yZGVyWzFdID0gYjE7IGJvcmRlclsyXT1iMSsyOyBib3JkZXJbM10gPSBuclRpbWVTbG90cyAqLworCisgIC8qIHVzZSAzIG9yIDRiaXRzIGZvciB0cmFuc2llbnQgYm9yZGVyIChib3JkZXIpICovCisgIGlmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5udW1iZXJUaW1lU2xvdHMgPT0gOCkKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKCBoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgMyk7CisgIGVsc2UKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKCBoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgNCk7CisKKyAgaWYgKHRyYW5zbWl0RnJlcXMpIHsKKyAgICAvKiB3cml0ZSBGcmVxUmVzIGdyaWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2VudjsgaSsrKSB7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwgU0JSX1JFU19CSVRTKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcGF5bG9hZEJpdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJEdGRmCisgICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyB0aGF0IGRlc2NyaWJlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBlbnZlbG9wZXMgb2YgYSBmcmFtZQorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgorICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitlbmNvZGVTYnJEdGRmIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIElOVCBpLCBwYXlsb2FkQml0cyA9IDAsIG5vT2ZOb2lzZUVudmVsb3BlczsKKworICBub09mTm9pc2VFbnZlbG9wZXMgPSBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzID4gMSA/IDIgOiAxOworCisgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzOyArK2kpIHsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmRvbWFpbl92ZWNbaV0sIFNCUl9ESVJfQklUUyk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG5vT2ZOb2lzZUVudmVsb3BlczsgKytpKSB7CisgICAgcGF5bG9hZEJpdHMgKz0gIEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSwgU0JSX0RJUl9CSVRTKTsKKyAgfQorCisgIHJldHVybiBwYXlsb2FkQml0czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogd3JpdGVOb2lzZUxldmVsRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgbm9pc2UtZmxvb3ItbGV2ZWwKKyAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVAord3JpdGVOb2lzZUxldmVsRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpCit7CisgIElOVCBqLCBpLCBwYXlsb2FkQml0cyA9IDA7CisgIElOVCBuTm9pc2VFbnZlbG9wZXMgPSBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzID4gMSA/IDIgOiAxOworCisgIGZvciAoaSA9IDA7IGkgPCBuTm9pc2VFbnZlbG9wZXM7IGkrKykgeworICAgIHN3aXRjaCAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSkgeworICAgIGNhc2UgRlJFUToKKyAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2kgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzKTsKKyAgICAgIH0KKworICAgICAgZm9yIChqID0gMSArIGkgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsgaiA8IChzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kcyAqICgxICsgaSkpOyBqKyspIHsKKyAgICAgICAgaWYgKGNvdXBsaW5nKSB7CisgICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKKyAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgKi8KKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCisgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiAhY291cGxpbmcgKi8KKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUSU1FOgorICAgICAgZm9yIChqID0gaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgeworICAgICAgICBpZiAoY291cGxpbmcpIHsKKyAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgeworICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgKi8KKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qICFjb3VwbGluZyAqLworICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBheWxvYWRCaXRzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiB3cml0ZUVudmVsb3BlRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgZW52ZWxvcGUKKyAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVAord3JpdGVFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgSU5UIGNvdXBsaW5nKQoreworICBJTlQgcGF5bG9hZEJpdHMgPSAwLCBqLCBpLCBkZWx0YTsKKworICBmb3IgKGogPSAwOyBqIDwgc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlczsgaisrKSB7IC8qIGxvb3Agb3ZlciBhbGwgZW52ZWxvcGVzICovCisgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0gPT0gRlJFUSkgeworICAgICAgaWYgKGNvdXBsaW5nICYmIHNickVudkRhdGEtPmJhbGFuY2UpIHsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdWzBdLCBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHMpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDEgLSBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdOyBpIDwgc2JyRW52RGF0YS0+bm9TY2ZCYW5kc1tqXTsgaSsrKSB7CisgICAgICBkZWx0YSA9IHNickVudkRhdGEtPmllbnZlbG9wZVtqXVtpXTsKKyAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CisgICAgICAgIEZES19BU1NFUlQgKGZpeHBfYWJzIChkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES19BU1NFUlQgKGZpeHBfYWJzIChkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYpOworICAgICAgfQorICAgICAgaWYgKGNvdXBsaW5nKSB7CisgICAgICAgIGlmIChzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CisgICAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKKyAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgJiYgVElNRSAqLworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAmJiBGUkVRICovCisgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSkgeworICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgVElNRSAqLworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgRlJFUSAqLworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdKSB7CisgICAgICAgICAgLyogIWNvdXBsaW5nICYmIFRJTUUgKi8KKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiAhY291cGxpbmcgJiYgRlJFUSAqLworICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwYXlsb2FkQml0czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlRXh0ZW5kZWREYXRhCisgICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlbmRlZCBkYXRhCisgICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCisgICAgaW5wdXQ6CisgICAgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgZW5jb2RlRXh0ZW5kZWREYXRhIChIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCit7CisgIElOVCBleHREYXRhU2l6ZTsKKyAgSU5UIHBheWxvYWRCaXRzID0gMDsKKworICBleHREYXRhU2l6ZSA9IGdldFNickV4dGVuZGVkRGF0YVNpemUoaFBhcmFtZXRyaWNTdGVyZW8pOworCisKKyAgaWYgKGV4dERhdGFTaXplICE9IDApIHsKKyAgICBJTlQgbWF4RXh0U2l6ZSA9ICgxPDxTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUykgLSAxOworICAgIElOVCB3cml0dGVuTm9CaXRzID0gMDsgLyogbmVlZGVkIHRvIGJ5dGUgYWxpZ24gdGhlIGV4dGVuZGVkIGRhdGEgKi8KKworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMSwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CisgICAgRkRLX0FTU0VSVChleHREYXRhU2l6ZSA8PSBTQlJfRVhURU5ERURfREFUQV9NQVhfQ05UKTsKKworICAgIGlmIChleHREYXRhU2l6ZSA8IG1heEV4dFNpemUpIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgZXh0RGF0YVNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKKyAgICB9IGVsc2UgeworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBtYXhFeHRTaXplLCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGV4dERhdGFTaXplIC0gbWF4RXh0U2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyk7CisgICAgfQorCisgICAgLyogcGFyYW1ldHJpYyBjb2Rpbmcgc2lnbmFsbGVkIGhlcmU/ICovCisgICAgaWYoaFBhcmFtZXRyaWNTdGVyZW8peworICAgICAgd3JpdHRlbk5vQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcsIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyk7CisgICAgICB3cml0dGVuTm9CaXRzICs9IEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CisgICAgfQorCisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdHRlbk5vQml0czsKKworICAgIC8qIGJ5dGUgYWxpZ25tZW50ICovCisgICAgd3JpdHRlbk5vQml0cyA9IHdyaXR0ZW5Ob0JpdHMlODsKKyAgICBpZih3cml0dGVuTm9CaXRzKQorICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsICg4IC0gd3JpdHRlbk5vQml0cykpOworICB9IGVsc2UgeworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CisgIH0KKworICByZXR1cm4gcGF5bG9hZEJpdHM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YQorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgInN5bnRoZXRpYy1jb2RpbmciLWV4dGVuc2lvbgorICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgorICAgIGlucHV0OgorICAgIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQorCit7CisgIElOVCBpOworICBJTlQgcGF5bG9hZEJpdHMgPSAwOworCisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNGbGFnLCAxKTsKKworICBpZiAoc2JyRW52RGF0YS0+YWRkSGFybW9uaWNGbGFnKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vSGFybW9uaWNzOyBpKyspIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNbaV0sIDEpOworICAgIH0KKyAgfQorCisgIHJldHVybiBwYXlsb2FkQml0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGdldFNickV4dGVuZGVkRGF0YVNpemUKKyAgICBkZXNjcmlwdGlvbjogIGNvdW50cyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciBlbmNvZGluZyB0aGUKKyAgICAgICAgICAgICAgICAgIGV4dGVuZGVkIGRhdGEgKGluY2x1ZGluZyBleHRlbnNpb24gaWQpCisKKyAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIGV4dGVuZGVkIGRhdGEKKyAgICBpbnB1dDoKKyAgICBvdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVAorZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbykKK3sKKyAgSU5UIGV4dERhdGFCaXRzID0gMDsKKworICAvKiBhZGQgeW91ciBuZXcgZXh0ZW5kZWQgZGF0YSBjb3VudGluZyBtZXRob2RzIGhlcmUgKi8KKworICAvKgorICAgIG5vIGV4dGVuZGVkIGRhdGEKKyAgKi8KKworICBpZihoUGFyYW1ldHJpY1N0ZXJlbyl7CisgICAgLyogUFMgZXh0ZW5kZWQgZGF0YSAqLworICAgIGV4dERhdGFCaXRzICs9IFNJX1NCUl9FWFRFTlNJT05fSURfQklUUzsKKyAgICBleHREYXRhQml0cyArPSBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIE5VTEwpOworICB9CisKKyAgcmV0dXJuIChleHREYXRhQml0cys3KSA+PiAzOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaCBiL2FhYy9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UyYzFlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvYml0X3Nici5oCkBAIC0wLDAgKzEsMjU2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgU0JSIGJpdCB3cml0aW5nICAKKyovCisjaWZuZGVmIF9fQklUX1NCUl9ICisjZGVmaW5lIF9fQklUX1NCUl9ICisKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisjaW5jbHVkZSAiY21vbmRhdGEuaCIKKyNpbmNsdWRlICJmcmFtX2dlbi5oIgorCitzdHJ1Y3QgU0JSX0VOVl9EQVRBOworCitzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBCit7CisgIElOVCBUb3RhbEJpdHM7CisgIElOVCBQYXlsb2FkQml0czsKKyAgSU5UIEZpbGxCaXRzOworICBJTlQgSGVhZGVyQWN0aXZlOworICBJTlQgTnJTZW5kSGVhZGVyRGF0YTsgICAgICAgICAgICAvKio8IGlucHV0IGZyb20gY29tbWFuZGxpbmUgKi8KKyAgSU5UIENvdW50U2VuZEhlYWRlckRhdGE7ICAgICAgICAgLyoqPCBtb2R1bG8gY291bnQuIElmIDwgMCB0aGVuIG5vIGNvdW50aW5nIGlzIGRvbmUgKG5vIFNCUiBoZWFkZXJzKSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICAqSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQTsKKworc3RydWN0IFNCUl9IRUFERVJfREFUQQoreworICBBTVBfUkVTIHNicl9hbXBfcmVzOworICBJTlQgc2JyX3N0YXJ0X2ZyZXF1ZW5jeTsKKyAgSU5UIHNicl9zdG9wX2ZyZXF1ZW5jeTsKKyAgSU5UIHNicl94b3Zlcl9iYW5kOworICBJTlQgc2JyX25vaXNlX2JhbmRzOworICBJTlQgc2JyX2RhdGFfZXh0cmE7CisgIElOVCBoZWFkZXJfZXh0cmFfMTsKKyAgSU5UIGhlYWRlcl9leHRyYV8yOworICBJTlQgc2JyX2xjX3N0ZXJlb19tb2RlOworICBJTlQgc2JyX2xpbWl0ZXJfYmFuZHM7CisgIElOVCBzYnJfbGltaXRlcl9nYWluczsKKyAgSU5UIHNicl9pbnRlcnBvbF9mcmVxOworICBJTlQgc2JyX3Ntb290aGluZ19sZW5ndGg7CisgIElOVCBhbHRlclNjYWxlOworICBJTlQgZnJlcVNjYWxlOworCisgIC8qCisgICAgZWxlbWVudCBvZiBjaGFubmVscGFpcmVsZW1lbnQKKyAgKi8KKyAgSU5UIGNvdXBsaW5nOworICBJTlQgcHJldl9jb3VwbGluZzsKKworICAvKgorICAgIGVsZW1lbnQgb2Ygc2luZ2xlY2hhbm5lbGVsZW1lbnQKKyAgKi8KKworfTsKK3R5cGVkZWYgc3RydWN0IFNCUl9IRUFERVJfREFUQSAqSEFORExFX1NCUl9IRUFERVJfREFUQTsKKworc3RydWN0IFNCUl9FTlZfREFUQQoreworCisgIElOVCBzYnJfeHBvc19jdHJsOworICBJTlQgZnJlcV9yZXNfZml4Zml4OworCisKKyAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGU7CisgIElOVkZfTU9ERSBzYnJfaW52Zl9tb2RlX3ZlY1tNQVhfTlVNX05PSVNFX1ZBTFVFU107CisKKyAgWFBPU19NT0RFIHNicl94cG9zX21vZGU7CisKKyAgSU5UIGllbnZlbG9wZVtNQVhfRU5WRUxPUEVTXVtNQVhfRlJFUV9DT0VGRlNdOworCisgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2U7CisgIElOVCBjb2RlQm9va1NjZkxhdjsKKyAgY29uc3QgSU5UICpodWZmdGFibGVUaW1lQzsKKyAgY29uc3QgSU5UICpodWZmdGFibGVGcmVxQzsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZVRpbWVMOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlRnJlcUw7CisKKyAgY29uc3QgSU5UICpodWZmdGFibGVMZXZlbFRpbWVDOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQzsKKyAgY29uc3QgSU5UICpodWZmdGFibGVMZXZlbEZyZXFDOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQzsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUxldmVsVGltZUw7CisgIGNvbnN0IFVDSEFSICpodWZmdGFibGVCYWxhbmNlVGltZUw7CisgIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbEZyZXFMOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZUZyZXFMOworCisKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlVGltZUw7CisgIGNvbnN0IElOVCAqaHVmZnRhYmxlTm9pc2VUaW1lQzsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlRnJlcUw7CisgIGNvbnN0IElOVCAqaHVmZnRhYmxlTm9pc2VGcmVxQzsKKworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQzsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVMOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVDOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQzsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMOworICBjb25zdCBJTlQgKmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFDOworCisgIEhBTkRMRV9TQlJfR1JJRCBoU2JyQlNHcmlkOworCisgIElOVCBub0hhcm1vbmljczsKKyAgSU5UIGFkZEhhcm1vbmljRmxhZzsKKyAgVUNIQVIgYWRkSGFybW9uaWNbTUFYX0ZSRVFfQ09FRkZTXTsKKworCisgIC8qIGNhbGN1bGF0ZWQgaGVscGVyIHZhcnMgKi8KKyAgSU5UIHNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlOworICBJTlQgc2lfc2JyX3N0YXJ0X2Vudl9iaXRzOworICBJTlQgc2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZTsKKyAgSU5UIHNpX3Nicl9zdGFydF9ub2lzZV9iaXRzOworCisgIElOVCBub09mRW52ZWxvcGVzOworICBJTlQgbm9TY2ZCYW5kc1tNQVhfRU5WRUxPUEVTXTsKKyAgSU5UIGRvbWFpbl92ZWNbTUFYX0VOVkVMT1BFU107CisgIElOVCBkb21haW5fdmVjX25vaXNlW01BWF9FTlZFTE9QRVNdOworICBTQ0hBUiBzYnJfbm9pc2VfbGV2ZWxzW01BWF9GUkVRX0NPRUZGU107CisgIElOVCBub09mbm9pc2ViYW5kczsKKworICBJTlQgYmFsYW5jZTsKKyAgQU1QX1JFUyBpbml0X3Nicl9hbXBfcmVzOworICBBTVBfUkVTIGN1cnJlbnRBbXBSZXNGRjsKKworICAvKiBleHRlbmRlZCBkYXRhICovCisgIElOVCBleHRlbmRlZF9kYXRhOworICBJTlQgZXh0ZW5zaW9uX3NpemU7CisgIElOVCBleHRlbnNpb25faWQ7CisgIFVDSEFSIGV4dGVuZGVkX2RhdGFfYnVmZmVyW1NCUl9FWFRFTkRFRF9EQVRBX01BWF9DTlRdOworCisgIFVDSEFSIGxkR3JpZDsKK307Cit0eXBlZGVmIHN0cnVjdCBTQlJfRU5WX0RBVEEgKkhBTkRMRV9TQlJfRU5WX0RBVEE7CisKKworCitJTlQgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoc3RydWN0IFNCUl9IRUFERVJfREFUQSAgICAqc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfQklUU1RSRUFNX0RBVEEgKnNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICpzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENPTU1PTl9EQVRBICAgICAgICAqY21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKKworSU5UIEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICAgICpzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICpzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgICAgICAgKnNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgICAgICAgKnNickVudkRhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ09NTU9OX0RBVEEgICAgICAgICpjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKKworCitJTlQgRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICAgICAqc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRfUEFSQU1FVFJJQ19TVEVSRU8gKmhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICAqc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9FTlZfREFUQSAgICAgICAgKnNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICAqc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ09NTU9OX0RBVEEgICAgICAgICAqY21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKKworCisvKiBkZWJ1Z2dpbmcgYW5kIHR1bmluZyBmdW5jdGlvbnMgKi8KKworLyojZGVmaW5lIFNCUl9FTlZfU1RBVElTVElDUyAqLworCisKKy8qI2RlZmluZSBTQlJfUEFZTE9BRF9NT05JVE9SKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9jbW9uZGF0YS5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvY21vbmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU2OTkzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvY21vbmRhdGEuaApAQCAtMCwwICsxLDExMCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIENvcmUgQ29kZXIncyBhbmQgU0JSJ3Mgc2hhcmVkIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb24gIAorKi8KKyNpZm5kZWYgX19TQlJfQ01PTkRBVEFfSAorI2RlZmluZSBfX1NCUl9DTU9OREFUQV9ICisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKworc3RydWN0IENPTU1PTl9EQVRBIHsKKyAgSU5UICAgICAgICAgICAgICAgICAgIHNickhkckJpdHM7ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBoZWFkZXIgYml0cyAqLworICBJTlQgICAgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHM7ICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGRhdGEgYml0cyAqLworICBJTlQgICAgICAgICAgICAgICAgICAgc2JyRmlsbEJpdHM7ICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGZpbGwgYml0cyAqLworICBGREtfQklUU1RSRUFNICAgICAgICAgc2JyQml0YnVmOyAgICAgICAgICAgICAgLyoqPCB0aGUgU0JSIGRhdGEgYml0YnVmZmVyICovCisgIEZES19CSVRTVFJFQU0gICAgICAgICB0bXBXcml0ZUJpdGJ1ZjsgICAgICAgICAvKio8IGhlbHBlciB2YXIgZm9yIHdyaXRpbmcgaGVhZGVyKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgIHhPdmVyRnJlcTsgICAgICAgICAgICAgIC8qKjwgdGhlIFNCUiBjcm9zc292ZXIgZnJlcXVlbmN5ICovCisgIElOVCAgICAgICAgICAgICAgICAgICBkeW5Cd0VuYWJsZWQ7ICAgICAgICAgICAvKio8IGluZGljYXRlcyBpZiBkeW5hbWljIGJhbmR3aWR0aCBpcyBlbmFibGVkICovCisgIElOVCAgICAgICAgICAgICAgICAgICBzYnJOdW1DaGFubmVsczsgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAobWVhbmluZyBtb25vIG9yIHN0ZXJlbykgKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgIGR5blhPdmVyRnJlcUVuYzsgICAgICAgIC8qKjwgZW5jb2RlciBkeW5hbWljIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IENPTU1PTl9EQVRBICpIQU5ETEVfQ09NTU9OX0RBVEE7CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL2NvZGVfZW52LmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL2NvZGVfZW52LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWEyOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwCkBAIC0wLDAgKzEsNjQxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImNvZGVfZW52LmgiCisjaW5jbHVkZSAic2JyX3JvbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzCisgZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBIdWZmbWFuIFRhYmxlcyBkZXBlbmRlbnQgb24gY2hvc2VuIGFtcF9yZXMKKyByZXR1cm5zOiAgICAgIGVycm9yIGhhbmRsZQorIGlucHV0OgorIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaGVudiwKKyAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgIGhub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICBBTVBfUkVTICAgICAgICAgICAgICAgICAgIGFtcF9yZXMpCit7CisgIGlmICggKCFoZW52KSAgfHwgICghaG5vaXNlKSAgfHwgKCFzYnJFbnZEYXRhKSApCisgICAgcmV0dXJuICgxKTsgLyogbm90IGluaXQuICovCisKKyAgc2JyRW52RGF0YS0+aW5pdF9zYnJfYW1wX3JlcyA9IGFtcF9yZXM7CisKKyAgc3dpdGNoIChhbXBfcmVzKSB7CisgIGNhc2UgIFNCUl9BTVBfUkVTXzNfMDoKKyAgICAvKmVudmVsb3BlIGRhdGEqLworCisgICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExVDsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMVQ7CisKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMUY7CisKKyAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisKKyAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExOworICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2ICAgICAgICAgPSBDT0RFX0JPT0tfU0NGX0xBVjExOworCisgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMDsKKyAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSAgID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzA7CisgICAgYnJlYWs7CisKKyAgY2FzZSBTQlJfQU1QX1JFU18xXzU6CisgICAvKmVudmVsb3BlIGRhdGEqLworCisgICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwVDsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMFQ7CisKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEY7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwRjsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMEY7CisKKyAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7CisgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOworICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKKyAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEY7CisKKyAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgPSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTA7CisgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYgPSBDT0RFX0JPT0tfU0NGX0xBVjEwOworCisgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNTsKKyAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSAgID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18xXzU7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gKDEpOyAvKiB1bmRlZmluZWQgYW1wX3JlcyBtb2RlICovCisgIH0KKworICAvKiB0aGVzZSBhcmUgY29tbW9uIHRvIGJvdGggYW1wX3JlcyB2YWx1ZXMgKi8KKyAgLypOb2lzZSBkYXRhKi8KKworICAvKkxldmVsL1BhbiAtIGNvZGluZyAqLworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUMgICA9IHZfSHVmZl9Ob2lzZUxldmVsQzExVDsKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEwxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVDID0gYm9va1Nick5vaXNlQmFsYW5jZUMxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVMID0gYm9va1Nick5vaXNlQmFsYW5jZUwxMVQ7CisKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMUY7CisKKworICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VUaW1lQyAgICAgICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUwgICAgICAgID0gdl9IdWZmX05vaXNlTGV2ZWxMMTFUOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisKKyAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHMgICAgICAgICA9IFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0FNUF9SRVNfM18wOworICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlID0gU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMDsKKworCisgIC8qIGluaXQgZW52ZWxvcGUgdGFibGVzIGFuZCBjb2RlYm9va3MgKi8KKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZTsKKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZTsKKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUgPSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdjsKKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZMZXZlbEZyZXEgPSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdjsKKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZUaW1lID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXY7CisgIGhlbnYtPmNvZGVCb29rU2NmTGF2RnJlcSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2OworCisgIGhlbnYtPmh1ZmZ0YWJsZUxldmVsVGltZUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMOworICBoZW52LT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUw7CisgIGhlbnYtPmh1ZmZ0YWJsZVRpbWVMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUw7CisgIGhlbnYtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFMOworICBoZW52LT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUw7CisgIGhlbnYtPmh1ZmZ0YWJsZUZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUw7CisKKyAgaGVudi0+Y29kZUJvb2tTY2ZMYXZGcmVxID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXY7CisgIGhlbnYtPmNvZGVCb29rU2NmTGF2VGltZSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2OworCisgIGhlbnYtPnN0YXJ0X2JpdHMgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHM7CisgIGhlbnYtPnN0YXJ0X2JpdHNfYmFsYW5jZSA9IHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlOworCisKKyAgLyogaW5pdCBub2lzZSB0YWJsZXMgYW5kIGNvZGVib29rcyAqLworCisgIGhub2lzZS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMTsKKyAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExOworICBobm9pc2UtPmNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lID0gQ09ERV9CT09LX1NDRl9MQVYxMTsKKyAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IENPREVfQk9PS19TQ0ZfTEFWMTE7CisgIGhub2lzZS0+Y29kZUJvb2tTY2ZMYXZUaW1lID0gQ09ERV9CT09LX1NDRl9MQVYxMTsKKyAgaG5vaXNlLT5jb2RlQm9va1NjZkxhdkZyZXEgPSBDT0RFX0JPT0tfU0NGX0xBVjExOworCisgIGhub2lzZS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTDsKKyAgaG5vaXNlLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lTDsKKyAgaG5vaXNlLT5odWZmdGFibGVUaW1lTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUw7CisgIGhub2lzZS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTDsKKyAgaG5vaXNlLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VGcmVxTDsKKyAgaG5vaXNlLT5odWZmdGFibGVGcmVxTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUw7CisKKworICBobm9pc2UtPnN0YXJ0X2JpdHMgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0czsKKyAgaG5vaXNlLT5zdGFydF9iaXRzX2JhbGFuY2UgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlOworCisgIC8qIE5vIGRlbHRhIGNvZGluZyBpbiB0aW1lIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGR1ZSB0byAxLjVkQiBGSXgtRklYIHJ1bGUgKi8KKyAgaGVudi0+dXBEYXRlID0gMDsKKyAgaG5vaXNlLT51cERhdGUgPSAwOworICByZXR1cm4gICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBpbmRleExvdzJIaWdoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246ICAgTmljZSBzbWFsbCBwYXRjaC1mdW5jdGlvbnMgaW4gb3JkZXIgdG8gY29wZSB3aXRoIG5vbi1mYWN0b3ItMgorICAgICAgICAgICAgICAgIHJhdGlvcyBiZXR3ZWVuIGhpZ2gtcmVzIGFuZCBsb3ctcmVzCisKKyBBcmd1bWVudHM6ICAgICBJTlQgb2Zmc2V0LCBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcworCisgUmV0dXJuOiAgICAgICAgSU5UCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIGluZGV4TG93MkhpZ2goSU5UIG9mZnNldCwgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpCit7CisKKyAgaWYocmVzID09IEZSRVFfUkVTX0xPVykKKyAgeworICAgIGlmIChvZmZzZXQgPj0gMCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgICByZXR1cm4oaW5kZXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDIqaW5kZXggLSBvZmZzZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCisgICAgICAgICAgcmV0dXJuKDIqaW5kZXgraW5kZXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKDIqaW5kZXggKyBvZmZzZXQpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcmV0dXJuKGluZGV4KTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgbWFwTG93UmVzRW5lcmd5VmFsCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgICBJTlQgY3VyclZhbCxJTlQqIHByZXZEYXRhLCBJTlQgb2Zmc2V0LCBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcworCisgUmV0dXJuOiAgICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbWFwTG93UmVzRW5lcmd5VmFsKFNDSEFSIGN1cnJWYWwsIFNDSEFSKiBwcmV2RGF0YSwgSU5UIG9mZnNldCwgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpCit7CisKKyAgaWYocmVzID09IEZSRVFfUkVTX0xPVykKKyAgeworICAgIGlmIChvZmZzZXQgPj0gMCkKKyAgICB7CisgICAgICAgIGlmKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICAgICAgcHJldkRhdGFbaW5kZXhdID0gY3VyclZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4IC0gb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4KzEgLSBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXhdID0gY3VyclZhbDsKKyAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXgrMV0gPSBjdXJyVmFsOworICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleCsyXSA9IGN1cnJWYWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4ICsgb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4ICsgMSArIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBjb21wdXRlQml0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOiAgICAgSU5UIGRlbHRhLAorICAgICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsLAorICAgICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKiBodWZmdGFibGVMZXZlbCwKKyAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqIGh1ZmZ0YWJsZUJhbGFuY2UsIElOVCBjb3VwbGluZywgSU5UIGNoYW5uZWwpCisKKyBSZXR1cm46ICAgICAgICBJTlQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2NvbXB1dGVCaXRzIChTQ0hBUiAqZGVsdGEsCisgICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2TGV2ZWwsCisgICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZSwKKyAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqIGh1ZmZ0YWJsZUxldmVsLAorICAgICAgICAgICAgIGNvbnN0IFVDSEFSICogaHVmZnRhYmxlQmFsYW5jZSwgSU5UIGNvdXBsaW5nLCBJTlQgY2hhbm5lbCkKK3sKKyAgSU5UIGluZGV4OworICBJTlQgZGVsdGFfYml0cyA9IDA7CisKKyAgaWYgKGNvdXBsaW5nKSB7CisgICAgaWYgKGNoYW5uZWwgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCpkZWx0YSA8IDApCisgICAgICAgICAgaW5kZXggPSBmaXhNYXgoKmRlbHRhLCAtY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgIGNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CisKKyAgICAgICAgaWYgKGluZGV4ICE9ICpkZWx0YSkgeworICAgICAgICAgICpkZWx0YSA9IGluZGV4OworICAgICAgICAgIHJldHVybiAoMTAwMDApOworICAgICAgICB9CisKKyAgICAgICAgZGVsdGFfYml0cyA9IGh1ZmZ0YWJsZUJhbGFuY2VbaW5kZXggKyBjb2RlQm9va1NjZkxhdkJhbGFuY2VdOworICAgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCpkZWx0YSA8IDApCisgICAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2TGV2ZWwpOworICAgICAgZWxzZQorICAgICAgICBpbmRleCA9IGZpeE1pbigqZGVsdGEsICBjb2RlQm9va1NjZkxhdkxldmVsKTsKKworICAgICAgaWYgKGluZGV4ICE9ICpkZWx0YSkgeworICAgICAgICAqZGVsdGEgPSBpbmRleDsKKyAgICAgICAgcmV0dXJuICgxMDAwMCk7CisgICAgICB9CisgICAgICBkZWx0YV9iaXRzID0gaHVmZnRhYmxlTGV2ZWxbaW5kZXggKyBjb2RlQm9va1NjZkxhdkxldmVsXTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCpkZWx0YSA8IDApCisgICAgICBpbmRleCA9IGZpeE1heCgqZGVsdGEsIC1jb2RlQm9va1NjZkxhdkxldmVsKTsKKyAgICBlbHNlCisgICAgICBpbmRleCA9IGZpeE1pbigqZGVsdGEsICBjb2RlQm9va1NjZkxhdkxldmVsKTsKKworICAgIGlmIChpbmRleCAhPSAqZGVsdGEpIHsKKyAgICAgICpkZWx0YSA9IGluZGV4OworICAgICAgcmV0dXJuICgxMDAwMCk7CisgICAgfQorICAgIGRlbHRhX2JpdHMgPSBodWZmdGFibGVMZXZlbFtpbmRleCArIGNvZGVCb29rU2NmTGF2TGV2ZWxdOworICB9CisKKyAgcmV0dXJuIChkZWx0YV9iaXRzKTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfY29kZUVudmVsb3BlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgICBJTlQgKnNmYl9ucmcsCisgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgKmZyZXFfcmVzLAorICAgICAgICAgICAgICAgIFNCUl9DT0RFX0VOVkVMT1BFICogaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgSU5UICpkaXJlY3Rpb25WZWMsIElOVCBzY2FsYWJsZSwgSU5UIG5FbnZlbG9wZXMsIElOVCBjaGFubmVsLAorICAgICAgICAgICAgICAgIElOVCBoZWFkZXJBY3RpdmUpCisKKyBSZXR1cm46ICAgICAgICBub25lCisgICAgICAgICAgICAgICAgaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldiBpcyBtb2RpZmllZCAhCisgICAgICAgICAgICAgICAgc2ZiX25yZyBpcyBtb2RpZmllZAorICAgICAgICAgICAgICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cGRhdGUgaXMgbW9kZmllZCAhCisgICAgICAgICAgICAgICAgKmRpcmVjdGlvblZlYyBpcyBtb2RpZmllZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShTQ0hBUiAgICAgICAgICAgICAqc2ZiX25yZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgICAgKmZyZXFfcmVzLAorICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICpkaXJlY3Rpb25WZWMsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIG5FbnZlbG9wZXMsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgaGVhZGVyQWN0aXZlKQoreworICBJTlQgaSwgbm9fb2ZfYmFuZHMsIGJhbmQ7CisgIEZJWFBfREJMIHRtcDEsdG1wMix0bXAzLGRGX2VkZ2VfMXN0RW52OworICBTQ0hBUiAqcHRyX25yZzsKKworICBJTlQgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWU7CisgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWU7CisgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlTGV2ZWxUaW1lTDsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUJhbGFuY2VUaW1lTDsKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUxldmVsRnJlcUw7CisgIGNvbnN0IFVDSEFSICpodWZmdGFibGVCYWxhbmNlRnJlcUw7CisKKyAgSU5UIG9mZnNldCA9IGhfc2JyQ29kZUVudmVsb3BlLT5vZmZzZXQ7CisgIElOVCBlbnZEYXRhVGFibGVDb21wRmFjdG9yOworCisgIElOVCBkZWx0YV9GX2JpdHMgPSAwLCBkZWx0YV9UX2JpdHMgPSAwOworICBJTlQgdXNlX2RUOworCisgIFNDSEFSIGRlbHRhX0ZbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgU0NIQVIgZGVsdGFfVFtNQVhfRlJFUV9DT0VGRlNdOworICBTQ0hBUiBsYXN0X25yZywgY3Vycl9ucmc7CisKKyAgdG1wMSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChERlJBQ1RfQklUUy0xNi0xKTsKKyAgdG1wMiA9IGhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlXzFzdEVudiA+PiAoREZSQUNUX0JJVFMtMTYpOworICB0bXAzID0gKEZJWFBfREJMKSgoKElOVCkoTE9ORyloX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyKmhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3JfZmFjKSA+PiAoREZSQUNUX0JJVFMtMTYpKTsKKworICBkRl9lZGdlXzFzdEVudiA9IHRtcDEgKyB0bXAyICsgdG1wMzsKKworICBpZiAoY291cGxpbmcpIHsKKyAgICBjb2RlQm9va1NjZkxhdkxldmVsVGltZSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkxldmVsVGltZTsKKyAgICBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgICBjb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lID0gaF9zYnJDb2RlRW52ZWxvcGUtPmNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWU7CisgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICAgIGh1ZmZ0YWJsZUxldmVsVGltZUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlTGV2ZWxUaW1lTDsKKyAgICBodWZmdGFibGVCYWxhbmNlVGltZUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMOworICAgIGh1ZmZ0YWJsZUxldmVsRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlTGV2ZWxGcmVxTDsKKyAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMOworICB9CisgIGVsc2UgeworICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lID0gaF9zYnJDb2RlRW52ZWxvcGUtPmNvZGVCb29rU2NmTGF2VGltZTsKKyAgICBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkZyZXE7CisgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdlRpbWU7CisgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkZyZXE7CisgICAgaHVmZnRhYmxlTGV2ZWxUaW1lTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVUaW1lTDsKKyAgICBodWZmdGFibGVCYWxhbmNlVGltZUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlVGltZUw7CisgICAgaHVmZnRhYmxlTGV2ZWxGcmVxTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVGcmVxTDsKKyAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlRnJlcUw7CisgIH0KKworICBpZihjb3VwbGluZyA9PSAxICYmIGNoYW5uZWwgPT0gMSkKKyAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMTsgICAgICAgLypzaG91bGQgYmUgb25lIHdoZW4gdGhlIG5ldyBodWZmbWFuLXRhYmxlcyBhcmUgcmVhZHkqLworICBlbHNlCisgICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDA7CisKKworICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPmRlbHRhVEFjcm9zc0ZyYW1lcyA9PSAwKQorICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAwOworCisgIC8qIG5vIGRlbHRhIGNvZGluZyBpbiB0aW1lIGluIGNhc2Ugb2YgYSBoZWFkZXIgKi8KKyAgaWYgKGhlYWRlckFjdGl2ZSkKKyAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKKworCisgIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspCisgIHsKKyAgICBpZiAoZnJlcV9yZXNbaV0gPT0gRlJFUV9SRVNfSElHSCkKKyAgICAgIG5vX29mX2JhbmRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfSElHSF07CisgICAgZWxzZQorICAgICAgbm9fb2ZfYmFuZHMgPSBoX3NickNvZGVFbnZlbG9wZS0+blNmYltGUkVRX1JFU19MT1ddOworCisKKyAgICBwdHJfbnJnID0gc2ZiX25yZzsKKyAgICBjdXJyX25yZyA9ICpwdHJfbnJnOworCisgICAgZGVsdGFfRlswXSA9IGN1cnJfbnJnID4+IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CisKKyAgICBpZiAoY291cGxpbmcgJiYgY2hhbm5lbCA9PSAxKQorICAgICAgZGVsdGFfRl9iaXRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPnN0YXJ0X2JpdHNfYmFsYW5jZTsKKyAgICBlbHNlCisgICAgICBkZWx0YV9GX2JpdHMgPSBoX3NickNvZGVFbnZlbG9wZS0+c3RhcnRfYml0czsKKworCisgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQorICAgIHsKKyAgICAgIGRlbHRhX1RbMF0gPSAoY3Vycl9ucmcgLSBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2WzBdKSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOworCisgICAgICBkZWx0YV9UX2JpdHMgPSBjb21wdXRlQml0cyAoJmRlbHRhX1RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVMZXZlbFRpbWVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOworICAgIH0KKworCisgICAgbWFwTG93UmVzRW5lcmd5VmFsKGN1cnJfbnJnLCBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2LCBvZmZzZXQsIDAsIGZyZXFfcmVzW2ldKTsKKworICAgIC8qIGVuc3VyZSB0aGF0IG5yZyBkaWZmZXJlbmNlIGlzIG5vdCBoaWdoZXIgdGhhbiBjb2RlQm9va1NjZkxhdlhYWEZyZXEgKi8KKyAgICBpZiAoIGNvdXBsaW5nICYmIGNoYW5uZWwgPT0gMSApIHsKKyAgICAgIGZvciAoYmFuZCA9IG5vX29mX2JhbmRzIC0gMTsgYmFuZCA+IDA7IGJhbmQtLSkgeworICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQtMV0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxICkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZC0xXSA9IHB0cl9ucmdbYmFuZF0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgeworICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZC0xXSAtIHB0cl9ucmdbYmFuZF0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxICkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQtMV0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yIChiYW5kID0gbm9fb2ZfYmFuZHMgLSAxOyBiYW5kID4gMDsgYmFuZC0tKSB7CisgICAgICAgIGlmICggcHRyX25yZ1tiYW5kXSAtIHB0cl9ucmdbYmFuZC0xXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxICkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZC0xXSA9IHB0cl9ucmdbYmFuZF0gLSBjb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspIHsKKyAgICAgICAgaWYgKCBwdHJfbnJnW2JhbmQtMV0gLSBwdHJfbnJnW2JhbmRdID4gY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXEgKSB7CisgICAgICAgICAgcHRyX25yZ1tiYW5kXSA9IHB0cl9ucmdbYmFuZC0xXSAtIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisKKyAgICAvKiBDb2RpbmcgbG9vcCovCisgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspCisgICAgeworICAgICAgbGFzdF9ucmcgPSAoKnB0cl9ucmcpOworICAgICAgcHRyX25yZysrOworICAgICAgY3Vycl9ucmcgPSAoKnB0cl9ucmcpOworCisgICAgICBkZWx0YV9GW2JhbmRdID0gKGN1cnJfbnJnIC0gbGFzdF9ucmcpID4+IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CisKKyAgICAgIGRlbHRhX0ZfYml0cyArPSBjb21wdXRlQml0cyAoJmRlbHRhX0ZbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVMZXZlbEZyZXFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKKworICAgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQorICAgICAgeworICAgICAgICBkZWx0YV9UW2JhbmRdID0gY3Vycl9ucmcgLSBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2W2luZGV4TG93MkhpZ2gob2Zmc2V0LCBiYW5kLCBmcmVxX3Jlc1tpXSldOworICAgICAgICBkZWx0YV9UW2JhbmRdID0gZGVsdGFfVFtiYW5kXSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOworICAgICAgfQorCisgICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoY3Vycl9ucmcsIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXYsIG9mZnNldCwgYmFuZCwgZnJlcV9yZXNbaV0pOworCisgICAgICBpZihoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApCisgICAgICB7CisgICAgICAgIGRlbHRhX1RfYml0cyArPSBjb21wdXRlQml0cyAoJmRlbHRhX1RbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVMZXZlbFRpbWVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOworICAgICAgfQorICAgIH0KKworICAgIC8qIFJlcGxhY2Ugc2ZiX25yZyB3aXRoIGRlbHRhY29kZWQgc2FtcGxlcyBhbmQgc2V0IGZsYWcgKi8KKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBJTlQgdG1wX2JpdHM7CisgICAgICB0bXBfYml0cyA9ICgoKGRlbHRhX1RfYml0cyAqIGRGX2VkZ2VfMXN0RW52KSA+PiAoREZSQUNUX0JJVFMtMTgpKSArIChGSVhQX0RCTCkxKSA+PiAxOworICAgICAgdXNlX2RUID0gKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCAmJiAoZGVsdGFfRl9iaXRzID4gdG1wX2JpdHMpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgdXNlX2RUID0gKGRlbHRhX1RfYml0cyA8IGRlbHRhX0ZfYml0cyAmJiBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApOworCisgICAgaWYgKHVzZV9kVCkKKyAgICB7CisgICAgICBkaXJlY3Rpb25WZWNbaV0gPSBUSU1FOworICAgICAgRkRLbWVtY3B5IChzZmJfbnJnLCBkZWx0YV9ULCBub19vZl9iYW5kcyAqIHNpemVvZiAoU0NIQVIpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKKyAgICAgIGRpcmVjdGlvblZlY1tpXSA9IEZSRVE7CisgICAgICBGREttZW1jcHkgKHNmYl9ucmcsIGRlbHRhX0YsIG5vX29mX2JhbmRzICogc2l6ZW9mIChTQ0hBUikpOworICAgIH0KKyAgICBzZmJfbnJnICs9IG5vX29mX2JhbmRzOworICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAxOworICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlIChIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgIGhfc2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfMXN0RW52LAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlX2luY3IpCit7CisKKyAgRkRLbWVtY2xlYXIoaF9zYnJDb2RlRW52ZWxvcGUsc2l6ZW9mKFNCUl9DT0RFX0VOVkVMT1BFKSk7CisKKyAgaF9zYnJDb2RlRW52ZWxvcGUtPmRlbHRhVEFjcm9zc0ZyYW1lcyA9IGRlbHRhVEFjcm9zc0ZyYW1lczsKKyAgaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfMXN0RW52ID0gZEZfZWRnZV8xc3RFbnY7CisgIGhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3IgPSBkRl9lZGdlX2luY3I7CisgIGhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3JfZmFjID0gMDsKKyAgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDA7CisgIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0xPV10gPSBuU2ZiW0ZSRVFfUkVTX0xPV107CisgIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdID0gblNmYltGUkVRX1JFU19ISUdIXTsKKyAgaF9zYnJDb2RlRW52ZWxvcGUtPm9mZnNldCA9IDIqaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSAtIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdOworCisgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGEzNjVlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuaApAQCAtMCwwICsxLDE1MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIERQQ00gRW52ZWxvcGUgY29kaW5nICAKKyovCisKKyNpZm5kZWYgX19DT0RFX0VOVl9ICisjZGVmaW5lIF9fQ09ERV9FTlZfSAorCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgImJpdF9zYnIuaCIKKyNpbmNsdWRlICJmcmFtX2dlbi5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQgb2Zmc2V0OworICBJTlQgdXBEYXRlOworICBJTlQgblNmYlsyXTsKKyAgU0NIQVIgc2ZiX25yZ19wcmV2W01BWF9GUkVRX0NPRUZGU107CisgIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXM7CisgIEZJWFBfREJMIGRGX2VkZ2VfMXN0RW52OworICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7CisgIElOVCBkRl9lZGdlX2luY3JfZmFjOworCisKKyAgSU5UIGNvZGVCb29rU2NmTGF2VGltZTsKKyAgSU5UIGNvZGVCb29rU2NmTGF2RnJlcTsKKworICBJTlQgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWU7CisgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWU7CisgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworCisgIElOVCBzdGFydF9iaXRzOworICBJTlQgc3RhcnRfYml0c19iYWxhbmNlOworCisKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZVRpbWVMOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlRnJlcUw7CisKKyAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUxldmVsVGltZUw7CisgIGNvbnN0IFVDSEFSICpodWZmdGFibGVCYWxhbmNlVGltZUw7CisgIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbEZyZXFMOworICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZUZyZXFMOworfQorU0JSX0NPREVfRU5WRUxPUEU7Cit0eXBlZGVmIFNCUl9DT0RFX0VOVkVMT1BFICpIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEU7CisKKworCit2b2lkCitGREtzYnJFbmNfY29kZUVudmVsb3BlIChTQ0hBUiAqc2ZiX25yZywKKyAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgKmZyZXFfcmVzLAorICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqIGhfc2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICBJTlQgKmRpcmVjdGlvblZlYywgSU5UIGNvdXBsaW5nLCBJTlQgbkVudmVsb3BlcywgSU5UIGNoYW5uZWwsCisgICAgICAgICAgICAgIElOVCBoZWFkZXJBY3RpdmUpOworCitJTlQKK0ZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlIChIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAqblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnYsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfaW5jcik7CisKK0lOVAorRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzIChzdHJ1Y3QgU0JSX0VOVl9EQVRBKiAgICAgIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFICBoZW52LAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgIEFNUF9SRVMgICAgICAgICAgICAgICAgICAgYW1wX3Jlcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9lbnZfYml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMxMTgzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5jcHAKQEAgLTAsMCArMSwyNTAgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBSZW1haW5pbmcgU0JSIEJpdCBXcml0aW5nIFJvdXRpbmVzCisqLworCisjaW5jbHVkZSAiZW52X2JpdC5oIgorI2luY2x1ZGUgImNtb25kYXRhLmgiCisKKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGE6YikKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYTpiKQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNyY0FkdmFuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGZuCisgKiBAYnJpZWYgICAgdXBkYXRlcyBjcmMgZGF0YSByZWdpc3RlcgorICogQHJldHVybiAgIG5vbmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGNyYyByZWdpc3RlcgorICoKKyAqLworc3RhdGljIHZvaWQgY3JjQWR2YW5jZShVU0hPUlQgY3JjUG9seSwKKyAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIGNyY01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAqY3JjLAorICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgIGJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICBiQml0cworICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSU5UIGk7CisgIFVTSE9SVCBmbGFnOworCisgIGZvciAoaT1iQml0cy0xOyBpPj0wOyBpLS0pIHsKKyAgICBmbGFnID0gKCgqY3JjKSAmIGNyY01hc2spID8gKDEpIDogKDApIDsKKyAgICBmbGFnIF49IChiVmFsdWUgJiAoMTw8aSkpID8gKDEpIDogKDApIDsKKworICAgICgqY3JjKTw8PTE7CisgICAgaWYoZmxhZykgKCpjcmMpIF49IGNyY1BvbHk7CisgIH0KK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZm4KKyAqIEBicmllZiAgICBJbml0dGlhbGlzYXRpb24gb2Ygc2JyIGJpdHN0cmVhbSwgd3JpdGUgb2YgZHVtbXkgaGVhZGVyIGFuZCBDUkMKKyAqIEByZXR1cm4gICBub25lCisgKgorICoKKyAqCisgKi8KKworSU5UICBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbShIQU5ETEVfQ09NTU9OX0RBVEEgIGhDbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICptZW1vcnlCYXNlLCAgICAgIC8qITwgUG9pbnRlciB0byBiaXRzdHJlYW0gYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWVtb3J5U2l6ZSwgICAgICAvKiE8IExlbmd0aCBvZiBiaXRzdHJlYW0gYnVmZmVyIGluIGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgaENyY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpICAvKiE8IFNCUiBzeW50YXggZmxhZ3MgKi8KK3sKKyAgSU5UIGNyY1JlZ2lvbiA9IDA7CisKKyAgLyogcmVzZXQgYml0IGJ1ZmZlciAqLworICBGREtyZXNldEJpdGJ1ZmZlcigmaENtb25EYXRhLT5zYnJCaXRidWYsIEJTX1dSSVRFUik7CisKKyAgRkRLaW5pdEJpdFN0cmVhbSgmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgbWVtb3J5QmFzZSwKKyAgICAgICAgICAgICAgICAgICBtZW1vcnlTaXplLCAwLCBCU19XUklURVIpOworCisgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDKSB7CisgICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9EUk1fQ1JDKQorICAgIHsgLyogSW5pdCBhbmQgc3RhcnQgQ1JDIHJlZ2lvbiAqLworICAgICAgRkRLd3JpdGVCaXRzICgmaENtb25EYXRhLT5zYnJCaXRidWYsIDB4MCwgU0lfU0JSX0RSTV9DUkNfQklUUyk7CisgICAgICBGREtjcmNJbml0KCBoQ3JjSW5mbywgMHgwMDFkLCAweEZGRkYsIFNJX1NCUl9EUk1fQ1JDX0JJVFMgKTsKKyAgICAgIGNyY1JlZ2lvbiA9IEZES2NyY1N0YXJ0UmVnKCBoQ3JjSW5mbywgJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAwICk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES3dyaXRlQml0cyAoJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAweDAsIFNJX1NCUl9DUkNfQklUUyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChjcmNSZWdpb24pOworfQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqIEZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAZm4KKyAqIEBicmllZiAgICBGb3JtYXRzIHRoZSBTQlIgcGF5bG9hZAorICogQHJldHVybiAgIG5vdGhpbmcKKyAqCisgKiBBbHNvIHRoZSBDUkMgd2lsbCBiZSBjYWxjdWxhdGVkIGhlcmUuCisgKgorICovCisKK3ZvaWQKK0ZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSggSEFORExFX0NPTU1PTl9EQVRBICBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgaENyY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgY3JjUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQoreworICBVU0hPUlQgY3JjUmVnID0gIFNCUl9DUkNJTklUOworICBJTlQgbnVtQ3JjQml0cyxpOworCisgIC8qIGNoZWNrIGlmIFNCUiBpcyBwcmVzZW50ICovCisgIGlmICggaENtb25EYXRhPT1OVUxMICkKKyAgICByZXR1cm47CisKKyAgaENtb25EYXRhLT5zYnJGaWxsQml0cyA9IDA7IC8qIEZpbGwgYml0cyBhcmUgd3JpdHRlbiBvbmx5IGZvciBHQSBzdHJlYW1zICovCisKKyAgaWYgKCBzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfRFJNX0NSQyApCisgIHsKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgRFJNIENSQworICAgICAqLworICAgIEZES2NyY0VuZFJlZyggaENyY0luZm8sICZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgY3JjUmVnaW9uICk7CisgICAgRkRLd3JpdGVCaXRzKCAmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgRkRLY3JjR2V0Q1JDKGhDcmNJbmZvKV4weEZGLCBTSV9TQlJfRFJNX0NSQ19CSVRTICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKCAhKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpICkKKyAgICB7CisgICAgICAvKiBEbyBhbGlnbm1lbnQgaGVyZSwgYmVjYXVzZSBpdHMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBzYnJfZXh0ZW5zaW9uX2RhdGEgKi8KKyAgICAgIGludCBzYnJMb2FkID0gaENtb25EYXRhLT5zYnJIZHJCaXRzICsgaENtb25EYXRhLT5zYnJEYXRhQml0czsKKworICAgICAgaWYgKCBzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDICkgeworICAgICAgICBzYnJMb2FkICs9IFNJX1NCUl9DUkNfQklUUzsKKyAgICAgIH0KKworICAgICAgc2JyTG9hZCArPSA0OyAgICAgICAgIC8qIERvIGJ5dGUgQWxpZ24gd2l0aCA0IGJpdCBvZmZzZXQuIElTTy9JRUMgMTQ0OTYtMzoyMDA1KEUpIHBhZ2UgMzkuICovCisKKyAgICAgIGhDbW9uRGF0YS0+c2JyRmlsbEJpdHMgPSAoOCAtIChzYnJMb2FkICUgOCkpICUgODsKKworICAgICAgLyoKKyAgICAgICAgYXBwZW5kIGZpbGwgYml0cworICAgICAgKi8KKyAgICAgIEZES3dyaXRlQml0cygmaENtb25EYXRhLT5zYnJCaXRidWYsIDAsICBoQ21vbkRhdGEtPnNickZpbGxCaXRzICk7CisKKyAgICAgIEZES19BU1NFUlQoRkRLZ2V0VmFsaWRCaXRzKCZoQ21vbkRhdGEtPnNickJpdGJ1ZikgJSA4ID09IDQpOworICAgIH0KKworICAgIC8qCisgICAgICBjYWxjdWxhdGUgY3JjCisgICAgKi8KKyAgICBpZiAoIHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9DUkMgKSB7CisgICAgICBGREtfQklUU1RSRUFNICB0bXBDUkNCdWYgPSBoQ21vbkRhdGEtPnNickJpdGJ1ZjsKKyAgICAgIEZES3Jlc2V0Qml0YnVmZmVyKCAmdG1wQ1JDQnVmLCBCU19SRUFERVIgKTsKKworICAgICAgbnVtQ3JjQml0cyA9IGhDbW9uRGF0YS0+c2JySGRyQml0cyArIGhDbW9uRGF0YS0+c2JyRGF0YUJpdHMgKyBoQ21vbkRhdGEtPnNickZpbGxCaXRzOworCisgICAgICBmb3IoaT0wO2k8bnVtQ3JjQml0cztpKyspeworICAgICAgICBJTlQgYml0OworICAgICAgICBiaXQgPSBGREtyZWFkQml0cygmdG1wQ1JDQnVmLDEpOworICAgICAgICBjcmNBZHZhbmNlKFNCUl9DUkNfUE9MWSxTQlJfQ1JDX01BU0ssJmNyY1JlZyxiaXQsMSk7CisgICAgICB9CisgICAgICBjcmNSZWcgJj0gKFNCUl9DUkNfUkFOR0UpOworCisgICAgICAvKgorICAgICAgICogV3JpdGUgQ1JDIGRhdGEuCisgICAgICAgKi8KKyAgICAgIEZES3dyaXRlQml0cyAoJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYsIGNyY1JlZywgU0lfU0JSX0NSQ19CSVRTKTsKKyAgICB9CisgIH0KKworICBGREtzeW5jQ2FjaGUoJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYpOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9lbnZfYml0LmggYi9hYWMvbGliU0JSZW5jL3NyYy9lbnZfYml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4YTMyYQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL2Vudl9iaXQuaApAQCAtMCwwICsxLDEyNiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFJlbWFpbmluZyBTQlIgQml0IFdyaXRpbmcgUm91dGluZXMKKyovCisKKyNpZm5kZWYgQklUX0VOVl9ICisjZGVmaW5lIEJJVF9FTlZfSAorCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKyNpbmNsdWRlICJGREtfY3JjLmgiCisKKy8qIEcoeCkgPSB4XjEwICsgeF45ICsgeF41ICsgeF40ICsgeCArIDEgKi8KKyNkZWZpbmUgU0JSX0NSQ19QT0xZICAgICAoMHgwMjMzKQorI2RlZmluZSBTQlJfQ1JDX01BU0sgICAgICgweDAyMDApCisjZGVmaW5lIFNCUl9DUkNfUkFOR0UgICAgKDB4MDNGRikKKyNkZWZpbmUgU0JSX0NSQ19NQVhSRUdTICAgICAxCisjZGVmaW5lIFNCUl9DUkNJTklUICAgICAgKDB4MCkKKworCisjZGVmaW5lIFNJX1NCUl9DUkNfRU5BQkxFX0JJVFMgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJX1NCUl9DUkNfQklUUyAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNJX1NCUl9EUk1fQ1JDX0JJVFMgICAgICAgICAgICAgICAgICAgICA4CisKKworc3RydWN0IENPTU1PTl9EQVRBOworCitJTlQgRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0oc3RydWN0IENPTU1PTl9EQVRBICAqaENtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgKm1lbW9yeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbWVtb3J5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICBoQ3JjSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKK3ZvaWQKK0ZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSAoc3RydWN0IENPTU1PTl9EQVRBICAqaENtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICBoQ3JjSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgY3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisKKworCisKKworI2VuZGlmIC8qICNpZm5kZWYgQklUX0VOVl9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL2Vudl9lc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOWYyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcApAQCAtMCwwICsxLDE4NjkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiZW52X2VzdC5oIgorI2luY2x1ZGUgInRyYW5fZGV0LmgiCisKKyNpbmNsdWRlICJxbWYuaCIKKworI2luY2x1ZGUgImZyYW1fZ2VuLmgiCisjaW5jbHVkZSAiYml0X3Nici5oIgorI2luY2x1ZGUgImNtb25kYXRhLmgiCisjaW5jbHVkZSAic2JyX3JhbS5oIgorCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjZGVmaW5lIFFVQU5UX0VSUk9SX1RIUkVTIDIwMAorI2RlZmluZSBZX05SR19TQ0FMRSA1IC8qIG5vQ29scyA9IDMyIC0+IHNoaWZ0KDUpICovCisKKworc3RhdGljIGNvbnN0IFVDSEFSIHBhblRhYmxlWzJdWzEwXSA9IHsgeyAwLCAyLCA0LCA2LCA4LDEyLDE2LDIwLDI0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMiwgNCwgOCwxMiwgMCwgMCwgMCwgMCB9IH07CitzdGF0aWMgY29uc3QgVUNIQVIgbWF4SW5kZXhbMl0gPSB7OSwgNX07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgICAgIENhbGN1bGF0ZXMgZW5lcmd5IGZvcm0gcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQgb2YKKyAgICAgICAgICAgICAgdGhlIFFNRiBzdWJzYW1wbGVzCisKKyAgXHJldHVybiAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIHZvaWQKK0ZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGEoRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCByZWFsVmFsdWVzLCAgLyohPCB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGltYWdWYWx1ZXMsICAvKiE8IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbnVtYmVyQmFuZHMsICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG51bWJlckNvbHMsICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICpxbWZTY2FsZSwgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAqZW5lcmd5U2NhbGUpICAgICAgICAgICAgICAvKiE8IHNjYWxlZmFjdG9yIG9mIGVuZXJnaWVzICovCit7CisgIGludCBqLCBrOworICBpbnQgc2NhbGU7CisgIEZJWFBfREJMIG1heF92YWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAvKiBHZXQgU2NyYXRjaCBidWZmZXIgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcE5yZywgRklYUF9EQkwsIFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMvMik7CisKKyAgLyogR2V0IG1heCBwb3NzaWJsZSBzY2FsaW5nIG9mIFFNRiBkYXRhICovCisgIHNjYWxlID0gREZSQUNUX0JJVFM7CisgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgeworICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLCBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKKyAgfQorCisgIC8qIFR3ZWFrIHNjYWxpbmcgc3RhYmlsaXR5IGZvciB6ZXJvIHNpZ25hbCB0byBub24temVybyBzaWduYWwgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTLTEpIHsKKyAgICBzY2FsZSA9IChGUkFDVF9CSVRTLTEtKnFtZlNjYWxlKTsKKyAgfQorICAvKiBwcmV2ZW50IHNjYWxpbmcgb2YgUUZNIHZhbHVlcyB0byAtMS5mICovCisgIHNjYWxlID0gZml4TWF4KDAsc2NhbGUtMSk7CisKKyAgLyogVXBkYXRlIFFNRiBzY2FsZSAqLworICAqcW1mU2NhbGUgKz0gc2NhbGU7CisKKyAgLyoKKyAgICAgQ2FsY3VsYXRlIGVuZXJneSBvZiBlYWNoIHRpbWUgc2xvdCBwYWlyLCBtYXggZW5lcmd5CisgICAgIGFuZCBzaGlmdCBRTUYgdmFsdWVzIGFzIGZhciBhcyBwb3NzaWJsZSB0byB0aGUgbGVmdC4KKyAgICovCisgIHsKKyAgICBGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOworICAgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrPTIpCisgICAgeworICAgICAgLyogTG9hZCBiYW5kIHZlY3RvciBhZGRyZXNzZXMgb2YgMiBjb25zZWN1dGl2ZSB0aW1lc2xvdHMgKi8KKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCByMCA9IHJlYWxWYWx1ZXNba107CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTAgPSBpbWFnVmFsdWVzW2tdOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIxID0gcmVhbFZhbHVlc1trKzFdOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkxID0gaW1hZ1ZhbHVlc1trKzFdOworICAgICAgZm9yIChqPTA7IGo8bnVtYmVyQmFuZHM7IGorKykKKyAgICAgIHsKKyAgICAgICAgRklYUF9EQkwgIGVuZXJneTsKKyAgICAgICAgRklYUF9EQkwgIHRyMCx0cjEsdGkwLHRpMTsKKworICAgICAgICAvKiBSZWFkIFFNRiB2YWx1ZXMgb2YgMiB0aW1lc2xvdHMgKi8KKyAgICAgICAgdHIwID0gcjBbal07IHRyMSA9IHIxW2pdOyB0aTAgPSBpMFtqXTsgdGkxID0gaTFbal07CisKKyAgICAgICAgLyogU2NhbGUgUU1GIFZhbHVlcyBhbmQgQ2FsYyBFbmVyZ3kgb2YgYm90aCB0aW1lc2xvdHMgKi8KKyAgICAgICAgdHIwIDw8PSBzY2FsZTsKKyAgICAgICAgdGkwIDw8PSBzY2FsZTsKKyAgICAgICAgZW5lcmd5ID0gZlBvdzJBZGREaXYyKGZQb3cyRGl2Mih0cjApLCB0aTApID4+IDE7CisKKyAgICAgICAgdHIxIDw8PSBzY2FsZTsKKyAgICAgICAgdGkxIDw8PSBzY2FsZTsKKyAgICAgICAgZW5lcmd5ICs9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIodHIxKSwgdGkxKSA+PiAxOworCisgICAgICAgIC8qIFdyaXRlIHRpbWVzbG90IHBhaXIgZW5lcmd5IHRvIHNjcmF0Y2ggKi8KKyAgICAgICAgKm5yZ1ZhbHVlcysrID0gZW5lcmd5OworICAgICAgICBtYXhfdmFsID0gZml4TWF4KG1heF92YWwsIGVuZXJneSk7CisKKyAgICAgICAgLyogV3JpdGUgYmFjayBzY2FsZWQgUU1GIHZhbHVlcyAqLworICAgICAgICByMFtqXSA9IHRyMDsgcjFbal0gPSB0cjE7IGkwW2pdID0gdGkwOyBpMVtqXSA9IHRpMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogZW5lcmd5U2NhbGU6IHNjYWxlZmFjdG9yIGVuZXJnaWVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgKmVuZXJneVNjYWxlID0gMiooKnFtZlNjYWxlKS0xOyAgICAgICAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KKworICAvKiBTY2FsZSB0aW1lc2xvdCBwYWlyIGVuZXJnaWVzIGFuZCB3cml0ZSB0byBvdXRwdXQgYnVmZmVyICovCisgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhfdmFsKTsKKyAgeworICAJRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKKyAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzPj4xOyBrKyspIHsKKyAgICAgIHNjYWxlVmFsdWVzKGVuZXJneVZhbHVlc1trXSwgbnJnVmFsdWVzLCBudW1iZXJCYW5kcywgc2NhbGUpOworICAgICAgbnJnVmFsdWVzICs9IG51bWJlckJhbmRzOworICAgIH0KKyAgICAqZW5lcmd5U2NhbGUgKz0gc2NhbGU7CisgIH0KKworICAvKiBGcmVlIFNjcmF0Y2ggYnVmZmVyICovCisgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKlFNRl9NQVhfVElNRV9TTE9UUy8yKTsKK30KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIHZvaWQKK0ZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKEZJWFBfREJMICoqUkVTVFJJQ1QgZW5lcmd5VmFsdWVzLC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsICAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGltYWdWYWx1ZXMsICAvKiE8IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG51bWJlckJhbmRzLCAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbnVtYmVyQ29scywgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpxbWZTY2FsZSwgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKmVuZXJneVNjYWxlKSAgICAgICAgICAgICAgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLworeworICBpbnQgaiwgazsKKyAgaW50IHNjYWxlOworICBGSVhQX0RCTCBtYXhfdmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgLyogR2V0IFNjcmF0Y2ggYnVmZmVyICovCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfTUFYX1RJTUVfU0xPVFMqUU1GX0NIQU5ORUxTLzIpOworCisgIEZES19BU1NFUlQobnVtYmVyQmFuZHMgPD0gUU1GX0NIQU5ORUxTKTsKKyAgRkRLX0FTU0VSVChudW1iZXJDb2xzIDw9IFFNRl9NQVhfVElNRV9TTE9UUy8yKTsKKworICAvKiBHZXQgbWF4IHBvc3NpYmxlIHNjYWxpbmcgb2YgUU1GIGRhdGEgKi8KKyAgc2NhbGUgPSBERlJBQ1RfQklUUzsKKyAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKSB7CisgICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksIGdldFNjYWxlZmFjdG9yKGltYWdWYWx1ZXNba10sIG51bWJlckJhbmRzKSkpOworICB9CisKKyAgLyogVHdlYWsgc2NhbGluZyBzdGFiaWxpdHkgZm9yIHplcm8gc2lnbmFsIHRvIG5vbi16ZXJvIHNpZ25hbCB0cmFuc2l0aW9ucyAqLworICBpZiAoc2NhbGUgPj0gREZSQUNUX0JJVFMtMSkgeworICAgIHNjYWxlID0gKEZSQUNUX0JJVFMtMS0qcW1mU2NhbGUpOworICB9CisgIC8qIHByZXZlbnQgc2NhbGluZyBvZiBRRk0gdmFsdWVzIHRvIC0xLmYgKi8KKyAgc2NhbGUgPSBmaXhNYXgoMCxzY2FsZS0xKTsKKworICAvKiBVcGRhdGUgUU1GIHNjYWxlICovCisgICpxbWZTY2FsZSArPSBzY2FsZTsKKworICAvKgorICAgICBDYWxjdWxhdGUgZW5lcmd5IG9mIGVhY2ggdGltZSBzbG90IHBhaXIsIG1heCBlbmVyZ3kKKyAgICAgYW5kIHNoaWZ0IFFNRiB2YWx1ZXMgYXMgZmFyIGFzIHBvc3NpYmxlIHRvIHRoZSBsZWZ0LgorICAgKi8KKyAgeworICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CisgICAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKQorICAgIHsKKyAgICAgIC8qIExvYWQgYmFuZCB2ZWN0b3IgYWRkcmVzc2VzIG9mIDIgY29uc2VjdXRpdmUgdGltZXNsb3RzICovCisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcjAgPSByZWFsVmFsdWVzW2tdOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkwID0gaW1hZ1ZhbHVlc1trXTsKKyAgICAgIGZvciAoaj0wOyBqPG51bWJlckJhbmRzOyBqKyspCisgICAgICB7CisgICAgICAgIEZJWFBfREJMICBlbmVyZ3k7CisgICAgICAgIEZJWFBfREJMICB0cjAsdGkwOworCisgICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAyIHRpbWVzbG90cyAqLworICAgICAgICB0cjAgPSByMFtqXTsgdGkwID0gaTBbal07CisKKyAgICAgICAgLyogU2NhbGUgUU1GIFZhbHVlcyBhbmQgQ2FsYyBFbmVyZ3kgb2YgYm90aCB0aW1lc2xvdHMgKi8KKyAgICAgICAgdHIwIDw8PSBzY2FsZTsKKyAgICAgICAgdGkwIDw8PSBzY2FsZTsKKyAgICAgICAgZW5lcmd5ID0gZlBvdzJBZGREaXYyKGZQb3cyRGl2Mih0cjApLCB0aTApOworICAgICAgICAqbnJnVmFsdWVzKysgPSBlbmVyZ3k7CisKKyAgICAgICAgbWF4X3ZhbCA9IGZpeE1heChtYXhfdmFsLCBlbmVyZ3kpOworCisgICAgICAgIC8qIFdyaXRlIGJhY2sgc2NhbGVkIFFNRiB2YWx1ZXMgKi8KKyAgICAgICAgcjBbal0gPSB0cjA7IGkwW2pdID0gdGkwOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBlbmVyZ3lTY2FsZTogc2NhbGVmYWN0b3IgZW5lcmdpZXMgb2YgY3VycmVudCBmcmFtZSAqLworICAqZW5lcmd5U2NhbGUgPSAyKigqcW1mU2NhbGUpLTE7ICAgICAgIC8qIGlmIHFtZlNjYWxlID4gMDogbnIgb2YgcmlnaHQgc2hpZnRzIG90aGVyd2lzZSBuciBvZiBsZWZ0IHNoaWZ0cyAqLworCisgIC8qIFNjYWxlIHRpbWVzbG90IHBhaXIgZW5lcmdpZXMgYW5kIHdyaXRlIHRvIG91dHB1dCBidWZmZXIgKi8KKyAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG1heF92YWwpOworICB7CisgIAlGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOworICAgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgeworICAgICAgc2NhbGVWYWx1ZXMoZW5lcmd5VmFsdWVzW2tdLCBucmdWYWx1ZXMsIG51bWJlckJhbmRzLCBzY2FsZSk7CisgICAgICBucmdWYWx1ZXMgKz0gbnVtYmVyQmFuZHM7CisgICAgfQorICAgICplbmVyZ3lTY2FsZSArPSBzY2FsZTsKKyAgfQorCisgIC8qIEZyZWUgU2NyYXRjaCBidWZmZXIgKi8KKyAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfTUFYX1RJTUVfU0xPVFMqUU1GX0NIQU5ORUxTLzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBRdWFudGlzYXRpb24gb2YgdGhlIHBhbm9yYW1hIHZhbHVlIChiYWxhbmNlKQorCisgIFxyZXR1cm4gdGhlIHF1YW50aXplZCBwYW4gdmFsdWUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK21hcFBhbm9yYW1hKElOVCBucmdWYWwsICAgICAvKiEgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZW5lcmd5ICovCisgICAgICAgICAgICBJTlQgYW1wUmVzLCAgICAgLyohIGFtcGxpdHVkZSByZXNvbHV0aW9uIFsxLjUvM2RCXSAqLworICAgICAgICAgICAgSU5UICpxdWFudEVycm9yIC8qISBxdWFudGl6YXRpb24gZXJyb3Igb2YgZW5lcmd5IHZhbCovCisgICAgICAgICAgICkKK3sKKyAgaW50IGk7CisgIElOVCBtaW5fdmFsLCB2YWw7CisgIFVDSEFSIHBhbkluZGV4OworICBJTlQgc2lnbjsKKworICBzaWduID0gbnJnVmFsID4gMCA/IDEgOiAtMTsKKworICBucmdWYWwgKj0gc2lnbjsKKworICBtaW5fdmFsID0gRkRLX0lOVF9NQVg7CisgIHBhbkluZGV4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG1heEluZGV4W2FtcFJlc107IGkrKykgeworICAgIHZhbCA9IGZpeHBfYWJzICgobnJnVmFsIC0gKElOVClwYW5UYWJsZVthbXBSZXNdW2ldKSk7CisKKyAgICBpZiAodmFsIDwgbWluX3ZhbCkgeworICAgICAgbWluX3ZhbCA9IHZhbDsKKyAgICAgIHBhbkluZGV4ID0gaTsKKyAgICB9CisgIH0KKworICAqcXVhbnRFcnJvcj1taW5fdmFsOworCisgIHJldHVybiBwYW5UYWJsZVthbXBSZXNdW21heEluZGV4W2FtcFJlc10tMV0gKyBzaWduICogcGFuVGFibGVbYW1wUmVzXVtwYW5JbmRleF07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgUXVhbnRpc2F0aW9uIG9mIHRoZSBub2lzZSBmbG9vciBsZXZlbHMKKworICBccmV0dXJuIHZvaWQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKFNDSEFSICAgICpSRVNUUklDVCBpTm9pc2VMZXZlbHMsIC8qISBxdWFudGl6ZWQgbm9pc2UgbGV2ZWxzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBOb2lzZUxldmVscywgIC8qISB0aGUgbm9pc2UgbGV2ZWxzICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgY291cGxpbmcgICAgICAgICAgICAgICAvKiEgdGhlIGNvdXBsaW5nIGZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpOworICBJTlQgdG1wLCBkdW1teTsKKworICAvKiBRdWFudGlzYXRpb24sIHNpbWlsYXIgdG8gc2ZiIHF1YW50Li4uICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKSB7CisgICAgLyogdG1wID0gTm9pc2VMZXZlbHNbaV0gPiAoUEZMT0FUKTMwLjBmID8gMzA6IChJTlQpIChOb2lzZUxldmVsc1tpXSArIChQRkxPQVQpMC41KTsgKi8KKyAgICAvKiAzMD4+NiA9IDAuNDY4NzUgKi8KKyAgICBpZiAoKEZJWFBfREJMKU5vaXNlTGV2ZWxzW2ldID4gRkwyRlhDT05TVF9EQkwoMC40Njg3NWYpKSB7CisgICAgICB0bXAgPSAzMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiB0bXAgPSAoSU5UKSgoRklYUF9EQkwpTm9pc2VMZXZlbHNbaV0gKyAoRkwyRlhDT05TVF9EQkwoMC41Zik+PigqLyAvKiBGUkFDVF9CSVRTKyAqLyAvKiA2LTEpKSk7Ki8KKyAgICAgIC8qIHRtcCA9IHRtcCA+PiAoREZSQUNUX0JJVFMtMS02KTsgKi8gLyogY29udmVyc2lvbiB0byBpbnRlZ2VyIGhhcHBlbnMgaGVyZSAqLworICAgICAgLyogcm91bmRpbmcgaXMgZG9uZSBieSBzaGlmdGluZyBvbmUgYml0IGxlc3MgdGhhbiBuZWNlc3NhcnkgdG8gdGhlIHJpZ2h0LCBhZGRpbmcgJzEnIGFuZCB0aGVuIHNoaWZ0aW5nIHRoZSBmaW5hbCBiaXQgKi8KKyAgICAgIHRtcCA9ICgoKChJTlQpTm9pc2VMZXZlbHNbaV0pPj4oREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsgLyogY29udmVyc2lvbiB0byBpbnRlZ2VyICovCisJCQkgaWYgKHRtcCAhPSAwKQorCQkJICAgdG1wICs9IDE7CisgICAgfQorCisgICAgaWYgKGNvdXBsaW5nKSB7CisgICAgICB0bXAgPSB0bXAgPCAtMzAgPyAtMzAgOiB0bXA7CisgICAgICB0bXAgPSBtYXBQYW5vcmFtYSAodG1wLDEsJmR1bW15KTsKKyAgICB9CisgICAgaU5vaXNlTGV2ZWxzW2ldID0gdG1wOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKworICBcYnJpZWYgIENhbGN1bGF0aW9uIG9mIG5vaXNlIGZsb29yIGZvciBjb3VwbGluZworCisgIFxyZXR1cm4gdm9pZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2NvdXBsZU5vaXNlRmxvb3IoRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX2xlZnQsIC8qISBub2lzZSBsZXZlbCBsZWZ0ICAobW9kaWZpZWQpKi8KKyAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX3JpZ2h0IC8qISBub2lzZSBsZXZlbCByaWdodCAobW9kaWZpZWQpKi8KKyAgICAgICAgICAgICAgICApCit7CisgIEZJWFBfREJMIGNtcFZhbExlZnQsY21wVmFsUmlnaHQ7CisgIElOVCBpOworICBGSVhQX0RCTCB0ZW1wMSx0ZW1wMjsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgeworCisgICAgLyogQ2FsY3VsYXRpb24gb2YgdGhlIHBvd2VyIGZ1bmN0aW9uIHVzaW5nIGxkNjQ6CisgICAgICAgeiAgPSB4Xnk7CisgICAgICAgeicgPSBDYWxjTGQ2NCh6KSA9IHkqQ2FsY0xkNjQoeCkvNjQ7CisgICAgICAgeiAgPSBDYWxjSW52TGQ2NCh6Jyk7CisgICAgKi8KKyAgICBjbXBWYWxMZWZ0ICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV07CisgICAgY21wVmFsUmlnaHQgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9yaWdodFtpXTsKKworICAgIGlmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICB0ZW1wMSA9IENhbGNJbnZMZERhdGEoTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfcmlnaHRbaV0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRlbXAxID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9yaWdodFtpXSk7CisgICAgICB0ZW1wMSA9IHRlbXAxIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mIENhbGNJbnZMZERhdGEgaXMgcG9zaXRpdiAqLworICAgIH0KKworICAgIGlmIChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHRlbXAyID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZW1wMiA9IENhbGNJbnZMZERhdGEoTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfbGVmdFtpXSk7CisgICAgICB0ZW1wMiA9IHRlbXAyIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mIENhbGNJbnZMZERhdGEgaXMgcG9zaXRpdiAqLworICAgIH0KKworCisgICAgaWYgKChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4xKSArICh0ZW1wMj4+MSkpKSk7IC8qIG5vIHNjYWxpbmcgbmVlZGVkISBib3RoIHZhbHVlcyBhcmUgZGZyYWN0ICovCisgICAgICBub2lzZV9sZXZlbF9yaWdodFtpXSA9IENhbGNMZERhdGEodGVtcDIpIC0gQ2FsY0xkRGF0YSh0ZW1wMSk7CisgICAgfQorCisgICAgaWYgKChjbXBWYWxMZWZ0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoY21wVmFsUmlnaHQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4xKSkpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KKyAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSBDYWxjTGREYXRhKHRlbXAxKTsKKyAgICB9CisKKyAgICBpZiAoKGNtcFZhbExlZnQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4oNysxKSkgKyAodGVtcDI+PjEpKSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLworICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSAoQ2FsY0xkRGF0YSh0ZW1wMikgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKSAtIENhbGNMZERhdGEodGVtcDEpOworICAgIH0KKworICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoY21wVmFsUmlnaHQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4oNysxKSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCisgICAgICBub2lzZV9sZXZlbF9yaWdodFtpXSA9IENhbGNMZERhdGEodGVtcDIpIC0gKENhbGNMZERhdGEodGVtcDEpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgQ2FsY3VsYXRpb24gb2YgZW5lcmd5IHN0YXJ0aW5nIGluIGxvd2VyIGJhbmQgKGxpKSB1cCB0byB1cHBlciBiYW5kICh1aSkKKyAgICAgICAgICBvdmVyIHNsb3RzIChzdGFydF9wb3MpIHRvIChzdG9wX3BvcykKKworICBccmV0dXJuIHZvaWQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGSVhQX0RCTAorZ2V0RW52U2ZiRW5lcmd5KElOVCBsaSwgICAgICAgICAgICAgIC8qISBsb3dlciBiYW5kICovCisgICAgICAgICAgICAgICAgSU5UIHVpLCAgICAgICAgICAgICAgLyohIHVwcGVyIGJhbmQgKi8KKyAgICAgICAgICAgICAgICBJTlQgc3RhcnRfcG9zLCAgICAgICAvKiEgc3RhcnQgc2xvdCAqLworICAgICAgICAgICAgICAgIElOVCBzdG9wX3BvcywgICAgICAgIC8qISBzdG9wIHNsb3QgKi8KKyAgICAgICAgICAgICAgICBJTlQgYm9yZGVyX3BvcywgICAgICAvKiEgc2xvdHMgc2NhbGluZyBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKllCdWZmZXIsICAvKiEgc2ZiIGVuZXJneSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBJTlQgWUJ1ZmZlclN6U2hpZnQsICAvKiEgRW5lcmd5IGJ1ZmZlciBpbmRleCBzY2FsZSAqLworICAgICAgICAgICAgICAgIElOVCBzY2FsZU5yZzAsICAgICAgIC8qISBzY2FsaW5nIG9mIGxvd2VyIHNsb3RzICovCisgICAgICAgICAgICAgICAgSU5UIHNjYWxlTnJnMSkgICAgICAgLyohIHNjYWxpbmcgb2YgdXBwZXIgc2xvdHMgKi8KK3sKKyAgLyogdXNlIGR5bmFtaWMgc2NhbGluZyBmb3Igb3V0ZXIgZW5lcmd5IGxvb3A7CisgICAgIGVuZXJnaWVzIGFyZSBjcml0aWNhbCBhbmQgZXZlcnkgYml0IGlzIGltcG9ydGFudCAqLworICBpbnQgc2MwLCBzYzEsIGssIGw7CisKKyAgRklYUF9EQkwgbnJnU3VtLCBucmcxLCBucmcyLCBhY2N1MSwgYWNjdTI7CisgIElOVCBkeW5TY2FsZSwgZHluU2NhbGUxLCBkeW5TY2FsZTI7CisgIGlmKHVpLWxpPT0wKSBkeW5TY2FsZSA9IERGUkFDVF9CSVRTLTE7CisgIGVsc2UKKyAgZHluU2NhbGUgPSBDYWxjTGRJbnQodWktbGkpPj4oREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKTsKKworICBzYzAgPSBmaXhNaW4oc2NhbGVOcmcwLFlfTlJHX1NDQUxFKTsgc2MxID0gZml4TWluKHNjYWxlTnJnMSxZX05SR19TQ0FMRSk7CisgIC8qIGR5blNjYWxlezEsMn0gaXMgc2V0IHN1Y2ggdGhhdCB0aGUgcmlnaHQgc2hpZnQgYmVsb3cgaXMgcG9zaXRpdmUgKi8KKyAgZHluU2NhbGUxID0gZml4TWluKChzY2FsZU5yZzAtc2MwKSxkeW5TY2FsZSk7CisgIGR5blNjYWxlMiA9IGZpeE1pbigoc2NhbGVOcmcxLXNjMSksZHluU2NhbGUpOworICBucmdTdW0gPSBhY2N1MSA9IGFjY3UyID0gKEZJWFBfREJMKTA7CisKKyAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgbnJnMSA9IG5yZzIgPSAoRklYUF9EQkwpMDsKKyAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBib3JkZXJfcG9zOyBsKyspIHsKKyAgICAgIG5yZzEgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MwOworICAgIH0KKyAgICBmb3IgKDsgbCA8IHN0b3BfcG9zOyBsKyspIHsKKyAgICAgIG5yZzIgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MxOworICAgIH0KKyAgICBhY2N1MSArPSAobnJnMT4+ZHluU2NhbGUxKTsKKyAgICBhY2N1MiArPSAobnJnMj4+ZHluU2NhbGUyKTsKKyAgfQorICAvKiBUaGlzIHNoaWZ0IGZhY3RvciBpcyBhbHdheXMgcG9zaXRpdmUuIFNlZSBjb21tZW50IGFib3ZlLiAqLworICBucmdTdW0gKz0gKCBhY2N1MSA+PiBmaXhNaW4oKHNjYWxlTnJnMC1zYzAtZHluU2NhbGUxKSwoREZSQUNUX0JJVFMtMSkpICkKKyAgICAgICAgICArICAoIGFjY3UyID4+IGZpeE1pbigoc2NhbGVOcmcxLXNjMS1keW5TY2FsZTIpLChERlJBQ1RfQklUUy0xKSkgKTsKKworICByZXR1cm4gbnJnU3VtOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBFbmVyZ3kgY29tcGVuc2F0aW9uIGluIG1pc3NpbmcgaGFybW9uaWMgbW9kZQorCisgIFxyZXR1cm4gdm9pZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZJWFBfREJMCittaExvd2VyaW5nRW5lcmd5KEZJWFBfREJMIG5yZywgSU5UIE0pCit7CisgIC8qCisgICAgIENvbXBlbnNhdGluZyBmb3IgdGhlIGZhY3QgdGhhdCB3ZSBpbiB0aGUgZGVjb2RlciBtYXAgdGhlICJhdmVyYWdlIGVuZXJneSB0byBldmVyeSBRTUYKKyAgICAgYmFuZCwgYW5kIHVzZSB0aGlzIHdoZW4gd2UgY2FsY3VsYXRlIHRoZSBib29zdC1mYWN0b3IuIFNpbmNlIHRoZSBtYXBwZWQgZW5lcmd5IGlzbid0CisgICAgIHRoZSBhdmVyYWdlIGVuZXJneSBidXQgdGhlIG1heGltdW0gZW5lcmd5IGluIGNhc2Ugb2YgbWlzc2luZyBoYXJtb25pYyBjcmVhdGlvbiwgd2Ugd2lsbAorICAgICBpbiB0aGUgYm9vc3QgZnVuY3Rpb24gY2FsY3VsYXRlIHRoYXQgdG9vIG11Y2ggbGltaXRpbmcgaGFzIGJlZW4gYXBwbGllZCBhbmQgaGVuY2Ugd2Ugd2lsbAorICAgICBib29zdCB0aGUgc2lnbmFsIGFsdGhvdWdoIGl0IGlzbid0IGNhbGxlZCBmb3IuIEhlbmNlIHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBieQorICAgICBsb3dlcmluZyB0aGUgdHJhbnNtaXR0ZWQgZW5lcmd5IHZhbHVlcyBmb3IgdGhlIHNpbmVzIHNvIHRoZXkgd2lsbCBnZXQgdGhlIGNvcnJlY3QgbGV2ZWwKKyAgICAgYWZ0ZXIgdGhlIGJvb3N0IGlzIGFwcGxpZWQuCisgICovCisgIGlmKE0gPiAyKXsKKyAgICBJTlQgdG1wU2NhbGU7CisgICAgdG1wU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG5yZyk7CisgICAgbnJnIDw8PSB0bXBTY2FsZTsKKyAgICBucmcgPSBmTXVsdChucmcsIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MjY3ZikpOyAvKiBUaGUgbWF4aW11bSBib29zdCBpcyAxLjU4NDg5Mywgc28gdGhlIG1heGltdW0gYXR0ZW51YXRpb24gc2hvdWxkIGJlIHNxdWFyZSgxLzEuNTg0ODkzKSA9IDAuMzk4MTA3MjY3ICovCisgICAgbnJnID4+PSB0bXBTY2FsZTsKKyAgfQorICBlbHNleworICAgIGlmKE0gPiAxKXsKKyAgICAgIG5yZyA+Pj0gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnJnOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBFbmVyZ3kgY29tcGVuc2F0aW9uIGluIG5vbmUgbWlzc2luZyBoYXJtb25pYyBtb2RlCisKKyAgXHJldHVybiB2b2lkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRklYUF9EQkwgbm1oTG93ZXJpbmdFbmVyZ3koCisgICAgICAgIEZJWFBfREJMIG5yZywKKyAgICAgICAgY29uc3QgRklYUF9EQkwgbnJnU3VtLAorICAgICAgICBjb25zdCBJTlQgbnJnU3VtX3NjYWxlLAorICAgICAgICBjb25zdCBJTlQgTQorICAgICAgICApCit7CisgIGlmIChucmc+RkwyRlhDT05TVF9EQkwoMCkpIHsKKyAgICBpbnQgc2M9MDsKKyAgICAvKiBnYWluID0gbnJnU3VtIC8gKG5yZyooTSsxKSkgKi8KKyAgICBGSVhQX0RCTCBnYWluID0gZk11bHQoZkRpdk5vcm0obnJnU3VtLCBucmcsICZzYyksIEdldEludkludChNKzEpKTsKKyAgICBzYyArPSBucmdTdW1fc2NhbGU7CisKKyAgICAvKiByZWR1Y2UgbnJnIGlmIGdhaW4gc21hbGxlciAxLmYgKi8KKyAgICBpZiAoICEoKHNjPj0wKSAmJiAoIGdhaW4gPiAoKEZJWFBfREJMKU1BWFZBTF9EQkw+PnNjKSApKSApIHsKKyAgICAgIG5yZyA9IGZNdWx0KHNjYWxlVmFsdWUoZ2FpbixzYyksIG5yZyk7CisgICAgfQorICB9CisgIHJldHVybiBucmc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKworICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIGVudmVsb3BlIHZhbHVlcyBmcm9tIHRoZSBlbmVyZ2llcywgZGVwZW5kaW5nIG9uCisgICAgICAgICAgZnJhbWluZyBhbmQgc3RlcmVvIG1vZGUKKworICBccmV0dXJuIHZvaWQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVTYnJFbnZlbG9wZSAoRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyTGVmdCwgIC8qISBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIFlCdWZmZXJSaWdodCwgLyohIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJFU1RSSUNUIFlCdWZmZXJTY2FsZUxlZnQsICAgLyohIHNjYWxlIGVuZXJneSBidWZmZXIgbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgWUJ1ZmZlclNjYWxlUmlnaHQsICAvKiEgc2NhbGUgZW5lcmd5IGJ1ZmZlciByaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvLCAvKiEgZnJhbWUgaW5mbyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ0xlZnQsICAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ1JpZ2h0LCAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgICAgIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLworICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX3NiciwgICAgICAgICAvKiEgZW52ZWxvcGUgY2hhbm5lbCBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSwgICAgICAgLyohIHN0ZXJlbyBjb2RpbmcgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgIElOVCogbWF4UXVhbnRFcnJvciwgICAgICAgICAgICAgICAvKiEgbWF4aW11bSBxdWFudGl6YXRpb24gZXJyb3IsIGZvciBwYW5vcmFtYS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQpICAgICAgICAgICAgICAgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KKworeworICBpbnQgaSwgaiwgbSA9IDA7CisgIElOVCBub19vZl9iYW5kcywgc3RhcnRfcG9zLCBzdG9wX3BvcywgbGksIHVpOworICBGUkVRX1JFUyBmcmVxX3JlczsKKworICBJTlQgY2EgPSAyIC0gaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlczsKKyAgSU5UIG9uZUJpdExlc3MgPSAwOworICBpZiAoY2EgPT0gMikKKyAgICBvbmVCaXRMZXNzID0gMTsgLyogTERfREFUQV9TSElGVCA9PiBsZDY0IHNjYWxpbmc7IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KKworICBJTlQgcXVhbnRFcnJvcjsKKyAgSU5UIG5FbnZlbG9wZXMgPSBmcmFtZV9pbmZvLT5uRW52ZWxvcGVzOworICBJTlQgc2hvcnRfZW52ID0gZnJhbWVfaW5mby0+c2hvcnRFbnYgLSAxOworICBJTlQgdGltZVN0ZXAgPSBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLnRpbWVfc3RlcDsKKyAgSU5UIGNvbW1vblNjYWxlLHNjYWxlTGVmdDAsc2NhbGVMZWZ0MTsKKyAgSU5UIHNjYWxlUmlnaHQwPTAsc2NhbGVSaWdodDE9MDsKKworICBjb21tb25TY2FsZSA9IGZpeE1pbihZQnVmZmVyU2NhbGVMZWZ0WzBdLFlCdWZmZXJTY2FsZUxlZnRbMV0pOworCisgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgeworICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLFlCdWZmZXJTY2FsZVJpZ2h0WzBdKTsKKyAgICBjb21tb25TY2FsZSA9IGZpeE1pbihjb21tb25TY2FsZSxZQnVmZmVyU2NhbGVSaWdodFsxXSk7CisgIH0KKworICBjb21tb25TY2FsZSA9IGNvbW1vblNjYWxlIC0gNzsKKworICBzY2FsZUxlZnQwID0gWUJ1ZmZlclNjYWxlTGVmdFswXSAtIGNvbW1vblNjYWxlOworICBzY2FsZUxlZnQxID0gWUJ1ZmZlclNjYWxlTGVmdFsxXSAtIGNvbW1vblNjYWxlIDsKKyAgRkRLX0FTU0VSVCAoKHNjYWxlTGVmdDAgPj0gMCkgJiYgKHNjYWxlTGVmdDEgPj0gMCkpOworCisgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgeworICAgIHNjYWxlUmlnaHQwID0gWUJ1ZmZlclNjYWxlUmlnaHRbMF0gLSBjb21tb25TY2FsZTsKKyAgICBzY2FsZVJpZ2h0MSA9IFlCdWZmZXJTY2FsZVJpZ2h0WzFdIC0gY29tbW9uU2NhbGU7CisgICAgRkRLX0FTU0VSVCAoKHNjYWxlUmlnaHQwID49IDApICYmIChzY2FsZVJpZ2h0MSA+PSAwKSk7CisgICAgKm1heFF1YW50RXJyb3IgPSAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgeworCisgICAgRklYUF9EQkwgcE5yZ0xlZnRbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgICBGSVhQX0RCTCBwTnJnUmlnaHRbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgICBpbnQgZW52TnJnX3NjYWxlOworICAgIEZJWFBfREJMIGVudk5yZ0xlZnQgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgRklYUF9EQkwgZW52TnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBpbnQgICAgICBtaXNzaW5nSGFybW9uaWNbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgICBpbnQgICAgICBjb3VudFtRTUZfTUFYX1RJTUVfU0xPVFNdOworCisgICAgc3RhcnRfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2ldOworICAgIHN0b3BfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2kgKyAxXTsKKyAgICBmcmVxX3JlcyA9IGZyYW1lX2luZm8tPmZyZXFSZXNbaV07CisgICAgbm9fb2ZfYmFuZHMgPSBoX2Nvbi0+blNmYltmcmVxX3Jlc107CisgICAgZW52TnJnX3NjYWxlID0gREZSQUNUX0JJVFMtZk5vcm16KChGSVhQX0RCTClub19vZl9iYW5kcyk7CisKKyAgICBpZiAoaSA9PSBzaG9ydF9lbnYpIHsKKyAgICAgIHN0b3BfcG9zIC09IGZpeE1heCgyLCB0aW1lU3RlcCk7ICAvKiBjb25zaWRlciBhdCBsZWFzdCAyIFFNRiBzbG90cyBsZXNzIGZvciBzaG9ydCBlbnZlbG9wZXMgKGVudmVsb3BlcyBqdXN0IGJlZm9yZSB0cmFuc2llbnRzKSAqLworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBub19vZl9iYW5kczsgaisrKSB7CisgICAgICBGSVhQX0RCTCBucmdMZWZ0ICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgRklYUF9EQkwgbnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgbGkgPSBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc11bal07CisgICAgICB1aSA9IGhfY29uLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXVtqICsgMV07CisKKyAgICAgIGlmKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpeworICAgICAgICBpZihqID09IDAgJiYgdWktbGkgPiAxKXsKKyAgICAgICAgICBsaSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNleworICAgICAgICBpZihqID09IDAgJiYgdWktbGkgPiAyKXsKKyAgICAgICAgICBsaSsrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgIEZpbmQgb3V0IHdoZXRoZXIgYSBzaW5lIHdpbGwgYmUgbWlzc2luZyBpbiB0aGUgc2NhbGUtZmFjdG9yCisgICAgICAgIGJhbmQgdGhhdCB3ZSdyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICAgICovCisgICAgICBtaXNzaW5nSGFybW9uaWNbal0gPSAwOworCisgICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcpeworCisgICAgICAgIGlmKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpeworICAgICAgICAgIGlmKGhfc2JyLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljW2pdKXsgICAgLypBIG1pc3Npbmcgc2luZSBpbiB0aGUgY3VycmVudCBiYW5kKi8KKyAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY1tqXSA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgSU5UIGk7CisgICAgICAgICAgSU5UIHN0YXJ0QmFuZEhpZ2ggPSAwOworICAgICAgICAgIElOVCBzdG9wQmFuZEhpZ2ggPSAwOworCisgICAgICAgICAgd2hpbGUoaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfSElHSF1bc3RhcnRCYW5kSGlnaF0gPCBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19MT1ddW2pdKQorICAgICAgICAgICAgc3RhcnRCYW5kSGlnaCsrOworICAgICAgICAgIHdoaWxlKGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0hJR0hdW3N0b3BCYW5kSGlnaF0gPCBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19MT1ddW2ogKyAxXSkKKyAgICAgICAgICAgIHN0b3BCYW5kSGlnaCsrOworCisgICAgICAgICAgZm9yKGkgPSBzdGFydEJhbmRIaWdoOyBpPHN0b3BCYW5kSGlnaDsgaSsrKXsKKyAgICAgICAgICAgIGlmKGhfc2JyLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljW2ldKXsKKyAgICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAgSWYgYSBzaW5lIGlzIG1pc3NpbmcgaW4gYSBzY2FsZWZhY3RvcmJhbmQsIHdpdGggbW9yZSB0aGFuIG9uZSBxbWYgY2hhbm5lbAorICAgICAgICB1c2UgdGhlIG5yZyBmcm9tIHRoZSBjaGFubmVsIHdpdGggdGhlIGxhcmdlc3QgbnJnIHJhdGhlciB0aGFuIHRoZSBtZWFuLgorICAgICAgICBDb21wZW5zYXRlIGZvciB0aGUgYm9vc3QgY2FsY3VsYXRpb24gaW4gdGhlIGRlY2RvZGVyLgorICAgICAgKi8KKyAgICAgIGludCBib3JkZXJfcG9zID0gZml4TWluKHN0b3BfcG9zLCBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldDw8WUJ1ZmZlclN6U2hpZnQpOworCisgICAgICBpZihtaXNzaW5nSGFybW9uaWNbal0peworCisgICAgICAgIGludCBrOworICAgICAgICBjb3VudFtqXSA9IHN0b3BfcG9zIC0gc3RhcnRfcG9zOworICAgICAgICBucmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgICAgICAgRklYUF9EQkwgdG1wTnJnOworICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MSk7CisKKyAgICAgICAgICBucmdMZWZ0ID0gZml4TWF4KG5yZ0xlZnQsIHRtcE5yZyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBFbmVyZ3kgbG93ZXJpbmcgY29tcGVuc2F0aW9uICovCisgICAgICAgIG5yZ0xlZnQgPSBtaExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIHVpLWxpKTsKKworICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKKworICAgICAgICAgIG5yZ1JpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKKyAgICAgICAgICAgIEZJWFBfREJMIHRtcE5yZzsKKyAgICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDEpOworCisgICAgICAgICAgICBucmdSaWdodCA9IGZpeE1heChucmdSaWdodCwgdG1wTnJnKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBFbmVyZ3kgbG93ZXJpbmcgY29tcGVuc2F0aW9uICovCisgICAgICAgICAgbnJnUmlnaHQgPSBtaExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCB1aS1saSk7CisgICAgICAgIH0KKyAgICAgIH0gLyogZW5kIG1pc3NpbmdIYXJtb25pYyAqLworICAgICAgZWxzZXsKKyAgICAgICAgY291bnRbal0gPSAoc3RvcF9wb3MgLSBzdGFydF9wb3MpICogKHVpIC0gbGkpOworCisgICAgICAgIG5yZ0xlZnQgPSBnZXRFbnZTZmJFbmVyZ3kobGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlckxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUxlZnQxKTsKKworICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKKyAgICAgICAgICBucmdSaWdodCA9IGdldEVudlNmYkVuZXJneShsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDEpOworICAgICAgICB9CisgICAgICB9IC8qICFtaXNzaW5nSGFybW9uaWMgKi8KKworICAgICAgLyogc2F2ZSBlbmVyZ2llcyAqLworICAgICAgcE5yZ0xlZnRbal0gID0gbnJnTGVmdDsKKyAgICAgIHBOcmdSaWdodFtqXSA9IG5yZ1JpZ2h0OworICAgICAgZW52TnJnTGVmdCAgKz0gKG5yZ0xlZnQ+PmVudk5yZ19zY2FsZSk7CisgICAgICBlbnZOcmdSaWdodCArPSAobnJnUmlnaHQ+PmVudk5yZ19zY2FsZSk7CisgICAgfSAvKiBqICovCisKKyAgICBmb3IgKGogPSAwOyBqIDwgbm9fb2ZfYmFuZHM7IGorKykgeworCisgICAgICBGSVhQX0RCTCBucmdMZWZ0MiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgRklYUF9EQkwgbnJnTGVmdCAgPSBwTnJnTGVmdFtqXTsKKyAgICAgIEZJWFBfREJMIG5yZ1JpZ2h0ID0gcE5yZ1JpZ2h0W2pdOworCisgICAgICAvKiBOb25lIG1pc3NpbmcgaGFybW9uaWMgRW5lcmd5IGxvd2VyaW5nIGNvbXBlbnNhdGlvbiAqLworICAgICAgaWYoIW1pc3NpbmdIYXJtb25pY1tqXSAmJiBoX3Nici0+ZkxldmVsUHJvdGVjdCkgeworICAgICAgICAvKiBpbiBjYXNlIG9mIG1pc3NpbmcgZW5lcmd5IGluIGJhc2UgYmFuZCwKKyAgICAgICAgICAgcmVkdWNlIHJlZmVyZW5jZSBlbmVyZ3kgdG8gcHJldmVudCBvdmVyZmxvd3MgaW4gZGVjb2RlciBvdXRwdXQgKi8KKyAgICAgICAgbnJnTGVmdCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIGVudk5yZ0xlZnQsIGVudk5yZ19zY2FsZSwgbm9fb2ZfYmFuZHMpOworICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKKyAgICAgICAgICBucmdSaWdodCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCBlbnZOcmdSaWdodCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CisgICAgICAgIC8qIGNhbGMgb3BlcmF0aW9uIGxhdGVyIHdpdGggbG9nICovCisgICAgICAgIG5yZ0xlZnQyID0gbnJnTGVmdDsKKyAgICAgICAgbnJnTGVmdCA9IChucmdSaWdodCArIG5yZ0xlZnQpID4+IDE7CisgICAgICB9CisKKyAgICAgIC8qIG5yZ0xlZnQgPSBmMjBfbG9nMihucmdMZWZ0IC8gKFBGTE9BVCkoY291bnQgKiBoX3Nici0+c2JyUW1mLm5vX2NoYW5uZWxzKSkrKFBGTE9BVCk0NDsgKi8KKyAgICAgIC8qIElmIG5yZ0xlZnQgPT0gMCB0aGVuIHRoZSBMb2cgY2FsY3VsYXRpb25zIGJlbG93IGRvIGZhaWwuICovCisgICAgICBpZiAobnJnTGVmdCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgeworICAgICAgICBGSVhQX0RCTCB0bXAwLHRtcDEsdG1wMix0bXAzOworICAgICAgICBJTlQgdG1wU2NhbGU7CisKKyAgICAgICAgdG1wU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG5yZ0xlZnQpOworICAgICAgICBucmdMZWZ0ID0gbnJnTGVmdCA8PCB0bXBTY2FsZTsKKworICAgICAgICB0bXAwID0gQ2FsY0xkRGF0YShucmdMZWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KKyAgICAgICAgdG1wMSA9ICgoRklYUF9EQkwpIChjb21tb25TY2FsZSt0bXBTY2FsZSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCisgICAgICAgIHRtcDIgPSAoKEZJWFBfREJMKShjb3VudFtqXSpoX2Nvbi0+bm9RbWZCYW5kcykpIDw8IChERlJBQ1RfQklUUy0xLTE0LTEpOworICAgICAgICB0bXAyID0gQ2FsY0xkRGF0YSh0bXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KKyAgICAgICAgdG1wMyA9IEZMMkZYQ09OU1RfREJMKDAuNjg3NWYtMC4yMTg3NWYtMC4wMTU2MjVmKT4+MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCisKKyAgICAgICAgbnJnTGVmdCA9ICgodG1wMC10bXAyKT4+MSkgKyAodG1wMyAtIHRtcDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgIH0KKworICAgICAgLyogbGQ2NCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gKi8KKyAgICAgIG5yZ0xlZnQgPSBmaXhNaW4oZml4TWF4KG5yZ0xlZnQsRkwyRlhDT05TVF9EQkwoMC4wZikpLChGTDJGWENPTlNUX0RCTCgwLjVmKT4+b25lQml0TGVzcykpOworICAgICAgbnJnTGVmdCA9IChGSVhQX0RCTCkoTE9ORylucmdMZWZ0ID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMS1vbmVCaXRMZXNzLTEpOworICAgICAgc2ZiX25yZ0xlZnRbbV0gPSAoKElOVClucmdMZWZ0KzEpPj4xOyAvKiByb3VuZGluZyAqLworCisgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKKyAgICAgICAgRklYUF9EQkwgc2NhbGVGcmFjdDsKKyAgICAgICAgaW50IHNjMCwgc2MxOworCisgICAgICAgIG5yZ0xlZnQyID0gZml4TWF4KChGSVhQX0RCTCkweDEsIG5yZ0xlZnQyKTsKKyAgICAgICAgbnJnUmlnaHQgPSBmaXhNYXgoKEZJWFBfREJMKTB4MSwgbnJnUmlnaHQpOworCisgICAgICAgIHNjMCA9IENvdW50TGVhZGluZ0JpdHMobnJnTGVmdDIpOworICAgICAgICBzYzEgPSBDb3VudExlYWRpbmdCaXRzKG5yZ1JpZ2h0KTsKKworICAgICAgICBzY2FsZUZyYWN0ID0gKChGSVhQX0RCTCkoc2MwLXNjMSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpOyAvKiBzY2FsZSB2YWx1ZSBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCisgICAgICAgIG5yZ1JpZ2h0ID0gQ2FsY0xkRGF0YShucmdMZWZ0Mjw8c2MwKSAtIENhbGNMZERhdGEobnJnUmlnaHQ8PHNjMSkgLSBzY2FsZUZyYWN0OworCisgICAgICAgIC8qIGxkNjQgdG8gaW50ZWdlciBjb252ZXJzaW9uICovCisgICAgICAgIG5yZ1JpZ2h0ID0gKEZJWFBfREJMKShMT05HKShucmdSaWdodCkgPj4gKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xLW9uZUJpdExlc3MpOworICAgICAgICBucmdSaWdodCAgPSAobnJnUmlnaHQrKEZJWFBfREJMKTEpPj4xOyAvKiByb3VuZGluZyAqLworCisgICAgICAgIHNmYl9ucmdSaWdodFttXSA9IG1hcFBhbm9yYW1hIChucmdSaWdodCxoX3Nici0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzLCZxdWFudEVycm9yKTsKKworICAgICAgICAqbWF4UXVhbnRFcnJvciA9IGZpeE1heChxdWFudEVycm9yLCAqbWF4UXVhbnRFcnJvcik7CisgICAgICB9CisKKyAgICAgIG0rKzsKKyAgICB9IC8qIGogKi8KKworICAgICAvKiBEbyBlbmVyZ3kgY29tcGVuc2F0aW9uIGZvciBzaW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIHR3bworICAgICAgICAgUU1GLWJhbmRzIGluIHRoZSBvcmlnaW5hbCwgYnV0IHdpbGwgb25seSBvY2N1ciBpbiBvbmUgYmFuZCBpbgorICAgICAgICAgdGhlIGRlY29kZXIgZHVlIHRvIHRoZSBzeW50aGV0aWMgc2luZSBjb2RpbmcuKi8KKyAgICBpZiAoaF9jb24tPnVzZVBhcmFtZXRyaWNDb2RpbmcpIHsKKyAgICAgIG0tPW5vX29mX2JhbmRzOworICAgICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKKyAgICAgICAgaWYgKGZyZXFfcmVzPT1GUkVRX1JFU19ISUdIICYmIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0peworICAgICAgICAgIHNmYl9ucmdMZWZ0W21dIC09IChjYSAqIGZpeHBfYWJzKChJTlQpaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5lbnZlbG9wZUNvbXBlbnNhdGlvbltqXSkpOworICAgICAgICB9CisgICAgICAgIHNmYl9ucmdMZWZ0W21dID0gZml4TWF4KDAsIHNmYl9ucmdMZWZ0W21dKTsKKyAgICAgICAgbSsrOworICAgICAgfQorICAgIH0gLyogdXNlUGFyYW1ldHJpY0NvZGluZyAqLworCisgIH0gLyogaSovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKworICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIG5vaXNlIGZsb29yIGFuZCB0aGUgZW52ZWxvcGUgdmFsdWVzIGZyb20gdGhlCisgICAgICAgICAgZW5lcmdpZXMsIGRlcGVuZGluZyBvbiBmcmFtaW5nIGFuZCBzdGVyZW8gbW9kZQorCisgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUgaXMgdGhlIG1haW4gZnVuY3Rpb24gZm9yIGVuY29kaW5nIGFuZCB3cml0aW5nIHRoZQorICBlbnZlbG9wZSBhbmQgdGhlIG5vaXNlIGZsb29yLiBUaGUgZnVuY3Rpb24gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBwcm9jZXNzZXM6CisKKyAgLUFuYWx5c2lzIHN1YmJhbmQgZmlsdGVyaW5nLgorICAtRW5jb2RpbmcgU0EgYW5kIHBhbiBwYXJhbWV0ZXJzIChpZiBlbmFibGVkKS4KKyAgLVRyYW5zaWVudCBkZXRlY3Rpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xOS19TRUNUSU9OX0NPREVfTDEKK3ZvaWQKK0ZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxICgKKyAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4sCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICAgKmVEYXRhLAorICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YQorICAgICAgICAgICAgICAgICAgICkKK3sKKworICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0ckVudiA9ICZoRW52Q2hhbi0+c2JyRXh0cmFjdEVudmVsb3BlOworCisgIGlmIChzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCA9PSAwKQorICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKCZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5xbWZTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOworICBlbHNlCisgICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YSgmc2JyRXh0ckVudi0+WUJ1ZmZlcltzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5vUW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnFtZlNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlWzFdKTsKKworCisKKyAgLyoKKyAgICBQcmVjYWxjdWxhdGlvbiBvZiBUb25hbGl0eSBRdW90YXMgIENPRUZGIFRyYW5zZm9ybSBPSworICAqLworICBGREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoJmhFbnZDaGFuLT5Ub25Db3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtISV1baF9jb24tPm5TZmJbSEldXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+cW1mU2NhbGUpOworCisKKworICAvKgorICAgIFRyYW5zaWVudCBkZXRlY3Rpb24gQ09FRkYgVHJhbnNmb3JtIE9LCisgICovCisgIEZES3NickVuY190cmFuc2llbnREZXRlY3QoJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPlNickVudkZyYW1lLmZyYW1lTWlkZGxlU2xvdCk7CisKKworCisgIC8qCisgICAgR2VuZXJhdGUgZmxhZ3MgZm9yIDIgZW52IGluIGEgRklYRklYLWZyYW1lLgorICAgIFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBhbHdheXMgMSBlbnYgcGVyIEZJWEZJWC1mcmFtZS4KKyAgKi8KKworICAvKgorICAgIGZyYW1lIFNwbGl0dGVyIENPRUZGIFRyYW5zZm9ybSBPSworICAqLworICBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcihzYnJFeHRyRW52LT5ZQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5TZmJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scyk7CisKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBub2lzZSBmbG9vciBhbmQgdGhlIGVudmVsb3BlIHZhbHVlcyBmcm9tIHRoZQorICAgICAgICAgIGVuZXJnaWVzLCBkZXBlbmRpbmcgb24gZnJhbWluZyBhbmQgc3RlcmVvIG1vZGUKKworICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlIGlzIHRoZSBtYWluIGZ1bmN0aW9uIGZvciBlbmNvZGluZyBhbmQgd3JpdGluZyB0aGUKKyAgZW52ZWxvcGUgYW5kIHRoZSBub2lzZSBmbG9vci4gVGhlIGZ1bmN0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2VzOgorCisgIC1EZXRlcm1pbmUgdGltZS9mcmVxdWVuY3kgZGl2aXNpb24gb2YgY3VycmVudCBncmFudWxlLgorICAtU2VuZGluZyB0cmFuc2llbnQgaW5mbyB0byBiaXRzdHJlYW0uCisgIC1TZXQgYW1wX3JlcyB0byAxLjUgZEIgaWYgdGhlIGN1cnJlbnQgZnJhbWUgY29udGFpbnMgb25seSBvbmUgZW52ZWxvcGUuCisgIC1Mb2NrIGR5bmFtaWMgYmFuZHdpZHRoIGZyZXF1ZW5jeSBjaGFuZ2UgaWYgdGhlIG5leHQgZW52ZWxvcGUgbm90IHN0YXJ0cyBvbiBhCisgIGZyYW1lIGJvdW5kYXJ5LgorICAtTURDVCB0cmFuc3Bvc2VyIChuZWVkZWQgdG8gZGV0ZWN0IHdoZXJlIGhhcm1vbmljcyB3aWxsIGJlIG1pc3NpbmcpLgorICAtU3BlY3RydW0gRXN0aW1hdGlvbiAodXNlZCBmb3IgcHVsc2UgdHJhaW4gYW5kIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdGlvbikuCisgIC1QdWxzZSB0cmFpbiBkZXRlY3Rpb24uCisgIC1JbnZlcnNlIEZpbHRlcmluZyBkZXRlY3Rpb24uCisgIC1XYXZlZm9ybSBDb2RpbmcuCisgIC1NaXNzaW5nIEhhcm1vbmljcyBkZXRlY3Rpb24uCisgIC1FeHRyYWN0IGVudmVsb3BlIG9mIGN1cnJlbnQgZnJhbWUuCisgIC1Ob2lzZSBmbG9vciBlc3RpbWF0aW9uLgorICAtTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCisgIC1FbmNvZGUgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KKyAgLVNlbmQgdGhlIGVuY29kZWQgZGF0YSB0byB0aGUgYml0c3RyZWFtLgorICAtV3JpdGUgdG8gYml0c3RyZWFtLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMTktfU0VDVElPTl9DT0RFX0wxCit2b2lkCitGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMiAoCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgaF9jb24sIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLworICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICBoX2VudkNoYW4wLAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICBoX2VudkNoYW4xLAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICAgKmVEYXRhLAorICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQKKyAgICAgICAgICAgICAgICAgICApCit7CisgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW5bTUFYX05VTV9DSEFOTkVMU10gPSB7aF9lbnZDaGFuMCwgaF9lbnZDaGFuMX07CisgIGludCBjaCwgaSwgaiwgYywgWVN6U2hpZnQgPSBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU3pTaGlmdDsKKworICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSA9IGhfY29uLT5zdGVyZW9Nb2RlOworICBpbnQgbkNoYW5uZWxzID0gaF9jb24tPm5DaGFubmVsczsKKyAgY29uc3QgaW50ICp2X3R1bmluZzsKKyAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0hFQUFDWzZdID0geyAwLCAyLCA0LCAwLCAwLCAwIH07CisKKyAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0VMRFs2XSA9IHsgMCwgMiwgMywgMCwgMCwgMCB9OworCisgIGlmIChoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgICB2X3R1bmluZyA9IHZfdHVuaW5nRUxEOworICBlbHNlCisgICAgdl90dW5pbmcgPSB2X3R1bmluZ0hFQUFDOworCisKKyAgLyoKKyAgICBTZWxlY3Qgc3RlcmVvIG1vZGUuCisgICovCisgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgeworICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkgeworICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNaW4oZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKKyAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzFdICYmICFlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkgeworICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICghZURhdGFbMF0udHJhbnNpZW50X2luZm9bMV0gJiYgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pCisgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNYXgoZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKKyAgICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICBEZXRlcm1pbmUgdGltZS9mcmVxdWVuY3kgZGl2aXNpb24gb2YgY3VycmVudCBncmFudWxlCisgICovCisgIGVEYXRhWzBdLmZyYW1lX2luZm8gPSBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yKCZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUucHJlX3RyYW5zaWVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubGRHcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZyk7CisKKyAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQgPSAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJHcmlkOworCisgIC8qIEFBQyBMRCBwYXRjaCBmb3IgdHJhbnNpZW50IHByZWRpY3Rpb24gKi8KKyAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5sZEdyaWQgJiYgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMl0pIHsKKyAgICAvKiBpZiBuZXh0IGZyYW1lIHdpbGwgc3RhcnQgd2l0aCB0cmFuc2llbnQsIHNldCBzaG9ydEVudiB0byBudW1FbnZlbG9wZXMoc2hvcnRlbmQgRW52ZWxvcGUgPSBzaG9ydEVudi0xKSovCisgICAgaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPSBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOworICB9CisKKworICBzd2l0Y2ggKHN0ZXJlb01vZGUpIHsKKyAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgY2FzZSBTQlJfU1dJVENIX0xSQzoKKyAgICBlRGF0YVsxXS5mcmFtZV9pbmZvID0gRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcigmaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5wcmVfdHJhbnNpZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZyk7CisKKyAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickdyaWQ7CisKKyAgICBpZiAoaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1syXSkgeworICAgICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8gbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLworICAgICAgaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPSBoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOworICAgIH0KKworICAgIC8qIGNvbXBhcmUgbGVmdCBhbmQgcmlnaHQgZnJhbWVfaW5mb3MgKi8KKyAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzKSB7CisgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICsgMTsgaSsrKSB7CisgICAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5ib3JkZXJzW2ldICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0pIHsKKyAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKKyAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0gIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSkgeworICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPnNob3J0RW52ICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPnNob3J0RW52KSB7CisgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX0NPVVBMSU5HOgorICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBlRGF0YVswXS5mcmFtZV9pbmZvOworICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKKyAgICBicmVhazsKKyAgY2FzZSBTQlJfTU9OTzoKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRkRLX0FTU0VSVCAoMCk7CisgIH0KKworCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKQorICB7CisgICAgSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDaGFuID0gaF9lbnZDaGFuW2NoXTsKKyAgICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0ckVudiA9ICZoRW52Q2hhbi0+c2JyRXh0cmFjdEVudmVsb3BlOworICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CisKKworICAgIC8qCisgICAgICAgU2VuZCB0cmFuc2llbnQgaW5mbyB0byBiaXRzdHJlYW0gYW5kIHN0b3JlIGZvciBuZXh0IGNhbGwKKyAgICAqLworICAgIHNickV4dHJFbnYtPnByZV90cmFuc2llbnRfaW5mb1swXSA9IGVkLT50cmFuc2llbnRfaW5mb1swXTsvKiB0cmFuX3BvcyAqLworICAgIHNickV4dHJFbnYtPnByZV90cmFuc2llbnRfaW5mb1sxXSA9IGVkLT50cmFuc2llbnRfaW5mb1sxXTsvKiB0cmFuX2ZsYWcgKi8KKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5ub09mRW52ZWxvcGVzID0gZWQtPm5FbnZlbG9wZXMgPSBlZC0+ZnJhbWVfaW5mby0+bkVudmVsb3BlczsgICAgIC8qIG51bWJlciBvZiBlbnZlbG9wZXMgb2YgY3VycmVudCBmcmFtZSAqLworCisgICAgLyoKKyAgICAgIENoZWNrIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGRpdmlkZWQgaW50byBvbmUgZW52ZWxvcGUgb25seS4gSWYgc28sIHNldCB0aGUgYW1wbGl0dWRlCisgICAgICByZXNvbHV0aW9uIHRvIDEuNSBkQiwgb3RoZXJ3aXNlIG1heSBzZXQgYmFjayB0byBjaG9zZW4gdmFsdWUKKyAgICAqLworICAgaWYoICggaEVudkNoYW4tPmVuY0VudkRhdGEuaFNickJTR3JpZC0+ZnJhbWVDbGFzcyA9PSBGSVhGSVggKQorICAgICAgICAmJiAoIGVkLT5uRW52ZWxvcGVzID09IDEgKSApCisgICB7CisKKyAgICAgaWYgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLmxkR3JpZCkKKyAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSAoQU1QX1JFUyloX2Nvbi0+aW5pdEFtcFJlc0ZGOworICAgICBlbHNlCisgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfMV81OworCisgICAgIGlmICggaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGICE9IGhFbnZDaGFuLT5lbmNFbnZEYXRhLmluaXRfc2JyX2FtcF9yZXMpIHsKKworICAgICAgICBGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoJmhFbnZDaGFuLT5lbmNFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZihzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcyAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzICkgeworCisgICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3Jlcyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjbGVhck91dHB1dCkgeworCisgICAgICAvKgorICAgICAgICBUb25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBleHRyYWN0aW9uIChpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCwgbm9pc2UgZmxvb3IgYWRkaXRpb25hbCBzaW5lcykuCisgICAgICAqLworICAgICAgRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoJmhFbnZDaGFuLT5Ub25Db3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5ub2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5lbnZlbG9wZUNvbXBlbnNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZC0+ZnJhbWVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZC0+dHJhbnNpZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5uU2ZiW0hJXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CisKKyAgICB9CisKKyAgICAvKiBMb3cgZW5lcmd5IGluIGxvdyBiYW5kIGZpeCAqLworICAgIGlmICggaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZMb3dCYW5kRW5lcmd5IDwgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSAmJiBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5ID4gRkwyRlhfREJMKDAuMDMpKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBoRW52Q2hhbi0+ZkxldmVsUHJvdGVjdCA9IDE7CisKKyAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCisgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjW2ldID0gSU5WRl9ISUdIX0xFVkVMOworICAgIH0gZWxzZSB7CisgICAgICBoRW52Q2hhbi0+ZkxldmVsUHJvdGVjdCA9IDA7CisgICAgfQorCisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZSA9IGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjWzBdOworCisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgPSBoRW52Q2hhbi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOworCisKKyAgfSAvKiBjaCAqLworCisKKworICAgLyoKKyAgICAgIFNhdmUgbnVtYmVyIG9mIHNjZiBiYW5kcyBwZXIgZW52ZWxvcGUKKyAgICAqLworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVtjaF0ubkVudmVsb3BlczsgaSsrKXsKKyAgICAgIGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXSA9CisgICAgICAoZURhdGFbY2hdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0gPT0gRlJFUV9SRVNfSElHSCA/IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdIDogaF9jb24tPm5TZmJbRlJFUV9SRVNfTE9XXSk7CisgICAgfQorICB9CisKKyAgLyoKKyAgICBFeHRyYWN0IGVudmVsb3BlIG9mIGN1cnJlbnQgZnJhbWUuCisgICovCisgIHN3aXRjaCAoc3RlcmVvTW9kZSkgeworICBjYXNlIFNCUl9NT05POgorICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOworICAgIGJyZWFrOworICBjYXNlIFNCUl9MRUZUX1JJR0hUOgorICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbyxlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOworICAgIGJyZWFrOworICBjYXNlIFNCUl9DT1VQTElORzoKKyAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzFdLnNmYl9ucmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9DT1VQTElORywgJmZEYXRhLT5tYXhRdWFudEVycm9yLCBZU3pTaGlmdCk7CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX1NXSVRDSF9MUkM6CisgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKKyAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLCBlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTyxOVUxMLCBZU3pTaGlmdCk7CisgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfQ09VUExJTkcsICZmRGF0YS0+bWF4UXVhbnRFcnJvciwgWVN6U2hpZnQpOworICAgIGJyZWFrOworICB9CisKKworCisgIC8qCisgICAgTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCisgICovCisKKyAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7CisgIGNhc2UgU0JSX01PTk86CisgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7CisKKyAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisKKyAgICBicmVhazsKKyAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOworCisgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAorICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKworICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWwsZURhdGFbMV0ubm9pc2VGbG9vciwgMCk7CisKKyAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCisgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworCisgICAgYnJlYWs7CisKKyAgY2FzZSBTQlJfQ09VUExJTkc6CisgICAgY291cGxlTm9pc2VGbG9vcihlRGF0YVswXS5ub2lzZUZsb29yLGVEYXRhWzFdLm5vaXNlRmxvb3IpOworCisgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKKworICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMSwKKyAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisKKyAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDEpOworCisgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAxLAorICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKworICAgIGJyZWFrOworICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgorICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7CisgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCxlRGF0YVsxXS5ub2lzZUZsb29yLCAwKTsKKyAgICBjb3VwbGVOb2lzZUZsb29yKGVEYXRhWzBdLm5vaXNlRmxvb3IsZURhdGFbMV0ubm9pc2VGbG9vcik7CisgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZyxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKKyAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDEpOworICAgIGJyZWFrOworICB9CisKKworCisgIC8qCisgICAgRW5jb2RlIGVudmVsb3BlIG9mIGN1cnJlbnQgZnJhbWUuCisgICovCisgIHN3aXRjaCAoc3RlcmVvTW9kZSkgeworICBjYXNlIFNCUl9NT05POgorICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKKyAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCisgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICBicmVhazsKKyAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7CisKKyAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworCisKKyAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCisgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgYnJlYWs7CisgIGNhc2UgU0JSX0NPVVBMSU5HOgorICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMTsKKyAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAxOworCisgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCisgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDEsCisgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgIGJyZWFrOworICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgorICAgIHsKKyAgICAgIElOVCBwYXlsb2FkYml0c0xSOworICAgICAgSU5UIHBheWxvYWRiaXRzQ09VUExJTkc7CisKKyAgICAgIFNDSEFSIHNmYk5yZ1ByZXZUZW1wW01BWF9OVU1fQ0hBTk5FTFNdW01BWF9GUkVRX0NPRUZGU107CisgICAgICBTQ0hBUiBub2lzZVByZXZUZW1wW01BWF9OVU1fQ0hBTk5FTFNdW01BWF9OVU1fTk9JU0VfQ09FRkZTXTsKKyAgICAgIElOVCB1cERhdGVOcmdUZW1wW01BWF9OVU1fQ0hBTk5FTFNdOworICAgICAgSU5UIHVwRGF0ZU5vaXNlVGVtcFtNQVhfTlVNX0NIQU5ORUxTXTsKKyAgICAgIElOVCBkb21haW5WZWNUZW1wW01BWF9OVU1fQ0hBTk5FTFNdW01BWF9FTlZFTE9QRVNdOworICAgICAgSU5UIGRvbWFpblZlY05vaXNlVGVtcFtNQVhfTlVNX0NIQU5ORUxTXVtNQVhfRU5WRUxPUEVTXTsKKworICAgICAgSU5UIHRlbXBGbGFnUmlnaHQgPSAwOworICAgICAgSU5UIHRlbXBGbGFnTGVmdCA9IDA7CisKKyAgICAgIC8qCisgICAgICAgICBTdG9yZSBwcmV2aW91cyB2YWx1ZXMsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gInVuZG8iIHdoYXQgaXMgYmVpbmcgZG9uZS4KKyAgICAgICovCisKKyAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspeworICAgICAgICBGREttZW1jcHkgKHNmYk5yZ1ByZXZUZW1wW2NoXSwgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mIChTQ0hBUikpOworCisgICAgICAgIEZES21lbWNweSAobm9pc2VQcmV2VGVtcFtjaF0sIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7CisKKyAgICAgICAgdXBEYXRlTnJnVGVtcFtjaF0gPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlOworICAgICAgICB1cERhdGVOb2lzZVRlbXBbY2hdID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAgZm9yYmlkIHRpbWUgY29kaW5nIGluIHRoZSBmaXJzdCBlbnZlbG9wZSBpbiBjYXNlIG9mIGEgZGlmZmVyZW50CisgICAgICAgICAgcHJldmlvdXMgc3RlcmVvbW9kZQorICAgICAgICAqLworICAgICAgICBpZihzYnJIZWFkZXJEYXRhLT5wcmV2X2NvdXBsaW5nKXsKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gMDsKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSAwOworICAgICAgICB9CisgICAgICB9IC8qIGNoICovCisKKworICAgICAgLyoKKyAgICAgICAgIENvZGUgb3JkaW5hcnkgTGVmdC9SaWdodCBzdGVyZW8KKyAgICAgICovCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAorICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0uc2ZiX25yZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMCwKKyAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKworICAgICAgYyA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0ubkVudmVsb3BlczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXTsgaisrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnW2NdOworICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzFdLnNmYl9ucmdbY107CisgICAgICAgICAgICBjKys7CisgICAgICAgICAgfQorICAgICAgfQorCisKKworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQorICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzBdLm5vaXNlX2xldmVsW2ldOworCisKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCisgICAgICAgICAgICAgICAgICAgIChlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCisgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMV0ubm9pc2VfbGV2ZWxbaV07CisKKworICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOworICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworCisgICAgICBwYXlsb2FkYml0c0xSID0gRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworCisgICAgICAvKgorICAgICAgICBzd2FwIHNhdmVkIHN0b3JlZCB3aXRoIGN1cnJlbnQgdmFsdWVzCisgICAgICAqLworICAgICAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7CisgICAgICAgIElOVCAgIGl0bXA7CisgICAgICAgIGZvcihpPTA7aTxNQVhfRlJFUV9DT0VGRlM7aSsrKXsKKyAgICAgICAgICAvKgorICAgICAgICAgICAgc3dhcCBzZmIgZW5lcmdpZXMKKyAgICAgICAgICAqLworICAgICAgICAgIGl0bXAgPSAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldltpXTsKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldPXNmYk5yZ1ByZXZUZW1wW2NoXVtpXTsKKyAgICAgICAgICBzZmJOcmdQcmV2VGVtcFtjaF1baV09aXRtcDsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wO2k8TUFYX05VTV9OT0lTRV9DT0VGRlM7aSsrKXsKKyAgICAgICAgICAvKgorICAgICAgICAgICAgc3dhcCBub2lzZSBlbmVyZ2llcworICAgICAgICAgICovCisgICAgICAgICAgaXRtcCA9ICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci5zZmJfbnJnX3ByZXZbaV07CisgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2W2ldPW5vaXNlUHJldlRlbXBbY2hdW2ldOworICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdW2ldPWl0bXA7CisgICAgICAgfQorICAgICAgICAvKiBzd2FwIHVwZGF0ZSBmbGFncyAqLworICAgICAgICBpdG1wICA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7CisgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU9dXBEYXRlTnJnVGVtcFtjaF07CisgICAgICAgIHVwRGF0ZU5yZ1RlbXBbY2hdID0gaXRtcDsKKworICAgICAgICBpdG1wID0gIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZTsKKyAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlPXVwRGF0ZU5vaXNlVGVtcFtjaF07CisgICAgICAgIHVwRGF0ZU5vaXNlVGVtcFtjaF09aXRtcDsKKworICAgICAgICAvKgorICAgICAgICAgICAgc2F2ZSBkb21haW4gdmVjcworICAgICAgICAqLworICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjVGVtcFtjaF0saF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLHNpemVvZihJTlQpKk1BWF9FTlZFTE9QRVMpOworICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjTm9pc2VUZW1wW2NoXSxoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2Usc2l6ZW9mKElOVCkqTUFYX0VOVkVMT1BFUyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICBmb3JiaWQgdGltZSBjb2RpbmcgaW4gdGhlIGZpcnN0IGVudmVsb3BlIGluIGNhc2Ugb2YgYSBkaWZmZXJlbnQKKyAgICAgICAgICBwcmV2aW91cyBzdGVyZW9tb2RlCisgICAgICAgICovCisKKyAgICAgICAgaWYoIXNickhlYWRlckRhdGEtPnByZXZfY291cGxpbmcpeworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gLyogY2ggKi8KKworCisgICAgICAvKgorICAgICAgICAgQ291cGxpbmcKKyAgICAgICAqLworCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAxLAorICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAxLAorICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAorICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworCisKKyAgICAgIGMgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLm5vU2NmQmFuZHNbaV07IGorKykgeworICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nW2NdOworICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nW2NdOworICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZywgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKKyAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLnNicl9ub2lzZV9sZXZlbHNbaV0gPSBlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZ1tpXTsKKworCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbF9jb3VwbGluZywgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDEsCisgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQorICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nW2ldOworCisgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7CisKKyAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAxOworCisgICAgICB0ZW1wRmxhZ0xlZnQgID0gaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZzsKKyAgICAgIHRlbXBGbGFnUmlnaHQgPSBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnOworCisgICAgICBwYXlsb2FkYml0c0NPVVBMSU5HID0KKyAgICAgICAgRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworCisKKyAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcgPSB0ZW1wRmxhZ0xlZnQ7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnID0gdGVtcEZsYWdSaWdodDsKKworICAgICAgaWYgKHBheWxvYWRiaXRzQ09VUExJTkcgPCBwYXlsb2FkYml0c0xSKSB7CisKKyAgICAgICAgICAvKgorICAgICAgICAgICAgY29weSBjb2RlZCBjb3VwbGluZyBlbnZlbG9wZSBhbmQgbm9pc2UgZGF0YSB0byBsL3IKKyAgICAgICAgICAqLworICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspeworICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVkID0gJmVEYXRhW2NoXTsKKyAgICAgICAgICAgIEZES21lbWNweSAoZWQtPnNmYl9ucmcsIGVkLT5zZmJfbnJnX2NvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMgKiBzaXplb2YgKFNDSEFSKSk7CisgICAgICAgICAgICBGREttZW1jcHkgKGVkLT5ub2lzZV9sZXZlbCwgZWQtPm5vaXNlX2xldmVsX2NvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9WQUxVRVMgKiBzaXplb2YgKFNDSEFSKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAxOworICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7CisgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2V7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgIHJlc3RvcmUgc2F2ZWQgbC9yIGl0ZW1zCisgICAgICAgICAgKi8KKyAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKXsKKworICAgICAgICAgICAgRkRLbWVtY3B5IChoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgICAgICAgICBzZmJOcmdQcmV2VGVtcFtjaF0sIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZiAoU0NIQVIpKTsKKworICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnVwRGF0ZSA9IHVwRGF0ZU5yZ1RlbXBbY2hdOworCisgICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgbm9pc2VQcmV2VGVtcFtjaF0sIE1BWF9OVU1fTk9JU0VfQ09FRkZTICogc2l6ZW9mIChTQ0hBUikpOworCisgICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYyxkb21haW5WZWNUZW1wW2NoXSxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKKyAgICAgICAgICAgIEZES21lbWNweSAoaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLGRvbWFpblZlY05vaXNlVGVtcFtjaF0sc2l6ZW9mKElOVCkqTUFYX0VOVkVMT1BFUyk7CisKKyAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IHVwRGF0ZU5vaXNlVGVtcFtjaF07CisgICAgICAgICAgfQorCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOworICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7CisgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2ggKi8KKworCisgIC8qIHRlbGwgdGhlIGVudmVsb3BlIGVuY29kZXJzIGhvdyBsb25nIGl0IGhhcyBiZWVuLCBzaW5jZSB3ZSBsYXN0IHNlbnQKKyAgICAgYSBmcmFtZSBzdGFydGluZyB3aXRoIGEgZEYtY29kZWQgZW52ZWxvcGUgKi8KKyAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX01PTk8gKSB7CisgICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUpCisgICAgICBoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjKys7CisgICAgZWxzZQorICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYyA9IDA7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUgfHwKKyAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNbMF0gPT0gVElNRSkgeworICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYysrOworICAgICAgaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYysrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMgPSAwOworICAgICAgaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYyA9IDA7CisgICAgfQorICB9CisKKyAgLyoKKyAgICBTZW5kIHRoZSBlbmNvZGVkIGRhdGEgdG8gdGhlIGJpdHN0cmVhbQorICAqLworICBmb3IoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKXsKKyAgICBTQlJfRU5WX1RFTVBfREFUQSAqZWQgPSAmZURhdGFbY2hdOworICAgIGMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBlZC0+bkVudmVsb3BlczsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5ub1NjZkJhbmRzW2ldOyBqKyspIHsKKyAgICAgICAgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlZC0+c2ZiX25yZ1tjXTsKKworICAgICAgICBjKys7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKXsKKyAgICAgIGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVkLT5ub2lzZV9sZXZlbFtpXTsKKyAgICB9CisgIH0vKiBjaCAqLworCisKKyAgLyoKKyAgICBXcml0ZSBiaXRzdHJlYW0KKyAgKi8KKyAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50KHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CisgIH0KKyAgZWxzZSB7CisgICAgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworICB9CisKKyAgLyoKKyAgICogVXBkYXRlIGJ1ZmZlcnMuCisgICAqLworICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykKKyAgeworICAgICAgaW50IFlCdWZmZXJMZW5ndGggPSBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUubm9fY29scyA+PiBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldDsgaSsrKSB7CisgICAgICAgICBGREttZW1jcHkoaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJbaV0sCisgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJbaSArIFlCdWZmZXJMZW5ndGhdLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkqUU1GX0NIQU5ORUxTKTsKKyAgICAgIH0KKyAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGVbMF0gPSBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlWzFdOworICB9CisKKyAgc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZyA9IHNickhlYWRlckRhdGEtPmNvdXBsaW5nOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBjcmVhdGVzIGFuIGVudmVsb3BlIGV4dHJhY3RvciBoYW5kbGUKKworICBccmV0dXJuIGVycm9yIHN0YXR1cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UCitGREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgIGhTYnJDdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSU5UIGNoSW5FbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBJTlQgaTsKKyAgRklYUF9EQkwqIFlCdWZmZXIgPSBHZXRSYW1fU2JyX2VudllCdWZmZXIoY2hhbm5lbCk7CisKKyAgRkRLbWVtY2xlYXIoaFNickN1dCxzaXplb2YoU0JSX0VYVFJBQ1RfRU5WRUxPUEUpKTsKKyAgaFNickN1dC0+cF9ZQnVmZmVyID0gWUJ1ZmZlcjsKKworCisgIGZvciAoaSA9IDA7IGkgPCAoUU1GX01BWF9USU1FX1NMT1RTPj4xKTsgaSsrKSB7CisgICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IFlCdWZmZXIgKyAoaSpRTUZfQ0hBTk5FTFMpOworICB9CisgIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOworICBJTlQgbj0wOworICBmb3IgKDsgaSA8IFFNRl9NQVhfVElNRV9TTE9UUzsgaSsrLG4rKykgeworICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBZQnVmZmVyRHluICsgKG4qUU1GX0NIQU5ORUxTKTsKKyAgfQorCisgIEZJWFBfREJMKiByQnVmZmVyID0gR2V0UmFtX1Nicl9lbnZSQnVmZmVyKDAsIGR5bmFtaWNfUkFNKTsKKyAgRklYUF9EQkwqIGlCdWZmZXIgPSBHZXRSYW1fU2JyX2VudklCdWZmZXIoMCwgZHluYW1pY19SQU0pOworCisgIGZvciAoaSA9IDA7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKykgeworICAgIGhTYnJDdXQtPnJCdWZmZXJbaV0gPSByQnVmZmVyICsgKGkqUU1GX0NIQU5ORUxTKTsKKyAgICBoU2JyQ3V0LT5pQnVmZmVyW2ldID0gaUJ1ZmZlciArIChpKlFNRl9DSEFOTkVMUyk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBJbml0aWFsaXplIGFuIGVudmVsb3BlIGV4dHJhY3RvciBpbnN0YW5jZS4KKworICBccmV0dXJuIGVycm9yIHN0YXR1cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UCitGREtzYnJFbmNfSW5pdEV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9zbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBzdGF0ZXNJbml0RmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGludCBjaEluRWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVSU5UIHNiclN5bnRheEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgWUJ1ZmZlckxlbmd0aCwgckJ1ZmZlckxlbmd0aDsKKyAgaW50IGk7CisKKyAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgICBpbnQgb2ZmID0gVFJBTlNJRU5UX09GRlNFVF9MRDsKKyNpZm5kZWYgRlVMTF9ERUxBWQorICAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA9IChub19jb2xzPj4xKStvZmYqdGltZV9zdGVwOworI2Vsc2UKKyAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSBub19jb2xzK29mZip0aW1lX3N0ZXA7CisjZW5kaWYKKyAgfSBlbHNlCisgIHsKKyAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSB0cmFuX29mZip0aW1lX3N0ZXA7CisgIH0KKyAgaFNickN1dC0+ckJ1ZmZlclJlYWRPZmZzZXQgID0gMDsKKworCisgIFlCdWZmZXJMZW5ndGggPSBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgKyBub19jb2xzOworICByQnVmZmVyTGVuZ3RoID0gbm9fY29sczsKKworICBoU2JyQ3V0LT5wcmVfdHJhbnNpZW50X2luZm9bMF0gPSAwOworICBoU2JyQ3V0LT5wcmVfdHJhbnNpZW50X2luZm9bMV0gPSAwOworCisKKyAgaFNickN1dC0+bm9fY29scyA9IG5vX2NvbHM7CisgIGhTYnJDdXQtPm5vX3Jvd3MgPSBub19yb3dzOworICBoU2JyQ3V0LT5zdGFydF9pbmRleCA9IHN0YXJ0X2luZGV4OworCisgIGhTYnJDdXQtPnRpbWVfc2xvdHMgPSB0aW1lX3Nsb3RzOworICBoU2JyQ3V0LT50aW1lX3N0ZXAgPSB0aW1lX3N0ZXA7CisKKyAgRkRLX0FTU0VSVChub19yb3dzICAgICAgICA8PSAgIFFNRl9DSEFOTkVMUyk7CisKKyAgLyogVXNlIGhhbGYgdGhlIEVuZXJneSB2YWx1ZXMgaWYgdGltZSBzdGVwIGlzIDIgb3IgZ3JlYXRlciAqLworICBpZiAodGltZV9zdGVwID49IDIpCisgICAgaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQgPSAxOworICBlbHNlCisgICAgaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQgPSAwOworCisgIFlCdWZmZXJMZW5ndGggICAgICAgICAgICAgICA+Pj0gaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQ7CisgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA+Pj0gaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQ7CisKKyAgRkRLX0FTU0VSVChZQnVmZmVyTGVuZ3RoPD1RTUZfTUFYX1RJTUVfU0xPVFMpOworCisgIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOworICBJTlQgbj0wOworICBmb3IgKGk9KFFNRl9NQVhfVElNRV9TTE9UUz4+MSk7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKyxuKyspIHsKKyAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlckR5biArIChuKlFNRl9DSEFOTkVMUyk7CisgIH0KKworICBpZihzdGF0ZXNJbml0RmxhZykgeworICAgIGZvciAoaT0wOyBpPFlCdWZmZXJMZW5ndGg7IGkrKykgeworICAgICAgRkRLbWVtY2xlYXIoIGhTYnJDdXQtPllCdWZmZXJbaV0sUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCByQnVmZmVyTGVuZ3RoOyBpKyspIHsKKyAgICBGREttZW1jbGVhciggaFNickN1dC0+ckJ1ZmZlcltpXSxRTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoIGhTYnJDdXQtPmlCdWZmZXJbaV0sUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOworICB9CisKKyAgRkRLbWVtY2xlYXIgKGhTYnJDdXQtPmVudmVsb3BlQ29tcGVuc2F0aW9uLHNpemVvZihVQ0hBUikqTUFYX0ZSRVFfQ09FRkZTKTsKKworICBpZihzdGF0ZXNJbml0RmxhZykgeworICAgIGhTYnJDdXQtPllCdWZmZXJTY2FsZVswXSA9IGhTYnJDdXQtPllCdWZmZXJTY2FsZVsxXSA9IEZSQUNUX0JJVFMtMTsKKyAgfQorCisgIHJldHVybiAoMCk7Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKworICBcYnJpZWYgIGRlaW5pdGlhbGl6ZXMgYW4gZW52ZWxvcGUgZXh0cmFjdG9yIGhhbmRsZQorCisgIFxyZXR1cm4gdm9pZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCkKK3sKKworICBpZiAoaFNickN1dCkgeworICAgIEZyZWVSYW1fU2JyX2VudllCdWZmZXIoJmhTYnJDdXQtPnBfWUJ1ZmZlcik7CisgIH0KK30KKworSU5UCitGREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIpCit7CisgIHJldHVybiBoU2JyLT5ub19yb3dzKigoaFNici0+WUJ1ZmZlcldyaXRlT2Zmc2V0KSoyICAgICAvKiBtdWx0IDIgYmVjYXVzZSBucmcncyBhcmUgZ3JvdXBlZCBoYWxmICovCisgICAgICAgICAgICAgICAgICAgICAgICAtIGhTYnItPnJCdWZmZXJSZWFkT2Zmc2V0ICk7ICAgICAgIC8qIGluIHJlZmVyZW5jZSBob2xkIGhhbGYgc3BlYyBhbmQgY2FsYyBucmcncyBvbiBvdmVybGFwcGVkIHNwZWMgKi8KKworfQorCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmggYi9hYWMvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MzJhNAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL2Vudl9lc3QuaApAQCAtMCwwICsxLDIyNCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIEVudmVsb3BlIGVzdGltYXRpb24gc3RydWN0cyBhbmQgcHJvdG90eXBlcyAgCisqLworI2lmbmRlZiBfX0VOVl9FU1RfSAorI2RlZmluZSBfX0VOVl9FU1RfSAorCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiIC8qIFNCUiBlY29uZmlnIHN0cnVjdHMgKi8KKyNpbmNsdWRlICJwc19tYWluLmgiCisjaW5jbHVkZSAiYml0X3Nici5oIgorI2luY2x1ZGUgImZyYW1fZ2VuLmgiCisjaW5jbHVkZSAidHJhbl9kZXQuaCIKKyNpbmNsdWRlICJjb2RlX2Vudi5oIgorI2luY2x1ZGUgInRvbl9jb3JyLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMICAqckJ1ZmZlcltRTUZfTUFYX1RJTUVfU0xPVFNdOworICBGSVhQX0RCTCAgKmlCdWZmZXJbUU1GX01BWF9USU1FX1NMT1RTXTsKKworICBGSVhQX0RCTCAgKnBfWUJ1ZmZlcjsKKworICBGSVhQX0RCTCAgKllCdWZmZXJbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgaW50ICAgICAgICBZQnVmZmVyU2NhbGVbMl07CisKKyAgVUNIQVIgZW52ZWxvcGVDb21wZW5zYXRpb25bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgVUNIQVIgcHJlX3RyYW5zaWVudF9pbmZvWzJdOworCisKKyAgaW50IFlCdWZmZXJXcml0ZU9mZnNldDsKKyAgaW50IFlCdWZmZXJTelNoaWZ0OworICBpbnQgckJ1ZmZlclJlYWRPZmZzZXQ7CisKKyAgaW50IG5vX2NvbHM7CisgIGludCBub19yb3dzOworICBpbnQgc3RhcnRfaW5kZXg7CisKKyAgaW50IHRpbWVfc2xvdHM7CisgIGludCB0aW1lX3N0ZXA7Cit9CitTQlJfRVhUUkFDVF9FTlZFTE9QRTsKK3R5cGVkZWYgU0JSX0VYVFJBQ1RfRU5WRUxPUEUgKkhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRTsKKworc3RydWN0IEVOVl9DSEFOTkVMCit7CisgIFNCUl9UUkFOU0lFTlRfREVURUNUT1Igc2JyVHJhbnNpZW50RGV0ZWN0b3I7CisgIFNCUl9DT0RFX0VOVkVMT1BFIHNickNvZGVFbnZlbG9wZTsKKyAgU0JSX0NPREVfRU5WRUxPUEUgc2JyQ29kZU5vaXNlRmxvb3I7CisgIFNCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJhY3RFbnZlbG9wZTsKKworCisgIFNCUl9FTlZFTE9QRV9GUkFNRSBTYnJFbnZGcmFtZTsKKyAgU0JSX1RPTl9DT1JSX0VTVCAgIFRvbkNvcnI7CisKKyAgc3RydWN0IFNCUl9FTlZfREFUQSBlbmNFbnZEYXRhOworCisgIGludCBxbWZTY2FsZTsKKyAgVUNIQVIgZkxldmVsUHJvdGVjdDsKK307Cit0eXBlZGVmIHN0cnVjdCBFTlZfQ0hBTk5FTCAqSEFORExFX0VOVl9DSEFOTkVMOworCisvKioqKioqKioqKioqICBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqLworCitJTlQKK0ZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUgKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSAgaFNickN1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxJTlQgY2hJbkVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKK0lOVAorRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLCBpbnQgdGltZV9zdGVwLCBpbnQgdHJhbl9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHN0YXRlc0luaXRGbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgLGludCBjaEluRWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworCit2b2lkIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUgKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZSRVFfUkVTIHJlc1tNQVhfTlVNX05PSVNFX1ZBTFVFU107CisgICAgaW50IG1heFF1YW50RXJyb3I7CisKK30gU0JSX0ZSQU1FX1RFTVBfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvOworICAgIEZJWFBfREJMIG5vaXNlRmxvb3JbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworICAgIFNDSEFSIHNmYl9ucmdfY291cGxpbmdbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOyAvKiBvbmx5IHVzZWQgaWYgc3RlcmVvbW9kZSA9IFNXSVRDSF9MX1JfQyAqLworICAgIFNDSEFSIHNmYl9ucmdbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOworICAgIFNDSEFSIG5vaXNlX2xldmVsX2NvdXBsaW5nW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyogb25seSB1c2VkIGlmIHN0ZXJlb21vZGUgPSBTV0lUQ0hfTF9SX0MgKi8KKyAgICBTQ0hBUiBub2lzZV9sZXZlbFtNQVhfTlVNX05PSVNFX1ZBTFVFU107CisgICAgVUNIQVIgdHJhbnNpZW50X2luZm9bM107CisgICAgVUNIQVIgbkVudmVsb3BlczsKK30gU0JSX0VOVl9URU1QX0RBVEE7CisKKy8qCisgKiBFeHRyYWN0IGZlYXR1cmVzIGZyb20gUU1GIGRhdGEuIEFmdGVyd2FyZHMsIHRoZSBRTUYgZGF0YSBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4KKyAqLwordm9pZAorRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgICBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgICAgaF9lbnZDaGFuLAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgY21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgICAqZURhdGEsCisgICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEKKyAgICAgICAgICAgICAgICAgICAgKTsKKworCisvKgorICogUHJvY2VzcyB0aGUgcHJldmlvdXNseSBmZWF0dXJlcyBleHRyYWN0ZWQgYnkgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEKKyAqIGFuZCBjcmVhdGUvZW5jb2RlIFNCUiBlbnZlbG9wZXMuCisgKi8KK3ZvaWQKK0ZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUyKAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgICAgIGhfY29uLAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgICAgIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICAgICBzYnJFbnZDaGFubmVsMCwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICAgICBzYnJFbnZDaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgICBjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICAgICAgICplRGF0YSwKKyAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICAgICAgICpmRGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dAorICAgICAgICAgICAgICAgICAgICk7CisKK0lOVAorRkRLc2JyRW5jX0dldEVudkVzdERlbGF5KEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjM2M4MQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcApAQCAtMCwwICsxLDIwNTMgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiZnJhbV9nZW4uaCIKKyNpbmNsdWRlICJzYnJfbWlzYy5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMjA0OCA9IHsKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7IDAsIDE2fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAwLAorICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgezAsIDE2fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMl8yMDQ4ID0geworICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDgsIDE2fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgeyAwLCAgOCwgMTZ9IH07CisKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIwNDggPSB7CisgICAgICAgICAgICA0LAorICAgICAgICAgICAgeyAwLCAgNCwgIDgsIDEyLCAxNn0sCisgICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDgsIDE2fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8yMzA0ID0geworICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHsgMCwgMTh9LAorICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7IDAsIDE4fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMl8yMzA0ID0geworICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDksIDE4fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgeyAwLCAgOSwgMTh9IH07CisKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIzMDQgPSB7CisgICAgICAgICAgICA0LAorICAgICAgICAgICAgeyAwLCAgNSwgIDksIDE0LCAxOH0sCisgICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDksIDE4fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8xOTIwID0geworICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHsgMCwgMTV9LAorICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7IDAsIDE1fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMl8xOTIwID0geworICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDgsIDE1fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgeyAwLCAgOCwgMTV9IH07CisKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzE5MjAgPSB7CisgICAgICAgICAgICA0LAorICAgICAgICAgICAgeyAwLCAgNCwgIDgsIDEyLCAxNX0sCisgICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDgsIDE1fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8xMTUyID0geworICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHsgMCwgIDl9LAorICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7IDAsICA5fSB9OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMl8xMTUyID0geworICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIHsgMCwgIDUsICA5fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgeyAwLCAgNSwgIDl9IH07CisKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzExNTIgPSB7CisgICAgICAgICAgICA0LAorICAgICAgICAgICAgeyAwLCAgMiwgIDUsCisgICAgICAgICAgICAgIDcsICA5fSwKKyAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgeyAwLCAgNSwgIDl9IH07CisKKworLyogQUFDTEQgZnJhbWUgaW5mbyAqLworc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfNTEyTEQgPSB7CisgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICB7MCwgOH0sCisgICAgICAgICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICB7MCwgOH19OworCitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMl81MTJMRCA9IHsKKyAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgIHswLCA0LCA4fSwKKyAgICAgICAgICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgIHswLCA0LCA4fX07CisKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzUxMkxEID0geworICAgICAgICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgICAgICAgezAsIDIsIDQsIDYsIDh9LAorICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKKworc3RhdGljIGludAorY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLworICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMgICAvKiE8IGlucHV0IDogbnVtYmVyIG9mIHRpbWVzbG90cyAqLworICAgICAgICAgICAgICAgICAgICk7CisKK3N0YXRpYyB2b2lkCitmaWxsRnJhbWVUcmFuIChjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgICAgICAvKiE8IHR1bmluZzogZGVzaXJlZCBzZWdtZW50IGxlbmd0aHMgKi8KKyAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgICAgICAgICAgICAgaW50IHRyYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLworICAgICAgICAgICAgICAgaW50ICp2X2JvcmQsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGJvcmRlcnMgKi8KKyAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KKyAgICAgICAgICAgICAgIGludCAqdl9mcmVxLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfZnJlcSwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KKyAgICAgICAgICAgICAgIGludCAqYm1heCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCisgICAgICAgICAgICAgICApOworCitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQcmUgKElOVCBkbWF4LCBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgYm1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3QpOworCitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQb3N0IChJTlQgKnBhcnRzLCBJTlQgKmQsIElOVCBkbWF4LCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCBibWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMsIElOVCBmbWF4KTsKKworc3RhdGljIHZvaWQgZmlsbEZyYW1lSW50ZXIgKElOVCAqbkwsIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCBibWluLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkbWluLCBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cyk7CisKK3N0YXRpYyB2b2lkIGNhbGNGcmFtZUNsYXNzIChGUkFNRV9DTEFTUyAqZnJhbWVDbGFzcywgRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3NPbGQsIElOVCB0cmFuRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNwcmVhZEZsYWcpOworCitzdGF0aWMgdm9pZCBzcGVjaWFsQ2FzZSAoSU5UICpzcHJlYWRGbGFnLCBJTlQgYWxsb3dTcHJlYWQsIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBhcnRzLCBJTlQgZCk7CisKK3N0YXRpYyB2b2lkIGNhbGNDbW9uQm9yZGVyIChJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UIHRyYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMpOworCitzdGF0aWMgdm9pZCBrZWVwRm9yRm9sbG93VXAgKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9mcmVxRm9sbG93LCBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sIElOVCBwYXJ0cywgSU5UIG51bWJlclRpbWVTbG90cyk7CisKK3N0YXRpYyB2b2lkIGNhbGNDdHJsU2lnbmFsIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2JvcmQsIElOVCBsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3ByZWFkRmxhZywgSU5UIG5MKTsKKworc3RhdGljIHZvaWQgY3RybFNpZ25hbDJGcmFtZUluZm8gKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaEZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJlcV9yZXNfZml4Zml4KTsKKworCisvKiB0YWJsZSBmb3IgOCB0aW1lIHNsb3QgaW5kZXggKi8KK3N0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV84IFs4XVs1XSA9IHsKKy8qIHRyYW5zaWVudEluZGV4ICBuRW52LCB0cmFuSWR4LCBzaG9ydEVudiwgYm9yZGVyMSwgYm9yZGVyMiwgLi4uICovCisvKiBib3JkZXJzIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KKyAgICAvKlt8VC18LS0tLS0tXSovICB7IDIsIDAsIDAsIDEsIC0xIH0sCisgICAgLypbfC1ULXwtLS0tLV0qLyAgeyAyLCAwLCAwLCAyLCAtMSB9LAorICAgIC8qWy0tfFQtfC0tLS1dKi8gIHsgMywgMSwgMSwgMiwgIDQgfSwKKyAgICAvKlstLS18VC18LS0tXSovICB7IDMsIDEsIDEsIDMsICA1IH0sCisgICAgLypbLS0tLXxULXwtLV0qLyAgeyAzLCAxLCAxLCA0LCAgNiB9LAorICAgIC8qWy0tLS0tfFQtLXxdKi8gIHsgMiwgMSwgMSwgNSwgLTEgfSwKKyAgICAvKlstLS0tLS18VC18XSovICB7IDIsIDEsIDEsIDYsIC0xIH0sCisgICAgLypbLS0tLS0tLXxUfF0qLyAgeyAyLCAxLCAxLCA3LCAtMSB9LAorfTsKKworLyogdGFibGUgZm9yIDE2IHRpbWUgc2xvdCBpbmRleCAqLworc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE2IFsxNl1bNl0gPSB7CisgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KKyAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLworICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAorICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAorICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAorICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAorICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAorICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE1LCAtMSwgLTF9LAorfTsKKworLyogdGFibGUgZm9yIDE1IHRpbWUgc2xvdCBpbmRleCAqLworc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE1IFsxNV1bNl0gPSB7CisgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KKyAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLworICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCisgICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tXSovIHsgMiwgMCwgMCwgNSwgLTEsIC0xfSwKKyAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAorICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCisgICAgLypbfC0tLS18VC0tLXwtLS0tLS0tXSovIHsgMywgMSwgMSwgNCwgIDgsIC0xfSwKKyAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAorICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCisgICAgLypbfC0tLS0tLS18VC0tLXwtLS0tXSovIHsgMywgMSwgMSwgNywgMTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS18VC0tLS18XSovIHsgMiwgMSwgMSwxMCwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLS18VC18XSovIHsgMiwgMSwgMSwxMywgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBtaW5GcmFtZVRyYW5EaXN0YW5jZSA9IDQ7CisKK3N0YXRpYyBjb25zdCBGUkVRX1JFUyBmcmVxUmVzX3RhYmxlXzhbXSA9IHtGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywKKyAgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH07CisKK3N0YXRpYyBjb25zdCBGUkVRX1JFUyBmcmVxUmVzX3RhYmxlXzE2WzE2XSA9IHsKKyAgICAvKiBzaXplIG9mIGVudmVsb3BlICovCisvKiAwLTQgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csCisvKiA1LTkgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILAorLyogMTAtMTYgKi8gIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsCisgICAgICAgICAgICAgRlJFUV9SRVNfSElHSCB9OworCitzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuUG9zSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisvKiEKKyAgRnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yCisKKyAgRGVzY3JpcHRpb246ICBwcm9kdWNlcyB0aGUgRlJBTUVfSU5GTyBzdHJ1Y3QgZm9yIHRoZSBjdXJyZW50IGZyYW1lCisKKyAgQXJndW1lbnRzOiAgICBoU2JyRW52RnJhbWUgICAgICAgICAgLSBwb2ludGVyIHRvIHNiciBlbnZlbG9wZSBoYW5kbGUKKyAgICAgICAgICAgICAgICB2X3ByZV90cmFuc2llbnRfaW5mbyAgLSBwb2ludGVyIHRvIHRyYW5zaWVudCBpbmZvIHZlY3RvcgorICAgICAgICAgICAgICAgIHZfdHJhbnNpZW50X2luZm8gICAgICAtIHBvaW50ZXIgdG8gcHJldmlvdXMgdHJhbnNpZW50IGluZm8gdmVjdG9yCisgICAgICAgICAgICAgICAgdl90dW5pbmcgICAgICAgICAgICAgIC0gcG9pbnRlciB0byB0dW5pbmcgdmVjdG9yCisKKyBSZXR1cm46ICAgICAgZnJhbWVfaW5mbyAgICAgICAgLSBwb2ludGVyIHRvIFNCUl9GUkFNRV9JTkZPIHN0cnVjdAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFORExFX1NCUl9GUkFNRV9JTkZPCitGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yIChIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvX3ByZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxkR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZykKK3sKKyAgSU5UIG51bUVudiwgdHJhblBvc0ludGVybmFsPTAsIGJtaW49MCwgYm1heD0wLCBwYXJ0cywgZCwgaV9jbW9uPTAsIGlfdHJhbj0wLCBuTDsKKyAgSU5UIGZtYXggPSAwOworCisgIElOVCAqdl9ib3JkID0gaFNickVudkZyYW1lLT52X2JvcmQ7CisgIElOVCAqdl9mcmVxID0gaFNickVudkZyYW1lLT52X2ZyZXE7CisgIElOVCAqdl9ib3JkRm9sbG93ID0gaFNickVudkZyYW1lLT52X2JvcmRGb2xsb3c7CisgIElOVCAqdl9mcmVxRm9sbG93ID0gaFNickVudkZyYW1lLT52X2ZyZXFGb2xsb3c7CisKKworICBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkRm9sbG93OworICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9mcmVxRm9sbG93OworICBJTlQgKmxlbmd0aF92X2JvcmQgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkOworICBJTlQgKmxlbmd0aF92X2ZyZXEgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9mcmVxOworICBJTlQgKnNwcmVhZEZsYWcgPSAmaFNickVudkZyYW1lLT5zcHJlYWRGbGFnOworICBJTlQgKmlfdHJhbkZvbGxvdyA9ICZoU2JyRW52RnJhbWUtPmlfdHJhbkZvbGxvdzsKKyAgSU5UICppX2ZpbGxGb2xsb3cgPSAmaFNickVudkZyYW1lLT5pX2ZpbGxGb2xsb3c7CisgIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkID0gJmhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZDsKKyAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcyA9IEZJWEZJWDsKKworCisgIElOVCBhbGxvd1NwcmVhZCA9IGhTYnJFbnZGcmFtZS0+YWxsb3dTcHJlYWQ7CisgIElOVCBudW1FbnZTdGF0aWMgPSBoU2JyRW52RnJhbWUtPm51bUVudlN0YXRpYzsKKyAgSU5UIHN0YXRpY0ZyYW1pbmcgPSBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmc7CisgIElOVCBkbWluID0gaFNickVudkZyYW1lLT5kbWluOworICBJTlQgZG1heCA9IGhTYnJFbnZGcmFtZS0+ZG1heDsKKworICBJTlQgYnVmZmVyRnJhbWVTdGFydCA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0OworICBJTlQgbnVtYmVyVGltZVNsb3RzID0gaFNickVudkZyYW1lLT5TYnJHcmlkLm51bWJlclRpbWVTbG90czsKKyAgSU5UIGZyYW1lTWlkZGxlU2xvdCA9IGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90OworCisgIElOVCB0cmFuUG9zID0gdl90cmFuc2llbnRfaW5mb1swXTsKKyAgSU5UIHRyYW5GbGFnID0gdl90cmFuc2llbnRfaW5mb1sxXTsKKworICBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSA9IHZfdHVuaW5nOworICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSA9IHZfdHVuaW5nICsgMzsKKworICBoU2JyRW52RnJhbWUtPnZfdHVuaW5nU2VnbSA9IHZfdHVuaW5nU2VnbTsKKyAgSU5UIGZyZXFfcmVzX2ZpeGZpeCA9IGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4OworCisgIGlmIChsZEdyaWQpIHsKKyAgICAvKiBpbiBjYXNlIHRoZXJlIHdhcyBhIHRyYW5zaWVudCBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCBzdGFydCB3aXRoIGEgdHJhbnNpZW50IGVudmVsb3BlICovCisgICAgaWYodl90cmFuc2llbnRfaW5mb19wcmVbMV0gJiYgKG51bWJlclRpbWVTbG90cyAtIHZfdHJhbnNpZW50X2luZm9fcHJlWzBdIDwgbWluRnJhbWVUcmFuRGlzdGFuY2UpKXsKKyAgICAgIHRyYW5GbGFnID0gMTsKKyAgICAgIHRyYW5Qb3MgID0gMDsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBTeW5vcHNpczoKKyAgICoKKyAgICogVGhlIGZyYW1lIGdlbmVyYXRvciBjcmVhdGVzIHRoZSB0aW1lLS9mcmVxdWVuY3ktZ3JpZCBmb3Igb25lIFNCUiBmcmFtZS4KKyAgICogSW5wdXQgc2lnbmFscyBhcmUgcHJvdmlkZWQgYnkgdGhlIHRyYW5zaWVudCBkZXRlY3RvciBhbmQgdGhlIGZyYW1lCisgICAqIHNwbGl0dGVyICh0cmFuc2llbnREZXRlY3ROZXcoKSAmIEZyYW1lU3BsaXR0ZXIoKSBpbiB0cmFuX2RldC5jKS4gIFRoZQorICAgKiBmcmFtaW5nIGlzIGNvbnRyb2xsZWQgYnkgYWRqdXN0aW5nIHR1bmluZyBwYXJhbWV0ZXJzIHN0b3JlZCBpbgorICAgKiBGUkFNRV9HRU5fVFVOSU5HLiAgVGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiBmcmFtZSBsZW5ndGhzCisgICAqIGFuZCBiaXRyYXRlcywgYW5kIG1heSBpbiB0aGUgZnV0dXJlIGJlIHNpZ25hbCBkZXBlbmRlbnQuCisgICAqCisgICAqIFRoZSBlbnZlbG9wZSBib3JkZXJzIGFyZSBzdG9yZWQgZm9yIGZyYW1lIGdlbmVyYXRvciBpbnRlcm5hbCB1c2UgaW4KKyAgICogYUJvcmRlcnMuICBUaGUgY29udGVudHMgb2YgYUJvcmRlcnMgcmVwcmVzZW50IHBvc2l0aW9ucyBhbG9uZyB0aGUgdGltZQorICAgKiBheGlzIGdpdmVuIGluIHRoZSBmaWd1cmVzIGluIGZyYW1fZ2VuLmggKHRoZSAiZnJhbWUtZ2VuZXJhdG9yIiByb3dzKS4KKyAgICogVGhlIHVuaXQgaXMgInRpbWUgc2xvdCIuICBUaGUgZmlndXJlcyBpbiBmcmFtX2dlbi5oIGFsc28gZGVmaW5lIHRoZQorICAgKiBkZXRlY3Rpb24gcmFuZ2VzIGZvciB0aGUgdHJhbnNpZW50IGRldGVjdG9yLiAgRm9yIGV2ZXJ5IGJvcmRlciBpbgorICAgKiBhQm9yZGVycywgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIGFGcmVxUmVzLCB3aGljaCBkZWZpbmVzIHRoZQorICAgKiBmcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiB0aGUgZW52ZWxvcGUgZm9sbG93aW5nIChkZWxpbWl0ZWQgYnkpIHRoZQorICAgKiBib3JkZXIuCisgICAqCisgICAqIFdoZW4gbm8gdHJhbnNpZW50cyBhcmUgcHJlc2VudCwgRklYRklYIGNsYXNzIGZyYW1lcyBhcmUgdXNlZC4gIFRoZQorICAgKiBmcmFtZSBzcGxpdHRlciBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIG9uZSBvciB0d28gZW52ZWxvcGVzIGluIHRoZQorICAgKiBGSVhGSVggZnJhbWUuICAiU3BhcnNlIHRyYW5zaWVudHMiIChzZXBhcmF0ZWQgYnkgYSBmZXcgZnJhbWVzIHdpdGhvdXQKKyAgICogdHJhbnNpZW50cykgYXJlIGhhbmRlbGVkIGJ5IFtGSVhWQVIsIFZBUkZJWF0gcGFpcnMgb3IgKGRlcGVuZGluZyBvbgorICAgKiB0dW5pbmcgYW5kIHRyYW5zaWVudCBwb3NpdGlvbiByZWxhdGl2ZSB0aGUgbm9taW5hbCBmcmFtZSBib3VuZGFyaWVzKQorICAgKiBieSBbRklYVkFSLCBWQVJWQVIsIFZBUkZJWF0gdHJpcGxlcy4gICJUaWdodCB0cmFuc2llbnRzIiAoaW4KKyAgICogY29uc2VjdXRpdmUgZnJhbWVzKSBhcmUgaGFuZGVsZWQgYnkgWy4uLiwgVkFSVkFSLCBWQVJWQVIsIC4uLl0KKyAgICogc2VxdWVuY2VzLgorICAgKgorICAgKiBUaGUgZ2VuZXJhdG9yIGFzc3VtZXMgdGhhdCB0cmFuc2llbnRzIGFyZSAic3BhcnNlIiwgYW5kIGRlc2lnbnMKKyAgICogYm9yZGVycyBmb3IgW0ZJWFZBUiwgVkFSRklYXSBwYWlycyByaWdodCBhd2F5LCB3aGVyZSB0aGUgZmlyc3QgZnJhbWUKKyAgICogY29ycmVzcG9uZHMgdG8gdGhlIHByZXNlbnQgZnJhbWUuICBBdCB0aGUgbmV4dCBjYWxsIG9mIHRoZSBnZW5lcmF0b3IKKyAgICogaXQgaXMga25vd24gd2hldGhlciB0aGUgdHJhbnNpZW50IGFjdHVhbGx5IGlzICJzcGFyc2UiIG9yIG5vdC4gIElmCisgICAqICd5ZXMnLCB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIFZBUkZJWCBib3JkZXJzIGFyZSB1c2VkLiAgSWYgJ25vJywgbmV3CisgICAqIGJvcmRlcnMsIG1lZXRpbmcgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgInRpZ2h0IiB0cmFuc2llbnQsIGFyZQorICAgKiBjYWxjdWxhdGVkLgorICAgKgorICAgKiBUaGUgZ2VuZXJhdG9yIHByb2R1Y2VzIHR3byBvdXRwdXRzOiAgQSAiY2xlYXItdGV4dCBiaXRzdHJlYW0iIHN0b3JlZCBpbgorICAgKiBTQlJfR1JJRCwgYW5kIGEgc3RyYWlnaHQtZm9yd2FyZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JpZCBzdG9yZWQgaW4KKyAgICogU0JSX0ZSQU1FX0lORk8uICBUaGUgZm9ybWVyIGlzIHN1YnNlcXVlbnRseSBjb252ZXJ0ZWQgdG8gdGhlIGFjdHVhbAorICAgKiBiaXRzdHJlYW0gc2JyX2dyaWQoKSAoZW5jb2RlU2JyR3JpZCgpIGluIGJpdF9zYnIuYykuICBUaGUgbGF0dGVyIGlzCisgICAqIHVzZWQgYnkgb3RoZXIgZW5jb2RlciBmdW5jdGlvbnMsIHN1Y2ggYXMgdGhlIGVudmVsb3BlIGVzdGltYXRvcgorICAgKiAoY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBpbiBlbnZfZXN0LmMpIGFuZCB0aGUgbm9pc2UgZmxvb3IgYW5kIG1pc3NpbmcKKyAgICogaGFybW9uaWNzIGRldGVjdG9yIChUb25Db3JyUGFyYW1FeHRyKCkgaW4gbmZfZXN0LmMpLgorICAgKi8KKworICBpZiAoc3RhdGljRnJhbWluZykgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIElnbm9yZSB0cmFuc2llbnQgZGV0ZWN0b3IKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZnJhbWVDbGFzcyA9IEZJWEZJWDsKKyAgICBudW1FbnYgPSBudW1FbnZTdGF0aWM7ICAgICAgLyogezEsMiw0LDh9ICovCisgICAgKmZyYW1lQ2xhc3NPbGQgPSBGSVhGSVg7ICAgIC8qIGZvciBjaGFuZ2UgdG8gZHluICovCisgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CisgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICB9CisgIGVsc2UgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIENhbGN1bGF0ZSBmcmFtZSBjbGFzcyB0byB1c2UKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGNhbGNGcmFtZUNsYXNzICgmZnJhbWVDbGFzcywgZnJhbWVDbGFzc09sZCwgdHJhbkZsYWcsIHNwcmVhZEZsYWcpOworCisgICAgLyogcGF0Y2ggZm9yIG5ldyBmcmFtZSBjbGFzcyBGSVhGSVhvbmx5IGZvciBBQUMgTEQgKi8KKyAgICBpZiAodHJhbkZsYWcgJiYgbGRHcmlkKSB7CisgICAgICBmcmFtZUNsYXNzICAgICA9IEZJWEZJWG9ubHk7CisgICAgICAqZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGV2ZXJ5IHRyYW5zaWVudCBpcyBwcm9jZXNzZWQgYmVsb3cgYnkgaW5zZXJ0aW5nCisgICAgICoKKyAgICAgKiAtIG9uZSBib3JkZXIgYXQgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQKKyAgICAgKiAtIG9uZSBvciBtb3JlICJkZWNheSBib3JkZXJzIiAoYWZ0ZXIgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQpCisgICAgICogLSBvcHRpb25hbGx5IG9uZSAiYXR0YWNrIGJvcmRlciIgKGJlZm9yZSB0aGUgb25zZXQgb2YgdGhlIHRyYW5zaWVudCkKKyAgICAgKgorICAgICAqIHRob3NlIGJvcmRlcnMgYXJlIHJlZmVycmVkIHRvIGFzICJtYW5kYXRvcnkgYm9yZGVycyIgYW5kIGFyZQorICAgICAqIGRlZmluZWQgYnkgdGhlICdzZWdtZW50TGVuZ3RoJyBhcnJheSBpbiBGUkFNRV9HRU5fVFVOSU5HCisgICAgICoKKyAgICAgKiB0aGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudmVsb3BlcyBhcmUKKyAgICAgKiBkZWZpbmVkIGJ5IHRoZSAnc2VnbWVudFJlcycgYXJyYXkgaW4gRlJBTUVfR0VOX1RVTklORworICAgICAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRGVzaWduIGZyYW1lIChvciBmb2xsb3ctdXAgb2xkIGRlc2lnbikKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICh0cmFuRmxhZykgeyAgICAgICAgICAgICAvKiBBbHdheXMgZm9yIEZpeFZhciwgb2Z0ZW4gYnV0IG5vdCBhbHdheXMgZm9yIFZhclZhciAqLworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBEZXNpZ24gcGFydCBvZiBUL0YtZ3JpZCBhcm91bmQgdGhlIG5ldyB0cmFuc2llbnQKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAgIHRyYW5Qb3NJbnRlcm5hbCA9IGZyYW1lTWlkZGxlU2xvdCArIHRyYW5Qb3MgKyBidWZmZXJGcmFtZVN0YXJ0IDsgICAgICAvKiBGSCAwMC0wNi0yNiAqLworICAgICAgLyoKKyAgICAgICAgYWRkIG1hbmRhdG9yeSBib3JkZXJzIGFyb3VuZCB0cmFuc2llbnQKKyAgICAgICovCisKKyAgICAgIGZpbGxGcmFtZVRyYW4gKCB2X3R1bmluZ1NlZ20sCisgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmdGcmVxLAorICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICZibWluLAorICAgICAgICAgICAgICAgICAgICAgJmJtYXggKTsKKworICAgICAgLyogbWFrZSBzdXJlIHdlIHN0YXkgd2l0aGluIHRoZSBtYXhpbXVtIFNCUiBmcmFtZSBvdmVybGFwICovCisgICAgICBmbWF4ID0gY2FsY0ZpbGxMZW5ndGhNYXgodHJhblBvcywgbnVtYmVyVGltZVNsb3RzKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKKworICAgIGNhc2UgRklYRklYb25seToKKyAgICAgIEZES19BU1NFUlQobGRHcmlkKTsKKyAgICAgIHRyYW5Qb3NJbnRlcm5hbCA9IHRyYW5Qb3M7CisgICAgICBnZW5lcmF0ZUZpeEZpeE9ubHkgKCAmKGhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaFNickVudkZyYW1lLT5TYnJHcmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cworICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgcmV0dXJuICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pOworCisgICAgY2FzZSBGSVhWQVI6CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBGaWxsIHJlZ2lvbiBiZWZvcmUgbmV3IHRyYW5zaWVudDoKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICBibWluLCBibWluIC0gYnVmZmVyRnJhbWVTdGFydCk7ICAgICAvKiBGSCAwMC0wNi0yNiAqLworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEZpbGwgcmVnaW9uIGFmdGVyIG5ldyB0cmFuc2llbnQ6CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgZmlsbEZyYW1lUG9zdCAoJnBhcnRzLCAmZCwgZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLCBibWF4LCBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMsIGZtYXgpOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFRha2UgY2FyZSBvZiBzcGVjaWFsIGNhc2U6CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAgIC8qIG5vIGZpbGwsIHNob3J0IGxhc3QgZW52ZWxvcGUgKi8KKyAgICAgICAgc3BlY2lhbENhc2UgKHNwcmVhZEZsYWcsIGFsbG93U3ByZWFkLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsICZwYXJ0cywgZCk7CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ2FsY3VsYXRlIGNvbW1vbiBib3JkZXIgKHNwbGl0LXBvaW50KQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGNhbGNDbW9uQm9yZGVyICgmaV9jbW9uLCAmaV90cmFuLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMpOyAgICAgICAvKiBGSCAwMC0wNi0yNiAqLworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAga2VlcEZvckZvbGxvd1VwICh2X2JvcmRGb2xsb3csIGxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcUZvbGxvdywgaV90cmFuRm9sbG93LCBpX2ZpbGxGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgcGFydHMsIG51bWJlclRpbWVTbG90cyk7ICAvKiBGSCAwMC0wNi0yNiAqLworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIENhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGNhbGNDdHJsU2lnbmFsICgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgKmxlbmd0aF92X2JvcmQsIHZfZnJlcSwgKmxlbmd0aF92X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgaV9jbW9uLCBpX3RyYW4sICpzcHJlYWRGbGFnLCBEQyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRm9sbG93LXVwIG9sZCB0cmFuc2llbnQgLSBjYWxjdWxhdGUgY29udHJvbCBzaWduYWwKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3csIERDLCAqaV90cmFuRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICpzcHJlYWRGbGFnLCBEQyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZBUlZBUjoKKyAgICAgIGlmICgqc3ByZWFkRmxhZykgeyAgICAgICAgLyogc3ByZWFkIGFjcm9zcyB0aHJlZSBmcmFtZXMgKi8KKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGNhbGNDdHJsU2lnbmFsICgmaFNickVudkZyYW1lLT5TYnJHcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDbGFzcywgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3csIERDLAorICAgICAgICAgICAgICAgICAgICAgICAgKmlfdHJhbkZvbGxvdywgKnNwcmVhZEZsYWcsIERDKTsKKworICAgICAgICAqc3ByZWFkRmxhZyA9IDA7CisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIHZfYm9yZEZvbGxvd1swXSA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19hYnNfYm9yZF8xIC0gbnVtYmVyVGltZVNsb3RzOyAvKiBGSCAwMC0wNi0yNiAqLworICAgICAgICB2X2ZyZXFGb2xsb3dbMF0gPSAxOworICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IDE7CisgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gMTsKKworICAgICAgICAqaV90cmFuRm9sbG93ID0gLURDOworICAgICAgICAqaV9maWxsRm9sbG93ID0gLURDOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBEZXNpZ24gcmVtYWluaW5nIHBhcnRzIG9mIFQvRi1ncmlkIChhc3N1bWluZyBuZXh0IGZyYW1lIGlzIFZhckZpeCkKKyAgICAgICAgICBhZGFwdCBvciBmaWxsIHJlZ2lvbiBiZWZvcmUgbmV3IHRyYW5zaWVudDoKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgZmlsbEZyYW1lSW50ZXIgKCZuTCwgdl90dW5pbmdTZWdtLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csICppX2ZpbGxGb2xsb3csIGRtaW4sIGRtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBGaWxsIGFmdGVyIHRyYW5zaWVudDoKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgZmlsbEZyYW1lUG9zdCAoJnBhcnRzLCAmZCwgZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywgZm1heCk7CisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIFRha2UgY2FyZSBvZiBzcGVjaWFsIGNhc2U6CisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGlmIChwYXJ0cyA9PSAxICYmIGQgPCBkbWluKSAgICAgLyolIG5vIGZpbGwsIHNob3J0IGxhc3QgZW52ZWxvcGUgKi8KKyAgICAgICAgICBzcGVjaWFsQ2FzZSAoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBDYWxjdWxhdGUgY29tbW9uIGJvcmRlciAoc3BsaXQtcG9pbnQpCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGNhbGNDbW9uQm9yZGVyICgmaV9jbW9uLCAmaV90cmFuLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7CisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGtlZXBGb3JGb2xsb3dVcCAodl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgbGVuZ3RoX3ZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpX3RyYW5Gb2xsb3csIGlfZmlsbEZvbGxvdywgdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIHBhcnRzLCBudW1iZXJUaW1lU2xvdHMpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBDYWxjdWxhdGUgY29udHJvbCBzaWduYWwKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgY2FsY0N0cmxTaWduYWwgKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNsYXNzLCB2X2JvcmQsICpsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIDAsIG5MKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklYRklYOgorICAgICAgaWYgKHRyYW5Qb3MgPT0gMCkKKyAgICAgICAgbnVtRW52ID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbnVtRW52ID0gMjsKKworICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CisgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENvbnZlcnQgY29udHJvbCBzaWduYWwgdG8gZnJhbWUgaW5mbyBzdHJ1Y3QKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgY3RybFNpZ25hbDJGcmFtZUluZm8gKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxX3Jlc19maXhmaXgpOworCisgIHJldHVybiAmaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm87Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgR25lcmF0ZXMgZnJhbWUgaW5mbyBmb3IgRklYRklYb25seSBmcmFtZSBjbGFzcyB1c2VkIGZvciBsb3cgZGVsYXkgdmVyc2lvbgorCisgIFxyZXR1cm4gICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seSAoIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIGludCBuRW52LCBpLCBrPTAsIHRyYW5JZHg7CisgIGNvbnN0IGludCAqcFRhYmxlID0gTlVMTDsKKyAgY29uc3QgRlJFUV9SRVMgKmZyZXFSZXNUYWJsZSA9IE5VTEw7CisKKyAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzhbdHJhblBvc0ludGVybmFsXTsKKyAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzg7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE1OgorICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfMTVbdHJhblBvc0ludGVybmFsXTsKKyAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzE2OworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzE2W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV8xNjsKKyAgICAgICAgICBicmVhazsKKyAgfQorCisgIC8qIGxvb2sgbnVtYmVyIG9mIGVudm9scGVzIGluIHRhYmxlICovCisgIG5FbnYgPSBwVGFibGVbMF07CisgIC8qIGxvb2sgdXAgZW52b2xwZSBkaXN0cmlidXRpb24gaW4gdGFibGUgKi8KKyAgZm9yIChpPTE7IGk8bkVudjsgaSsrKQorICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSsyXTsKKworICAvKiBvcGVuIGFuZCBjbG9zZSBmcmFtZSBib3JkZXIgKi8KKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSAgICA9IDA7CisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBudW1iZXJUaW1lU2xvdHM7CisKKyAgLyogYWRqdXN0IHNlZ21lbnQtZnJlcXVlbmN5LXJlc29sdXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWdtZW50LWxlbmd0aCAqLworICBmb3IgKGk9MDsgaTxuRW52OyBpKyspeworICAgIGsgPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2krMV0gLSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldOworICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBmcmVxUmVzVGFibGVba107CisgICAgaFNickdyaWQtPnZfZltpXSA9IGZyZXFSZXNUYWJsZVtrXTsKKyAgfQorCisgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiAgID0gcFRhYmxlWzJdOworICAvKiB0cmFuc2llbnQgaWR4ICovCisgIHRyYW5JZHggPSBwVGFibGVbMV07CisKKyAgLyogYWRkIG5vaXNlIGZsb29ycyAqLworICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSAwOworICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHg/dHJhbklkeDoxXTsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gbnVtYmVyVGltZVNsb3RzOworICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOworCisgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gRklYRklYb25seTsKKyAgaFNickdyaWQtPmJzX2Fic19ib3JkID0gdHJhblBvc0ludGVybmFsOworICBoU2JyR3JpZC0+YnNfbnVtX2VudiA9IG5FbnY7CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czogICBoU2JyRW52RnJhbWUgIC0gcG9pbnRlciB0byBzYnIgZW52ZWxvcGUgaGFuZGxlCisgICAgICAgICAgICAgIGFsbG93U3ByZWFkICAgLSBjb21tYW5kbGluZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgbnVtRW52U3RhdGljICAtIGNvbW1hbmRsaW5lIHBhcmFtZXRlcgorICAgICAgICAgICAgICBzdGF0aWNGcmFtaW5nIC0gY29tbWFuZGxpbmUgcGFyYW1ldGVyCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFsbG93U3ByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRW52U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAsaW50IGxkR3JpZAorICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkggMDAtMDYtMjYgKi8KKworICBGREttZW1jbGVhcihoU2JyRW52RnJhbWUsc2l6ZW9mKFNCUl9FTlZFTE9QRV9GUkFNRSApKTsKKworCisgIC8qIEluaXRpYWxpc2F0aW9uICovCisgIGhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKKyAgaFNickVudkZyYW1lLT5zcHJlYWRGbGFnID0gMDsKKworICBoU2JyRW52RnJhbWUtPmFsbG93U3ByZWFkID0gYWxsb3dTcHJlYWQ7CisgIGhTYnJFbnZGcmFtZS0+bnVtRW52U3RhdGljID0gbnVtRW52U3RhdGljOworICBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmcgPSBzdGF0aWNGcmFtaW5nOworICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeCA9IGZyZXFfcmVzX2ZpeGZpeDsKKworICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQgPSAwOworICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3cgPSAwOworCisgIGhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcSA9IDA7CisgIGhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IDA7CisKKyAgaFNickVudkZyYW1lLT5pX3RyYW5Gb2xsb3cgPSAwOworICBoU2JyRW52RnJhbWUtPmlfZmlsbEZvbGxvdyA9IDA7CisKKyAgaFNickVudkZyYW1lLT5TYnJHcmlkLm51bWJlclRpbWVTbG90cyA9IHRpbWVTbG90czsKKworICBpZiAobGRHcmlkKSB7CisgICAgLypjYXNlIENPREVDX0FBQ0xEOiovCisgICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOworICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTY7CisgICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOworICB9IGVsc2UKKyAgc3dpdGNoKHRpbWVTbG90cyl7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKKyAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOworICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOworICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOworICAgIGJyZWFrOworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKKyAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7CisgICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxMjsKKyAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKKyAgICBicmVhazsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOworICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gODsKKyAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMTE1MjsKKyAgICBicmVhazsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6CisgICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OworICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTU7CisgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CisgICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzIzMDQ7CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lVHJhbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiAgQWRkIG1hbmRhdG9yeSBib3JkZXJzLCBhcyBkZXNjcmliZWQgYnkgdGhlIHR1bmluZyB2ZWN0b3IKKyAgICAgICAgICAgICAgIGFuZCB0aGUgY3VycmVudCB0cmFuc2llbnQgcG9zaXRpb24KKworIEFyZ3VtZW50czoKKyAgICAgIG1vZGlmaWVkOgorICAgICAgICAgICAgICB2X2JvcmQgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9ib3JkIHZlY3RvcgorICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkIC0gbGVuZ3RoIG9mIHZfYm9yZCB2ZWN0b3IKKyAgICAgICAgICAgICAgdl9mcmVxICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfZnJlcSB2ZWN0b3IKKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSAtIGxlbmd0aCBvZiB2X2ZyZXEgdmVjdG9yCisgICAgICAgICAgICAgIGJtaW4gICAgICAgICAgLSBpbnQgcG9pbnRlciB0byBibWluIChjYWxsIGJ5IHJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgYm1heCAgICAgICAgICAtIGludCBwb2ludGVyIHRvIGJtYXggKGNhbGwgYnkgcmVmZXJlbmNlKQorICAgICAgbm90IG1vZGlmaWVkOgorICAgICAgICAgICAgICB0cmFuICAgICAgICAgIC0gcG9zaXRpb24gb2YgdHJhbnNpZW50CisgICAgICAgICAgICAgIHZfdHVuaW5nU2VnbSAgLSBpbnQgcG9pbnRlciB0byB2X3R1bmluZ1NlZ20gdmVjdG9yCisgICAgICAgICAgICAgIHZfdHVuaW5nRnJlcSAgLSBpbnQgcG9pbnRlciB0byB2X3R1bmluZ0ZyZXEgdmVjdG9yCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ZpbGxGcmFtZVRyYW4gKGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIHNlZ21lbnQgbGVuZ3RocyAqLworICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZ0ZyZXEsICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgICAgICAgICAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCisgICAgICAgICAgICAgICBpbnQgKnZfYm9yZCwgICAgICAgICAgICAgICAgICAvKiE8IG1lbU5ldzogYm9yZGVycyAqLworICAgICAgICAgICAgICAgaW50ICpsZW5ndGhfdl9ib3JkLCAgICAgICAgICAgLyohPCBtZW1OZXc6ICMgYm9yZGVycyAqLworICAgICAgICAgICAgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgICAgICAgICAgICAgaW50ICpsZW5ndGhfdl9mcmVxLCAgICAgICAgICAgLyohPCBtZW1OZXc6ICMgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgICAgICAgICAgICBpbnQgKmJtaW4sICAgICAgICAgICAgICAgICAgICAvKiE8IGhscE5ldzogZmlyc3QgbWFuZGF0b3J5IGJvcmRlciAqLworICAgICAgICAgICAgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGJvcmQsIGk7CisKKyAgKmxlbmd0aF92X2JvcmQgPSAwOworICAqbGVuZ3RoX3ZfZnJlcSA9IDA7CisKKyAgLyogYWRkIGF0dGFjayBlbnYgbGVhZGluZyBib3JkZXIgKG9wdGlvbmFsKSAqLworICBpZiAodl90dW5pbmdTZWdtWzBdKSB7CisgICAgLyogdl9ib3JkID0gWyhCYSldIHN0YXJ0IG9mIGF0dGFjayBlbnYgKi8KKyAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgKHRyYW4gLSB2X3R1bmluZ1NlZ21bMF0pKTsKKworICAgIC8qIHZfZnJlcSA9IFsoRmEpXSByZXMgb2YgYXR0YWNrIGVudiAqLworICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMF0pOworICB9CisKKyAgLyogYWRkIGF0dGFjayBlbnYgdHJhaWxpbmcgYm9yZGVyL2ZpcnN0IGRlY2F5IGVudiBsZWFkaW5nIGJvcmRlciAqLworICBib3JkID0gdHJhbjsKKyAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW4pOyAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMV0gKi8KKworICAvKiBhZGQgZmlyc3QgZGVjYXkgZW52IHRyYWlsaW5nIGJvcmRlci8yOm5kIGRlY2F5IGVudiBsZWFkaW5nIGJvcmRlciAqLworICBpZiAodl90dW5pbmdTZWdtWzFdKSB7CisgICAgYm9yZCArPSB2X3R1bmluZ1NlZ21bMV07CisKKyAgICAvKiB2X2JvcmQgPSBbKEJhKSxCZDEsQmQyXSAqLworICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKKworICAgIC8qIHZfZnJlcSA9IFsoRmEpLEZkMV0gKi8KKyAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzFdKTsKKyAgfQorCisgIC8qIGFkZCAyOm5kIGRlY2F5IGVudiB0cmFpbGluZyBib3JkZXIgKG9wdGlvbmFsKSAqLworICBpZiAodl90dW5pbmdTZWdtWzJdICE9IDApIHsKKyAgICBib3JkICs9IHZfdHVuaW5nU2VnbVsyXTsKKworICAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMSwgQmQyLChCZDMpXSAqLworICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKKworICAgIC8qIHZfZnJlcSA9IFsoRmEpLEZkMSwoRmQyKV0gKi8KKyAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzJdKTsKKyAgfQorCisgIC8qICB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMiksMV0gKi8KKyAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOworCisKKyAgLyogIGNhbGMgbWluIGFuZCBtYXggdmFsdWVzIG9mIG1hbmRhdG9yeSBib3JkZXJzICovCisgICpibWluID0gdl9ib3JkWzBdOworICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKKyAgICBpZiAodl9ib3JkW2ldIDwgKmJtaW4pCisgICAgICAqYm1pbiA9IHZfYm9yZFtpXTsKKworICAqYm1heCA9IHZfYm9yZFswXTsKKyAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCisgICAgaWYgKHZfYm9yZFtpXSA+ICpibWF4KQorICAgICAgKmJtYXggPSB2X2JvcmRbaV07CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lUHJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246IEFkZCBib3JkZXJzIGJlZm9yZSBtYW5kYXRvcnkgYm9yZGVycywgaWYgbmVlZGVkCisKKyBBcmd1bWVudHM6CisgICAgICAgbW9kaWZpZWQ6CisgICAgICAgICAgICAgIHZfYm9yZCAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2JvcmQgdmVjdG9yCisgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQgLSBsZW5ndGggb2Ygdl9ib3JkIHZlY3RvcgorICAgICAgICAgICAgICB2X2ZyZXEgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9mcmVxIHZlY3RvcgorICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxIC0gbGVuZ3RoIG9mIHZfZnJlcSB2ZWN0b3IKKyAgICAgICBub3QgbW9kaWZpZWQ6CisgICAgICAgICAgICAgIGRtYXggICAgICAgICAgLSBpbnQgdmFsdWUKKyAgICAgICAgICAgICAgYm1pbiAgICAgICAgICAtIGludCB2YWx1ZQorICAgICAgICAgICAgICByZXN0ICAgICAgICAgIC0gaW50IHZhbHVlCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ZpbGxGcmFtZVByZSAoSU5UIGRtYXgsCisgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCisgICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCisgICAgICAgICAgICAgIElOVCBibWluLCBJTlQgcmVzdCkKK3sKKyAgLyoKKyAgICBpbnB1dCBzdGF0ZToKKyAgICB2X2JvcmQgPSBbKEJhKSxCZDEsIEJkMiAsKEJkMyldCisgICAgdl9mcmVxID0gWyhGYSksRmQxLChGZDIpLDEgXQorICAqLworCisgIElOVCBwYXJ0cywgZCwgaiwgUywgcyA9IDAsIHNlZ20sIGJvcmQ7CisKKyAgLyoKKyAgICBzdGFydCB3aXRoIG9uZSBlbnZlbG9wZQorICAqLworCisgIHBhcnRzID0gMTsKKyAgZCA9IHJlc3Q7CisKKyAgLyoKKyAgICBjYWxjICMgb2YgYWRkaXRpb25hbCBlbnZlbG9wZXMgYW5kIGNvcnJlc3BvbmRpbmcgbGVuZ3RocworICAqLworCisgIHdoaWxlIChkID4gZG1heCkgeworICAgIHBhcnRzKys7CisKKyAgICBzZWdtID0gcmVzdCAvIHBhcnRzOworICAgIFMgPSAoc2VnbSAtIDIpPj4xOworICAgIHMgPSBmaXhNaW4gKDgsIDIgKiBTICsgMik7CisgICAgZCA9IHJlc3QgLSAocGFydHMgLSAxKSAqIHM7CisgIH0KKworICAvKgorICAgIGFkZCBib3JkZXJzIGJlZm9yZSBtYW5kYXRvcnkgYm9yZGVycworICAqLworCisgIGJvcmQgPSBibWluOworCisgIGZvciAoaiA9IDA7IGogPD0gcGFydHMgLSAyOyBqKyspIHsKKyAgICBib3JkID0gYm9yZCAtIHM7CisKKyAgICAvKiB2X2JvcmQgPSBbLi4uLChCZiksKEJhKSxCZDEsIEJkMiAsKEJkMyldICovCisgICAgRkRLc2JyRW5jX0FkZExlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisKKyAgICAvKiB2X2ZyZXEgPSBbLi4uLCgxICksKEZhKSxGZDEsKEZkMiksIDEgICBdICovCisgICAgRkRLc2JyRW5jX0FkZExlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgT3ZlcmxhcCBjb250cm9sCisKKyAgQ2FsY3VsYXRlIG1heCBsZW5ndGggb2YgdHJhaWxpbmcgZmlsbCBzZWdtZW50cywgc3VjaCB0aGF0IHdlIGFsd2F5cyBnZXQgYQorICBib3JkZXIgd2l0aGluIHRoZSBmcmFtZSBvdmVybGFwIHJlZ2lvbgorCisgIFxyZXR1cm4gdm9pZAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLworICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMgICAvKiE8IGlucHV0IDogbnVtYmVyIG9mIHRpbWVzbG90cyAqLworICAgICAgICAgICAgICAgICAgICkKK3sKKyAgaW50IGZtYXg7CisKKyAgLyoKKyAgICBjYWxjdWxhdGUgdHJhbnNpZW50IHBvc2l0aW9uIHdpdGhpbiBlbnZlbG9wZSBidWZmZXIKKyAgKi8KKyAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpCisgIHsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgIGlmICh0cmFuUG9zIDwgNCkKKyAgICAgICAgICBmbWF4ID0gNjsKKyAgICAgICAgZWxzZSBpZiAodHJhblBvcyA9PSA0IHx8IHRyYW5Qb3MgPT0gNSkKKyAgICAgICAgICBmbWF4ID0gNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZtYXggPSA4OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgICAgaWYgKHRyYW5Qb3MgPCA0KQorICAgICAgICAgIGZtYXggPSA1OworICAgICAgICBlbHNlIGlmICh0cmFuUG9zID09IDQgfHwgdHJhblBvcyA9PSA1KQorICAgICAgICAgIGZtYXggPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgZm1heCA9IDc7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZm1heCA9IDg7CisgICAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGZtYXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lUG9zdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiAtQWRkIGJvcmRlcnMgYWZ0ZXIgbWFuZGF0b3J5IGJvcmRlcnMsIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgTWFrZSBhIHByZWxpbWluYXJ5IGRlc2lnbiBvZiBuZXh0IGZyYW1lLAorICAgICAgICAgICAgICAgYXNzdW1pbmcgbm8gdHJhbnNpZW50IGlzIHByZXNlbnQgdGhlcmUKKworIEFyZ3VtZW50czoKKyAgICAgICBtb2RpZmllZDoKKyAgICAgICAgICAgICAgcGFydHMgICAgICAgICAtIGludCBwb2ludGVyIHRvIHBhcnRzIChjYWxsIGJ5IHJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgZCAgICAgICAgICAgICAtIGludCBwb2ludGVyIHRvIGQgKGNhbGwgYnkgcmVmZXJlbmNlKQorICAgICAgICAgICAgICB2X2JvcmQgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9ib3JkIHZlY3RvcgorICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkIC0gbGVuZ3RoIG9mIHZfYm9yZCB2ZWN0b3IKKyAgICAgICAgICAgICAgdl9mcmVxICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfZnJlcSB2ZWN0b3IKKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSAtIGxlbmd0aCBvZiB2X2ZyZXEgdmVjdG9yCisgICAgICAgIG5vdCBtb2RpZmllZDoKKyAgICAgICAgICAgICAgYm1heCAgICAgICAgICAtIGludCB2YWx1ZQorICAgICAgICAgICAgICBkbWF4ICAgICAgICAgIC0gaW50IHZhbHVlCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ZpbGxGcmFtZVBvc3QgKElOVCAqcGFydHMsIElOVCAqZCwgSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCisgICAgICAgICAgICAgICBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgYm1heCwKKyAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzLCBJTlQgZm1heCkKK3sKKyAgSU5UIGosIHJlc3QsIHNlZ20sIFMsIHMgPSAwLCBib3JkOworCisgIC8qCisgICAgaW5wdXQgc3RhdGU6CisgICAgdl9ib3JkID0gWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpXQorICAgIHZfZnJlcSA9IFsuLi4sKDEgKSwoRmEpLEZkMSwoRmQyKSwxICAgIF0KKyAgKi8KKworICByZXN0ID0gYnVmZmVyRnJhbWVTdGFydCArIDIgKiBudW1iZXJUaW1lU2xvdHMgLSBibWF4OworICAqZCA9IHJlc3Q7CisKKyAgaWYgKCpkID4gMCkgeworICAgICpwYXJ0cyA9IDE7ICAgICAgICAgICAvKiBzdGFydCB3aXRoIG9uZSBlbnZlbG9wZSAqLworCisgICAgLyogY2FsYyAjIG9mIGFkZGl0aW9uYWwgZW52ZWxvcGVzIGFuZCBjb3JyZXNwb25kaW5nIGxlbmd0aHMgKi8KKworICAgIHdoaWxlICgqZCA+IGRtYXgpIHsKKyAgICAgICpwYXJ0cyA9ICpwYXJ0cyArIDE7CisKKyAgICAgIHNlZ20gPSByZXN0IC8gKCpwYXJ0cyk7CisgICAgICBTID0gKHNlZ20gLSAyKT4+MTsKKyAgICAgIHMgPSBmaXhNaW4gKGZtYXgsIDIgKiBTICsgMik7CisgICAgICAqZCA9IHJlc3QgLSAoKnBhcnRzIC0gMSkgKiBzOworICAgIH0KKworICAgIC8qIGFkZCBib3JkZXJzIGFmdGVyIG1hbmRhdG9yeSBib3JkZXJzICovCisKKyAgICBib3JkID0gYm1heDsKKyAgICBmb3IgKGogPSAwOyBqIDw9ICpwYXJ0cyAtIDI7IGorKykgeworICAgICAgYm9yZCArPSBzOworCisgICAgICAvKiB2X2JvcmQgPSAgWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpLChCZildICovCisgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisKKyAgICAgIC8qIHZfZnJlcSA9ICBbLi4uLCgxICksKEZhKSxGZDEsKEZkMiksIDEgICAsIDEhICwxXSAqLworICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAqcGFydHMgPSAxOworCisgICAgLyogcmVtb3ZlIGxhc3QgZWxlbWVudCBmcm9tIHZfYm9yZCBhbmQgdl9mcmVxICovCisKKyAgICAqbGVuZ3RoX3ZfYm9yZCA9ICpsZW5ndGhfdl9ib3JkIC0gMTsKKyAgICAqbGVuZ3RoX3ZfZnJlcSA9ICpsZW5ndGhfdl9mcmVxIC0gMTsKKworICB9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZUludGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgbkwgICAgICAgICAgICAgICAgICAtCisgICAgICAgICAgICAgIHZfdHVuaW5nU2VnbSAgICAgICAgLQorICAgICAgICAgICAgICB2X2JvcmQgICAgICAgICAgICAgIC0KKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCAgICAgICAtCisgICAgICAgICAgICAgIGJtaW4gICAgICAgICAgICAgICAgLQorICAgICAgICAgICAgICB2X2ZyZXEgICAgICAgICAgICAgIC0KKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSAgICAgICAtCisgICAgICAgICAgICAgIHZfYm9yZEZvbGxvdyAgICAgICAgLQorICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkRm9sbG93IC0KKyAgICAgICAgICAgICAgdl9mcmVxRm9sbG93ICAgICAgICAtCisgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3cgLQorICAgICAgICAgICAgICBpX2ZpbGxGb2xsb3cgICAgICAgIC0KKyAgICAgICAgICAgICAgZG1pbiAgICAgICAgICAgICAgICAtCisgICAgICAgICAgICAgIGRtYXggICAgICAgICAgICAgICAgLQorCisgUmV0dXJuOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitmaWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCisgICAgICAgICAgICAgICAgSU5UIGJtaW4sIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LCBJTlQgZG1pbiwKKyAgICAgICAgICAgICAgICBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cykKK3sKKyAgSU5UIG1pZGRsZSwgYl9uZXcsIG51bUJvcmRGb2xsb3csIGJvcmRNYXhGb2xsb3csIGk7CisKKyAgaWYgKG51bWJlclRpbWVTbG90cyAhPSBOVU1CRVJfVElNRV9TTE9UU18xMTUyKSB7CisKKyAgICAvKiAlIHJlbW92ZSBmaWxsIGJvcmRlcnM6ICovCisgICAgaWYgKGlfZmlsbEZvbGxvdyA+PSAxKSB7CisgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IGlfZmlsbEZvbGxvdzsKKyAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gaV9maWxsRm9sbG93OworICAgIH0KKworICAgIG51bUJvcmRGb2xsb3cgPSAqbGVuZ3RoX3ZfYm9yZEZvbGxvdzsKKyAgICBib3JkTWF4Rm9sbG93ID0gdl9ib3JkRm9sbG93W251bUJvcmRGb2xsb3cgLSAxXTsKKworICAgIC8qIHJlbW92ZSBldmVuIG1vcmUgYm9yZGVycyBpZiBuZWVkZWQgKi8KKyAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKKyAgICB3aGlsZSAobWlkZGxlIDwgMCkgeworICAgICAgbnVtQm9yZEZvbGxvdy0tOworICAgICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CisgICAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKKyAgICB9CisKKyAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CisgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSBudW1Cb3JkRm9sbG93OworICAgICpuTCA9IG51bUJvcmRGb2xsb3cgLSAxOworCisgICAgYl9uZXcgPSAqbGVuZ3RoX3ZfYm9yZDsKKworCisgICAgaWYgKG1pZGRsZSA8PSBkbWF4KSB7CisgICAgICBpZiAobWlkZGxlID49IGRtaW4pIHsgICAgICAgLyogY29uY2F0ZW5hdGUgKi8KKyAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgfQorCisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKHZfdHVuaW5nU2VnbVswXSAhPSAwKSB7ICAgICAgIC8qIHJlbW92ZSBvbmUgbmV3IGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KKyAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKKyAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKworICAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOworICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEgKyAxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPiAxKSB7IC8qIHJlbW92ZSBvbmUgb2xkIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOworICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisKKyAgICAgICAgICAgICpuTCA9ICpuTCAtIDE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBuZXcgInRyYW5zaWVudCIgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspCisgICAgICAgICAgICAgIHZfYm9yZFtpXSA9IHZfYm9yZFtpICsgMV07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKKyAgICAgICAgICAgICAgdl9mcmVxW2ldID0gdl9mcmVxW2kgKyAxXTsKKworICAgICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CisgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKKworICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pZGRsZSA+IGRtYXggKi8KKworICAgICAgZmlsbEZyYW1lUHJlIChkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgYm1pbiwKKyAgICAgICAgICBtaWRkbGUpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICB9CisKKworICB9CisgIGVsc2UgeyAvKiBudW1iZXJUaW1lU2xvdHM9PU5VTUJFUl9USU1FX1NMT1RTXzExNTIgKi8KKworICAgIElOVCBsLG07CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICByZW1vdmUgZmlsbCBib3JkZXJzCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChpX2ZpbGxGb2xsb3cgPj0gMSkgeworICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSBpX2ZpbGxGb2xsb3c7CisgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IGlfZmlsbEZvbGxvdzsKKyAgICB9CisKKyAgICBudW1Cb3JkRm9sbG93ID0gKmxlbmd0aF92X2JvcmRGb2xsb3c7CisgICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgcmVtb3ZlIG1vcmUgYm9yZGVycyBpZiBuZWNlc3NhcnkgdG8gZWxpbWluYXRlIG92ZXJsYXAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiBjaGVjayBmb3Igb3ZlcmxhcCAqLworICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OworCisgICAgLyogaW50ZXJ2YWxzOgorICAgICAgIGkpICAgICAgICAgICAgIG1pZGRsZSA8ICAwICAgICA6IG92ZXJsYXAsIG11c3QgcmVtb3ZlIGJvcmRlcnMKKyAgICAgICBpaSkgICAgICAgMCA8PSBtaWRkbGUgPCAgZG1pbiAgOiBubyBvdmVybGFwIGJ1dCB0b28gdGlnaHQsIG11c3QgcmVtb3ZlIGJvcmRlcnMKKyAgICAgICBpaWkpICAgZG1pbiA8PSBtaWRkbGUgPD0gZG1heCAgOiBvaywganVzdCBjb25jYXRlbmF0ZQorICAgICAgIGl2KSAgICBkbWF4IDw9IG1pZGRsZSAgICAgICAgICA6IHRvbyB3aWRlLCBtdXN0IGFkZCBib3JkZXJzCisgICAgICovCisKKyAgICAvKiBmaXJzdCByZW1vdmUgb2xkIG5vbi1maWxsLWJvcmRlcnMuLi4gKi8KKyAgICB3aGlsZSAobWlkZGxlIDwgMCkgeworCisgICAgICAvKiAuLi5idXQgZG9uJ3QgcmVtb3ZlIGFsbCBvZiB0aGVtICovCisgICAgICBpZiAobnVtQm9yZEZvbGxvdyA9PSAxKQorICAgICAgICBicmVhazsKKworICAgICAgbnVtQm9yZEZvbGxvdy0tOworICAgICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CisgICAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKKyAgICB9CisKKyAgICAvKiBpZiB0aGlzIGlzbid0IGVub3VnaCwgcmVtb3ZlIG5ldyBub24tZmlsbCBib3JkZXJzICovCisgICAgaWYgKG1pZGRsZSA8IDApCisgICAgeworICAgICAgZm9yIChsID0gMCwgbSA9IDAgOyBsIDwgKmxlbmd0aF92X2JvcmQgOyBsKyspCisgICAgICB7CisgICAgICAgIGlmKHZfYm9yZFtsXT4gYm9yZE1heEZvbGxvdykKKyAgICAgICAgeworICAgICAgICAgIHZfYm9yZFttXSA9IHZfYm9yZFtsXTsKKyAgICAgICAgICB2X2ZyZXFbbV0gPSB2X2ZyZXFbbF07CisgICAgICAgICAgbSsrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgICpsZW5ndGhfdl9ib3JkID0gbDsKKyAgICAgICpsZW5ndGhfdl9mcmVxID0gbDsKKworICAgICAgYm1pbiA9IHZfYm9yZFswXTsKKworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB1cGRhdGUgbW9kaWZpZWQgZm9sbG93LXVwIGRhdGEKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CisgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSBudW1Cb3JkRm9sbG93OworCisgICAgLyogbGVmdCByZWxhdGl2ZSBib3JkZXJzIGNvcnJlc3BvbmQgdG8gZm9sbG93LXVwICovCisgICAgKm5MID0gbnVtQm9yZEZvbGxvdyAtIDE7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgdGFrZSBjYXJlIG9mIGludGVydmFscyBpaSB0aHJvdWdoIGl2CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogbm93IG1pZGRsZSBzaG91bGQgYmUgPj0gMCAqLworICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OworCisgICAgaWYgKG1pZGRsZSA8PSBkbWluKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGlpKSAqLworICAgIHsKKyAgICAgIGJfbmV3ID0gKmxlbmd0aF92X2JvcmQ7CisKKyAgICAgIGlmICh2X3R1bmluZ1NlZ21bMF0gIT0gMCkKKyAgICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIG5ldyAibHV4dXJ5IiBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCisgICAgICAgICpsZW5ndGhfdl9ib3JkID0gYl9uZXcgLSAxOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisKKyAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEgKyAxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4gMSkKKyAgICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIG9sZCBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisKKyAgICAgICAgKm5MID0gKm5MIC0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIG5ldyBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykKKyAgICAgICAgICB2X2JvcmRbaV0gPSB2X2JvcmRbaSArIDFdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKKyAgICAgICAgICB2X2ZyZXFbaV0gPSB2X2ZyZXFbaSArIDFdOworCisgICAgICAgICpsZW5ndGhfdl9ib3JkID0gYl9uZXcgLSAxOworICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKKworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKG1pZGRsZSA+PSBkbWluKSAmJiAobWlkZGxlIDw9IGRtYXgpKSAgICAgIC8qIChpaWkpICovCisgICAgeworICAgICAgLyogY29uY2F0ZW5hdGUgKi8KKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpdikgKi8KKyAgICB7CisgICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAorICAgICAgICAgIG1pZGRsZSk7CisgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgIH0KKyAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBjYWxjRnJhbWVDbGFzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOiAgSU5UKiBmcmFtZUNsYXNzLCBJTlQqIGZyYW1lQ2xhc3NPbGQsIElOVCB0cmFuRmxhZywgSU5UKiBzcHJlYWRGbGFnKQorCisgUmV0dXJuOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjYWxjRnJhbWVDbGFzcyAoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsCisgICAgICAgICAgICAgICAgSU5UICpzcHJlYWRGbGFnKQoreworCisgIHN3aXRjaCAoKmZyYW1lQ2xhc3NPbGQpIHsKKyAgY2FzZSBGSVhGSVhvbmx5OgorICBjYXNlIEZJWEZJWDoKKyAgICBpZiAodHJhbkZsYWcpICAqZnJhbWVDbGFzcyA9IEZJWFZBUjsKKyAgICBlbHNlICAgICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWEZJWDsKKyAgICBicmVhazsKKyAgY2FzZSBGSVhWQVI6CisgICAgaWYgKHRyYW5GbGFnKSB7ICpmcmFtZUNsYXNzID0gVkFSVkFSOyAqc3ByZWFkRmxhZyA9IDA7IH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICgqc3ByZWFkRmxhZykgICpmcmFtZUNsYXNzID0gVkFSVkFSOworICAgICAgZWxzZSAgICAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFZBUkZJWDoKKyAgICBpZiAodHJhbkZsYWcpICAqZnJhbWVDbGFzcyA9IEZJWFZBUjsKKyAgICBlbHNlICAgICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWEZJWDsKKyAgICBicmVhazsKKyAgY2FzZSBWQVJWQVI6CisgICAgaWYgKHRyYW5GbGFnKSB7ICpmcmFtZUNsYXNzID0gVkFSVkFSOyAqc3ByZWFkRmxhZyA9IDA7IH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICgqc3ByZWFkRmxhZykgICpmcmFtZUNsYXNzID0gVkFSVkFSOworICAgICAgZWxzZSAgICAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CisgICAgfQorICAgIGJyZWFrOworICB9OworCisgICpmcmFtZUNsYXNzT2xkID0gKmZyYW1lQ2xhc3M7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIHNwZWNpYWxDYXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgc3ByZWFkRmxhZworICAgICAgICAgICAgICBhbGxvd1NwcmVhZAorICAgICAgICAgICAgICB2X2JvcmQKKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAorICAgICAgICAgICAgICB2X2ZyZXEKKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcQorICAgICAgICAgICAgICBwYXJ0cworICAgICAgICAgICAgICBkCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NwZWNpYWxDYXNlIChJTlQgKnNwcmVhZEZsYWcsIElOVCBhbGxvd1NwcmVhZCwgSU5UICp2X2JvcmQsCisgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgKnBhcnRzLAorICAgICAgICAgICAgIElOVCBkKQoreworICBJTlQgTDsKKworICBMID0gKmxlbmd0aF92X2JvcmQ7CisKKyAgaWYgKGFsbG93U3ByZWFkKSB7ICAgICAgICAgICAgLyogYWRkIG9uZSAic3RlcCA4IiAqLworICAgICpzcHJlYWRGbGFnID0gMTsKKyAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkW0wgLSAxXSArIDgpOworICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKKyAgICAoKnBhcnRzKSsrOworICB9CisgIGVsc2UgeworICAgIGlmIChkID09IDEpIHsgICAgICAgICAgICAgICAvKiAgc3RyZXRjaCBvbmUgc2xvdCAqLworICAgICAgKmxlbmd0aF92X2JvcmQgPSBMIC0gMTsKKyAgICAgICpsZW5ndGhfdl9mcmVxID0gTCAtIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCh2X2JvcmRbTCAtIDFdIC0gdl9ib3JkW0wgLSAyXSkgPiAyKSB7ICAgICAgICAvKiBjb21wcmVzcyBvbmUgcXVhbnQgc3RlcCAqLworICAgICAgICB2X2JvcmRbTCAtIDFdID0gdl9ib3JkW0wgLSAxXSAtIDI7CisgICAgICAgIHZfZnJlcVsqbGVuZ3RoX3ZfZnJlcSAtIDFdID0gMDsgLyogdXNlIGxvdyByZXMgZm9yIHNob3J0IHNlZ21lbnQgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgY2FsY0Ntb25Cb3JkZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czogICBpX2Ntb24KKyAgICAgICAgICAgICAgaV90cmFuCisgICAgICAgICAgICAgIHZfYm9yZAorICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkCisgICAgICAgICAgICAgIHRyYW4KKworIFJldHVybjogICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorY2FsY0Ntb25Cb3JkZXIgKElOVCAqaV9jbW9uLCBJTlQgKmlfdHJhbiwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKKyAgICAgICAgICAgICAgICBJTlQgdHJhbiwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgIElOVCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZDsgaSsrKQorICAgIGlmICh2X2JvcmRbaV0gPj0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cykgeyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgICAgICAqaV9jbW9uID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBrZWVwIHRyYWNrIG9mIHRyYW5zaWVudDogKi8KKyAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCisgICAgaWYgKHZfYm9yZFtpXSA+PSB0cmFuKSB7CisgICAgICAqaV90cmFuID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlCisgICAgICAqaV90cmFuID0gRU1QVFk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAga2VlcEZvckZvbGxvd1VwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgdl9ib3JkRm9sbG93CisgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3cKKyAgICAgICAgICAgICAgdl9mcmVxRm9sbG93CisgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3cKKyAgICAgICAgICAgICAgaV90cmFuRm9sbG93CisgICAgICAgICAgICAgIGlfZmlsbEZvbGxvdworICAgICAgICAgICAgICB2X2JvcmQKKyAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAorICAgICAgICAgICAgICB2X2ZyZXEKKyAgICAgICAgICAgICAgaV9jbW9uCisgICAgICAgICAgICAgIGlfdHJhbgorICAgICAgICAgICAgICBwYXJ0cykKKworIFJldHVybjogICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAora2VlcEZvckZvbGxvd1VwIChJTlQgKnZfYm9yZEZvbGxvdywgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICBJTlQgKmlfdHJhbkZvbGxvdywgSU5UICppX2ZpbGxGb2xsb3csIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLCBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLAorICAgICAgICAgICAgICAgICBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgIElOVCBMLCBpLCBqOworCisgIEwgPSAqbGVuZ3RoX3ZfYm9yZDsKKworICAoKmxlbmd0aF92X2JvcmRGb2xsb3cpID0gMDsKKyAgKCpsZW5ndGhfdl9mcmVxRm9sbG93KSA9IDA7CisKKyAgZm9yIChqID0gMCwgaSA9IGlfY21vbjsgaSA8IEw7IGkrKywgaisrKSB7CisgICAgdl9ib3JkRm9sbG93W2pdID0gdl9ib3JkW2ldIC0gbnVtYmVyVGltZVNsb3RzOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgICAgdl9mcmVxRm9sbG93W2pdID0gdl9mcmVxW2ldOworICAgICgqbGVuZ3RoX3ZfYm9yZEZvbGxvdykrKzsKKyAgICAoKmxlbmd0aF92X2ZyZXFGb2xsb3cpKys7CisgIH0KKyAgaWYgKGlfdHJhbiAhPSBFTVBUWSkKKyAgICAqaV90cmFuRm9sbG93ID0gaV90cmFuIC0gaV9jbW9uOworICBlbHNlCisgICAgKmlfdHJhbkZvbGxvdyA9IEVNUFRZOworICAqaV9maWxsRm9sbG93ID0gTCAtIChwYXJ0cyAtIDEpIC0gaV9jbW9uOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgY2FsY0N0cmxTaWduYWwKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czogICBoU2JyR3JpZAorICAgICAgICAgICAgICBmcmFtZUNsYXNzCisgICAgICAgICAgICAgIHZfYm9yZAorICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkCisgICAgICAgICAgICAgIHZfZnJlcQorICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxCisgICAgICAgICAgICAgIGlfY21vbgorICAgICAgICAgICAgICBpX3RyYW4KKyAgICAgICAgICAgICAgc3ByZWFkRmxhZworICAgICAgICAgICAgICBuTAorCisgUmV0dXJuOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjYWxjQ3RybFNpZ25hbCAoSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAorICAgICAgICAgICAgICAgIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MsIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgSU5UIGxlbmd0aF92X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sIElOVCBzcHJlYWRGbGFnLAorICAgICAgICAgICAgICAgIElOVCBuTCkKK3sKKworCisgIElOVCBpLCByLCBhLCBuLCBwLCBiLCBhTCwgYVIsIG50b3QsIG5tYXgsIG5SOworCisgIElOVCAqdl9mID0gaFNickdyaWQtPnZfZjsKKyAgSU5UICp2X2ZMUiA9IGhTYnJHcmlkLT52X2ZMUjsKKyAgSU5UICp2X3IgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmQ7CisgIElOVCAqdl9yTCA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZF8wOworICBJTlQgKnZfclIgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMTsKKworICBJTlQgbGVuZ3RoX3ZfciA9IDA7CisgIElOVCBsZW5ndGhfdl9yUiA9IDA7CisgIElOVCBsZW5ndGhfdl9yTCA9IDA7CisKKyAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CisgIGNhc2UgRklYVkFSOgorICAgIC8qIGFic29sdXRlIGJvcmRlcjogKi8KKworICAgIGEgPSB2X2JvcmRbaV9jbW9uXTsKKworICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCisgICAgbGVuZ3RoX3ZfciA9IDA7CisgICAgaSA9IGlfY21vbjsKKworICAgIHdoaWxlIChpID49IDEpIHsKKyAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3IsICZsZW5ndGhfdl9yLCByKTsKKyAgICAgIGktLTsKKyAgICB9CisKKworICAgIC8qICBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogKi8KKyAgICBuID0gbGVuZ3RoX3ZfcjsKKworCisgICAgLyogZnJlcSByZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IGlfY21vbjsgaSsrKQorICAgICAgdl9mW2ldID0gdl9mcmVxW2lfY21vbiAtIDEgLSBpXTsKKyAgICB2X2ZbaV9jbW9uXSA9IDE7CisKKyAgICAvKiBwb2ludGVyOiAqLworICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApIDsKKworICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKKyAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOworICAgIGhTYnJHcmlkLT5uID0gbjsKKyAgICBoU2JyR3JpZC0+cCA9IHA7CisKKyAgICBicmVhazsKKyAgY2FzZSBWQVJGSVg6CisgICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLworICAgIGEgPSB2X2JvcmRbMF07CisKKyAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgIGxlbmd0aF92X3IgPSAwOworCisgICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aF92X2JvcmQ7IGkrKykgeworICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CisgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfciwgJmxlbmd0aF92X3IsIHIpOworICAgIH0KKworICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgIG4gPSBsZW5ndGhfdl9yOworCisgICAgLyogZnJlcSByZXM6ICovCisgICAgRkRLbWVtY3B5ICh2X2YsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSAqIHNpemVvZiAoSU5UKSk7CisKKworICAgIC8qIHBvaW50ZXI6ICovCisgICAgcCA9IChpX3RyYW4gPj0gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfdHJhbiArIDEpIDogKDApIDsKKworICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKKyAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOworICAgIGhTYnJHcmlkLT5uID0gbjsKKyAgICBoU2JyR3JpZC0+cCA9IHA7CisKKyAgICBicmVhazsKKyAgY2FzZSBWQVJWQVI6CisgICAgaWYgKHNwcmVhZEZsYWcpIHsKKyAgICAgIC8qIGFic29sdXRlIGJvcmRlcnM6ICovCisgICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKKworICAgICAgYUwgPSB2X2JvcmRbMF07CisgICAgICBhUiA9IHZfYm9yZFtiIC0gMV07CisKKworICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgICovCisgICAgICBudG90ID0gYiAtIDI7CisKKyAgICAgIG5tYXggPSAyOyAgICAgICAgICAgICAgICAgLyogbjogezAsMSwyfSAqLworICAgICAgaWYgKG50b3QgPiBubWF4KSB7CisgICAgICAgIG5MID0gbm1heDsKKyAgICAgICAgblIgPSBudG90IC0gbm1heDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBuTCA9IG50b3Q7CisgICAgICAgIG5SID0gMDsKKyAgICAgIH0KKworICAgICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KKyAgICAgIGxlbmd0aF92X3JMID0gMDsKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgeworICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JMLCAmbGVuZ3RoX3ZfckwsIHIpOworICAgICAgfQorCisgICAgICBsZW5ndGhfdl9yUiA9IDA7CisgICAgICBpID0gYiAtIDE7CisgICAgICB3aGlsZSAoaSA+PSBiIC0gblIpIHsKKyAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CisgICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKKyAgICAgICAgaS0tOworICAgICAgfQorCisgICAgICAvKiBwb2ludGVyIChvbmx5IG9uZSBkdWUgdG8gY29uc3RyYWludCBpbiBmcmFtZSBpbmZvKTogKi8KKyAgICAgIHAgPSAoaV90cmFuID4gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGIgLSBpX3RyYW4pIDogKDApIDsKKworICAgICAgLyogZnJlcSByZXM6ICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKQorICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIGxlbmd0aF92X2JvcmQgPSBpX2Ntb24gKyAxOworICAgICAgbGVuZ3RoX3ZfZnJlcSA9IGlfY21vbiArIDE7CisKKworICAgICAgLyogYWJzb2x1dGUgYm9yZGVyczogKi8KKyAgICAgIGIgPSBsZW5ndGhfdl9ib3JkOworCisgICAgICBhTCA9IHZfYm9yZFswXTsKKyAgICAgIGFSID0gdl9ib3JkW2IgLSAxXTsKKworICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgKi8KKyAgICAgIG50b3QgPSBiIC0gMjsKKyAgICAgIG5SID0gbnRvdCAtIG5MOworCisgICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgICAgbGVuZ3RoX3ZfckwgPSAwOworICAgICAgZm9yIChpID0gMTsgaSA8PSBuTDsgaSsrKSB7CisgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfckwsICZsZW5ndGhfdl9yTCwgcik7CisgICAgICB9CisKKyAgICAgIGxlbmd0aF92X3JSID0gMDsKKyAgICAgIGkgPSBiIC0gMTsKKyAgICAgIHdoaWxlIChpID49IGIgLSBuUikgeworICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JSLCAmbGVuZ3RoX3ZfclIsIHIpOworICAgICAgICBpLS07CisgICAgICB9CisKKyAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLworICAgICAgcCA9IChpX2Ntb24gPj0gaV90cmFuICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV9jbW9uIC0gaV90cmFuICsgMSkgOiAoMCkgOworCisgICAgICAvKiBmcmVxIHJlczogKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKQorICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKKyAgICB9CisKKyAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisgICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzAgPSBhTDsKKyAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMSA9IGFSOworICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzAgPSBuTDsKKyAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xID0gblI7CisgICAgaFNickdyaWQtPnAgPSBwOworCisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBkbyBub3RoaW5nICovCisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBjcmVhdGVEZWZGcmFtZUluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogQ29waWVzIHRoZSBkZWZhdWx0IChzdGF0aWMpIGZyYW1lSW5mbyBzdHJ1Y3RzIHRvIHRoZSBmcmFtZUluZm8KKyAgICAgICAgICAgICAgcGFzc2VkIGJ5IHJlZmVyZW5jZTsgb25seSB1c2VkIGZvciBGSVhGSVggZnJhbWVzCisKKyBBcmd1bWVudHM6ICAgaEZyYW1lSW5mbyAgICAgICAgICAgICAtIEhBTkxERV9TQlJfRlJBTUVfSU5GTworICAgICAgICAgICAgICBuRW52ICAgICAgICAgICAgICAgICAgIC0gSU5UCisgICAgICAgICAgICAgIG5UaW1lU2xvdHMgICAgICAgICAgICAgLSBJTlQKKworIFJldHVybjogICAgICBub25lOyBoU2JyRnJhbWVJbmZvIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgZGVmYXVsdCBmcmFtZUluZm8KKworIFdyaXR0ZW46ICAgICBBbmRyZWFzIFNjaG5laWRlcgorIFJldmlzZWQ6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2NyZWF0ZURlZkZyYW1lSW5mbyhIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywgSU5UIG5FbnYsIElOVCBuVGltZVNsb3RzKQoreworICBzd2l0Y2ggKG5FbnYpIHsKKyAgY2FzZSAxOgorICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8yMDQ4LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8yMDQ4LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8yMDQ4LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBGREtfQVNTRVJUKDApOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBjdHJsU2lnbmFsMkZyYW1lSW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIGZyYW1lX2luZm8gc3RydWN0IGZyb20gY29udHJvbCBzaWduYWwuCisKKyBBcmd1bWVudHM6ICAgaFNickdyaWQgLSBzb3VyY2UKKyAgICAgICAgICAgICAgaFNickZyYW1lSW5mbyAtIGRlc3RpbmF0aW9uCisKKyBSZXR1cm46ICAgICAgdm9pZDsgaFNickZyYW1lSW5mbyBjb250YWlucyB0aGUgdXBkYXRlZCBGUkFNRV9JTkZPIHN0cnVjdAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2N0cmxTaWduYWwyRnJhbWVJbmZvIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeCkKK3sKKyAgSU5UIG5FbnYgPSAwLCBib3JkZXIgPSAwLCBpLCBrLCBwIC8qPyovOworICBJTlQgKnZfciA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZDsKKyAgSU5UICp2X2YgPSBoU2JyR3JpZC0+dl9mOworCisgIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MgPSBoU2JyR3JpZC0+ZnJhbWVDbGFzczsKKyAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQgICA9IGhTYnJHcmlkLT5idWZmZXJGcmFtZVN0YXJ0OworICBJTlQgbnVtYmVyVGltZVNsb3RzICAgID0gaFNickdyaWQtPm51bWJlclRpbWVTbG90czsKKworICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKKyAgY2FzZSBGSVhGSVg6CisgICAgY3JlYXRlRGVmRnJhbWVJbmZvKGhTYnJGcmFtZUluZm8sIGhTYnJHcmlkLT5ic19udW1fZW52LCBudW1iZXJUaW1lU2xvdHMpOworCisgICAgLyogQXQgdGhpcyBwb2ludCBhbGwgZnJlcXVlbmN5IHJlc29sdXRpb25zIGFyZSBzZXQgdG8gRlJFUV9SRVNfSElHSCwgc28KKyAgICAgKiBvbmx5IGlmIGZyZXFfcmVzX2ZpeGZpeCBpcyBzZXQgdG8gRlJFUV9SRVNfTE9XLCB0aGV5IGFsbCBoYXZlIHRvIGJlCisgICAgICogY2hhbmdlZC4KKyAgICAgKiBzbmQgKi8KKyAgICBpZiAoZnJlcV9yZXNfZml4Zml4ID09IEZSRVFfUkVTX0xPVykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gRlJFUV9SRVNfTE9XOworICAgICAgfQorICAgIH0KKyAgICAvKiBFTEQ6IHN0b3JlIGN1cnJlbnQgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KKyAgICBoU2JyR3JpZC0+dl9mWzBdID0gaFNickZyYW1lSW5mby0+ZnJlcVJlc1swXTsKKyAgICBicmVhazsKKworICBjYXNlIEZJWFZBUjoKKyAgY2FzZSBWQVJGSVg6CisgICAgbkVudiA9IGhTYnJHcmlkLT5uICsgMTsgICAgICAvKiByZWFkIG4gW1NCUl9OVU1fQklUUyBiaXRzXSAqLyAvKj8gc25kKi8KKyAgICBGREtfQVNTRVJUKG5FbnYgPD0gTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYKTsKKworICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworCisgICAgYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkOyAvKiByZWFkIHRoZSBhYnNvbHV0ZSBib3JkZXIgKi8KKworICAgIGlmIChuRW52ID09IDEpCisgICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAxOworICAgIGVsc2UKKyAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAoZnJhbWVDbGFzcykgeworICBjYXNlIEZJWFZBUjoKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYnVmZmVyRnJhbWVTdGFydDsgLyogc3RhcnQtcG9zaXRpb24gb2YgMXN0IGVudmVsb3BlICovCisKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYm9yZGVyOworCisgICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgbkVudiAtIDE7IGsrKywgaS0tKSB7CisgICAgICBib3JkZXIgLT0gdl9yW2tdOworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKyAgICB9CisKKyAgICAvKiBtYWtlIGVpdGhlciBlbnZlbG9wZSBuci4gbkVudiArIDEgLSBwIHNob3J0OyBvciBkb24ndCBzaG9ydGVuIGlmIHAgPT0gMCAqLworICAgIHAgPSBoU2JyR3JpZC0+cDsKKyAgICBpZiAocCA9PSAwKSB7CisgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gbkVudiArIDEgLSBwOworICAgIH0KKworICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IG5FbnY7IGsrKywgaS0tKSB7CisgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gKEZSRVFfUkVTKXZfZltrXTsKKyAgICB9CisKKyAgICAvKiBpZiBlaXRoZXIgdGhlcmUgaXMgbm8gc2hvcnQgZW52ZWxvcGUgb3IgdGhlIGxhc3QgZW52ZWxvcGUgaXMgc2hvcnQuLi4gKi8KKyAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgeworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgVkFSRklYOgorICAgIC8qIGluIHRoaXMgY2FzZSAnYm9yZGVyJyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSAxc3QgZW52ZWxvcGUgKi8KKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyOworCisgICAgZm9yIChrID0gMDsgayA8IG5FbnYgLSAxOyBrKyspIHsKKyAgICAgIGJvcmRlciArPSB2X3Jba107CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2sgKyAxXSA9IGJvcmRlcjsKKyAgICB9CisKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90czsKKworICAgIHAgPSBoU2JyR3JpZC0+cDsKKyAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgeworICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IHAgLSAxOworICAgIH0KKworICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKKyAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpdl9mW2tdOworICAgIH0KKworICAgIHN3aXRjaCAocCkgeworICAgIGNhc2UgMDoKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMV07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFZBUlZBUjoKKyAgICBuRW52ID0gaFNickdyaWQtPmJzX251bV9yZWxfMCArIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgKyAxOworICAgIEZES19BU1NFUlQobkVudiA8PSBNQVhfRU5WRUxPUEVTX1ZBUlZBUik7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLworICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworCisgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOworCisgICAgZm9yIChrID0gMCwgaSA9IDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wOyBrKyssIGkrKykgeworICAgICAgYm9yZGVyICs9IGhTYnJHcmlkLT5ic19yZWxfYm9yZF8wW2tdOworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKyAgICB9CisKKyAgICBib3JkZXIgPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMTsKKyAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYm9yZGVyOworCisgICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgaFNickdyaWQtPmJzX251bV9yZWxfMTsgaysrLCBpLS0pIHsKKyAgICAgIGJvcmRlciAtPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMVtrXTsKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CisgICAgfQorCisgICAgcCA9IGhTYnJHcmlkLT5wOworICAgIGlmIChwID09IDApIHsKKyAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBuRW52ICsgMSAtIHA7CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IG5FbnY7IGsrKykgeworICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChGUkVRX1JFUyloU2JyR3JpZC0+dl9mTFJba107CisgICAgfQorCisgICAgaWYgKG5FbnYgPT0gMSkgeworICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CisgICAgfSBlbHNlIHsKKyAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKKworICAgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CisgICAgICB9IGVsc2UgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKKyAgICAgIH0KKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOworICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmcmFtZUNsYXNzID09IFZBUkZJWCB8fCBmcmFtZUNsYXNzID09IEZJWFZBUikgeworICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF07CisgICAgaWYgKG5FbnYgPT0gMSkgeworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKKyAgICB9IGVsc2UgeworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uaCBiL2FhYy9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2OTI2NgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmgKQEAgLTAsMCArMSwzMDUgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBGcmFtaW5nIGdlbmVyYXRvciBwcm90b3R5cGVzIGFuZCBzdHJ1Y3RzICAKKyovCisjaWZuZGVmIF9GUkFNX0dFTl9ICisjZGVmaW5lIF9GUkFNX0dFTl9ICisKKyNpbmNsdWRlICJzYnJfZGVmLmgiIC8qIGZvciBNQVhfRU5WRUxPUEVTIGFuZCBNQVhfTk9JU0VfRU5WRUxPUEVTIGluIHN0cnVjdCBGUkFNRV9JTkZPIGFuZCBDT0RFQ19UWVBFICovCisKKyNkZWZpbmUgTUFYX0VOVkVMT1BFU19WQVJWQVIgTUFYX0VOVkVMT1BFUyAvKiE8IHdvcnN0IGNhc2UgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBhIFZBUlZBUiBmcmFtZSAqLworI2RlZmluZSBNQVhfRU5WRUxPUEVTX0ZJWFZBUl9WQVJGSVggNCAvKiE8IHdvcnN0IGNhc2UgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBWQVJGSVggYW5kIEZJWFZBUiBmcmFtZXMgKi8KKyNkZWZpbmUgTUFYX05VTV9SRUwgMyAvKiE8IG1heGltdW0gbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgaW4gYW55IFZBUiBmcmFtZSAqLworCisvKiBTQlIgZnJhbWUgY2xhc3MgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisgIEZJWEZJWCA9IDAsIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgYW5kIHRyYWlsaW5nIGZyYW1lIGJvcmRlcnMgYXJlIGZpeGVkICovCisgIEZJWFZBUiwgICAgIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgZnJhbWUgYm9yZGVyIGlzIGZpeGVkLCB0cmFpbGluZyBmcmFtZSBib3JkZXIgaXMgdmFyaWFibGUgKi8KKyAgVkFSRklYLCAgICAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBmcmFtZSBib3JkZXIgaXMgdmFyaWFibGUsIHRyYWlsaW5nIGZyYW1lIGJvcmRlciBpcyBmaXhlZCAqLworICBWQVJWQVIgICAgICAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGFuZCB0cmFpbGluZyBmcmFtZSBib3JkZXJzIGFyZSB2YXJpYWJsZSAqLworICAsRklYRklYb25seSAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBib3JkZXIgZml4ZWQgKDApLCB0cmFpbGluZyBib3JkZXIgZml4ZWQgKG5yVGltZVNsb3RzKSBhbmQgZW5jYXNlZCBib3JkZXJzIGFyZSBkeW5hbWljYWxseSBkZXJpdmVkIGZyb20gdGhlIHRyYW5Qb3MgKi8KK31GUkFNRV9DTEFTUzsKKworCisvKiBoZWxwZXIgY29uc3RhbnRzICovCisjZGVmaW5lIERDICAgICAgNDcxMSAgICAgICAgLyohPCBoZWxwZXIgY29uc3RhbnQ6IGRvbid0IGNhcmUgKi8KKyNkZWZpbmUgRU1QVFkgICAoLTk5KSAgICAgICAvKiE8IGhlbHBlciBjb25zdGFudDogZW1wdHkgKi8KKworCisvKiBzeXN0ZW0gY29uc3RhbnRzOiBBQUMrU0JSLCBEUk0gRnJhbWUtTGVuZ3RoICovCisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzE5MjAgIDQKKyNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMCAgMTUKKworI2RlZmluZSBMRF9QUkVUUkFOX09GRiAgICAgICAgICAgMworI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF81MTJMRCAgMAorI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRCAgOAorI2RlZmluZSBUUkFOU0lFTlRfT0ZGU0VUX0xEICAgICAgMAorCisKKworLyoKK3N5c3RlbSBjb25zdGFudHM6IEFBQytTQlIgb3IgYWFjUFJPIChoeWJyaWQgZm9ybWF0KSwgU3RhbmRhcmQgRnJhbWUtTGVuZ3RoLCBNdWx0aS1SYXRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK051bWJlciBvZiBzbG90cyAobnVtYmVyVGltZVNsb3RzKTogMTYgIChOVU1CRVJfVElNRV9TTE9UU18yMDQ4KQorRGV0ZWN0b3Itb2Zmc2V0IChmcmFtZU1pZGRsZVNsb3QpOiAgNAorT3ZlcmxhcCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgMworQnVmZmVyLW9mZnNldCAgICAgICAgICAgICAgICAgICAgOiAgOCAgKEJVRkZFUl9GUkFNRV9TVEFSVF8yMDQ4ID0gMCkKKworCisgICAgICAgICAgICAgICAgICAgICAgICB8PC0tLS0tLS0tLS0tLXRyYW5Qb3MtLS0tLS0tLS0tPnwKKyAgICAgICAgICAgICAgICB8Y3xkfGV8ZnwwfDF8MnwzfDR8NXw2fDd8OHw5fGF8YnxjfGR8ZXxmfAorICAgICAgICBGaXhGaXggIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICBGaXhWYXIgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjwtIC0+OgorICAgICAgICBWYXJGaXggIDo8LSAtPjogICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICBWYXJWYXIgIDo8LSAtPjogICAgICAgICAgICAgICAgICAgICAgICAgOjwtIC0+OgorICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgMCAxIDIgMworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworfC18LXwtfC18LXwtfC18LUItfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtQi18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18CisKK2ZyYW1lLWdlbmVyYXRvcjowICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgMzIKK2FuYWx5c2lzLWJ1ZmZlcjo4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgNDAKKyovCisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzIwNDggIDQKKyNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMjA0OCAgMTYKKworCisvKgorc3lzdGVtIGNvbnN0YW50czogbXAzUFJPLCBNdWx0aS1SYXRlICYgU2luZ2xlLVJhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitOdW1iZXIgb2Ygc2xvdHMgKG51bWJlclRpbWVTbG90cyk6ICA5ICAgIChOVU1CRVJfVElNRV9TTE9UU18xMTUyKQorRGV0ZWN0b3Itb2Zmc2V0IChmcmFtZU1pZGRsZVNsb3QpOiAgNCAgICAoRlJBTUVfTUlERExFX1NMT1RfMTE1MikKK092ZXJsYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIDMKK0J1ZmZlci1vZmZzZXQgICAgICAgICAgICAgICAgICAgIDogIDQuNSAgKEJVRkZFUl9GUkFNRV9TVEFSVF8xMTUyID0gMCkKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgfDwtLS0tdHJhblBvcy0tLS0+fAorICAgICAgICAgICAgICAgICB8NXw2fDd8OHwwfDF8MnwzfDR8NXw2fDd8OHwKKyAgICAgICAgIEZpeEZpeCAgfCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgRml4VmFyICB8ICAgICAgICAgICAgICAgICA6PC0gLT46CisgICAgICAgICBWYXJGaXggIDo8LSAtPjogICAgICAgICAgIHwKKyAgICAgICAgIFZhclZhciAgOjwtIC0+OiAgICAgICAgICAgOjwtIC0+OgorICAgICAgICAgICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCAwIDEgMiAzCisgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisgICAgICAgIC18LXwtfC18LUItfC18LXwtfC18LXwtfC18LUItfC18LXwtfC18LXwtfC18LXwKKworZnJhbWUtZ2VuZXJhdG9yOiAwICAgICAgICAgICAgICAgICA5ICAgICAgIDEzICAgICAgICAxOAorYW5hbHlzaXMtYnVmZmVyOiA0LjUgICAgICAgICAgICAgICAxMy41ICAgICAgICAgICAgICAyMi41CisqLworI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8xMTUyICA0CisjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzExNTIgIDkKKworCisvKiBzeXN0ZW0gY29uc3RhbnRzOiBMYXllcjIrU0JSICovCisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzIzMDQgIDgKKyNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCAgMTgKKworCisvKiEKKyAgXHN0cnVjdCBTQlJfR1JJRAorICBcYnJpZWYgIHNicl9ncmlkKCkgc2lnbmFscyB0byBiZSBjb252ZXJ0ZWQgdG8gYml0c3RyZWFtIGVsZW1lbnRzCisKKyAgVGhlIHZhcmlhYmxlcyBob2xkIHRoZSBzaWduYWxzIChlLmcuIGxlbmd0aHMgYW5kIG51bWJlcnMpIGluICJjbGVhciB0ZXh0IgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogc3lzdGVtIGNvbnN0YW50cyAqLworICBJTlQgYnVmZmVyRnJhbWVTdGFydDsgICAgIC8qITwgZnJhbWUgZ2VuZXJhdG9yIHZzIGFuYWx5c2lzIGJ1ZmZlciB0aW1lIGFsaWdubWVudCAoY3VycmVudGx5IHNldCB0byAwLCBvZmZzZXQgYWRkZWQgZWxzZXdoZXJlKSAqLworICBJTlQgbnVtYmVyVGltZVNsb3RzOyAgICAgIC8qITwgbnVtYmVyIG9mIFNCUiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisKKyAgLyogd2lsbCBiZSBhZGp1c3RlZCBmb3IgZXZlcnkgZnJhbWUgKi8KKyAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzczsgICAvKiE8IFNCUiBmcmFtZSBjbGFzcyAgKi8KKyAgSU5UIGJzX251bV9lbnY7ICAgICAgICAgICAvKiE8IGJzX251bV9lbnYsIG51bWJlciBvZiBlbnZlbG9wZXMgZm9yIEZJWEZJWCAqLworICBJTlQgYnNfYWJzX2JvcmQ7ICAgICAgICAgIC8qITwgYnNfYWJzX2JvcmQsIGFic29sdXRlIGJvcmRlciBmb3IgVkFSRklYIGFuZCBGSVhWQVIgKi8KKyAgSU5UIG47ICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzIGZvciBWQVJGSVggYW5kIEZJWFZBUiAgICovCisgIElOVCBwOyAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyLXRvLXRyYW5zaWVudC1ib3JkZXIgICovCisgIElOVCBic19yZWxfYm9yZFtNQVhfTlVNX1JFTF07ICAgICAgICAgLyohPCBic19yZWxfYm9yZCwgcmVsYXRpdmUgYm9yZGVycyBmb3IgYWxsIFZBUiAqLworICBJTlQgdl9mW01BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWF07IC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBGSVhWQVIgYW5kIFZBUkZJWCAgKi8KKworICBJTlQgYnNfYWJzX2JvcmRfMDsgICAgICAgIC8qITwgYnNfYWJzX2JvcmRfMCwgbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLworICBJTlQgYnNfYWJzX2JvcmRfMTsgICAgICAgIC8qITwgYnNfYWJzX2JvcmRfMSwgdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX251bV9yZWxfMDsgICAgICAgICAvKiE8IGJzX251bV9yZWxfMCwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX251bV9yZWxfMTsgICAgICAgICAvKiE8IGJzX251bV9yZWxfMSwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIHRyYWlsaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCisgIElOVCBic19yZWxfYm9yZF8wW01BWF9OVU1fUkVMXTsgICAgICAgLyohPCBic19yZWxfYm9yZF8wLCByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQgd2l0aCBsZWFkaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCisgIElOVCBic19yZWxfYm9yZF8xW01BWF9OVU1fUkVMXTsgICAgICAgLyohPCBic19yZWxfYm9yZF8xLCByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQgd2l0aCB0cmFpbGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLworICBJTlQgdl9mTFJbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAgICAgIC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBWQVJWQVIgICovCisKK30KK1NCUl9HUklEOwordHlwZWRlZiBTQlJfR1JJRCAqSEFORExFX1NCUl9HUklEOworCisKKworLyohCisgIFxzdHJ1Y3QgU0JSX0ZSQU1FX0lORk8KKyAgXGJyaWVmICB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uIGZvciBvbmUgZnJhbWUKKyovCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQgbkVudmVsb3BlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgZW52ZWxvcGVzICovCisgIElOVCBib3JkZXJzW01BWF9FTlZFTE9QRVMrMV07ICAgICAgICAgICAvKiE8IGVudmVsb3BlIGJvcmRlcnMgaW4gU0JSIHRpbWVzbG90cyAqLworICBGUkVRX1JFUyBmcmVxUmVzW01BWF9FTlZFTE9QRVNdOyAgICAgICAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlYWNoIGVudmVsb3BlICovCisgIElOVCBzaG9ydEVudjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBhbiBlbnZlbG9wZSB0byBiZSBzaG9ydGVuZWQgKHN0YXJ0aW5nIGF0IDEpIG9yIDAgZm9yIG5vIHNob3J0ZW5lZCBlbnZlbG9wZSAqLworICBJTlQgbk5vaXNlRW52ZWxvcGVzOyAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2Ygbm9pc2UgZmxvb3JzICovCisgIElOVCBib3JkZXJzTm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFUysxXTsvKiE8IG5vaXNlIGZsb29yIGJvcmRlcnMgaW4gU0JSIHRpbWVzbG90cyAqLworfQorU0JSX0ZSQU1FX0lORk87CisvKiBXQVJOSU5HOiBXaGVuIHJlYXJyYW5naW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIHN0cnVjdCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgc3RhdGljCisgKiBpbml0aWFsaXphdGlvbnMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgQy1maWxlIGhhdmUgdG8gYmUgcmVhcnJhbmdlZCBhcyB3ZWxsIQorICogc25kIDIwMDIvMDEvMjMKKyAqLwordHlwZWRlZiBTQlJfRlJBTUVfSU5GTyAqSEFORExFX1NCUl9GUkFNRV9JTkZPOworCisKKy8qIQorICBcc3RydWN0IFNCUl9FTlZFTE9QRV9GUkFNRQorICBcYnJpZWYgIGZyYW1lIGdlbmVyYXRvciBtYWluIHN0cnVjdAorCisgIENvbnRhaW5zIHR1bmluZyBwYXJhbWV0ZXJzLCB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uLCBzYnJfZ3JpZCgpIGJpdHN0cmVhbSBlbGVtZW50cywgYW5kIGdlbmVyYXRvciBpbnRlcm5hbCBzaWduYWxzCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogc3lzdGVtIGNvbnN0YW50cyAqLworICBJTlQgZnJhbWVNaWRkbGVTbG90OyAgICAgIC8qITwgdHJhbnNpZW50IGRldGVjdG9yIG9mZnNldCBpbiBTQlIgdGltZXNsb3RzICovCisKKyAgLyogYmFzaWMgdHVuaW5nIHBhcmFtZXRlcnMgKi8KKyAgSU5UIHN0YXRpY0ZyYW1pbmc7ICAgICAgICAvKiE8IDE6IHJ1biBzdGF0aWMgZnJhbWluZyBpbiB0aW1lLCBpLmUuIGV4Y2x1c2l2ZSB1c2Ugb2YgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVggKi8KKyAgSU5UIG51bUVudlN0YXRpYzsgICAgICAgICAvKiE8IG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lIGZvciBzdGF0aWMgZnJhbWluZyAqLworICBJTlQgZnJlcV9yZXNfZml4Zml4OyAgICAgIC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb24gdG8gdXNlIGZvciBic19mcmFtZV9jbGFzcyA9IEZJWEZJWCAqLworCisgIC8qIGV4cGVydCB0dW5pbmcgcGFyYW1ldGVycyAqLworICBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbTsgIC8qITwgc2VnbWVudCBsZW5ndGhzIHRvIHVzZSBhcm91bmQgdHJhbnNpZW50ICovCisgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxOyAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgdG8gdXNlIGFyb3VuZCB0cmFuc2llbnQgKi8KKyAgSU5UIGRtaW47ICAgICAgICAgICAgICAgICAvKiE8IG1pbmltdW0gbGVuZ3RoIG9mIGRlcGVuZGVudCBzZWdtZW50cyAqLworICBJTlQgZG1heDsgICAgICAgICAgICAgICAgIC8qITwgbWF4aW11bSBsZW5ndGggb2YgZGVwZW5kZW50IHNlZ21lbnRzICovCisgIElOVCBhbGxvd1NwcmVhZDsgICAgICAgICAgLyohPCAxOiBhbGxvdyBpc29sYXRlZCB0cmFuc2llbnQgdG8gaW5mbHVlbmNlIGdyaWQgb2YgMyBjb25zZWN1dGl2ZSBmcmFtZXMgKi8KKworICAvKiBpbnRlcm5hbGx5IHVzZWQgc2lnbmFscyAqLworICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzT2xkOyAgICAgICAgICAgICAgICAvKiE8IGZyYW1lIGNsYXNzIHVzZWQgZm9yIHByZXZpb3VzIGZyYW1lICovCisgIElOVCBzcHJlYWRGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMTogdXNlIFZBUlZBUiBpbnN0ZWFkIG9mIFZBUkZJWCB0byBmb2xsb3cgdXAgb2xkIHRyYW5zaWVudCAqLworCisgIElOVCB2X2JvcmRbMiAqIE1BWF9FTlZFTE9QRVNfVkFSVkFSICsgMV07IC8qITwgYm9yZGVycyBmb3IgY3VycmVudCBmcmFtZSBhbmQgcHJlbGltaW5hcnkgYm9yZGVycyBmb3IgbmV4dCBmcmFtZSAoZml4ZWQgYm9yZGVycyBleGNsdWRlZCkgKi8KKyAgSU5UIGxlbmd0aF92X2JvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2JvcmQgKi8KKyAgSU5UIHZfZnJlcVsyICogTUFYX0VOVkVMT1BFU19WQVJWQVIgKyAxXTsgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yIGN1cnJlbnQgZnJhbWUgYW5kIHByZWxpbWluYXJ5IHJlc29sdXRpb25zIGZvciBuZXh0IGZyYW1lICovCisgIElOVCBsZW5ndGhfdl9mcmVxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgaGVscGVyIHZhcmlhYmxlOiBsZW5ndGggb2Ygdl9mcmVxICovCisKKyAgSU5UIHZfYm9yZEZvbGxvd1tNQVhfRU5WRUxPUEVTX1ZBUlZBUl07ICAgLyohPCBwcmVsaW1pbmFyeSBib3JkZXJzIGZvciBjdXJyZW50IGZyYW1lIChjYWxjdWxhdGVkIGR1cmluZyBwcmV2aW91cyBmcmFtZSkgKi8KKyAgSU5UIGxlbmd0aF92X2JvcmRGb2xsb3c7ICAgICAgICAgICAgICAgICAgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2JvcmRGb2xsb3cgKi8KKyAgSU5UIGlfdHJhbkZvbGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludHMgdG8gdHJhbnNpZW50IGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKG1heSBiZSBuZWdhdGl2ZSwgc2VlIGtlZXBGb3JGb2xsb3dVcCgpKSAqLworICBJTlQgaV9maWxsRm9sbG93OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50cyB0byBmaXJzdCBmaWxsIGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKi8KKyAgSU5UIHZfZnJlcUZvbGxvd1tNQVhfRU5WRUxPUEVTX1ZBUlZBUl07ICAgLyohPCBwcmVsaW1pbmFyeSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yIGN1cnJlbnQgZnJhbWUgKGNhbGN1bGF0ZWQgZHVyaW5nIHByZXZpb3VzIGZyYW1lKSAqLworICBJTlQgbGVuZ3RoX3ZfZnJlcUZvbGxvdzsgICAgICAgICAgICAgICAgICAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfZnJlcUZvbGxvdyAqLworCisKKyAgLyogZXh0ZXJuYWxseSBuZWVkZWQgc2lnbmFscyAqLworICBTQlJfR1JJRCAgICAgICAgIFNickdyaWQ7ICAgICAgICAgLyohPCBzYnJfZ3JpZCgpIHNpZ25hbHMgdG8gYmUgY29udmVydGVkIHRvIGJpdHN0cmVhbSBlbGVtZW50cyAqLworICBTQlJfRlJBTUVfSU5GTyAgIFNickZyYW1lSW5mbzsgICAgLyohPCB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uIGZvciBvbmUgZnJhbWUgKi8KK30KK1NCUl9FTlZFTE9QRV9GUkFNRTsKK3R5cGVkZWYgU0JSX0VOVkVMT1BFX0ZSQU1FICpIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FOworCisKKwordm9pZAorRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFsbG93U3ByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRW52U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAsaW50IGxkR3JpZAorICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitIQU5ETEVfU0JSX0ZSQU1FX0lORk8KK0ZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm9fcHJlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGRHcmlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnZfdHVuaW5nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkZjZkOQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmNwcApAQCAtMCwwICsxLDUyOSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJpbnZmX2VzdC5oIgorI2luY2x1ZGUgInNicl9taXNjLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjZGVmaW5lIE1BWF9OVU1fUkVHSU9OUyAxMAorI2RlZmluZSBTQ0FMRV9GQUNfUVVPICAgNTEyLjBmCisjZGVmaW5lIFNDQUxFX0ZBQ19OUkcgICAyNTYuMGYKKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGE6YikKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYTpiKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBxdWFudFN0ZXBzU2JyWzRdICA9ICB7IDB4MDA0MDAwMDAsIDB4MDI4MDAwMDAsIDB4MDM4MDAwMDAsIDB4MDRjMDAwMDAgfSA7ICAgIC8qIHRhYmxlIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19RVU8gKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBxdWFudFN0ZXBzT3JpZ1s0XSA9ICB7IDB4MDAwMDAwMDAsIDB4MDBjMDAwMDAsIDB4MDFjMDAwMDAsIDB4MDI4MDAwMDAgfSA7ICAgIC8qIHRhYmxlIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19RVU8gKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBucmdCb3JkZXJzWzRdICAgICA9ICB7IDB4MGM4MDAwMDAsIDB4MGYwMDAwMDAsIDB4MTE4MDAwMDAsIDB4MTQwMDAwMDAgfSA7ICAgIC8qIHRhYmxlIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19OUkcgKi8KKworc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlMgZGV0ZWN0b3JQYXJhbXNBQUMgPSB7CisgICAgcXVhbnRTdGVwc1NiciwKKyAgICBxdWFudFN0ZXBzT3JpZywKKyAgICBucmdCb3JkZXJzLAorICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLworICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgb3JpZy4gKi8KKyAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KKyAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCAgICAgICAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgICAgICAgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLworICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KKyAgICAgIHtJTlZGX0xPV19MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9MT1dfTEVWRUwsICAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLworICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHstNCwgLTMsIC0yLCAtMSwgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLworfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGh5c3RlcmVzaXMgPSAweDAwNDAwMDAwIDsgLyogRGVsdGEgdmFsdWUgZm9yIGh5c3RlcmVzaXMuIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19RVU8gKi8KKworLyoKKyAqIEFBQytTQlIgUEFSQU1FVEVSUyBmb3IgU3BlZWNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlMgZGV0ZWN0b3JQYXJhbXNBQUNTcGVlY2ggPSB7CisgICAgcXVhbnRTdGVwc1NiciwKKyAgICBxdWFudFN0ZXBzT3JpZywKKyAgICBucmdCb3JkZXJzLAorICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLworICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgb3JpZy4gKi8KKyAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KKyAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9NSURfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLworICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KKyAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9NSURfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCisgICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLworICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHstNCwgLTMsIC0yLCAtMSwgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLworfTsKKworLyoKKyAqIFNtb290aGluZyBmaWx0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgY29uc3QgRklYUF9EQkwgRklSX0ZJTFRFUls1XTsKKworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzAgPSB7IDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSA7CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMSA9IHsgMHgyYWFhYWE4MCwgMHg1NTU1NTRmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IDsKK3N0YXRpYyBjb25zdCBGSVJfRklMVEVSIGZpcl8yID0geyAweDEwMDAwMDAwLCAweDMwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gOworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzMgPSB7IDB4MDc3ZjgwZTgsIDB4MTk5OTk5YTAsIDB4MmJiM2IyNDAsIDB4MzMzMzMzNDAsIDB4MDAwMDAwMDAgfSA7CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfNCA9IHsgMHgwNDEzMDU5OCwgMHgwZWJkYjAwMCwgMHgxYmVjZmE2MCwgMHgyNjk3YTRjMCwgMHgyYWFhYWE4MCB9IDsKKworCitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiAqY29uc3QgZmlyX3RhYmxlWzVdID0geworICAmZmlyXzAsCisgICZmaXJfMSwKKyAgJmZpcl8yLAorICAmZmlyXzMsCisgICZmaXJfNAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHVzZWQgZm9yIHRoZSBkZXRlY3Rvci4KKworCisgIFxyZXR1cm4gICAgbm9uZQorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZURldGVjdG9yVmFsdWVzKEZJWFBfREJMICoqcXVvdGFNYXRyaXhPcmlnLCAgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSB0b25hbGl0eSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLCAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ1ZlY3RvciwgICAgICAgICAgICAgIC8qITwgRW5lcmd5IHZlY3Rvci4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIERFVEVDVE9SX1ZBTFVFUyAqZGV0ZWN0b3JWYWx1ZXMsICAvKiE8IHBvaW50ZXIgdG8gREVURUNUT1JfVkFMVUVTIHN0cnVjdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydENoYW5uZWwsICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGNoYW5uZWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcENoYW5uZWwsICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGNoYW5uZWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgaW5kZXguICovCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtYmVyT2ZTdHJvbmdlc3QgICAgICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHNvcnRlZCB0b25hbCBjb21wb25lbnRzIHRvIGJlIGNvbnNpZGVyZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpLHRlbXAsIGo7CisKKyAgY29uc3QgRklYUF9EQkwqIGZpbHRlciA9ICpmaXJfdGFibGVbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXTsKKyAgRklYUF9EQkwgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCwgc2JyUXVvdGFNZWFuU3Ryb25nZXN0OworICBGSVhQX0RCTCBvcmlnUXVvdGEsIHNiclF1b3RhOworICBGSVhQX0RCTCBpbnZJbmRleCwgaW52Q2hhbm5lbCwgaW52VGVtcDsKKyAgRklYUF9EQkwgcXVvdGFWZWNPcmlnWzY0XSwgcXVvdGFWZWNTYnJbNjRdOworCisgIEZES21lbWNsZWFyKHF1b3RhVmVjT3JpZyw2NCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocXVvdGFWZWNTYnIsNjQqc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4LXN0YXJ0SW5kZXgpOworICBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7CisKKyAgLyoKKyAgIENhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSwgb3ZlciB0aGUgY3VycmVudCB0aW1lIHNlZ21lbnQsIGZvciB0aGUgb3JpZ2luYWwsIHRoZSBIRlIKKyAgIGFuZCB0aGUgZGlmZmVyZW5jZSwgb3ZlciBhbGwgY2hhbm5lbHMgaW4gdGhlIGN1cnJlbnQgZnJlcXVlbmN5IHJhbmdlLgorICAgTk9URTogdGhlIGF2ZXJhZ2luZyBpcyBkb25lIG9uIHRoZSB2YWx1ZXMgcXVvdGEvKDEgLSBxdW90YSArIFJFTEFYQVRJT04pLgorICAgKi8KKworICAvKiBUaGUgb3JpZ2luYWwsIHRoZSBzYnIgc2lnbmFsIGFuZCB0aGUgdG90YWwgZW5lcmd5ICovCisgIGRldGVjdG9yVmFsdWVzLT5hdmdOcmcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZm9yKGo9c3RhcnRJbmRleDsgajxzdG9wSW5kZXg7IGorKykgeworICAgIGZvcihpPXN0YXJ0Q2hhbm5lbDsgaTxzdG9wQ2hhbm5lbDsgaSsrKSB7CisgICAgICBxdW90YVZlY09yaWdbaV0gKz0gZk11bHQocXVvdGFNYXRyaXhPcmlnW2pdW2ldLCBpbnZJbmRleCk7CisKKyAgICAgIGlmKGluZGV4VmVjdG9yW2ldICE9IC0xKQorICAgICAgICBxdW90YVZlY1NicltpXSArPSBmTXVsdChxdW90YU1hdHJpeE9yaWdbal1baW5kZXhWZWN0b3JbaV1dLCBpbnZJbmRleCk7CisgICAgfQorICAgIGRldGVjdG9yVmFsdWVzLT5hdmdOcmcgKz0gZk11bHQobnJnVmVjdG9yW2pdLCBpbnZJbmRleCk7CisgIH0KKworICAvKgorICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZSwgZm9yIHRoZSBvcmlnaW5hbCwgdGhlIEhGUgorICAgYW5kIHRoZSBkaWZmZXJlbmNlLiBBbHNvIGNhbGN1bGF0ZSB0aGUgc2FtZSBtZWFuIHZhbHVlcyBmb3IgdGhlIHRocmVlIHZlY3RvcnMsIGJ1dCBvbmx5CisgICBpbmNsdWRlaW5nIHRoZSB4IHN0cm9uZ2VzdCBjb3BtcG9uZW50cy4KKyAgICovCisKKyAgb3JpZ1F1b3RhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIHNiclF1b3RhICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBmb3IoaT1zdGFydENoYW5uZWw7IGk8c3RvcENoYW5uZWw7IGkrKykgeworICAgIG9yaWdRdW90YSArPSBmTXVsdERpdjIocXVvdGFWZWNPcmlnW2ldLCBpbnZDaGFubmVsKTsKKyAgICBzYnJRdW90YSAgKz0gZk11bHREaXYyKHF1b3RhVmVjU2JyW2ldLCBpbnZDaGFubmVsKTsKKyAgfQorCisgIC8qCisgICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUgZm9yIHRoZSB4IHN0cm9uZ2VzdCBjb21wb25lbnRzCisgICovCisgIEZES3NickVuY19TaGVsbHNvcnRfZnJhY3QocXVvdGFWZWNPcmlnK3N0YXJ0Q2hhbm5lbCxzdG9wQ2hhbm5lbC1zdGFydENoYW5uZWwpOworICBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0KHF1b3RhVmVjU2JyK3N0YXJ0Q2hhbm5lbCxzdG9wQ2hhbm5lbC1zdGFydENoYW5uZWwpOworCisgIG9yaWdRdW90YU1lYW5TdHJvbmdlc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgc2JyUXVvdGFNZWFuU3Ryb25nZXN0ICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIHRlbXAgPSBtaW4oc3RvcENoYW5uZWwgLSBzdGFydENoYW5uZWwsIG51bWJlck9mU3Ryb25nZXN0KTsKKyAgaW52VGVtcCA9IEdldEludkludCh0ZW1wKTsKKworICBmb3IoaT0wOyBpPHRlbXA7IGkrKykgeworICAgIG9yaWdRdW90YU1lYW5TdHJvbmdlc3QgKz0gZk11bHREaXYyKHF1b3RhVmVjT3JpZ1tpICsgc3RvcENoYW5uZWwgLSB0ZW1wXSwgaW52VGVtcCk7CisgICAgc2JyUXVvdGFNZWFuU3Ryb25nZXN0ICArPSBmTXVsdERpdjIocXVvdGFWZWNTYnJbaSArIHN0b3BDaGFubmVsIC0gdGVtcF0sIGludlRlbXApOworICB9CisKKyAgLyoKKyAgIFRoZSB2YWx1ZSBmb3IgdGhlIHN0cm9uZ2VzdCBjb21wb25lbnQKKyAgKi8KKyAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1heCA9IHF1b3RhVmVjT3JpZ1tzdG9wQ2hhbm5lbCAtIDFdOworICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNYXggID0gcXVvdGFWZWNTYnJbc3RvcENoYW5uZWwgLSAxXTsKKworICAvKgorICAgQnVmZmVyIHZhbHVlcworICAqLworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuLCBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbiArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuLCBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuICsgMSwgSU5WRl9TTU9PVEhJTkdfTEVOR1RIKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0LCBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0LCBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0ICsgMSwgSU5WRl9TTU9PVEhJTkdfTEVOR1RIKnNpemVvZihGSVhQX0RCTCkpOworCisgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSF0gICAgICAgICAgPSBvcmlnUXVvdGE8PDE7CisgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSAgICAgICAgICAgPSBzYnJRdW90YTw8MTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSA9IG9yaWdRdW90YU1lYW5TdHJvbmdlc3Q8PDE7CisgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSAgPSBzYnJRdW90YU1lYW5TdHJvbmdlc3Q8PDE7CisKKyAgLyoKKyAgIEZpbHRlciB2YWx1ZXMKKyAgKi8KKyAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5GaWx0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5GaWx0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIGZvcihpPTA7aTxJTlZGX1NNT09USElOR19MRU5HVEgrMTtpKyspIHsKKyAgICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbkZpbHQgKz0gZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5baV0sIGZpbHRlcltpXSk7CisgICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbkZpbHQgICs9IGZNdWx0KGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5baV0sIGZpbHRlcltpXSk7CisgICAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RGaWx0ICs9IGZNdWx0KGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0W2ldLCBmaWx0ZXJbaV0pOworICAgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RGaWx0ICArPSBmTXVsdChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0W2ldLCBmaWx0ZXJbaV0pOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIFJldHVybnMgdGhlIHJlZ2lvbiBpbiB3aGljaCB0aGUgaW5wdXQgdmFsdWUgYmVsb25ncy4KKworCisKKyAgXHJldHVybiAgICByZWdpb24uCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitmaW5kUmVnaW9uKEZJWFBfREJMIGN1cnJWYWwsICAgICAgICAvKiE8IFRoZSBjdXJyZW50IHZhbHVlLiAqLworICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqYm9yZGVycywgLyohPCBUaGUgYm9yZGVyIG9mIHRoZSByZWdpb25zLiAqLworICAgICAgICAgICBjb25zdCBJTlQgbnVtQm9yZGVycyAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGJvcmRlcnMuICovCisgICAgICAgICAgICkKK3sKKyAgSU5UIGk7CisKKyAgaWYoY3VyclZhbCA8IGJvcmRlcnNbMF0peworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yKGkgPSAxOyBpIDwgbnVtQm9yZGVyczsgaSsrKXsKKyAgICBpZiggY3VyclZhbCA+PSBib3JkZXJzW2ktMV0gJiYgY3VyclZhbCA8IGJvcmRlcnNbaV0peworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisKKyAgaWYoY3VyclZhbCA+PSBib3JkZXJzW251bUJvcmRlcnMtMV0peworICAgIHJldHVybiBudW1Cb3JkZXJzOworICB9CisKKyAgcmV0dXJuIDA7ICAvKiBXZSBuZXZlciBnZXQgaGVyZSwgaXQncyBqdXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLiovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIE1ha2VzIGEgY2xldmVyIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBxdW90YSB2ZWN0b3IuCisKKworICBccmV0dXJuICAgICBkZWNpc2lvbiBvbiB3aGljaCBpbnZmIG1vZGUgdG8gdXNlCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5WRl9NT0RFCitkZWNpc2lvbkFsZ29yaXRobShjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTICpkZXRlY3RvclBhcmFtcywgICAgIC8qITwgU3RydWN0IHdpdGggdGhlIGRldGVjdG9yIHBhcmFtZXRlcnMuICovCisgICAgICAgICAgICAgICAgICBERVRFQ1RPUl9WQUxVRVMgKmRldGVjdG9yVmFsdWVzLCAgICAgICAgICAgICAgIC8qITwgU3RydWN0IHdpdGggdGhlIGRldGVjdG9yIHZhbHVlcy4gKi8KKyAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGbGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgdGhlcmUgaXMgYSB0cmFuc2llbnQgcHJlc2VudC4qLworICAgICAgICAgICAgICAgICAgSU5UKiBwcmV2UmVnaW9uU2JyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBwcmV2aW91cyByZWdpb24gaW4gd2hpY2ggdGhlIFNiciB2YWx1ZSB3YXMuICovCisgICAgICAgICAgICAgICAgICBJTlQqIHByZXZSZWdpb25PcmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHByZXZpb3VzIHJlZ2lvbiBpbiB3aGljaCB0aGUgT3JpZyB2YWx1ZSB3YXMuICovCisgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpbnZGaWx0TGV2ZWwsIHJlZ2lvblNiciwgcmVnaW9uT3JpZywgcmVnaW9uTnJnOworCisgIC8qCisgICBDdXJyZW50IHRocmVzaG9sZHMuCisgICAqLworICBjb25zdCBGSVhQX0RCTCAqcXVhbnRTdGVwc1NiciAgPSBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc1NicjsKKyAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNPcmlnID0gZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNPcmlnOworICBjb25zdCBGSVhQX0RCTCAqbnJnQm9yZGVycyAgICAgPSBkZXRlY3RvclBhcmFtcy0+bnJnQm9yZGVyczsKKyAgY29uc3QgSU5UIG51bVJlZ2lvbnNTYnIgICAgID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNTYnI7CisgIGNvbnN0IElOVCBudW1SZWdpb25zT3JpZyAgICA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zT3JpZzsKKyAgY29uc3QgSU5UIG51bVJlZ2lvbnNOcmcgICAgID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNOcmc7CisKKyAgRklYUF9EQkwgcXVhbnRTdGVwc1NiclRtcFtNQVhfTlVNX1JFR0lPTlNdOworICBGSVhQX0RCTCBxdWFudFN0ZXBzT3JpZ1RtcFtNQVhfTlVNX1JFR0lPTlNdOworCisgIC8qCisgICBDdXJyZW50IGRldGVjdG9yIHZhbHVlcy4KKyAgICovCisgIEZJWFBfREJMIG9yaWdRdW90YU1lYW5GaWx0OworICBGSVhQX0RCTCBzYnJRdW90YU1lYW5GaWx0OworICBGSVhQX0RCTCBucmc7CisKKyAgLyogMC4zNzUgPSAzLjAgLyA4LjA7IDAuMzExNDMwNzU4ODkgPSBsb2cyKFJFTEFYQVRJT04pLzY0LjA7IDAuNjI1ID0gbG9nKDE2KS82NC4wOyAwLjY4NzUgPSA0NC82NC4wICovCisgIG9yaWdRdW90YU1lYW5GaWx0ID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKG1heChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbkZpbHQsKEZJWFBfREJMKTEpKSArIEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkpKSA8PCAwOyAgLyogc2NhbGVkIGJ5IDEvMl45ICovCisgIHNiclF1b3RhTWVhbkZpbHQgID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKG1heChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuRmlsdCwoRklYUF9EQkwpMSkpICsgRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKSkpIDw8IDA7ICAgLyogc2NhbGVkIGJ5IDEvMl45ICovCisgIC8qIElmIGVuZXJneSBpcyB6ZXJvIHRoZW4gd2Ugd2lsbCBnZXQgZGlmZmVyZW50IHJlc3VsdHMgZm9yIGRpZmZlcmVudCB3b3JkIGxlbmd0aHMuICovCisgIG5yZyAgICAgICAgICAgICAgID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKGRldGVjdG9yVmFsdWVzLT5hdmdOcmcrKEZJWFBfREJMKTEpICsgRkwyRlhDT05TVF9EQkwoMC4wNjI1ZikgKyBGTDJGWENPTlNUX0RCTCgwLjY4NzVmKSkpKSA8PCAwOyAgICAgLyogc2NhbGVkIGJ5IDEvMl44OyAyXjQ0IC0+IHFtZiBlbmVyZ3kgc2NhbGUgKi8KKworICBGREttZW1jcHkocXVhbnRTdGVwc1NiclRtcCxxdWFudFN0ZXBzU2JyLG51bVJlZ2lvbnNTYnIqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShxdWFudFN0ZXBzT3JpZ1RtcCxxdWFudFN0ZXBzT3JpZyxudW1SZWdpb25zT3JpZypzaXplb2YoRklYUF9EQkwpKTsKKworICBpZigqcHJldlJlZ2lvblNiciA8IG51bVJlZ2lvbnNTYnIpCisgICAgcXVhbnRTdGVwc1NiclRtcFsqcHJldlJlZ2lvblNicl0gPSBxdWFudFN0ZXBzU2JyWypwcmV2UmVnaW9uU2JyXSArIGh5c3RlcmVzaXM7CisgIGlmKCpwcmV2UmVnaW9uU2JyID4gMCkKKyAgICBxdWFudFN0ZXBzU2JyVG1wWypwcmV2UmVnaW9uU2JyIC0gMV0gPSBxdWFudFN0ZXBzU2JyWypwcmV2UmVnaW9uU2JyIC0gMV0gLSBoeXN0ZXJlc2lzOworCisgIGlmKCpwcmV2UmVnaW9uT3JpZyA8IG51bVJlZ2lvbnNPcmlnKQorICAgIHF1YW50U3RlcHNPcmlnVG1wWypwcmV2UmVnaW9uT3JpZ10gPSBxdWFudFN0ZXBzT3JpZ1sqcHJldlJlZ2lvbk9yaWddICsgaHlzdGVyZXNpczsKKyAgaWYoKnByZXZSZWdpb25PcmlnID4gMCkKKyAgICBxdWFudFN0ZXBzT3JpZ1RtcFsqcHJldlJlZ2lvbk9yaWcgLSAxXSA9IHF1YW50U3RlcHNPcmlnWypwcmV2UmVnaW9uT3JpZyAtIDFdIC0gaHlzdGVyZXNpczsKKworICByZWdpb25TYnIgID0gZmluZFJlZ2lvbihzYnJRdW90YU1lYW5GaWx0LCBxdWFudFN0ZXBzU2JyVG1wLCBudW1SZWdpb25zU2JyKTsKKyAgcmVnaW9uT3JpZyA9IGZpbmRSZWdpb24ob3JpZ1F1b3RhTWVhbkZpbHQsIHF1YW50U3RlcHNPcmlnVG1wLCBudW1SZWdpb25zT3JpZyk7CisgIHJlZ2lvbk5yZyAgPSBmaW5kUmVnaW9uKG5yZyxucmdCb3JkZXJzLG51bVJlZ2lvbnNOcmcpOworCisgICpwcmV2UmVnaW9uU2JyID0gcmVnaW9uU2JyOworICAqcHJldlJlZ2lvbk9yaWcgPSByZWdpb25PcmlnOworCisgIC8qIFVzZSBkaWZmZXJlbnQgc2V0dGluZ3MgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudCovCisgIGludkZpbHRMZXZlbCA9ICh0cmFuc2llbnRGbGFnID09IDEpID8gZGV0ZWN0b3JQYXJhbXMtPnJlZ2lvblNwYWNlVHJhbnNpZW50W3JlZ2lvblNicl1bcmVnaW9uT3JpZ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRlY3RvclBhcmFtcy0+cmVnaW9uU3BhY2VbcmVnaW9uU2JyXVtyZWdpb25PcmlnXTsKKworICAvKiBDb21wZW5zYXRlIGZvciBsb3cgZW5lcmd5LiovCisgIGludkZpbHRMZXZlbCA9IG1heChpbnZGaWx0TGV2ZWwgKyBkZXRlY3RvclBhcmFtcy0+RW5lcmd5Q29tcEZhY3RvcltyZWdpb25OcmddLDApOworCisgIHJldHVybiAoSU5WRl9NT0RFKSAoaW52RmlsdExldmVsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRXN0aWFtdGlvbiBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgcmVxdWlyZWQKKyAgICAgICAgICAgICBpbiB0aGUgZGVjb2Rlci4KKworICAgQSBzZWNvbmQgb3JkZXIgTFBDIGlzIGNhbGN1bGF0ZWQgZm9yIGV2ZXJ5IGZpbHRlcmJhbmsgY2hhbm5lbCwgdXNpbmcKKyAgIHRoZSBjb3ZhcmlhbmNlIG1ldGhvZC4gVEhlIHJhdGlvIGJldHdlZW4gdGhlIGVuZXJneSBvZiB0aGUgcHJlZGljdGVkCisgICBzaWduYWwgYW5kIHRoZSBlbmVyZ3kgb2YgdGhlIG5vbi1wcmVkaWN0YWJsZSBzaWduYWwgaXMgY2FsY3VhbHRlZC4KKworICBccmV0dXJuICAgIG5vbmUuCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LCAgLyohPCBIYW5kbGUgdG8gdGhlIFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXgsICAgICAgICAgICAgLyohPCBUaGUgbWF0cml4IGhvbGRpbmcgdGhlIHRvbmFsaXR5IHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ1ZlY3RvciwgICAgICAgICAgICAgICAvKiE8IFRoZSBlbmVyZ3kgdmVjdG9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvciwgICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGluZGV4LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGbGFnLCAgICAgICAgICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudCBvciBub3QuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUqIGluZlZlYyAgICAgICAgICAgICAgICAgIC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBiYW5kOworCisgIC8qCisgICAqIERvIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCBlc3RpbWF0aW9uLgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGZvcihiYW5kID0gMCA7IGJhbmQgPCBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzOyBiYW5kKyspeworICAgIElOVCBzdGFydENoYW5uZWwgPSBoSW52RmlsdC0+ZnJlcUJhbmRUYWJsZUludkZpbHRbYmFuZF07CisgICAgSU5UIHN0b3BDaGFubmVsICA9IGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdFtiYW5kKzFdOworCisKKyAgICBjYWxjdWxhdGVEZXRlY3RvclZhbHVlcyggcXVvdGFNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QpOworCisgICAgaW5mVmVjW2JhbmRdPSBkZWNpc2lvbkFsZ29yaXRobSggaEludkZpbHQtPmRldGVjdG9yUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5wcmV2UmVnaW9uU2JyW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5wcmV2UmVnaW9uT3JpZ1tiYW5kXSk7CisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIEluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVsIGVzdGltYXRvci4KKworCisgIFxyZXR1cm4gICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgc3VjY2Vzc2Z1bC4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IgKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LCAgIC8qITwgUG9pbnRlciB0byBhIGhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCisgICAgICAgICAgICAgICAgICAgICAgIElOVCogZnJlcUJhbmRUYWJsZURldGVjdG9yLCAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBpbnZlcnNlIGZpbHRlcmluZyBiYW5kcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgICAgICAgICAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2gqLworICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBpOworCisgIEZES21lbWNsZWFyKCBoSW52RmlsdCxzaXplb2YoU0JSX0lOVl9GSUxUX0VTVCkpOworCisgIGhJbnZGaWx0LT5kZXRlY3RvclBhcmFtcyA9ICh1c2VTcGVlY2hDb25maWcpID8gJmRldGVjdG9yUGFyYW1zQUFDU3BlZWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmRldGVjdG9yUGFyYW1zQUFDIDsKKworICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4ID0gbnVtRGV0ZWN0b3JCYW5kczsKKworICAvKgorICAgICBNZW1vcnkgaW5pdGlhbGlzYXRpb24KKyAgKi8KKyAgZm9yKGk9MDtpPGhJbnZGaWx0LT5ub0RldGVjdG9yQmFuZHNNYXg7aSsrKXsKKyAgICBGREttZW1jbGVhcigmaEludkZpbHQtPmRldGVjdG9yVmFsdWVzW2ldLCBzaXplb2YoREVURUNUT1JfVkFMVUVTKSk7CisgICAgaEludkZpbHQtPnByZXZJbnZmTW9kZVtpXSAgID0gSU5WRl9PRkY7CisgICAgaEludkZpbHQtPnByZXZSZWdpb25PcmlnW2ldID0gMDsKKyAgICBoSW52RmlsdC0+cHJldlJlZ2lvblNicltpXSAgPSAwOworICB9CisKKyAgLyoKKyAgUmVzZXQgdGhlIGludmVyc2UgZmx0ZXJpbmcgZGV0ZWN0b3IuCisgICovCisgIEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcihoSW52RmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZURldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4KTsKKworICByZXR1cm4gKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIHJlc2V0cyBzYnIgaW52ZXJzZSBmaWx0ZXJpbmcgc3RydWN0dXJlLgorCisKKworICBccmV0dXJuICAgZXJyb3JDb2RlLCBub0Vycm9yIGlmIHN1Y2Nlc3NmdWwuCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwgLyohPCBIYW5kbGUgdG8gdGhlIFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgSU5UKiBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsICAgICAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIHRoZSBpbnZlcnNlIGZpbHRlcmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzKSAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBpbnZlcnNlIGZpbHRlcmluZyBiYW5kcy4gKi8KK3sKKworICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QgICAgID0gMTsKKyAgRkRLbWVtY3B5KGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdCxmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsKG51bURldGVjdG9yQmFuZHMrMSkqc2l6ZW9mKElOVCkpOworICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzID0gbnVtRGV0ZWN0b3JCYW5kczsKKworICByZXR1cm4gKDApOworfQorCisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmggYi9hYWMvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDJhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5oCkBAIC0wLDAgKzEsMTc1IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgSW52ZXJzZSBGaWx0ZXJpbmcgZGV0ZWN0aW9uIHByb3RvdHlwZXMgIAorKi8KKyNpZm5kZWYgX0lOVl9GSUxUX0RFVF9ICisjZGVmaW5lIF9JTlZfRklMVF9ERVRfSAorCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisKKyNkZWZpbmUgSU5WRl9TTU9PVEhJTkdfTEVOR1RIIDIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNTYnI7CisgIGNvbnN0IEZJWFBfREJMICpxdWFudFN0ZXBzT3JpZzsKKyAgY29uc3QgRklYUF9EQkwgKm5yZ0JvcmRlcnM7CisgIElOVCAgIG51bVJlZ2lvbnNTYnI7CisgIElOVCAgIG51bVJlZ2lvbnNPcmlnOworICBJTlQgICBudW1SZWdpb25zTnJnOworICBJTlZGX01PREUgcmVnaW9uU3BhY2VbNV1bNV07CisgIElOVkZfTU9ERSByZWdpb25TcGFjZVRyYW5zaWVudFs1XVs1XTsKKyAgSU5UIEVuZXJneUNvbXBGYWN0b3JbNV07CisKK31ERVRFQ1RPUl9QQVJBTUVURVJTOworCit0eXBlZGVmIHN0cnVjdAoreworICBGSVhQX0RCTCAgb3JpZ1F1b3RhTWVhbltJTlZGX1NNT09USElOR19MRU5HVEgrMV07CisgIEZJWFBfREJMICBzYnJRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOworICBGSVhQX0RCTCAgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEgrMV07CisgIEZJWFBfREJMICBzYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOworCisgIEZJWFBfREJMIG9yaWdRdW90YU1lYW5GaWx0OworICBGSVhQX0RCTCBzYnJRdW90YU1lYW5GaWx0OworICBGSVhQX0RCTCBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0RmlsdDsKKyAgRklYUF9EQkwgc2JyUXVvdGFNZWFuU3Ryb25nZXN0RmlsdDsKKworICBGSVhQX0RCTCBvcmlnUXVvdGFNYXg7CisgIEZJWFBfREJMIHNiclF1b3RhTWF4OworCisgIEZJWFBfREJMIGF2Z05yZzsKK31ERVRFQ1RPUl9WQUxVRVM7CisKKworCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQgbnVtYmVyT2ZTdHJvbmdlc3Q7CisKKyAgSU5UIHByZXZSZWdpb25TYnJbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworICBJTlQgcHJldlJlZ2lvbk9yaWdbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworCisgIElOVCBmcmVxQmFuZFRhYmxlSW52RmlsdFtNQVhfTlVNX05PSVNFX1ZBTFVFU107CisgIElOVCBub0RldGVjdG9yQmFuZHM7CisgIElOVCBub0RldGVjdG9yQmFuZHNNYXg7CisKKyAgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSUyAqZGV0ZWN0b3JQYXJhbXM7CisKKyAgSU5WRl9NT0RFIHByZXZJbnZmTW9kZVtNQVhfTlVNX05PSVNFX1ZBTFVFU107CisgIERFVEVDVE9SX1ZBTFVFUyBkZXRlY3RvclZhbHVlc1tNQVhfTlVNX05PSVNFX1ZBTFVFU107CisKKyAgRklYUF9EQkwgbnJnQXZnOworICBGSVhQX0RCTCB3bVFtZltNQVhfTlVNX05PSVNFX1ZBTFVFU107Cit9CitTQlJfSU5WX0ZJTFRfRVNUOworCit0eXBlZGVmIFNCUl9JTlZfRklMVF9FU1QgKkhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUOworCit2b2lkCitGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIHF1b3RhTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMpOworCitJTlQKK0ZES3NickVuY19pbml0SW52RmlsdERldGVjdG9yIChIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZyk7CisKK0lOVAorRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgSU5UKiBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcyk7CisKKyNlbmRpZiAvKiBfUU1GX0lOVl9GSUxUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkMWI4YgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAKQEAgLTAsMCArMSwxNDUxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgIm1oX2RldC5oIgorCisjaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicl9taXNjLmgiCisKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNkZWZpbmUgU0ZNX1NISUZUIDIgICAgIC8qIEF0dGVudGlvbjogU0ZNX1NDQUxFIGRlcGVuZHMgb24gU0ZNX1NISUZUICovCisjZGVmaW5lIFNGTV9TQ0FMRSAoTUFYVkFMX0RCTCA+PiBTRk1fU0hJRlQpICAgLyogMS4wID4+IFNGTV9TSElGVCAqLworCisKKy8qITwgRGV0ZWN0b3IgUGFyYW1ldGVycyBmb3IgQUFDIGNvcmUgY29kZWMuICovCitzdGF0aWMgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSU19NSCBwYXJhbXNBYWMgPSB7Cis5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVsdGFUaW1lICovCit7CitGTDJGWENPTlNUX0RCTCgyMC4wZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkRGlmZiAqLworRkwyRlhDT05TVF9EQkwoMS4yNmYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZERpZmZHdWlkZSAqLworRkwyRlhDT05TVF9EQkwoMTUuMGYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZFRvbmUgKi8KK0ZMMkZYQ09OU1RfREJMKCgxLjBmLzE1LjBmKSpSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCBpbnZUaHJlc0hvbGRUb25lICovCitGTDJGWENPTlNUX0RCTCgxLjI2ZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkVG9uZUd1aWRlICovCitGTDJGWENPTlNUX0RCTCgwLjNmKT4+U0ZNX1NISUZULCAgICAgICAgICAgICAgIC8qITwgc2ZtVGhyZXNTYnIgKi8KK0ZMMkZYQ09OU1RfREJMKDAuMWYpPj5TRk1fU0hJRlQsICAgICAgICAgICAgICAgLyohPCBzZm1UaHJlc09yaWcgKi8KK0ZMMkZYQ09OU1RfREJMKDAuM2YpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlT3JpZyAqLworRkwyRlhDT05TVF9EQkwoMC41ZiksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVEaWZmICovCitGTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLCAgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjk5NWYpKSAqLyAvKiE8IGRlcml2VGhyZXNNYXhMRDY0ICovCitGTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLCAgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjk5NWYpKSAqLyAvKiE8IGRlcml2VGhyZXNCZWxvd0xENjQgKi8KK0ZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4M2YpIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC44ZikpICovICAgIC8qITwgZGVyaXZUaHJlc0Fib3ZlTEQ2NCAqLworfSwKKzUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBtYXhDb21wICovCit9OworCisvKiE8IERldGVjdG9yIFBhcmFtZXRlcnMgZm9yIEFBQyBMRCBjb3JlIGNvZGVjLiAqLworc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggcGFyYW1zQWFjTGQgPSB7CisxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsdGEgdGltZS4gKi8KK3sKK0ZMMkZYQ09OU1RfREJMKDI1LjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGREaWZmICovCitGTDJGWENPTlNUX0RCTCgxLjI2ZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdHJlc0hvbGREaWZmR3VpZGUgKi8KK0ZMMkZYQ09OU1RfREJMKDE1LjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGRUb25lICovCitGTDJGWENPTlNUX0RCTCgoMS4wZi8xNS4wZikqUkVMQVhBVElPTl9GTE9BVCksIC8qITwgaW52VGhyZXNIb2xkVG9uZSAqLworRkwyRlhDT05TVF9EQkwoMS4yNmYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZFRvbmVHdWlkZSAqLworRkwyRlhDT05TVF9EQkwoMC4zZik+PlNGTV9TSElGVCwgICAgICAgICAgICAgICAvKiE8IHNmbVRocmVzU2JyICovCitGTDJGWENPTlNUX0RCTCgwLjFmKT4+U0ZNX1NISUZULCAgICAgICAgICAgICAgIC8qITwgc2ZtVGhyZXNPcmlnICovCitGTDJGWENPTlNUX0RCTCgwLjNmKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZU9yaWcgKi8KK0ZMMkZYQ09OU1RfREJMKDAuMmYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlRGlmZiAqLworRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gIC8qITwgZGVyaXZUaHJlc01heExENjQgKi8KK0ZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovICAvKiE8IGRlcml2VGhyZXNCZWxvd0xENjQgKi8KK0ZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4M2YpIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC44ZikpICovICAgICAvKiE8IGRlcml2VGhyZXNBYm92ZUxENjQgKi8KK30sCis1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbWF4Q29tcCAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIHRvbmFsaXR5IGJldHdlZW4gb3JpZ2luYWwgYW5kIFNCUgorICAgICAgICAgICAgIGZvciBhIGdpdmVuIHRpbWUgYW5kIGZyZXF1ZW5jeSByZWdpb24uCisKKyAgICAgICAgICAgICBUaGUgdmFsdWVzIGZvciBwRGlmZk1hcHBlZDJTY2ZiIGFyZSBzY2FsZWQgYnkgUkVMQVhBVElPTgorCisgIFxyZXR1cm4gICAgbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRpZmYoRklYUF9EQkwgKlJFU1RSSUNUIHBUb25hbGl0eU9yaWcsCisgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwRGlmZk1hcHBlZDJTY2ZiLAorICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqUkVTVFJJQ1QgcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgIElOVCAgICAgICBuU2NmYiwKKyAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yKQoreworICBVQ0hBUiBpLCBsbCwgbHUsIGs7CisgIEZJWFBfREJMIG1heFZhbE9yaWcsIG1heFZhbFNiciwgdG1wOworICBJTlQgc2NhbGU7CisKKyAgZm9yKGk9MDsgaSA8IG5TY2ZiOyBpKyspeworICAgIGxsID0gcEZyZXFCYW5kVGFibGVbaV07CisgICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpKzFdOworCisgICAgbWF4VmFsT3JpZyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIG1heFZhbFNiciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgZm9yKGs9bGw7azxsdTtrKyspeworICAgICAgbWF4VmFsT3JpZyA9IGZpeE1heChtYXhWYWxPcmlnLCBwVG9uYWxpdHlPcmlnW2tdKTsKKyAgICAgIG1heFZhbFNiciA9IGZpeE1heChtYXhWYWxTYnIsIHBUb25hbGl0eU9yaWdbaW5kZXhWZWN0b3Jba11dKTsKKyAgICB9CisKKyAgICBpZiAoKG1heFZhbFNiciA+PSBSRUxBWEFUSU9OKSkgeworICAgICAgICB0bXAgPSBmRGl2Tm9ybShtYXhWYWxPcmlnLCBtYXhWYWxTYnIsICZzY2FsZSk7CisgICAgICAgIHBEaWZmTWFwcGVkMlNjZmJbaV0gPSBzY2FsZVZhbHVlKGZNdWx0KHRtcCxSRUxBWEFUSU9OX0ZSQUNUKSwgZml4TWF4KC0oREZSQUNUX0JJVFMtMSksKHNjYWxlLVJFTEFYQVRJT05fU0hJRlQpKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwRGlmZk1hcHBlZDJTY2ZiW2ldID0gbWF4VmFsT3JpZzsKKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGVzIGEgZmxhdG5lc3MgbWVhc3VyZSBvZiB0aGUgdG9uYWxpdHkgbWVhc3VyZXMuCisKKyAgQ2FsY3VsYXRpb24gb2YgdGhlIHBvd2VyIGZ1bmN0aW9uIGFuZCB1c2luZyBzY2FsZWZhY3RvciBmb3IgYmFzaXM6CisgICAgVXNpbmcgbG9nMjoKKyAgICB6ICA9ICgyXmsgKiB4KV55OworICAgIHonID0gQ2FsY0xkKHopID0geSpDYWxjTGQoeCkgKyB5Kms7CisgICAgeiAgPSBDYWxjSW52TGQoeicpOworCisgICAgVXNpbmcgbGQ2NDoKKyAgICB6ICA9ICgyXmsgKiB4KV55OworICAgIHonID0gQ2FsY0xkNjQoeikgPSB5KkNhbGNMZDY0KHgpLzY0ICsgeSprLzY0OworICAgIHogID0gQ2FsY0ludkxkNjQoeicpOworCisgIFRoZSB2YWx1ZXMgcFNmbU9yaWdWZWMgYW5kIHBTZm1TYnJWZWMgYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yIDEvNC4wCisKKyAgXHJldHVybiAgICBub25lLgorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlRmxhdG5lc3NNZWFzdXJlKEZJWFBfREJMICpwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwU2ZtT3JpZ1ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFNmbVNiclZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgIG5TZmIpCit7CisgIElOVCBpLGo7CisgIEZJWFBfREJMIGludkJhbmRzLHRtcDEsdG1wMjsKKyAgSU5UIHNoaWZ0RmFjMCxzaGlmdEZhY1N1bTA7CisgIElOVCBzaGlmdEZhYzEsc2hpZnRGYWNTdW0xOworICBGSVhQX0RCTCBhY2N1OworCisgIGZvcihpPTA7aTxuU2ZiO2krKykKKyAgeworICAgIElOVCBsbCA9IHBGcmVxQmFuZFRhYmxlW2ldOworICAgIElOVCBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisgICAgcFNmbU9yaWdWZWNbaV0gPSAoRklYUF9EQkwpKE1BWFZBTF9EQkw+PjIpOworICAgIHBTZm1TYnJWZWNbaV0gID0gKEZJWFBfREJMKShNQVhWQUxfREJMPj4yKTsKKworICAgIGlmKGx1IC0gbGwgPiAxKXsKKyAgICAgIEZJWFBfREJMIGFtT3JpZyxhbVRyYW5zcCxnbU9yaWcsZ21UcmFuc3Asc2ZtT3JpZyxzZm1UcmFuc3A7CisgICAgICBpbnZCYW5kcyA9IEdldEludkludChsdS1sbCk7CisgICAgICBzaGlmdEZhY1N1bTAgPSAwOworICAgICAgc2hpZnRGYWNTdW0xID0gMDsKKyAgICAgIGFtT3JpZyA9IGFtVHJhbnNwID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBnbU9yaWcgPSBnbVRyYW5zcCA9IChGSVhQX0RCTClNQVhWQUxfREJMOworCisgICAgICBmb3Ioaj0gbGw7IGo8bHU7IGorKykgeworICAgICAgICBzZm1PcmlnICAgPSBwUXVvdGFCdWZmZXJbal07CisgICAgICAgIHNmbVRyYW5zcCA9IHBRdW90YUJ1ZmZlcltpbmRleFZlY3RvcltqXV07CisKKyAgICAgICAgYW1PcmlnICAgKz0gZk11bHQoc2ZtT3JpZywgaW52QmFuZHMpOworICAgICAgICBhbVRyYW5zcCArPSBmTXVsdChzZm1UcmFuc3AsIGludkJhbmRzKTsKKworICAgICAgICBzaGlmdEZhYzAgPSBDb3VudExlYWRpbmdCaXRzKHNmbU9yaWcpOworICAgICAgICBzaGlmdEZhYzEgPSBDb3VudExlYWRpbmdCaXRzKHNmbVRyYW5zcCk7CisKKyAgICAgICAgZ21PcmlnICAgPSBmTXVsdChnbU9yaWcsIHNmbU9yaWc8PHNoaWZ0RmFjMCk7CisgICAgICAgIGdtVHJhbnNwID0gZk11bHQoZ21UcmFuc3AsIHNmbVRyYW5zcDw8c2hpZnRGYWMxKTsKKworICAgICAgICBzaGlmdEZhY1N1bTAgKz0gc2hpZnRGYWMwOworICAgICAgICBzaGlmdEZhY1N1bTEgKz0gc2hpZnRGYWMxOworICAgICAgfQorCisgICAgICBpZiAoZ21PcmlnID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKworICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbU9yaWcpOyAgICAgIC8qIENhbGNMZDY0KHgpLzY0ICovCisgICAgICAgIHRtcDEgPSBmTXVsdChpbnZCYW5kcywgdG1wMSk7ICAgLyogeSpDYWxjTGQ2NCh4KS82NCAqLworCisgICAgICAgIC8qIHkqay82NCAqLworICAgICAgICBhY2N1ID0gKEZJWFBfREJMKS1zaGlmdEZhY1N1bTAgPDwgKERGUkFDVF9CSVRTLTEtOCk7CisgICAgICAgIHRtcDIgPSBmTXVsdERpdjIoaW52QmFuZHMsIGFjY3UpIDw8ICgyKzEpOworCisgICAgICAgIHRtcDIgPSB0bXAxICsgdG1wMjsgICAgICAgICAgICAgLyogeSpDYWxjTGQ2NCh4KS82NCArIHkqay82NCAqLworICAgICAgICBnbU9yaWcgPSBDYWxjSW52TGREYXRhKHRtcDIpOyAgIC8qIENhbGNJbnZMZDY0KHonKTsgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBnbU9yaWcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdtVHJhbnNwID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKworICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbVRyYW5zcCk7ICAgIC8qIENhbGNMZDY0KHgpLzY0ICovCisgICAgICAgIHRtcDEgPSBmTXVsdChpbnZCYW5kcywgdG1wMSk7ICAgLyogeSpDYWxjTGQ2NCh4KS82NCAqLworCisgICAgICAgIC8qIHkqay82NCAqLworICAgICAgICBhY2N1ID0gKEZJWFBfREJMKS1zaGlmdEZhY1N1bTEgPDwgKERGUkFDVF9CSVRTLTEtOCk7CisgICAgICAgIHRtcDIgPSBmTXVsdERpdjIoaW52QmFuZHMsIGFjY3UpIDw8ICgyKzEpOworCisgICAgICAgIHRtcDIgPSB0bXAxICsgdG1wMjsgICAgICAgICAgICAgLyogeSpDYWxjTGQ2NCh4KS82NCArIHkqay82NCAqLworICAgICAgICBnbVRyYW5zcCA9IENhbGNJbnZMZERhdGEodG1wMik7IC8qIENhbGNJbnZMZDY0KHonKTsgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBnbVRyYW5zcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgfQorICAgICAgaWYgKCBhbU9yaWcgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgKQorICAgICAgICBwU2ZtT3JpZ1ZlY1tpXSA9IEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KGdtT3JpZyxhbU9yaWcsU0ZNX1NDQUxFKTsKKworICAgICAgaWYgKCBhbVRyYW5zcCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSApCisgICAgICAgIHBTZm1TYnJWZWNbaV0gPSBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChnbVRyYW5zcCxhbVRyYW5zcCxTRk1fU0NBTEUpOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDYWxjdWxhdGVzIHRoZSBpbnB1dCB0byB0aGUgbWlzc2luZyBoYXJtb25pY3MgZGV0ZWN0aW9uLgorCisKKyAgXHJldHVybiAgICBub25lLgorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlRGV0ZWN0b3JJbnB1dChGSVhQX0RCTCAqKlJFU1RSSUNUIHBRdW90YUJ1ZmZlciwgIC8qITwgUG9pbnRlciB0byB0b25hbGl0eSBtYXRyaXguICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqUkVTVFJJQ1QgaW5kZXhWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgdG9uYWxpdHlEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHBTZm1PcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHBTZm1TYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vRXN0UGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtb3ZlKQoreworICBJTlQgZXN0OworCisgIC8qCisgIE5ldyBlc3RpbWF0ZS4KKyAgKi8KKyAgZm9yIChlc3Q9MDsgZXN0IDwgbm9Fc3RQZXJGcmFtZTsgZXN0KyspIHsKKworICAgIGRpZmYocFF1b3RhQnVmZmVyW2VzdCttb3ZlXSwKKyAgICAgICAgIHRvbmFsaXR5RGlmZltlc3QrbW92ZV0sCisgICAgICAgICBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgblNmYiwKKyAgICAgICAgIGluZGV4VmVjdG9yKTsKKworICAgIGNhbGN1bGF0ZUZsYXRuZXNzTWVhc3VyZShwUXVvdGFCdWZmZXJbZXN0KyBtb3ZlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZm1PcmlnW2VzdCArIG1vdmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZtU2JyW2VzdCArIG1vdmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIENoZWNrcyB0aGF0IHRoZSBkZXRlY3Rpb24gaXMgbm90IGR1ZSB0byBhIExQIGZpbHRlcgorCisgIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBhIG5ld2x5IGRldGVjdGVkIG1pc3NpbmcgaGFybW9uaWNzIGlzIG5vdAorICBpbiBmYWN0IGp1c3QgYSBsb3ctcGFzcyBmaWx0ZXJlIGlucHV0IHNpZ25hbC4gSWYgc28sIHRoZSBkZXRlY3Rpb24gaXMKKyAgcmVtb3ZlZC4KKworICBccmV0dXJuICAgIG5vbmUuCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCByZW1vdmVMb3dQYXNzRGV0ZWN0aW9uKFVDSEFSICpSRVNUUklDVCBwQWRkSGFybVNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipSRVNUUklDVCBwRGV0ZWN0aW9uVmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpSRVNUUklDVCBwRnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBOcmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVTX0hPTERTIG1oVGhyZXNoKQorCit7CisgIElOVCBpLGVzdDsKKyAgSU5UIG1heERlcml2UG9zID0gcEZyZXFCYW5kVGFibGVbblNmYl07CisgIElOVCBudW1CYW5kcyA9IHBGcmVxQmFuZFRhYmxlW25TZmJdOworICBGSVhQX0RCTCBucmdMb3csbnJnSGlnaDsKKyAgRklYUF9EQkwgbnJnTEQ2NCxucmdMb3dMRDY0LG5yZ0hpZ2hMRDY0LG5yZ0RpZmZMRDY0OworICBGSVhQX0RCTCB2YWxMRDY0LG1heFZhbExENjQsbWF4VmFsQWJvdmVMRDY0OworICBJTlQgYkxQc2lnbmFsID0gMDsKKworICBtYXhWYWxMRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICBmb3IoaSA9IG51bUJhbmRzIC0gMSAtIDI7IGkgPiBwRnJlcUJhbmRUYWJsZVswXTtpLS0peworICAgIG5yZ0xvdyAgPSBwTnJnVmVjdG9yW2ldOworICAgIG5yZ0hpZ2ggPSBwTnJnVmVjdG9yW2kgKyAyXTsKKworICAgIGlmKG5yZ0xvdyAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdMb3cgPiBucmdIaWdoKXsKKyAgICAgIG5yZ0xvd0xENjQgPSBDYWxjTGREYXRhKG5yZ0xvdz4+MSk7CisgICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0xvdz4+MSktKG5yZ0hpZ2g+PjEpKTsKKyAgICAgIHZhbExENjQgPSBucmdEaWZmTEQ2NC1ucmdMb3dMRDY0OworICAgICAgaWYodmFsTEQ2NCA+IG1heFZhbExENjQpeworICAgICAgICBtYXhEZXJpdlBvcyA9IGk7CisgICAgICAgIG1heFZhbExENjQgPSB2YWxMRDY0OworICAgICAgfQorICAgICAgaWYobWF4VmFsTEQ2NCA+IG1oVGhyZXNoLmRlcml2VGhyZXNNYXhMRDY0KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEZpbmQgdGhlIGxhcmdlc3QgImdyYWRpZW50IiBhYm92ZS4gKHNob3VsZCBiZSByZWxhdGl2ZWx5IGZsYXQsIGhlbmNlIHdlIGV4cGVjdCBhIGxvdyB2YWx1ZQorICAgICBpZiB0aGUgc2lnbmFsIGlzIExQLiovCisgIG1heFZhbEFib3ZlTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgZm9yKGkgPSBudW1CYW5kcyAtIDEgLSAyOyBpID4gbWF4RGVyaXZQb3MgKyAyO2ktLSl7CisgICAgbnJnTG93ICA9IHBOcmdWZWN0b3JbaV07CisgICAgbnJnSGlnaCA9IHBOcmdWZWN0b3JbaSArIDJdOworCisgICAgaWYobnJnTG93ICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmIG5yZ0xvdyA+IG5yZ0hpZ2gpeworCQkgICBucmdMb3dMRDY0ID0gQ2FsY0xkRGF0YShucmdMb3c+PjEpOworCQkgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0xvdz4+MSktKG5yZ0hpZ2g+PjEpKTsKKwkJCSB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnTG93TEQ2NDsKKyAgICAgIGlmKHZhbExENjQgPiBtYXhWYWxBYm92ZUxENjQpeworICAgICAgICBtYXhWYWxBYm92ZUxENjQgPSB2YWxMRDY0OworICAgICAgfQorICAgIH0KKwkJIGVsc2UgeworICAgICAgaWYobnJnSGlnaCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdIaWdoID4gbnJnTG93KXsKKwkJICAgICBucmdIaWdoTEQ2NCA9IENhbGNMZERhdGEobnJnSGlnaD4+MSk7CisJCSAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdIaWdoPj4xKS0obnJnTG93Pj4xKSk7CisJCQkgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnSGlnaExENjQ7CisgICAgICAgIGlmKHZhbExENjQgPiBtYXhWYWxBYm92ZUxENjQpeworICAgICAgICAgIG1heFZhbEFib3ZlTEQ2NCA9IHZhbExENjQ7CisgICAgICAgIH0KKyAgICAgIH0KKwkJIH0KKyAgfQorCisgIGlmKG1heFZhbExENjQgPiBtaFRocmVzaC5kZXJpdlRocmVzTWF4TEQ2NCAmJiBtYXhWYWxBYm92ZUxENjQgPCBtaFRocmVzaC5kZXJpdlRocmVzQWJvdmVMRDY0KXsKKyAgICBiTFBzaWduYWwgPSAxOworCisgICAgZm9yKGkgPSBtYXhEZXJpdlBvcyAtIDE7IGkgPiBtYXhEZXJpdlBvcyAtIDUgJiYgaSA+PSAwIDsgaS0tKXsKKyAgICAgIGlmKHBOcmdWZWN0b3JbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgcE5yZ1ZlY3RvcltpXSA+IHBOcmdWZWN0b3JbbWF4RGVyaXZQb3MgKyAyXSl7CisJCSAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChwTnJnVmVjdG9yW2ldPj4xKS0ocE5yZ1ZlY3RvclttYXhEZXJpdlBvcyArIDJdPj4xKSk7CisJCQkJIG5yZ0xENjQgPSBDYWxjTGREYXRhKHBOcmdWZWN0b3JbaV0+PjEpOworICAJCQkgdmFsTEQ2NCA9IG5yZ0RpZmZMRDY0LW5yZ0xENjQ7CisgICAgICAgIGlmKHZhbExENjQgPCBtaFRocmVzaC5kZXJpdlRocmVzQmVsb3dMRDY0KSB7CisgICAgICAgICAgYkxQc2lnbmFsID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZXsKKyAgICAgICAgYkxQc2lnbmFsID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoYkxQc2lnbmFsKXsKKyAgICBmb3IoaT0wO2k8blNmYjtpKyspeworICAgICAgaWYobWF4RGVyaXZQb3MgPj0gcEZyZXFCYW5kVGFibGVbaV0gJiYgbWF4RGVyaXZQb3MgPCBwRnJlcUJhbmRUYWJsZVtpKzFdKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZihwQWRkSGFybVNmYltpXSl7CisgICAgICBwQWRkSGFybVNmYltpXSA9IDA7CisgICAgICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3AgOyBlc3QrKyl7CisgICAgICAgIHBEZXRlY3Rpb25WZWN0b3JzW2VzdF1baV0gPSAwOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDaGVja3MgaWYgaXQgaXMgYWxsb3dlZCB0byBkZXRlY3QgYSBtaXNzaW5nIHRvbmUsIHRoYXQgd2Fzbid0CisgICAgICAgICAgICAgZGV0ZWN0ZWQgcHJldmlvdXNseS4KKworCisgIFxyZXR1cm4gICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCBmbGFnLgorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBpc0RldGVjdGlvbk9mTmV3VG9uZUFsbG93ZWQoY29uc3QgU0JSX0ZSQU1FX0lORk8gKnBGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBEZXRlY3Rpb25TdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHByZXZUcmFuc2llbnRGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcmV2VHJhbnNpZW50UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHByZXZUcmFuc2llbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudFBvc09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkZWx0YVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKQoreworICBJTlQgdHJhbnNpZW50RnJhbWUsIG5ld0RldGVjdGlvbkFsbG93ZWQ7CisKKworICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGZyYW1lIHdoZXJlIGEgdHJhbnNpZW50IHN0YXJ0cy4uLgorICAgKiBJZiB0aGUgdHJhbnNpZW50IGZsYWcgd2FzIHNldCB0aGUgcHJldmlvdXMgZnJhbWUgYnV0IG5vdCB0aGUKKyAgICogdHJhbnNpZW50IGZyYW1lIGZsYWcsIHRoZSB0cmFuc2llbnQgZnJhbWUgZmxhZyBpcyBzZXQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgdHJhbnNpZW50RnJhbWUgPSAwOworICBpZih0cmFuc2llbnRGbGFnKXsKKyAgICBpZih0cmFuc2llbnRQb3MgKyB0cmFuc2llbnRQb3NPZmZzZXQgPCBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPm5FbnZlbG9wZXNdKQorICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOworICAgICAgaWYobm9Fc3RQZXJGcmFtZSA+IDEpeworICAgICAgICBpZih0cmFuc2llbnRQb3MgKyB0cmFuc2llbnRQb3NPZmZzZXQgPiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+dGltZVNsb3RzID4+IDEpeworICAgICAgICAgICpwRGV0ZWN0aW9uU3RhcnRQb3MgPSBub0VzdFBlckZyYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IG5vRXN0UGVyRnJhbWUgPj4gMTsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgICBlbHNleworICAgICAgICAqcERldGVjdGlvblN0YXJ0UG9zID0gbm9Fc3RQZXJGcmFtZTsKKyAgICAgIH0KKyAgfQorICBlbHNleworICAgIGlmKHByZXZUcmFuc2llbnRGbGFnICYmICFwcmV2VHJhbnNpZW50RnJhbWUpeworICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOworICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IDA7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogRGV0ZXJtaW5lIGlmIGRldGVjdGlvbiBvZiBuZXcgbWlzc2luZyBoYXJtb25pY3MgYXJlIGFsbG93ZWQuCisgICAqIElmIHRoZSBmcmFtZSBjb250YWlucyBhIHRyYW5zaWVudCBpdCdzIG9rLiBJZiB0aGUgcHJldmlvdXMKKyAgICogZnJhbWUgY29udGFpbmVkIGEgdHJhbnNpZW50IGl0IG5lZWRzIHRvIGJlIHN1ZmZpY2llbnRseSBjbG9zZQorICAgKiB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBuZXdEZXRlY3Rpb25BbGxvd2VkID0gMDsKKyAgaWYodHJhbnNpZW50RnJhbWUpeworICAgIG5ld0RldGVjdGlvbkFsbG93ZWQgPSAxOworICB9CisgIGVsc2UgeworICAgIGlmKHByZXZUcmFuc2llbnRGcmFtZSAmJgorICAgICAgIGZpeHBfYWJzKHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gLSAocHJldlRyYW5zaWVudFBvcyArIHRyYW5zaWVudFBvc09mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnRpbWVTbG90cykpIDwgZGVsdGFUaW1lKQorICAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCA9IDE7CisgICAgICAqcERldGVjdGlvblN0YXJ0UG9zID0gMDsKKyAgfQorCisgIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2aW91c1RyYW5zaWVudEZsYWcgID0gdHJhbnNpZW50RmxhZzsKKyAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZpb3VzVHJhbnNpZW50RnJhbWUgPSB0cmFuc2llbnRGcmFtZTsKKyAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZpb3VzVHJhbnNpZW50UG9zICAgPSB0cmFuc2llbnRQb3M7CisKKyAgcmV0dXJuIChuZXdEZXRlY3Rpb25BbGxvd2VkKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDbGVhbnMgdXAgdGhlIGRldGVjdGlvbiBhZnRlciBhIHRyYW5zaWVudC4KKworCisgIFxyZXR1cm4gICAgbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRyYW5zaWVudENsZWFuVXAoRklYUF9EQkwgKipxdW90YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqZGV0ZWN0aW9uVmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcFByZXZBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKiogc2lnbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBGcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBOcmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVTX0hPTERTIG1oVGhyZXNoKQoreworICBJTlQgaSxqLGxpLCB1aSxlc3Q7CisKKyAgZm9yKGVzdD1zdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICBmb3IoaT0wOyBpPG5TZmI7IGkrKykgeworICAgICAgcEFkZEhhcm1TZmJbaV0gPSBwQWRkSGFybVNmYltpXSB8fCBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baV07CisgICAgfQorICB9CisKKyAgaWYobmV3RGV0ZWN0aW9uQWxsb3dlZCA9PSAxKXsKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBkdXBsaWNhdGlvbiBvZiBzaW5lcyBsb2NhdGVkCisgICAgICogb24gdGhlIGJvcmRlciBvZiB0d28gc2NmLWJhbmRzLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvcihpPTA7aTxuU2ZiLTE7aSsrKSB7CisgICAgICBsaSA9IHBGcmVxQmFuZFRhYmxlW2ldOworICAgICAgdWkgPSBwRnJlcUJhbmRUYWJsZVtpKzFdOworCisgICAgICAvKiBkZXRlY3Rpb24gaW4gYWRqYWNlbnQgY2hhbm5lbHMuKi8KKyAgICAgIGlmKHBBZGRIYXJtU2ZiW2ldICYmIHBBZGRIYXJtU2ZiW2krMV0pIHsKKyAgICAgICAgRklYUF9EQkwgbWF4VmFsMSwgbWF4VmFsMjsKKyAgICAgICAgSU5UIG1heFBvczEsIG1heFBvczIsIG1heFBvc1RpbWUxLCBtYXhQb3NUaW1lMjsKKworICAgICAgICBsaSA9IHBGcmVxQmFuZFRhYmxlW2ldOworICAgICAgICB1aSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisKKyAgICAgICAgLyogRmluZCBtYXhpbXVtIHRvbmFsaXR5IGluIHRoZSB0aGUgdHdvIHNjZiBiYW5kcy4qLworICAgICAgICBtYXhQb3NUaW1lMSA9IHN0YXJ0OworICAgICAgICBtYXhQb3MxID0gbGk7CisgICAgICAgIG1heFZhbDEgPSBxdW90YUJ1ZmZlcltzdGFydF1bbGldOworICAgICAgICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKXsKKyAgICAgICAgICBmb3IoaiA9IGxpOyBqPHVpOyBqKyspeworICAgICAgICAgICAgaWYocXVvdGFCdWZmZXJbZXN0XVtqXSA+IG1heFZhbDEpeworICAgICAgICAgICAgICBtYXhWYWwxID0gcXVvdGFCdWZmZXJbZXN0XVtqXTsKKyAgICAgICAgICAgICAgbWF4UG9zMSA9IGo7CisgICAgICAgICAgICAgIG1heFBvc1RpbWUxID0gZXN0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxpID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKKyAgICAgICAgdWkgPSBwRnJlcUJhbmRUYWJsZVtpKzJdOworCisgICAgICAgIC8qIEZpbmQgbWF4aW11bSB0b25hbGl0eSBpbiB0aGUgdGhlIHR3byBzY2YgYmFuZHMuKi8KKyAgICAgICAgbWF4UG9zVGltZTIgPSBzdGFydDsKKyAgICAgICAgbWF4UG9zMiA9IGxpOworICAgICAgICBtYXhWYWwyID0gcXVvdGFCdWZmZXJbc3RhcnRdW2xpXTsKKyAgICAgICAgZm9yKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKyl7CisgICAgICAgICAgZm9yKGogPSBsaTsgajx1aTsgaisrKXsKKyAgICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2VzdF1bal0gPiBtYXhWYWwyKXsKKyAgICAgICAgICAgICAgbWF4VmFsMiA9IHF1b3RhQnVmZmVyW2VzdF1bal07CisgICAgICAgICAgICAgIG1heFBvczIgPSBqOworICAgICAgICAgICAgICBtYXhQb3NUaW1lMiA9IGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUgbWF4aW11bSB2YWx1ZXMgYXJlIGluIGFkamFjZW50IFFNRi1jaGFubmVscywgd2UgbmVlZCB0byByZW1vdmUKKyAgICAgICAgICAgdGhlIGxvd2VzdCBvZiB0aGUgdHdvLiovCisgICAgICAgIGlmKG1heFBvczItbWF4UG9zMSA8IDIpeworCisgICAgICAgICAgaWYocFByZXZBZGRIYXJtU2ZiW2ldID09IDEgJiYgcFByZXZBZGRIYXJtU2ZiW2krMV0gPT0gMCl7CisgICAgICAgICAgICAvKiBLZWVwIHRoZSBsb3dlciwgcmVtb3ZlIHRoZSB1cHBlci4qLworICAgICAgICAgICAgcEFkZEhhcm1TZmJbaSsxXSA9IDA7CisgICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspeworICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSsxXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZihwUHJldkFkZEhhcm1TZmJbaV0gPT0gMCAmJiBwUHJldkFkZEhhcm1TZmJbaSsxXSA9PSAxKXsKKyAgICAgICAgICAgICAgLyogS2VlcCB0aGUgdXBwZXIsIHJlbW92ZSB0aGUgbG93ZXIuKi8KKyAgICAgICAgICAgICAgcEFkZEhhcm1TZmJbaV0gPSAwOworICAgICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspeworICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0XVtpXSA9IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgLyogSWYgdGhlIG1heGltdW0gdmFsdWVzIGFyZSBpbiBhZGphY2VudCBRTUYtY2hhbm5lbHMsIGFuZCBpZiB0aGUgc2lnbnMgaW5kaWNhdGUgdGhhdCBpdCBpcyB0aGUgc2FtZSBzaW5lLAorICAgICAgICAgICAgICAgIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb3dlc3Qgb2YgdGhlIHR3by4qLworICAgICAgICAgICAgICBpZihtYXhWYWwxID4gbWF4VmFsMil7CisgICAgICAgICAgICAgICAgaWYoc2lnbkJ1ZmZlclttYXhQb3NUaW1lMV1bbWF4UG9zMl0gPCAwICYmIHNpZ25CdWZmZXJbbWF4UG9zVGltZTFdW21heFBvczFdID4gMCl7CisgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBsb3dlciwgcmVtb3ZlIHRoZSB1cHBlci4qLworICAgICAgICAgICAgICAgICAgcEFkZEhhcm1TZmJbaSsxXSA9IDA7CisgICAgICAgICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspeworICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSsxXSA9IDA7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgaWYoc2lnbkJ1ZmZlclttYXhQb3NUaW1lMl1bbWF4UG9zMl0gPCAwICYmIHNpZ25CdWZmZXJbbWF4UG9zVGltZTJdW21heFBvczFdID4gMCl7CisgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSB1cHBlciwgcmVtb3ZlIHRoZSBsb3dlci4qLworICAgICAgICAgICAgICAgICAgcEFkZEhhcm1TZmJbaV0gPSAwOworICAgICAgICAgICAgICAgICAgZm9yKGVzdD1zdGFydDsgZXN0PHN0b3A7IGVzdCsrKXsKKyAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGV0ZWN0aW9uIGlzIG5vdCB0aGUgY3V0LW9mZiBvZiBhIGxvdyBwYXNzIGZpbHRlci4gKi8KKyAgICByZW1vdmVMb3dQYXNzRGV0ZWN0aW9uKHBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaFRocmVzaCk7CisgIH0KKyAgZWxzZSB7CisgICAvKgorICAgICogSWYgYSBtaXNzaW5nIGhhcm1vbmljIHdhc24ndCBtaXNzaW5nIHRoZSBwcmV2aW91cyBmcmFtZQorICAgICogdGhlIHRyYW5zaWVudC1mbGFnIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byBiZSBhbGxvd2VkIHRvIGRldGVjdCBpdC4KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvcihpPTA7aTxuU2ZiO2krKyl7CisgICAgICBpZihwQWRkSGFybVNmYltpXSAtIHBQcmV2QWRkSGFybVNmYltpXSA+IDApCisgICAgICAgIHBBZGRIYXJtU2ZiW2ldID0gMDsKKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBEbyBkZXRlY3Rpb24gZm9yIG9uZSB0b25hbGl0eSBlc3RpbWF0ZS4KKworCisgIFxyZXR1cm4gICAgbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRldGVjdGlvbihGSVhQX0RCTCAqcXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEaWZmVmVjU2NmYiwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEhhcm1WZWMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBGcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZm1PcmlnLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZm1TYnIsCisgICAgICAgICAgICAgICAgICAgICAgR1VJREVfVkVDVE9SUyBndWlkZVZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgR1VJREVfVkVDVE9SUyBuZXdHdWlkZVZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpCit7CisKKyAgSU5UIGksaixsbCwgbHU7CisgIEZJWFBfREJMIHRocmVzVGVtcCx0aHJlc09yaWc7CisKKyAgLyoKKyAgICogRG8gZGV0ZWN0aW9uIG9uIHRoZSBkaWZmZXJlbmNlIHZlY3RvciwgaS5lLiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAqIHRoZSBvcmlnaW5hbCBhbmQgdGhlIHRyYW5zcG9zZWQuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGZvcihpPTA7aTxuU2ZiO2krKyl7CisKKyAgICB0aHJlc1RlbXAgPSAoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgICAgICAgICAgID8gZml4TWF4KGZNdWx0KG1oVGhyZXNoLmRlY2F5R3VpZGVEaWZmLGd1aWRlVmVjdG9ycy5ndWlkZVZlY3RvckRpZmZbaV0pLCBtaFRocmVzaC50aHJlc0hvbGREaWZmR3VpZGUpCisgICAgICAgICAgICAgICAgICA6IG1oVGhyZXNoLnRocmVzSG9sZERpZmY7CisKKyAgICB0aHJlc1RlbXAgPSBmaXhNaW4odGhyZXNUZW1wLCBtaFRocmVzaC50aHJlc0hvbGREaWZmKTsKKworICAgIGlmKHBEaWZmVmVjU2NmYltpXSA+IHRocmVzVGVtcCl7CisgICAgICBwSGFybVZlY1tpXSA9IDE7CisgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldID0gcERpZmZWZWNTY2ZiW2ldOworICAgIH0KKyAgICBlbHNleworICAgICAgLyogSWYgdGhlIGd1aWRlIHdhc24ndCB6ZXJvLCBidXQgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgdG8gbG93LAorICAgICAgICAgc3RhcnQgdHJhY2tpbmcgdGhlIGRlY2F5IG9uIHRoZSB0b25lIGluIHRoZSBvcmlnaW5hbCByYXRoZXIKKyAgICAgICAgIHRoYW4gdGhlIGRpZmZlcmVuY2UuKi8KKyAgICAgIGlmKGd1aWRlVmVjdG9ycy5ndWlkZVZlY3RvckRpZmZbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgICBndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gbWhUaHJlc2gudGhyZXNIb2xkVG9uZUd1aWRlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qCisgICAqIFRyYWNlIHRvbmVzIGluIHRoZSBvcmlnaW5hbCBzaWduYWwgdGhhdCBhdCBvbmUgcG9pbnQKKyAgICogaGF2ZSBiZWVuIGRldGVjdGVkIGJlY2F1c2UgdGhleSB3aWxsIGJlIHJlcGxhY2VkIGJ5CisgICAqIG11bHRpcGxlIHRvbmVzIGluIHRoZSBzYnIgc2lnbmFsLgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBmb3IoaT0wO2k8blNmYjtpKyspeworICAgIGxsID0gcEZyZXFCYW5kVGFibGVbaV07CisgICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpKzFdOworCisgICAgdGhyZXNPcmlnID0gZml4TWF4KGZNdWx0KGd1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0sIG1oVGhyZXNoLmRlY2F5R3VpZGVPcmlnKSwgbWhUaHJlc2gudGhyZXNIb2xkVG9uZUd1aWRlKTsKKyAgICB0aHJlc09yaWcgPSBmaXhNaW4odGhyZXNPcmlnLCBtaFRocmVzaC50aHJlc0hvbGRUb25lKTsKKworICAgIGlmKGd1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgZm9yKGo9IGxsO2o8bHU7aisrKXsKKyAgICAgICAgaWYocXVvdGFCdWZmZXJbal0gPiB0aHJlc09yaWcpeworICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKKyAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbal07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgKiBDaGVjayBmb3IgbXVsdGlwbGUgc2luZXMgaW4gdGhlIHRyYW5zcG9zZWQgc2lnbmFsLAorICAgKiB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSBpbiB0aGUgb3JpZ2luYWwuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB0aHJlc09yaWcgPSBtaFRocmVzaC50aHJlc0hvbGRUb25lOworCisgIGZvcihpPTA7aTxuU2ZiO2krKyl7CisgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKKyAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisKKyAgICBpZihwSGFybVZlY1tpXSA9PSAwKXsKKyAgICAgIGlmKGx1IC1sbCA+IDEpeworICAgICAgICBmb3Ioaj0gbGw7ajxsdTtqKyspeworICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2pdID4gdGhyZXNPcmlnICYmIChzZm1TYnJbaV0gPiBtaFRocmVzaC5zZm1UaHJlc1NiciAmJiBzZm1PcmlnW2ldIDwgbWhUaHJlc2guc2ZtVGhyZXNPcmlnKSl7CisgICAgICAgICAgICBwSGFybVZlY1tpXSA9IDE7CisgICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbal07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNleworICAgICAgICBpZihpIDwgblNmYiAtMSl7CisgICAgICAgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKKworICAgICAgICAgIGlmKGk+MCl7CisgICAgICAgICAgICBpZihxdW90YUJ1ZmZlcltsbF0gPiBtaFRocmVzaC50aHJlc0hvbGRUb25lICYmIChwRGlmZlZlY1NjZmJbaSsxXSA8IG1oVGhyZXNoLmludlRocmVzSG9sZFRvbmUgfHwgcERpZmZWZWNTY2ZiW2ktMV0gPCBtaFRocmVzaC5pbnZUaHJlc0hvbGRUb25lKSl7CisgICAgICAgICAgICAgICAgcEhhcm1WZWNbaV0gPSAxOworICAgICAgICAgICAgICAgIG5ld0d1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gPSBxdW90YUJ1ZmZlcltsbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZihxdW90YUJ1ZmZlcltsbF0gPiBtaFRocmVzaC50aHJlc0hvbGRUb25lICYmIHBEaWZmVmVjU2NmYltpKzFdIDwgbWhUaHJlc2guaW52VGhyZXNIb2xkVG9uZSl7CisgICAgICAgICAgICAgICAgcEhhcm1WZWNbaV0gPSAxOworICAgICAgICAgICAgICAgIG5ld0d1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gPSBxdW90YUJ1ZmZlcltsbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRG8gZGV0ZWN0aW9uIGZvciBldmVyeSB0b25hbGl0eSBlc3RpbWF0ZSwgdXNpbmcgZm9yd2FyZCBwcmVkaWN0aW9uLgorCisKKyAgXHJldHVybiAgICBub25lLgorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGV0ZWN0aW9uV2l0aFByZWRpY3Rpb24oRklYUF9EQkwgKipxdW90YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcERpZmZWZWNTY2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBwRnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc2ZtT3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc2ZtU2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipkZXRlY3Rpb25WZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQcmV2QWRkSGFybVNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdVSURFX1ZFQ1RPUlMgKmd1aWRlVmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRldGVjdGlvblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBBZGRIYXJtRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQWRkSGFybVNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwTnJnVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSU19NSCAqbWhQYXJhbXMpCit7CisgIElOVCBlc3QgPSAwLGk7CisgIElOVCBzdGFydDsKKworICBGREttZW1jbGVhcihwQWRkSGFybVNmYixuU2ZiKnNpemVvZihVQ0hBUikpOworCisgIGlmKG5ld0RldGVjdGlvbkFsbG93ZWQpeworCisgICAgaWYodG90Tm9Fc3QgPiAxKXsKKyAgICAgIHN0YXJ0ID0gZGV0ZWN0aW9uU3RhcnQ7CisKKyAgICAgIGlmIChzdGFydCAhPSAwKSB7CisgICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yRGlmZixndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yT3JpZyxndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tzdGFydC0xXS5ndWlkZVZlY3RvckRldGVjdGVkLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICBzdGFydCA9IDA7CisgICAgfQorICB9CisgIGVsc2V7CisgICAgc3RhcnQgPSAwOworICB9CisKKworICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHRvdE5vRXN0OyBlc3QrKyl7CisKKyAgICAvKgorICAgICogRG8gZGV0ZWN0aW9uIG9uIHRoZSBjdXJyZW50IGZyYW1lIHVzaW5nCisgICAgKiBndWlkZS1pbmZvIGZyb20gdGhlIHByZXZpb3VzLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoZXN0ID4gMCl7CisgICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxkZXRlY3Rpb25WZWN0b3JzW2VzdC0xXSxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgIH0KKworICAgIEZES21lbWNsZWFyKGRldGVjdGlvblZlY3RvcnNbZXN0XSwgblNmYipzaXplb2YoVUNIQVIpKTsKKworICAgIGlmKGVzdCA8IHRvdE5vRXN0LTEpeworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdCsxXS5ndWlkZVZlY3RvckRpZmYsblNmYipzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3QrMV0uZ3VpZGVWZWN0b3JPcmlnLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0KzFdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsblNmYipzaXplb2YoVUNIQVIpKTsKKworICAgICAgZGV0ZWN0aW9uKHF1b3RhQnVmZmVyW2VzdF0sCisgICAgICAgICAgICAgICAgcERpZmZWZWNTY2ZiW2VzdF0sCisgICAgICAgICAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF0sCisgICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgc2ZtT3JpZ1tlc3RdLAorICAgICAgICAgICAgICAgIHNmbVNicltlc3RdLAorICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3RdLAorICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3QrMV0sCisgICAgICAgICAgICAgICAgbWhQYXJhbXMtPnRocmVzSG9sZHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEaWZmLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3Rvck9yaWcsblNmYipzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsblNmYipzaXplb2YoVUNIQVIpKTsKKworICAgICAgZGV0ZWN0aW9uKHF1b3RhQnVmZmVyW2VzdF0sCisgICAgICAgICAgICAgICAgcERpZmZWZWNTY2ZiW2VzdF0sCisgICAgICAgICAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF0sCisgICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgc2ZtT3JpZ1tlc3RdLAorICAgICAgICAgICAgICAgIHNmbVNicltlc3RdLAorICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3RdLAorICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3RdLAorICAgICAgICAgICAgICAgIG1oUGFyYW1zLT50aHJlc0hvbGRzKTsKKyAgICB9CisgIH0KKworCisgIC8qIENsZWFuIHVwIHRoZSBkZXRlY3Rpb24uKi8KKyAgdHJhbnNpZW50Q2xlYW5VcChxdW90YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBuU2ZiLAorICAgICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgcEFkZEhhcm1TZmIsCisgICAgICAgICAgICAgICAgICAgcFByZXZBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgIHNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgdG90Tm9Fc3QsCisgICAgICAgICAgICAgICAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCwKKyAgICAgICAgICAgICAgICAgICBwTnJnVmVjdG9yLAorICAgICAgICAgICAgICAgICAgIG1oUGFyYW1zLT50aHJlc0hvbGRzKTsKKworCisgIC8qIFNldCBmbGFnLi4uICovCisgICpwQWRkSGFybUZsYWcgPSAwOworICBmb3IoaT0wOyBpPG5TZmI7IGkrKyl7CisgICAgaWYocEFkZEhhcm1TZmJbaV0peworICAgICAgKnBBZGRIYXJtRmxhZyA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBGREttZW1jcHkocFByZXZBZGRIYXJtU2ZiLCBwQWRkSGFybVNmYiwgblNmYipzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkLHBBZGRIYXJtU2ZiLG5TZmIqc2l6ZW9mKElOVCkpOworCisgIGZvcihpPTA7IGk8blNmYiA7IGkrKyl7CisKKyAgICBndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgaWYocEFkZEhhcm1TZmJbaV0gPT0gMSl7CisgICAgICAvKiBJZiB3ZSBoYWQgYSBkZXRlY3Rpb24gdXNlIHRoZSBndWlkZS12YWx1ZSBpbiB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSBsYXN0IGVzdGltYXRlIHdlcmUgdGhlIGRldGVjdGlvbgorICAgICAgd2FzIGRvbmUuKi8KKyAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdCA8IHRvdE5vRXN0OyBlc3QrKyl7CisgICAgICAgIGlmKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpXSA9IGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZltpXTsKKyAgICAgICAgfQorICAgICAgICBpZihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3Rvck9yaWdbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPSBndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3Rvck9yaWdbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIENhbGN1bGF0ZXMgYSBjb21wZW5zYXRpb24gdmVjdG9yIGZvciB0aGUgZW5lcmd5IGRhdGEuCisKKyAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgY29tcGVuc2F0aW9uIHZlY3RvciBmb3IgdGhlIGVuZXJneSBkYXRhIChpLmUuCisgIGVudmVsb3BlIGRhdGEpIHRoYXQgaXMgY2FsY3VsYXRlZCBlbHNld2hlcmUuIFRoaXMgaXMgc2luY2UsIG9uZSBzaW5lIG9uCisgIHRoZSBib3JkZXIgb2YgdHdvIHNjYWxlZmFjdG9yIGJhbmRzLCB3aWxsIGJlIHJlcGxhY2UgYnkgb25lIHNpbmUgaW4gdGhlCisgIG1pZGRsZSBvZiBlaXRoZXIgc2NhbGVmYWN0b3IgYmFuZC4gSG93ZXZlciwgc2luY2UgdGhlIHNpbmUgdGhhdCBpcyByZXBsYWNlZAorICB3aWxsIGluZmx1ZW5jZSB0aGUgZW5lcmd5IGVzdGltYXRlIGluIGJvdGggc2NhbGVmYWN0b3IgYmFuZHMgKGluIHRoZSBlbnZlbG9wcworICBjYWxjdWxhdGlvbiBmdW5jdGlvbikgYSBjb21wZW5zYXRpb24gdmFsdWUgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYXZvaWQKKyAgbm9pc2Ugc3Vic3RpdHV0aW9uIGluIHRoZSBkZWNvZGVyIG5leHQgdG8gdGhlIHN5bnRoZXRpYyBzaW5lLgorCisgIFxyZXR1cm4gICAgbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvbXBWZWN0b3IoVUNIQVIgKnBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBUb25hbGl0eU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHBTaWduTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEVudkNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4Q29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQcmV2RW52Q29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQpCit7CisKKyAgSU5UIHNjZkJhbmQsZXN0LGwsbGwsbHUsbWF4UG9zRixtYXhQb3NUOworICBGSVhQX0RCTCBtYXhWYWw7CisgIElOVCBjb21wVmFsdWU7CisgIEZJWFBfREJMIHRtcDsKKworICBGREttZW1jbGVhcihwRW52Q29tcCxuU2ZiKnNpemVvZihVQ0hBUikpOworCisgIGZvcihzY2ZCYW5kPTA7IHNjZkJhbmQgPCBuU2ZiOyBzY2ZCYW5kKyspeworCisgICAgaWYocEFkZEhhcm1TZmJbc2NmQmFuZF0peyAvKiBBIG1pc3Npbmcgc2luZSB3YXMgZGV0ZWN0ZWQgKi8KKyAgICAgIGxsID0gZnJlcUJhbmRUYWJsZVtzY2ZCYW5kXTsKKyAgICAgIGx1ID0gZnJlcUJhbmRUYWJsZVtzY2ZCYW5kKzFdOworCisgICAgICBtYXhQb3NGID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBmaW5kIHRoZSBtYXhpbXVtKi8KKyAgICAgIG1heFBvc1QgPSAwOworICAgICAgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgIGZvcihlc3Q9MDtlc3Q8dG90Tm9Fc3Q7ZXN0KyspeworICAgICAgICBmb3IobD1sbDsgbDxsdTsgbCsrKXsKKyAgICAgICAgICBpZihwVG9uYWxpdHlNYXRyaXhbZXN0XVtsXSA+IG1heFZhbCl7CisgICAgICAgICAgICBtYXhWYWwgPSBwVG9uYWxpdHlNYXRyaXhbZXN0XVtsXTsKKyAgICAgICAgICAgIG1heFBvc0YgPSBsOworICAgICAgICAgICAgbWF4UG9zVCA9IGVzdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIElmIHRoZSBtYXhpbXVtIHRvbmFsaXR5IGlzIGF0IHRoZSBsb3dlciBib3JkZXIgb2YgdGhlCisgICAgICAgKiBzY2FsZWZhY3RvciBiYW5kLCB3ZSBjaGVjayB0aGUgc2lnbiBvZiB0aGUgYWRqYWNlbnQgY2hhbm5lbHMKKyAgICAgICAqIHRvIHNlZSBpZiB0aGlzIHNpbmUgaXMgc2hhcmVkIGJ5IHRoZSBsb3dlciBjaGFubmVsLiBJZiBzbywgdGhlCisgICAgICAgKiBlbmVyZ3kgb2YgdGhlIHNpbmdsZSBzaW5lIHdpbGwgYmUgcHJlc2VudCBpbiB0d28gc2NhbGVmYWN0b3IgYmFuZHMKKyAgICAgICAqIGluIHRoZSBTQlIgZGF0YSwgd2hpY2ggd2lsbCBjYXVzZSBwcm9ibGVtcyBpbiB0aGUgZGVjb2Rlciwgd2hlbiB3ZQorICAgICAgICogYWRkIGEgc2luZSB0byBqdXN0IG9uZSBvZiB0aGUgY2hhbm5lbHMuCisgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgaWYobWF4UG9zRiA9PSBsbCAmJiBzY2ZCYW5kKXsKKyAgICAgICAgaWYoIXBBZGRIYXJtU2ZiW3NjZkJhbmQgLSAxXSkgeyAgICAgLyogTm8gZGV0ZWN0aW9uIGJlbG93Ki8KKyAgICAgICAgICBpZiAocFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiAtIDFdID4gMCAmJiBwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGXSA8IDApIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb21wIHZhbHVlIGlzIGNhbHVsYXRlZCBhcyB0aGUgdG9uYWxsaXR5IHZhbHVlLCBpLmUgd2Ugd2FudCB0bworICAgICAgICAgICAgICAgcmVkdWNlIHRoZSBlbnZlbG9wZSBkYXRhIGZvciB0aGlzIGNoYW5uZWwgd2l0aCBhcyBtdWNoIGFzIHRoZSB0b25hbGl0eQorICAgICAgICAgICAgICAgdGhhdCBpcyBzcHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBhYm92ZS4gKGxkNjQoUkVMQVhBVElPTikgPSAwLjMxMTQzMDc1ODg5KSAqLworICAgICAgICAgICAgdG1wID0gZml4cF9hYnMoKEZJWFBfREJMKUNhbGNMZERhdGEocFRvbmFsaXR5TWF0cml4W21heFBvc1RdW21heFBvc0YgLSAxXSkgKyBSRUxBWEFUSU9OX0xENjQpOworICAgICAgICAgICAgdG1wID0gKHRtcCA+PiAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEpKSArIChGSVhQX0RCTCkxOyAgLyogc2hpZnQgb25lIGJpdCBsZXNzIGZvciByb3VuZGluZyAqLworICAgICAgICAgICAgY29tcFZhbHVlID0gKChJTlQpKExPTkcpdG1wKSA+PiAxOworCisJCQkJCQkgICAgICAvKiBsaW1pdCB0aGUgY29tcC12YWx1ZSovCisgICAgICAgICAgICBpZiAoY29tcFZhbHVlID4gbWF4Q29tcCkKKyAgICAgICAgICAgICAgY29tcFZhbHVlID0gbWF4Q29tcDsKKworICAgICAgICAgICAgcEVudkNvbXBbc2NmQmFuZC0xXSA9IGNvbXBWYWx1ZTsKKwkJCQkJICAgICB9CisJCQkJICAgIH0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3IgdGhlIHVwcGVyIGVuZCBvZiB0aGUgc2NhbGVmYWN0b3ItYmFuZC4KKyAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICBpZihtYXhQb3NGID09IGx1LTEgJiYgc2NmQmFuZCsxIDwgblNmYil7ICAgICAgICAvKiBVcHBlciBib3JkZXIqLworICAgICAgICBpZighcEFkZEhhcm1TZmJbc2NmQmFuZCArIDFdKSB7CisgICAgICAgICAgaWYgKHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0ZdID4gMCAmJiBwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGICsgMV0gPCAwKSB7CisgICAgICAgICAgICB0bXAgPSBmaXhwX2FicygoRklYUF9EQkwpQ2FsY0xkRGF0YShwVG9uYWxpdHlNYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiArIDFdKSArIFJFTEFYQVRJT05fTEQ2NCk7CisgICAgICAgICAgICB0bXAgPSAodG1wID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSkpICsgKEZJWFBfREJMKTE7ICAvKiBzaGlmdCBvbmUgYml0IGxlc3MgZm9yIHJvdW5kaW5nICovCisgICAgICAgICAgICBjb21wVmFsdWUgPSAoKElOVCkoTE9ORyl0bXApID4+IDE7CisKKyAgICAgICAgICAgIGlmIChjb21wVmFsdWUgPiBtYXhDb21wKQorICAgICAgICAgICAgICBjb21wVmFsdWUgPSBtYXhDb21wOworCisgICAgICAgICAgICBwRW52Q29tcFtzY2ZCYW5kKzFdID0gY29tcFZhbHVlOworCQkJCQkgfQorCQkJCSB9CisgICAgICB9CisJCSB9CisJIH0KKworICBpZihuZXdEZXRlY3Rpb25BbGxvd2VkID09IDApeworICAgIGZvcihzY2ZCYW5kPTA7c2NmQmFuZDxuU2ZiO3NjZkJhbmQrKyl7CisgICAgICBpZihwRW52Q29tcFtzY2ZCYW5kXSAhPSAwICYmIHBQcmV2RW52Q29tcFtzY2ZCYW5kXSA9PSAwKQorICAgICAgICBwRW52Q29tcFtzY2ZCYW5kXSA9IDA7CisgICAgfQorICB9CisKKyAgLyogcmVtZW1iZXIgdGhlIHZhbHVlIGZvciB0aGUgbmV4dCBmcmFtZS4qLworICBGREttZW1jcHkocFByZXZFbnZDb21wLHBFbnZDb21wLG5TZmIqc2l6ZW9mKFVDSEFSKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRGV0ZWN0cyB3aGVyZSBzdHJvbmcgdG9uYWwgY29tcG9uZW50cyB3aWxsIGJlIG1pc3NpbmcgYWZ0ZXIKKyAgICAgICAgICAgICBIRlIgaW4gdGhlIGRlY29kZXIuCisKKworICBccmV0dXJuICAgIG5vbmUuCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yUW1mKEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNSERldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHBTaWduQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBpbmRleFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogcFRyYW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogcEFkZEhhcm1vbmljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBlbnZlbG9wZUNvbXBlbnNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE5yZ1ZlY3RvcikKK3sKKyAgSU5UIHRyYW5zaWVudEZsYWcgPSBwVHJhbkluZm9bMV07CisgIElOVCB0cmFuc2llbnRQb3MgID0gcFRyYW5JbmZvWzBdOworICBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZDsKKyAgSU5UIHRyYW5zaWVudERldFN0YXJ0ID0gMDsKKworICBVQ0hBUiAqKiBkZXRlY3Rpb25WZWN0b3JzICA9IGhfc2JyTUhEZXQtPmRldGVjdGlvblZlY3RvcnM7CisgIElOVCBtb3ZlICAgICAgICAgICAgICAgID0gaF9zYnJNSERldC0+bW92ZTsKKyAgSU5UIG5vRXN0UGVyRnJhbWUgICAgICAgPSBoX3Nick1IRGV0LT5ub0VzdFBlckZyYW1lOworICBJTlQgdG90Tm9Fc3QgICAgICAgICAgICA9IGhfc2JyTUhEZXQtPnRvdE5vRXN0OworICBJTlQgcHJldlRyYW5zaWVudEZsYWcgICA9IGhfc2JyTUhEZXQtPnByZXZpb3VzVHJhbnNpZW50RmxhZzsKKyAgSU5UIHByZXZUcmFuc2llbnRGcmFtZSAgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudEZyYW1lOworICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0ICA9IGhfc2JyTUhEZXQtPnRyYW5zaWVudFBvc09mZnNldDsKKyAgSU5UIHByZXZUcmFuc2llbnRQb3MgICAgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudFBvczsKKyAgR1VJREVfVkVDVE9SUyogZ3VpZGVWZWN0b3JzID0gaF9zYnJNSERldC0+Z3VpZGVWZWN0b3JzOworICBJTlQgZGVsdGFUaW1lID0gaF9zYnJNSERldC0+bWhQYXJhbXMtPmRlbHRhVGltZTsKKyAgSU5UIG1heENvbXAgPSBoX3Nick1IRGV0LT5taFBhcmFtcy0+bWF4Q29tcDsKKworICBpbnQgZXN0OworCisgIC8qCisgIEJ1ZmZlciB2YWx1ZXMuCisgICovCisgIEZES19BU1NFUlQobW92ZTw9KE1BWF9OT19PRl9FU1RJTUFURVM+PjEpKTsKKyAgRkRLX0FTU0VSVChub0VzdFBlckZyYW1lPD0oTUFYX05PX09GX0VTVElNQVRFUz4+MSkpOworCisgIEZJWFBfREJMICpzZm1TYnJbTUFYX05PX09GX0VTVElNQVRFU107CisgIEZJWFBfREJMICpzZm1PcmlnW01BWF9OT19PRl9FU1RJTUFURVNdOworICBGSVhQX0RCTCAqdG9uYWxpdHlEaWZmW01BWF9OT19PRl9FU1RJTUFURVNdOworCisgIGZvciAoZXN0PTA7IGVzdCA8IE1BWF9OT19PRl9FU1RJTUFURVMvMjsgZXN0KyspIHsKKyAgICBzZm1TYnJbZXN0XSAgICAgICA9IGhfc2JyTUhEZXQtPnNmbVNicltlc3RdOworICAgIHNmbU9yaWdbZXN0XSAgICAgID0gaF9zYnJNSERldC0+c2ZtT3JpZ1tlc3RdOworICAgIHRvbmFsaXR5RGlmZltlc3RdID0gaF9zYnJNSERldC0+dG9uYWxpdHlEaWZmW2VzdF07CisgIH0KKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc2NyYXRjaF9tZW0sIEZJWFBfREJMLCAoMypNQVhfTk9fT0ZfRVNUSU1BVEVTLzIqTUFYX0ZSRVFfQ09FRkZTKSk7CisgIEZJWFBfREJMICpzY3JhdGNoID0gc2NyYXRjaF9tZW07CisgIGZvciAoOyBlc3QgPCBNQVhfTk9fT0ZfRVNUSU1BVEVTOyBlc3QrKykgeworICAgIHNmbVNicltlc3RdICAgICAgID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOworICAgIHNmbU9yaWdbZXN0XSAgICAgID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOworICAgIHRvbmFsaXR5RGlmZltlc3RdID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOworICB9CisKKworCisgIC8qIERldGVybWluZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGRldGVjdCAibWlzc2luZyBoYXJtb25pY3MiIHRoYXQgd2Fzbid0IGRldGVjdGVkIGJlZm9yZS4KKyAgICAgSW4gb3JkZXIgdG8gYmUgYWxsb3dlZCB0byBkbyBuZXcgZGV0ZWN0aW9uLCB0aGVyZSBtdXN0IGJlIGEgdHJhbnNpZW50IGluIHRoZSBjdXJyZW50CisgICAgIGZyYW1lLCBvciBhIHRyYW5zaWVudCBpbiB0aGUgcHJldmlvdXMgZnJhbWUgc3VmZmljaWVudGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICBuZXdEZXRlY3Rpb25BbGxvd2VkID0gaXNEZXRlY3Rpb25PZk5ld1RvbmVBbGxvd2VkKHBGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zaWVudERldFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRXN0UGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zaWVudEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUcmFuc2llbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zaWVudEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50UG9zT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0KTsKKworICAvKiBDYWx1bGF0ZSB0aGUgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSB1c2VkIHN1YnNlcXVlbnRseSBmb3IgdGhlIGFjdHVhbCBkZXRlY3Rpb24gKi8KKyAgY2FsY3VsYXRlRGV0ZWN0b3JJbnB1dChwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9uYWxpdHlEaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNmbU9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2ZtU2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUpOworCisgIC8qIERvIHRoZSBhY3R1YWwgZGV0ZWN0aW9uIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgZGV0ZWN0aW9ucyAqLworICBkZXRlY3Rpb25XaXRoUHJlZGljdGlvbihwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmFsaXR5RGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbU9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbVNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNSERldC0+Z3VpZGVTY2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRXN0UGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudERldFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b3ROb0VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEhhcm1vbmljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJnVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0LT5taFBhcmFtcyk7CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBjb21wIHZlY3Rvciwgc28gdGhhdCB0aGUgZW5lcmd5IGNhbiBiZQorICAgICBjb21wZW5zYXRlZCBmb3IgYSBzaW5lIGJldHdlZW4gdHdvIFFNRi1iYW5kcy4gKi8KKyAgY2FsY3VsYXRlQ29tcFZlY3RvcihwQWRkSGFybW9uaWNzU2NhbGVGYWN0b3JCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgcFNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVDb21wZW5zYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgICAgIG1heENvbXAsCisgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNSERldC0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGVjdGlvbkFsbG93ZWQpOworCisgIGZvciAoZXN0PTA7IGVzdCA8IG1vdmU7IGVzdCsrKSB7CisgICAgRkRLbWVtY3B5KHRvbmFsaXR5RGlmZltlc3RdLCB0b25hbGl0eURpZmZbZXN0ICsgbm9Fc3RQZXJGcmFtZV0sIHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jcHkoc2ZtT3JpZ1tlc3RdLCBzZm1PcmlnW2VzdCArIG5vRXN0UGVyRnJhbWVdLCBzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY3B5KHNmbVNicltlc3RdLCBzZm1TYnJbZXN0ICsgbm9Fc3RQZXJGcmFtZV0sIHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgfQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHNjcmF0Y2gsIEZJWFBfREJMLCAoMypNQVhfTk9fT0ZfRVNUSU1BVEVTLzIqTUFYX0ZSRVFfQ09FRkZTKSk7CisKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBJbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rvci4KKworCisgIFxyZXR1cm4gICAgZXJyb3JDb2RlLCBub0Vycm9yIGlmIE9LLgorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UCitGREtzYnJFbmNfQ3JlYXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFuKQoreworICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhzID0gaFNick1IRGV0OworICBJTlQgaTsKKworICBVQ0hBUiogZGV0ZWN0aW9uVmVjdG9ycyAgICA9IEdldFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycyhjaGFuKTsKKyAgVUNIQVIqIGd1aWRlVmVjdG9yRGV0ZWN0ZWQgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQoY2hhbik7CisgIEZJWFBfREJMKiBndWlkZVZlY3RvckRpZmYgID0gR2V0UmFtX1Nicl9ndWlkZVZlY3RvckRpZmYoY2hhbik7CisgIEZJWFBfREJMKiBndWlkZVZlY3Rvck9yaWcgID0gR2V0UmFtX1Nicl9ndWlkZVZlY3Rvck9yaWcoY2hhbik7CisKKyAgRkRLbWVtY2xlYXIgKGhzLHNpemVvZihTQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IpKTsKKworICBocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uID0gR2V0UmFtX1Nicl9wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24oY2hhbik7CisgIGhzLT5ndWlkZVNjZmIgICAgICAgICAgICAgICAgPSBHZXRSYW1fU2JyX2d1aWRlU2NmYihjaGFuKTsKKworICBmb3IoaT0wOyBpPE1BWF9OT19PRl9FU1RJTUFURVM7IGkrKykgeworICAgIGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmID0gZ3VpZGVWZWN0b3JEaWZmICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yT3JpZyA9IGd1aWRlVmVjdG9yT3JpZyArIChpKk1BWF9GUkVRX0NPRUZGUyk7CisgICAgaHMtPmRldGVjdGlvblZlY3RvcnNbaV0gPSBkZXRlY3Rpb25WZWN0b3JzICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGV0ZWN0ZWQgPSBndWlkZVZlY3RvckRldGVjdGVkICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIEluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdG9yLgorCisKKyAgXHJldHVybiAgICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgT0suCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19Jbml0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHFtZk5vQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0b3ROb0VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhzID0gaFNick1IRGV0OworICBpbnQgaTsKKworICBGREtfQVNTRVJUKHRvdE5vRXN0IDw9IE1BWF9OT19PRl9FU1RJTUFURVMpOworCisgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQorICB7CisgICAgc3dpdGNoKGZyYW1lU2l6ZSl7CisgICAgY2FzZSAxMDI0OgorICAgIGNhc2UgNTEyOgorICAgICAgICBocy0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CisgICAgICAgIGhzLT50aW1lU2xvdHMgICAgICAgICAgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjA6CisgICAgY2FzZSA0ODA6CisgICAgICAgIGhzLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKKyAgICAgICAgaHMtPnRpbWVTbG90cyAgICAgICAgICA9IDE1OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9IGVsc2UKKyAgeworICAgIHN3aXRjaChmcmFtZVNpemUpeworICAgIGNhc2UgMjA0ODoKKyAgICBjYXNlIDEwMjQ6CisgICAgICAgIGhzLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OworICAgICAgICBocy0+dGltZVNsb3RzICAgICAgICAgID0gTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwOgorICAgIGNhc2UgOTYwOgorICAgICAgICBocy0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfMTkyMDsKKyAgICAgICAgaHMtPnRpbWVTbG90cyAgICAgICAgICA9IE5VTUJFUl9USU1FX1NMT1RTXzE5MjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIGhzLT5taFBhcmFtcyA9ICZwYXJhbXNBYWNMZDsKKyAgfSBlbHNlCisgIGhzLT5taFBhcmFtcyA9ICZwYXJhbXNBYWM7CisKKyAgaHMtPnFtZk5vQ2hhbm5lbHMgPSBxbWZOb0NoYW5uZWxzOworICBocy0+c2FtcGxlRnJlcSA9IHNhbXBsZUZyZXE7CisgIGhzLT5uU2ZiID0gblNmYjsKKworICBocy0+dG90Tm9Fc3QgPSB0b3ROb0VzdDsKKyAgaHMtPm1vdmUgPSBtb3ZlOworICBocy0+bm9Fc3RQZXJGcmFtZSA9IG5vRXN0UGVyRnJhbWU7CisKKyAgZm9yKGk9MDsgaTx0b3ROb0VzdDsgaSsrKSB7CisgICAgRkRLbWVtY2xlYXIgKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jbGVhciAoaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3Rvck9yaWcsc2l6ZW9mKEZJWFBfREJMKSpNQVhfRlJFUV9DT0VGRlMpOworICAgIEZES21lbWNsZWFyIChocy0+ZGV0ZWN0aW9uVmVjdG9yc1tpXSxzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIgKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisgIH0KKworICAvL2ZvcihpPTA7IGk8dG90Tm9Fc3QvMjsgaSsrKSB7CisgIGZvcihpPTA7IGk8TUFYX05PX09GX0VTVElNQVRFUy8yOyBpKyspIHsKKyAgICBGREttZW1jbGVhciAoaHMtPnRvbmFsaXR5RGlmZltpXSxzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIgKGhzLT5zZm1PcmlnW2ldLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jbGVhciAoaHMtPnNmbVNicltpXSxzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7CisgIH0KKworICBGREttZW1jbGVhciAoIGhzLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIHNpemVvZihVQ0hBUikqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgRkRLbWVtY2xlYXIgKCBocy0+Z3VpZGVTY2ZiLCBzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisKKyAgaHMtPnByZXZpb3VzVHJhbnNpZW50RmxhZyA9IDA7CisgIGhzLT5wcmV2aW91c1RyYW5zaWVudEZyYW1lID0gMDsKKyAgaHMtPnByZXZpb3VzVHJhbnNpZW50UG9zID0gMDsKKworICByZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBEZWxldGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rvci4KKworCisgIFxyZXR1cm4gICAgbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQpCit7CisgIGlmIChoU2JyTUhEZXQpIHsKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhzID0gaFNick1IRGV0OworCisgICAgRnJlZVJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycygmaHMtPmRldGVjdGlvblZlY3RvcnNbMF0pOworICAgIEZyZWVSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQoJmhzLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCk7CisgICAgRnJlZVJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmKCZocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZik7CisgICAgRnJlZVJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnKCZocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZyk7CisgICAgRnJlZVJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKCZocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKTsKKyAgICBGcmVlUmFtX1Nicl9ndWlkZVNjZmIoJmhzLT5ndWlkZVNjZmIpOworCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgUmVzZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rvci4KKworCisgIFxyZXR1cm4gICAgZXJyb3IgY29kZSwgbm9FcnJvciBpZiBPSy4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yIChIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIpCit7CisgIGludCBpOworICBGSVhQX0RCTCB0ZW1wR3VpZGVbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgVUNIQVIgdGVtcEd1aWRlSW50W01BWF9GUkVRX0NPRUZGU107CisgIElOVCBuU2ZiUHJldjsKKworICBuU2ZiUHJldiA9IGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPm5TZmI7CisgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPm5TZmIgPSBuU2ZiOworCisgIEZES21lbWNweSggdGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmIsIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSApOworCisgIGlmICggblNmYiA+IG5TZmJQcmV2ICkgeworICAgIGZvciAoIGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpXSA9IDA7CisgICAgfQorCisgICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVTY2ZiW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVTY2ZiW2ldID0gdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYtblNmYildOworICAgIH0KKyAgfQorCisgIEZES21lbWNweSAoIHRlbXBHdWlkZSwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZiwgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpICk7CisKKyAgaWYgKG5TZmIgPiBuU2ZiUHJldiApIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKysgKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfQorCisgICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlW2ldOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmI7IGkrKyAgKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0gdGVtcEd1aWRlW2kgKyAoblNmYlByZXYtblNmYildOworICAgIH0KKyAgfQorCisgIEZES21lbWNweSAoIHRlbXBHdWlkZSwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZywgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpICk7CisKKyAgaWYgKCBuU2ZiID4gblNmYlByZXYgKSB7CisgICAgZm9yICggaSA9IDA7IGk8IChuU2ZiIC0gblNmYlByZXYpOyBpKysgKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfQorCisgICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlW2ldOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmI7IGkrKyApIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPSB0ZW1wR3VpZGVbaSArIChuU2ZiUHJldi1uU2ZiKV07CisgICAgfQorICB9CisKKyAgRkRLbWVtY3B5ICggdGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwgblNmYlByZXYgKiBzaXplb2YoVUNIQVIpICk7CisKKyAgaWYgKCBuU2ZiID4gblNmYlByZXYgKSB7CisgICAgZm9yICggaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaV0gPSAwOworICAgIH0KKworICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKyApIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaV0gPSB0ZW1wR3VpZGVJbnRbaSArIChuU2ZiUHJldi1uU2ZiKV07CisgICAgfQorICB9CisKKyAgRkRLbWVtY3B5ICggdGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSApOworCisgIGlmICggblNmYiA+IG5TZmJQcmV2ICkgeworICAgIGZvciAoIGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbltpXSA9IDA7CisgICAgfQorCisgICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2ldID0gdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYtblNmYildOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9taF9kZXQuaCBiL2FhYy9saWJTQlJlbmMvc3JjL21oX2RldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzJhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9taF9kZXQuaApAQCAtMCwwICsxLDE5NiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdGlvbiBoZWFkZXIgZmlsZSAgCisqLworCisjaWZuZGVmIF9fTUhfREVURUNUX0gKKyNkZWZpbmUgX19NSF9ERVRFQ1RfSAorCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKyNpbmNsdWRlICJmcmFtX2dlbi5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBGSVhQX0RCTCB0aHJlc0hvbGREaWZmOyAgICAgIC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBkaWZmZXJlbmNlICovCisgIEZJWFBfREJMIHRocmVzSG9sZERpZmZHdWlkZTsgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGRpZmZlcmVuY2UgZm9yIHRoZSBndWlkZSAqLworICBGSVhQX0RCTCB0aHJlc0hvbGRUb25lOyAgICAgIC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBmb3IgYSBzaW5lICovCisgIEZJWFBfREJMIGludlRocmVzSG9sZFRvbmU7CisgIEZJWFBfREJMIHRocmVzSG9sZFRvbmVHdWlkZTsgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGZvciBhIHNpbmUgZm9yIHRoZSBndWlkZSAqLworICBGSVhQX0RCTCBzZm1UaHJlc1NicjsgICAgICAgIC8qITwgdG9uYWxpdHkgZmxhdG5lc3MgbWVhc3VyZSB0aHJlc2hvbGQgZm9yIHRoZSBTQlIgc2lnbmFsLiovCisgIEZJWFBfREJMIHNmbVRocmVzT3JpZzsgICAgICAgLyohPCB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIHRocmVzaG9sZCBmb3IgdGhlIG9yaWdpbmFsIHNpZ25hbC4qLworICBGSVhQX0RCTCBkZWNheUd1aWRlT3JpZzsgICAgIC8qITwgZGVjYXkgdmFsdWUgb2YgdGhlIHRvbmFsaXR5IHZhbHVlIG9mIHRoZSBndWlkZSBmb3IgdGhlIHRvbmUuICovCisgIEZJWFBfREJMIGRlY2F5R3VpZGVEaWZmOyAgICAgLyohPCBkZWNheSB2YWx1ZSBvZiB0aGUgdG9uYWxpdHkgdmFsdWUgb2YgdGhlIGd1aWRlIGZvciB0aGUgdG9uYWxpdHkgZGlmZmVyZW5jZS4gKi8KKyAgRklYUF9EQkwgZGVyaXZUaHJlc01heExENjQ7ICAgICAgLyohPCB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBMUCBjaGFyYWN0ZXIgaW4gYSBzaWduYWwuICovCisgIEZJWFBfREJMIGRlcml2VGhyZXNCZWxvd0xENjQ7ICAgIC8qITwgdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgTFAgY2hhcmFjdGVyIGluIGEgc2lnbmFsLiAqLworICBGSVhQX0RCTCBkZXJpdlRocmVzQWJvdmVMRDY0OyAgICAvKiE8IHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIExQIGNoYXJhY3RlciBpbiBhIHNpZ25hbC4gKi8KK31USFJFU19IT0xEUzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIGRlbHRhVGltZTsgICAgICAgICAgICAvKiE8IG1heGltdW0gYWxsb3dlZCB0cmFuc2llbnQgZGlzdGFuY2UgKGZyb20gZnJhbWUgYm9yZGVyIGluIG51bWJlciBvZiBxbWYgc3ViYmFuZCBzYW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBmcmFtZSB0byBiZSBjb25zaWRlcmVkIGEgdHJhbnNpZW50IGZyYW1lLiovCisgIFRIUkVTX0hPTERTIHRocmVzSG9sZHM7ICAgLyohPCB0aGUgdGhyZXNob2xkcyB1c2VkIGZvciBkZXRlY3Rpb24uICovCisgIElOVCBtYXhDb21wOyAgICAgICAgICAgICAgLyohPCBtYXhpbXVtIGFsbGxvd2VkIGNvbXBlbnNhdGlvbiBmYWN0b3IgZm9yIHRoZSBlbnZlbG9wZSBkYXRhLiAqLworfURFVEVDVE9SX1BBUkFNRVRFUlNfTUg7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMICpndWlkZVZlY3RvckRpZmY7CisgIEZJWFBfREJMICpndWlkZVZlY3Rvck9yaWc7CisgIFVDSEFSKiBndWlkZVZlY3RvckRldGVjdGVkOworfUdVSURFX1ZFQ1RPUlM7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIHFtZk5vQ2hhbm5lbHM7CisgIElOVCBuU2ZiOworICBJTlQgc2FtcGxlRnJlcTsKKyAgSU5UIHByZXZpb3VzVHJhbnNpZW50RmxhZzsKKyAgSU5UIHByZXZpb3VzVHJhbnNpZW50RnJhbWU7CisgIElOVCBwcmV2aW91c1RyYW5zaWVudFBvczsKKworICBJTlQgbm9WZWNQZXJGcmFtZTsKKyAgSU5UIHRyYW5zaWVudFBvc09mZnNldDsKKworICBJTlQgbW92ZTsKKyAgSU5UIHRvdE5vRXN0OworICBJTlQgbm9Fc3RQZXJGcmFtZTsKKyAgSU5UIHRpbWVTbG90czsKKworICBVQ0hBUiAqZ3VpZGVTY2ZiOworICBVQ0hBUiAqcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uOworICBVQ0hBUiAqZGV0ZWN0aW9uVmVjdG9yc1tNQVhfTk9fT0ZfRVNUSU1BVEVTXTsKKyAgRklYUF9EQkwgdG9uYWxpdHlEaWZmW01BWF9OT19PRl9FU1RJTUFURVMvMl1bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgc2ZtT3JpZ1tNQVhfTk9fT0ZfRVNUSU1BVEVTLzJdW01BWF9GUkVRX0NPRUZGU107CisgIEZJWFBfREJMIHNmbVNicltNQVhfTk9fT0ZfRVNUSU1BVEVTLzJdW01BWF9GUkVRX0NPRUZGU107CisgIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggKm1oUGFyYW1zOworICBHVUlERV9WRUNUT1JTIGd1aWRlVmVjdG9yc1tNQVhfTk9fT0ZfRVNUSU1BVEVTXTsKK30KK1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUjsKKwordHlwZWRlZiBTQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgKkhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1I7CisKK3ZvaWQKK0ZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBwUXVvdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHBTaWduQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICppbmRleFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogcFRyYW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogcEFkZEhhcm1vbmljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICogZW52ZWxvcGVDb21wZW5zYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBOcmdWZWN0b3IpOworCitJTlQKK0ZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW4pOworCitJTlQKK0ZES3NickVuY19Jbml0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZUZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcW1mTm9DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG90Tm9Fc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vRXN0UGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CisKK3ZvaWQKK0ZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpOworCisKK0lOVAorRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yIChIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwIGIvYWFjL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTNjMDIyCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcApAQCAtMCwwICsxLDU4MyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJuZl9lc3QuaCIKKworI2luY2x1ZGUgInNicl9taXNjLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisvKiBzbW9vdGhGaWx0ZXJbNF0gID0gezAuMDU4NTc4NjQzNzYyNjlmLCAwLjJmLCAwLjM0MTQyMTM1NjIzNzMxZiwgMC40Zn07ICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgc21vb3RoRmlsdGVyWzRdICA9IHsgMHgwNzdmODEzZCwgMHgxOTk5OTk5NSwgMHgyYmIzYjFmNSwgMHgzMzMzMzMzNSB9OworCisvKiBzdGF0aWMgY29uc3QgSU5UIHNtb290aEZpbHRlckxlbmd0aCA9IDQ7ICovCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBRdWFudE9mZnNldCA9IChJTlQpMHhmYzAwMDAwMDsgIC8qIGxkNjQoMC4yNSkgKi8KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGE6YikKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYTpiKQorI2VuZGlmCisKKyNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcgICg0KQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgVGhlIGZ1bmN0aW9uIGFwcGxpZXMgc21vb3RoaW5nIHRvIHRoZSBub2lzZSBsZXZlbHMuCisKKworCisgIFxyZXR1cm4gICAgbm9uZQorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3Ntb290aGluZ09mTm9pc2VMZXZlbHMoRklYUF9EQkwgKk5vaXNlTGV2ZWxzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIG5vaXNlLWZsb29yIGxldmVscy4qLworICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkVudmVsb3BlcywgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBmbG9vciBlbnZlbG9wZXMuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vTm9pc2VCYW5kcywgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgZm9yIGV2ZXJ5IG5vaXNlIGZsb29yIGVudmVsb3BlLiAqLworICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwcmV2Tm9pc2VMZXZlbHNbTkZfU01PT1RISU5HX0xFTkdUSF1bTUFYX05VTV9OT0lTRV9WQUxVRVNdLC8qITwgUHJldmlvdXMgbm9pc2UgZmxvb3IgZW52ZWxvcGVzLiAqLworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqc21vb3RoRmlsdGVyLCAvKiE8IGZpbHRlciB1c2VkIGZvciBzbW9vdGhpbmcgdGhlIG5vaXNlIGZsb29yIGxldmVscy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcpICAgICAgICAgICAgLyohPCBmbGFnIGluZGljYXRpbmcgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudCovCisKK3sKKyAgSU5UIGksYmFuZCxlbnY7CisgIEZJWFBfREJMIGFjY3U7CisKKyAgZm9yKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKXsKKyAgICBpZih0cmFuc2llbnRGbGFnKXsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspeworICAgICAgICBGREttZW1jcHkocHJldk5vaXNlTGV2ZWxzW2ldLE5vaXNlTGV2ZWxzK2Vudipub05vaXNlQmFuZHMsbm9Ob2lzZUJhbmRzKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspeworICAgICAgICBGREttZW1jcHkocHJldk5vaXNlTGV2ZWxzW2kgLSAxXSxwcmV2Tm9pc2VMZXZlbHNbaV0sbm9Ob2lzZUJhbmRzKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorICAgICAgRkRLbWVtY3B5KHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIIC0gMV0sTm9pc2VMZXZlbHMrZW52Km5vTm9pc2VCYW5kcyxub05vaXNlQmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorCisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5vTm9pc2VCYW5kczsgYmFuZCsrKXsKKyAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspeworICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihzbW9vdGhGaWx0ZXJbaV0sIHByZXZOb2lzZUxldmVsc1tpXVtiYW5kXSk7CisgICAgICB9CisgICAgICBGREtfQVNTRVJUKCAoYmFuZCArIGVudipub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOworICAgICAgTm9pc2VMZXZlbHNbYmFuZCsgZW52Km5vTm9pc2VCYW5kc10gPSBhY2N1PDwxOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBEb2VzIHRoZSBub2lzZSBmbG9vciBsZXZlbCBlc3RpYW10aW9uLgorCisgIFRoZSBub2lzZUxldmVsIHNhbXBsZXMgYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yIDAuMjUKKworICBccmV0dXJuICAgIG5vbmUKKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitxbWZCYXNlZE5vaXNlRmxvb3JEZXRlY3Rpb24oRklYUF9EQkwgKm5vaXNlTGV2ZWwsICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIHRvIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMgaW4uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBxdW90YU1hdHJpeE9yaWcsICAgICAgIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BJbmRleCwgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgaW5kZXguICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0Q2hhbm5lbCwgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQgbm9pc2UgZmxvb3IgYmFuZC4qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wQ2hhbm5lbCwgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQgbm9pc2UgZmxvb3IgYmFuZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBhbmFfbWF4X2xldmVsLCAgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtaXNzaW5nSGFybW9uaWNGbGFnLCAgICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYSBzdHJvbmcgdG9uYWwgY29tcG9uZW50IGlzIG1pc3NpbmcuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB3ZWlnaHRGYWMsICAgICAgICAgICAgICAgIC8qITwgV2VpZ2h0ZW5pbmcgZmFjdG9yIGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWcgYW5kIHNici4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgZGlmZlRocmVzLCAgICAgICAgICAgICAgIC8qITwgVGhyZXNob2xkIHZhbHVlIHRvIGNvbnRyb2wgdGhlIGludmVyc2UgZmlsdGVyaW5nIGRlY2lzaW9uLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFIGludmVyc2VGaWx0ZXJpbmdMZXZlbCkgICAvKiE8IEludmVyc2UgZmlsdGVyaW5nIGxldmVsIG9mIHRoZSBjdXJyZW50IGJhbmQuKi8KK3sKKyAgSU5UIHNjYWxlLCBsLCBrOworICBGSVhQX0RCTCBtZWFuT3JpZz1GTDJGWENPTlNUX0RCTCgwLjBmKSwgbWVhblNicj1GTDJGWENPTlNUX0RCTCgwLjBmKSwgZGlmZjsKKyAgRklYUF9EQkwgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4LXN0YXJ0SW5kZXgpOworICBGSVhQX0RCTCBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7CisgIEZJWFBfREJMIGFjY3U7CisKKyAgIC8qCisgICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUsIG92ZXIgdGhlIGN1cnJlbnQgdGltZSBzZWdtZW50LCBmb3IgdGhlIG9yaWdpbmFsLCB0aGUgSEZSCisgICBhbmQgdGhlIGRpZmZlcmVuY2UsIG92ZXIgYWxsIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZS4KKyAgICovCisKKyAgaWYobWlzc2luZ0hhcm1vbmljRmxhZyA9PSAxKXsKKyAgICBmb3IobCA9IHN0YXJ0Q2hhbm5lbDsgbCA8IHN0b3BDaGFubmVsO2wrKyl7CisgICAgICAvKiB0b25hbGl0eU9yaWcgKi8KKyAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvcihrID0gc3RhcnRJbmRleCA7IGsgPCBzdG9wSW5kZXg7IGsrKyl7CisgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHF1b3RhTWF0cml4T3JpZ1trXVtsXSwgaW52SW5kZXgpOworICAgICAgfQorICAgICAgbWVhbk9yaWcgPSBmaXhNYXgobWVhbk9yaWcsKGFjY3U8PDEpKTsKKworICAgICAgLyogdG9uYWxpdHlTYnIgKi8KKyAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvcihrID0gc3RhcnRJbmRleCA7IGsgPCBzdG9wSW5kZXg7IGsrKyl7CisgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHF1b3RhTWF0cml4T3JpZ1trXVtpbmRleFZlY3RvcltsXV0sIGludkluZGV4KTsKKyAgICAgIH0KKyAgICAgIG1lYW5TYnIgID0gZml4TWF4KG1lYW5TYnIsKGFjY3U8PDEpKTsKKworICAgIH0KKyAgfQorICBlbHNleworICAgIGZvcihsID0gc3RhcnRDaGFubmVsOyBsIDwgc3RvcENoYW5uZWw7bCsrKXsKKyAgICAgIC8qIHRvbmFsaXR5T3JpZyAqLworICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgICAgYWNjdSArPSBmTXVsdERpdjIocXVvdGFNYXRyaXhPcmlnW2tdW2xdLCBpbnZJbmRleCk7CisgICAgICB9CisgICAgICBtZWFuT3JpZyArPSBmTXVsdCgoYWNjdTw8MSksIGludkNoYW5uZWwpOworCisgICAgICAvKiB0b25hbGl0eVNiciAqLworICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgICAgYWNjdSArPSBmTXVsdERpdjIocXVvdGFNYXRyaXhPcmlnW2tdW2luZGV4VmVjdG9yW2xdXSwgaW52SW5kZXgpOworICAgICAgfQorICAgICAgbWVhblNiciAgKz0gZk11bHQoKGFjY3U8PDEpLCBpbnZDaGFubmVsKTsKKyAgICB9CisgIH0KKworICAvKiBTbWFsbCBmaXggdG8gYXZvaWQgbm9pc2UgZHVyaW5nIHNpbGVudCBwYXNzYWdlcy4qLworICBpZiggbWVhbk9yaWcgPD0gRkwyRlhDT05TVF9EQkwoMC4wMDA5NzY1NjJmKlJFTEFYQVRJT05fRkxPQVQpICYmCisgICAgICBtZWFuU2JyIDw9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTc2NTYyZipSRUxBWEFUSU9OX0ZMT0FUKSApCisgIHsKKyAgICBtZWFuT3JpZyA9IEZMMkZYQ09OU1RfREJMKDEwMS41OTM2NjczZipSRUxBWEFUSU9OX0ZMT0FUKTsKKyAgICBtZWFuU2JyICA9IEZMMkZYQ09OU1RfREJMKDEwMS41OTM2NjczZipSRUxBWEFUSU9OX0ZMT0FUKTsKKyAgfQorCisgIG1lYW5PcmlnID0gZml4TWF4KG1lYW5PcmlnLFJFTEFYQVRJT04pOworICBtZWFuU2JyICA9IGZpeE1heChtZWFuU2JyLFJFTEFYQVRJT04pOworCisgIGlmIChtaXNzaW5nSGFybW9uaWNGbGFnID09IDEgfHwKKyAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA9PSBJTlZGX01JRF9MRVZFTCB8fAorICAgICAgaW52ZXJzZUZpbHRlcmluZ0xldmVsID09IElOVkZfTE9XX0xFVkVMIHx8CisgICAgICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPT0gSU5WRl9PRkYgfHwKKyAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA8PSBkaWZmVGhyZXMpCisgIHsKKyAgICBkaWZmID0gUkVMQVhBVElPTjsKKyAgfQorICBlbHNlIHsKKyAgICBhY2N1ID0gZkRpdk5vcm0obWVhblNiciwgbWVhbk9yaWcsICZzY2FsZSk7CisKKyAgICBkaWZmID0gZml4TWF4KCBSRUxBWEFUSU9OLAorICAgICAgICAgICAgICAgICAgIGZNdWx0KFJFTEFYQVRJT05fRlJBQ1QsZk11bHQod2VpZ2h0RmFjLGFjY3UpKSA+PiggUkVMQVhBVElPTl9TSElGVC1zY2FsZSApICkgOworICB9CisKKyAgLyoKKyAgICogbm9pc2UgTGV2ZWwgaXMgbm93IGEgcG9zaXRpdmUgdmFsdWUsIGkuZS4KKyAgICogdGhlIG1vcmUgaGFybW9uaWMgdGhlIHNpZ25hbCBpcyB0aGUgaGlnaGVyIG5vaXNlIGxldmVsLAorICAgKiB0aGlzIG1ha2VzIG5vIHNlbnNlIHNvIHdlIGNoYW5nZSB0aGUgc2lnbi4KKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgYWNjdSA9IGZEaXZOb3JtKGRpZmYsIG1lYW5PcmlnLCAmc2NhbGUpOworICBzY2FsZSAtPSAyOworCisgIGlmICggKHNjYWxlPjApICYmIChhY2N1ID4gKChGSVhQX0RCTClNQVhWQUxfREJMKT4+c2NhbGUpICkgeworICAgICpub2lzZUxldmVsID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgIH0KKyAgZWxzZSB7CisgICAgKm5vaXNlTGV2ZWwgPSBzY2FsZVZhbHVlKGFjY3UsIHNjYWxlKTsKKyAgfQorCisgIC8qCisgICAqIEFkZCBhIG5vaXNlIGZsb29yIG9mZnNldCB0byBjb21wZW5zYXRlIGZvciBiaWFzIGluIHRoZSBkZXRlY3RvcgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmKCFtaXNzaW5nSGFybW9uaWNGbGFnKQorICAgICpub2lzZUxldmVsID0gZk11bHQoKm5vaXNlTGV2ZWwsIG5vaXNlRmxvb3JPZmZzZXQpPDwoTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcpOworCisgIC8qCisgICAqIGNoZWNrIHRvIHNlZSB0aGF0IHdlIGRvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIGxldmVsCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgKm5vaXNlTGV2ZWwgPSBmaXhNaW4oKm5vaXNlTGV2ZWwsIGFuYV9tYXhfbGV2ZWwpOyAgICAgLyogYW5hX21heF9sZXZlbCBpcyBzY2FsZWQgd2l0aCBmYWN0b3IgMC4yNSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBEb2VzIHRoZSBub2lzZSBmbG9vciBsZXZlbCBlc3RpYW10aW9uLgorICBUaGUgZnVuY3Rpb24gY2FsbHMgdGhlIE5vaXNlZmxvb3IgZXN0aW1hdGlvbiBmdW5jdGlvbgorICBmb3IgdGhlIHRpbWUgc2VnbWVudHMgZGVjaWRlZCBiYXNlZCB1cG9uIHRoZSB0cmFuc2llbnQKKyAgaW5mb3JtYXRpb24uIFRoZSBibG9jayBpcyBhbHdheXMgZGl2aWRlZCBpbnRvIG9uZSBvciB0d28gc2VnbWVudHMuCisKKworICBccmV0dXJuICAgIG5vbmUKKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19zYnJOb2lzZUZsb29yRXN0aW1hdGVRbWYoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvLCAgIC8qITwgVGltZSBmcmVxdWVuY3kgZ3JpZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbm9pc2VMZXZlbHMsICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIHRvIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMgaW4uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgICAgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvciwgICAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtaXNzaW5nSGFybW9uaWNzRmxhZywgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudCB3aWxsIGJlIG1pc3NpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlciBmcmFtZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNpZW50RnJhbWUsICAgICAgICAgICAgICAgICAvKiE8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBwSW52RmlsdExldmVscywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHRoZSB2ZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICApCisKK3sKKworICBJTlQgbk5vaXNlRW52ZWxvcGVzLCBzdGFydFBvc1syXSwgc3RvcFBvc1syXSwgZW52LCBiYW5kOworCisgIElOVCBub05vaXNlQmFuZHMgICAgICA9IGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHM7CisgIElOVCAqZnJlcUJhbmRUYWJsZSAgICA9IGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5mcmVxQmFuZFRhYmxlUW1mOworCisgIG5Ob2lzZUVudmVsb3BlcyA9IGZyYW1lX2luZm8tPm5Ob2lzZUVudmVsb3BlczsKKworICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIG5Ob2lzZUVudmVsb3BlcyA9IDE7CisgICAgc3RhcnRQb3NbMF0gPSBzdGFydEluZGV4OworICAgIHN0b3BQb3NbMF0gID0gc3RhcnRJbmRleCArIG1pbihudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLDIpOworICB9IGVsc2UKKyAgaWYobk5vaXNlRW52ZWxvcGVzID09IDEpeworICAgIHN0YXJ0UG9zWzBdID0gc3RhcnRJbmRleDsKKyAgICBzdG9wUG9zWzBdICA9IHN0YXJ0SW5kZXggKyAyOworICB9CisgIGVsc2V7CisgICAgc3RhcnRQb3NbMF0gPSBzdGFydEluZGV4OworICAgIHN0b3BQb3NbMF0gID0gc3RhcnRJbmRleCArIDE7CisgICAgc3RhcnRQb3NbMV0gPSBzdGFydEluZGV4ICsgMTsKKyAgICBzdG9wUG9zWzFdICA9IHN0YXJ0SW5kZXggKyAyOworICB9CisKKyAgLyoKKyAgICogRXN0aW1hdGUgdGhlIG5vaXNlIGZsb29yLgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGZvcihlbnYgPSAwOyBlbnYgPCBuTm9pc2VFbnZlbG9wZXM7IGVudisrKXsKKyAgICBmb3IoYmFuZCA9IDA7IGJhbmQgPCBub05vaXNlQmFuZHM7IGJhbmQrKyl7CisgICAgICBGREtfQVNTRVJUKCAoYmFuZCArIGVudipub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOworICAgICAgcW1mQmFzZWROb2lzZUZsb29yRGV0ZWN0aW9uKCZub2lzZUxldmVsc1tiYW5kICsgZW52Km5vTm9pc2VCYW5kc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGFNYXRyaXhPcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zW2Vudl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFBvc1tlbnZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGVbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZVtiYW5kKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5hbmFfbWF4X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUZsb29yT2Zmc2V0W2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY3NGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT53ZWlnaHRGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmRpZmZUaHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW52RmlsdExldmVsc1tiYW5kXSk7CisgICAgfQorICB9CisKKworICAvKgorICAgKiBTbW9vdGhpbmcgb2YgdGhlIHZhbHVlcy4KKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworICBzbW9vdGhpbmdPZk5vaXNlTGV2ZWxzKG5vaXNlTGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2lzZUVudmVsb3BlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5wcmV2Tm9pc2VMZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPnNtb290aEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRGcmFtZSk7CisKKworICAvKiBxdWFudGlzYXRpb24qLworICBmb3IoZW52ID0gMDsgZW52IDwgbk5vaXNlRW52ZWxvcGVzOyBlbnYrKyl7CisgICAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspeworICAgICAgRkRLX0FTU0VSVCggKGJhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzKSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTKTsKKyAgICAgIG5vaXNlTGV2ZWxzW2JhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzXSA9CisgICAgICAgICAoRklYUF9EQkwpTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKEZJWFBfREJMKUNhbGNMZERhdGEobm9pc2VMZXZlbHNbYmFuZCArIGVudipub05vaXNlQmFuZHNdKyhGSVhQX0RCTCkxKSArIFF1YW50T2Zmc2V0OworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmCisKKworICBccmV0dXJuICAgIGVycm9yQ29kZSwgbm9FcnJvciBpZiBzdWNjZXNzZnVsCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitkb3duU2FtcGxlTG9SZXMoSU5UICp2X3Jlc3VsdCwgICAgICAgICAgICAgIC8qITwgICAgKi8KKyAgICAgICAgICAgICAgICBJTlQgbnVtX3Jlc3VsdCwgICAgICAgICAgICAgLyohPCAgICAqLworICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlUmVmLC8qITwgICAgKi8KKyAgICAgICAgICAgICAgICBJTlQgbnVtX1JlZikgICAgICAgICAgICAgICAgLyohPCAgICAqLworeworICBJTlQgc3RlcDsKKyAgSU5UIGksajsKKyAgSU5UIG9yZ19sZW5ndGgscmVzdWx0X2xlbmd0aDsKKyAgSU5UIHZfaW5kZXhbTUFYX0ZSRVFfQ09FRkZTLzJdOworCisgIC8qIGluaXQgKi8KKyAgb3JnX2xlbmd0aD1udW1fUmVmOworICByZXN1bHRfbGVuZ3RoPW51bV9yZXN1bHQ7CisKKyAgdl9pbmRleFswXT0wOwkvKiBBbHdheXMgdXNlIGxlZnQgYm9yZGVyICovCisgIGk9MDsKKyAgd2hpbGUob3JnX2xlbmd0aCA+IDApCS8qIENyZWF0ZSBkb3duc2FtcGxlIHZlY3RvciAqLworICAgIHsKKyAgICAgIGkrKzsKKyAgICAgIHN0ZXA9b3JnX2xlbmd0aC9yZXN1bHRfbGVuZ3RoOyAvKiBmbG9vcjsgKi8KKyAgICAgIG9yZ19sZW5ndGg9b3JnX2xlbmd0aCAtIHN0ZXA7CisgICAgICByZXN1bHRfbGVuZ3RoLS07CisgICAgICB2X2luZGV4W2ldPXZfaW5kZXhbaS0xXStzdGVwOworICAgIH0KKworICBpZihpICE9IG51bV9yZXN1bHQgKQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgcmV0dXJuICgxKTsvKiBlcnJvciBkb3duc2FtcGxpbmcgKi8KKworICBmb3Ioaj0wO2o8PWk7aisrKQkvKiBVc2UgZG93bnNhbXBsZSB2ZWN0b3IgdG8gaW5kZXggTG9SZXNvbHV0aW9uIHZlY3Rvci4gKi8KKyAgICB7CisgICAgICB2X3Jlc3VsdFtqXT1mcmVxQmFuZFRhYmxlUmVmW3ZfaW5kZXhbal1dOworICAgIH0KKworICByZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgIEluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5vaXNlIGZsb29yIGxldmVsIGVzdGltYXRpb24gbW9kdWxlLgorCisKKyAgXHJldHVybiAgICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgc3VjY2Vzc2Z1bAorCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UCitGREtzYnJFbmNfSW5pdFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsICAgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgIC8qITwgRnJlcXVhbnkgYmFuZCB0YWJsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzIGluIGEgZnJhbWUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAgICAgICAgICAgIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSU5UIGksIHFleHAsIHF0bXA7CisgIEZJWFBfREJMIHRtcCwgZXhwOworCisgIEZES21lbWNsZWFyKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLHNpemVvZihTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUpKTsKKworICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+c21vb3RoRmlsdGVyID0gc21vb3RoRmlsdGVyOworICBpZiAodXNlU3BlZWNoQ29uZmlnKSB7CisgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPndlaWdodEZhYyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMgPSBJTlZGX0xPV19MRVZFTDsKKyAgfQorICBlbHNlIHsKKyAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+d2VpZ2h0RmFjID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOworICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMgPSBJTlZGX01JRF9MRVZFTDsKKyAgfQorCisgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT50aW1lU2xvdHMgICAgID0gdGltZVNsb3RzOworICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kcyAgICA9IG5vaXNlQmFuZHM7CisKKyAgLyogaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgaXMgc2NhbGVkIGJ5IDAuMjUgICovCisgIHN3aXRjaChhbmFfbWF4X2xldmVsKQorICB7CisgIGNhc2UgNjoKKyAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5hbmFfbWF4X2xldmVsID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICBicmVhazsKKyAgY2FzZSAzOgorICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgPSBGTDJGWENPTlNUX0RCTCgwLjUpOworICAgICAgYnJlYWs7CisgIGNhc2UgLTM6CisgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCA9IEZMMkZYQ09OU1RfREJMKDAuMTI1KTsKKyAgICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgICAgLyogU2hvdWxkIG5vdCBlbnRlciBoZXJlICovCisgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgYnJlYWs7CisgIH0KKworICAvKgorICAgIGNhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgYW5kIGFsbG9jYXRlCisgICovCisgIGlmKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZShoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSxmcmVxQmFuZFRhYmxlLG5TZmIpKQorICAgIHJldHVybigxKTsKKworICBpZihub2lzZUZsb29yT2Zmc2V0ID09IDApIHsKKyAgICB0bXAgPSAoKEZJWFBfREJMKU1BWFZBTF9EQkwpPj5OT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORzsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBub2lzZUZsb29yT2Zmc2V0IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gMTIsIGJlY2F1c2UKKyAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBjYWxjdWxhdGlvbiBiZWxvdyBtdXN0IGJlIHNtYWxsZXIgdGhhbiAxOgorICAgICAgICgyXihub2lzZUZsb29yT2Zmc2V0LzMpKSoyXjQ8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZES19BU1NFUlQobm9pc2VGbG9vck9mZnNldDwxMik7CisKKyAgICAvKiBBc3N1bWVzIHRoZSBub2lzZSBmbG9vciBvZmZzZXQgaW4gdHVuaW5nIHRhYmxlIGFyZSBpbiBxMzEgICAgKi8KKyAgICAvKiBDaGFuZ2UgdGhlIHFmb3JtYXQgaGVyZSB3aGVuIG5vbi16ZXJvIHZhbHVlcyB3b3VsZCBiZSBmaWxsZWQgKi8KKyAgICBleHAgPSBmRGl2Tm9ybSgoRklYUF9EQkwpbm9pc2VGbG9vck9mZnNldCwgMywgJnFleHApOworICAgIHRtcCA9IGZQb3coMiwgREZSQUNUX0JJVFMtMSwgZXhwLCBxZXhwLCAmcXRtcCk7CisgICAgdG1wID0gc2NhbGVWYWx1ZSh0bXAsIHF0bXAtTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcpOworICB9CisKKyAgZm9yKGk9MDtpPGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHM7aSsrKSB7CisgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlRmxvb3JPZmZzZXRbaV0gPSB0bXA7CisgIH0KKworICByZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBSZXNldHMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIG5vaXNlIGZsb29yIGVzdGlhbXRpb24KKyAgICAgICAgICBtb2R1bGUuCisKKworICBccmV0dXJuICAgIGVycm9yQ29kZSwgbm9FcnJvciBpZiBzdWNjZXNzZnVsCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGFibGUuICovCit7CisgICAgSU5UIGsyLGt4OworCisgICAgLyoKKyAgICAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBrMj1mcmVxQmFuZFRhYmxlW25TZmJdOworICAgIGt4PWZyZXFCYW5kVGFibGVbMF07CisgICAgaWYoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlQmFuZHMgPT0gMCl7CisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHMgPSAxOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKgorICAgICAgICAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgMSwyIG9yIDMgYmFuZHMvb2N0YXZlCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBGSVhQX0RCTCB0bXAsIHJhdGlvLCBsZzI7CisgICAgICAgIElOVCByYXRpb19lLCBxbGcyLCBuTm9pc2VCYW5kczsKKworICAgICAgICByYXRpbyA9IGZEaXZOb3JtKGsyLCBreCwgJnJhdGlvX2UpOworICAgICAgICBsZzIgPSBmTG9nMihyYXRpbywgcmF0aW9fZSwgJnFsZzIpOworICAgICAgICB0bXAgPSBmTXVsdCgoRklYUF9EQkwpKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUJhbmRzPDwyNCksIGxnMik7CisgICAgICAgIHRtcCA9IHNjYWxlVmFsdWUodG1wLCBxbGcyLTIzKTsKKworICAgICAgICBuTm9pc2VCYW5kcyA9IChJTlQpKCh0bXAgKyAoRklYUF9EQkwpMSkgPj4gMSk7CisKKworICAgICAgICBpZiAobk5vaXNlQmFuZHMgPiBNQVhfTlVNX05PSVNFX0NPRUZGUyApIHsKKyAgICAgICAgICBuTm9pc2VCYW5kcyA9IE1BWF9OVU1fTk9JU0VfQ09FRkZTOworICAgICAgICB9CisKKyAgICAgICAgaWYoIG5Ob2lzZUJhbmRzID09IDAgKSB7CisgICAgICAgICAgbk5vaXNlQmFuZHMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcyA9IG5Ob2lzZUJhbmRzOworCisgICAgfQorCisKKyAgICByZXR1cm4oZG93blNhbXBsZUxvUmVzKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5mcmVxQmFuZFRhYmxlUW1mLAorICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzLAorICAgICAgICBmcmVxQmFuZFRhYmxlLG5TZmIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgRGVsZXRlcyB0aGUgY3VycmVudCBpbnN0YW5jY2Ugb2YgdGhlIG5vaXNlIGZsb29yIGxldmVsCisgIGVzdGltYXRpb24gbW9kdWxlLgorCisKKyAgXHJldHVybiAgICBub25lCisKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfZGVsZXRlU2JyTm9pc2VGbG9vckVzdGltYXRlIChIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlKSAgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLworeworCisgIGlmIChoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSkgeworICAgIC8qCisgICAgICBub3RoaW5nIHRvIGRvCisgICAgKi8KKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmggYi9hYWMvbGliU0JSZW5jL3NyYy9uZl9lc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDA3Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmgKQEAgLTAsMCArMSwxNDcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBOb2lzZSBmbG9vciBlc3RpbWF0aW9uIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMgIAorKi8KKworI2lmbmRlZiBfX05GX0VTVF9ICisjZGVmaW5lIF9fTkZfRVNUX0gKKworI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisjaW5jbHVkZSAiZnJhbV9nZW4uaCIKKworI2RlZmluZSBORl9TTU9PVEhJTkdfTEVOR1RIIDQgICAgICAgICAgICAgICAgICAgLyohPCBTbW9vdGhpbmcgbGVuZ3RoIG9mIHRoZSBub2lzZSBmbG9vcnMuICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMIHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIXVtNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgVGhlIHByZXZpb3VzIG5vaXNlIGxldmVscy4gKi8KKyAgRklYUF9EQkwgbm9pc2VGbG9vck9mZnNldFtNQVhfTlVNX05PSVNFX1ZBTFVFU107ICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQsIHNjYWxlZCB3aXRoIE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HICovCisgIGNvbnN0IEZJWFBfREJMICpzbW9vdGhGaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU21vb3RoaW5nIGZpbHRlciB0byB1c2UuICovCisgIEZJWFBfREJMIGFuYV9tYXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWF4IGxldmVsIGFsbG93ZWQuICAgKi8KKyAgRklYUF9EQkwgd2VpZ2h0RmFjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXZWlnaHRlbmluZyBmYWN0b3IgZm9yIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZyBhbmQgc2JyLiAqLworICBJTlQgZnJlcUJhbmRUYWJsZVFtZltNQVhfTlVNX05PSVNFX1ZBTFVFUyArIDFdOyAvKiE8IEZyZXF1bmN5IGJhbmQgdGFibGUgZm9yIHRoZSBub2lzZSBmbG9vciBiYW5kcy4qLworICBJTlQgbm9Ob2lzZUJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZWJhbmRzLiAqLworICBJTlQgbm9pc2VCYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlQmFuZHMgc3dpdGNoIDQgYml0LiovCisgIElOVCB0aW1lU2xvdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBpbiBhIGZyYW1lLiAqLworICBJTlZGX01PREUgZGlmZlRocmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRocmVzaG9sZCB2YWx1ZSB0byBjb250cm9sIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBkZWNpc2lvbiAqLworfQorU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFOworCit0eXBlZGVmIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSAqSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURTsKKwordm9pZAorRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZihIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm8sICAgLyohPCBUaW1lIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpub2lzZUxldmVscywgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgdG8gc3RvcmUgdGhlIG5vaXNlIGxldmVscyBpbi4qLworICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXhPcmlnLCAgICAgICAgIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIGluZGV4VmVjdG9yLCAgICAgICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1pc3NpbmdIYXJtb25pY3NGbGFnLCAgICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYSBzdHJvbmcgdG9uYWwgY29tcG9uZW50IHdpbGwgYmUgbWlzc2luZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAgICAgIC8qITwgVGhlIG51bWJlciBvZiB0b25hbGl0eSBlc3RpbWF0ZXMgcGVyIGZyYW1lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGcmFtZSwgICAgICAgICAgICAgICAgIC8qITwgQSBmbGFnIGluZGljYXRpbmcgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUqIHBJbnZGaWx0TGV2ZWxzLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdGhlIHZlY3RvciBob2xkaW5nIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0lOVAorRkRLc2JyRW5jX0luaXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAgIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIHBlciBvY3RhdmUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyBpbiBhIGZyYW1lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZyAgICAgICAgICAgICAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworSU5UCitGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGFibGUuICovCisKK3ZvaWQKK0ZES3NickVuY19kZWxldGVTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUpOyAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmZTEyZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5jcHAKQEAgLTAsMCArMSw2OTYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBOLiBSZXR0ZWxiYWNoCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gYml0c3RyZWFtIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicHNfbWFpbi5oIgorCisKKyNpbmNsdWRlICJwc19jb25zdC5oIgorI2luY2x1ZGUgInBzX2JpdGVuYy5oIgorCitzdGF0aWMKK2lubGluZSBVQ0hBUiBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKK3sKKyAgLyogaEJpdFN0cmVhbSA9PSBOVUxMIGhhcHBlbnMgaGVyZSBpbnRlbnRpb25hbGx5ICovCisgIGlmKGhCaXRTdHJlYW0hPU5VTEwpeworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB2YWx1ZSwgbnVtYmVyT2ZCaXRzKTsKKyAgfQorICByZXR1cm4gbnVtYmVyT2ZCaXRzOworfQorCisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgICAgICAgICA4CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBTX0VYVF9JRF9WMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKK3N0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0ID0gMTQ7CitzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhQ29hcnNlX01heFZhbCA9IDI4Oworc3RhdGljIGNvbnN0IElOVCBpaWREZWx0YUZpbmVfT2Zmc2V0ID0gMzA7CitzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhRmluZV9NYXhWYWwgPSA2MDsKKworLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFGcmVxQ29hcnNlICovCitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoW10gPQoreworICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTYsICAxNSwgICAgMTMsICAgIDEwLCAgICAgOSwgICAgIDcsCisgICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMSwgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNiwKKyAgIDgsICAgIDExLCAgICAxMywgICAgMTQsICAgIDE0LCAgMTUsICAgIDE3LCAgICAxOCwgICAgMTgKK307CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfQ29kZVtdICA9Cit7CisgIDB4MDAwMWZmZmIsICAweDAwMDFmZmZjLCAgMHgwMDAxZmZmZCwgIDB4MDAwMWZmZmEsICAweDAwMDBmZmZjLCAgMHgwMDAwN2ZmYywgIDB4MDAwMDFmZmQsICAweDAwMDAwM2ZlLCAgMHgwMDAwMDFmZSwgIDB4MDAwMDAwN2UsCisgIDB4MDAwMDAwM2MsICAweDAwMDAwMDFkLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMDUsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMGMsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAzZCwgIDB4MDAwMDAwM2UsCisgIDB4MDAwMDAwZmUsICAweDAwMDAwN2ZlLCAgMHgwMDAwMWZmYywgIDB4MDAwMDNmZmMsICAweDAwMDAzZmZkLCAgMHgwMDAwN2ZmZCwgIDB4MDAwMWZmZmUsICAweDAwMDNmZmZlLCAgMHgwMDAzZmZmZgorfTsKKworLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFGcmVxRmluZSAqLworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9MZW5ndGhbXSA9Cit7CisgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxNywKKyAgMTgsICAgIDE3LCAgICAxNywgICAgMTYsICAgIDE2LCAgMTUsICAgIDE0LCAgICAxNCwgICAgMTMsICAgIDEyLAorICAxMiwgICAgMTEsICAgIDEwLCAgICAxMCwgICAgIDgsICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCisgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE0LCAgMTUsICAgIDE2LCAgICAxNiwgICAgMTcsICAgIDE3LAorICAxOCwgICAgMTcsICAgIDE4LCAgICAxOCwgICAgMTgsICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsCisgIDE4Cit9Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9Db2RlW10gPQoreworICAweDAwMDFmZWI0LCAgMHgwMDAxZmViNSwgIDB4MDAwMWZkNzYsICAweDAwMDFmZDc3LCAgMHgwMDAxZmQ3NCwgIDB4MDAwMWZkNzUsICAweDAwMDFmZThhLCAgMHgwMDAxZmU4YiwgIDB4MDAwMWZlODgsICAweDAwMDBmZTgwLAorICAweDAwMDFmZWI2LCAgMHgwMDAwZmU4MiwgIDB4MDAwMGZlYjgsICAweDAwMDA3ZjQyLCAgMHgwMDAwN2ZhZSwgIDB4MDAwMDNmYWYsICAweDAwMDAxZmQxLCAgMHgwMDAwMWZlOSwgIDB4MDAwMDBmZTksICAweDAwMDAwN2VhLAorICAweDAwMDAwN2ZiLCAgMHgwMDAwMDNmYiwgIDB4MDAwMDAxZmIsICAweDAwMDAwMWZmLCAgMHgwMDAwMDA3YywgIDB4MDAwMDAwM2MsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAwYywgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAxLAorICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDEsICAweDAwMDAwMDBkLCAgMHgwMDAwMDAxZCwgIDB4MDAwMDAwM2QsICAweDAwMDAwMDdkLCAgMHgwMDAwMDBmYywgIDB4MDAwMDAxZmMsICAweDAwMDAwM2ZjLAorICAweDAwMDAwM2Y0LCAgMHgwMDAwMDdlYiwgIDB4MDAwMDBmZWEsICAweDAwMDAxZmVhLCAgMHgwMDAwMWZkNiwgIDB4MDAwMDNmZDAsICAweDAwMDA3ZmFmLCAgMHgwMDAwN2Y0MywgIDB4MDAwMGZlYjksICAweDAwMDBmZTgzLAorICAweDAwMDFmZWI3LCAgMHgwMDAwZmU4MSwgIDB4MDAwMWZlODksICAweDAwMDFmZThlLCAgMHgwMDAxZmU4ZiwgIDB4MDAwMWZlOGMsICAweDAwMDFmZThkLCAgMHgwMDAxZmViMiwgIDB4MDAwMWZlYjMsICAweDAwMDFmZWIwLAorICAweDAwMDFmZWIxCit9OworCisvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YVRpbWVDb2Fyc2UgKi8KK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGhbXSA9Cit7CisgIDE5LCAgICAxOSwgICAgMTksICAgIDIwLCAgICAyMCwgIDIwLCAgICAxNywgICAgMTUsICAgIDEyLCAgICAxMCwKKyAgIDgsICAgICA2LCAgICAgNCwgICAgIDIsICAgICAxLCAgIDMsICAgICA1LCAgICAgNywgICAgIDksICAgIDExLAorICAxMywgICAgMTQsICAgIDE3LCAgICAxOSwgICAgMjAsICAyMCwgICAgMjAsICAgIDIwLCAgICAyMAorfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9Db2RlW10gPQoreworICAweDAwMDdmZmY5LCAgMHgwMDA3ZmZmYSwgIDB4MDAwN2ZmZmIsICAweDAwMGZmZmY4LCAgMHgwMDBmZmZmOSwgIDB4MDAwZmZmZmEsICAweDAwMDFmZmZkLCAgMHgwMDAwN2ZmZSwgIDB4MDAwMDBmZmUsICAweDAwMDAwM2ZlLAorICAweDAwMDAwMGZlLCAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDAyLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDFlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwN2ZlLAorICAweDAwMDAxZmZlLCAgMHgwMDAwM2ZmZSwgIDB4MDAwMWZmZmMsICAweDAwMDdmZmY4LCAgMHgwMDBmZmZmYiwgIDB4MDAwZmZmZmMsICAweDAwMGZmZmZkLCAgMHgwMDBmZmZmZSwgIDB4MDAwZmZmZmYKK307CisKKy8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhVGltZUZpbmUgKi8KK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUZpbmVfTGVuZ3RoW10gPQoreworICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgICAgMTUsCisgIDE1LCAgICAxNSwgICAgMTUsICAgIDE1LCAgICAxNSwgIDE0LCAgICAxNCwgICAgMTMsICAgIDEzLCAgICAxMywKKyAgMTIsICAgIDEyLCAgICAxMSwgICAgMTAsICAgICA5LCAgIDksICAgICA3LCAgICAgNiwgICAgIDUsICAgICAzLAorICAgMSwgICAgIDIsICAgICA1LCAgICAgNiwgICAgIDcsICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTEsCisgIDEyLCAgICAxMiwgICAgMTMsICAgIDEzLCAgICAxNCwgIDE0LCAgICAxNSwgICAgMTUsICAgIDE1LCAgICAxNSwKKyAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LAorICAxNgorfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUZpbmVfQ29kZVtdID0KK3sKKyAgMHgwMDAwNGVkNCwgIDB4MDAwMDRlZDUsICAweDAwMDA0ZWNlLCAgMHgwMDAwNGVjZiwgIDB4MDAwMDRlY2MsICAweDAwMDA0ZWQ2LCAgMHgwMDAwNGVkOCwgIDB4MDAwMDRmNDYsICAweDAwMDA0ZjYwLCAgMHgwMDAwMjcxOCwKKyAgMHgwMDAwMjcxOSwgIDB4MDAwMDI3NjQsICAweDAwMDAyNzY1LCAgMHgwMDAwMjc2ZCwgIDB4MDAwMDI3YjEsICAweDAwMDAxM2I3LCAgMHgwMDAwMTNkNiwgIDB4MDAwMDA5YzcsICAweDAwMDAwOWU5LCAgMHgwMDAwMDllZCwKKyAgMHgwMDAwMDRlZSwgIDB4MDAwMDA0ZjcsICAweDAwMDAwMjc4LCAgMHgwMDAwMDEzOSwgIDB4MDAwMDAwOWEsICAweDAwMDAwMDlmLCAgMHgwMDAwMDAyMCwgIDB4MDAwMDAwMTEsICAweDAwMDAwMDBhLCAgMHgwMDAwMDAwMywKKyAgMHgwMDAwMDAwMSwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDBiLCAgMHgwMDAwMDAxMiwgIDB4MDAwMDAwMjEsICAweDAwMDAwMDRjLCAgMHgwMDAwMDA5YiwgIDB4MDAwMDAxM2EsICAweDAwMDAwMjc5LCAgMHgwMDAwMDI3MCwKKyAgMHgwMDAwMDRlZiwgIDB4MDAwMDA0ZTIsICAweDAwMDAwOWVhLCAgMHgwMDAwMDlkOCwgIDB4MDAwMDEzZDcsICAweDAwMDAxM2QwLCAgMHgwMDAwMjdiMiwgIDB4MDAwMDI3YTIsICAweDAwMDAyNzFhLCAgMHgwMDAwMjcxYiwKKyAgMHgwMDAwNGY2NiwgIDB4MDAwMDRmNjcsICAweDAwMDA0ZjYxLCAgMHgwMDAwNGY0NywgIDB4MDAwMDRlZDksICAweDAwMDA0ZWQ3LCAgMHgwMDAwNGVjZCwgIDB4MDAwMDRlZDIsICAweDAwMDA0ZWQzLCAgMHgwMDAwNGVkMCwKKyAgMHgwMDAwNGVkMQorfTsKKworc3RhdGljIGNvbnN0IElOVCBpY2NEZWx0YV9PZmZzZXQgPSAgNzsKK3N0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfTWF4VmFsID0gMTQ7CisvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpY2NEZWx0YUZyZXEgKi8KK3N0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhRnJlcV9MZW5ndGhbXSA9Cit7CisgIDE0LCAgICAxNCwgICAgMTIsICAgIDEwLCAgICAgNywgICA1LCAgICAgMywgICAgIDEsICAgICAyLCAgICAgNCwKKyAgIDYsICAgICA4LCAgICAgOSwgICAgMTEsICAgIDEzCit9Oworc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFGcmVxX0NvZGVbXSA9Cit7CisgIDB4MDAwMDNmZmYsICAweDAwMDAzZmZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDAzZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCisgIDB4MDAwMDAwM2UsICAweDAwMDAwMGZlLCAgMHgwMDAwMDFmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAxZmZlCit9OworCisvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpY2NEZWx0YVRpbWUgKi8KK3N0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhVGltZV9MZW5ndGhbXSA9Cit7CisgIDE0LCAgICAxMywgICAgMTEsICAgICA5LCAgICAgNywgICA1LCAgICAgMywgICAgIDEsICAgICAyLCAgICAgNCwKKyAgIDYsICAgICA4LCAgICAxMCwgICAgMTIsICAgIDE0Cit9Oworc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFUaW1lX0NvZGVbXSA9Cit7CisgIDB4MDAwMDNmZmUsICAweDAwMDAxZmZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCisgIDB4MDAwMDAwM2UsICAweDAwMDAwMGZlLCAgMHgwMDAwMDNmZSwgIDB4MDAwMDBmZmUsICAweDAwMDAzZmZmCit9OworCisKKworc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9PZmZzZXQgPSAwOworc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9NYXhWYWwgPSA3OworLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaXBkRGVsdGFGcmVxICovCitzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfTGVuZ3RoW10gPQoreworICAgMSwgICAgIDMsICAgICA0LCAgICAgNCwgICAgIDQsICAgNCwgICAgIDQsICAgICA0Cit9Oworc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFGcmVxX0NvZGVbXSA9Cit7CisgIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDUsICAweDAwMDAwMDA3Cit9OworCisvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpcGREZWx0YVRpbWUgKi8KK3N0YXRpYyBjb25zdCBVSU5UIGlwZERlbHRhVGltZV9MZW5ndGhbXSA9Cit7CisgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNSwgICA0LCAgICAgNCwgICAgIDMKK307CitzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YVRpbWVfQ29kZVtdID0KK3sKKyAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDIsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDMKK307CisKKworc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9PZmZzZXQgPSAwOworc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9NYXhWYWwgPSA3OworLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogb3BkRGVsdGFGcmVxICovCitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YUZyZXFfTGVuZ3RoW10gPQoreworICAgMSwgICAgIDMsICAgICA0LCAgICAgNCwgICAgIDUsICAgNSwgICAgIDQsICAgICAzCit9Oworc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0NvZGVbXSA9Cit7CisgIDB4MDAwMDAwMDEsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDBmLCAgMHgwMDAwMDAwZSwgIDB4MDAwMDAwMDUsICAwMDAwMDAwMDAwLAorfTsKKworLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogb3BkRGVsdGFUaW1lICovCitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfTGVuZ3RoW10gPQoreworICAgMSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDUsICAgNCwgICAgIDQsICAgICAzCit9Oworc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFUaW1lX0NvZGVbXSA9Cit7CisgIDB4MDAwMDAwMDEsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDcsICAweDAwMDAwMDA2LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzCit9OworCitzdGF0aWMgY29uc3QgSU5UIHBzQmFuZHNbXSA9Cit7CisgIFBTX0JBTkRTX0NPQVJTRSwKKyAgUFNfQkFORFNfTUlECit9OworCitzdGF0aWMgSU5UIGdldE5vQmFuZHMoUFNfUkVTT0xVVElPTiBtb2RlKQoreworICBpZihtb2RlPj02KQorICAgIHJldHVybiAwOworCisgIGlmKG1vZGU+PTMpCisgICAgbW9kZSA9IChQU19SRVNPTFVUSU9OKShtb2RlLTMpOworCisgIHJldHVybiBwc0JhbmRzW21vZGVdOworfQorCitzdGF0aWMgSU5UIGdldElJRFJlcyhJTlQgaWlkTW9kZSkKK3sKKyAgaWYoaWlkTW9kZTwzKQorICAgIHJldHVybiBQU19JSURfUkVTX0NPQVJTRTsKKyAgZWxzZQorICAgIHJldHVybiBQU19JSURfUkVTX0ZJTkU7Cit9CisKK3N0YXRpYyBJTlQKK2VuY29kZURlbHRhRnJlcShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbkJhbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHRhYmxlT2Zmc2V0LAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbWF4VmFsLAorICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIElOVCBiaXRDbnQgPSAwOworICBJTlQgbGFzdFZhbCA9IDA7CisgIElOVCBiYW5kOworCisgIGZvcihiYW5kPTA7YmFuZDxuQmFuZHM7YmFuZCsrKSB7CisgICAgSU5UIGRlbHRhID0gKHZhbFtiYW5kXSAtIGxhc3RWYWwpICsgdGFibGVPZmZzZXQ7CisgICAgbGFzdFZhbCA9IHZhbFtiYW5kXTsKKyAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgeworICAgICAgKmVycm9yID0gMTsKKyAgICAgIGRlbHRhID0gZGVsdGE+MD9tYXhWYWw6MDsKKyAgICB9CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgY29kZVRhYmxlW2RlbHRhXSwgbGVuZ3RoVGFibGVbZGVsdGFdKTsKKyAgfQorCisgIHJldHVybiBiaXRDbnQ7Cit9CisKK3N0YXRpYyBJTlQKK2VuY29kZURlbHRhVGltZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsTGFzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG5CYW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB0YWJsZU9mZnNldCwKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG1heFZhbCwKKyAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBJTlQgYml0Q250ID0gMDsKKyAgSU5UIGJhbmQ7CisKKyAgZm9yKGJhbmQ9MDtiYW5kPG5CYW5kcztiYW5kKyspIHsKKyAgICBJTlQgZGVsdGEgPSAodmFsW2JhbmRdIC0gdmFsTGFzdFtiYW5kXSkgKyB0YWJsZU9mZnNldDsKKyAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgeworICAgICAgKmVycm9yID0gMTsKKyAgICAgIGRlbHRhID0gZGVsdGE+MD9tYXhWYWw6MDsKKyAgICB9CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgY29kZVRhYmxlW2RlbHRhXSwgbGVuZ3RoVGFibGVbZGVsdGFdKTsKKyAgfQorCisgIHJldHVybiBiaXRDbnQ7Cit9CisKK0lOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0QnVmLAorICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAqaWlkVmFsLAorICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAqaWlkVmFsTGFzdCwKKyAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG5CYW5kcywKKyAgICAgICAgICAgICAgY29uc3QgUFNfSUlEX1JFU09MVVRJT04gIHJlcywKKyAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgVUlOVCAqY29kZVRhYmxlOworICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKKyAgSU5UIGJpdENudCA9IDA7CisKKyAgYml0Q250ID0gMDsKKworICBzd2l0Y2gobW9kZSkgeworICBjYXNlIFBTX0RFTFRBX0ZSRVE6CisgICAgc3dpdGNoKHJlcykgeworICAgIGNhc2UgUFNfSUlEX1JFU19DT0FSU0U6CisgICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlOworICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoOworICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUNvYXJzZV9NYXhWYWwsIGVycm9yKTsKKyAgICBicmVhazsKKyAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKKyAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFGcmVxRmluZV9Db2RlOworICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFGaW5lX0xlbmd0aDsKKyAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWlkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhRmluZV9PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhRmluZV9NYXhWYWwsIGVycm9yKTsKKyAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKmVycm9yID0gMTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgIHN3aXRjaChyZXMpIHsKKyAgICBjYXNlIFBTX0lJRF9SRVNfQ09BUlNFOgorICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YVRpbWVDb2Fyc2VfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFUaW1lQ29hcnNlX0xlbmd0aDsKKyAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhQ29hcnNlX09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsLCBlcnJvcik7CisgICAgYnJlYWs7CisgICAgY2FzZSBQU19JSURfUkVTX0ZJTkU6CisgICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhVGltZUZpbmVfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFUaW1lRmluZV9MZW5ndGg7CisgICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpaWREZWx0YUZpbmVfT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUZpbmVfTWF4VmFsLCBlcnJvcik7CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICplcnJvciA9IDE7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgKmVycm9yID0gMTsKKyAgfQorCisgIHJldHVybiBiaXRDbnQ7Cit9CisKKworSU5UIEZES3NickVuY19FbmNvZGVJY2MoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbCwKKyAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbExhc3QsCisgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCisgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAorICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKKyAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGU7CisgIElOVCBiaXRDbnQgPSAwOworCisgIHN3aXRjaChtb2RlKSB7CisgIGNhc2UgUFNfREVMVEFfRlJFUToKKyAgICBjb2RlVGFibGUgICA9IGljY0RlbHRhRnJlcV9Db2RlOworICAgIGxlbmd0aFRhYmxlID0gaWNjRGVsdGFGcmVxX0xlbmd0aDsKKyAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGljY1ZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICBicmVhazsKKworICBjYXNlIFBTX0RFTFRBX1RJTUU6CisgICAgY29kZVRhYmxlICAgPSBpY2NEZWx0YVRpbWVfQ29kZTsKKyAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhVGltZV9MZW5ndGg7CisKKyAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGljY1ZhbCwgaWNjVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgICplcnJvciA9IDE7CisgIH0KKworICByZXR1cm4gYml0Q250OworfQorCitJTlQgRkRLc2JyRW5jX0VuY29kZUlwZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAorICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaXBkVmFsLAorICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaXBkVmFsTGFzdCwKKyAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKKyAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCisgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgVUlOVCAqY29kZVRhYmxlOworICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKKyAgSU5UIGJpdENudCA9IDA7CisKKyAgc3dpdGNoKG1vZGUpIHsKKyAgY2FzZSBQU19ERUxUQV9GUkVROgorICAgIGNvZGVUYWJsZSAgID0gaXBkRGVsdGFGcmVxX0NvZGU7CisgICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YUZyZXFfTGVuZ3RoOworICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaXBkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpcGREZWx0YV9PZmZzZXQsIGlwZERlbHRhX01heFZhbCwgZXJyb3IpOworICAgIGJyZWFrOworCisgIGNhc2UgUFNfREVMVEFfVElNRToKKyAgICBjb2RlVGFibGUgICA9IGlwZERlbHRhVGltZV9Db2RlOworICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFUaW1lX0xlbmd0aDsKKworICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaXBkVmFsLCBpcGRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpcGREZWx0YV9PZmZzZXQsIGlwZERlbHRhX01heFZhbCwgZXJyb3IpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgKmVycm9yID0gMTsKKyAgfQorCisgIHJldHVybiBiaXRDbnQ7Cit9CisKK0lOVCBGREtzYnJFbmNfRW5jb2RlT3BkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCisgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWwsCisgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWxMYXN0LAorICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAorICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKKyAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBVSU5UICpjb2RlVGFibGU7CisgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOworICBJTlQgYml0Q250ID0gMDsKKworICBzd2l0Y2gobW9kZSkgeworICBjYXNlIFBTX0RFTFRBX0ZSRVE6CisgICAgY29kZVRhYmxlICAgPSBvcGREZWx0YUZyZXFfQ29kZTsKKyAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhRnJlcV9MZW5ndGg7CisgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBvcGRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgIGNvZGVUYWJsZSAgID0gb3BkRGVsdGFUaW1lX0NvZGU7CisgICAgbGVuZ3RoVGFibGUgPSBvcGREZWx0YVRpbWVfTGVuZ3RoOworCisgICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBvcGRWYWwsIG9wZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAqZXJyb3IgPSAxOworICB9CisKKyAgcmV0dXJuIGJpdENudDsKK30KKworc3RhdGljIElOVCBlbmNvZGVJcGRPcGQoSEFORExFX1BTX09VVCAgICAgICAgcHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmICkKK3sKKyAgSU5UIGJpdENudCA9IDA7CisgIElOVCBlcnJvciAgPSAwOworICBJTlQgZW52OworCisgIEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlwZE9wZCwgMSk7CisKKyAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZD09MSkgeworICAgIElOVCAqaXBkTGFzdCA9IHBzT3V0LT5pcGRMYXN0OworICAgIElOVCAqb3BkTGFzdCA9IHBzT3V0LT5vcGRMYXN0OworCisgICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSVBEW2Vudl0sIDEpOworICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJcGQoIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+aXBkW2Vudl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGRMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcygoUFNfUkVTT0xVVElPTilwc091dC0+aWlkTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJUERbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFPUERbZW52XSwgMSk7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZU9wZCggaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5vcGRbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZExhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKChQU19SRVNPTFVUSU9OKXBzT3V0LT5paWRNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YU9QRFtlbnZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7CisgICAgfQorICAgIC8qIHJlc2VydmVkIGJpdCAqLworICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCAwLCAxKTsKKyAgfQorCisKKyAgcmV0dXJuIGJpdENudDsKK30KKworc3RhdGljIElOVCBnZXRFbnZJZHgoY29uc3QgSU5UIG5FbnZlbG9wZXMsIGNvbnN0IElOVCBmcmFtZUNsYXNzKQoreworICBJTlQgZW52SWR4ID0gMDsKKworICBzd2l0Y2gobkVudmVsb3BlcykgeworICBjYXNlIDA6CisgICAgZW52SWR4ID0gMDsKKyAgICBicmVhazsKKworICBjYXNlIDE6CisgICAgaWYgKGZyYW1lQ2xhc3M9PTApCisgICAgICBlbnZJZHggPSAxOworICAgIGVsc2UKKyAgICAgIGVudklkeCA9IDA7CisgICAgYnJlYWs7CisKKyAgY2FzZSAyOgorICAgIGlmIChmcmFtZUNsYXNzPT0wKQorICAgICAgZW52SWR4ID0gMjsKKyAgICBlbHNlCisgICAgICBlbnZJZHggPSAxOworICAgIGJyZWFrOworCisgIGNhc2UgMzoKKyAgICBlbnZJZHggPSAyOworICAgIGJyZWFrOworCisgIGNhc2UgNDoKKyAgICBlbnZJZHggPSAzOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGVudmVsb3BlcyAqLworICAgIGVudklkeCA9IDA7CisgIH0KKworICByZXR1cm4gZW52SWR4OworfQorCisKK3N0YXRpYyBJTlQgZW5jb2RlUFNFeHRlbnNpb24oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiApCit7CisgIElOVCBiaXRDbnQgPSAwOworCisgIGlmKHBzT3V0LT5lbmFibGVJcGRPcGQ9PTEpIHsKKyAgICBJTlQgaXBkT3BkQml0cyA9IDA7CisgICAgSU5UIGV4dFNpemUgPSAoMiArIGVuY29kZUlwZE9wZChwc091dCxOVUxMKSs3KT4+MzsKKworICAgIGlmKGV4dFNpemU8MTUpIHsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsICBleHRTaXplLCA0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAgICAgICAgICAxNSAsIDQpOworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgKGV4dFNpemUtMTUpLCA4KTsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBpcGQgb3BkIGRhdGEgKi8KKyAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgUFNfRVhUX0lEX1YwLCAyKTsKKyAgICBpcGRPcGRCaXRzICs9IGVuY29kZUlwZE9wZChwc091dCwgaEJpdEJ1ZiApOworCisgICAgLyogYnl0ZSBhbGlnbiB0aGUgaXBkIG9wZCBkYXRhICAqLworICAgIGlmKGlwZE9wZEJpdHMlOCkKKyAgICAgIGlwZE9wZEJpdHMgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAwLCAoOC0oaXBkT3BkQml0cyU4KSkgKTsKKworICAgIGJpdENudCArPSBpcGRPcGRCaXRzOworICB9CisKKyAgcmV0dXJuIChiaXRDbnQpOworfQorCitJTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmICkKK3sKKyAgSU5UIHBzRXh0RW5hYmxlID0gMDsKKyAgSU5UIGJpdENudCA9IDA7CisgIElOVCBlcnJvciA9IDA7CisgIElOVCBlbnY7CisKKyAgaWYocHNPdXQgIT0gTlVMTCl7CisKKyAgICAvKiBQUyBIRUFERVIgKi8KKyAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZVBTSGVhZGVyLCAxKTsKKworICAgIGlmKHBzT3V0LT5lbmFibGVQU0hlYWRlcikgeworCisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlJRCwgMSk7CisgICAgICBpZihwc091dC0+ZW5hYmxlSUlEKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWlkTW9kZSwgMyk7CisgICAgICB9CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlDQywgMSk7CisgICAgICBpZihwc091dC0+ZW5hYmxlSUNDKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWNjTW9kZSwgMyk7CisgICAgICB9CisgICAgICBpZihwc091dC0+ZW5hYmxlSXBkT3BkKSB7CisgICAgICAgIHBzRXh0RW5hYmxlID0gMTsKKyAgICAgIH0KKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc0V4dEVuYWJsZSwgMSk7CisgICAgfQorCisgICAgLyogRnJhbWUgY2xhc3MsIG51bWJlciBvZiBlbnZlbG9wZXMgKi8KKyAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQ2xhc3MsIDEpOworICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBnZXRFbnZJZHgocHNPdXQtPm5FbnZlbG9wZXMsIHBzT3V0LT5mcmFtZUNsYXNzKSwgMik7CisKKyAgICBpZihwc091dC0+ZnJhbWVDbGFzcz09MSkgeworICAgICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZnJhbWVCb3JkZXJbZW52XSwgNSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYocHNPdXQtPmVuYWJsZUlJRD09MSkgeworICAgICAgSU5UICppaWRMYXN0ID0gcHNPdXQtPmlpZExhc3Q7CisgICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlJRFtlbnZdLCAxKTsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJaWQoIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5paWRbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcygoUFNfUkVTT0xVVElPTilwc091dC0+aWlkTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19JSURfUkVTT0xVVElPTilnZXRJSURSZXMocHNPdXQtPmlpZE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJSURbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7CisKKyAgICAgICAgaWlkTGFzdCA9IHBzT3V0LT5paWRbZW52XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihwc091dC0+ZW5hYmxlSUNDPT0xKSB7CisgICAgICBJTlQgKmljY0xhc3QgPSBwc091dC0+aWNjTGFzdDsKKyAgICAgIGZvcihlbnY9MDsgZW52PHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSUNDW2Vudl0sIDEpOworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUljYyggaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmljY1tlbnZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKChQU19SRVNPTFVUSU9OKXBzT3V0LT5pY2NNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhSUNDW2Vudl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisKKyAgICAgICAgaWNjTGFzdCA9IHBzT3V0LT5pY2NbZW52XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihwc0V4dEVuYWJsZSE9MCkgeworICAgICAgYml0Q250ICs9IGVuY29kZVBTRXh0ZW5zaW9uKHBzT3V0LCBoQml0QnVmKTsKKyAgICB9CisKKyAgfSAvKiBpZihwc091dCAhPSBOVUxMKSAqLworCisgIHJldHVybiBiaXRDbnQ7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ZmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5oCkBAIC0wLDAgKzEsMTc3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAorICAgY29udGVudHMvZGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGJpdHN0cmVhbSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBzX21haW4uaCIKKyNpbmNsdWRlICJwc19jb25zdC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2lmbmRlZiBQU19CSVRFTkNfSAorI2RlZmluZSBQU19CSVRFTkNfSAorCit0eXBlZGVmIHN0cnVjdCBUX1BTX09VVCB7CisKKyAgSU5UICAgICAgICAgZW5hYmxlUFNIZWFkZXI7CisgIElOVCAgICAgICAgIGVuYWJsZUlJRDsKKyAgSU5UICAgICAgICAgaWlkTW9kZTsKKyAgSU5UICAgICAgICAgZW5hYmxlSUNDOworICBJTlQgICAgICAgICBpY2NNb2RlOworICBJTlQgICAgICAgICBlbmFibGVJcGRPcGQ7CisKKyAgSU5UICAgICAgICAgZnJhbWVDbGFzczsKKyAgSU5UICAgICAgICAgbkVudmVsb3BlczsKKyAgLyogRU5WIGRhdGEgKi8KKyAgSU5UICAgICAgICAgZnJhbWVCb3JkZXJbUFNfTUFYX0VOVkVMT1BFU107CisKKyAgLyogaWlkIGRhdGEgICovCisgIFBTX0RFTFRBICAgIGRlbHRhSUlEW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgICAgICAgICBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UICAgICAgICAgaWlkTGFzdFtQU19NQVhfQkFORFNdOworCisgIC8qIGljYyBkYXRhICAqLworICBQU19ERUxUQSAgICBkZWx0YUlDQ1tQU19NQVhfRU5WRUxPUEVTXTsKKyAgSU5UICAgICAgICAgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCAgICAgICAgIGljY0xhc3RbUFNfTUFYX0JBTkRTXTsKKworICAvKiBpcGQgZGF0YSAgKi8KKyAgUFNfREVMVEEgICAgZGVsdGFJUERbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCAgICAgICAgIGlwZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgICAgICAgICBpcGRMYXN0W1BTX01BWF9CQU5EU107CisKKyAgLyogb3BkIGRhdGEgICovCisgIFBTX0RFTFRBICAgIGRlbHRhT1BEW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgICAgICAgICBvcGRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UICAgICAgICAgb3BkTGFzdFtQU19NQVhfQkFORFNdOworCit9IFBTX09VVCwgKkhBTkRMRV9QU19PVVQ7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCitJTlQgRkRLc2JyRW5jX0VuY29kZUlpZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppaWRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWlkVmFsTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19JSURfUkVTT0xVVElPTiByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CisKK0lOVCBGREtzYnJFbmNfRW5jb2RlSWNjKEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppY2NWYWxMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKTsKKworSU5UIEZES3NickVuY19FbmNvZGVJcGQoSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaXBkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbExhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpOworCitJTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqb3BkVmFsTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CisKK0lOVCBGREtzYnJFbmNfV3JpdGVQU0JpdHN0cmVhbShjb25zdCBIQU5ETEVfUFNfT1VUICAgcHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRCdWYpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmICAvKiAjaWZuZGVmIFBTX0JJVEVOQ19IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9wc19jb25zdC5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvcHNfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNkMjEwCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvcHNfY29uc3QuaApAQCAtMCwwICsxLDE0OCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE4uIFJldHRlbGJhY2gKKyAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQYXJhbWV0cmljIFN0ZXJlbyBjb25zdGFudHMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBTX0NPTlNUX0gKKyNkZWZpbmUgUFNfQ09OU1RfSAorCisjZGVmaW5lIE1BWF9QU19DSEFOTkVMUyAgICAgICAgICAoICAyICkKKyNkZWZpbmUgSFlCUklEX01BWF9RTUZfQkFORFMgICAgICggIDMgKQorI2RlZmluZSBIWUJSSURfRklMVEVSX0xFTkdUSCAgICAgKCAxMyApCisjZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgICAgICAoIChIWUJSSURfRklMVEVSX0xFTkdUSC0xKS8yICkKKworI2RlZmluZSAgSFlCUklEX0ZSQU1FU0laRSAgICAgICAgKCBRTUZfTUFYX1RJTUVfU0xPVFMgKQorI2RlZmluZSAgSFlCUklEX1JFQURfT0ZGU0VUICAgICAgKCAxMCApCisKKyNkZWZpbmUgTUFYX0hZQlJJRF9CQU5EUyAgICAgICAgICggKFFNRl9DSEFOTkVMUy1IWUJSSURfTUFYX1FNRl9CQU5EUysxMCkgKQorCisKK3R5cGVkZWYgZW51bSB7CisgIFBTX1JFU19DT0FSU0UgID0gMCwKKyAgUFNfUkVTX01JRCAgICAgPSAxLAorICBQU19SRVNfRklORSAgICA9IDIKK30gUFNfUkVTT0xVVElPTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgUFNfQkFORFNfQ09BUlNFICA9IDEwLAorICBQU19CQU5EU19NSUQgICAgID0gMjAsCisgIFBTX01BWF9CQU5EUyAgICAgPSBQU19CQU5EU19NSUQKK30gUFNfQkFORFM7CisKK3R5cGVkZWYgZW51bSB7CisgIFBTX0lJRF9SRVNfQ09BUlNFPTAsCisgIFBTX0lJRF9SRVNfRklORQorfSBQU19JSURfUkVTT0xVVElPTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgUFNfSUNDX1JPVF9BPTAsCisgIFBTX0lDQ19ST1RfQgorfSBQU19JQ0NfUk9UQVRJT05fTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgUFNfREVMVEFfRlJFUSwKKyAgUFNfREVMVEFfVElNRQorfSBQU19ERUxUQTsKKworCit0eXBlZGVmIGVudW0geworICBQU19NQVhfRU5WRUxPUEVTID0gNAorCit9IFBTX0NPTlNUUzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBQU0VOQ19PSyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCisgICAgUFNFTkNfSU5WQUxJRF9IQU5ETEUgICAgICAgID0gMHgwMDIwLCAgIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICAgIFBTRU5DX01FTU9SWV9FUlJPUiAgICAgICAgICA9IDB4MDAyMSwgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKyAgICBQU0VOQ19JTklUX0VSUk9SICAgICAgICAgICAgPSAweDAwNDAsICAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICAgIFBTRU5DX0VOQ09ERV9FUlJPUiAgICAgICAgICA9IDB4MDA2MCAgICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLworCit9IEZES19QU0VOQ19FUlJPUjsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwCkBAIC0wLDAgKzEsMTA1NCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBBdXRob3JzOiAgICAgIE0uIE5ldWVuZG9yZiwgTi4gUmV0dGVsYmFjaCwgTS4gTXVsdHJ1cworICAgQ29udGVudHMvRGVzY3JpcHRpb246IFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBQUyBwYXJhbWV0ZXIgZXh0cmFjdGlvbiwgZW5jb2RpbmcgZnVuY3Rpb25zICAKKyovCisKKyNpbmNsdWRlICJwc19tYWluLmgiCisKKworI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJwc19lbmNvZGUuaCIKKworI2luY2x1ZGUgInFtZi5oIgorCisjaW5jbHVkZSAicHNfY29uc3QuaCIKKyNpbmNsdWRlICJzYnJfbWlzYy5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworaW5saW5lIHZvaWQgRkRLc2JyRW5jX2FkZEZJWFBfREJMKGNvbnN0IEZJWFBfREJMICpYLCBjb25zdCBGSVhQX0RCTCAqWSwgRklYUF9EQkwgKlosIElOVCBuKQoreworICBmb3IgKElOVCBpPTA7IGk8bjsgaSsrKQorICAgIFpbaV0gPSAoWFtpXT4+MSkgKyAoWVtpXT4+MSk7Cit9CisKKyNkZWZpbmUgTE9HMTBfMl8xMCAgICAgICAgICAgICAzLjAxMDI5OTk1NjY0ZiAvKiAxMC4wZipsb2cxMCgyLmYpICovCisKK3N0YXRpYyBjb25zdCBJTlQgaWlkR3JvdXBCb3JkZXJzTG9SZXNbUU1GX0dST1VQU19MT19SRVMgKyBTVUJRTUZfR1JPVVBTX0xPX1JFUyArIDFdID0KK3sKKyAgMCwgMSwgMiwgMywgNCwgNSwgICAgLyogNiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KKyAgNiwgNywgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KKyAgOCwgOSwgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KKyAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMSwgMjUsIDMwLCA0MiwgNzEKK307CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBpaWRHcm91cFdpZHRoTGRMb1Jlc1tRTUZfR1JPVVBTX0xPX1JFUyArIFNVQlFNRl9HUk9VUFNfTE9fUkVTXSA9Cit7CisgIDAsIDAsIDAsIDAsIDAsIDAsCisgIDAsIDAsCisgIDAsIDAsCisgIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDIsIDIsIDMsIDQsIDUKK307CisKKworc3RhdGljIGNvbnN0IElOVCBzdWJiYW5kMnBhcmFtZXRlcjIwW1FNRl9HUk9VUFNfTE9fUkVTICsgU1VCUU1GX0dST1VQU19MT19SRVNdID0KK3sKKyAgMSwgMCwgMCwgMSwgMiwgMywgICAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLworICA0LCA1LCAgICAgICAgICAgICAgIC8qIDIgc3VicW1mIHN1YmJhbmRzIC0gMXN0IHFtZiBzdWJiYW5kICovCisgIDYsIDcsICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KKyAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTkKK307CisKKwordHlwZWRlZiBlbnVtIHsKKyAgTUFYX1RJTUVfRElGRl9GUkFNRVMgPSAyMCwKKyAgTUFYX1BTX05PSEVBREVSX0NOVCAgPSAxMCwKKyAgTUFYX05PRU5WX0NOVCAgICAgICAgPSAxMCwKKyAgRE9fTk9UX1VTRV9USElTX01PREUgPSAweDdGRkZGRgorfSBfX1BTX0NPTlNUQU5UUzsKKworCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpaWRRdWFudF9meFsxNV0gPSB7CisgIDB4Y2UwMDAwMDAsIDB4ZGMwMDAwMDAsIDB4ZTQwMDAwMDAsIDB4ZWMwMDAwMDAsIDB4ZjIwMDAwMDAsIDB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIDB4MDAwMDAwMDAsCisgIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MGUwMDAwMDAsIDB4MTQwMDAwMDAsIDB4MWMwMDAwMDAsIDB4MjQwMDAwMDAsIDB4MzIwMDAwMDAKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpaWRRdWFudEZpbmVfZnhbMzFdID0geworICAweDljMDAwMDAxLCAweGE2MDAwMDAxLCAweGIwMDAwMDAxLCAweGJhMDAwMDAxLCAweGM0MDAwMDAwLCAweGNlMDAwMDAwLCAweGQ0MDAwMDAwLCAweGRhMDAwMDAwLAorICAweGUwMDAwMDAwLCAweGU2MDAwMDAwLCAweGVjMDAwMDAwLCAweGYwMDAwMDAwLCAweGY0MDAwMDAwLCAweGY4MDAwMDAwLCAweGZjMDAwMDAwLCAweDAwMDAwMDAwLAorICAweDA0MDAwMDAwLCAweDA4MDAwMDAwLCAweDBjMDAwMDAwLCAweDEwMDAwMDAwLCAweDE0MDAwMDAwLCAweDFhMDAwMDAwLCAweDIwMDAwMDAwLCAweDI2MDAwMDAwLAorICAweDJjMDAwMDAwLCAweDMyMDAwMDAwLCAweDNjMDAwMDAwLCAweDQ1ZmZmZmZmLCAweDRmZmZmZmZmLCAweDU5ZmZmZmZmLCAweDYzZmZmZmZmCit9OworCisKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGljY1F1YW50WzhdID0geworICAweDdmZmZmZmZmLCAweDc3ZWY5ZDdmLCAweDZiYWJjOTdmLCAweDRjZWFmMjdmLCAweDJmMGVkM2MwLCAweDAwMDAwMDAwLCAweGI0OWJhNjAxLCAweDgwMDAwMDAwCit9OworCitzdGF0aWMgRkRLX1BTRU5DX0VSUk9SIEluaXRQU0RhdGEoCisgICAgICAgIEhBTkRMRV9QU19EQVRBICAgICAgICAgICAgaFBzRGF0YQorICAgICAgICApCit7CisgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOworCisgIGlmKGhQc0RhdGEgPT0gTlVMTCkgeworICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGksIGVudjsKKyAgICBGREttZW1jbGVhcihoUHNEYXRhLHNpemVvZihQU19EQVRBKSk7CisKKyAgICBmb3IgKGk9MDsgaTxQU19NQVhfQkFORFM7IGkrKykgeworICAgICAgaFBzRGF0YS0+aWlkSWR4TGFzdFtpXSA9IDA7CisgICAgICBoUHNEYXRhLT5pY2NJZHhMYXN0W2ldID0gMDsKKyAgICB9CisKKyAgICBoUHNEYXRhLT5paWRFbmFibGUgICAgPSBoUHNEYXRhLT5paWRFbmFibGVMYXN0ID0gMDsKKyAgICBoUHNEYXRhLT5pY2NFbmFibGUgICAgPSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0ID0gMDsKKyAgICBoUHNEYXRhLT5paWRRdWFudE1vZGUgPSBoUHNEYXRhLT5paWRRdWFudE1vZGVMYXN0ID0gUFNfSUlEX1JFU19DT0FSU0U7CisgICAgaFBzRGF0YS0+aWNjUXVhbnRNb2RlID0gaFBzRGF0YS0+aWNjUXVhbnRNb2RlTGFzdCA9IFBTX0lDQ19ST1RfQTsKKworICAgIGZvcihlbnY9MDsgZW52PFBTX01BWF9FTlZFTE9QRVM7IGVudisrKSB7CisgICAgICBoUHNEYXRhLT5pY2NEaWZmTW9kZVtlbnZdID0gUFNfREVMVEFfRlJFUTsKKyAgICAgIGhQc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROworCisgICAgICBmb3IgKGk9MDsgaTxQU19NQVhfQkFORFM7IGkrKykgeworICAgICAgICBoUHNEYXRhLT5paWRJZHhbZW52XVtpXSA9IDA7CisgICAgICAgIGhQc0RhdGEtPmljY0lkeFtlbnZdW2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBoUHNEYXRhLT5uRW52ZWxvcGVzTGFzdCA9IDA7CisKKyAgICBoUHNEYXRhLT5oZWFkZXJDbnQgID0gTUFYX1BTX05PSEVBREVSX0NOVDsKKyAgICBoUHNEYXRhLT5paWRUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7CisgICAgaFBzRGF0YS0+aWNjVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOworICAgIGhQc0RhdGEtPm5vRW52Q250ICAgPSBNQVhfTk9FTlZfQ05UOworICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRklYUF9EQkwgcXVhbnRpemVDb2VmKCBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHF1YW50VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgaWR4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5RdWFudFN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHF1YW50T3V0KQoreworICBJTlQgaWR4LCBiYW5kOworICBGSVhQX0RCTCBxdWFudEVyciA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgZm9yIChiYW5kPTA7IGJhbmQ8bkJhbmRzO2JhbmQrKykgeworICAgIGZvcihpZHg9MDsgaWR4PG5RdWFudFN0ZXBzLTE7IGlkeCsrKXsKKyAgICAgIGlmKCBmaXhwX2FicygoaW5wdXRbYmFuZF0+PjEpLShxdWFudFRhYmxlW2lkeCsxXT4+MSkpID4KKyAgICAgICAgICBmaXhwX2FicygoaW5wdXRbYmFuZF0+PjEpLShxdWFudFRhYmxlW2lkeF0+PjEpKSApCisgICAgICB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBxdWFudEVyciAgICAgICs9IChmaXhwX2FicyhpbnB1dFtiYW5kXS1xdWFudFRhYmxlW2lkeF0pPj5QU19RVUFOVF9TQ0FMRSk7ICAgLyogZG9uJ3Qgc2NhbGUgYmVmb3JlIHN1YnRyYWN0aW9uOyBkaWZmIHNtYWxsZXIgKDY0LTI1KS82NCAqLworICAgIHF1YW50T3V0W2JhbmRdID0gaWR4IC0gaWR4T2Zmc2V0OworICB9CisKKyAgcmV0dXJuIHF1YW50RXJyOworfQorCitzdGF0aWMgSU5UIGdldElDQ01vZGUoY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcm90VHlwZSkKK3sKKyAgSU5UIG1vZGUgPSAwOworCisgIHN3aXRjaChuQmFuZHMpIHsKKyAgY2FzZSBQU19CQU5EU19DT0FSU0U6CisgICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7CisgICAgYnJlYWs7CisgIGNhc2UgUFNfQkFORFNfTUlEOgorICAgIG1vZGUgPSBQU19SRVNfTUlEOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIG1vZGUgPSAwOworICB9CisgIGlmKHJvdFR5cGU9PVBTX0lDQ19ST1RfQil7CisgICAgbW9kZSArPSAzOworICB9CisKKyAgcmV0dXJuIG1vZGU7Cit9CisKKworc3RhdGljIElOVCBnZXRJSURNb2RlKGNvbnN0IElOVCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlpZFJlcykKK3sKKyAgSU5UIG1vZGUgPSAwOworCisgIHN3aXRjaChuQmFuZHMpIHsKKyAgY2FzZSBQU19CQU5EU19DT0FSU0U6CisgICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7CisgICAgYnJlYWs7CisgIGNhc2UgUFNfQkFORFNfTUlEOgorICAgIG1vZGUgPSBQU19SRVNfTUlEOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIG1vZGUgPSAwOworICAgIGJyZWFrOworICB9CisKKyAgaWYoaWlkUmVzID09IFBTX0lJRF9SRVNfRklORSl7CisgICAgbW9kZSArPSAzOworICB9CisKKyAgcmV0dXJuIG1vZGU7Cit9CisKKworc3RhdGljIElOVCBlbnZlbG9wZVJlZHVjaWJsZShGSVhQX0RCTCBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkVudmVsb3BlcykKK3sKKyAgI2RlZmluZSBUSFJFU0hfU0NBTEUgICAgIDcKKworICBJTlQgcmVkdWNpYmxlID0gMTsgLyogdHJ1ZSAqLworICBJTlQgZSA9IDAsIGIgPSAwOworICBGSVhQX0RCTCBkSWlkID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgRklYUF9EQkwgZEljYyA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgRklYUF9EQkwgaWlkRXJyVGhyZXNob2xkLCBpY2NFcnJUaHJlc2hvbGQ7CisgIEZJWFBfREJMIGlpZE1lYW5FcnJvciwgaWNjTWVhbkVycm9yOworCisgIC8qIHNxdWFyZSB2YWx1ZXMgdG8gcHJldmVudCBzcXJ0LAorICAgICBtdWx0aXBseSBiYW5kcyB0byBwcmV2ZW50IGRpdmlzaW9uOyBiYW5kcyBzaGlmdGVkIERGUkFDVF9CSVRTIGluc3RlYWQgKERGUkFDVF9CSVRTLTEpIGJlY2F1c2UgZk11bHREaXYyIHVzZWQqLworICBpaWRFcnJUaHJlc2hvbGQgPSBmTXVsdERpdjIgKCBGTDJGWENPTlNUX0RCTCg2LjVmKjYuNWYvKElJRF9TQ0FMRV9GVCpJSURfU0NBTEVfRlQpKSwgKEZJWFBfREJMKShwc0JhbmRzPDwoKERGUkFDVF9CSVRTKS1USFJFU0hfU0NBTEUpKSApOworICBpY2NFcnJUaHJlc2hvbGQgPSBmTXVsdERpdjIgKCBGTDJGWENPTlNUX0RCTCgwLjc1ZiowLjc1ZiksICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShwc0JhbmRzPDwoKERGUkFDVF9CSVRTKS1USFJFU0hfU0NBTEUpKSApOworCisgIGlmIChuRW52ZWxvcGVzIDw9IDEpIHsKKyAgICByZWR1Y2libGUgPSAwOworICB9IGVsc2UgeworCisgICAgLyogbWVhbiBlcnJvciBjcml0ZXJpb24gKi8KKyAgICBmb3IgKGU9MDsgKGUgPCBuRW52ZWxvcGVzLzIpICYmIChyZWR1Y2libGUhPTAgKSA7IGUrKykgeworICAgICAgaWlkTWVhbkVycm9yID0gaWNjTWVhbkVycm9yID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIGZvcihiPTA7IGI8cHNCYW5kczsgYisrKSB7CisgICAgICAgIGRJaWQgPSAoaWlkWzIqZV1bYl0+PjEpIC0gKGlpZFsyKmUrMV1bYl0+PjEpOyAgIC8qIHNjYWxlIDEgYml0OyBzcXVhcmVkIC0+IDIgYml0ICovCisgICAgICAgIGRJY2MgPSAoaWNjWzIqZV1bYl0+PjEpIC0gKGljY1syKmUrMV1bYl0+PjEpOworICAgICAgICBpaWRNZWFuRXJyb3IgKz0gZlBvdzJEaXYyKGRJaWQpPj4oNS0xKTsgICAgLyogKyAoYmFuZHM9MjApIHNjYWxlID0gNSAqLworICAgICAgICBpY2NNZWFuRXJyb3IgKz0gZlBvdzJEaXYyKGRJY2MpPj4oNS0xKTsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0+IHNjYWxpbmcgPSA3IGJpdCA9IFRIUkVTSF9TQ0FMRSAhISAqLworCisgICAgICAvKiBpbnN0ZWFkIHNxcnQgdmFsdWVzIGFyZSBzcXVhcmVkIQorICAgICAgICAgaW5zdGVhZCBvZiBkaXZpc2lvbiwgbXVsdGlwbHkgdGhyZXNob2xkIHdpdGggcHNCYW5kcworICAgICAgICAgc2NhbGluZyBuZWNlc3NhcnkhISAqLworCisgICAgICAvKiBxdWl0IGFzIHNvb24gYXMgdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KKyAgICAgIGlmICggKGlpZE1lYW5FcnJvciA+IChpaWRFcnJUaHJlc2hvbGQpKSB8fAorICAgICAgICAgICAoaWNjTWVhbkVycm9yID4gKGljY0VyclRocmVzaG9sZCkpICkgeworICAgICAgICByZWR1Y2libGUgPSAwOworICAgICAgfQorICAgIH0KKyAgfSAvKiBuRW52ZWxvcGVzICE9IDEgKi8KKworICByZXR1cm4gcmVkdWNpYmxlOworfQorCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NJaWREYXRhKFBTX0RBVEEgICAgICAgKnBzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgcHNCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIG5FbnZlbG9wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBxdWFudEVycm9yVGhyZXNob2xkKQoreworICBJTlQgaWlkSWR4RmluZSAgW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCBpaWRJZHhDb2Fyc2VbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKworICBGSVhQX0RCTCBlcnJJSUQgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBGSVhQX0RCTCBlcnJJSURGaW5lID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgSU5UICAgYml0c0lpZEZyZXEgPSAwOworICBJTlQgICBiaXRzSWlkVGltZSA9IDA7CisgIElOVCAgIGJpdHNGaW5lVG90ID0gMDsKKyAgSU5UICAgYml0c0NvYXJzZVRvdCA9IDA7CisgIElOVCAgIGVycm9yID0gMDsKKyAgSU5UICAgZW52LCBiYW5kOworICBJTlQgICBkaWZmTW9kZVtQU19NQVhfRU5WRUxPUEVTXSwgZGlmZk1vZGVGaW5lW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgbG91ZG5EaWZmID0gMDsKKyAgSU5UIGlpZFRyYW5zbWl0ID0gMDsKKworICBiaXRzSWlkRnJlcSA9IGJpdHNJaWRUaW1lID0gMDsKKworICAvKiBRdWFudGl6ZSBJSUQgY29lZmZpY2llbnRzICovCisgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBlcnJJSUQgICAgICs9IHF1YW50aXplQ29lZihpaWRbZW52XSwgcHNCYW5kcywgaWlkUXVhbnRfZngsICAgICAgNywgMTUsIGlpZElkeENvYXJzZVtlbnZdKTsKKyAgICBlcnJJSURGaW5lICs9IHF1YW50aXplQ29lZihpaWRbZW52XSwgcHNCYW5kcywgaWlkUXVhbnRGaW5lX2Z4LCAxNSwgMzEsIGlpZElkeEZpbmVbZW52XSk7CisgIH0KKworICAvKiBub3JtYWxpemUgZXJyb3IgdG8gbnVtYmVyIG9mIGVudmVsb3BlcywgcHMgYmFuZHMKKyAgICAgZXJySUlEIC89IHBzQmFuZHMqbkVudmVsb3BlczsKKyAgICAgZXJySUlERmluZSAvPSBwc0JhbmRzKm5FbnZlbG9wZXM7ICovCisKKworICAvKiBDaGVjayBpZiBJSUQgY29lZmZpY2llbnRzIHNob3VsZCBiZSB1c2VkIGluIHRoaXMgZnJhbWUgKi8KKyAgcHNEYXRhLT5paWRFbmFibGUgPSAwOworICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yKGJhbmQ9MDtiYW5kPHBzQmFuZHM7YmFuZCsrKSB7CisgICAgICBsb3VkbkRpZmYgICArPSBmaXhwX2FicyhpaWRJZHhDb2Fyc2VbZW52XVtiYW5kXSk7CisgICAgICBpaWRUcmFuc21pdCArKzsKKyAgICB9CisgIH0KKworICBpZihsb3VkbkRpZmYgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC43ZiksaWlkVHJhbnNtaXQpKXsgICAgLyogMC43ZiBlbXBpcmljIHZhbHVlICovCisgICAgcHNEYXRhLT5paWRFbmFibGUgPSAxOworICB9CisKKyAgLyogaWYgaWlkIG5vdCBhY3RpdmUgLT4gUkVTRVQgZGF0YSAqLworICBpZihwc0RhdGEtPmlpZEVuYWJsZT09MCkgeworICAgIHBzRGF0YS0+aWlkVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOworICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgIHBzRGF0YS0+aWlkRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CisgICAgICBGREttZW1jbGVhcihwc0RhdGEtPmlpZElkeFtlbnZdLCBzaXplb2YoSU5UKSpwc0JhbmRzKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLyogY291bnQgQ09BUlNFIHF1YW50aXphdGlvbiBiaXRzIGZvciBmaXJzdCBlbnZlbG9wZSovCisgIGJpdHNJaWRGcmVxID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbMF0sIE5VTEwsIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworCisgIGlmKCAocHNEYXRhLT5paWRUaW1lQ250Pj1NQVhfVElNRV9ESUZGX0ZSQU1FUykgfHwgKHBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdD09UFNfSUlEX1JFU19GSU5FKSApIHsKKyAgICBiaXRzSWlkVGltZSAgICAgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKKyAgfQorICBlbHNlIHsKKyAgICBiaXRzSWlkVGltZSAgICAgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeENvYXJzZVswXSwgcHNEYXRhLT5paWRJZHhMYXN0LCBwc0JhbmRzLCBQU19JSURfUkVTX0NPQVJTRSwgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKKyAgfQorCisgIC8qIGRlY2lzaW9uIERFTFRBX0ZSRVEgdnMgREVMVEFfVElNRSAqLworICBpZihiaXRzSWlkVGltZT5iaXRzSWlkRnJlcSkgeworICAgIGRpZmZNb2RlWzBdICAgPSBQU19ERUxUQV9GUkVROworICAgIGJpdHNDb2Fyc2VUb3QgPSBiaXRzSWlkRnJlcTsKKyAgfQorICBlbHNlIHsKKyAgICBkaWZmTW9kZVswXSAgID0gUFNfREVMVEFfVElNRTsKKyAgICBiaXRzQ29hcnNlVG90ID0gYml0c0lpZFRpbWU7CisgIH0KKworICAvKiBjb3VudCBDT0FSU0UgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZvbGxvd2luZyBlbnZlbG9wZXMqLworICBmb3IoZW52PTE7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgYml0c0lpZEZyZXEgID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbZW52XSwgTlVMTCwgICAgICAgICAgICAgICAgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CisgICAgYml0c0lpZFRpbWUgID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbZW52XSwgaWlkSWR4Q29hcnNlW2Vudi0xXSwgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisKKyAgICAvKiBkZWNpc2lvbiBERUxUQV9GUkVRIHZzIERFTFRBX1RJTUUgKi8KKyAgICBpZihiaXRzSWlkVGltZT5iaXRzSWlkRnJlcSkgeworICAgICAgZGlmZk1vZGVbZW52XSAgPSBQU19ERUxUQV9GUkVROworICAgICAgYml0c0NvYXJzZVRvdCArPSBiaXRzSWlkRnJlcTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkaWZmTW9kZVtlbnZdICA9IFBTX0RFTFRBX1RJTUU7CisgICAgICBiaXRzQ29hcnNlVG90ICs9IGJpdHNJaWRUaW1lOworICAgIH0KKyAgfQorCisKKyAgLyogY291bnQgRklORSBxdWFudGl6YXRpb24gYml0cyBmb3IgZmlyc3QgZW52ZWxvcGUqLworICBiaXRzSWlkRnJlcSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4RmluZVswXSwgICBOVUxMLCBwc0JhbmRzLCBQU19JSURfUkVTX0ZJTkUsICAgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKKworICBpZiggKHBzRGF0YS0+aWlkVGltZUNudD49TUFYX1RJTUVfRElGRl9GUkFNRVMpIHx8IChwc0RhdGEtPmlpZFF1YW50TW9kZUxhc3Q9PVBTX0lJRF9SRVNfQ09BUlNFKSApIHsKKyAgICBiaXRzSWlkVGltZSA9IERPX05PVF9VU0VfVEhJU19NT0RFOworICB9CisgIGVsc2UgeworICAgIGJpdHNJaWRUaW1lID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lWzBdLCAgcHNEYXRhLT5paWRJZHhMYXN0LCBwc0JhbmRzLCBQU19JSURfUkVTX0ZJTkUsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisgIH0KKworICAvKiBkZWNpc2lvbiBERUxUQV9GUkVRIHZzIERFTFRBX1RJTUUgKi8KKyAgaWYoYml0c0lpZFRpbWU+Yml0c0lpZEZyZXEpIHsKKyAgICBkaWZmTW9kZUZpbmVbMF0gICA9IFBTX0RFTFRBX0ZSRVE7CisgICAgYml0c0ZpbmVUb3QgICAgICAgPSBiaXRzSWlkRnJlcTsKKyAgfQorICBlbHNlIHsKKyAgICBkaWZmTW9kZUZpbmVbMF0gICA9IFBTX0RFTFRBX1RJTUU7CisgICAgYml0c0ZpbmVUb3QgICAgICAgPSBiaXRzSWlkVGltZTsKKyAgfQorCisgIC8qIGNvdW50IEZJTkUgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZvbGxvd2luZyBlbnZlbG9wZXMqLworICBmb3IoZW52PTE7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbZW52XSwgICBOVUxMLCAgICAgICAgICAgICAgcHNCYW5kcywgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworICAgIGJpdHNJaWRUaW1lID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lW2Vudl0sICAgaWlkSWR4RmluZVtlbnYtMV0sIHBzQmFuZHMsIFBTX0lJRF9SRVNfRklORSwgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKKworICAgIC8qIGRlY2lzaW9uIERFTFRBX0ZSRVEgdnMgREVMVEFfVElNRSAqLworICAgIGlmKGJpdHNJaWRUaW1lPmJpdHNJaWRGcmVxKSB7CisgICAgICBkaWZmTW9kZUZpbmVbZW52XSAgPSBQU19ERUxUQV9GUkVROworICAgICAgYml0c0ZpbmVUb3QgKz0gYml0c0lpZEZyZXE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZGlmZk1vZGVGaW5lW2Vudl0gID0gUFNfREVMVEFfVElNRTsKKyAgICAgIGJpdHNGaW5lVG90ICAgICAgICs9IGJpdHNJaWRUaW1lOworICAgIH0KKyAgfQorCisgIGlmKGJpdHNGaW5lVG90ID09IGJpdHNDb2Fyc2VUb3QpeworICAgIC8qIGlmIHNhbWUgbnVtYmVyIG9mIGJpdHMgaXMgbmVlZGVkLCB1c2UgdGhlIHF1YW50aXphdGlvbiB3aXRoIGxvd2VyIGVycm9yICovCisgICAgaWYoZXJySUlERmluZSA8IGVycklJRCl7CisgICAgICBiaXRzQ29hcnNlVG90ID0gRE9fTk9UX1VTRV9USElTX01PREU7CisgICAgfSBlbHNlIHsKKyAgICAgIGJpdHNGaW5lVG90ID0gRE9fTk9UX1VTRV9USElTX01PREU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGNvbnN0IEZJWFBfREJMIG1pblRocmVzaG9sZCA9IEZMMkZYQ09OU1RfREJMKDAuMmYvKElJRF9TQ0FMRV9GVCpQU19RVUFOVF9TQ0FMRV9GVCkqKHBzQmFuZHMqbkVudmVsb3BlcykpOyAqLworICAgIGNvbnN0IEZJWFBfREJMIG1pblRocmVzaG9sZCA9IChGSVhQX0RCTCkoKExPTkcpMHgwMDAxOTk5OSAqIChwc0JhbmRzKm5FbnZlbG9wZXMpKTsKKworICAgIC8qIGRlY2lzaW9uIFJFU19GSU5FIHZzIFJFU19DT0FSU0UgICAgICAgICAgICAgICAgICovCisgICAgLyogdGVzdCBpZiBlcnJJSURGaW5lKnF1YW50RXJyb3JUaHJlc2hvbGQgPCBlcnJJSUQgKi8KKyAgICAvKiBzaGlmdFZhbCAyIGNvbWVzIGZyb20gc2NhbGluZyBvZiBxdWFudEVycm9yVGhyZXNob2xkICovCisgICAgaWYoZml4TWF4KCgoZXJySUlERmluZT4+MSkrKG1pblRocmVzaG9sZD4+MSkpPj4xLCBmTXVsdChxdWFudEVycm9yVGhyZXNob2xkLGVycklJREZpbmUpKSA8IChlcnJJSUQ+PjIpICkgeworICAgICAgYml0c0NvYXJzZVRvdCA9IERPX05PVF9VU0VfVEhJU19NT0RFOworICAgIH0KKyAgICBlbHNlIGlmKGZpeE1heCgoKGVycklJRD4+MSkrKG1pblRocmVzaG9sZD4+MSkpPj4xLCBmTXVsdChxdWFudEVycm9yVGhyZXNob2xkLGVycklJRCkpIDwgKGVycklJREZpbmU+PjIpICkgeworICAgICAgYml0c0ZpbmVUb3QgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKKyAgICB9CisgIH0KKworICAvKiBkZWNpc2lvbiBSRVNfRklORSB2cyBSRVNfQ09BUlNFICovCisgIGlmKGJpdHNGaW5lVG90PGJpdHNDb2Fyc2VUb3QpIHsKKyAgICBwc0RhdGEtPmlpZFF1YW50TW9kZSA9IFBTX0lJRF9SRVNfRklORTsKKyAgICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl0gPSBkaWZmTW9kZUZpbmVbZW52XTsKKyAgICAgIEZES21lbWNweShwc0RhdGEtPmlpZElkeFtlbnZdLCBpaWRJZHhGaW5lW2Vudl0sIHBzQmFuZHMqc2l6ZW9mKElOVCkpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBwc0RhdGEtPmlpZFF1YW50TW9kZSA9IFBTX0lJRF9SRVNfQ09BUlNFOworICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgIHBzRGF0YS0+aWlkRGlmZk1vZGVbZW52XSA9IGRpZmZNb2RlW2Vudl07CisgICAgICBGREttZW1jcHkocHNEYXRhLT5paWRJZHhbZW52XSwgaWlkSWR4Q29hcnNlW2Vudl0sIHBzQmFuZHMqc2l6ZW9mKElOVCkpOworICAgIH0KKyAgfQorCisgIC8qIENvdW50IERFTFRBX1RJTUUgZW5jb2Rpbmcgc3RyZWFrcyAqLworICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgaWYocHNEYXRhLT5paWREaWZmTW9kZVtlbnZdPT1QU19ERUxUQV9USU1FKQorICAgICAgcHNEYXRhLT5paWRUaW1lQ250Kys7CisgICAgZWxzZQorICAgICAgcHNEYXRhLT5paWRUaW1lQ250PTA7CisgIH0KK30KKworCitzdGF0aWMgSU5UIHNpbWlsYXJJaWQoUFNfREFUQSAgICpwc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgbkVudmVsb3BlcykKK3sKKyAgY29uc3QgSU5UIGRpZmZUaHIgPSAocHNEYXRhLT5paWRRdWFudE1vZGUgPT0gUFNfSUlEX1JFU19DT0FSU0UpID8gMiA6IDM7CisgIGNvbnN0IElOVCBzdW1EaWZmVGhyID0gZGlmZlRociAqIHBzQmFuZHMvNDsKKyAgSU5UIHNpbWlsYXIgPSAwOworICBJTlQgZGlmZiAgICA9IDA7CisgIElOVCBzdW1EaWZmID0gMDsKKyAgSU5UIGVudiA9IDA7CisgIElOVCBiICAgPSAwOworICBpZiAoKG5FbnZlbG9wZXMgPT0gcHNEYXRhLT5uRW52ZWxvcGVzTGFzdCkgJiYgKG5FbnZlbG9wZXM9PTEpKSB7CisgICAgc2ltaWxhciA9IDE7CisgICAgZm9yIChlbnY9MDsgZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBzdW1EaWZmID0gMDsKKyAgICAgIGIgPSAwOworICAgICAgZG8geworICAgICAgICBkaWZmID0gZml4cF9hYnMocHNEYXRhLT5paWRJZHhbZW52XVtiXSAtIHBzRGF0YS0+aWlkSWR4TGFzdFtiXSk7CisgICAgICAgIHN1bURpZmYgKz0gZGlmZjsKKyAgICAgICAgaWYgKCAoZGlmZiA+IGRpZmZUaHIpIC8qIG1vcmUgdGhhbiB4IHF1YW50aXphdGlvbiBzdGVwcyBpbiBhbnkgYmFuZCAqLworICAgICAgICAgICAgIHx8IChzdW1EaWZmID4gc3VtRGlmZlRocikgKSB7ICAvKiBtb3JlIHRoYW4geCBxdWFudGlzYXRpb25zIHN0ZXBzIG92ZXJhbGwgZGlmZmVyZW5jZSAqLworICAgICAgICAgIHNpbWlsYXIgPSAwOworICAgICAgICB9CisgICAgICAgIGIrKzsKKyAgICAgIH0gd2hpbGUgKChiPHBzQmFuZHMpICYmIChzaW1pbGFyPjApKTsKKyAgICB9CisgIH0gLyogbkVudmVsb3Blcz09MSAgKi8KKworICByZXR1cm4gc2ltaWxhcjsKK30KKworCitzdGF0aWMgSU5UIHNpbWlsYXJJY2MoUFNfREFUQSAqcHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBuRW52ZWxvcGVzKQoreworICBjb25zdCBJTlQgZGlmZlRociA9IDI7CisgIGNvbnN0IElOVCBzdW1EaWZmVGhyID0gZGlmZlRociAqIHBzQmFuZHMvNDsKKyAgSU5UIHNpbWlsYXIgPSAwOworICBJTlQgZGlmZiAgICA9IDA7CisgIElOVCBzdW1EaWZmID0gMDsKKyAgSU5UIGVudiA9IDA7CisgIElOVCBiICAgPSAwOworICBpZiAoKG5FbnZlbG9wZXMgPT0gcHNEYXRhLT5uRW52ZWxvcGVzTGFzdCkgJiYgKG5FbnZlbG9wZXM9PTEpKSB7CisgICAgc2ltaWxhciA9IDE7CisgICAgZm9yIChlbnY9MDsgZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBzdW1EaWZmID0gMDsKKyAgICAgIGIgPSAwOworICAgICAgZG8geworICAgICAgICBkaWZmID0gZml4cF9hYnMocHNEYXRhLT5pY2NJZHhbZW52XVtiXSAtIHBzRGF0YS0+aWNjSWR4TGFzdFtiXSk7CisgICAgICAgIHN1bURpZmYgKz0gZGlmZjsKKyAgICAgICAgaWYgKCAoZGlmZiA+IGRpZmZUaHIpIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbiBzdGVwIGluIGFueSBiYW5kICovCisgICAgICAgICAgICAgfHwgKHN1bURpZmYgPiBzdW1EaWZmVGhyKSApIHsgIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbnMgc3RlcHMgb3ZlcmFsbCBkaWZmZXJlbmNlICovCisgICAgICAgICAgc2ltaWxhciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYisrOworICAgICAgfSB3aGlsZSAoKGI8cHNCYW5kcykgJiYgKHNpbWlsYXI+MCkpOworICAgIH0KKyAgfSAvKiBuRW52ZWxvcGVzPT0xICAqLworCisgIHJldHVybiBzaW1pbGFyOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzSWNjRGF0YShQU19EQVRBICAgKnBzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sIC8qIGNvbnN0IGlucHV0IHZhbHVlczogdW5hYmxlIHRvIGRlY2xhcmUgYXMgY29uc3QsIHNpbmNlIGl0IGRvZXMgbm90IHBvSU5UIHRvIGNvbnN0IG1lbW9yeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBuRW52ZWxvcGVzKQoreworICBGSVhQX0RCTCBlcnJJQ0MgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBJTlQgICBlbnYsIGJhbmQ7CisgIElOVCAgIGJpdHNJY2NGcmVxLCBiaXRzSWNjVGltZTsKKyAgSU5UICAgZXJyb3IgPSAwOworICBJTlQgICBpbkNvaGVyZW5jZT0wLCBpY2NUcmFuc21pdD0wOworICBJTlQgICppY2NJZHhMYXN0OworCisgIGljY0lkeExhc3QgPSBwc0RhdGEtPmljY0lkeExhc3Q7CisKKyAgLyogUXVhbnRpemUgSUNDIGNvZWZmaWNpZW50cyAqLworICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZXJySUNDICs9IHF1YW50aXplQ29lZihpY2NbZW52XSwgcHNCYW5kcywgaWNjUXVhbnQsIDAsIDgsIHBzRGF0YS0+aWNjSWR4W2Vudl0pOworICB9CisKKyAgLyogQ2hlY2sgaWYgSUNDIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgdXNlZCAqLworICBwc0RhdGEtPmljY0VuYWJsZSA9IDA7CisgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IoYmFuZD0wO2JhbmQ8cHNCYW5kcztiYW5kKyspIHsKKyAgICAgIGluQ29oZXJlbmNlICs9IHBzRGF0YS0+aWNjSWR4W2Vudl1bYmFuZF07CisgICAgICBpY2NUcmFuc21pdCArKzsKKyAgICB9CisgIH0KKyAgaWYoaW5Db2hlcmVuY2UgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC41ZiksaWNjVHJhbnNtaXQpKXsgICAvKiAwLjVmIGVtcGlyaWMgdmFsdWUgKi8KKyAgICBwc0RhdGEtPmljY0VuYWJsZSA9IDE7CisgIH0KKworICBpZihwc0RhdGEtPmljY0VuYWJsZT09MCkgeworICAgIHBzRGF0YS0+aWNjVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOworICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgIHBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CisgICAgICBGREttZW1jbGVhcihwc0RhdGEtPmljY0lkeFtlbnZdLCBzaXplb2YoSU5UKSpwc0JhbmRzKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGJpdHNJY2NGcmVxICA9IEZES3NickVuY19FbmNvZGVJY2MoTlVMTCwgcHNEYXRhLT5pY2NJZHhbZW52XSwgICBOVUxMLCAgICAgICBwc0JhbmRzLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworCisgICAgaWYocHNEYXRhLT5pY2NUaW1lQ250PE1BWF9USU1FX0RJRkZfRlJBTUVTKSB7CisgICAgICBiaXRzSWNjVGltZSAgPSBGREtzYnJFbmNfRW5jb2RlSWNjKE5VTEwsIHBzRGF0YS0+aWNjSWR4W2Vudl0sIGljY0lkeExhc3QsIHBzQmFuZHMsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYml0c0ljY1RpbWUgID0gRE9fTk9UX1VTRV9USElTX01PREU7CisgICAgfQorCisgICAgaWYoYml0c0ljY0ZyZXE+Yml0c0ljY1RpbWUpIHsKKyAgICAgIHBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX1RJTUU7CisgICAgICBwc0RhdGEtPmljY1RpbWVDbnQrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROworICAgICAgcHNEYXRhLT5pY2NUaW1lQ250PTA7CisgICAgfQorICAgIGljY0lkeExhc3QgPSBwc0RhdGEtPmljY0lkeFtlbnZdOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUlJRChGSVhQX0RCTCBsZFB3ckxbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsZFB3clJbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBuRW52ZWxvcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHBzQmFuZHMpCit7CisgIElOVCBpPTA7CisgIElOVCBlbnY9MDsKKyAgZm9yKGVudj0wOyBlbnY8bkVudmVsb3BlcztlbnYrKykgeworICAgIGZvciAoaT0wOyBpPHBzQmFuZHM7IGkrKykgeworCisgICAgICAvKiBpaWRbZW52XVtpXSA9IDEwLjBmKihmbG9hdClsb2cxMChwd3JMW2Vudl1baV0vcHdyUltlbnZdW2ldKTsKKyAgICAgICovCisgICAgICBGSVhQX0RCTCBJSUQgPSBmTXVsdERpdjIoIEZMMkZYQ09OU1RfREJMKExPRzEwXzJfMTAvSUlEX1NDQUxFX0ZUKSwgKGxkUHdyTFtlbnZdW2ldLWxkUHdyUltlbnZdW2ldKSApOworCisgICAgICBJSUQgPSBmaXhNaW4oIElJRCwgKEZJWFBfREJMKShNQVhWQUxfREJMPj4oTERfREFUQV9TSElGVCsxKSkgKTsKKyAgICAgIElJRCA9IGZpeE1heCggSUlELCAoRklYUF9EQkwpKE1JTlZBTF9EQkw+PihMRF9EQVRBX1NISUZUKzEpKSApOworICAgICAgaWlkW2Vudl1baV0gPSBJSUQgPDwgKExEX0RBVEFfU0hJRlQrMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUlDQyhGSVhQX0RCTCBsZFB3ckxbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsZFB3clJbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwd3JDcltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHB3ckNpW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbkVudmVsb3BlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBwc0JhbmRzKQoreworICBJTlQgaSA9IDA7CisgIElOVCBlbnYgPSAwOworICBJTlQgYm9yZGVyID0gcHNCYW5kczsKKworICBzd2l0Y2ggKHBzQmFuZHMpIHsKKyAgY2FzZSBQU19CQU5EU19DT0FSU0U6CisgICAgYm9yZGVyID0gNTsKKyAgICBicmVhazsKKyAgY2FzZSBQU19CQU5EU19NSUQ6CisgICAgYm9yZGVyID0gMTE7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICBmb3IoZW52PTA7IGVudjxuRW52ZWxvcGVzO2VudisrKSB7CisgICAgZm9yIChpPTA7IGk8Ym9yZGVyOyBpKyspIHsKKworICAgICAgLyogaWNjW2Vudl1baV0gPSBtaW4oIHB3ckNyW2Vudl1baV0gLyAoZmxvYXQpIHNxcnQocHdyTFtlbnZdW2ldICogcHdyUltlbnZdW2ldKSAsIDEuZik7CisgICAgICAqLworICAgICAgRklYUF9EQkwgSUNDLCBpbnZOcmcgPSBDYWxjSW52TGREYXRhICggLSgobGRQd3JMW2Vudl1baV0+PjEpICsgKGxkUHdyUltlbnZdW2ldPj4xKSArIChGSVhQX0RCTCkxKSApOworICAgICAgSU5UICAgICAgc2NhbGUsIGludlNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhpbnZOcmcpOworCisgICAgICBzY2FsZSA9IChERlJBQ1RfQklUUy0xKSAtIGludlNjYWxlOworICAgICAgSUNDID0gZk11bHQocHdyQ3JbZW52XVtpXSwgaW52TnJnPDxpbnZTY2FsZSkgOworICAgICAgaWNjW2Vudl1baV0gPSBTQVRVUkFURV9MRUZUX1NISUZUKElDQywgc2NhbGUsIERGUkFDVF9CSVRTKTsKKyAgICB9CisKKyAgICBmb3IgKDsgaTxwc0JhbmRzOyBpKyspIHsKKyAgICAgIElOVCBzYzEsIHNjMjsKKyAgICAgIEZJWFBfREJMIGNOcmdSLCBjTnJnSSwgSUNDOworCisgICAgICBzYzEgPSBDb3VudExlYWRpbmdCaXRzKCBmaXhNYXgoZml4cF9hYnMocHdyQ3JbZW52XVtpXSksZml4cF9hYnMocHdyQ2lbZW52XVtpXSkpICkgOworICAgICAgY05yZ1IgPSBmUG93MkRpdjIoKHB3ckNyW2Vudl1baV08PHNjMSkpOyAgICAgICAvKiBzcXVhcmVkIG5yZydzIGV4cGVjdCBleHBsaWNpdCBzY2FsaW5nICovCisgICAgICBjTnJnSSA9IGZQb3cyRGl2MigocHdyQ2lbZW52XVtpXTw8c2MxKSk7CisKKyAgICAgIElDQyA9IENhbGNJbnZMZERhdGEoIChDYWxjTGREYXRhKChjTnJnUiArIGNOcmdJKT4+MSk+PjEpIC0gKEZJWFBfREJMKSgoc2MxLTEpPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsKKworICAgICAgRklYUF9EQkwgaW52TnJnID0gQ2FsY0ludkxkRGF0YSAoIC0oKGxkUHdyTFtlbnZdW2ldPj4xKSArIChsZFB3clJbZW52XVtpXT4+MSkgKyAoRklYUF9EQkwpMSkgKTsKKyAgICAgIHNjMSA9IENvdW50TGVhZGluZ0JpdHMoaW52TnJnKTsKKyAgICAgIGludk5yZyA8PD0gc2MxOworCisgICAgICBzYzIgPSBDb3VudExlYWRpbmdCaXRzKElDQyk7CisgICAgICBJQ0MgPSBmTXVsdChJQ0M8PHNjMixpbnZOcmcpOworCisgICAgICBzYzEgPSAoIChERlJBQ1RfQklUUy0xKSAtIHNjMSAtIHNjMiApOworICAgICAgaWYgKHNjMSA8IDApIHsKKyAgICAgICAgICBJQ0MgPj49IC1zYzE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoSUNDID49ICgoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2MxKSApCisgICAgICAgICAgICAgIElDQyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgSUNDIDw8PSBzYzE7CisgICAgICB9CisKKyAgICAgIGljY1tlbnZdW2ldID0gSUNDOworICAgIH0KKyAgfQorfQorCit2b2lkIEZES3NickVuY19pbml0UHNCYW5kTnJnU2NhbGUoSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUpCit7CisgIElOVCBncm91cCwgYmluOworICBJTlQgbklpZEdyb3VwcyAgID0gaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzOworCisgIEZES21lbWNsZWFyKGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGUsIFBTX01BWF9CQU5EUypzaXplb2YoU0NIQVIpKTsKKworICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgbklpZEdyb3VwczsgZ3JvdXArKykgeworICAgIC8qIFRyYW5zbGF0ZSBncm91cCB0byBiaW4gKi8KKyAgICBiaW4gPSBoUHNFbmNvZGUtPnN1YmJhbmQycGFyYW1ldGVySW5kZXhbZ3JvdXBdOworCisgICAgLyogVHJhbnNsYXRlIGZyb20gMjAgYmlucyB0byAxMCBiaW5zICovCisgICAgaWYgKGhQc0VuY29kZS0+cHNFbmNNb2RlID09IFBTX0JBTkRTX0NPQVJTRSkgeworICAgICAgYmluID0gYmluPj4xOworICAgIH0KKworICAgIGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGVbYmluXSA9IChoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl09PTApCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGhQc0VuY29kZS0+aWlkR3JvdXBXaWR0aExkW2dyb3VwXSArIDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGZpeE1heChoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZFtncm91cF0saFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dKSArIDEpIDsKKworICB9Cit9CisKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfQ3JlYXRlUFNFbmNvZGUoCisgICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQorICAgICAgICApCit7CisgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOworCisgIGlmIChwaFBzRW5jb2RlPT1OVUxMKSB7CisgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorICBlbHNlIHsKKyAgICBIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSA9IE5VTEw7CisgICAgaWYgKE5VTEw9PShoUHNFbmNvZGUgPSBHZXRSYW1fUHNFbmNvZGUoKSkpIHsKKyAgICAgIGVycm9yID0gUFNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBGREttZW1jbGVhcihoUHNFbmNvZGUsc2l6ZW9mKFBTX0VOQ09ERSkpOworICAgICpwaFBzRW5jb2RlID0gaFBzRW5jb2RlOyAvKiByZXR1cm4gYWxsb2NhdGVkIGhhbmRsZSAqLworICB9CitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKAorICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgIGhQc0VuY29kZSwKKyAgICAgICAgY29uc3QgUFNfQkFORFMgICAgICAgICAgICBwc0VuY01vZGUsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgaWlkUXVhbnRFcnJvclRocmVzaG9sZAorICAgICAgICApCit7CisgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOworCisgIGlmIChOVUxMPT1oUHNFbmNvZGUpIHsKKyAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOworICB9CisgIGVsc2UgeworICAgIGlmIChQU0VOQ19PSyAhPSAoSW5pdFBTRGF0YSgmaFBzRW5jb2RlLT5wc0RhdGEpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIHN3aXRjaChwc0VuY01vZGUpeworICAgICAgY2FzZSBQU19CQU5EU19DT0FSU0U6CisgICAgICBjYXNlIFBTX0JBTkRTX01JRDoKKyAgICAgICAgaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICAgID0gUU1GX0dST1VQU19MT19SRVM7CisgICAgICAgIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcyA9IFNVQlFNRl9HUk9VUFNfTE9fUkVTOworICAgICAgICBGREttZW1jcHkoaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnMsICAgICAgICBpaWRHcm91cEJvcmRlcnNMb1JlcywgKGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcyArIDEpKnNpemVvZihJTlQpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleCwgc3ViYmFuZDJwYXJhbWV0ZXIyMCwgIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMpICAgICpzaXplb2YoSU5UKSk7CisgICAgICAgIEZES21lbWNweShoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZCwgICAgICAgIGlpZEdyb3VwV2lkdGhMZExvUmVzLCAoaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzKSAgICAqc2l6ZW9mKFVDSEFSKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBQU0VOQ19JTklUX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaFBzRW5jb2RlLT5wc0VuY01vZGUgPSBwc0VuY01vZGU7CisgICAgaFBzRW5jb2RlLT5paWRRdWFudEVycm9yVGhyZXNob2xkID0gaWlkUXVhbnRFcnJvclRocmVzaG9sZDsKKyAgICBGREtzYnJFbmNfaW5pdFBzQmFuZE5yZ1NjYWxlKGhQc0VuY29kZSk7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworCitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0Rlc3Ryb3lQU0VuY29kZSgKKyAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICpwaFBzRW5jb2RlCisgICAgICAgICkKK3sKKyAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CisKKyAgaWYgKE5VTEwgIT1waFBzRW5jb2RlKSB7CisgICAgRnJlZVJhbV9Qc0VuY29kZShwaFBzRW5jb2RlKTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBwd3JMW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIEZJWFBfREJMIHB3clJbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgRklYUF9EQkwgbGRQd3JMW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIEZJWFBfREJMIGxkUHdyUltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBGSVhQX0RCTCBwd3JDcltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBGSVhQX0RCTCBwd3JDaVtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworCit9IFBTX1BXUl9EQVRBOworCisKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNvZGUoCisgICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgaFBzRW5jb2RlLAorICAgICAgICBIQU5ETEVfUFNfT1VUICAgICAgICAgICAgIGhQc091dCwKKyAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICpkeW5CYW5kU2NhbGUsCisgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgbWF4RW52ZWxvcGVzLAorICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2VuZEhlYWRlcgorICAgICAgICApCit7CisgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOworCisgIEhBTkRMRV9QU19EQVRBIGhQc0RhdGEgPSAmaFBzRW5jb2RlLT5wc0RhdGE7CisgIEZJWFBfREJMIGlpZCBbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgRklYUF9EQkwgaWNjIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBpbnQgZW52Qm9yZGVyW1BTX01BWF9FTlZFTE9QRVMrMV07CisKKyAgaW50IGdyb3VwLCBiaW4sIGNvbCwgc3ViYmFuZCwgYmFuZDsKKyAgaW50IGkgPSAwOworCisgIGludCBlbnYgPSAwOworICBpbnQgcHNCYW5kcyAgICAgID0gKGludCkgaFBzRW5jb2RlLT5wc0VuY01vZGU7CisgIGludCBuSWlkR3JvdXBzICAgPSBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHM7CisgIGludCBuRW52ZWxvcGVzICAgPSBmaXhNaW4obWF4RW52ZWxvcGVzLCAoVUlOVClQU19NQVhfRU5WRUxPUEVTKTsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocHdyRGF0YSwgUFNfUFdSX0RBVEEsIDEpOworCisgIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXMrMTtlbnYrKykgeworICAgIGVudkJvcmRlcltlbnZdID0gZk11bHRJKEdldEludkludChuRW52ZWxvcGVzKSxmcmFtZVNpemUqZW52KTsKKyAgfQorCisgIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXM7ZW52KyspIHsKKworICAgIC8qIGNsZWFyIGVuZXJneSBhcnJheSAqLworICAgIGZvciAoYmFuZD0wOyBiYW5kPHBzQmFuZHM7IGJhbmQrKykgeworICAgICAgcHdyRGF0YS0+cHdyTFtlbnZdW2JhbmRdID0gcHdyRGF0YS0+cHdyUltlbnZdW2JhbmRdID0gcHdyRGF0YS0+cHdyQ3JbZW52XVtiYW5kXSA9IHB3ckRhdGEtPnB3ckNpW2Vudl1bYmFuZF0gPSBGSVhQX0RCTCgxKTsKKyAgICB9CisKKyAgICAvKioqKiBjYWxjdWxhdGUgZW5lcmdpZXMgYW5kIGNvcnJlbGF0aW9uICoqKiovCisKKyAgICAvKiBzdGFydCB3aXRoIGh5YnJpZCBkYXRhICovCisgICAgZm9yIChncm91cD0wOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgIC8qIFRyYW5zbGF0ZSBncm91cCB0byBiaW4gKi8KKyAgICAgIGJpbiA9IGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtncm91cF07CisKKyAgICAgIC8qIFRyYW5zbGF0ZSBmcm9tIDIwIGJpbnMgdG8gMTAgYmlucyAqLworICAgICAgaWYgKGhQc0VuY29kZS0+cHNFbmNNb2RlID09IFBTX0JBTkRTX0NPQVJTRSkgeworICAgICAgICBiaW4gPj49IDE7CisgICAgICB9CisKKyAgICAgIC8qIGRldGVybWluZSBncm91cCBib3JkZXIgKi8KKyAgICAgIGludCBiU2NhbGUgPSBoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl07CisKKyAgICAgIEZJWFBfREJMIHB3ckxfZW52X2JpbiA9IHB3ckRhdGEtPnB3ckxbZW52XVtiaW5dOworICAgICAgRklYUF9EQkwgcHdyUl9lbnZfYmluID0gcHdyRGF0YS0+cHdyUltlbnZdW2Jpbl07CisgICAgICBGSVhQX0RCTCBwd3JDcl9lbnZfYmluID0gcHdyRGF0YS0+cHdyQ3JbZW52XVtiaW5dOworICAgICAgRklYUF9EQkwgcHdyQ2lfZW52X2JpbiA9IHB3ckRhdGEtPnB3ckNpW2Vudl1bYmluXTsKKworICAgICAgaW50IHNjYWxlID0gKGludClkeW5CYW5kU2NhbGVbYmluXTsKKyAgICAgIGZvciAoY29sPWVudkJvcmRlcltlbnZdOyBjb2w8ZW52Qm9yZGVyW2VudisxXTsgY29sKyspIHsKKyAgICAgICAgZm9yIChzdWJiYW5kID0gaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXBdOyBzdWJiYW5kIDwgaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXArMV07IHN1YmJhbmQrKykgeworICAgICAgICAgIEZJWFBfUU1GIGxfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMF1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfUU1GIGxfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMF1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfUU1GIHJfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMV1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfUU1GIHJfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMV1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOworCisgICAgICAgICAgcHdyTF9lbnZfYmluICArPSAoZlBvdzJEaXYyKGxfcmVhbCkgKyBmUG93MkRpdjIobF9pbWFnKSkgPj4gYlNjYWxlOworICAgICAgICAgIHB3clJfZW52X2JpbiAgKz0gKGZQb3cyRGl2MihyX3JlYWwpICsgZlBvdzJEaXYyKHJfaW1hZykpID4+IGJTY2FsZTsKKyAgICAgICAgICBwd3JDcl9lbnZfYmluICs9IChmTXVsdERpdjIobF9yZWFsLCByX3JlYWwpICsgZk11bHREaXYyKGxfaW1hZywgcl9pbWFnKSkgPj4gYlNjYWxlOworICAgICAgICAgIHB3ckNpX2Vudl9iaW4gKz0gKGZNdWx0RGl2MihyX3JlYWwsIGxfaW1hZykgLSBmTXVsdERpdjIobF9yZWFsLCByX2ltYWcpKSA+PiBiU2NhbGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGFzc3VyZSwgbnJnJ3Mgb2YgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhcmUgbm90IG5lZ2F0aXZlOyBuZWNlc3Nhcnkgb24gMTYgYml0IG11bHRpcGx5IHVuaXRzICovCisgICAgICBwd3JEYXRhLT5wd3JMW2Vudl1bYmluXSA9IGZpeE1heCgoRklYUF9EQkwpMCxwd3JMX2Vudl9iaW4pOworICAgICAgcHdyRGF0YS0+cHdyUltlbnZdW2Jpbl0gPSBmaXhNYXgoKEZJWFBfREJMKTAscHdyUl9lbnZfYmluKTsKKworICAgICAgcHdyRGF0YS0+cHdyQ3JbZW52XVtiaW5dID0gcHdyQ3JfZW52X2JpbjsKKyAgICAgIHB3ckRhdGEtPnB3ckNpW2Vudl1bYmluXSA9IHB3ckNpX2Vudl9iaW47CisKKyAgICB9IC8qIG5JaWRHcm91cHMgKi8KKworICAgIC8qIGNhbGMgbG9nYXJpdGhtaWMgZW5lcmd5ICovCisgICAgTGREYXRhVmVjdG9yKHB3ckRhdGEtPnB3ckxbZW52XSwgcHdyRGF0YS0+bGRQd3JMW2Vudl0sIHBzQmFuZHMpOworICAgIExkRGF0YVZlY3Rvcihwd3JEYXRhLT5wd3JSW2Vudl0sIHB3ckRhdGEtPmxkUHdyUltlbnZdLCBwc0JhbmRzKTsKKworICB9IC8qIG5FbnZlbG9wZXMgKi8KKworICAvKiBjYWxjdWxhdGUgaWlkIGFuZCBpY2MgKi8KKyAgY2FsY3VsYXRlSUlEKHB3ckRhdGEtPmxkUHdyTCwgcHdyRGF0YS0+bGRQd3JSLCBpaWQsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOworICBjYWxjdWxhdGVJQ0MocHdyRGF0YS0+bGRQd3JMLCBwd3JEYXRhLT5sZFB3clIsIHB3ckRhdGEtPnB3ckNyLCBwd3JEYXRhLT5wd3JDaSwgaWNjLCBuRW52ZWxvcGVzLCBwc0JhbmRzKTsKKworICAvKioqIEVudmVsb3BlIFJlZHVjdGlvbiAqKiovCisgIHdoaWxlIChlbnZlbG9wZVJlZHVjaWJsZShpaWQsaWNjLHBzQmFuZHMsbkVudmVsb3BlcykpIHsKKyAgICBpbnQgZT0wOworICAgIC8qIHN1bSBlbmVyZ2llcyBvZiB0d28gbmVpZ2hib3JpbmcgZW52ZWxvcGVzICovCisgICAgbkVudmVsb3BlcyA+Pj0gMTsKKyAgICBmb3IgKGU9MDsgZTxuRW52ZWxvcGVzOyBlKyspIHsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JMWzIqZV0sIHB3ckRhdGEtPnB3ckxbMiplKzFdLCBwd3JEYXRhLT5wd3JMW2VdLCBwc0JhbmRzKTsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JSWzIqZV0sIHB3ckRhdGEtPnB3clJbMiplKzFdLCBwd3JEYXRhLT5wd3JSW2VdLCBwc0JhbmRzKTsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JDclsyKmVdLHB3ckRhdGEtPnB3ckNyWzIqZSsxXSxwd3JEYXRhLT5wd3JDcltlXSxwc0JhbmRzKTsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JDaVsyKmVdLHB3ckRhdGEtPnB3ckNpWzIqZSsxXSxwd3JEYXRhLT5wd3JDaVtlXSxwc0JhbmRzKTsKKworICAgICAgLyogY2FsYyBsb2dhcml0aG1pYyBlbmVyZ3kgKi8KKyAgICAgIExkRGF0YVZlY3Rvcihwd3JEYXRhLT5wd3JMW2VdLCBwd3JEYXRhLT5sZFB3ckxbZV0sIHBzQmFuZHMpOworICAgICAgTGREYXRhVmVjdG9yKHB3ckRhdGEtPnB3clJbZV0sIHB3ckRhdGEtPmxkUHdyUltlXSwgcHNCYW5kcyk7CisKKyAgICAgIC8qIHJlZHVjZSBudW1iZXIgb2YgZW52ZWxvcGVzIGFuZCBhZGp1c3QgYm9yZGVycyAqLworICAgICAgZW52Qm9yZGVyW2VdID0gZW52Qm9yZGVyWzIqZV07CisgICAgfQorICAgIGVudkJvcmRlcltuRW52ZWxvcGVzXSA9IGVudkJvcmRlclsyKm5FbnZlbG9wZXNdOworCisgICAgLyogcmUtY2FsY3VsYXRlIGlpZCBhbmQgaWNjICovCisgICAgY2FsY3VsYXRlSUlEKHB3ckRhdGEtPmxkUHdyTCwgcHdyRGF0YS0+bGRQd3JSLCBpaWQsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOworICAgIGNhbGN1bGF0ZUlDQyhwd3JEYXRhLT5sZFB3ckwsIHB3ckRhdGEtPmxkUHdyUiwgcHdyRGF0YS0+cHdyQ3IsIHB3ckRhdGEtPnB3ckNpLCBpY2MsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOworICB9CisKKworICAvKiAgKi8KKyAgaWYoc2VuZEhlYWRlcikgeworICAgIGhQc0RhdGEtPmhlYWRlckNudCAgPSBNQVhfUFNfTk9IRUFERVJfQ05UOworICAgIGhQc0RhdGEtPmlpZFRpbWVDbnQgPSBNQVhfVElNRV9ESUZGX0ZSQU1FUzsKKyAgICBoUHNEYXRhLT5pY2NUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7CisgICAgaFBzRGF0YS0+bm9FbnZDbnQgICA9IE1BWF9OT0VOVl9DTlQ7CisgIH0KKworICAvKioqIFBhcmFtZXRlciBwcm9jZXNzaW5nLCBxdWFudGlzYXRpb24gZXRjICoqKi8KKyAgcHJvY2Vzc0lpZERhdGEoaFBzRGF0YSwgaWlkLCBwc0JhbmRzLCBuRW52ZWxvcGVzLCBoUHNFbmNvZGUtPmlpZFF1YW50RXJyb3JUaHJlc2hvbGQpOworICBwcm9jZXNzSWNjRGF0YShoUHNEYXRhLCBpY2MsIHBzQmFuZHMsIG5FbnZlbG9wZXMpOworCisKKyAgLyoqKiBJbml0aWFsaXplIG91dHB1dCBzdHJ1Y3QgKioqLworCisgIC8qIFBTIEhlYWRlciBvbi9vZmYgPyAqLworICBpZiggKGhQc0RhdGEtPmhlYWRlckNudDxNQVhfUFNfTk9IRUFERVJfQ05UKQorICAgICAgICYmICggKGhQc0RhdGEtPmlpZFF1YW50TW9kZSA9PSBoUHNEYXRhLT5paWRRdWFudE1vZGVMYXN0KSAmJiAoaFBzRGF0YS0+aWNjUXVhbnRNb2RlID09IGhQc0RhdGEtPmljY1F1YW50TW9kZUxhc3QpICkKKyAgICAgICAmJiAoIChoUHNEYXRhLT5paWRFbmFibGUgICAgPT0gaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCkgICAgJiYgKGhQc0RhdGEtPmljY0VuYWJsZSAgICA9PSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0KSAgKSApIHsKKyAgICBoUHNPdXQtPmVuYWJsZVBTSGVhZGVyID0gMDsKKyAgfQorICBlbHNlIHsKKyAgICBoUHNPdXQtPmVuYWJsZVBTSGVhZGVyID0gMTsKKyAgICBoUHNEYXRhLT5oZWFkZXJDbnQgPSAwOworICB9CisKKyAgLyogbkVudmVsb3BlcyA9IDAgPyAqLworICBpZiAoIChoUHNEYXRhLT5ub0VudkNudCA8IE1BWF9OT0VOVl9DTlQpCisgICAgICAgJiYgKHNpbWlsYXJJaWQoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpCisgICAgICAgJiYgKHNpbWlsYXJJY2MoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpICkgeworICAgIGhQc091dC0+bkVudmVsb3BlcyA9IG5FbnZlbG9wZXMgPSAwOworICAgIGhQc0RhdGEtPm5vRW52Q250Kys7CisgIH0gZWxzZSB7CisgICAgaFBzRGF0YS0+bm9FbnZDbnQgPSAwOworICB9CisKKworICBpZiAobkVudmVsb3Blcz4wKSB7CisKKyAgICBoUHNPdXQtPmVuYWJsZUlJRCAgICAgID0gaFBzRGF0YS0+aWlkRW5hYmxlOworICAgIGhQc091dC0+aWlkTW9kZSAgICAgICAgPSBnZXRJSURNb2RlKHBzQmFuZHMsIGhQc0RhdGEtPmlpZFF1YW50TW9kZSk7CisKKyAgICBoUHNPdXQtPmVuYWJsZUlDQyAgICAgID0gaFBzRGF0YS0+aWNjRW5hYmxlOworICAgIGhQc091dC0+aWNjTW9kZSAgICAgICAgPSBnZXRJQ0NNb2RlKHBzQmFuZHMsIGhQc0RhdGEtPmljY1F1YW50TW9kZSk7CisKKyAgICBoUHNPdXQtPmVuYWJsZUlwZE9wZCAgPSAwOworICAgIGhQc091dC0+ZnJhbWVDbGFzcyAgICA9IDA7CisgICAgaFBzT3V0LT5uRW52ZWxvcGVzICAgID0gbkVudmVsb3BlczsKKworICAgIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBoUHNPdXQtPmZyYW1lQm9yZGVyW2Vudl0gPSBlbnZCb3JkZXJbZW52KzFdOworICAgIH0KKworICAgIGZvcihlbnY9MDsgZW52PGhQc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgIGhQc091dC0+ZGVsdGFJSURbZW52XSA9IChQU19ERUxUQSloUHNEYXRhLT5paWREaWZmTW9kZVtlbnZdOworCisgICAgICBmb3IoYmFuZD0wOyBiYW5kPHBzQmFuZHM7IGJhbmQrKykgeworICAgICAgICBoUHNPdXQtPmlpZFtlbnZdW2JhbmRdID0gaFBzRGF0YS0+aWlkSWR4W2Vudl1bYmFuZF07CisgICAgICB9CisgICAgfQorCisgICAgZm9yKGVudj0wOyBlbnY8aFBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgaFBzT3V0LT5kZWx0YUlDQ1tlbnZdID0gKFBTX0RFTFRBKWhQc0RhdGEtPmljY0RpZmZNb2RlW2Vudl07CisgICAgICBmb3IoYmFuZD0wOyBiYW5kPHBzQmFuZHM7IGJhbmQrKykgeworICAgICAgICBoUHNPdXQtPmljY1tlbnZdW2JhbmRdID0gaFBzRGF0YS0+aWNjSWR4W2Vudl1bYmFuZF07CisgICAgICB9CisgICAgfQorCisgICAgLyogSVBEIE9QRCBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLworICAgIEZES21lbWNsZWFyKGhQc091dC0+aXBkLCBQU19NQVhfRU5WRUxPUEVTKlBTX01BWF9CQU5EUypzaXplb2YoUFNfREVMVEEpKTsKKyAgICBmb3IoZW52PTA7IGVudjxQU19NQVhfRU5WRUxPUEVTOyBlbnYrKykgeworICAgICAgaFBzT3V0LT5kZWx0YUlQRFtlbnZdID0gUFNfREVMVEFfRlJFUTsKKyAgICAgIGhQc091dC0+ZGVsdGFPUERbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CisgICAgfQorCisgICAgRkRLbWVtY2xlYXIoaFBzT3V0LT5pcGRMYXN0LCBQU19NQVhfQkFORFMqc2l6ZW9mKElOVCkpOworICAgIEZES21lbWNsZWFyKGhQc091dC0+b3BkTGFzdCwgUFNfTUFYX0JBTkRTKnNpemVvZihJTlQpKTsKKworICAgIGZvcihiYW5kPTA7IGJhbmQ8UFNfTUFYX0JBTkRTOyBiYW5kKyspIHsKKyAgICAgIGhQc091dC0+aWlkTGFzdFtiYW5kXSA9IGhQc0RhdGEtPmlpZElkeExhc3RbYmFuZF07CisgICAgICBoUHNPdXQtPmljY0xhc3RbYmFuZF0gPSBoUHNEYXRhLT5pY2NJZHhMYXN0W2JhbmRdOworICAgIH0KKworICAgIC8qIHNhdmUgaWlkcyBhbmQgaWNjcyBmb3IgZGlmZmVyZW50aWFsIHRpbWUgY29kaW5nIGluIHRoZSBuZXh0IGZyYW1lICovCisgICAgaFBzRGF0YS0+bkVudmVsb3Blc0xhc3QgICA9IG5FbnZlbG9wZXM7CisgICAgaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCAgICA9IGhQc0RhdGEtPmlpZEVuYWJsZTsKKyAgICBoUHNEYXRhLT5pY2NFbmFibGVMYXN0ICAgID0gaFBzRGF0YS0+aWNjRW5hYmxlOworICAgIGhQc0RhdGEtPmlpZFF1YW50TW9kZUxhc3QgPSBoUHNEYXRhLT5paWRRdWFudE1vZGU7CisgICAgaFBzRGF0YS0+aWNjUXVhbnRNb2RlTGFzdCA9IGhQc0RhdGEtPmljY1F1YW50TW9kZTsKKyAgICBmb3IgKGk9MDsgaTxwc0JhbmRzOyBpKyspIHsKKyAgICAgIGhQc0RhdGEtPmlpZElkeExhc3RbaV0gPSBoUHNEYXRhLT5paWRJZHhbbkVudmVsb3Blcy0xXVtpXTsKKyAgICAgIGhQc0RhdGEtPmljY0lkeExhc3RbaV0gPSBoUHNEYXRhLT5pY2NJZHhbbkVudmVsb3Blcy0xXVtpXTsKKyAgICB9CisgIH0gLyogRW52ZWxvcGUgPiAwICovCisKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwd3JEYXRhLCBQU19QV1JfREFUQSwgMSkKKworICByZXR1cm4gZXJyb3I7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOGQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5oCkBAIC0wLDAgKzEsMTg3IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTmV1ZW5kb3JmLCBOLiBSZXR0ZWxiYWNoLCBNLiBNdWx0cnVzCisgICBjb250ZW50cy9kZXNjcmlwdGlvbjogUFMgUGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZyBmdW5jdGlvbnMgIAorKi8KKworI2lmbmRlZiBfX0lOQ0xVREVEX1BTX0VOQ09ERV9ICisjZGVmaW5lIF9fSU5DTFVERURfUFNfRU5DT0RFX0gKKworI2luY2x1ZGUgInBzX2NvbnN0LmgiCisjaW5jbHVkZSAicHNfYml0ZW5jLmgiCisKKworI2RlZmluZSBJSURfU0NBTEVfRlQgICAgICAoNjQuZikgICAgLyogbWF4VmFsIGluIFF1YW50IHRhYiBpcyArLy0gNTAgKi8KKyNkZWZpbmUgSUlEX1NDQUxFICAgICAgICAgNiAgICAgICAgIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tIDUwICovCisjZGVmaW5lIElJRF9NQVhWQUwgICAgICAgICgxPDxJSURfU0NBTEUpCisKKyNkZWZpbmUgUFNfUVVBTlRfU0NBTEVfRlQgKDY0LmYpICAgICAvKiBlcnJvciBzbWFsbGVyICg2NC0yNSkvNjQgKiAyMCBiYW5kcyAqIDQgZW52IC0+IFF1YW50U2NhbGUgNjQgKi8KKyNkZWZpbmUgUFNfUVVBTlRfU0NBTEUgICAgNiAgICAgICAgICAvKiBlcnJvciBzbWFsbGVyICg2NC0yNSkvNjQgKiAyMCBiYW5kcyAqIDQgZW52IC0+IFF1YW50U2NhbGUgNiBiaXQgKi8KKworCisjZGVmaW5lIFFNRl9HUk9VUFNfTE9fUkVTICAgICAgMTIKKyNkZWZpbmUgU1VCUU1GX0dST1VQU19MT19SRVMgICAxMAorI2RlZmluZSBRTUZfR1JPVVBTX0hJX1JFUyAgICAgIDE4CisjZGVmaW5lIFNVQlFNRl9HUk9VUFNfSElfUkVTICAgMzAKKworCit0eXBlZGVmIHN0cnVjdCBUX1BTX0RBVEEgeworCisgIElOVCBpaWRFbmFibGU7CisgIElOVCBpaWRFbmFibGVMYXN0OworICBJTlQgaWlkUXVhbnRNb2RlOworICBJTlQgaWlkUXVhbnRNb2RlTGFzdDsKKyAgSU5UIGlpZERpZmZNb2RlW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgaWlkSWR4ICAgICBbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGlpZElkeExhc3QgW1BTX01BWF9CQU5EU107CisKKyAgSU5UIGljY0VuYWJsZTsKKyAgSU5UIGljY0VuYWJsZUxhc3Q7CisgIElOVCBpY2NRdWFudE1vZGU7CisgIElOVCBpY2NRdWFudE1vZGVMYXN0OworICBJTlQgaWNjRGlmZk1vZGVbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCBpY2NJZHggICAgIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgaWNjSWR4TGFzdCBbUFNfTUFYX0JBTkRTXTsKKworICBJTlQgbkVudmVsb3Blc0xhc3Q7CisKKyAgSU5UIGhlYWRlckNudDsKKyAgSU5UIGlpZFRpbWVDbnQ7CisgIElOVCBpY2NUaW1lQ250OworICBJTlQgbm9FbnZDbnQ7CisKK30gUFNfREFUQSwgKkhBTkRMRV9QU19EQVRBOworCisKK3R5cGVkZWYgc3RydWN0IFRfUFNfRU5DT0RFeworCisgIFBTX0RBVEEgICAgICAgICBwc0RhdGE7CisKKyAgUFNfQkFORFMgICAgICAgIHBzRW5jTW9kZTsKKyAgSU5UICAgICAgICAgICAgIG5RbWZJaWRHcm91cHM7CisgIElOVCAgICAgICAgICAgICBuU3ViUW1mSWlkR3JvdXBzOworICBJTlQgICAgICAgICAgICAgaWlkR3JvdXBCb3JkZXJzW1FNRl9HUk9VUFNfSElfUkVTICsgU1VCUU1GX0dST1VQU19ISV9SRVMgKyAxXTsKKyAgSU5UICAgICAgICAgICAgIHN1YmJhbmQycGFyYW1ldGVySW5kZXhbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFU107CisgIFVDSEFSICAgICAgICAgICBpaWRHcm91cFdpZHRoTGRbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFU107CisgIEZJWFBfREJMICAgICAgICBpaWRRdWFudEVycm9yVGhyZXNob2xkOworCisgIFVDSEFSICAgICAgICAgICBwc0JhbmROcmdTY2FsZSBbUFNfTUFYX0JBTkRTXTsKKworfSBQU19FTkNPREU7CisKKwordHlwZWRlZiBzdHJ1Y3QgVF9QU19FTkNPREUgKkhBTkRMRV9QU19FTkNPREU7CisKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfQ3JlYXRlUFNFbmNvZGUoCisgICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQorICAgICAgICApOworCitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0luaXRQU0VuY29kZSgKKyAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICBoUHNFbmNvZGUsCisgICAgICAgIGNvbnN0IFBTX0JBTkRTICAgICAgICAgICAgcHNFbmNNb2RlLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQKKyAgICAgICAgKTsKKworRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19EZXN0cm95UFNFbmNvZGUoCisgICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQorICAgICAgICApOworCitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX1BTRW5jb2RlKAorICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgIGhQc0VuY29kZSwKKyAgICAgICAgSEFORExFX1BTX09VVCAgICAgICAgICAgICBoUHNPdXQsCisgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluQmFuZFNjYWxlLAorICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIG1heEVudmVsb3BlcywKKyAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKKyAgICAgICAgKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9wc19tYWluLmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTgzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9wc19tYWluLmNwcApAQCAtMCwwICsxLDYxOCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgSW5pdGlhbCBBdXRob3JzOiAgICAgIE0uIE11bHRydXMKKyAgIENvbnRlbnRzL0Rlc2NyaXB0aW9uOiBQUyBXcmFwcGVyLCBEb3dubWl4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBzX21haW4uaCIKKworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwc19jb25zdC5oIgorI2luY2x1ZGUgInBzX2JpdGVuYy5oIgorCisjaW5jbHVkZSAic2JyX3JhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcHNGaW5kQmVzdFNjYWxpbmcoCisgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgKmR5bkJhbmRTY2FsZSwKKyAgICAgICAgRklYUF9RTUYgICAgICAgICAgICAgICAgICptYXhCYW5kVmFsdWUsCisgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAqZG14U2NhbGUKKyAgICAgICAgKTsKKworLyotLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZSgKKyAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KKyAgICAgICAgKQoreworICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKKworICBpZiAocGhQYXJhbWV0cmljU3RlcmVvPT1OVUxMKSB7CisgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8gPSBOVUxMOworCisgICAgaWYgKE5VTEw9PShoUGFyYW1ldHJpY1N0ZXJlbyA9IEdldFJhbV9QYXJhbVN0ZXJlbygpKSkgeworICAgICAgZXJyb3IgPSBQU0VOQ19NRU1PUllfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLCBzaXplb2YoUEFSQU1FVFJJQ19TVEVSRU8pKTsKKworICAgIGlmIChQU0VOQ19PSyAhPSAoZXJyb3IgPSBGREtzYnJFbmNfQ3JlYXRlUFNFbmNvZGUoJmhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGUpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPE1BWF9QU19DSEFOTkVMUzsgaSsrKSB7CisgICAgICBpZiAoRkRLaHlicmlkQW5hbHlzaXNPcGVuKAorICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbaV0sCisgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzTEZbaV0sCisgICAgICAgICAgICAgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0xGW2ldKSwKKyAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJBbmFTdGF0ZXNIRltpXSwKKyAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzSEZbaV0pCisgICAgICAgICAgICAgKSAhPTAgKQorICAgICAgeworICAgICAgICBlcnJvciA9IFBTRU5DX01FTU9SWV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgICpwaFBhcmFtZXRyaWNTdGVyZW8gPSBoUGFyYW1ldHJpY1N0ZXJlbzsgLyogcmV0dXJuIGFsbG9jYXRlZCBoYW5kbGUgKi8KKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfUFNFTkNfRVJST1IgUFNFbmNfSW5pdCgKKyAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgY29uc3QgSEFORExFX1BTRU5DX0NPTkZJRyBoUHNFbmNDb25maWcsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZTbG90cywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzCisgICAgICAgLFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluYW1pY19SQU0KKyAgICAgICAgKQoreworICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKKworICBpZiAoIChOVUxMPT1oUGFyYW1ldHJpY1N0ZXJlbykgfHwgKE5VTEw9PWhQc0VuY0NvbmZpZykgKSB7CisgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgY2gsIGk7CisKKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+aW5pdFBTID0gMTsKKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cyA9IG5vUW1mU2xvdHM7CisgICAgaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mQmFuZHMgPSBub1FtZkJhbmRzOworCisgICAgLyogY2xlYXIgZGVsYXkgbGluZXMgKi8KKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lcywgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzKSk7CisKKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSA9IEZSQUNUX0JJVFMtMTsKKworICAgIC8qIGNyZWF0ZSBjb25maWd1cmF0aW9uIGZvciBoeWJyaWQgZmlsdGVyIGJhbmsgKi8KKyAgICBmb3IgKGNoPTA7IGNoPE1BWF9QU19DSEFOTkVMUzsgY2grKykgeworICAgICAgRkRLaHlicmlkQW5hbHlzaXNJbml0KAorICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbY2hdLAorICAgICAgICAgICAgIFRIUkVFX1RPX1RFTiwKKyAgICAgICAgICAgICBRTUZfQ0hBTk5FTFMsCisgICAgICAgICAgICAgUU1GX0NIQU5ORUxTLAorICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICApOworICAgIH0gLyogY2ggKi8KKworICAgIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoCisgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsCisgICAgICAgICAgIFRIUkVFX1RPX1RFTiwKKyAgICAgICAgICAgUU1GX0NIQU5ORUxTLAorICAgICAgICAgICBRTUZfQ0hBTk5FTFMKKyAgICAgICAgICAgKTsKKworICAgIC8qIGRldGVybWluZSBhdmVyYWdlIGRlbGF5ICovCisgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBzRGVsYXkgPSAoSFlCUklEX0ZJTFRFUl9ERUxBWSpoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZCYW5kcyk7CisKKyAgICBpZiAoIChoUHNFbmNDb25maWctPm1heEVudmVsb3BlcyA8IFBTRU5DX05FTlZfMSkgfHwgKGhQc0VuY0NvbmZpZy0+bWF4RW52ZWxvcGVzID4gUFNFTkNfTkVOVl9NQVgpICkgeworICAgICAgaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXMgPSBQU0VOQ19ORU5WX0RFRkFVTFQ7CisgICAgfQorICAgIGhQYXJhbWV0cmljU3RlcmVvLT5tYXhFbnZlbG9wZXMgPSBoUHNFbmNDb25maWctPm1heEVudmVsb3BlczsKKworICAgIGlmIChQU0VOQ19PSyAhPSAoZXJyb3IgPSBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKGhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGUsIChQU19CQU5EUykgaFBzRW5jQ29uZmlnLT5uU3RlcmVvQmFuZHMsIGhQc0VuY0NvbmZpZy0+aWlkUXVhbnRFcnJvclRocmVzaG9sZCkpKXsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2g8TUFYX1BTX0NIQU5ORUxTOyBjaCArKykgeworICAgICAgRklYUF9EQkwgKnBEeW5SZWFsID0gR2V0UmFtX1Nicl9lbnZSQnVmZmVyIChjaCwgZHluYW1pY19SQU0pOworICAgICAgRklYUF9EQkwgKnBEeW5JbWFnID0gR2V0UmFtX1Nicl9lbnZJQnVmZmVyIChjaCwgZHluYW1pY19SQU0pOworCisgICAgICBmb3IgKGk9MDsgaTxIWUJSSURfRlJBTUVTSVpFOyBpKyspIHsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2krSFlCUklEX1JFQURfT0ZGU0VUXVtjaF1bMF0gPSAmcER5blJlYWxbaSpNQVhfSFlCUklEX0JBTkRTXTsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2krSFlCUklEX1JFQURfT0ZGU0VUXVtjaF1bMV0gPSAmcER5bkltYWdbaSpNQVhfSFlCUklEX0JBTkRTXTs7CisgICAgICB9CisKKyAgICAgIGZvciAoaT0wOyBpPEhZQlJJRF9SRUFEX09GRlNFVDsgaSsrKSB7CisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVtjaF1bMF0gPSBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhW2ldW2NoXVswXTsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldW2NoXVsxXSA9IGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGFbaV1bY2hdWzFdOworICAgICAgfQorICAgIH0gLyogY2ggKi8KKworICAgIC8qIGNsZWFyIHN0YXRpYyBoeWJyaWQgYnVmZmVyICovCisgICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YSwgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGEpKTsKKworICAgIC8qIGNsZWFyIGJzIGJ1ZmZlciAqLworICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5wc091dCwgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5wc091dCkpOworCisgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzBdLmVuYWJsZVBTSGVhZGVyID0gMTsgLyogd3JpdGUgcHMgaGVhZGVyIGluIGZpcnN0IGZyYW1lICovCisKKyAgICAvKiBjbGVhciBzY2FsaW5nIGJ1ZmZlciAqLworICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsIHNpemVvZihVQ0hBUikqUFNfTUFYX0JBTkRTKTsKKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+bWF4QmFuZFZhbHVlLCBzaXplb2YoRklYUF9RTUYpKlBTX01BWF9CQU5EUyk7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworCitGREtfUFNFTkNfRVJST1IgUFNFbmNfRGVzdHJveSgKKyAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KKyAgICAgICAgKQoreworICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKKworICBpZiAoTlVMTCE9cGhQYXJhbWV0cmljU3RlcmVvKSB7CisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvID0gKnBoUGFyYW1ldHJpY1N0ZXJlbzsKKyAgICBpZihoUGFyYW1ldHJpY1N0ZXJlbyAhPSBOVUxMKXsKKyAgICAgIEZES3NickVuY19EZXN0cm95UFNFbmNvZGUoJmhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGUpOworICAgICAgRnJlZVJhbV9QYXJhbVN0ZXJlbyhwaFBhcmFtZXRyaWNTdGVyZW8pOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19QU0VOQ19FUlJPUiBFeHRyYWN0UFNQYXJhbWV0ZXJzKAorICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIsCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdCisgICAgICAgICkKK3sKKyAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CisKKyAgaWYgKGhQYXJhbWV0cmljU3RlcmVvID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOworICB9CisgIGVsc2UgeworICAgIC8qIGNhbGwgcHMgZW5jb2RlIGZ1bmN0aW9uICovCisgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5pbml0UFMpeworICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzFdID0gaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzBdOworICAgIH0KKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0gPSBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMV07CisKKyAgICBpZiAoUFNFTkNfT0sgIT0gKGVycm9yID0gRkRLc2JyRW5jX1BTRW5jb2RlKAorICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSwKKyAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5wc091dFsxXSwKKyAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsCisgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4RW52ZWxvcGVzLAorICAgICAgICAgICAgaHlicmlkRGF0YSwKKyAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzLAorICAgICAgICAgICAgc2VuZEhlYWRlcikpKQorICAgIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8tPmluaXRQUykgeworICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzBdID0gaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzFdOworICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmluaXRQUyA9IDA7CisgICAgfQorICB9CitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIEZES19QU0VOQ19FUlJPUiBEb3dubWl4UFNRbWZEYXRhKAorICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyAgICBzYnJTeW50aFFtZiwKKyAgICAgICBGSVhQX1FNRiAgICAgICAqKlJFU1RSSUNUIG1peFJlYWxRbWZEYXRhLAorICAgICAgIEZJWFBfUU1GICAgICAgICoqUkVTVFJJQ1QgbWl4SW1hZ1FtZkRhdGEsCisgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAgICpkb3duc2FtcGxlZE91dFNpZ25hbCwKKyAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKKyAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5vUW1mU2xvdHMsCisgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwc1FtZlNjYWxlW01BWF9QU19DSEFOTkVMU10sCisgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpxbWZTY2FsZQorICAgICAgICkKK3sKKyAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CisKKyAgaWYoaFBhcmFtZXRyaWNTdGVyZW8gPT0gTlVMTCl7CisgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorICBlbHNlIHsKKyAgICBpbnQgbiwgazsKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX1FNRiwgMipRTUZfQ0hBTk5FTFMpCisKKyAgICAvKiBkZWZpbmUgc2NhbGluZ3MgKi8KKyAgICBpbnQgZHluUW1mU2NhbGUgPSBmaXhNYXgoMCwgaFBhcmFtZXRyaWNTdGVyZW8tPmRteFNjYWxlLTEpOyAvKiBzY2FsZSBvbmUgYml0IG1vcmUgZm9yIGFkZGl0aW9uIG9mIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgaW50IGRvd25taXhTY2FsZSA9IHBzUW1mU2NhbGVbMF0gLSBkeW5RbWZTY2FsZTsKKyAgICBjb25zdCBGSVhQX0RCTCBtYXhTdGVyZW9TY2FsZUZhY3RvciA9IE1BWFZBTF9EQkw7IC8qIDIuZi8yLmYgKi8KKworICAgIGZvciAobiA9IDA7IG48bm9RbWZTbG90czsgbisrKSB7CisKKyAgICAgIEZJWFBfREJMIHRtcEh5YnJpZFsyXVtNQVhfSFlCUklEX0JBTkRTXTsKKworICAgICAgZm9yKGsgPSAwOyBrPDcxOyBrKyspeworICAgICAgICAgIGludCBkeW5TY2FsZSwgc2M7IC8qIHNjYWxpbmcgKi8KKyAgICAgICAgICBGSVhQX1FNRiB0bXBMZWZ0UmVhbCwgdG1wUmlnaHRSZWFsLCB0bXBMZWZ0SW1hZywgdG1wUmlnaHRJbWFnOworICAgICAgICAgIEZJWFBfREJMIHRtcFNjYWxlRmFjdG9yLCBzdGVyZW9TY2FsZUZhY3RvcjsKKworICAgICAgICAgIHRtcExlZnRSZWFsICA9IGh5YnJpZERhdGFbbl1bMF1bMF1ba107CisgICAgICAgICAgdG1wTGVmdEltYWcgID0gaHlicmlkRGF0YVtuXVswXVsxXVtrXTsKKyAgICAgICAgICB0bXBSaWdodFJlYWwgPSBoeWJyaWREYXRhW25dWzFdWzBdW2tdOworICAgICAgICAgIHRtcFJpZ2h0SW1hZyA9IGh5YnJpZERhdGFbbl1bMV1bMV1ba107CisKKyAgICAgICAgICBzYyA9IGZpeE1heCgwLENudExlYWRpbmdaZXJvcyggZml4TWF4KGZpeE1heChmaXhwX2Ficyh0bXBMZWZ0UmVhbCksZml4cF9hYnModG1wTGVmdEltYWcpKSxmaXhNYXgoZml4cF9hYnModG1wUmlnaHRSZWFsKSxmaXhwX2Ficyh0bXBSaWdodEltYWcpKSkgKS0yKTsKKworICAgICAgICAgIHRtcExlZnRSZWFsICA8PD0gc2M7IHRtcExlZnRJbWFnICA8PD0gc2M7CisgICAgICAgICAgdG1wUmlnaHRSZWFsIDw8PSBzYzsgdG1wUmlnaHRJbWFnIDw8PSBzYzsKKyAgICAgICAgICBkeW5TY2FsZSA9IGZpeE1pbihzYy1keW5RbWZTY2FsZSxERlJBQ1RfQklUUy0xKTsKKworICAgICAgICAgIC8qIGNhbGMgc3RlcmVvIHNjYWxlIGZhY3RvciB0byBhdm9pZCBsb3NzIG9mIGVuZXJneSBpbiBiYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qIHN0ZXJlbyBzY2FsZSBmYWN0b3IgPSBtaW4oMi4wZiwgc3FydCggKGFicyhsKGssIG4pXjIgKyBhYnMocihrLCBuKV4yICkpKS8oMC41ZiphYnMobChrLCBuKSArIHIoaywgbikpKSApKSAqLworICAgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yID0gZlBvdzJEaXYyKHRtcExlZnRSZWFsKSAgKyBmUG93MkRpdjIodG1wTGVmdEltYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmUG93MkRpdjIodG1wUmlnaHRSZWFsKSArIGZQb3cyRGl2Mih0bXBSaWdodEltYWcpIDsKKworICAgICAgICAgIC8qIG1pZ2h0IGJlIHRoYXQgdG1wU2NhbGVGYWN0b3IgYmVjb21lcyBuZWdhdGl2ZSwgc28gZmFicyguKSAqLworICAgICAgICAgIHRtcFNjYWxlRmFjdG9yICAgID0gZml4cF9hYnMoc3RlcmVvU2NhbGVGYWN0b3IgKyBmTXVsdCh0bXBMZWZ0UmVhbCx0bXBSaWdodFJlYWwpICsgZk11bHQodG1wTGVmdEltYWcsdG1wUmlnaHRJbWFnKSk7CisKKyAgICAgICAgICAvKiBtaW4oMi4wZiwgc3FydChzdGVyZW9TY2FsZUZhY3Rvci8oMC41Zip0bXBTY2FsZUZhY3RvcikpKSAgKi8KKyAgICAgICAgICBpZiAoIChzdGVyZW9TY2FsZUZhY3Rvcj4+MSkgPCBmTXVsdChtYXhTdGVyZW9TY2FsZUZhY3Rvcix0bXBTY2FsZUZhY3RvcikgKSB7CisKKyAgICAgICAgICAgICAgaW50IHNjX251bSAgID0gQ291bnRMZWFkaW5nQml0cyhzdGVyZW9TY2FsZUZhY3RvcikgOworICAgICAgICAgICAgICBpbnQgc2NfZGVudW0gPSBDb3VudExlYWRpbmdCaXRzKHRtcFNjYWxlRmFjdG9yKSA7CisgICAgICAgICAgICAgIHNjICAgICAgID0gLShzY19udW0tc2NfZGVudW0pOworCisgICAgICAgICAgICAgIHRtcFNjYWxlRmFjdG9yID0gc2NodXJfZGl2KChzdGVyZW9TY2FsZUZhY3Rvcjw8KHNjX251bSkpPj4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wU2NhbGVGYWN0b3I8PHNjX2RlbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpIDsKKworICAgICAgICAgICAgICAvKiBwcmV2ZW50IG9kZCBzY2FsaW5nIGZvciBuZXh0IHNxcnQgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgaWYgKHNjJjB4MSkgeworICAgICAgICAgICAgICAgIHNjKys7CisgICAgICAgICAgICAgICAgdG1wU2NhbGVGYWN0b3I+Pj0xOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yID0gc3FydEZpeHAodG1wU2NhbGVGYWN0b3IpOworICAgICAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA8PD0gKHNjPj4xKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yID0gbWF4U3RlcmVvU2NhbGVGYWN0b3I7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogd3JpdGUgZGF0YSB0byBoeWJyaWQgb3V0cHV0ICovCisgICAgICAgICAgdG1wSHlicmlkWzBdW2tdID0gZk11bHREaXYyKHN0ZXJlb1NjYWxlRmFjdG9yLCAoRklYUF9RTUYpKHRtcExlZnRSZWFsICsgdG1wUmlnaHRSZWFsKSk+PmR5blNjYWxlOworICAgICAgICAgIHRtcEh5YnJpZFsxXVtrXSA9IGZNdWx0RGl2MihzdGVyZW9TY2FsZUZhY3RvciwgKEZJWFBfUU1GKSh0bXBMZWZ0SW1hZyArIHRtcFJpZ2h0SW1hZykpPj5keW5TY2FsZTsKKworICAgICAgfSAvKiBoeWJyaWQgYmFuZHMgLSBrICovCisKKyAgICAgIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAorICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsCisgICAgICAgICAgICAgdG1wSHlicmlkWzBdLAorICAgICAgICAgICAgIHRtcEh5YnJpZFsxXSwKKyAgICAgICAgICAgICBtaXhSZWFsUW1mRGF0YVtuXSwKKyAgICAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtuXSk7CisKKyAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoCisgICAgICAgICAgICBzYnJTeW50aFFtZiwKKyAgICAgICAgICAgIG1peFJlYWxRbWZEYXRhW25dLAorICAgICAgICAgICAgbWl4SW1hZ1FtZkRhdGFbbl0sCisgICAgICAgICAgICBkb3dubWl4U2NhbGUtNywKKyAgICAgICAgICAgIGRvd25taXhTY2FsZS03LAorICAgICAgICAgICAgZG93bnNhbXBsZWRPdXRTaWduYWwrKG4qc2JyU3ludGhRbWYtPm5vX2NoYW5uZWxzKSwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICBwV29ya0J1ZmZlcik7CisKKyAgICB9IC8qIHNsb3RzICovCisKKyAgICAqcW1mU2NhbGUgPSAtZG93bm1peFNjYWxlICsgNzsKKworICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX1FNRiwgMipRTUZfQ0hBTk5FTFMpCisKKyAgeworICAgIGNvbnN0IElOVCBub1FtZlNsb3RzMiA9IGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzPj4xOworICAgIGNvbnN0IGludCBub1FtZkJhbmRzICA9IGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZkJhbmRzOworCisgICAgSU5UIHNjYWxlLCBpLCBqLCBzbG90T2Zmc2V0OworCisgICAgRklYUF9RTUYgdG1wWzJdW1FNRl9DSEFOTkVMU107CisKKyAgICBmb3IgKGk9MDsgaTxub1FtZlNsb3RzMjsgaSsrKSB7CisgICAgICBGREttZW1jcHkodG1wWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lc1swXVtpXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKKyAgICAgIEZES21lbWNweSh0bXBbMV0sIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOworCisgICAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMF1baV0sIG1peFJlYWxRbWZEYXRhW2krbm9RbWZTbG90czJdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOworICAgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLCBtaXhJbWFnUW1mRGF0YVtpK25vUW1mU2xvdHMyXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKKworICAgICAgRkRLbWVtY3B5KG1peFJlYWxRbWZEYXRhW2krbm9RbWZTbG90czJdLCBtaXhSZWFsUW1mRGF0YVtpXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKKyAgICAgIEZES21lbWNweShtaXhJbWFnUW1mRGF0YVtpK25vUW1mU2xvdHMyXSwgbWl4SW1hZ1FtZkRhdGFbaV0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7CisKKyAgICAgIEZES21lbWNweShtaXhSZWFsUW1mRGF0YVtpXSwgdG1wWzBdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOworICAgICAgRkRLbWVtY3B5KG1peEltYWdRbWZEYXRhW2ldLCB0bXBbMV0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7CisgICAgfQorCisgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID4gKnFtZlNjYWxlKSB7CisgICAgICBzY2FsZSA9IGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlIC0gKnFtZlNjYWxlOworICAgICAgc2xvdE9mZnNldCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc2NhbGUgPSAqcW1mU2NhbGUgLSBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZTsKKyAgICAgIHNsb3RPZmZzZXQgPSBub1FtZlNsb3RzMjsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxub1FtZlNsb3RzMjsgaSsrKSB7CisgICAgICBmb3IgKGo9MDsgajxub1FtZkJhbmRzOyBqKyspIHsKKyAgICAgICAgbWl4UmVhbFFtZkRhdGFbaStzbG90T2Zmc2V0XVtqXSA+Pj0gc2NhbGU7CisgICAgICAgIG1peEltYWdRbWZEYXRhW2krc2xvdE9mZnNldF1bal0gPj49IHNjYWxlOworICAgICAgfQorICAgIH0KKworICAgIHNjYWxlID0gKnFtZlNjYWxlOworICAgICpxbWZTY2FsZSA9IEZES21pbigqcW1mU2NhbGUsIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlKTsKKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSA9IHNjYWxlOworICB9CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gZXJyb3I7Cit9CisKKworSU5UIEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YSgKKyAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQml0c3RyZWFtCisgICAgICAgICkKK3sKKyAgcmV0dXJuICggKGhQYXJhbWV0cmljU3RlcmVvIT1OVUxMKSA/IEZES3NickVuY19Xcml0ZVBTQml0c3RyZWFtKCZoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0sIGhCaXRzdHJlYW0pIDogMCApOworfQorCisKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNfUGFyYW1ldHJpY1N0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICAqc2FtcGxlc1syXSwKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCisgICAgICAgIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICoqaFFtZkFuYWx5c2lzLAorICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZFJlYWxRbWZEYXRhLAorICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZEltYWdRbWZEYXRhLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKmRvd25zYW1wbGVkT3V0U2lnbmFsLAorICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LICAgIHNiclN5bnRoUW1mLAorICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKnFtZlNjYWxlLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKKyAgICAgICAgKQoreworICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKKyAgSU5UIHBzUW1mU2NhbGVbTUFYX1BTX0NIQU5ORUxTXSA9IHswfTsKKyAgaW50IHBzQ2gsIGk7CisgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCA0KlFNRl9DSEFOTkVMUykKKworICBmb3IgKHBzQ2ggPSAwOyBwc0NoPE1BWF9QU19DSEFOTkVMUzsgcHNDaCArKykgeworCisgICAgZm9yIChpID0gMDsgaSA8IGhRbWZBbmFseXNpc1twc0NoXS0+bm9fY29sOyBpKyspIHsKKworICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAorICAgICAgICAgIGhRbWZBbmFseXNpc1twc0NoXSwKKyAgICAgICAgICZwV29ya0J1ZmZlclsyKlFNRl9DSEFOTkVMU10sIC8qIHFtZlJlYWxbUU1GX0NIQU5ORUxTXSAqLworICAgICAgICAgJnBXb3JrQnVmZmVyWzMqUU1GX0NIQU5ORUxTXSwgLyogcW1mSW1hZ1tRTUZfQ0hBTk5FTFNdICovCisgICAgICAgICAgc2FtcGxlc1twc0NoXStpKihoUW1mQW5hbHlzaXNbcHNDaF0tPm5vX2NoYW5uZWxzKnRpbWVJblN0cmlkZSksCisgICAgICAgICAgdGltZUluU3RyaWRlLAorICAgICAgICAgJnBXb3JrQnVmZmVyWzAqUU1GX0NIQU5ORUxTXSAgLyogcW1mIHdvcmtidWZmZXIgMipRTUZfQ0hBTk5FTFMgKi8KKyAgICAgICAgICApOworCisgICAgICBGREtoeWJyaWRBbmFseXNpc0FwcGx5KAorICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbcHNDaF0sCisgICAgICAgICAmcFdvcmtCdWZmZXJbMipRTUZfQ0hBTk5FTFNdLCAgLyogcW1mUmVhbFtRTUZfQ0hBTk5FTFNdICovCisgICAgICAgICAmcFdvcmtCdWZmZXJbMypRTUZfQ0hBTk5FTFNdLCAgLyogcW1mSW1hZ1tRTUZfQ0hBTk5FTFNdICovCisgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2krSFlCUklEX1JFQURfT0ZGU0VUXVtwc0NoXVswXSwKKyAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaStIWUJSSURfUkVBRF9PRkZTRVRdW3BzQ2hdWzFdCisgICAgICAgICAgKTsKKworICAgIH0gLyogbm9fY29sIGxvb3AgIGkgICovCisKKyAgICBwc1FtZlNjYWxlW3BzQ2hdID0gaFFtZkFuYWx5c2lzW3BzQ2hdLT5vdXRTY2FsZWZhY3RvcjsKKworICB9IC8qIGZvciBwc0NoICovCisKKyAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCA0KlFNRl9DSEFOTkVMUykKKworICAvKiBmaW5kIGJlc3Qgc2NhbGluZyBpbiBuZXcgUU1GIGFuZCBIeWJyaWQgZGF0YSAqLworICBwc0ZpbmRCZXN0U2NhbGluZyggaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX1JFQURfT0ZGU0VUXSwKKyAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4QmFuZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmRteFNjYWxlICkgOworCisKKyAgLyogZXh0cmFjdCB0aGUgcHMgcGFyYW1ldGVycyAqLworICBpZihQU0VOQ19PSyAhPSAoZXJyb3IgPSBFeHRyYWN0UFNQYXJhbWV0ZXJzKGhQYXJhbWV0cmljU3RlcmVvLCBzZW5kSGVhZGVyLCAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhWzBdKSkpeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIHNhdmUgaHlicmlkIGRhdGUgZm9yIG5leHQgZnJhbWUgKi8KKyAgZm9yIChpPTA7IGk8SFlCUklEX1JFQURfT0ZGU0VUOyBpKyspIHsKKyAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzBdWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRStpXVswXVswXSwgTUFYX0hZQlJJRF9CQU5EUypzaXplb2YoRklYUF9EQkwpKTsgLyogbGVmdCwgcmVhbCAqLworICAgIEZES21lbWNweShoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bMF1bMV0sIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFK2ldWzBdWzFdLCBNQVhfSFlCUklEX0JBTkRTKnNpemVvZihGSVhQX0RCTCkpOyAvKiBsZWZ0LCBpbWFnICovCisgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVswXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkUraV1bMV1bMF0sIE1BWF9IWUJSSURfQkFORFMqc2l6ZW9mKEZJWFBfREJMKSk7IC8qIHJpZ2h0LCByZWFsICovCisgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVsxXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkUraV1bMV1bMV0sIE1BWF9IWUJSSURfQkFORFMqc2l6ZW9mKEZJWFBfREJMKSk7IC8qIHJpZ2h0LCBpbWFnICovCisgIH0KKworICAvKiBkb3dubWl4IGFuZCBoeWJyaWQgc3ludGhlc2lzICovCisgIGlmIChQU0VOQ19PSyAhPSAoZXJyb3IgPSBEb3dubWl4UFNRbWZEYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBzYnJTeW50aFFtZiwgZG93bm1peGVkUmVhbFFtZkRhdGEsIGRvd25taXhlZEltYWdRbWZEYXRhLCBkb3duc2FtcGxlZE91dFNpZ25hbCwgJmhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtIWUJSSURfUkVBRF9PRkZTRVRdLCBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cywgcHNRbWZTY2FsZSwgcW1mU2NhbGUpKSkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCitiYWlsOgorCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgcHNGaW5kQmVzdFNjYWxpbmcoCisgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgKmR5bkJhbmRTY2FsZSwKKyAgICAgICAgRklYUF9RTUYgICAgICAgICAgICAgICAgICptYXhCYW5kVmFsdWUsCisgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAqZG14U2NhbGUKKyAgICAgICAgKQoreworICBIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSAgICAgID0gIGhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGU7CisKKyAgSU5UIGdyb3VwLCBiaW4sIGNvbCwgYmFuZDsKKyAgY29uc3QgSU5UIGZyYW1lU2l6ZSAgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90czsKKyAgY29uc3QgSU5UIHBzQmFuZHMgICAgPSAoSU5UKSBoUHNFbmNvZGUtPnBzRW5jTW9kZTsKKyAgY29uc3QgSU5UIG5JaWRHcm91cHMgPSBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHM7CisKKyAgLyogZ3JvdXAgd2lzZSBzY2FsaW5nICovCisgIEZJWFBfUU1GIG1heFZhbCBbMl1bUFNfTUFYX0JBTkRTXTsKKyAgRklYUF9RTUYgbWF4VmFsdWUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgIEZES21lbWNsZWFyKG1heFZhbCwgc2l6ZW9mKG1heFZhbCkpOworCisgIC8qIHN0YXJ0IHdpdGggaHlicmlkIGRhdGEgKi8KKyAgZm9yIChncm91cD0wOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKKyAgICAvKiBUcmFuc2xhdGUgZ3JvdXAgdG8gYmluICovCisgICAgYmluID0gaFBzRW5jb2RlLT5zdWJiYW5kMnBhcmFtZXRlckluZGV4W2dyb3VwXTsKKworICAgIC8qIFRyYW5zbGF0ZSBmcm9tIDIwIGJpbnMgdG8gMTAgYmlucyAqLworICAgIGlmIChoUHNFbmNvZGUtPnBzRW5jTW9kZSA9PSBQU19CQU5EU19DT0FSU0UpIHsKKyAgICAgIGJpbiA+Pj0gMTsKKyAgICB9CisKKyAgICAvKiBRTUYgZG93bm1peCBzY2FsaW5nICovCisgICAgeworICAgICAgRklYUF9RTUYgdG1wID0gbWF4VmFsWzBdW2Jpbl07CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoY29sPTA7IGNvbDxmcmFtZVNpemUtSFlCUklEX1JFQURfT0ZGU0VUOyBjb2wrKykgeworICAgICAgICBmb3IgKGkgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07IGkgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCsxXTsgaSsrKSB7CisgICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVswXVswXVtpXSkpOworICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMV1baV0pKTsKKyAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzFdWzBdW2ldKSk7CisgICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVsxXVtpXSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtYXhWYWxbMF1bYmluXSA9IHRtcDsKKworICAgICAgdG1wID0gbWF4VmFsWzFdW2Jpbl07CisgICAgICBmb3IgKGNvbD1mcmFtZVNpemUtSFlCUklEX1JFQURfT0ZGU0VUOyBjb2w8ZnJhbWVTaXplOyBjb2wrKykgeworICAgICAgICBmb3IgKGkgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07IGkgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCsxXTsgaSsrKSB7CisgICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVswXVswXVtpXSkpOworICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMV1baV0pKTsKKyAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzFdWzBdW2ldKSk7CisgICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVsxXVtpXSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtYXhWYWxbMV1bYmluXSA9IHRtcDsKKyAgICB9CisgIH0gLyogbklpZEdyb3VwcyAqLworCisgIC8qIGNvbnZlcnQgbWF4U3BlYyB0byBtYXhTY2FsaW5nLCBmaW5kIHNjYWxpbmcgc3BhY2UgKi8KKyAgZm9yIChiYW5kPTA7IGJhbmQ8cHNCYW5kczsgYmFuZCsrKSB7CisjaWZuZGVmIE1VTFRfMTZ4MTYKKyAgICBkeW5CYW5kU2NhbGVbYmFuZF0gPSBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhWYWxbMF1bYmFuZF0sbWF4QmFuZFZhbHVlW2JhbmRdKSk7CisjZWxzZQorICAgIGR5bkJhbmRTY2FsZVtiYW5kXSA9IGZpeE1heCgwLENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heFZhbFswXVtiYW5kXSxtYXhCYW5kVmFsdWVbYmFuZF0pKS1GUkFDVF9CSVRTKTsKKyNlbmRpZgorICAgIG1heFZhbHVlID0gZml4TWF4KG1heFZhbHVlLGZpeE1heChtYXhWYWxbMF1bYmFuZF0sbWF4VmFsWzFdW2JhbmRdKSk7CisgICAgbWF4QmFuZFZhbHVlW2JhbmRdID0gZml4TWF4KG1heFZhbFswXVtiYW5kXSwgbWF4VmFsWzFdW2JhbmRdKTsKKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBtYXhpbWFsIHNjYWxpbmcgZm9yIFFNRiBkb3dubWl4ICovCisjaWZuZGVmIE1VTFRfMTZ4MTYKKyAgKmRteFNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLCBDb3VudExlYWRpbmdCaXRzKG1heFZhbHVlKSk7CisjZWxzZQorICAqZG14U2NhbGUgPSBmaXhNYXgoMCxmaXhNaW4oRlJBQ1RfQklUUywgQ291bnRMZWFkaW5nQml0cyhGWF9RTUYyRlhfREJMKG1heFZhbHVlKSkpKTsKKyNlbmRpZgorCit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3BzX21haW4uaCBiL2FhYy9saWJTQlJlbmMvc3JjL3BzX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIzMmZmCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvcHNfbWFpbi5oCkBAIC0wLDAgKzEsMjcxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBJbml0aWFsIEF1dGhvcnM6ICAgICAgTWFya3VzIE11bHRydXMKKyAgIENvbnRlbnRzL0Rlc2NyaXB0aW9uOiBQUyBXcmFwcGVyLCBEb3dubWl4IGhlYWRlciBmaWxlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ0xVREVEX1BTX01BSU5fSAorI2RlZmluZSBfX0lOQ0xVREVEX1BTX01BSU5fSAorCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgInFtZi5oIgorI2luY2x1ZGUgInBzX2VuY29kZS5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfaHlicmlkLmgiCisKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgUFNFTkNfU1RFUkVPX0JBTkRTX0lOVkFMSUQgPSAwLAorICBQU0VOQ19TVEVSRU9fQkFORFNfMTAgICAgICA9IDEwLAorICBQU0VOQ19TVEVSRU9fQkFORFNfMjAgICAgICA9IDIwCisKK30gUFNFTkNfU1RFUkVPX0JBTkRTX0NPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgUFNFTkNfTkVOVl8xICAgICAgICAgICAgICAgPSAxLAorICBQU0VOQ19ORU5WXzIgICAgICAgICAgICAgICA9IDIsCisgIFBTRU5DX05FTlZfNCAgICAgICAgICAgICAgID0gNCwKKyAgUFNFTkNfTkVOVl9ERUZBVUxUICAgICAgICAgPSBQU0VOQ19ORU5WXzIsCisgIFBTRU5DX05FTlZfTUFYICAgICAgICAgICAgID0gUFNFTkNfTkVOVl80CisKK30gUFNFTkNfTkVOVl9DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVGcm9tOyAgIC8qIGluY2x1c2l2ZSAqLworICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZVRvOyAgICAgLyogZXhjbHVzaXZlICovCisgIFBTRU5DX1NURVJFT19CQU5EU19DT05GSUcgICBuU3RlcmVvQmFuZHM7CisgIFBTRU5DX05FTlZfQ09ORklHICAgICAgICAgICBuRW52ZWxvcGVzOworICBMT05HICAgICAgICAgICAgICAgICAgICAgICAgaWlkUXVhbnRFcnJvclRocmVzaG9sZDsgIC8qIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgdG8gc3dpdGNoIGJldHdlZW4gY29hcnNlIGFuZCBmaW5lIGlpZCBxdWFudGl6YXRpb24gKi8KKworfSBwc1R1bmluZ1RhYmxlX3Q7CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyB7CisgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgICBoUHNFbmNvZGU7CisgIFBTX09VVCAgICAgICAgICAgICAgICAgICAgICBwc091dFsyXTsKKworICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF1bTUFYX1BTX0NIQU5ORUxTXVsyXVtNQVhfSFlCUklEX0JBTkRTXTsKKyAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgKnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVCtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdOworCisgIEZJWFBfUU1GICAgICAgICAgICAgICAgICAgICBxbWZEZWxheUxpbmVzWzJdW1FNRl9NQVhfVElNRV9TTE9UUz4+MV1bUU1GX0NIQU5ORUxTXTsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkRlbGF5U2NhbGU7CisKKyAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIHBzRGVsYXk7CisgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBtYXhFbnZlbG9wZXM7CisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBkeW5CYW5kU2NhbGVbUFNfTUFYX0JBTkRTXTsKKyAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgIG1heEJhbmRWYWx1ZVtQU19NQVhfQkFORFNdOworICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgZG14U2NhbGU7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBpbml0UFM7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBub1FtZlNsb3RzOworICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kczsKKworICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJBbmFTdGF0ZXNMRltNQVhfUFNfQ0hBTk5FTFNdWzIqSFlCUklEX0ZJTFRFUl9MRU5HVEgqSFlCUklEX01BWF9RTUZfQkFORFNdOworICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJBbmFTdGF0ZXNIRltNQVhfUFNfQ0hBTk5FTFNdWzIqSFlCUklEX0ZJTFRFUl9ERUxBWSooUU1GX0NIQU5ORUxTLUhZQlJJRF9NQVhfUU1GX0JBTkRTKV07CisgIEZES19BTkFfSFlCX0ZJTFRFUiAgICAgICAgICBmZGtIeWJBbmFGaWx0ZXJbTUFYX1BTX0NIQU5ORUxTXTsKKyAgRkRLX1NZTl9IWUJfRklMVEVSICAgICAgICAgIGZka0h5YlN5bkZpbHRlcjsKKworfSBQQVJBTUVUUklDX1NURVJFTzsKKworCit0eXBlZGVmIHN0cnVjdCBUX1BTRU5DX0NPTkZJRyB7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemU7CisgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBxbWZGaWx0ZXJNb2RlOworICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgc2JyUHNEZWxheTsKKyAgUFNFTkNfU1RFUkVPX0JBTkRTX0NPTkZJRyAgIG5TdGVyZW9CYW5kczsKKyAgUFNFTkNfTkVOVl9DT05GSUcgICAgICAgICAgIG1heEVudmVsb3BlczsKKyAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7CisKK30gUFNFTkNfQ09ORklHLCAqSEFORExFX1BTRU5DX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPOworCisKKy8qKgorICogXGJyaWVmICBDcmVhdGUgYSBwYXJhbWV0cmljIHN0ZXJlbyBlbmNvZGVyIGluc3RhbmNlLgorICoKKyAqIFxwYXJhbSBwaFBhcmFtZXRyaWNTdGVyZW8gICAgQSBwb2ludGVyIHRvIGEgcGFyYW1ldHJpYyBzdGVyZW8gaGFuZGxlIHRvIGJlIGFsbG9jYXRlZC4gSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gUFNFTkNfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gUFNFTkNfSU5WQUxJRF9IQU5ETEUsIFBTRU5DX01FTU9SWV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZSgKKyAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgSW5pdGlhbGl6ZSBhIHBhcmFtZXRyaWMgc3RlcmVvIGVuY29kZXIgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIGhQYXJhbWV0cmljU3RlcmVvICAgICBNZXRhIERhdGEgaGFuZGxlLgorICogXHBhcmFtIGhQc0VuY0NvbmZpZyAgICAgICAgICBGaWxsZWQgcGFyYW1ldHJpYyBzdGVyZW8gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gbm9RbWZTbG90cyAgICAgICAgICAgIE51bWJlciBvZiBzbG90cyB3aXRoaW4gb25lIGF1ZGlvIGZyYW1lLgorICogXHBhcmFtIG5vUW1mQmFuZHMgICAgICAgICAgICBOdW1iZXIgb2YgUU1GIGJhbmRzLgorICogXHBhcmFtIGR5bmFtaWNfUkFNICAgICAgICAgICBQb2ludGVyIHRvIHByZWFsbG9jYXRlZCB3b3JrYnVmZmVyLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gUFNFTkNfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gUFNFTkNfSU5WQUxJRF9IQU5ETEUsIFBTRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19QU0VOQ19FUlJPUiBQU0VuY19Jbml0KAorICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICBjb25zdCBIQU5ETEVfUFNFTkNfQ09ORklHIGhQc0VuY0NvbmZpZywKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBub1FtZlNsb3RzLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHMKKyAgICAgICAsVUNIQVIgICAgICAgICAgICAgICAgICAgICpkeW5hbWljX1JBTQorICAgICAgICApOworCisKKy8qKgorICogXGJyaWVmICBEZXN0cm95IHBhcmFtZXRyaWMgc3RlcmVvIGVuY29kZXIgaW5zdGFuY2UuCisgKgorICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCisgKgorICogXHBhcmFtIHBoUGFyYW1ldHJpY1N0ZXJlbyAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0cmljIHN0ZXJlbyBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBQU0VOQ19PSywgb24gc3VjY2VzLgorICogICAgICAgICAgLSBQU0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KKyAqLworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0Rlc3Ryb3koCisgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvCisgICAgICAgICk7CisKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IHBhcmFtZXRyaWMgc3RlcmVvIHByb2Nlc3NpbmcuCisgKgorICogXHBhcmFtIGhQYXJhbWV0cmljU3RlcmVvICAgICBNZXRhIERhdGEgaGFuZGxlLgorICogXHBhcmFtIHNhbXBsZXMgICAgICAgICAgICAgICBQb2ludGVyIHRvIDIgY2hhbm5lbCBhdWRpbyBpbnB1dCBzaWduYWwuCisgKiBccGFyYW0gdGltZUluU3RyaWRlLCAgICAgICAgIFN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgYnVmZmVyLgorICogXHBhcmFtIGhRbWZBbmFseXNpcywgICAgICAgICBQb2ludGVyIHRvIFFNRiBhbmFseXNpcyBmaWx0ZXJiYW5rcy4KKyAqIFxwYXJhbSBkb3dubWl4ZWRSZWFsUW1mRGF0YSAgUG9pbnRlciB0byByZWFsIFFNRiBidWZmZXIgdG8gYmUgd3JpdHRlbiB0by4KKyAqIFxwYXJhbSBkb3dubWl4ZWRJbWFnUW1mRGF0YSAgUG9pbnRlciB0byBpbWFnIFFNRiBidWZmZXIgdG8gYmUgd3JpdHRlbiB0by4KKyAqIFxwYXJhbSBkb3duc2FtcGxlZE91dFNpZ25hbCAgUG9pbnRlciB0byBidWZmZXIgd2hlcmUgdG8gd3JpdGUgZG93bm1peGVkIHRpbWVzaWduYWwuCisgKiBccGFyYW0gc2JyU3ludGhRbWYgICAgICAgICAgIFBvaW50ZXIgdG8gUU1GIHN5bnRoZXNpcyBmaWx0ZXJiYW5rLgorICogXHBhcmFtIHFtZlNjYWxlICAgICAgICAgICAgICBSZXR1cm4gc2NhbGluZyBmYWN0b3Igb2YgdGhlIHFtZiBkYXRhLgorICogXHBhcmFtIHNlbmRIZWFkZXIgICAgICAgICAgICBTaWduYWwgd2hldGhlciB0byB3cml0ZSBoZWFkZXIgZGF0YS4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIFBTRU5DX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIFBTRU5DX0lOVkFMSURfSEFORExFLCBQU0VOQ19FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNfUGFyYW1ldHJpY1N0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICAqc2FtcGxlc1syXSwKKyAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCisgICAgICAgIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICoqaFFtZkFuYWx5c2lzLAorICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZFJlYWxRbWZEYXRhLAorICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZEltYWdRbWZEYXRhLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKmRvd25zYW1wbGVkT3V0U2lnbmFsLAorICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LICAgIHNiclN5bnRoUW1mLAorICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKnFtZlNjYWxlLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKKyAgICAgICAgKTsKKworCisvKioKKyAqIFxicmllZiAgV3JpdGUgcGFyYW1ldHJpYyBzdGVyZW8gYml0c3RyZWFtLgorICoKKyAqIFdyaXRlIHBzX2RhdGEoKSBlbGVtZW50IHRvIGJpdHN0cmVhbSBhbmQgcmV0dXJuIG51bWJlciBvZiB3cml0dGVuIGJpdHMuCisgKiBSZXR1cm5zIG51bWJlciBvZiB3cml0dGVuIGJpdHMgb25seSwgaWYgaEJpdHN0cmVhbSA9PSBOVUxMLgorICoKKyAqIFxwYXJhbSBoUGFyYW1ldHJpY1N0ZXJlbyAgICAgTWV0YSBEYXRhIGhhbmRsZS4KKyAqIFxwYXJhbSBoQml0c3RyZWFtICAgICAgICAgICAgQml0c3RyZWFtIGJ1ZmZlciBoYW5kbGUuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBudW1iZXIgb2Ygd3JpdHRlbiBiaXRzLgorICovCitJTlQgRkRLc2JyRW5jX1BTRW5jX1dyaXRlUFNEYXRhKAorICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgIGhCaXRzdHJlYW0KKyAgICAgICAgKTsKKworI2VuZGlmIC8qIF9fSU5DTFVERURfUFNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuY3BwIGIvYWFjL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWRiMjQzCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDUwNyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIEZESyByZXNhbXBsZXIgdG9vbCBib3g6IAorICBcYXV0aG9yIE0uIFdlcm5lcgorKi8KKworI2luY2x1ZGUgInJlc2FtcGxlci5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICBCSVFVQUQgRmlsdGVyIFNwZWNpZmljYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQjEgMAorI2RlZmluZSBCMiAxCisjZGVmaW5lIEExIDIKKyNkZWZpbmUgQTIgMworCisjZGVmaW5lIEJRQyh4KSBGTDJGWENPTlNUX1NHTCh4LzIpCisKKworc3RydWN0IEZJTFRFUl9QQVJBTSB7CisgIGNvbnN0IEZJWFBfU0dMICpjb2VmZmE7ICAgIC8qISBTT1MgbWF0cml4IE9uZSByb3cvc2VjdGlvbi4gU2NhbGVkIHVzaW5nIEJRQygpLiBPcmRlciBvZiBjb2VmZmljaWVudHM6IEIxLEIyLEExLEEyLiBCMD1BMD0xLjAgKi8KKyAgRklYUF9EQkwgZzsgICAgICAgICAgICAgICAgLyohIG92ZXJhbGwgZ2FpbiAqLworICBpbnQgV2M7ICAgICAgICAgICAgICAgICAgICAvKiEgbm9ybWFsaXplZCBwYXNzYmFuZCBiYW5kd2lkdGggYXQgaW5wdXQgc2FtcGxlcmF0ZSAqIDEwMDAgKi8KKyAgaW50IG5vQ29lZmZzOyAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzICovCisgIGludCBkZWxheTsgICAgICAgICAgICAgICAgIC8qISBkZWxheSBpbiBzYW1wbGVzIGF0IGlucHV0IHNhbXBsZXJhdGUgKi8KK307CisKKyNkZWZpbmUgQklRVUFEX0NPRUZTVEVQIDQKKworLyoqCisgKlxicmllZiBMb3cgUGFzcworIFdjID0gMCw1LCBvcmRlciAzMCwgU3RvcCBCYW5kIC05NmRCLiBXYyBjcml0ZXJpYSBpcyAiYWxtb3N0IDBkQiBwYXNzYmFuZCIsIG5vdCB0aGUgdXN1YWwgLTNkYiBnYWluIHBvaW50LgorIFtiLGFdPWNoZWJ5MigzMCw5NiwwLjUwNSkKKyBbc29zLGddPXRmMnNvcyhiLGEpCisgYmFuZHdpZHRoIDAuNDgKKyAqLworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQ4W10gPSB7CisgQlFDKDEuOTg5NDEwNzU2ODE5MzgpLCAgIEJRQygwLjk5OTk5OTk5Njg5MDgxMSksIEJRQygwLjg2MzI2NDUyNzIwMTk2MyksICAgICBCUUMoIDAuMTg5NTUzNzk5OTYwNjYzKSwKKyBCUUMoMS45MDczMzgwNDgyMjQ0NSksICAgQlFDKDEuMDAwMDAwMDE3MzYxODkpLCAgQlFDKDAuODM2MzIxNTc1ODQxNjkxKSwgICAgIEJRQyggMC4yMDM1MDU4MDkyNjY1NjQpLAorIEJRQygxLjc1NjE2NjY1NDk1MzI1KSwgICBCUUMoMC45OTk5OTk5NDYwNzk3MjEpLCBCUUMoMC43ODQ2OTkyMjUxMjE1ODgpLCAgICAgQlFDKCAwLjIzMDQ3MTI2NTUwNjk4NiksCisgQlFDKDEuNTU3Mjc3NDU1MTI3MjYpLCAgIEJRQygxLjAwMDAwMDExNzM3ODE1KSwgIEJRQygwLjcxMjUxNTQyMzU4ODM1MSksICAgICBCUUMoIDAuMjY4NzUyNzIzOTAwNDk4KSwKKyBCUUMoMS4zMzQwNzU5MTk0MzY0MyksICAgQlFDKDAuOTk5OTk5Nzk1OTUzMjI4KSwgQlFDKDAuNjI1MDU5MTE3MzMwOTg5KSwgICAgIEJRQyggMC4zMTYxOTQ2ODUyODg5NjUpLAorIEJRQygxLjEwNjg5ODk4NDEyNDU4KSwgICBCUUMoMS4wMDAwMDAzNTA1NzExNCksICBCUUMoMC41MjgwMzUxNDM2NjM5OCksICAgICAgQlFDKCAwLjM3MDUxNzg0MzIyNDY2OSksCisgQlFDKDAuODkwNjAzNzEwNzg0NTQpLCAgIEJRQygwLjk5OTk5OTM0Mzk2MjgyMiksIEJRQygwLjQyNjkyMDQ2MjE2NTI1NyksICAgICBCUUMoIDAuNDI5NjA4MjAwMjA3NzQ2KSwKKyBCUUMoMC42OTQ0MzgyNjEyMDk0MzMpLCAgQlFDKCAxLjAwMDAwMDg2Mjk3OTIpLCAgQlFDKDAuMzI2NTMwNjk5NTYxNzE2KSwgICAgIEJRQyggMC40OTE3MTQ0NTA2NTQxNzQpLAorIEJRQygwLjUyMzIzNzgwMDkzNTMyMiksICBCUUMoMS4wMDAwMDEwMTM0OTc4MiksICBCUUMoMC4yMzA4Mjk1NTYyNzQ4NTEpLCAgICAgQlFDKCAwLjU1NTU1OTAzNDg0MzI4MSksCisgQlFDKDAuMzc4NjMxMTY1OTI5NTYzKSwgIEJRQygwLjk5OTk4OTg2NDgyNjY1KSwgIEJRQygwLjE0MjkwNjQyMjAzNjA5NSksICAgICBCUUMoIDAuNjIwMzM4ODc0NDQyNDExKSwKKyBCUUMoMC4yNjA3ODY5MTEzMDg0MzcpLCAgQlFDKDEuMDAwMDMyNjE0NjAxNzgpLCAgQlFDKDAuMDY1MTAwODU3NjI1NjUwNSksICAgIEJRQyggMC42ODU3NTk5MjM5MjYyNjIpLAorIEJRQygwLjE2ODQwOTQyOTE4ODA5OCksICBCUUMoMC45OTk5MzMwNDk2OTU4MjgpLCBCUUMoLTAuMDAwNzkwMDY3Nzg5OTc1NTYyKSwgQlFDKCAwLjc1MTkwNTg5NjYwMjMyNSksCisgQlFDKDAuMTAwNzI0NTMzODE4NjI4KSwgIEJRQygxLjAwMDA5NDcyNjY5ODcyKSwgIEJRQygtMC4wNTMzNzcyODMwMjU3MDQxKSwgICBCUUMoIDAuODE5MzA3NDQzODQ1MjUpLAorIEJRQygwLjA1NjE0MzQzNTc4NjczNjMpLCBCUUMoMC45OTk5MTE2MzYzMDQyNzYpLCBCUUMoLTAuMDkxMzU1MDI5OTIzNjQwNSksICAgQlFDKCAwLjg4ODgzNjI1ODc1OTE1KSwKKyBCUUMoMC4wMzQxNjgwNjc4NjYyMDU3KSwgQlFDKDEuMDAwMDM2Njc1MDg2NzYpLCAgQlFDKC0wLjExMzQwNTE4NTUzNjY5NyksICAgIEJRQyggMC45NjE3NTY2MzgyNjg0NDYpCit9OworCisjaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0gRkwyRlhDT05TVF9EQkwoMC42NzQzNjUzMjA2MTE2MTk5MjY4MjQwNDQ4MDcxNzY3MSAtIDAuMDAxKTsKKyNlbHNlCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI3MTI4NjY1MzAwNDcpIC0gKEZJWFBfREJMKTB4ODAwMDsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQ0OCA9IHsKKyAgc29zNDgsCisgIGc0OCwKKyAgNDgwLAorICAxNSwKKyAgNCAvKiBMRiAyICovCit9OworCisvKioKKyAqXGJyaWVmIExvdyBQYXNzCisgV2MgPSAwLDUsIG9yZGVyIDI0LCBTdG9wIEJhbmQgLTk2ZEIuIFdjIGNyaXRlcmlhIGlzICJhbG1vc3QgMGRCIHBhc3NiYW5kIiwgbm90IHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuCisgW2IsYV09Y2hlYnkyKDI0LDk2LDAuNSkKKyBbc29zLGddPXRmMnNvcyhiLGEpCisgYmFuZHdpZHRoIDAuNDUKKyAqLworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQ1W10gPSB7CisgIEJRQygxLjk4Mjk2MjYwMTQ0NCksICAgICBCUUMoMS4wMDAwMDAwMDAwNzUwNCksICBCUUMoMC42NDYxMTMzMDM3Mzc4MzYpLCAgIEJRQyggMC4xMDg1MTE0OTk3OTk4MSksCisgIEJRQygxLjg1MzM0MDk0MjgxMTExKSwgICBCUUMoMC45OTk5OTk5OTk2NzcxOTIpLCBCUUMoMC42MTIwNzMyMjAxMDIwMDYpLCAgIEJRQyggMC4xMzAwMjIxNDE2OTgwNDQpLAorICBCUUMoMS42MjU0MTA1MTQxNTQyNSksICAgQlFDKDEuMDAwMDAwMDAwODAzOTgpLCAgQlFDKDAuNTQ3ODc5NzAyODU1OTU5KSwgICBCUUMoIDAuMTcxMTY1ODI1MTMzMTkyKSwKKyAgQlFDKDEuMzQ1NTQ2NTY5MjMyNDcpLCAgIEJRQygwLjk5OTk5OTk5ODAxNjkpLCAgIEJRQygwLjQ2MDM3MzkxNDUwODQ5MSksICAgQlFDKCAwLjIyODY3NzQ2MzM3NjM1NCksCisgIEJRQygxLjA1NjU2NTY4NTAzMTE2KSwgICBCUUMoMS4wMDAwMDAwMDU2OTM2MyksICBCUUMoMC4zNTc4OTE4OTQwMzgyODcpLCAgIEJRQyggMC4yOTg2NzY4NDM5MTIxODUpLAorICBCUUMoMC43ODc5Njc1ODc4NzczMTIpLCAgQlFDKDAuOTk5OTk5OTg0NDE1MDE3KSwgQlFDKDAuMjQ4ODI2ODkzMjExODc3KSwgICBCUUMoIDAuMzc3NDQxODAzNTEyOTc4KSwKKyAgQlFDKDAuNTU1NDgwOTcxMTIwNDk3KSwgIEJRQygxLjAwMDAwMDAzNTgzMzA3KSwgIEJRQygwLjE0MDYxNDI2MzM0NTMxNSksICAgQlFDKCAwLjQ2MTk3OTMwMjIxMzY3OSksCisgIEJRQygwLjM2NDk4NjIwNzA3MDk2NCksICBCUUMoMC45OTk5OTk5MzIwODQzMDMpLCBCUUMoMC4wMzkyNjY5NDQ2MDc0NTE2KSwgIEJRQyggMC41NTAzMzQ1MTE4MDgyNSksCisgIEJRQygwLjIxNjgyNzI2NzYzMTU1OCksICBCUUMoMS4wMDAwMDAxMDUzNDY4MiksICBCUUMoLTAuMDUwNjIzMjIyODg2NTEwMyksIEJRQyggMC42NDE2OTE1ODE1NjA5NDYpLAorICBCUUMoMC4xMDg5NTE2NzIyNzcxMTkpLCAgQlFDKDAuOTk5OTk5ODcxMTY3NTE2KSwgQlFDKC0wLjEyNTU4NDg0MDE4MzIyNSksICBCUUMoIDAuNzM2MzY3NzQ4NzcxODAzKSwKKyAgQlFDKDAuMDM4Nzk4ODYwNzIyOTAzNSksIEJRQygxLjAwMDAwMDExMjA1NTc0KSwgIEJRQygtMC4xODI4MTQ4NDkwOTc5NzQpLCAgQlFDKCAwLjgzNTgwMjEwODcxNDk2NCksCisgIEJRQygwLjAwNDI4NjYxNzU4MDkyMjUpLCBCUUMoMC45OTk5OTk5NTQ4MzA4MTMpLCBCUUMoLTAuMjE5NjU3NDA2MTcxNTEpLCAgIEJRQyggMC45NDI2MjMwNDc3ODIzNjMpCit9OworCisjaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0gRkwyRlhDT05TVF9EQkwoMC42MDU0NzQyODg5MTM0MTMxOTA1MTE0MjYyOTcwNjcyMyAtIDAuMDAxKTsKKyNlbHNlCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI0Mjc0Mzk4MDkwOTUyNCkgLSAoRklYUF9EQkwpMHg4MDAwOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDQ1ID0geworICBzb3M0NSwKKyAgZzQ1LAorICA0NTAsCisgIDEyLAorICA0IC8qIExGIDIgKi8KK307CisKKy8qCisgQ3JlYXRlZCBieSBPY3RhdmUgMi4xLjczLCBNb24gT2N0IDEzIDE3OjMxOjMyIDIwMDggQ0VTVAorIFdjID0gMCw1LCBvcmRlciAxNiwgU3RvcCBCYW5kIC05NmRCIGRhbXBpbmcuCisgW2IsYV09Y2hlYnkyKDE2LDk2LDAuNSkKKyBbc29zLGddPXRmMnNvcyhiLGEpCisgYmFuZHdpZHRoID0gMC40MQorICovCisKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3M0MVtdID0KK3sKKyAgQlFDKDEuOTYxOTM2MjUyOTIpLCAgICAgICBCUUMoMC45OTk5OTk5OTk5OTk5NjQpLCBCUUMoMC4xNjkyNjYxNzg3ODY3ODkpLCAgIEJRQygwLjAxMjg4MjMzMDA0NzU5MDcpLAorICBCUUMoMS42ODkxMzQzNzY2MjA5MiksICAgIEJRQygxLjAwMDAwMDAwMDAwMDUzKSwgIEJRQygwLjEyNDc1MTUwMzIwNjU1MiksICAgQlFDKDAuMDUzNzQ3MjI3Mzk1MDk4OSksCisgIEJRQygxLjI3Mjc0NjkyMzY2MDE3KSwgICAgQlFDKDAuOTk5OTk5OTk5OTk1Njc0KSwgQlFDKDAuMDQzMzEwODYyNTE3ODM1NyksICBCUUMoMC4xMzEwMTU3NTMyMzYzMTcpLAorICBCUUMoMC44NTIxNDE3NTA4ODM5NSksICAgIEJRQygxLjAwMDAwMDAwMDAxODEzKSwgIEJRQygtMC4wNjI1NjU4MTUyNTUwNDA4KSwgQlFDKDAuMjM3NzYzNzc4OTkzODA2KSwKKyAgQlFDKDAuNTAzODQxNTc5OTM5MDA5KSwgICBCUUMoMC45OTk5OTk5OTk5NTMyMjMpLCBCUUMoLTAuMTc5MTc2MTI4NzIyODY1KSwgIEJRQygwLjM2NzQ3NTIzNjQyNDQ3NCksCisgIEJRQygwLjI0OTk5MDcxMTk4NjE2MiksICAgQlFDKDEuMDAwMDAwMDAwMDc5NTIpLCAgQlFDKC0wLjI5NDQyNTE2NTgyNDY3NiksICBCUUMoMC41MTY1OTQ4NTcxNzAyMTIpLAorICBCUUMoMC4wODc5NzE2Njg2ODAyODYpLCAgIEJRQygwLjk5OTk5OTk5OTkxNTUyOCksIEJRQygtMC4zOTg5NTY1NjY3Nzc5MjgpLCAgQlFDKDAuNjg2NDE3NzY3ODAxMTIzKSwKKyAgQlFDKDAuMDA5NjUzNzMzMjUzNTAyOTQpLCBCUUMoMS4wMDAwMDAwMDAwMzc0NCksICBCUUMoLTAuNDg1NzkxNzM3NjQ4MTcpLCAgIEJRQygwLjg4NDkzMTUzNDIzOTA2OCkKK307CisKKyNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDEgPSBGTDJGWENPTlNUX0RCTCgwLjQ0NTc4NTE0NDc2NDc2Njc5NzUwODExMjIyMTIzNTY5KTsKKyNlbHNlCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQxID0gRkwyRlhDT05TVF9EQkwoMC4wMDE1NTk1Njk1MTE2OTI0OCk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0NDEgPSB7CisgIHNvczQxLAorICBnNDEsCisgIDQxMCwKKyAgOCwKKyAgNSAvKiBMRiAzICovCit9OworCisvKgorICMgQ3JlYXRlZCBieSBPY3RhdmUgMi4xLjczLCBNb24gT2N0IDEzIDE3OjU1OjMzIDIwMDggQ0VTVAorIFdjID0gMCw1LCBvcmRlciAxMiwgU3RvcCBCYW5kIC05NmRCIGRhbXBpbmcuCisgW2IsYV09Y2hlYnkyKDEyLDk2LDAuNSk7CisgW3NvcyxnXT10ZjJzb3MoYixhKQorKi8KK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3MzNVtdID0KK3sKKyAgQlFDKDEuOTMyOTkzMjUyMzU3NjIpLCAgIEJRQygwLjk5OTk5OTk5OTk5OTk4NSksIEJRQygtMC4xNDA3MzMxODcyNDY1OTYpLCBCUUMoMC4wMTI0MTM5NDk3ODM2MDYyKSwKKyAgQlFDKDEuNDg5MDQxNjc2NDEwOSksICAgIEJRQygxLjAwMDAwMDAwMDAwMDExKSwgIEJRQygtMC4xOTgyMTU0MDI1ODg1MDQpLCBCUUMoMC4wNzQ2NzMwNjE2NTg0MTM4KSwKKyAgQlFDKDAuOTE4NDUwMTYxMzA5Nzk1KSwgIEJRQygwLjk5OTk5OTk5OTk5OTYxOSksIEJRQygtMC4zMDEzMzkxMjc5MTk0MSksICBCUUMoMC4xOTIyNzY0Njg4Mzk1MjkpLAorICBCUUMoMC40NTQ4NzcwMjQyNDY4MTgpLCAgQlFDKDEuMDAwMDAwMDAwMDAwODYpLCAgQlFDKC0wLjQzMjMzNzMyODgwOTgxNSksIEJRQygwLjM1Njg1MjkzMzY0MjgxNSksCisgIEJRQygwLjE1ODAxNzE0NzExODUwNyksICBCUUMoMC45OTk5OTk5OTk5OTg4NzYpLCBCUUMoLTAuNTc0ODE3NDk0MjQ5Nzc3KSwgQlFDKDAuNTY2MzgwNDM2OTcwODMzKSwKKyAgQlFDKDAuMDE3MTgzNDY0OTQ3ODc0OSksIEJRQygxLjAwMDAwMDAwMDAwMDU1KSwgIEJRQygtMC43MTg1ODExNzgwNDExNjUpLCBCUUMoMC44MzM2NzQ4NDQ4Nzg4OSkKK307CisKKyNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBnMzUgPSBGTDJGWENPTlNUX0RCTCgwLjM0MjkwODUzNTc0OTczODk4Njk0NTIxMjY3NjA2NzkyKTsKKyNlbHNlCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzM1ID0gRkwyRlhDT05TVF9EQkwoMC4wMDE2MjU4MDk5NDEyNTEzMSk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0MzUgPSB7CisgIHNvczM1LAorICBnMzUsCisgIDM1MCwKKyAgNiwKKyAgNAorfTsKKworLyoKKyAjIENyZWF0ZWQgYnkgT2N0YXZlIDIuMS43MywgTW9uIE9jdCAxMyAxODoxNTozOCAyMDA4IENFU1QKKyBXYyA9IDAsNSwgb3JkZXIgOCwgU3RvcCBCYW5kIC05NmRCIGRhbXBpbmcuCisgW2IsYV09Y2hlYnkyKDgsOTYsMC41KTsKKyBbc29zLGddPXRmMnNvcyhiLGEpCisqLworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczI1W10gPQoreworICBCUUMoMS44NTMzNDA5NDMwMTIyNSksICAgQlFDKDEuMCksICAgICAgICAgICAgICAgQlFDKC0wLjcwMjEyNzIxNDIxMjY2MyksIEJRQygwLjEzMjQ1MjQwMzk5ODc2NyksCisgIEJRQygxLjA1NjU2NTY4MjE2NyksICAgICBCUUMoMC45OTk5OTk5OTk5OTk5OTcpLCBCUUMoLTAuNzg5NTAzNjY3ODgwNzg1KSwgQlFDKDAuMjM2MzI4NjkzNTY5MTI4KSwKKyAgQlFDKDAuMzY0OTg2MzA3NDU1NDg5KSwgIEJRQygwLjk5OTk5OTk5OTk5OTk5NiksIEJRQygtMC45NTUxOTExODk4NDMzNzUpLCBCUUMoMC40NDI5NjY0NTc5MzYzNzkpLAorICBCUUMoMC4wMzg3OTg1NzUxNjQyMTI1KSwgQlFDKDEuMCksICAgICAgICAgICAgICAgQlFDKC0xLjE5ODE3Nzg2MDg4MDg0KSwgIEJRQygwLjc3MDQ5Mzg5NTQ1NjMyOCkKK307CisKKyNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBnMjUgPSBGTDJGWENPTlNUX0RCTCgwLjE3NTMzOTE3NDA4OTM2MzQ2OTYwMDgwMjU5OTUwNDcxKTsKKyNlbHNlCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzI1ID0gRkwyRlhDT05TVF9EQkwoMC4wMDA5NDUxODI4MzUyOTQ1NTkpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDI1ID0geworICBzb3MyNSwKKyAgZzI1LAorICAyNTAsCisgIDQsCisgIDUKK307CisKKy8qIE11c3QgYmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNICpjb25zdCBmaWx0ZXJfcGFyYW1TZXRbXSA9IHsKKyAgJnBhcmFtX3NldDQ4LAorICAmcGFyYW1fc2V0NDUsCisgICZwYXJhbV9zZXQ0MSwKKyAgJnBhcmFtX3NldDM1LAorICAmcGFyYW1fc2V0MjUKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgUmVzYW1wbGVyIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIQorICBcYnJpZWYgICBSZXNldCBkb3duc2FtcGxlciBpbnN0YW5jZSBhbmQgY2xlYXIgZGVsYXkgbGluZXMKKworICBccmV0dXJuICBzdWNjZXNzIG9mIG9wZXJhdGlvbgorKi8KKworSU5UIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXYywgICAgICAgICAgICAgICAgICAgLyohPCBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCogICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8pICAgICAgICAgICAgICAgIC8qITwgZG93bnNhbXBsZXIgcmF0aW8gKG9ubHkgMiBzdXBwb3J0ZWQgYXQgdGhlIG1vbW1lbnQpICovCisKK3sKKyAgVUlOVCBpOworICBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNICpjdXJyZW50U2V0PU5VTEw7CisKKyAgRkRLX0FTU0VSVChyYXRpbyA9PSAyKTsKKyAgRkRLbWVtY2xlYXIoRG93blNhbXBsZXItPmRvd25GaWx0ZXIuc3RhdGVzLCBzaXplb2YoRG93blNhbXBsZXItPmRvd25GaWx0ZXIuc3RhdGVzKSk7CisgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnB0ciAgID0gICAwOworCisgIC8qCisgICAgZmluZCBhcHBsaWNhYmxlIHBhcmFtZXRlciBzZXQKKyAgKi8KKyAgY3VycmVudFNldCA9IGZpbHRlcl9wYXJhbVNldFswXTsKKyAgZm9yKGk9MTtpPHNpemVvZihmaWx0ZXJfcGFyYW1TZXQpL3NpemVvZihzdHJ1Y3QgRklMVEVSX1BBUkFNICopO2krKyl7CisgICAgaWYgKGZpbHRlcl9wYXJhbVNldFtpXS0+V2MgPD0gV2MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXJyZW50U2V0ID0gZmlsdGVyX3BhcmFtU2V0W2ldOworICB9CisKKyAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuY29lZmZhID0gY3VycmVudFNldC0+Y29lZmZhOworCisKKyAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuZ2FpbiA9IGN1cnJlbnRTZXQtPmc7CisgIEZES19BU1NFUlQoY3VycmVudFNldC0+bm9Db2VmZnMgPD0gTUFYTlJfU0VDVElPTlMqMik7CisKKyAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIubm9Db2VmZnMgPSBjdXJyZW50U2V0LT5ub0NvZWZmczsKKyAgRG93blNhbXBsZXItPmRlbGF5ID0gY3VycmVudFNldC0+ZGVsYXk7CisgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLldjID0gY3VycmVudFNldC0+V2M7CisKKyAgRG93blNhbXBsZXItPnJhdGlvID0gICByYXRpbzsKKyAgRG93blNhbXBsZXItPnBlbmRpbmcgPSByYXRpby0xOworICByZXR1cm4oMSk7Cit9CisKKworLyohCisgIFxicmllZiAgIGZhc3RlciBzaW1wbGUgZm9sZGluZyBvcGVyYXRpb24KKyAgICAgICAgICAgRmlsdGVyOgorICAgICAgICAgICBIKHopID0gQSh6KS9CKHopCisgICAgICAgICAgIHdpdGgKKyAgICAgICAgICAgQSh6KSA9IGFbMF0qel4wICsgYVsxXSp6XjEgKyBhWzJdKnpeMiAuLi4gYVtuXSp6Xm4KKworICBccmV0dXJuICBmaWx0ZXJlZCB2YWx1ZQorKi8KKworc3RhdGljIGlubGluZSBJTlRfUENNIEFkdmFuY2VGaWx0ZXIoTFBfRklMVEVSICpkb3duRmlsdGVyLCAgLyohPCBwb2ludGVyIHRvIGlpciBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqcElucHV0LCAgICAgICAgICAvKiE8IGlucHV0IG9mIGZpbHRlciAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb3duUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluU3RyaWRlKQoreworICBJTlRfUENNIG91dHB1dDsKKyAgaW50IGksIG47CisKKworI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgorI2RlZmluZSBCSVFVQURfU0NBTEUgMworI2Vsc2UKKyNkZWZpbmUgQklRVUFEX1NDQUxFIDEyCisjZW5kaWYKKworICBGSVhQX0RCTCB5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIEZJWFBfREJMIGlucHV0OworCisgIGZvciAobj0wOyBuPGRvd25SYXRpbzsgbisrKQorICB7CisgICAgRklYUF9CUVMgKCpzdGF0ZXMpWzJdID0gZG93bkZpbHRlci0+c3RhdGVzOworICAgIGNvbnN0IEZJWFBfU0dMICpjb2VmZiA9IGRvd25GaWx0ZXItPmNvZWZmYTsKKyAgICBpbnQgczEsczI7CisKKyAgICBzMSA9IGRvd25GaWx0ZXItPnB0cjsKKyAgICBzMiA9IHMxIF4gMTsKKworI2lmIChTQU1QTEVfQklUUyA9PSAxNikKKyAgICBpbnB1dCA9ICAoKEZJWFBfREJMKXBJbnB1dFtuKmluU3RyaWRlXSkgPDwgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSk7CisjZWxpZiAoU0FNUExFX0JJVFMgPT0gMzIpCisgICAgaW5wdXQgPSAgcElucHV0W24qaW5TdHJpZGVdID4+IEJJUVVBRF9TQ0FMRTsKKyNlbHNlCisjZXJyb3IgTk9UIElNUExFTUVOVEVECisjZW5kaWYKKworI2lmbmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4gLyogTWVyZ2VkIERpcmVjdCBmb3JtIEkgKi8KKworICAgIEZJWFBfQlFTIHN0YXRlMSwgc3RhdGUyLCBzdGF0ZTFiLCBzdGF0ZTJiOworCisgICAgc3RhdGUxID0gc3RhdGVzWzBdW3MxXTsKKyAgICBzdGF0ZTIgPSBzdGF0ZXNbMF1bczJdOworCisgICAgLyogTG9vcCBvdmVyIHNlY3Rpb25zICovCisgICAgZm9yIChpPTA7IGk8ZG93bkZpbHRlci0+bm9Db2VmZnM7IGkrKykKKyAgICB7CisgICAgICBGSVhQX0RCTCBzdGF0ZTA7CisKKyAgICAgIC8qIExvYWQgbWVyZ2VkIHN0YXRlcyAoZnJvbSBuZXh0IHNlY3Rpb24pICovCisgICAgICBzdGF0ZTFiID0gc3RhdGVzW2krMV1bczFdOworICAgICAgc3RhdGUyYiA9IHN0YXRlc1tpKzFdW3MyXTsKKworICAgICAgc3RhdGUwID0gaW5wdXQgICsgZk11bHQoc3RhdGUxLCBjb2VmZltCMV0pICsgZk11bHQoc3RhdGUyLCBjb2VmZltCMl0pOworICAgICAgeSAgICAgID0gc3RhdGUwIC0gZk11bHQoc3RhdGUxYiwgY29lZmZbQTFdKSAtIGZNdWx0KHN0YXRlMmIsIGNvZWZmW0EyXSk7CisKKyAgICAgIC8qIFN0b3JlIG5ldyBmZWVkIGZvcndhcmQgbWVyZ2Ugc3RhdGUgKi8KKyAgICAgIHN0YXRlc1tpKzFdW3MyXSA9IHk8PDE7CisgICAgICAvKiBTdG9yZSBuZXcgZmVlZCBiYWNrd2FyZCBzdGF0ZSAqLworICAgICAgc3RhdGVzW2ldW3MyXSA9IGlucHV0PDwxOworCisgICAgICAvKiBGZWVkYmFjayBvdXRwdXQgdG8gbmV4dCBzZWN0aW9uLiAqLworICAgICAgaW5wdXQgPSB5OworCisgICAgICAvKiBUcmFuc2ZlciBtZXJnZWQgc3RhdGVzICovCisgICAgICBzdGF0ZTEgPSBzdGF0ZTFiOworICAgICAgc3RhdGUyID0gc3RhdGUyYjsKKworICAgICAgLyogU3RlcCB0byBuZXh0IGNvZWYgc2V0ICovCisgICAgICBjb2VmZiArPSBCSVFVQURfQ09FRlNURVA7CisgICAgfQorICAgIGRvd25GaWx0ZXItPnB0ciBePSAxOworICB9CisgIC8qIEFwcGx5IGdsb2JhbCBnYWluICovCisgIHkgPSBmTXVsdCh5LCBkb3duRmlsdGVyLT5nYWluKTsKKworI2Vsc2UgLyogRGlyZWN0IGZvcm0gSUkgKi8KKworICAgIC8qIExvb3Agb3ZlciBzZWN0aW9ucyAqLworICAgIGZvciAoaT0wOyBpPGRvd25GaWx0ZXItPm5vQ29lZmZzOyBpKyspCisgICAgeworICAgICAgRklYUF9CUVMgc3RhdGUxLCBzdGF0ZTI7CisgICAgICBGSVhQX0RCTCBzdGF0ZTA7CisKKyAgICAgIC8qIExvYWQgc3RhdGVzICovCisgICAgICBzdGF0ZTEgPSBzdGF0ZXNbaV1bczFdOworICAgICAgc3RhdGUyID0gc3RhdGVzW2ldW3MyXTsKKworICAgICAgc3RhdGUwID0gaW5wdXQgIC0gZk11bHQoc3RhdGUxLCBjb2VmZltBMV0pIC0gZk11bHQoc3RhdGUyLCBjb2VmZltBMl0pOworICAgICAgeSA9IHN0YXRlMCAgICAgICsgZk11bHQoc3RhdGUxLCBjb2VmZltCMV0pICsgZk11bHQoc3RhdGUyLCBjb2VmZltCMl0pOworICAgICAgLyogQXBwbHkgc2NhdHRlcmVkIGdhaW4gKi8KKyAgICAgIHkgPSBmTXVsdCh5LCBkb3duRmlsdGVyLT5nYWluKTsKKworICAgICAgLyogU3RvcmUgbmV3IHN0YXRlIGluIG5vcm1hbGl6ZWQgZm9ybSAqLworI2lmZGVmIFJTX0JJUVVBRF9TVEFURVMxNgorICAgICAgLyogRG8gbm90IHNhdHVyYXRlIGFueSBzdGF0ZSB2YWx1ZSAhIFRoZSByZXN1bHQgd291bGQgYmUgdW5hY2NlcHRhYmxlLiBSb3VuZGluZyBtYWtlcyBTTlIgYXJvdW5kIDEwZEIgYmV0dGVyLiAqLworICAgICAgc3RhdGVzW2ldW3MyXSA9IChGSVhQX0JRUykoTE9ORykoKHN0YXRlMCArIChGSVhQX0RCTCkoMTw8KERGUkFDVF9CSVRTLUZSQUNUX0JJVFMtMikpKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSk7CisjZWxzZQorICAgICAgc3RhdGVzW2ldW3MyXSA9IHN0YXRlMDw8MTsKKyNlbmRpZgorCisgICAgICAvKiBGZWVkYmFjayBvdXRwdXQgdG8gbmV4dCBzZWN0aW9uLiAqLworICAgICAgaW5wdXQ9eTsKKworICAgICAgLyogU3RlcCB0byBuZXh0IGNvZWYgc2V0ICovCisgICAgICBjb2VmZiArPSBCSVFVQURfQ09FRlNURVA7CisgICAgfQorICAgIGRvd25GaWx0ZXItPnB0ciBePSAxOworICB9CisKKyNlbmRpZgorCisgIC8qIEFwcGx5IGZpbmFsIGdhaW4vc2NhbGluZyB0byBvdXRwdXQgKi8KKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgIG91dHB1dCA9IChJTlRfUENNKSBTQVRVUkFURV9SSUdIVF9TSElGVCh5KyhGSVhQX0RCTCkoMTw8KERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRS0xKSksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSwgU0FNUExFX0JJVFMpOworICAvL291dHB1dCA9IChJTlRfUENNKSBTQVRVUkFURV9SSUdIVF9TSElGVCh5LCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1CSVFVQURfU0NBTEUsIFNBTVBMRV9CSVRTKTsKKyNlbHNlCisgIG91dHB1dCA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoeSwgQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7CisjZW5kaWYKKworCisgIHJldHVybiBvdXRwdXQ7Cit9CisKKworCisKKy8qIQorICBcYnJpZWYgICBGREthYWNFbmNfRG93bnNhbXBsZSBudW1JblNhbXBsZXMgb2YgdHlwZSBJTlRfUENNCisgICAgICAgICAgIFJldHVybnMgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGluIG51bU91dFNhbXBsZXMKKworICBccmV0dXJuICBzdWNjZXNzIG9mIG9wZXJhdGlvbgorKi8KKworSU5UIEZES2FhY0VuY19Eb3duc2FtcGxlKERPV05TQU1QTEVSICpEb3duU2FtcGxlciwgIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmluU2FtcGxlcywgICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUluU2FtcGxlcywgICAgICAgICAgLyohPCBudW1iZXIgIG9mIGlucHV0IHNhbXBsZXMgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGluU3RyaWRlLCAgICAgICAgICAgICAgLyohPCBpbmNyZW1lbnQgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbnVtT3V0U2FtcGxlcywgICAgICAgIC8qITwgcG9pbnRlciB0cCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgb3V0U3RyaWRlICAgICAgICAgICAgICAvKiE8IGluY3JlbWVudCBvZiBvdXRwdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBJTlQgaTsKKyAgICAqbnVtT3V0U2FtcGxlcz0wOworCisgICAgZm9yKGk9MDsgaTxudW1JblNhbXBsZXM7IGkrPURvd25TYW1wbGVyLT5yYXRpbykKKyAgICB7CisgICAgICAqb3V0U2FtcGxlcyA9IEFkdmFuY2VGaWx0ZXIoJihEb3duU2FtcGxlci0+ZG93bkZpbHRlciksICZpblNhbXBsZXNbaSppblN0cmlkZV0sIERvd25TYW1wbGVyLT5yYXRpbywgaW5TdHJpZGUpOworICAgICAgb3V0U2FtcGxlcyArPSBvdXRTdHJpZGU7CisgICAgfQorICAgICpudW1PdXRTYW1wbGVzID0gbnVtSW5TYW1wbGVzL0Rvd25TYW1wbGVyLT5yYXRpbzsKKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuaCBiL2FhYy9saWJTQlJlbmMvc3JjL3Jlc2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTI5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuaApAQCAtMCwwICsxLDE1MSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX19SRVNBTVBMRVJfSAorI2RlZmluZSBfX1JFU0FNUExFUl9ICisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBGaXhlZCBQb2ludCBSZXNhbXBsZXIgVG9vbCBCb3ggIAorKi8KKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBCSVFVQUQgRmlsdGVyIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFYTlJfU0VDVElPTlMgICgxNSkKKworI2lmZGVmIFJTX0JJUVVBRF9TVEFURVMxNgordHlwZWRlZiBGSVhQX1NHTCBGSVhQX0JRUzsKKyNlbHNlCit0eXBlZGVmIEZJWFBfREJMIEZJWFBfQlFTOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfQlFTIHN0YXRlc1tNQVhOUl9TRUNUSU9OUysxXVsyXTsgICAvKiEgc3RhdGUgYnVmZmVyICovCisgIGNvbnN0IEZJWFBfU0dMICpjb2VmZmE7ICAgICAgICAgICAgICAgLyohIHBvaW50ZXIgdG8gZmlsdGVyIGNvZWZmcyAqLworICBGSVhQX0RCTCBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qISBvdmVyYWxsIGdhaW4gZmFjdG9yICovCisgIGludCBXYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXEgKiAxMDAwICovCisgIGludCBub0NvZWZmczsgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzIHNldHMgKi8KKyAgaW50IHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiEgaW5kZXggdG8gcmluYnVmZmVycyAqLworfSBMUF9GSUxURVI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICBEb3duc2FtcGxlciBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICBMUF9GSUxURVIgZG93bkZpbHRlcjsgICAgICAgICAgIC8qISBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgaW50IHJhdGlvOyAgICAgICAgICAgICAgICAgICAgICAvKiEgZG93bnNhbXBsaW5nIHJhdGlvbiAqLworICBpbnQgZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgIC8qISBkb3duc2FtcGxpbmcgZGVsYXkgKHNvdXJjZSBmcykgICAqLworICBpbnQgcGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qISBudW1iZXIgb2YgcGVuZGluZyBvdXRwdXQgc2FtcGxlcyAqLworfSBET1dOU0FNUExFUjsKKworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplZCBhIGdpdmVuIGRvd25zYW1wbGVyIHN0cnVjdHVyZS4KKyAqLworSU5UIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBXYywgICAgICAgICAgICAgICAgICAgLyohPCBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJhdGlvKTsgICAgICAgICAgICAgICAvKiE8IGRvd25zYW1wbGVyIHJhdGlvICovCisKKy8qKgorICogXGJyaWVmIERvd25zYW1wbGUgYSBzZXQgb2YgYXVkaW8gc2FtcGxlcy4gbnVtSW5TYW1wbGVzIG11c3QgYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlCisgKiAgICAgICAgZG93bnNhbXBsZXIgcmF0aW8uCisgKi8KK0lOVCBGREthYWNFbmNfRG93bnNhbXBsZShET1dOU0FNUExFUiAqRG93blNhbXBsZXIsICAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppblNhbXBsZXMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1JblNhbXBsZXMsICAgICAgICAgIC8qITwgbnVtYmVyICBvZiBpbnB1dCBzYW1wbGVzICAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpblN0cmlkZSwgICAgICAgICAgICAgIC8qITwgaW5jcmVtZW50IG9mIGlucHV0IHNhbXBsZXMgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbnVtT3V0U2FtcGxlcywgICAgICAgIC8qITwgcG9pbnRlciB0cCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgb3V0c3RyaWRlKTsgICAgICAgICAgICAvKiE8IGluY3JlbWVudCBvZiBvdXRwdXQgc2FtcGxlcyAqLworCisKKworI2VuZGlmIC8qIF9fUkVTQU1QTEVSX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3Nici5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0YWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Nici5oCkBAIC0wLDAgKzEsMTY2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgTWFpbiBTQlIgc3RydWN0cyBkZWZpbml0aW9ucyAgCisqLworCisjaWZuZGVmIF9fU0JSX0gKKyNkZWZpbmUgX19TQlJfSAorCisjaW5jbHVkZSAiZnJhbV9nZW4uaCIKKyNpbmNsdWRlICJiaXRfc2JyLmgiCisjaW5jbHVkZSAidHJhbl9kZXQuaCIKKyNpbmNsdWRlICJjb2RlX2Vudi5oIgorI2luY2x1ZGUgImVudl9lc3QuaCIKKyNpbmNsdWRlICJjbW9uZGF0YS5oIgorCisjaW5jbHVkZSAicW1mLmgiCisjaW5jbHVkZSAicmVzYW1wbGVyLmgiCisKKyNpbmNsdWRlICJ0b25fY29yci5oIgorCisKKy8qIFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KKyAgI2RlZmluZSBERUxBWV9GUkFNRVMgMgorCisKK3R5cGVkZWYgc3RydWN0IFNCUl9DSEFOTkVMIHsKKyAgICBzdHJ1Y3QgRU5WX0NIQU5ORUwgICAgICAgIGhFbnZDaGFubmVsOworICAgIC8vSU5UX1BDTSAgICAgICAgICAgICAgICAgICpwRFNPdXRCdWZmZXI7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIGRvd25zYW1wbGVkIGF1ZGlvIG91dHB1dCBvZiBTQlIgZW5jb2RlciAqLworICAgIERPV05TQU1QTEVSICAgICAgICAgICAgICAgZG93blNhbXBsZXI7CisKK30gU0JSX0NIQU5ORUw7Cit0eXBlZGVmIFNCUl9DSEFOTkVMKiBIQU5ETEVfU0JSX0NIQU5ORUw7CisKK3R5cGVkZWYgc3RydWN0IFNCUl9FTEVNRU5UIHsKKyAgICBIQU5ETEVfU0JSX0NIQU5ORUwgICAgICAgIHNickNoYW5uZWxbMl07CisgICAgUU1GX0ZJTFRFUl9CQU5LICAgICAgICAgICpoUW1mQW5hbHlzaXNbMl07CisgICAgU0JSX0NPTkZJR19EQVRBICAgICAgICAgICBzYnJDb25maWdEYXRhOworICAgIFNCUl9IRUFERVJfREFUQSAgICAgICAgICAgc2JySGVhZGVyRGF0YTsKKyAgICBTQlJfQklUU1RSRUFNX0RBVEEgICAgICAgIHNickJpdHN0cmVhbURhdGE7CisgICAgQ09NTU9OX0RBVEEgICAgICAgICAgICAgICBDbW9uRGF0YTsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGR5blhPdmVyRnJlcURlbGF5WzVdOyAgICAvKio8IHRvIGRlbGF5IGEgZnJhbWUgKEkgZG9uJ3QgbGlrZSBpdCB0aGF0IG11Y2ggdGhhdCB3YXkgLSBocmMpICovCisgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgICAgICBlbEluZm87CisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBheWxvYWREZWxheUxpbmVbMStERUxBWV9GUkFNRVNdW01BWF9QQVlMT0FEX1NJWkVdOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZERlbGF5TGluZVNpemVbMStERUxBWV9GUkFNRVNdOyAgICAgICAgICAgICAgICAgLyogU2l6ZXMgaW4gYml0cyAqLworCit9IFNCUl9FTEVNRU5ULCAqSEFORExFX1NCUl9FTEVNRU5UOworCit0eXBlZGVmIHN0cnVjdCBTQlJfRU5DT0RFUgoreworICBIQU5ETEVfU0JSX0VMRU1FTlQgICBzYnJFbGVtZW50Wyg4KV07CisgIEhBTkRMRV9TQlJfQ0hBTk5FTCAgIHBTYnJDaGFubmVsWyg4KV07CisgIFFNRl9GSUxURVJfQkFOSyAgICAgIFFtZkFuYWx5c2lzWyg4KV07CisgIERPV05TQU1QTEVSICAgICAgICAgIGxmZURvd25TYW1wbGVyOworICBpbnQgICAgICAgICAgICAgICAgICBsZmVDaElkeDsgICAgICAgICAgICAgICAgIC8qIC0xIGRlZmF1bHQgZm9yIG5vIGxmZSwgZWxzZSBhc3NpZ24gY2hhbm5lbCBpbmRleCAqLworICBpbnQgICAgICAgICAgICAgICAgICBub0VsZW1lbnRzOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBlbGVtZW50cyAqLworICBpbnQgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgIC8qIFRvdGFsIGNoYW5uZWwgY291bnQgYWNyb3NzIGFsbCBlbGVtZW50cy4gKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOyAgICAgICAgICAgICAgICAvKiBTQlIgZnJhbWVsZW5ndGguICovCisgIGludCAgICAgICAgICAgICAgICAgIGJ1ZmZlck9mZnNldDsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciBTQlIgcGFyYW1ldGVyIGV4dHJhY3Rpb24gaW4gdGltZSBkb21haW4gaW5wdXQgYnVmZmVyLiAqLworICBpbnQgICAgICAgICAgICAgICAgICBkb3duc2FtcGxlZE9mZnNldDsgICAgICAgIC8qIE9mZnNldCBvZiBkb3duc2FtcGxlZC9taXhlZCBvdXRwdXQgZm9yIGNvcmUgZW5jb2Rlci4gKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgZG93bm1peFNpemU7ICAgICAgICAgICAgICAvKiBTaXplIGluIHNhbXBsZXMgb2YgZG93bnNhbXBsZWQvbWl4ZWQgb3V0cHV0IGZvciBjb3JlIGVuY29kZXIuICovCisgIElOVCAgICAgICAgICAgICAgICAgIGRvd25TYW1wbGVGYWN0b3I7ICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBTQlIgYW5kIHRoZSBjb3JlIGVuY29kZXIuICovCisgIGludCAgICAgICAgICAgICAgICAgIGZUaW1lRG9tYWluRG93bnNhbXBsaW5nOyAgLyogRmxhZyBzaWduYWxsaW5nIHRpbWUgZG9tYWluIGRvd25zYW1wbGluZyBpbnN0ZWFkIG9mIFFNRiBkb3duc2FtcGxpbmcuICovCisgIGludCAgICAgICAgICAgICAgICAgIG5CaXRzdHJEZWxheTsgICAgICAgICAgICAgLyogQW1vdW50IG9mIFNCUiBmcmFtZXMgdG8gYmUgZGVsYXllZCBpbiBiaXRzdHJlYW0gZG9tYWluLiAqLworICBJTlQgICAgICAgICAgICAgICAgICBlc3RpbWF0ZUJpdHJhdGU7ICAgICAgICAgIC8qIGVzdGltYXRlIGJpdHJhdGUgb2YgU0JSIGVuY29kZXIgKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgaW5wdXREYXRhRGVsYXk7ICAgICAgICAgICAvKiBkZWxheSBjYXVzZWQgYnkgZG93bnNhbXBsZXIsIGluL291dCBidWZmZXIgYXQgc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZSAqLworCisgIFVDSEFSKiBkeW5hbWljUmFtOworICBVQ0hBUiogcFNCUmR5bmFtaWNfUkFNOworCisgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW87CisgIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICAgcW1mU3ludGhlc2lzUFM7CisKKyAgLyogcGFyYW1ldGVycyBkZXNjcmliaW5nIGFsbG9jYXRpb24gdm9sdW1lIG9mIHByZXNlbnQgaW5zdGFuY2UgKi8KKyAgSU5UICAgICAgICAgICAgICAgICAgbWF4RWxlbWVudHM7CisgIElOVCAgICAgICAgICAgICAgICAgIG1heENoYW5uZWxzOworICBJTlQgICAgICAgICAgICAgICAgICBzdXBwb3J0UFM7CisKKworfSBTQlJfRU5DT0RFUjsKKworCisjZW5kaWYgLyogX19TQlJfSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2NmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKQEAgLTAsMCArMSwyNzkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBTQlIgbWFpbiBkZWZpbml0aW9ucyAgCisqLworI2lmbmRlZiBfX1NCUl9ERUZfSAorI2RlZmluZSBfX1NCUl9ERUZfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjZGVmaW5lIG5vRXJyb3IgMAorI2RlZmluZSBIQU5ETEVfRVJST1JfSU5GTyBJTlQKKyNkZWZpbmUgRVJST1IoYSxiKSAxCisjZGVmaW5lIGhhbmRCYWNrCisKKy8qICNkZWZpbmUgU0JSX0VOVl9TVEFUSVNUSUNTX0JJVFJBVEUgKi8KKyN1bmRlZiBTQlJfRU5WX1NUQVRJU1RJQ1NfQklUUkFURQorCisvKiAjZGVmaW5lIFNCUl9FTlZfU1RBVElTVElDUyAqLworI3VuZGVmIFNCUl9FTlZfU1RBVElTVElDUworCisvKiAjZGVmaW5lIFNCUl9QQVlMT0FEX01PTklUT1IgKi8KKyN1bmRlZiBTQlJfUEFZTE9BRF9NT05JVE9SCisKKyNkZWZpbmUgU1dBUChhLGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXByPWEsIGE9YiwgYj10ZW1wcgorI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgRVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTEyCisjZGVmaW5lIExPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY5MzE0NzE4MDU2ZiAgLyogbmF0dXJhbCBsb2dhcml0aG0gb2YgMiAqLworI2RlZmluZSBJTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NDI2OTUwNDFmICAgIC8qIDEvTE9HMiAqLworI2RlZmluZSBSRUxBWEFUSU9OX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgKDFlLTZmKQorI2RlZmluZSBSRUxBWEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKFJFTEFYQVRJT05fRkxPQVQpKQorI2RlZmluZSBSRUxBWEFUSU9OX0ZSQUNUICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKDAuNTI0Mjg4ZikpICAgICAvKiAwLjUyNDI4OGYgaXMgZnJhY3Rpb25hbCBwYXJ0IG9mIFJFTEFYQVRJT04gKi8KKyNkZWZpbmUgUkVMQVhBVElPTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICgxOSkKKyNkZWZpbmUgUkVMQVhBVElPTl9MRDY0ICAgICAgICAgICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgwLjMxMTQzMDc1ODg5ZikpLyogKGxkNjQoUkVMQVhBVElPTikgKi8KKworLyoqKioqKioqKioqKiAgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqLworI2RlZmluZSBTQlJfQ09NUF9NT0RFX0RFTFRBICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTQlJfQ09NUF9NT0RFX0NUUyAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIE1BWF9OVU1fQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTUFYX05PSVNFX0VOVkVMT1BFUyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX05VTV9OT0lTRV9DT0VGRlMgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUFYX05VTV9OT0lTRV9WQUxVRVMgICAgICAgICAgICAgICAgICAgIChNQVhfTlVNX05PSVNFX0NPRUZGUypNQVhfTk9JU0VfRU5WRUxPUEVTKQorCisjZGVmaW5lIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTICAgICAgICAgICAgICAgICAoTUFYX0VOVkVMT1BFUyAqIE1BWF9GUkVRX0NPRUZGUykKKyNkZWZpbmUgTUFYX0VOVkVMT1BFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTICAgICAgICAgICAgICAgICAgICAgICAgIDQ4CisKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICAgICAgICAgICAgICAgICAzMgorCisKKyNkZWZpbmUgUU1GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFFNRl9GSUxURVJfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgIDY0MAorI2RlZmluZSBRTUZfTUFYX1RJTUVfU0xPVFMgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xDICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xEICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05PX09GX0VTVElNQVRFUyAgICAgICAgICAgICAgICAgICAgIDQKKworCisjZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVF82NCAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKQorCisjZGVmaW5lIExPV19SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhJR0hfUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBMRU5HVEhfU0JSX0ZSQU1FX0lORk8gICAgICAgICAgICAgICAgICAgMzUgICAgICAvKiAxOSAqLworCisjZGVmaW5lIFNCUl9OU0ZCX0xPV19SRVMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgIC8qICA4ICovCisjZGVmaW5lIFNCUl9OU0ZCX0hJR0hfUkVTICAgICAgICAgICAgICAgICAgICAgICAxOCAgICAgIC8qIDE2ICovCisKKworI2RlZmluZSBTQlJfWFBPU19DVFJMX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfSU5GSU5JVEUgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCAgICAgICAgICAgIDAKKworCisvKiBzYnJfaGVhZGVyICovCisjZGVmaW5lIFNJX1NCUl9BTVBfUkVTX0JJVFMgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9DT1VQTElOR19CSVRTICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9TVEFSVF9GUkVRX0JJVFMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNJX1NCUl9SRVNFUlZFRF9CSVRTICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9IRUFERVJfRVhUUkFfMl9CSVRTICAgICAgICAgICAgICAxCisKKy8qIHNicl9oZWFkZXIgZXh0cmEgMSAqLworI2RlZmluZSBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTSV9TQlJfTk9JU0VfQkFORFNfQklUUyAgICAgICAgICAgICAgICAgMgorCisvKiBzYnJfaGVhZGVyIGV4dHJhIDIgKi8KKyNkZWZpbmUgU0lfU0JSX0xJTUlURVJfQkFORFNfQklUUyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lfU0JSX0lOVEVSUE9MX0ZSRVFfQklUUyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lfU0JSX1NNT09USElOR19MRU5HVEhfQklUUyAgICAgICAgICAgIDEKKworLyogc2JyX2dyaWQgKi8KKyNkZWZpbmUgU0JSX0NMQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfZnJhbWVfY2xhc3MgKi8KKyNkZWZpbmUgU0JSX0NMQV9CSVRTX0xEICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiE8IHNpemUgb2YgYnNfZnJhbWVfY2xhc3MgKi8KKyNkZWZpbmUgU0JSX0VOVl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfbnVtX2Vudl9yYXcgKi8KKyNkZWZpbmUgU0JSX0FCU19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfYWJzX2JvcmRfcmF3IGZvciBIRS1BQUMgKi8KKyNkZWZpbmUgU0JSX05VTV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfbnVtX3JlbCAqLworI2RlZmluZSBTQlJfUkVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19yZWxfYm9yZF9yYXcgKi8KKyNkZWZpbmUgU0JSX1JFU19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiE8IHNpemUgb2YgYnNfZnJlcV9yZXNfZmxhZyAqLworI2RlZmluZSBTQlJfRElSX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qITwgc2l6ZSBvZiBic19kZl9mbGFnICovCisKKworLyogc2JyX2RhdGEgKi8KKyNkZWZpbmUgU0lfU0JSX0lOVkZfTU9ERV9CSVRTICAgICAgICAgICAgICAgICAgIDIKKworCisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMCAgICAgICAgICAgNgorI2RlZmluZSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMCAgIDUKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQU1QX1JFU18zXzAgICAgICAgICA1CisjZGVmaW5lIFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzAgNQorCisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNSAgICAgICAgICAgNworI2RlZmluZSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzFfNSAgIDYKKworCisjZGVmaW5lIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgICAgICAgICA4CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgU0JSX0VYVEVOREVEX0RBVEFfTUFYX0NOVCAgICAgICAgICAgICAgICgxNSsyNTUpCisKKyNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAgICAgICAgICAgICAgICAgIDIKKworLyogRW52ZWxvcGUgY29kaW5nIGNvbnN0YW50cyAqLworI2RlZmluZSBGUkVRICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVElNRSAgICAgICAgICAgICAgICAgICAgICAxCisKKworLyogaHVmZm1hbiB0YWJsZXMgKi8KKyNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYwMCAgICAgICAgIDYwCisjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDEgICAgICAgICAzMQorI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjEwICAgICAgICAgNjAKKyNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYxMSAgICAgICAgIDMxCisjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMSAxMgorI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTAgMjQKKwordHlwZWRlZiBlbnVtCit7CisgIFNCUl9BTVBfUkVTXzFfNT0wLAorICBTQlJfQU1QX1JFU18zXzAKK30KK0FNUF9SRVM7CisKK3R5cGVkZWYgZW51bQoreworICBYUE9TX01EQ1QsCisgIFhQT1NfTURDVF9DUk9TUywKKyAgWFBPU19MQywKKyAgWFBPU19SRVNFUlZFRCwKKyAgWFBPU19TV0lUQ0hFRCAvKiBub3QgYSByZWFsIGNob2ljZSBidXQgdXNlZCBoZXJlIHRvIGNvbnRyb2wgYmVoYXZpb3VyICovCit9CitYUE9TX01PREU7CisKK3R5cGVkZWYgZW51bQoreworICBJTlZGX09GRiA9IDAsCisgIElOVkZfTE9XX0xFVkVMLAorICBJTlZGX01JRF9MRVZFTCwKKyAgSU5WRl9ISUdIX0xFVkVMLAorICBJTlZGX1NXSVRDSEVEIC8qIG5vdCBhIHJlYWwgY2hvaWNlIGJ1dCB1c2VkIGhlcmUgdG8gY29udHJvbCBiZWhhdmlvdXIgKi8KK30KK0lOVkZfTU9ERTsKKwordHlwZWRlZiBlbnVtCit7CisgIEZSRVFfUkVTX0xPVyA9IDAsCisgIEZSRVFfUkVTX0hJR0gKK30KK0ZSRVFfUkVTOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTk3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJfZW5jb2Rlci5jcHAKQEAgLTAsMCArMSwyMzUxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6IEFuZHJlYXMgRWhyZXQsIFRvYmlhcyBDaGFsdXBrYQorICAgRGVzY3JpcHRpb246IFNCUiBlbmNvZGVyIHRvcCBsZXZlbCBwcm9jZXNzaW5nLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgorCisjaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicl9yb20uaCIKKyNpbmNsdWRlICJzYnJlbmNfZnJlcV9zY2EuaCIKKyNpbmNsdWRlICJlbnZfYml0LmgiCisjaW5jbHVkZSAiY21vbmRhdGEuaCIKKyNpbmNsdWRlICJzYnJfbWlzYy5oIgorI2luY2x1ZGUgInNici5oIgorI2luY2x1ZGUgInFtZi5oIgorCisjaW5jbHVkZSAicHNfbWFpbi5oIgorCisjZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMCAzCisjZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMSAzCisjZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMiA0CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFNCUiBEZWxheSBiYWxhbmNpbmcgZGVmaW5pdGlvbnMuCisgKi8KKworLyoKKyAgICAgIGlucHV0IGJ1ZmZlciAoMWNoKQorCisgICAgICB8LS0tLS0tLS0tLS0tIDE1MzcgICAtLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0gMjA0OCAtLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAoY29yZTJzYnIgZGVsYXkgICAgICkgICAgICAgICAgZHMgICAgIChyZWFkLCBjb3JlIGFuZCBkcyBhcmVhKQorKi8KKworI2RlZmluZSBTRkIoZHduc21wKSAgICAgICAgKDMyIDw8IChkd25zbXAtMSkpICAgICAvKiBTQlIgRnJlcXVlbmN5IGJhbmRzOiA2NCBmb3IgZHVhbC1yYXRlLCAzMiBmb3Igc2luZ2xlLXJhdGUgKi8KKyNkZWZpbmUgU1RTKGZsKSAgICAgICAgICAgICgoKGZsKT09MTAyNCk/MzI6MzApICAgLyogU0JSIFRpbWUgU2xvdHM6IDMyIGZvciBjb3JlIGZyYW1lIGxlbmd0aCAxMDI0LCAzMCBmb3IgY29yZSBmcmFtZSBsZW5ndGggOTYwICovCisKKyNkZWZpbmUgREVMQVlfUU1GX0FOQShkd25zbXApICgoMzIwPDwoKGR3bnNtcCktMSkpIC0gKDMyPDwoKGR3bnNtcCktMSkpKSAvKiBGdWxsIGJhbmR3aWR0aCAqLworI2RlZmluZSBERUxBWV9IWUJfQU5BICAgICAgICAgKDEwKjY0KSAgICAgICAvKiArIDAuNSAqLyAgICAgICAgICAgICAgLyogICovCisjZGVmaW5lIERFTEFZX0hZQl9TWU4gICAgICAgICAoNio2NCAtIDMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KKyNkZWZpbmUgREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkgKDMyKihkd25zbXApKSAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBwb3N0cHJvY2Vzc2luZyBkZWxheSAqLworI2RlZmluZSBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKDYgKiBTRkIoZHduc21wKSApICAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBRTUYgb3ZlcmxhcCAqLworI2RlZmluZSBERUxBWV9RTUZfU1lOICAgICAgICAgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9fUE9MWS8yPTIuNSwgcm91bmRlZCBkb3duIHRvIDIgKi8KKyNkZWZpbmUgREVMQVlfUU1GX0RTICAgICAgICAgICgzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBzeW50aGVzaXMgZm9yIGRvd25zYW1wbGVkIHRpbWUgc2lnbmFsICovCisKKy8qIERlbGF5IGluIFFNRiBwYXRocyAqLworI2RlZmluZSBERUxBWV9TQlIoZmwsZHduc21wKSAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIChTRkIoZHduc21wKSpTVFMoZmwpIC0gMSkgKyBERUxBWV9RTUZfU1lOKQorI2RlZmluZSBERUxBWV9QUyhmbCxkd25zbXApICAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0hZQl9BTkEgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyAoU0ZCKGR3bnNtcCkqU1RTKGZsKS0xKSArIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKQorI2RlZmluZSBERUxBWV9FTERTQlIoZmwsZHduc21wKSAgKCAoICgoZmwpLzIpKihkd25zbXApICkgLSAxICsgREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkgKQorCisvKiBEZWxheSBkaWZmZXJlbmNlcyBmb3IgU0JSIGFuZCBTQlIrUFMgKi8KKyNkZWZpbmUgTUFYX0RTX0ZJTFRFUl9ERUxBWSAoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGFkZGl0aW9uYWwgbWF4IGRvd25zYW1wbGVyIGZpbHRlciBkZWxheSAoc291cmNlIGZzKSAqLworI2RlZmluZSBERUxBWV9BQUMyU0JSKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBERUxBWV9RTUZfU1lOKSAtIERFTEFZX1NCUigoZmwpLChkd25zbXApKSkKKyNkZWZpbmUgREVMQVlfRUxEMlNCUihmbCxkd25zbXApICgoREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkpIC0gREVMQVlfRUxEU0JSKGZsLGR3bnNtcCkpCisjZGVmaW5lIERFTEFZX0FBQzJQUyhmbCxkd25zbXApICgoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfUU1GX0RTICsgLyooREVMQVlfQUFDKGZsKSoyKSArICovIERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKSAtIERFTEFZX1BTKGZsLGR3bnNtcCkpIC8qIDIwNDggLSA0NjMqMiAqLworCisvKiBBc3N1bXB0aW9uOiBUaGUgc2FtcGxlIGRlbGF5IHJlc3VsdGluZyBvZiBvZiBERUxBWV9BQUMyUFMgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiB0aGUgc2FtcGxlIGRlbGF5IGltcGxpZWQgYnkgREVMQVlfQUFDMlNCUiAqLworI2RlZmluZSBNQVhfU0FNUExFX0RFTEFZICAgICAgIChERUxBWV9BQUMyU0JSKDEwMjQsMikgKyBNQVhfRFNfRklMVEVSX0RFTEFZKSAvKiBtYXhpbXVtIGRlbGF5OiBmcmFtZSBsZW5ndGggb2YgMTAyNCBhbmQgZHVhbC1yYXRlIHNiciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2RlZmluZSBJTlZBTElEX1RBQkxFX0lEWCAtMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBTZWxlY3RzIHRoZSBTQlIgdHVuaW5nIHNldHRpbmdzIHRvIHVzZSBkZXBlbmRlbnQgb24gbnVtYmVyIG9mCisgICAgICAgICAgY2hhbm5lbHMsIGJpdHJhdGUsIHNhbXBsZSByYXRlIGFuZCBjb3JlIGNvZGVyCisKKyAgXHJldHVybiBJbmRleCB0byB0aGUgYXBwcm9wcmlhdGUgdGFibGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRElTVEFOQ0VfQ0VJTF9WQUxVRSA1MDAwMDAwCitzdGF0aWMgSU5UCitnZXRTYnJUdW5pbmdUYWJsZUluZGV4KFVJTlQgYml0cmF0ZSwgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCisgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtQ2hhbm5lbHMsLyohIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjb3JlIGNvZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZSwgIC8qISB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgY29yZSBjb2RlciAqLworICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwQml0UmF0ZUNsb3Nlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBpbnQgaSwgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4PS0xLCBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg9LTEsIGZvdW5kID0gMDsKKyAgVUlOVCBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gMCwgYml0UmF0ZUNsb3Nlc3RMb3dlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFOworICBpbnQgaXNmb3JUaGlzQ29kZWM9MDsKKworICAjZGVmaW5lIGlzRm9yVGhpc0NvcmUoaSkgXAorICAgICggKCBzYnJUdW5pbmdUYWJsZVtpXS5jb3JlQ29kZXIgPT0gQ09ERUNfQUFDTEQgJiYgY29yZSA9PSBBT1RfRVJfQUFDX0VMRCApIHx8IFwKKyAgICAgICggc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQyAgICYmIGNvcmUgIT0gQU9UX0VSX0FBQ19FTEQgKSApCisKKyAgZm9yIChpPTA7IGkgPCBzYnJUdW5pbmdUYWJsZVNpemUgOyBpKyspIHsKKyAgICBpZiAoIGlzRm9yVGhpc0NvcmUoaSkgKSAvKiB0dW5pbmcgdGFibGUgaXMgZm9yIHRoaXMgY29yZSBjb2RlYyAqLworICAgIHsKKyAgICAgIGlmICggbnVtQ2hhbm5lbHMgPT0gc2JyVHVuaW5nVGFibGUgW2ldLm51bUNoYW5uZWxzCisgICAgICAgICYmIHNhbXBsZVJhdGUgPT0gc2JyVHVuaW5nVGFibGUgW2ldLnNhbXBsZVJhdGUgKQorICAgICAgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIGlmICgoYml0cmF0ZSA+PSBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20pICYmCisgICAgICAgICAgICAoYml0cmF0ZSA8IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8pKSB7CisgICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBiaXRyYXRlOworICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gYml0cmF0ZTsKKyAgICAgICAgICAgICAgLy9GREtwcmludGYoImVudHJ5ICVkXG4iLCBpKTsKKyAgICAgICAgICByZXR1cm4gaSA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlICkgeworICAgICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbTsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUgKSB7CisgICAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8tMTsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCisgIHsKKyAgICAvKiBJZiB0aGVyZSB3YXMgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIHR1bmluZyBlbnRyeSBmb3VuZCB0aGVuIHBpY2sgdGhlIGxlYXN0IGRpc3RhbmNlIGJpdCByYXRlICovCisgICAgaWYgKGZvdW5kKQorICAgIHsKKyAgICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKKyAgICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgeworICAgICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOworICAgICAgfQorICAgICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CisgICAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOworICAgICAgfQorICAgICAgaWYgKCBkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlciApCisgICAgICB7CisgICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBJTlZBTElEX1RBQkxFX0lEWDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgU2VsZWN0cyB0aGUgUFMgdHVuaW5nIHNldHRpbmdzIHRvIHVzZSBkZXBlbmRlbnQgb24gYml0cmF0ZQorICBhbmQgY29yZSBjb2RlcgorCisgIFxyZXR1cm4gSW5kZXggdG8gdGhlIGFwcHJvcHJpYXRlIHRhYmxlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitnZXRQc1R1bmluZ1RhYmxlSW5kZXgoVUlOVCBiaXRyYXRlLCBVSU5UICpwQml0UmF0ZUNsb3Nlc3QpeworCisgIElOVCBpLCBwYXJhbVNldHMgPSBzaXplb2YgKHBzVHVuaW5nVGFibGUpIC8gc2l6ZW9mIChwc1R1bmluZ1RhYmxlIFswXSk7CisgIGludCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMTsKKyAgVUlOVCBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gMCwgYml0UmF0ZUNsb3Nlc3RMb3dlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFOworCisgIGZvciAoaSA9IDAgOyBpIDwgcGFyYW1TZXRzIDsgaSsrKSAgeworICAgIGlmICgoYml0cmF0ZSA+PSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSkgJiYKKyAgICAgICAgKGJpdHJhdGUgPCBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8pKSB7CisgICAgICByZXR1cm4gaSA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlICkgeworICAgICAgICBpZiAocHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CisgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tOworICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUgKSB7CisgICAgICAgIGlmIChwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CisgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUby0xOworICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCisgIHsKKyAgICBpbnQgZGlzdGFuY2VVcHBlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFLCBkaXN0YW5jZUxvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CisgICAgaWYgKGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA+PSAwKSB7CisgICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOworICAgIH0KKyAgICBpZiAoYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID49IDApIHsKKyAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOworICAgIH0KKyAgICBpZiAoIGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyICkKKyAgICB7CisgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RVcHBlcjsKKyAgICB9IGVsc2UgeworICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIElOVkFMSURfVEFCTEVfSURYOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBJbiBjYXNlIG9mIGRvd25zYW1wbGVkIFNCUiB3ZSBtYXkgbmVlZCB0byBsb3dlciB0aGUgc3RvcCBmcmVxCisgICAgICAgICAgb2YgYSB0dW5pbmcgc2V0dGluZyB0byBmaXQgaW50byB0aGUgbG93ZXIgaGFsZiBvZiB0aGUKKyAgICAgICAgICBzcGVjdHJ1bSAoIHdoaWNoIGlzIHNhbXBsZVJhdGUvNCApCisKKyAgXHJldHVybiB0aGUgYWRhcHRlZCBzdG9wIGZyZXF1ZW5jeSBpbmRleCAoLTEgLT4gZXJyb3IpCisKKyAgXGluZ3JvdXAgU2JyRW5jQ2ZnCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSAoCisgICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlQ29yZSwKKyAgICAgICAgY29uc3QgSU5UIHN0YXJ0RnJlcSwKKyAgICAgICAgICAgICAgSU5UIHN0b3BGcmVxLAorICAgICAgICBjb25zdCBJTlQgZG93blNhbXBsZUZhY3RvcgorICAgICAgICApCit7CisgIElOVCBtYXhTdG9wRnJlcVJhdyA9IHNhbXBsZVJhdGVDb3JlIC8gMjsKKyAgSU5UIHN0YXJ0QmFuZCwgc3RvcEJhbmQ7CisgIEhBTkRMRV9FUlJPUl9JTkZPIGVycjsKKworICB3aGlsZSAoc3RvcEZyZXEgPiAwICYmIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhzdG9wRnJlcSwgc2FtcGxlUmF0ZUNvcmUpID4gbWF4U3RvcEZyZXFSYXcpIHsKKyAgICBzdG9wRnJlcS0tOworICB9CisKKyAgaWYgKEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyggc3RvcEZyZXEsIHNhbXBsZVJhdGVDb3JlKSA+IG1heFN0b3BGcmVxUmF3KQorICAgIHJldHVybiAtMTsKKworICBlcnIgPSBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQgKAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlPDwoZG93blNhbXBsZUZhY3Rvci0xKSwKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlQ29yZSwKKyAgICAgICAgICAgICAgICAzMjw8KGRvd25TYW1wbGVGYWN0b3ItMSksCisgICAgICAgICAgICAgICAgc3RhcnRGcmVxLAorICAgICAgICAgICAgICAgIHN0b3BGcmVxLAorICAgICAgICAgICAgICAgJnN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICZzdG9wQmFuZAorICAgICAgICAgICAgICAgICk7CisgIGlmIChlcnIpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiBzdG9wRnJlcTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICB0ZWxscyB1cywgaWYgZm9yIHRoZSBnaXZlbiBjb3JlQ29kZXIsIGJpdHJhdGUsIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgIGFuZCBpbnB1dCBzYW1wbGluZyByYXRlIGFuIFNCUiBzZXR0aW5nIGlzIGF2YWlsYWJsZS4gSWYgeWVzLCBpdAorICAgICAgICAgIHRlbGxzIHVzIGFsc28gdGhlIGNvcmUgc2FtcGxpbmcgcmF0ZSB3ZSB3b3VsZCBuZWVkIHRvIHJ1biB3aXRoCisKKyAgXHJldHVybiBhIGZsYWcgaW5kaWNhdGluZyBzdWNjZXNzOiB5ZXMgKDEpIG9yIG5vICgwKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVJTlQKK0ZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCAoCisgICAgICAgIFVJTlQgYml0cmF0ZSwgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLworICAgICAgICBVSU5UIHZick1vZGUsICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBtZWFucyBjb25zdGFudCBiaXRyYXRlICovCisgICAgICAgIFVJTlQgbnVtT3V0cHV0Q2hhbm5lbHMsIC8qISB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY29yZSBjb2RlciAqLworICAgICAgICBVSU5UIHNhbXBsZVJhdGVJbnB1dCwgICAvKiEgdGhlIGlucHV0IHNhbXBsZSByYXRlIFtpbiBIel0gKi8KKyAgICAgICAgVUlOVCBzYW1wbGVSYXRlQ29yZSwgICAgLyohIHRoZSBjb3JlJ3Mgc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlCisgICAgICAgICkKK3sKKyAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOworCisgIGlmIChzYW1wbGVSYXRlSW5wdXQgPCAxNjAwMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoYml0cmF0ZT09MCkgeworICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCisgICAgaWYgKHZick1vZGUgPCAzMCkKKyAgICAgIGJpdHJhdGUgPSAyNDAwMDsKKyAgICBlbHNlIGlmICh2YnJNb2RlIDwgNDApCisgICAgICBiaXRyYXRlID0gMjgwMDA7CisgICAgZWxzZSBpZiAodmJyTW9kZSA8IDYwKQorICAgICAgYml0cmF0ZSA9IDMyMDAwOworICAgIGVsc2UgaWYgKHZick1vZGUgPCA3NSkKKyAgICAgIGJpdHJhdGUgPSA0MDAwMDsKKyAgICBlbHNlCisgICAgICBiaXRyYXRlID0gNDgwMDA7CisgICAgYml0cmF0ZSAqPSBudW1PdXRwdXRDaGFubmVsczsKKyAgfQorCisgIGlkeCA9IGdldFNiclR1bmluZ1RhYmxlSW5kZXgoYml0cmF0ZSwgbnVtT3V0cHV0Q2hhbm5lbHMsIHNhbXBsZVJhdGVDb3JlLCBjb3JlLCBOVUxMKTsKKworICByZXR1cm4gKGlkeCA9PSBJTlZBTElEX1RBQkxFX0lEWCA/IDAgOiAxKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisKKyAgXGJyaWVmICBBZGp1c3RzIHRoZSBTQlIgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gY29yZSBjb2RlcgorICAgICAgICAgIHNldHRpbmdzIHdoaWNoIGFyZSBhY2Nlc3NpYmxlIHZpYSBjb25maWctPmNvZGVjU2V0dGluZ3MKKworICBccmV0dXJuIEEgZmxhZyBpbmRpY2F0aW5nIHN1Y2Nlc3M6IHllcyAoMSkgb3Igbm8gKDApCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUlOVAorRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzIChjb25zdCBzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywgLyohIG91dHB1dCwgbW9kaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgICBVSU5UIGJpdFJhdGUsICAgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLworICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtQ2hhbm5lbHMsICAgICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIG51bWJlciBvZiBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KKyAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGVTYnIsICAgICAgIC8qISB0aGUgc2JyIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KKyAgICAgICAgICAgICAgICAgICBVSU5UIHRyYW5zRmFjLCAgICAgICAgICAgIC8qISB0aGUgc2hvcnQgYmxvY2sgdG8gbG9uZyBibG9jayByYXRpbyAqLworICAgICAgICAgICAgICAgICAgIFVJTlQgc3RhbmRhcmRCaXRyYXRlLCAgICAgLyohIHRoZSBzdGFuZGFyZCBiaXRyYXRlIHBlciBjaGFubmVsIGluIGJpdHMvc2VjICovCisgICAgICAgICAgICAgICAgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBwb29yIHF1YWxpdHkgLi4gMTAwIGhpZ2ggcXVhbGl0eSovCisgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcsICAgICAvKiE8IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGZvciBzcGVlY2ggPyAqLworICAgICAgICAgICAgICAgICAgIFVJTlQgbGNzTW9kZSwgICAgICAgICAgICAgLyohIHRoZSBsb3cgY29tcGxleGl0eSBzdGVyZW8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgIFVJTlQgYlBhcmFtZXRyaWNTdGVyZW8sICAgLyohPCB1c2UgcGFyYW1ldHJpYyBzdGVyZW8gKi8KKyAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlKSAgIC8qIENvcmUgYXVkaW8gY29kZWMgb2JqZWN0IHR5cGUgKi8KK3sKKyAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOworICAvKiBzZXQgdGhlIGNvcmUgY29kZWMgc2V0dGluZ3MgKi8KKyAgY29uZmlnLT5jb2RlY1NldHRpbmdzLmJpdFJhdGUgICAgICAgICA9IGJpdFJhdGU7CisgIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgICAgICAgPSBudW1DaGFubmVsczsKKyAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXEgICAgICA9IHNhbXBsZVJhdGVDb3JlOworICBjb25maWctPmNvZGVjU2V0dGluZ3MudHJhbnNGYWMgICAgICAgID0gdHJhbnNGYWM7CisgIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgPSBzdGFuZGFyZEJpdHJhdGU7CisKKyAgaWYgKGJpdFJhdGU9PTApIHsKKyAgICAvKiBtYXAgdmJyIHF1YWxpdHkgdG8gYml0cmF0ZSAqLworICAgIGlmICh2YnJNb2RlIDwgMzApCisgICAgICBiaXRSYXRlID0gMjQwMDA7CisgICAgZWxzZSBpZiAodmJyTW9kZSA8IDQwKQorICAgICAgYml0UmF0ZSA9IDI4MDAwOworICAgIGVsc2UgaWYgKHZick1vZGUgPCA2MCkKKyAgICAgIGJpdFJhdGUgPSAzMjAwMDsKKyAgICBlbHNlIGlmICh2YnJNb2RlIDwgNzUpCisgICAgICBiaXRSYXRlID0gNDAwMDA7CisgICAgZWxzZQorICAgICAgYml0UmF0ZSA9IDQ4MDAwOworICAgIGJpdFJhdGUgKj0gbnVtQ2hhbm5lbHM7CisgICAgLyogZml4IHRvIGVuYWJsZSBtb25vIHZick1vZGU8NDAgQCA0NC4xIG9mIDQ4a0h6ICovCisgICAgaWYgKG51bUNoYW5uZWxzPT0xKSB7CisgICAgICBpZiAoc2FtcGxlUmF0ZVNicj09NDQxMDAgfHwgc2FtcGxlUmF0ZVNicj09NDgwMDApIHsKKyAgICAgICAgaWYgKHZick1vZGU8NDApIGJpdFJhdGUgPSAzMjAwMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsbnVtQ2hhbm5lbHMsc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOworCisgIGlmIChpZHggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKKyAgICBjb25maWctPnN0YXJ0RnJlcSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxIDsKKyAgICBjb25maWctPnN0b3BGcmVxICAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RvcEZyZXEgOworICAgIGlmICh1c2VTcGVlY2hDb25maWcpIHsKKyAgICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxU3BlZWNoOworICAgICAgY29uZmlnLT5zdG9wRnJlcSAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdG9wRnJlcVNwZWVjaDsKKyAgICB9CisKKyAgICAvKiBBZGFwdCBzdG9wIGZyZXF1ZW5jeSBpbiBjYXNlIG9mIGRvd25zYW1wbGVkIFNCUiAtIG9ubHkgMzIgYmFuZHMgdGhlbiAqLworICAgIGlmICgxID09IGNvbmZpZy0+ZG93blNhbXBsZUZhY3RvcikgeworICAgICAgSU5UIGRzU3RvcEZyZXEgPSBGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlQ29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0YXJ0RnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0b3BGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZG93blNhbXBsZUZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBpZiAoZHNTdG9wRnJlcSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGNvbmZpZy0+c3RvcEZyZXEgPSBkc1N0b3BGcmVxOworICAgIH0KKworICAgIGNvbmZpZy0+c2JyX25vaXNlX2JhbmRzID0gc2JyVHVuaW5nVGFibGVbaWR4XS5udW1Ob2lzZUJhbmRzIDsKKyAgICBpZiAoY29yZSA9PSBBT1RfRVJfQUFDX0VMRCkKKyAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfMV81OworICAgIGNvbmZpZy0+bm9pc2VGbG9vck9mZnNldD0gc2JyVHVuaW5nVGFibGVbaWR4XS5ub2lzZUZsb29yT2Zmc2V0OworCisgICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWwgOworICAgIGNvbmZpZy0+c3RlcmVvTW9kZSAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGVyZW9Nb2RlIDsKKyAgICBjb25maWctPmZyZXFTY2FsZSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uZnJlcVNjYWxlIDsKKworICAgIC8qIGFkanVzdCB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyBkZXBlbmRlbnQgb24gYml0cmF0ZSBhbmQgc3BlZWNoIGNvbmZpZyBmbGFnICovCisgICAgaWYgKHVzZVNwZWVjaENvbmZpZykKKyAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOworCisgICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgIGlmIChiaXRSYXRlIDwgMjgwMDApCisgICAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfM18wOworICAgICAgY29uZmlnLT5TZW5kSGVhZGVyRGF0YVRpbWUgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMSkgeworICAgICAgaWYgKGJpdFJhdGUgPCAxNjAwMCkgeworICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoYml0UmF0ZSA8IDIwMDAwKSB7CisgICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOworICAgICAgfQorICAgIH0KKworICAgIGNvbmZpZy0+dXNlU3BlZWNoQ29uZmlnID0gdXNlU3BlZWNoQ29uZmlnOworCisgICAgLyogUFMgc2V0dGluZ3MgKi8KKyAgICBjb25maWctPmJQYXJhbWV0cmljU3RlcmVvID0gYlBhcmFtZXRyaWNTdGVyZW87CisKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIDAgOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzCisgZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyB0aGUgU0JSIGNvbmZpZnVyYXRpb24KKyByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cworIGlucHV0OiAgICAgICAgLSBjb3JlIGNvZGVjIHR5cGUsCisgICAgICAgICAgICAgICAtIGZhY3RvciBvZiBTQlIgdG8gY29yZSBmcmFtZSBsZW5ndGgsCisgICAgICAgICAgICAgICAtIGNvcmUgZnJhbWUgbGVuZ3RoCisgb3V0cHV0OiAgICAgICBpbml0aWFsaXplZCBTQlIgY29uZmlndXJhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVSU5UCitGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzIChzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgZG93blNhbXBsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgY29kZWNHcmFudWxlTGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaWYgKCAoZG93blNhbXBsZUZhY3RvciA8IDEgfHwgZG93blNhbXBsZUZhY3RvciA+IDIpIHx8CisgICAgICAgICAoY29kZWNHcmFudWxlTGVuKmRvd25TYW1wbGVGYWN0b3IgPiBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTKSApCisgICAgICAgcmV0dXJuKDApOyAvKiBlcnJvciAqLworCisgICAgY29uZmlnLT5TZW5kSGVhZGVyRGF0YVRpbWUgICAgID0gMTAwMDsKKyAgICBjb25maWctPnVzZVdhdmVDb2RpbmcgICAgICAgICAgPSAwOworICAgIGNvbmZpZy0+Y3JjU2JyICAgICAgICAgICAgICAgICA9IDA7CisgICAgY29uZmlnLT5keW5Cd1N1cHBvcnRlZCAgICAgICAgID0gMTsKKyAgICBjb25maWctPnRyYW5fdGhyICAgICAgICAgICAgICAgPSAxMzAwMDsKKyAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgICAgICAgPSAxOworCisgICAgY29uZmlnLT5zYnJGcmFtZVNpemUgICAgICAgICAgID0gY29kZWNHcmFudWxlTGVuICogZG93blNhbXBsZUZhY3RvcjsKKyAgICBjb25maWctPmRvd25TYW1wbGVGYWN0b3IgICAgICAgPSBkb3duU2FtcGxlRmFjdG9yOworCisgICAgLyogc2JyIGRlZmF1bHQgcGFyYW1ldGVycyAqLworICAgIGNvbmZpZy0+c2JyX2RhdGFfZXh0cmEgICAgICAgICA9IDA7CisgICAgY29uZmlnLT5hbXBfcmVzICAgICAgICAgICAgICAgID0gU0JSX0FNUF9SRVNfM18wIDsKKyAgICBjb25maWctPnRyYW5fZmMgICAgICAgICAgICAgICAgPSAwIDsKKyAgICBjb25maWctPnRyYW5fZGV0X21vZGUgICAgICAgICAgPSAxIDsKKyAgICBjb25maWctPnNwcmVhZCAgICAgICAgICAgICAgICAgPSAxIDsKKyAgICBjb25maWctPnN0YXQgICAgICAgICAgICAgICAgICAgPSAwIDsKKyAgICBjb25maWctPmUgICAgICAgICAgICAgICAgICAgICAgPSAxIDsKKyAgICBjb25maWctPmRlbHRhVEFjcm9zc0ZyYW1lcyAgICAgPSAxIDsKKyAgICBjb25maWctPmRGX2VkZ2VfMXN0RW52ICAgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjNmKSA7CisgICAgY29uZmlnLT5kRl9lZGdlX2luY3IgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOworCisgICAgY29uZmlnLT5zYnJfaW52Zl9tb2RlICAgPSBJTlZGX1NXSVRDSEVEOworICAgIGNvbmZpZy0+c2JyX3hwb3NfbW9kZSAgID0gWFBPU19MQzsKKyAgICBjb25maWctPnNicl94cG9zX2N0cmwgICA9IFNCUl9YUE9TX0NUUkxfREVGQVVMVDsKKyAgICBjb25maWctPnNicl94cG9zX2xldmVsICA9IDA7CisgICAgY29uZmlnLT51c2VTYVBhbiAgICAgICAgPSAwOworICAgIGNvbmZpZy0+ZHluQndFbmFibGVkICAgID0gMDsKKworCisgICAgLyogdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvdmVyd3JpdHRlbiBieSB0aGUgRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzKCkgZnVuY3Rpb24gc2luY2UKKyAgICAgICB0aGV5IGFyZSBpbmNsdWRlZCBpbiB0aGUgdHVuaW5nIHRhYmxlICovCisgICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgICAgICAgID0gU0JSX1NXSVRDSF9MUkM7CisgICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgICAgICAgID0gNjsKKyAgICBjb25maWctPm5vaXNlRmxvb3JPZmZzZXQgICAgICAgPSAwOworICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICAgICAgICAgICA9IDU7IC8qICA1LjkgcmVzcGVjdGl2ZWx5ICA2LjAga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KKyAgICBjb25maWctPnN0b3BGcmVxICAgICAgICAgICAgICAgPSA5OyAvKiAxNi4yIHJlc3BlY3RpdmVseSAxNi44IGtIeiBhdCBmcyA9IDQ0LjEvNDgga0h6ICovCisKKworICAgIC8qIGhlYWRlcl9leHRyYV8xICovCisgICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUOworICAgIGNvbmZpZy0+YWx0ZXJTY2FsZSAgICAgID0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQ7CisgICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVDsKKworICAgIC8qIGhlYWRlcl9leHRyYV8yICovCisgICAgY29uZmlnLT5zYnJfbGltaXRlcl9iYW5kcyAgICA9IFNCUl9MSU1JVEVSX0JBTkRTX0RFRkFVTFQ7CisgICAgY29uZmlnLT5zYnJfbGltaXRlcl9nYWlucyAgICA9IFNCUl9MSU1JVEVSX0dBSU5TX0RFRkFVTFQ7CisgICAgY29uZmlnLT5zYnJfaW50ZXJwb2xfZnJlcSAgICA9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQ7CisgICAgY29uZmlnLT5zYnJfc21vb3RoaW5nX2xlbmd0aCA9IFNCUl9TTU9PVEhJTkdfTEVOR1RIX0RFRkFVTFQ7CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIGZ1bmN0aW9ubmFtZTogRGVsZXRlRW52Q2hhbm5lbAorIGRlc2NyaXB0aW9uOiAgZnJlZXMgbWVtb3J5IG9mIG9uZSBTQlIgY2hhbm5lbAorIHJldHVybnM6ICAgICAgLQorIGlucHV0OiAgICAgICAgaGFuZGxlIG9mIGNoYW5uZWwKKyBvdXRwdXQ6ICAgICAgIHJlbGVhc2VkIGhhbmRsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkZWxldGVFbnZDaGFubmVsIChIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkN1dCkKK3sKKyAgaWYgKGhFbnZDdXQpIHsKKworICAgIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKCZoRW52Q3V0LT5Ub25Db3JyKTsKKworICAgIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52Q3V0LT5zYnJFeHRyYWN0RW52ZWxvcGUpOworICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIGZ1bmN0aW9ubmFtZTogc2JyRW5jb2Rlcl9DaGFubmVsQ2xvc2UKKyBkZXNjcmlwdGlvbjogIGNsb3NlIHRoZSBjaGFubmVsIGNvZGluZyBoYW5kbGUKKyByZXR1cm5zOgorIGlucHV0OiAgICAgICAgcGhTYnJDaGFubmVsCisgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWwpCit7CisgIGlmIChoU2JyQ2hhbm5lbCAhPSBOVUxMKQorICB7CisgICAgZGVsZXRlRW52Q2hhbm5lbCAoJmhTYnJDaGFubmVsLT5oRW52Q2hhbm5lbCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBmdW5jdGlvbm5hbWU6IHNickVuY29kZXJfRWxlbWVudENsb3NlCisgZGVzY3JpcHRpb246ICBjbG9zZSB0aGUgY2hhbm5lbCBjb2RpbmcgaGFuZGxlCisgcmV0dXJuczoKKyBpbnB1dDogICAgICAgIHBoU2JyQ2hhbm5lbAorIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoSEFORExFX1NCUl9FTEVNRU5UICpwaFNickVsZW1lbnQpCit7CisgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCA9ICpwaFNickVsZW1lbnQ7CisKKyAgaWYgKGhTYnJFbGVtZW50IT1OVUxMKSB7CisgICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIpCisgICAgICBGcmVlUmFtX1Nicl92X2tfbWFzdGVyKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKTsKKyAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10pCisgICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKTsKKyAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pCisgICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlSEkoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldKTsKKworICAgIEZyZWVSYW1fU2JyRWxlbWVudChwaFNickVsZW1lbnQpOworICB9CisgIHJldHVybiA7CisKK30KKworCit2b2lkIHNickVuY29kZXJfQ2xvc2UgKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhTYnJFbmNvZGVyKQoreworICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSAqcGhTYnJFbmNvZGVyOworCisgIGlmIChoU2JyRW5jb2RlciAhPSBOVUxMKQorICB7CisgICAgaW50IGVsLCBjaDsKKworICAgIGZvciAoZWw9MDsgZWw8KDgpOyBlbCsrKQorICAgIHsKKyAgICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0hPU5VTEwpIHsKKyAgICAgICAgc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xvc2Ugc2JyIENoYW5uZWxzICovCisgICAgZm9yIChjaD0wOyBjaDwoOCk7IGNoKyspCisgICAgeworICAgICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtjaF0pIHsKKyAgICAgICAgc2JyRW5jb2Rlcl9DaGFubmVsQ2xvc2UoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSk7CisgICAgICAgIEZyZWVSYW1fU2JyQ2hhbm5lbCgmaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSk7CisgICAgICB9CisKKyAgICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbY2hdLkZpbHRlclN0YXRlcykKKyAgICAgICAgRnJlZVJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMoKEZJWFBfUUFTKiopJmhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tjaF0uRmlsdGVyU3RhdGVzKTsKKworCisgICAgfQorCisgICAgaWYgKGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykKKyAgICAgIFBTRW5jX0Rlc3Ryb3koJmhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbyk7CisgICAgaWYgKGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMpCisgICAgICBGcmVlUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzKChGSVhQX0RCTCoqKSZoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKTsKKworICAgIC8qIFJlbGVhc2UgT3ZlcmxheSAqLworICAgIEZyZWVSYW1fU2JyRHluYW1pY19SQU0oKEZJWFBfREJMKiopJmhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0pOworCisKKyAgICBGcmVlUmFtX1NickVuY29kZXIocGhTYnJFbmNvZGVyKTsKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiB1cGRhdGVGcmVxQmFuZFRhYmxlCisgZGVzY3JpcHRpb246ICB1cGRhdGVzIHZrX21hc3RlcgorIHJldHVybnM6ICAgICAgLQorIGlucHV0OiAgICAgICAgY29uZmlnIGhhbmRsZQorIG91dHB1dDogICAgICAgZXJyb3IgaW5mbworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgdXBkYXRlRnJlcUJhbmRUYWJsZSgKKyAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKKyAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZG93blNhbXBsZUZhY3RvcgorICAgICAgICApCit7CisgIElOVCBrMCwgazI7CisKKyAgaWYoIEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCAoCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gKGRvd25TYW1wbGVGYWN0b3ItMSksCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsCisgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCisgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAmazAsCisgICAgICAgICAgICAgJmsyCisgICAgICAgICAgICAgICkKKyAgICApCisgICAgcmV0dXJuKDEpOworCisKKyAgaWYoIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgJnNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCisgICAgICAgICAgICAgIGswLAorICAgICAgICAgICAgICBrMiwKKyAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAorICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5hbHRlclNjYWxlCisgICAgICAgICAgICAgICkKKyAgICApCisgICAgcmV0dXJuKDEpOworCisKKyAgc2JySGVhZGVyRGF0YS0+c2JyX3hvdmVyX2JhbmQ9MDsKKworCisgIGlmKCBGREtzYnJFbmNfVXBkYXRlSGlSZXMoCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldLAorICAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltISV0sCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCisgICAgICAgICAgICAgICZzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZAorICAgICAgICAgICAgICApCisgICAgKQorICAgIHJldHVybigxKTsKKworCisgIEZES3NickVuY19VcGRhdGVMb1JlcygKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0xPXSwKKyAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltMT10sCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYltISV0KKyAgICAgICAgICApOworCisKKyAgc2JyQ29uZmlnRGF0YS0+eE92ZXJGcmVxID0gKHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9XX1JFU11bMF0gKiBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxIC8gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcysxKT4+MTsKKworICByZXR1cm4gKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiByZXNldEVudkNoYW5uZWwKKyBkZXNjcmlwdGlvbjogIHJlc2V0cyBwYXJhbWV0ZXJzIGFuZCBhbGxvY2F0ZXMgbWVtb3J5CisgcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKKyBpbnB1dDoKKyBvdXRwdXQ6ICAgICAgIGhFbnYKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIHJlc2V0RW52Q2hhbm5lbCAoSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgIGhFbnYpCit7CisgIC8qIG5vdGUgISEhIGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGluIGZ1bmN0aW9uIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUgISEhKi8KKyAgaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9pc2VCYW5kcyA9ICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHM7CisKKworICBpZihGREtzYnJFbmNfUmVzZXRUb25Db3JyUGFyYW1FeHRyKCZoRW52LT5Ub25Db3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5udW1fTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcykpCisgICAgcmV0dXJuKDEpOworCisgIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbTE9dID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOworICBoRW52LT5zYnJDb2RlTm9pc2VGbG9vci5uU2ZiW0hJXSA9IGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKKworICBoRW52LT5zYnJDb2RlRW52ZWxvcGUublNmYltMT10gPSBzYnJDb25maWdEYXRhLT5uU2ZiW0xPXTsKKyAgaEVudi0+c2JyQ29kZUVudmVsb3BlLm5TZmJbSEldID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CisKKyAgaEVudi0+ZW5jRW52RGF0YS5ub0hhcm1vbmljcyA9IHNickNvbmZpZ0RhdGEtPm5TZmJbSEldOworCisgIGhFbnYtPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOworICBoRW52LT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSAwOworCisgIHJldHVybiAoMCk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGZuCisgKiBAYnJpZWYgICAgICAgY2FsY3VsYXRlcyB0aGUgY2xvc2VzdCBwb3NzaWJsZSBjcm9zc292ZXIgZnJlcXVlbmN5CisgKiBAcmV0dXJuICAgICAgdGhlIGNyb3Nzb3ZlciBmcmVxdWVuY3kgU0JSIGFjY2VwdHMKKyAqCisgKi8KK3N0YXRpYyBJTlQKK0ZES3NickVuY19TYnJHZXRYT3ZlckZyZXEoSEFORExFX1NCUl9FTEVNRU5UICBoRW52LCAgICAgICAgLyohPCBoYW5kbGUgdG8gU0JSIGVuY29kZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICB4b3ZlckZyZXEpICAgLyohPCBmcm9tIGNvcmUgY29kZXIgc3VnZ2VzdGVkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KK3sKKyAgSU5UIGJhbmQ7CisgIElOVCBsYXN0RGlmZiwgbmV3RGlmZjsKKyAgSU5UIGN1dG9mZlNiOworCisgIFVDSEFSICpSRVNUUklDVCBwVktNYXN0ZXIgPSBoRW52LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXI7CisKKyAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBjdXRvZmYgZnJlcXVlbmN5IGluIHRoZSBtYXN0ZXIgdGFibGUgKi8KKyAgY3V0b2ZmU2IgPSAoNCp4b3ZlckZyZXEgKiBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgLyBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgKyAxKT4+MTsKKyAgbGFzdERpZmYgPSBjdXRvZmZTYjsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IGhFbnYtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrKSB7CisKKyAgICBuZXdEaWZmID0gZml4cF9hYnMoKElOVClwVktNYXN0ZXJbYmFuZF0gLSBjdXRvZmZTYik7CisKKyAgICBpZihuZXdEaWZmID49IGxhc3REaWZmKSB7CisgICAgICBiYW5kLS07CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsYXN0RGlmZiA9IG5ld0RpZmY7CisgIH0KKworICByZXR1cm4gKChwVktNYXN0ZXJbYmFuZF0gKiBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEvaEVudi0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzKzEpPj4xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBmdW5jdGlvbm5hbWU6IEZES3NickVuY19FbnZFbmNvZGVGcmFtZQorIGRlc2NyaXB0aW9uOiBwZXJmb3JtcyB0aGUgc2JyIGVudmVsb3BlIGNhbGN1bGF0aW9uIGZvciBvbmUgZWxlbWVudAorIHJldHVybnM6CisgaW5wdXQ6Cisgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhFbnZFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGlFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnNhbXBsZXMsICAgICAgICAgICAgICAgICAvKiE8IHRpbWUgc2FtcGxlcywgYWx3YXlzIGludGVybGVhdmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLCAgICAgICAgICAgIC8qITwgdGltZSBidWZmZXIgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc3RyaWRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqc2JyRGF0YUJpdHMsICAgICAgICAgICAgIC8qITwgU2l6ZSBvZiBTQlIgcGF5bG9hZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICpzYnJEYXRhLCAgICAgICAgICAgICAgICAgLyohPCBTQlIgcGF5bG9hZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dCAgICAgICAgICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSBoRW52RW5jb2Rlci0+c2JyRWxlbWVudFtpRWxlbWVudF07CisgIEZES19DUkNJTkZPICBjcmNJbmZvOworICBJTlQgICAgY3JjUmVnOworICBJTlQgICAgY2g7CisgIElOVCAgICBiYW5kOworICBJTlQgICAgY3V0b2ZmU2I7CisgIElOVCAgICBuZXdYT3ZlcjsKKworICBpZiAoaEVudkVuY29kZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaFNickVsZW1lbnQgPSBoRW52RW5jb2Rlci0+c2JyRWxlbWVudFtpRWxlbWVudF07CisKKyAgaWYgKGhTYnJFbGVtZW50ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisKKyAgLyogaGVhZGVyIGJpdHN0cmVhbSBoYW5kbGluZyAqLworICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEgPSAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGE7CisKKyAgSU5UIHBzSGVhZGVyQWN0aXZlID0gMDsKKyAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlID0gMDsKKworICAvKiBBbnRpY2lwYXRlIFBTIGhlYWRlciBiZWNhdXNlIG9mIGludGVybmFsIFBTIGJpdHN0cmVhbSBkZWxheSBpbiBvcmRlciB0byBiZSBpbiBzeW5jIHdpdGggU0JSIGhlYWRlci4gKi8KKyAgaWYgKCBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhPT0oc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YS0xKSApCisgIHsKKyAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsKKyAgfQorCisgIC8qIFNpZ25hbCBTQlIgaGVhZGVyIHRvIGJlIHdyaXR0ZW4gaW50byBiaXRzdHJlYW0gKi8KKyAgaWYgKCBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhPT0wICApCisgIHsKKyAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlID0gMTsKKyAgfQorCisgIC8qIEluY3JlbWVudCBoZWFkZXIgaW50ZXJ2YWwgY291bnRlciAqLworICBpZiAoc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YSA9PSAwKSB7CisgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPj0gMCkgeworICAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSsrOworICAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSAlPSBzYnJCaXRzdHJlYW1EYXRhLT5OclNlbmRIZWFkZXJEYXRhOworICAgIH0KKyAgfQorCisgIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkICkgeworICAgIElOVCBpOworICAgIGZvciAoIGkgPSA0OyBpID4gMDsgaS0tICkKKyAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpLTFdOworCisgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzBdID0gaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYzsKKyAgICBpZiAoaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdID4gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzJdKQorICAgICAgbmV3WE92ZXIgPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMl07CisgICAgZWxzZQorICAgICAgbmV3WE92ZXIgPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMV07CisKKyAgICAvKiBoYXMgdGhlIGNyb3Nzb3ZlciBmcmVxdWVuY3kgY2hhbmdlZD8gKi8KKyAgICBpZiAoIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSAhPSBuZXdYT3ZlciApIHsKKworICAgICAgLyogZ2V0IGNvcnJlc3BvbmRpbmcgbWFzdGVyIGJhbmQgKi8KKyAgICAgIGN1dG9mZlNiID0gKCg0KiBuZXdYT3ZlciAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKKyAgICAgICAgICAgICAgICAgIC8gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSkrMSk+PjE7CisKKyAgICAgIGZvciAoIGJhbmQgPSAwOyBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrICkgeworICAgICAgICBpZiAoIGN1dG9mZlNiID09IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXJbYmFuZF0gKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgRkRLX0FTU0VSVCggYmFuZCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXIgKTsKKworICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gbmV3WE92ZXI7CisgICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfeG92ZXJfYmFuZCA9IGJhbmQ7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmU9MTsKKyAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsgLyogcHMgaGVhZGVyIGlzIG9uZSBmcmFtZSBkZWxheWVkICovCisKKyAgICAgIC8qCisgICAgICAgIHVwZGF0ZSB2a19tYXN0ZXIgdGFibGUKKyAgICAgICovCisgICAgICBpZih1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICByZXR1cm4oMSk7CisKKworICAgICAgLyogcmVzZXQgU0JSIGNoYW5uZWxzICovCisgICAgICBJTlQgbkVudkNoID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOworICAgICAgZm9yICggY2ggPSAwOyBjaCA8IG5FbnZDaDsgY2grKyApIHsKKyAgICAgICAgaWYocmVzZXRFbnZDaGFubmVsICgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmhFbnZDaGFubmVsKSkKKyAgICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgIGFsbG9jYXRlIHNwYWNlIGZvciBkdW1teSBoZWFkZXIgYW5kIGNyYworICAqLworICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MpOworCisgIC8qIFRlbXBvcmFsIEVudmVsb3BlIERhdGEgKi8KKyAgU0JSX0ZSQU1FX1RFTVBfREFUQSBfZkRhdGE7CisgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhID0gJl9mRGF0YTsKKyAgU0JSX0VOVl9URU1QX0RBVEEgZURhdGFbTUFYX05VTV9DSEFOTkVMU107CisKKyAgLyogSW5pdCBUZW1wb3JhbCBFbnZlbG9wZSBEYXRhICovCisgIHsKKyAgICBpbnQgaTsKKworICAgIEZES21lbWNsZWFyKCZlRGF0YVswXSwgc2l6ZW9mKFNCUl9FTlZfVEVNUF9EQVRBKSk7CisgICAgRkRLbWVtY2xlYXIoJmVEYXRhWzFdLCBzaXplb2YoU0JSX0VOVl9URU1QX0RBVEEpKTsKKyAgICBGREttZW1jbGVhcihmRGF0YSwgc2l6ZW9mKFNCUl9GUkFNRV9URU1QX0RBVEEpKTsKKworICAgIGZvcihpPTA7IGk8TUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKKyAgICAgIGZEYXRhLT5yZXNbaV0gPSBGUkVRX1JFU19ISUdIOworICB9CisKKworICBpZiAoIWNsZWFyT3V0cHV0KQorICB7CisgICAgLyoKKyAgICAgKiBUcmFuc2Zvcm0gYXVkaW8gZGF0YSBpbnRvIFFNRiBkb21haW4KKyAgICAgKi8KKyAgICBmb3IoY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKykKKyAgICB7CisgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaF9lbnZDaGFuID0gJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXS0+aEVudkNoYW5uZWw7CisgICAgICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0ckVudiA9ICZoX2VudkNoYW4tPnNickV4dHJhY3RFbnZlbG9wZTsKKworICAgICAgaWYoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyA9PSAwKQorICAgICAgeworICAgICAgICBRTUZfU0NBTEVfRkFDVE9SIHRtcFNjYWxlOworICAgICAgICBGSVhQX0RCTCAqKnBRbWZSZWFsLCAqKnBRbWZJbWFnOworICAgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHFtZldvcmtCdWZmZXIsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqMikKKworCisgICAgICAgIC8qIE9idGFpbiBwb2ludGVycyB0byBRTUYgYnVmZmVycy4gKi8KKyAgICAgICAgcFFtZlJlYWwgPSBzYnJFeHRyRW52LT5yQnVmZmVyOworICAgICAgICBwUW1mSW1hZyA9IHNickV4dHJFbnYtPmlCdWZmZXI7CisKKyAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZldvcmtCdWZmZXIgKTsKKworICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gdG1wU2NhbGUubGJfc2NhbGUgKyA3OworCisKKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIFFNRl9DSEFOTkVMUyoyKQorCisgICAgICB9IC8qIGZQYXJhbWV0cmljU3RlcmVvID09IDAgKi8KKworCisgICAgICAvKgorICAgICAgICBQYXJhbWV0cmljIFN0ZXJlbyBwcm9jZXNzaW5nCisgICAgICAqLworICAgICAgaWYgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pCisgICAgICB7CisgICAgICAgIElOVCBlcnJvciA9IG5vRXJyb3I7CisKKworICAgICAgICAvKiBMaW1pdCBQYXJhbWV0cmljIFN0ZXJlbyB0byBvbmUgaW5zdGFuY2UgKi8KKyAgICAgICAgRkRLX0FTU0VSVChjaCA9PSAwKTsKKworCisgICAgICAgIGlmKGVycm9yID09IG5vRXJyb3IpeworICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIHByb2Nlc3Npbmc6CisgICAgICAgICAgICAgLSBpbnB1dDoKKyAgICAgICAgICAgICAgIG8gbGVmdCBhbmQgcmlnaHQgdGltZSBkb21haW4gc2FtcGxlcworICAgICAgICAgICAgIC0gcHJvY2Vzc2luZzoKKyAgICAgICAgICAgICAgIG8gc3RlcmVvIHFtZiBhbmFseXNpcworICAgICAgICAgICAgICAgbyBzdGVyZW8gaHlicmlkIGFuYWx5c2lzCisgICAgICAgICAgICAgICBvIHBzIHBhcmFtZXRlciBleHRyYWN0aW9uCisgICAgICAgICAgICAgICBvIGRvd25taXggKyBoeWJyaWQgc3ludGhlc2lzCisgICAgICAgICAgICAgLSBvdXRwdXQ6CisgICAgICAgICAgICAgICBvIGRvd25taXhlZCBxbWYgZGF0YSBpcyB3cml0dGVuIHRvIHNickV4dHJFbnYtPnJCdWZmZXIgYW5kIHNickV4dHJFbnYtPmlCdWZmZXIKKyAgICAgICAgICAqLworICAgICAgICAgIFNDSEFSIHFtZlNjYWxlOworICAgICAgICAgIElOVF9QQ00qIHBTYW1wbGVzWzJdID0ge3NhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFswXSxzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMV19OworICAgICAgICAgIGVycm9yID0gRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKCBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcW1mU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzSGVhZGVyQWN0aXZlICk7CisgICAgICAgICAgaWYgKG5vRXJyb3IgIT0gZXJyb3IpCisgICAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgPSBoYW5kQmFjayhlcnJvcik7CisgICAgICAgICAgfQorICAgICAgICAgIGhfZW52Q2hhbi0+cW1mU2NhbGUgPSAoaW50KXFtZlNjYWxlOworICAgICAgICB9CisKKworICAgICAgfSAvKiBpZiAoaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSAqLworCisgICAgICAvKgorCisgICAgICAgICBFeHRyYWN0IEVudmVsb3BlIHJlbGV2YW50IHRoaW5ncyBmcm9tIFFNRiBkYXRhCisKKyAgICAgICovCisgICAgICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVEYXRhW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgfSAvKiBoRW52RW5jb2Rlci0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMgKi8KKyB9CisKKyAgLyoKKyAgICAgUHJvY2VzcyBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgYW5kIGNhbGN1bGF0ZSBlbnZlbG9wZSBkYXRhIGFuZCB3cml0ZSBwYXlsb2FkCisgICovCisgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pID8gaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMV0tPmhFbnZDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAvKgorICAgIGZvcm1hdCBwYXlsb2FkLCBjYWxjdWxhdGUgY3JjCisgICovCisgIEZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLCAmY3JjSW5mbywgY3JjUmVnLCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CisKKyAgLyoKKyAgICBzYXZlIG5ldyBwYXlsb2FkLCBzZXQgdG8gemVybyBsZW5ndGggaWYgZ3JlYXRlciB0aGFuIE1BWF9QQVlMT0FEX1NJWkUKKyAgKi8KKyAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID0gRkRLZ2V0VmFsaWRCaXRzKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyQml0YnVmKTsKKworICBpZihoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0gPiAoTUFYX1BBWUxPQURfU0laRTw8MykpCisgICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldPTA7CisKKyAgLyogV2hpbGUgZmlsbGluZyB0aGUgRGVsYXkgbGluZXMsIHNickRhdGEgaXMgTlVMTCAqLworICBpZiAoc2JyRGF0YSkgeworICAgICpzYnJEYXRhQml0cyA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXTsKKyAgICBGREttZW1jcHkoc2JyRGF0YSwgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbMF0sIChoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0rNyk+PjMpOworCisKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGlmIChoRW52RW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCisgIHsKKyAgICBpbnQgY2g7CisgICAgaW50IG5DaGFubmVscyA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKKworICAgIGZvciAoY2g9MDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgSU5UIG5PdXRTYW1wbGVzOworCisgICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdICsgaEVudkVuY29kZXItPmJ1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuY29kZXItPm5DaGFubmVscyk7CisgICAgfQorICB9IC8qIGRvd25zYW1wbGUgKi8KKworCisgIHJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiBjcmVhdGVFbnZDaGFubmVsCisgZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzIGFuZCBhbGxvY2F0ZXMgbWVtb3J5CisgcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKKyBpbnB1dDoKKyBvdXRwdXQ6ICAgICAgIGhFbnYKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBJTlQKK2NyZWF0ZUVudkNoYW5uZWwgKEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgaEVudiwKKyAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAorICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgICAgICAgICAgICBkeW5hbWljX1JBTQorICAgICAgICAgICAgICAgICApCit7CisgIEZES21lbWNsZWFyKGhFbnYsc2l6ZW9mIChzdHJ1Y3QgRU5WX0NIQU5ORUwpKTsKKworICBpZiAoIEZES3NickVuY19DcmVhdGVUb25Db3JyUGFyYW1FeHRyKCZoRW52LT5Ub25Db3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKSApCisgIHsKKyAgICByZXR1cm4oMSk7CisgIH0KKworICBpZiAoIEZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLC8qY2hhbiovMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKKyAgeworICAgIHJldHVybigxKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIGZ1bmN0aW9ubmFtZTogaW5pdEVudkNoYW5uZWwKKyBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBhcmFtZXRlcnMKKyByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cworIGlucHV0OgorIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UCitpbml0RW52Q2hhbm5lbCAoICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgIGhFbnYsCisgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyICAgIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIFVMT05HICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKKyAgICAgICAgICAgICAgICAgLElOVCAgICAgICAgICAgICAgICAgICAgY2hhbkluRWwKKyAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgICAgICAgICAgICAgZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgKQoreworICBpbnQgZnJhbWVTaGlmdCwgdHJhbl9vZmY9MDsKKyAgSU5UIGU7CisgIElOVCB0cmFuX2ZjOworICBJTlQgdGltZVNsb3RzLCB0aW1lU3RlcCwgc3RhcnRJbmRleDsKKyAgSU5UIG5vaXNlQmFuZHNbMl0gPSB7IDMsIDMgfTsKKworICBlID0gMSA8PCBwYXJhbXMtPmU7CisKKyAgRkRLX0FTU0VSVChwYXJhbXMtPmUgPj0gMCk7CisKKyAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXggPSAxOworICBoRW52LT5mTGV2ZWxQcm90ZWN0ID0gMDsKKworICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZCA9IChzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSA/IDEgOiAwOworCisgIGhFbnYtPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSA9IChYUE9TX01PREUpcGFyYW1zLT5zYnJfeHBvc19tb2RlOworCisgIGlmIChoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUgPT0gWFBPU19TV0lUQ0hFRCkgeworICAgIC8qCisgICAgICAgbm8gb3RoZXIgdHlwZSB0aGFuIFhQT1NfTURDVCBvciBYUE9TX1NQRUVDSCBhbGxvd2VkLAorICAgICAgIGJ1dCBlbmFibGUgc3dpdGNoaW5nCisgICAgKi8KKyAgICBzYnJDb25maWdEYXRhLT5zd2l0Y2hUcmFuc3Bvc2VycyA9IFRSVUU7CisgICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gWFBPU19NRENUOworICB9CisgIGVsc2UgeworICAgIHNickNvbmZpZ0RhdGEtPnN3aXRjaFRyYW5zcG9zZXJzID0gRkFMU0U7CisgIH0KKworICBoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX2N0cmwgPSBwYXJhbXMtPnNicl94cG9zX2N0cmw7CisKKworICAvKiBleHRlbmRlZCBkYXRhICovCisgIGlmKHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZykgeworICAgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5kZWRfZGF0YSA9IDE7CisgIH0KKyAgZWxzZSB7CisgICAgaEVudi0+ZW5jRW52RGF0YS5leHRlbmRlZF9kYXRhID0gMDsKKyAgfQorCisgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5zaW9uX3NpemUgPSAwOworCisgIHN0YXJ0SW5kZXggPSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFIC0gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kczsKKworICBzd2l0Y2ggKHBhcmFtcy0+c2JyRnJhbWVTaXplKSB7CisgIGNhc2UgMjMwNDoKKyAgICB0aW1lU2xvdHMgPSAxODsKKyAgICBicmVhazsKKyAgY2FzZSAyMDQ4OgorICBjYXNlIDEwMjQ6CisgIGNhc2UgNTEyOgorICAgIHRpbWVTbG90cyA9IDE2OworICAgIGJyZWFrOworICBjYXNlIDE5MjA6CisgIGNhc2UgOTYwOgorICBjYXNlIDQ4MDoKKyAgICB0aW1lU2xvdHMgPSAxNTsKKyAgICBicmVhazsKKyAgY2FzZSAxMTUyOgorICAgIHRpbWVTbG90cyA9IDk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICgxKTsgLyogSWxsZWdhbCBmcmFtZSBzaXplICovCisgIH0KKworICB0aW1lU3RlcCA9IHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMgLyB0aW1lU2xvdHM7CisKKyAgaWYgKCBGREtzYnJFbmNfSW5pdFRvbkNvcnJQYXJhbUV4dHIocGFyYW1zLT5zYnJGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPlRvbkNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zYnJfeHBvc19jdHJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmFuYV9tYXhfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5ub2lzZUZsb29yT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnVzZVNwZWVjaENvbmZpZykgKQorICAgIHJldHVybigxKTsKKworICBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOworCisgIG5vaXNlQmFuZHNbMF0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOworICBub2lzZUJhbmRzWzFdID0gaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kczsKKworICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSAoSU5WRl9NT0RFKXBhcmFtcy0+c2JyX2ludmZfbW9kZTsKKworICBpZiAoaEVudi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID09IElOVkZfU1dJVENIRUQpIHsKKyAgICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBJTlZGX01JRF9MRVZFTDsKKyAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gVFJVRTsKKyAgfQorICBlbHNlIHsKKyAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gRkFMU0U7CisgIH0KKworCisgIHRyYW5fZmMgID0gcGFyYW1zLT50cmFuX2ZjOworCisgIGlmICh0cmFuX2ZjID09IDApIHsKKyAgICB0cmFuX2ZjID0gZml4TWluICg1MDAwLCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXIChzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxKSk7CisgIH0KKworICB0cmFuX2ZjID0gKHRyYW5fZmMqNCpzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzL3NickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgKyAxKT4+MTsKKworICBpZiAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIGZyYW1lU2hpZnQgPSBMRF9QUkVUUkFOX09GRjsKKyAgICB0cmFuX29mZiA9IExEX1BSRVRSQU5fT0ZGICsgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQqdGltZVN0ZXA7CisgIH0gZWxzZQorICB7CisgICAgZnJhbWVTaGlmdCA9IDA7CisgICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgICAgIC8qIFRoZSBmYWN0b3Igb2YgMiBpcyBieSBkZWZpbml0aW9uLiAqLworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OiB0cmFuX29mZiA9IDggKyBGUkFNRV9NSURETEVfU0xPVF8yMDQ4ICogdGltZVN0ZXA7IGJyZWFrOworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOiB0cmFuX29mZiA9IDcgKyBGUkFNRV9NSURETEVfU0xPVF8xOTIwICogdGltZVN0ZXA7IGJyZWFrOworICAgICAgZGVmYXVsdDogcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmICggRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLCBzdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywgdGltZVN0ZXAsIHRyYW5fb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsY2hhbkluRWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljX1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCisgICAgcmV0dXJuKDEpOworCisgIGlmKEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlICgmaEVudi0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlXzFzdEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfaW5jcikpCisgICAgcmV0dXJuKDEpOworCisgIGlmKEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlICgmaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRlbHRhVEFjcm9zc0ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDApKQorICAgIHJldHVybigxKTsKKworICBzYnJDb25maWdEYXRhLT5pbml0QW1wUmVzRkYgPSBwYXJhbXMtPmluaXRfYW1wX3Jlc19GRjsKKworICBpZihGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMgKCZoRW52LT5lbmNFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKSkKKyAgIHJldHVybigxKTsKKworICBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvciAoJmhFbnYtPlNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c3ByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoRW52LT5lbmNFbnZEYXRhLmxkR3JpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgaWYoRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvciAoJmhFbnYtPnNiclRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5fZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbl9vZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgIHJldHVybigxKTsKKworCisgIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoID0gcGFyYW1zLT5zYnJfeHBvc19jdHJsOworCisgIGhFbnYtPmVuY0VudkRhdGEubm9IYXJtb25pY3MgPSBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXTsKKyAgaEVudi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcgPSAwOworCisgIHJldHVybiAoMCk7Cit9CisKK0lOVCBzYnJFbmNvZGVyX09wZW4oCisgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgKnBoU2JyRW5jb2RlciwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUworICAgICAgICApCit7CisgIElOVCBpOworICBJTlQgZXJyb3JTdGF0dXMgPSAxOworICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSBOVUxMOworCisgIGlmIChwaFNickVuY29kZXI9PU5VTEwKKyAgICAgKQorICB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaFNickVuY29kZXIgPSBHZXRSYW1fU2JyRW5jb2RlcigpOworICBpZiAoaFNickVuY29kZXI9PU5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgRkRLbWVtY2xlYXIoaFNickVuY29kZXIsIHNpemVvZihTQlJfRU5DT0RFUikpOworCisgICAgICBoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNID0gKFVDSEFSKilHZXRSYW1fU2JyRHluYW1pY19SQU0oKTsKKyAgICAgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtID0gaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTTsKKworICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldID0gR2V0UmFtX1NickVsZW1lbnQoaSk7CisgICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldPT1OVUxMKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgRkRLbWVtY2xlYXIoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0sIHNpemVvZihTQlJfRUxFTUVOVCkpOworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dID0gIEdldFJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPKGkpOworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldID0gIEdldFJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJKGkpOworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIgICAgICAgID0gIEdldFJhbV9TYnJfdl9rX21hc3RlcihpKTsKKyAgICBpZiAoIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXT09TlVMTCkgfHwKKyAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXT09TlVMTCkgfHwKKyAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyPT1OVUxMKSApCisgICAgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgICBoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbaV0gPSBHZXRSYW1fU2JyQ2hhbm5lbChpKTsKKyAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2ldPT1OVUxMKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoIGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCisgICAgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgIH0KKworICBmb3IgKGk9MDsgaTxmaXhNYXgobkNoYW5uZWxzLChzdXBwb3J0UFMpPzI6MCk7IGkrKykgeworICAgIGhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tpXS5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzKGkpOworICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzPT1OVUxMKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICBpZiAoc3VwcG9ydFBTKSB7CisgICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkKKyAgICB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcyA9IEdldFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcygpOworICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzPT1OVUxMKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9ICAvKiBzdXBwb3J0UFMgKi8KKworICAqcGhTYnJFbmNvZGVyID0gaFNickVuY29kZXI7CisKKyAgZXJyb3JTdGF0dXMgPSAwOworICByZXR1cm4gZXJyb3JTdGF0dXM7CisKK2JhaWw6CisgIC8qIENsb3NlIFNCUiBlbmNvZGVyIGluc3RhbmNlICovCisgIHNickVuY29kZXJfQ2xvc2UoJmhTYnJFbmNvZGVyKTsKKyAgcmV0dXJuIGVycm9yU3RhdHVzOworfQorCitzdGF0aWMKK0lOVCBGREtzYnJFbmNfUmVhbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gICAgIGVsSW5mb1soOCldLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICBub0VsZW1lbnRzKQoreworICBJTlQgdG90YWxDaCA9IDA7CisgIElOVCB0b3RhbFFtZiA9IDA7CisgIElOVCBjb3JlRWw7CisgIElOVCBlbD0tMTsKKworICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSwgdW50aWwgbGZlIGZvdW5kICovCisKKyAgZm9yIChjb3JlRWw9MDsgY29yZUVsPG5vRWxlbWVudHM7IGNvcmVFbCsrKQorICB7CisgICAgLyogU0JSIG9ubHkgaGFuZGxlcyBTQ0UgYW5kIENQRSdzICovCisgICAgaWYgKGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9TQ0UgfHwgZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX0NQRSkgeworICAgICAgZWwrKzsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9MRkUpIHsKKyAgICAgICAgICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSBlbEluZm9bY29yZUVsXS5DaGFubmVsSW5kZXhbMF07CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTQlJfRUxFTUVOVF9JTkZPICAgICpwZWxJbmZvID0gJmVsSW5mb1tjb3JlRWxdOworICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CisKKyAgICBpbnQgY2g7CisgICAgZm9yICggY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKysgKSB7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0gPSBoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbdG90YWxDaF07CisgICAgICB0b3RhbENoKys7CisgICAgfQorICAgIC8qIGFuYWx5c2lzIFFNRiAqLworICAgIGZvciAoIGNoID0gMDsgY2ggPCAoKHBlbEluZm8tPmZQYXJhbWV0cmljU3RlcmVvKT8yOnBlbEluZm8tPm5DaGFubmVsc0luRWwpOyBjaCsrICkgeworICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdID0gcGVsSW5mby0+Q2hhbm5lbEluZGV4W2NoXTsKKyAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdID0gJmhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1t0b3RhbFFtZisrXTsKKyAgICB9CisKKyAgICAvKiBDb3B5IEVsZW1lbnQgaW5mbyAqLworICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZWxUeXBlICAgICAgICAgICAgPSBwZWxJbmZvLT5lbFR5cGU7CisgICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyAgICAgICA9IHBlbEluZm8tPmluc3RhbmNlVGFnOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8ubkNoYW5uZWxzSW5FbCAgICAgPSBwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8gPSBwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbzsKKyAgfSAvKiBjb3JlRWwgKi8KKworICByZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfRW52SW5pdAorIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcGFyYW1ldGVycworIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCisgaW5wdXQ6Cisgb3V0cHV0OiAgICAgICBoRW52CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCitJTlQgRkRLc2JyRW5jX0VudkluaXQgKAorICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgICBoU2JyRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICpjb3JlQmFuZFdpdGgsCisgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5CaXRzdHJEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5FbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgc3RhdGVzSW5pdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBmVGltZURvbWFpbkRvd25zYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAqZHluYW1pY19SQU0KKyAgICAgICAgICAgICAgICAgICAgICApCit7CisgIFVDSEFSICAgICpiaXRzdHJlYW1CdWZmZXI7CisgIGludCBjaCwgaTsKKworICBpZiAoKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPCAxKSB8fCAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKXsKKyAgICByZXR1cm4oMSk7CisgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBlbmNvZGVyIGhhbmRsZSAgYW5kIHN0cnVjdHMqLworICBiaXRzdHJlYW1CdWZmZXIgPSBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVtuQml0c3RyRGVsYXldOworCisgIC8qIGluaXQgYW5kIHNldCBzeW50YXggZmxhZ3MgKi8KKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgPSAwOworCisgIHN3aXRjaCAoYW90KSB7CisgIGNhc2UgQU9UX0RSTV9NUEVHX1BTOgorICBjYXNlIEFPVF9EUk1fU0JSOgorICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfU0NBTEFCTEU7CisgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9EUk1fQ1JDOworICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfQ1JDOworICAgIGJyZWFrOworICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfTE9XX0RFTEFZOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisgIGlmIChwYXJhbXMtPmNyY1NicikgeworICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfQ1JDOworICB9CisKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyA9IFFNRl9DSEFOTkVMUz4+KDItcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yKTsKKyAgc3dpdGNoIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzKQorICB7CisgICAgY2FzZSA2NDogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cyA9IHBhcmFtcy0+c2JyRnJhbWVTaXplPj42OworICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZT4+NTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemU+PjY7CisgICAgICAgICAgICAgcmV0dXJuKDIpOworICB9CisKKyAgRkRLaW5pdEJpdFN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1ZiwgYml0c3RyZWFtQnVmZmVyLCBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksIDAsIEJTX1dSSVRFUik7CisKKyAgLyoKKyAgICBub3cgaW5pdGlhbGl6ZSBzYnJDb25maWdEYXRhLCBzYnJIZWFkZXJEYXRhIGFuZCBzYnJCaXRzdHJlYW1EYXRhLAorICAqLworICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzOworCisgIGlmKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPT0gMikKKyAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc3RlcmVvTW9kZSA9IHBhcmFtcy0+c3RlcmVvTW9kZTsKKyAgZWxzZQorICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zdGVyZW9Nb2RlID0gU0JSX01PTk87CisKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplICAgPSBwYXJhbXMtPnNickZyYW1lU2l6ZTsKKworICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxID0gcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yICogcGFyYW1zLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXE7CisKKyAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IDA7CisgIGlmIChwYXJhbXMtPlNlbmRIZWFkZXJEYXRhVGltZSA+IDAgKSB7CisKKyAgICBpZiAoaGVhZGVyUGVyaW9kPT0tMSkgeworCisgICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKDEwMDAgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNYXgoaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSwxKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBhc3N1cmUgaGVhZGVyIHBlcmlvZCBhdCBsZWFzdCBvbmNlIHBlciBzZWNvbmQgKi8KKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNaW4oZml4TWF4KGhlYWRlclBlcmlvZCwxKSwoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gMDsKKyAgfQorCisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9kYXRhX2V4dHJhID0gcGFyYW1zLT5zYnJfZGF0YV9leHRyYTsKKyAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID0gMDsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA9IHBhcmFtcy0+c3RhcnRGcmVxOworICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc3RvcF9mcmVxdWVuY3kgID0gcGFyYW1zLT5zdG9wRnJlcTsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3hvdmVyX2JhbmQgPSAwOworICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGNfc3RlcmVvX21vZGUgPSAwOworCisgIC8qIGRhdGFfZXh0cmEgKi8KKyAgaWYgKHBhcmFtcy0+c2JyX3hwb3NfY3RybCE9IFNCUl9YUE9TX0NUUkxfREVGQVVMVCkKKyAgICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSAxOworCisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9hbXBfcmVzID0gKEFNUF9SRVMpcGFyYW1zLT5hbXBfcmVzOworCisgIC8qIGhlYWRlcl9leHRyYV8xICovCisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmZyZXFTY2FsZSAgPSBwYXJhbXMtPmZyZXFTY2FsZTsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuYWx0ZXJTY2FsZSA9IHBhcmFtcy0+YWx0ZXJTY2FsZTsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX25vaXNlX2JhbmRzID0gcGFyYW1zLT5zYnJfbm9pc2VfYmFuZHM7CisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMDsKKworICBpZiAoKHBhcmFtcy0+ZnJlcVNjYWxlICE9IFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQpIHx8CisgICAgICAocGFyYW1zLT5hbHRlclNjYWxlICE9IFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUKSB8fAorICAgICAgKHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzICE9IFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUKSkKKyAgeworICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzEgPSAxOworICB9CisKKyAgLyogaGVhZGVyX2V4dHJhXzIgKi8KKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xpbWl0ZXJfYmFuZHMgPSBwYXJhbXMtPnNicl9saW1pdGVyX2JhbmRzOworICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9nYWlucyA9IHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnM7CisKKyAgaWYgKChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxID4gNDgwMDApICYmCisgICAgICAoaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA+PSA5KSkKKyAgeworICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9saW1pdGVyX2dhaW5zID0gU0JSX0xJTUlURVJfR0FJTlNfSU5GSU5JVEU7CisgIH0KKworICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfaW50ZXJwb2xfZnJlcSA9IHBhcmFtcy0+c2JyX2ludGVycG9sX2ZyZXE7CisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gcGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aDsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAwOworCisgIGlmICgocGFyYW1zLT5zYnJfbGltaXRlcl9iYW5kcyAhPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUKSB8fAorICAgICAgKHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnMgIT0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCkgfHwKKyAgICAgIChwYXJhbXMtPnNicl9pbnRlcnBvbF9mcmVxICE9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQpIHx8CisgICAgICAocGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aCAhPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUKSkKKyAgeworICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMiA9IDE7CisgIH0KKworICAgLyogb3RoZXIgc3dpdGNoZXMgKi8KKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlV2F2ZUNvZGluZyAgICAgICAgICAgICA9IHBhcmFtcy0+dXNlV2F2ZUNvZGluZzsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlUGFyYW1ldHJpY0NvZGluZyAgICAgICA9IHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZzsKKworICAvKiBpbml0IGZyZXEgYmFuZCB0YWJsZSAqLworICBpZih1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgeworICAgIHJldHVybigxKTsKKyAgfQorCisgIC8qIG5vdyBjcmVhdGUgZW52ZWxvcGUgZXh0IGFuZCBRTUYgZm9yIGVhY2ggYXZhaWxhYmxlIGNoYW5uZWwgKi8KKyAgZm9yICggY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKyApIHsKKworICAgICBpZiAoIGluaXRFbnZDaGFubmVsKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXS0+aEVudkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICxjaAorICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgKSApCisgICAgIHsKKyAgICAgICByZXR1cm4oMSk7CisgICAgIH0KKworCisgIH0gLyogbkNoYW5uZWxzICovCisKKyAgLyogcmVzZXQgYW5kIGludGlhbGl6ZSBhbmFseXNpcyBxbWYgKi8KKyAgZm9yICggY2ggPSAwOyBjaCA8ICgoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMpOyBjaCsrICkKKyAgeworICAgIGludCBlcnI7CisgICAgVUlOVCBxbWZGbGFncyA9IChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSA/IFFNRl9GTEFHX0NMREZCIDogMDsKKyAgICBpZiAoc3RhdGVzSW5pdEZsYWcpCisgICAgICBxbWZGbGFncyAmPSB+UU1GX0ZMQUdfS0VFUF9TVEFURVM7CisgICAgZWxzZQorICAgICAgcW1mRmxhZ3MgfD0gIFFNRl9GTEFHX0tFRVBfU1RBVEVTOworCisgICAgZXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayggaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTKiloU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXS0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mRmxhZ3MgKTsKKyAgICBpZiAoMCE9ZXJyKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorCisgIC8qICAqLworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEueE92ZXJGcmVxOworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkID0gKHBhcmFtcy0+ZHluQndTdXBwb3J0ZWQgJiYgcGFyYW1zLT5keW5Cd0VuYWJsZWQpOworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jID0gRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcSggaFNickVsZW1lbnQsIGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXEpOworICBmb3IgKCBpID0gMDsgaSA8IDU7IGkrKyApCisgICAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaV0gPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jOworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyTnVtQ2hhbm5lbHMgID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOworICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5keW5YT3ZlckZyZXEgPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxOworCisgIC8qIFVwZGF0ZSBCYW5kd2l0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcmUgZW5jb2RlciAqLworICAqY29yZUJhbmRXaXRoID0gaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcTsKKworICByZXR1cm4oMCk7CisgfQorCitJTlQgc2JyRW5jb2Rlcl9HZXRJbkJ1ZmZlclNpemUoaW50IG5vQ2hhbm5lbHMpCit7CisgIElOVCB0ZW1wOworCisgIHRlbXAgPSAoMjA0OCk7CisgIHRlbXAgKz0gMTAyNCArIE1BWF9TQU1QTEVfREVMQVk7CisgIHRlbXAgKj0gbm9DaGFubmVsczsKKyAgdGVtcCAqPSBzaXplb2YoSU5UX1BDTSk7CisgIHJldHVybiB0ZW1wOworfQorCisvKgorICogRW5jb2RlIER1bW15IFNCUiBwYXlsb2FkIGZyYW1lcyB0byBmaWxsIHRoZSBkZWxheSBsaW5lcy4KKyAqLworc3RhdGljCitJTlQgRkRLc2JyRW5jX0RlbGF5Q29tcGVuc2F0aW9uICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgaW50IG4sIGVsOworCisgICAgZm9yIChuPWhFbnZFbmMtPm5CaXRzdHJEZWxheTsgbj4wOyBuLS0pCisgICAgeworICAgICAgZm9yIChlbD0wOyBlbDxoRW52RW5jLT5ub0VsZW1lbnRzOyBlbCsrKQorICAgICAgeworICAgICAgICBpZiAoRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhFbnZFbmMtPmRvd25zYW1wbGVkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMtPnNickVsZW1lbnRbZWxdLT5zYnJDb25maWdEYXRhLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoaEVudkVuYywgdGltZUJ1ZmZlcik7CisgICAgfQorCSAgcmV0dXJuIDA7Cit9CisKK1VJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLCBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpCit7CisgIFVJTlQgbmV3Qml0UmF0ZTsKKyAgSU5UIGluZGV4OworCisgIEZES19BU1NFUlQobnVtQ2hhbm5lbHMgPiAwICYmIG51bUNoYW5uZWxzIDw9IDIpOworICBpZiAoYW90ID09IEFPVF9QUykgeworICAgIGlmIChudW1DaGFubmVscyA9PSAyKSB7CisgICAgICBpbmRleCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCAmbmV3Qml0UmF0ZSk7CisgICAgICBpZiAoaW5kZXggPT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKKyAgICAgICAgYml0UmF0ZSA9IG5ld0JpdFJhdGU7CisgICAgICB9CisgICAgICAvKiBTZXQgbnVtQ2hhbm5lbHMgdG8gMSBiZWNhdXNlIGZvciBQUyB3ZSBuZWVkIGEgU0JSIFNDRSAobW9ubykgZWxlbWVudC4gKi8KKyAgICAgIG51bUNoYW5uZWxzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGluZGV4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCBudW1DaGFubmVscywgY29yZVNhbXBsZVJhdGUsIGFvdCwgJm5ld0JpdFJhdGUpOworICBpZiAoaW5kZXggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKKyAgICBuZXdCaXRSYXRlID0gYml0UmF0ZTsKKyAgfQorCisgIHJldHVybiBuZXdCaXRSYXRlOworfQorCitVSU5UIHNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoQVVESU9fT0JKRUNUX1RZUEUgYW90KQoreworICBVSU5UIGlzUG9zc2libGU9KEFPVF9QUz09YW90KT8wOjE7CisgIHJldHVybiBpc1Bvc3NpYmxlOworfQorCitJTlQgc2JyRW5jb2Rlcl9Jbml0KAorICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKKyAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCisgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMsCisgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKmlucHV0QnVmZmVyLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjb3JlQmFuZHdpZHRoLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlck9mZnNldCwKKyAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCisgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNvcmVTYW1wbGVSYXRlLAorICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAorICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpmcmFtZUxlbmd0aCwKKyAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpkZWxheSwKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCisgICAgICAgIFVMT05HICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCisgICAgICAgICkKK3sKKyAgICBIQU5ETEVfRVJST1JfSU5GTyBlcnJvckluZm8gPSBub0Vycm9yOworICAgIHNickNvbmZpZ3VyYXRpb24gc2JyQ29uZmlnWyg4KV07CisgICAgSU5UIGVycm9yID0gMDsKKyAgICBJTlQgbG93ZXN0QmFuZHdpZHRoOworICAgIC8qIFNhdmUgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIElOVCBpbnB1dFNhbXBsZVJhdGUgPSAqY29yZVNhbXBsZVJhdGU7CisgICAgaW50IGNvcmVGcmFtZUxlbmd0aCA9ICpmcmFtZUxlbmd0aDsKKyAgICBpbnQgaW5wdXRCYW5kV2lkdGggPSAqY29yZUJhbmR3aWR0aDsKKyAgICBpbnQgaW5wdXRDaGFubmVscyA9ICpudW1DaGFubmVsczsKKworICAgIGludCBkb3duc2FtcGxlZE9mZnNldCA9IDA7CisgICAgaW50IHNick9mZnNldCA9IDA7CisgICAgaW50IGRvd25zYW1wbGVyRGVsYXkgPSAwOworICAgIGludCB0aW1lRG9tYWluRG93bnNhbXBsZSA9IDA7CisgICAgaW50IG5CaXRzdHJEZWxheSA9IDA7CisgICAgaW50IGhpZ2hlc3RTYnJTdGFydEZyZXEsIGhpZ2hlc3RTYnJTdG9wRnJlcTsKKyAgICBpbnQgbG93RGVsYXkgPSAwOworICAgIGludCB1c2VQcyA9IDA7CisKKyAgICAvKiBjaGVjayB3aGV0aGVyIFNCUiBzZXR0aW5nIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgZW5jb2RlciBjb25maWd1cmF0aW9uIChiaXRyYXRlLCBzYW1wbGVyYXRlKSAqLworICAgIGlmICghc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShhb3QpKSB7CisgICAgICAqZG93blNhbXBsZUZhY3RvciA9IDI7CisgICAgfQorCisKKworICAgIGlmICggKGFvdD09QU9UX1BTKSB8fCAoYW90PT1BT1RfTVAyX1BTKSB8fCAoYW90PT1BT1RfREFCUExVU19QUykgfHwgKGFvdD09QU9UX0RSTV9NUEVHX1BTKSApIHsKKyAgICAgICAgdXNlUHMgPSAxOworICAgIH0KKyAgICBpZiAoIGFvdD09QU9UX0VSX0FBQ19FTEQgKSB7CisgICAgICAgIGxvd0RlbGF5ID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFvdD09QU9UX0VSX0FBQ19MRCApIHsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogUGFyYW1ldHJpYyBTdGVyZW8gKi8KKyAgICBpZiAoIHVzZVBzICkgeworICAgICAgaWYgKCAqbnVtQ2hhbm5lbHMgPT0gMiAmJiBub0VsZW1lbnRzID09IDEpIHsKKyAgICAgICAgLyogT3ZlcnJpZGUgRWxlbWVudCB0eXBlIGluIGNhc2Ugb2YgUGFyYW1ldHJpYyBzdGVyZW8gKi8KKyAgICAgICAgZWxJbmZvWzBdLmVsVHlwZSA9IElEX1NDRTsKKyAgICAgICAgZWxJbmZvWzBdLmZQYXJhbWV0cmljU3RlcmVvID0gMTsKKyAgICAgICAgZWxJbmZvWzBdLm5DaGFubmVsc0luRWwgPSAxOworICAgICAgICAvKiBjb3JlIGVuY29kZXIgZ2V0cyBkb3dubWl4ZWQgbW9ubyBzaWduYWwgKi8KKyAgICAgICAgKm51bUNoYW5uZWxzICA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9IC8qIHVzZVBzICovCisKKyAgICAvKiBzZXQgdGhlIGNvcmUncyBzYW1wbGUgcmF0ZSAqLworICAgIHN3aXRjaCAoKmRvd25TYW1wbGVGYWN0b3IpIHsKKyAgICBjYXNlIDE6CisgICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU+PjE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlPj4xOworICAgICAgcmV0dXJuIDA7IC8qIHJldHVybiBlcnJvciAqLworICAgIH0KKworICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIGNvcmVTYW1wbGVSYXRlKSAqLworICAgIHsKKyAgICAgIGludCBkZWxheURpZmYgPSAwOworICAgICAgaW50IGVsLCBjb3JlRWw7CisKKyAgICAgIC8qIENoZWNrIGlmIGV2ZXJ5IGVsZW1lbnQgY29uZmlnIGlzIGZlYXNpYmxlICovCisgICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCisgICAgICB7CisgICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLworICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlICE9IElEX1NDRSAmJiBlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfQ1BFKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgaWYgZGVzaXJlZCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoICFGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwgKGVsSW5mb1tjb3JlRWxdLmJpdFJhdGUsIDAsIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsIGlucHV0U2FtcGxlUmF0ZSwgKmNvcmVTYW1wbGVSYXRlLCBhb3QpICkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIERldGVybWluZSBEZWxheSBiYWxhbmNpbmcgYW5kIG5ldyBlbmNvZGVyIGRlbGF5ICovCisgICAgICBpZiAobG93RGVsYXkpIHsKKyAgICAgICAgeworICAgICAgICBkZWxheURpZmYgPSAoKmRlbGF5ICogKmRvd25TYW1wbGVGYWN0b3IpICsgREVMQVlfRUxEMlNCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOworICAgICAgICAqZGVsYXkgPSBERUxBWV9FTERTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAodXNlUHMpIHsKKyAgICAgICAgZGVsYXlEaWZmID0gKCpkZWxheSAqICpkb3duU2FtcGxlRmFjdG9yKSArIERFTEFZX0FBQzJQUyhjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOworICAgICAgICAqZGVsYXkgPSBERUxBWV9QUyhjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGRlbGF5RGlmZiA9IERFTEFZX0FBQzJTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKKyAgICAgICAgZGVsYXlEaWZmICs9ICgqZGVsYXkgKiAqZG93blNhbXBsZUZhY3Rvcik7CisgICAgICAgICpkZWxheSA9IERFTEFZX1NCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOworICAgICAgfQorCisgICAgICBpZiAoIXVzZVBzKSB7CisgICAgICAgICAgdGltZURvbWFpbkRvd25zYW1wbGUgPSAqZG93blNhbXBsZUZhY3Rvci0xOyAgLyogYWN0aXZhdGUgdGltZSBkb21haW4gZG93bnNhbXBsZXIgd2hlbiBkb3duU2FtcGxlRmFjdG9yIGlzICE9IDEgKi8KKyAgICAgIH0KKworCisgICAgICAvKiBUYWtlIGNhcmUgYWJvdXQgZG93bnNhbXBsZWQgZGF0YSBib3VuZCB0byB0aGUgU0JSIHBhdGggKi8KKyAgICAgIGlmICghdGltZURvbWFpbkRvd25zYW1wbGUgJiYgZGVsYXlEaWZmID4gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtdXN0IHR3ZWFrIHRoZSBiYWxhbmNpbmcgaW50byBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgZG93bnNhbXBsZWQgcGF0aAorICAgICAgICAgKiBpcyB0aGUgb25lIHRvIGJlIGRlbGF5ZWQsIGJlY2F1c2UgZGVsYXlpbmcgdGhlIFFNRiBkb21haW4gaW5wdXQsIGFsc28gZGVsYXlzCisgICAgICAgICAqIHRoZSBkb3duc2FtcGxlZCBhdWRpbywgY291bnRlcmFjdGluZyB0byB0aGUgcHVycG9zZSBvZiBkZWxheSBiYWxhbmNpbmcuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIGRlbGF5RGlmZiA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5jb2RlciBkZWxheSBpbmNyZWFzZXMgKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICAqZGVsYXkgKz0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CisgICAgICAgICAgICAvKiBBZGQgb25lIGZyYW1lIGRlbGF5IHRvIFNCUiBwYXRoICovCisgICAgICAgICAgICBkZWxheURpZmYgLT0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CisgICAgICAgICAgfQorICAgICAgICAgIG5CaXRzdHJEZWxheSArPSAxOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyAgICAgIHsKKyAgICAgICAgKmRlbGF5ICs9IGZpeHBfYWJzKGRlbGF5RGlmZik7CisgICAgICB9CisKKyAgICAgIGlmIChkZWxheURpZmYgPCAwKSB7CisgICAgICAgIC8qIERlbGF5IEFBQyBkYXRhICovCisgICAgICAgIGRlbGF5RGlmZiA9IC1kZWxheURpZmY7CisgICAgICAgIC8qIE11bHRpcGx5IGRvd25zYW1wbGVkIG9mZnNldCBieSBBQUMgY29yZSBjaGFubmVscy4gRGl2aWRlIGJ5IDIgYmVjYXVzZSBvZiBoYWxmIHNhbXBsZXJhdGUgb2YgZG93bnNhbXBsZWQgZGF0YS4gKi8KKyAgICAgICAgRkRLX0FTU0VSVCgqZG93blNhbXBsZUZhY3Rvcj4wICYmICpkb3duU2FtcGxlRmFjdG9yPD0yKTsKKyAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAoZGVsYXlEaWZmKigqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpOworICAgICAgICBzYnJPZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGVsYXkgU0JSIGlucHV0ICovCisgICAgICAgIGlmICggZGVsYXlEaWZmID4gKGludCljb3JlRnJhbWVMZW5ndGggKiAoaW50KSpkb3duU2FtcGxlRmFjdG9yICkKKyAgICAgICAgeworICAgICAgICAgIC8qIERvIGJpdHN0cmVhbSBmcmFtZS13aXNlIGRlbGF5IGJhbGFuY2luZyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBTQlIgZnJhbWVsZW5ndGggc2FtcGxlcyBkZWxheSBkaWZmZXJlbmNlICovCisgICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOworICAgICAgICAgIG5CaXRzdHJEZWxheSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogTXVsdGlwbHkgaW5wdXQgb2Zmc2V0IGJ5IGlucHV0IGNoYW5uZWxzICovCisgICAgICAgIHNick9mZnNldCA9IGRlbGF5RGlmZiooKm51bUNoYW5uZWxzKTsKKyAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOworICAgICAgfQorICAgICAgaFNickVuY29kZXItPm5CaXRzdHJEZWxheSAgICAgICAgICAgID0gbkJpdHN0ckRlbGF5OworICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyAgICAgICAgICAgICAgID0gKm51bUNoYW5uZWxzOworICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSAgICAgICAgICAgICAgID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CisgICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcgPSB0aW1lRG9tYWluRG93bnNhbXBsZTsKKyAgICAgIGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yICAgICAgICA9ICpkb3duU2FtcGxlRmFjdG9yOworICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSAgICAgICAgID0gMDsKKyAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSAgICAgICAgICA9IDA7CisKKworICAgICAgLyogT3BlbiBTQlIgZWxlbWVudHMgKi8KKyAgICAgIGVsID0gLTE7CisgICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0gaGlnaGVzdFNiclN0b3BGcmVxID0gMDsKKyAgICAgIGxvd2VzdEJhbmR3aWR0aCA9IDk5OTk5OworCisgICAgICAvKiBMb29wIHRocm91Z2ggZWFjaCBjb3JlIGVuY29kZXIgZWxlbWVudCBhbmQgZ2V0IGEgbWF0Y2hpbmcgU0JSIGVsZW1lbnQgY29uZmlnICovCisgICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCisgICAgICB7CisgICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLworICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX1NDRSB8fCBlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfQ1BFKSB7CisgICAgICAgICAgZWwrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBwYXJhbWV0cmljIFN0ZXJlbyBGbGFnLiAqLworICAgICAgICBpZiAodXNlUHMpIHsKKyAgICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdCBzYnJDb25maWcgc3RydWN0dXJlCisgICAgICAgICAqLworICAgICAgICBpZiAoICEgRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cyAoICZzYnJDb25maWdbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWVMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTW9kaWZ5IHNickNvbmZpZyBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIEVsZW1lbnQgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAhIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoJnNickNvbmZpZ1tlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5iaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvcmVTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIHVzZVNwZWVjaENvbmZpZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIGxjc01vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBzLCAvKiBiUGFyYW1ldHJpY1N0ZXJlbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90KSApCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCBjb21tb24gZnJlcXVlbmN5IGJvcmRlciBmb3IgYWxsIFNCUiBlbGVtZW50cyAqLworICAgICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdGFydEZyZXEsIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxKTsKKyAgICAgICAgaGlnaGVzdFNiclN0b3BGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdG9wRnJlcSwgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSk7CisKKyAgICAgIH0gLyogZmlyc3QgZWxlbWVudCBsb29wICovCisKKyAgICAgIC8qIFNldCBlbGVtZW50IGNvdW50IChjYW4gYmUgbGVzcyB0aGFuIGNvcmUgZW5jb2RlciBlbGVtZW50IGNvdW50KSAqLworICAgICAgaFNickVuY29kZXItPm5vRWxlbWVudHMgPSBlbCsxOworCisgICAgICBGREtzYnJFbmNfUmVhbGxvY2F0ZShoU2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMpOworCisgICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisKKyAgICAgICAgaW50IGJhbmR3aWR0aCA9ICpjb3JlQmFuZHdpZHRoOworCisgICAgICAgIC8qIFVzZSBsb3dlc3QgY29tbW9uIGJhbmR3aWR0aCAqLworICAgICAgICBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdGFydEZyZXE7CisgICAgICAgIHNickNvbmZpZ1tlbF0uc3RvcEZyZXEgPSBoaWdoZXN0U2JyU3RvcEZyZXE7CisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBTQlIgZWxlbWVudCwgYW5kIGdldCBjb3JlIGJhbmR3aWR0aCAqLworICAgICAgICBlcnJvciA9IEZES3NickVuY19FbnZJbml0KGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyQ29uZmlnW2VsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CaXRzdHJEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgICBlcnJvciA9IDI7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGxvd2VzdCBjb3JlIGVuY29kZXIgYmFuZHdpZHRoIHRvIGJlIHJldHVybmVkIGxhdGVyLiAqLworICAgICAgICBsb3dlc3RCYW5kd2lkdGggPSBmaXhNaW4obG93ZXN0QmFuZHdpZHRoLCBiYW5kd2lkdGgpOworCisgICAgICB9IC8qIHNlY29uZCBlbGVtZW50IGxvb3AgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSBhIGRvd25zYW1wbGVyIGZvciBlYWNoIGNoYW5uZWwgaW4gZWFjaCBTQlIgZWxlbWVudCAqLworICAgICAgaWYgKGhTYnJFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZykKKyAgICAgIHsKKyAgICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKKyAgICAgICAgeworICAgICAgICAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWwgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CisgICAgICAgICAgSU5UIFdjLCBjaDsKKworICAgICAgICAgIC8qIENhbGN1bGF0ZWQgcmVxdWlyZWQgbm9ybWFsaXplZCBjdXRvZmYgZnJlcXVlbmN5IChXYyA9IDEuMCAtPiBsb3dlc3RCYW5kd2lkdGggPSBpbnB1dFNhbXBsZVJhdGUvMikgKi8KKyAgICAgICAgICBXYyA9ICgyKmxvd2VzdEJhbmR3aWR0aCkqMTAwMCAvIGlucHV0U2FtcGxlUmF0ZTsKKworICAgICAgICAgIGZvciAoY2g9MDsgY2g8aFNickVsLT5lbEluZm8ubkNoYW5uZWxzSW5FbDsgY2grKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyICgmaFNickVsLT5zYnJDaGFubmVsW2NoXS0+ZG93blNhbXBsZXIsIFdjLCAqZG93blNhbXBsZUZhY3Rvcik7CisgICAgICAgICAgICBGREtfQVNTRVJUIChoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlci5kZWxheSA8PU1BWF9EU19GSUxURVJfREVMQVkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGRvd25zYW1wbGVyRGVsYXkgPSBoU2JyRWwtPnNickNoYW5uZWxbMF0tPmRvd25TYW1wbGVyLmRlbGF5OworICAgICAgICB9IC8qIHRoaXJkIGVsZW1lbnQgbG9vcCAqLworCisgICAgICAgIC8qIGxmZSAqLworICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyICgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLCAwLCAqZG93blNhbXBsZUZhY3Rvcik7CisKKyAgICAgICAgLyogQWRkIHRoZSByZXNhbXBsZXIgYWRkaXRpb25hbCBkZWxheSB0byBnZXQgdGhlIGZpbmFsIGRlbGF5IGFuZCBidWZmZXIgb2Zmc2V0IHZhbHVlcy4gKi8KKyAgICAgICAgaWYgKHNick9mZnNldCA+IDAgfHwgZG93bnNhbXBsZWRPZmZzZXQgPD0gKChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSkpKSB7CisgICAgICAgICAgc2JyT2Zmc2V0ICs9IChkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQpICogKCpudW1DaGFubmVscykgOworICAgICAgICAgICpkZWxheSArPSBkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQ7CisgICAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0IC09IChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSk7CisgICAgICAgICAgc2JyT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9IGRvd25zYW1wbGVyRGVsYXk7CisgICAgICB9CisKKyAgICAgIC8qIEFzc2lnbiBjb3JlIGVuY29kZXIgQmFuZHdpZHRoICovCisgICAgICAqY29yZUJhbmR3aWR0aCA9IGxvd2VzdEJhbmR3aWR0aDsKKworICAgICAgLyogRXN0aW1hdGUgc2JyIGJpdHJhdGUsIDIuNSBrQml0L3MgcGVyIHNiciBjaGFubmVsICovCisgICAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlICs9IDI1MDAgKiAoKm51bUNoYW5uZWxzKTsKKworICAgICAgLyogaW5pdGlhbGl6ZSBwYXJhbWV0cmljIHN0ZXJlbyAqLworICAgICAgaWYgKHVzZVBzKQorICAgICAgeworICAgICAgICBQU0VOQ19DT05GSUcgcHNFbmNDb25maWc7CisgICAgICAgIEZES19BU1NFUlQoaFNickVuY29kZXItPm5vRWxlbWVudHMgPT0gMSk7CisgICAgICAgIElOVCBwc1R1bmluZ1RhYmxlSWR4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGVsSW5mb1swXS5iaXRSYXRlLCBOVUxMKTsKKworICAgICAgICBwc0VuY0NvbmZpZy5mcmFtZVNpemUgICAgICAgICAgID0gY29yZUZyYW1lTGVuZ3RoOyAvL3NickNvbmZpZy5zYnJGcmFtZVNpemU7CisgICAgICAgIHBzRW5jQ29uZmlnLnFtZkZpbHRlck1vZGUgICAgICAgPSAwOworICAgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ICAgICAgICAgID0gMDsKKworICAgICAgICAvKiB0dW5pbmcgcGFyYW1ldGVycyAqLworICAgICAgICBpZiAocHNUdW5pbmdUYWJsZUlkeCAgIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKKyAgICAgICAgICBwc0VuY0NvbmZpZy5uU3RlcmVvQmFuZHMgICAgICAgICAgID0gcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5uU3RlcmVvQmFuZHM7CisgICAgICAgICAgcHNFbmNDb25maWcubWF4RW52ZWxvcGVzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ubkVudmVsb3BlczsKKyAgICAgICAgICBwc0VuY0NvbmZpZy5paWRRdWFudEVycm9yVGhyZXNob2xkID0gKEZJWFBfREJMKXBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0uaWlkUXVhbnRFcnJvclRocmVzaG9sZDsKKworICAgICAgICAgIC8qIGNhbGN1bGF0aW9uIGlzIG5vdCBxdWl0ZSBsaW5lYXIsIGluY3JlYXNlZCBudW1iZXIgb2YgZW52ZWxvcGVzIGNhdXNlcyBtb3JlIGJpdHMgKi8KKyAgICAgICAgICAvKiBhc3N1bWUgYXZnLiA1MCBiaXRzIHBlciBmcmFtZSBmb3IgMTAgc3RlcmVvIGJhbmRzIC8gMSBlbnZlbG9wZSBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPSAoICgoKCpjb3JlU2FtcGxlUmF0ZSkgKiA1ICogcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICogcHNFbmNDb25maWcubWF4RW52ZWxvcGVzKSAvIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUpKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVycm9yID0gRVJST1IoQ0RJLCAiSW52YWxpZCBwcyB0dW5pbmcgdGFibGUgaW5kZXguIik7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCopaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGVzSW5pdEZsYWcpID8gMCA6IFFNRl9GTEFHX0tFRVBfU1RBVEVTKTsKKworICAgICAgICBpZihlcnJvckluZm8gPT0gbm9FcnJvcil7CisgICAgICAgICAgLyogdXBkYXRlIGRlbGF5ICovCisgICAgICAgICAgcHNFbmNDb25maWcuc2JyUHNEZWxheSA9IEZES3NickVuY19HZXRFbnZFc3REZWxheSgmaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLnNickV4dHJhY3RFbnZlbG9wZSk7CisKKyAgICAgICAgICBpZihub0Vycm9yICE9IChlcnJvckluZm8gPSBQU0VuY19Jbml0KCBoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNFbmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBlcnJvckluZm8gPSBoYW5kQmFjayhlcnJvckluZm8pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFFNRiBhbmFseXNpcyArIEh5YnJpZCBhbmFseXNpcyArIEh5YnJpZCBzeW50aGVzaXMgKyBRTUYgc3ludGhlc2lzICsgZG93bnNhbXBsZWQgaW5wdXQgYnVmZmVyIGRlbGF5ICovCisgICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9ICg2NCoxMC8yKSArICg2KjY0KSArICAoMCkgKyAoNjQqMTAvMi02NCsxKSArICgoKmRvd25TYW1wbGVGYWN0b3IpKmRvd25zYW1wbGVkT2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID0gZG93bnNhbXBsZWRPZmZzZXQ7CisgICAgICB7CisgICAgICAgIGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSA9IGNvcmVGcmFtZUxlbmd0aCooKm51bUNoYW5uZWxzKTsKKyAgICAgIH0KKworICAgICAgaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCA9IHNick9mZnNldDsKKyAgICAgIC8qIERlbGF5IENvbXBlbnNhdGlvbjogZmlsbCBiaXRzdHJlYW0gZGVsYXkgYnVmZmVyIHdpdGggemVybyBpbnB1dCBzaWduYWwgKi8KKyAgICAgIGlmICggaFNickVuY29kZXItPm5CaXRzdHJEZWxheSA+IDAgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbiAoaFNickVuY29kZXIsIGlucHV0QnVmZmVyKTsKKyAgICAgICAgaWYgKGVycm9yICE9IDApCisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICAvKiBTZXQgT3V0cHV0IGZyYW1lIGxlbmd0aCAqLworICAgICAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CisgICAgICAvKiBJbnB1dCBidWZmZXIgb2Zmc2V0ICovCisgICAgICAqaW5wdXRCdWZmZXJPZmZzZXQgPSBmaXhNYXgoc2JyT2Zmc2V0LCBkb3duc2FtcGxlZE9mZnNldCk7CisKKworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgICAvKiBSZXN0b3JlIGlucHV0IHNldHRpbmdzICovCisgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOworICAgICpmcmFtZUxlbmd0aCA9IGNvcmVGcmFtZUxlbmd0aDsKKyAgICAqbnVtQ2hhbm5lbHMgPSBpbnB1dENoYW5uZWxzOworICAgICpjb3JlQmFuZHdpZHRoID0gaW5wdXRCYW5kV2lkdGg7CisKKyAgICByZXR1cm4gZXJyb3I7CisgfQorCisKK0lOVAorc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZSggIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHNickRhdGFCaXRzWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgc2JyRGF0YVsoOCldW01BWF9QQVlMT0FEX1NJWkVdCisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCBlcnJvcjsKKyAgaW50IGVsOworCisgIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspCisgIHsKKyAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdICE9IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRW52RW5jb2RlRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyRGF0YUJpdHNbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickRhdGFbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBpZiAoZXJyb3IpCisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgIH0KKworICBpZiAoICggaFNickVuY29kZXItPmxmZUNoSWR4IT0tMSkgJiYgKGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yID4gMSkgKQorICB7ICAgLyogbGZlIGRvd25zYW1wbGVyICovCisgICAgICBJTlQgbk91dFNhbXBsZXM7CisKKyAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5sZmVDaElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzKTsKKworCisgIH0KKworICByZXR1cm4gMDsKK30KKworCitJTlQgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorIHsKKyAgICBpZiAoIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA+IDAgKSB7CisgICAgICAvKiBNb3ZlIGRlbGF5ZWQgZG93bnNhbXBsZWQgZGF0YSAqLworICAgICAgRkRLbWVtY3B5ICggdGltZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUsCisgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiAoaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0KSApOworICAgIH0gZWxzZSB7CisgICAgICAvKiBNb3ZlIGRlbGF5ZWQgaW5wdXQgZGF0YSAqLworICAgICAgRkRLbWVtY3B5ICggdGltZUJ1ZmZlciwKKyAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMgKiBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCApOworICAgIH0KKyAgICBpZiAoIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwICApCisgICAgeworICAgICAgaW50IGVsOworCisgICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQorICAgICAgeworICAgICAgICBGREttZW1tb3ZlICggaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVDSEFSKSAqIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5Kk1BWF9QQVlMT0FEX1NJWkUpICk7CisKKyAgICAgICAgRkRLbWVtbW92ZSggJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVTaXplWzFdLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUlOVCkgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSkgKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgfQorCisKK0lOVCBzYnJFbmNvZGVyX0dldEVzdGltYXRlQml0cmF0ZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCit7CisgIElOVCBlc3RpbWF0ZUJpdHJhdGUgPSAwOworCisgIGlmKGhTYnJFbmNvZGVyKSB7CisgICAgZXN0aW1hdGVCaXRyYXRlICs9IGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGU7CisgIH0KKworICByZXR1cm4gZXN0aW1hdGVCaXRyYXRlOworfQorCitJTlQgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCit7CisgIElOVCBkZWxheSA9IC0xOworCisgIGlmKGhTYnJFbmNvZGVyKSB7CisgICAgZGVsYXkgPSBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXk7CisgIH0KKyAgcmV0dXJuIGRlbGF5OworfQorCisKK0lOVCBzYnJFbmNvZGVyX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW5mbyArPSBpOworCisgIGluZm8tPm1vZHVsZV9pZCA9IEZES19TQlJFTkM7CisgIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihTQlJFTkNPREVSX0xJQl9WTDAsIFNCUkVOQ09ERVJfTElCX1ZMMSwgU0JSRU5DT0RFUl9MSUJfVkwyKTsKKyAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pOworI2lmZGVmIF9fQU5EUk9JRF9fCisgIGluZm8tPmJ1aWxkX2RhdGUgPSAiIjsKKyAgaW5mby0+YnVpbGRfdGltZSA9ICIiOworI2Vsc2UKKyAgaW5mby0+YnVpbGRfZGF0ZSA9IF9fREFURV9fOworICBpbmZvLT5idWlsZF90aW1lID0gX19USU1FX187CisjZW5kaWYKKyAgaW5mby0+dGl0bGUgPSAiU0JSIEVuY29kZXIiOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvLT5mbGFncyA9IDAKKyAgICB8IENBUEZfU0JSX0hRCisgICAgfCBDQVBGX1NCUl9QU19NUEVHCisgICAgOworICAvKiBFbmQgb2YgZmxhZ3MgKi8KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmNwcCBiL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjczYjgxCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuY3BwCkBAIC0wLDAgKzEsMjcyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgU2JyIG1pc2NlbGxhbmVvdXMgaGVscGVyIGZ1bmN0aW9ucyAgCisqLworI2luY2x1ZGUgInNicl9taXNjLmgiCisKKwordm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0IChGSVhQX0RCTCAqaW4sIElOVCBuKQoreworICBGSVhQX0RCTCB2OworICBJTlQgaSwgajsKKyAgSU5UIGluYyA9IDE7CisKKyAgZG8KKyAgICBpbmMgPSAzICogaW5jICsgMTsKKyAgd2hpbGUgKGluYyA8PSBuKTsKKworICBkbyB7CisgICAgaW5jID0gaW5jIC8gMzsKKyAgICBmb3IgKGkgPSBpbmMgKyAxOyBpIDw9IG47IGkrKykgeworICAgICAgdiA9IGluW2ktMV07CisgICAgICBqID0gaTsKKyAgICAgIHdoaWxlIChpbltqLWluYy0xXSA+IHYpIHsKKyAgICAgICAgaW5bai0xXSA9IGluW2otaW5jLTFdOworICAgICAgICBqIC09IGluYzsKKyAgICAgICAgaWYgKGogPD0gaW5jKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaW5bai0xXSA9IHY7CisgICAgfQorICB9IHdoaWxlIChpbmMgPiAxKTsKKworfQorCisvKiBTb3J0aW5nIHJvdXRpbmUgKi8KK3ZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQgKElOVCAqaW4sIElOVCBuKQoreworCisgIElOVCBpLCBqLCB2OworICBJTlQgaW5jID0gMTsKKworICBkbworICAgIGluYyA9IDMgKiBpbmMgKyAxOworICB3aGlsZSAoaW5jIDw9IG4pOworCisgIGRvIHsKKyAgICBpbmMgPSBpbmMgLyAzOworICAgIGZvciAoaSA9IGluYyArIDE7IGkgPD0gbjsgaSsrKSB7CisgICAgICB2ID0gaW5baS0xXTsKKyAgICAgIGogPSBpOworICAgICAgd2hpbGUgKGluW2otaW5jLTFdID4gdikgeworICAgICAgICBpbltqLTFdID0gaW5bai1pbmMtMV07CisgICAgICAgIGogLT0gaW5jOworICAgICAgICBpZiAoaiA8PSBpbmMpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbltqLTFdID0gdjsKKyAgICB9CisgIH0gd2hpbGUgKGluYyA+IDEpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRWZWNMZWZ0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgSU5UKiBkc3QsIElOVCogbGVuZ3RoX2RzdCwgSU5UKiBzcmMsIElOVCBsZW5ndGhfc3JjCisKKyBSZXR1cm46ICAgICAgbm9uZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRkRLc2JyRW5jX0FkZFZlY0xlZnQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYykKK3sKKyAgSU5UIGk7CisKKyAgZm9yIChpID0gbGVuZ3RoX3NyYyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIEZES3NickVuY19BZGRMZWZ0IChkc3QsIGxlbmd0aF9kc3QsIHNyY1tpXSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfQWRkTGVmdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOiAgIElOVCogdmVjdG9yLCBJTlQqIGxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZQorCisgUmV0dXJuOiAgICAgIG5vbmUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19BZGRMZWZ0IChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpCit7CisgIElOVCBpOworCisgIGZvciAoaSA9ICpsZW5ndGhfdmVjdG9yOyBpID4gMDsgaS0tKQorICAgIHZlY3RvcltpXSA9IHZlY3RvcltpIC0gMV07CisgIHZlY3RvclswXSA9IHZhbHVlOworICAoKmxlbmd0aF92ZWN0b3IpKys7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfQWRkUmlnaHQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czogICBJTlQqIHZlY3RvciwgSU5UKiBsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUKKworIFJldHVybjogICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfQWRkUmlnaHQgKElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSkKK3sKKyAgdmVjdG9yWypsZW5ndGhfdmVjdG9yXSA9IHZhbHVlOworICAoKmxlbmd0aF92ZWN0b3IpKys7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRWZWNSaWdodAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOiAgIElOVCogZHN0LCBJTlQqIGxlbmd0aF9kc3QsIElOVCogc3JjLCBJTlQgbGVuZ3RoX3NyYykKKworIFJldHVybjogICAgICBub25lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfQWRkVmVjUmlnaHQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYykKK3sKKyAgSU5UIGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhfc3JjOyBpKyspCisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0IChkc3QsIGxlbmd0aF9kc3QsIHNyY1tpXSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdAorCisgIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBkaXZpc2lvbiB3aXRoIGJlc3QgcHJlY2lzaW9uIGFuZCBzY2FsZXMgdGhlIHJlc3VsdC4KKworICByZXR1cm46ICAgICAgIG51bSpzY2FsZS9kZW5vbQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZJWFBfREJMIEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIEZJWFBfREJMIHNjYWxlKQoreworICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgaWYgKG51bSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworCisgICAgSU5UIHNoaWZ0Q29tbW9uOworICAgIElOVCBzaGlmdE51bSAgID0gQ291bnRMZWFkaW5nQml0cyhudW0pOworICAgIElOVCBzaGlmdERlbm9tID0gQ291bnRMZWFkaW5nQml0cyhkZW5vbSk7CisgICAgSU5UIHNoaWZ0U2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKHNjYWxlKTsKKworICAgIG51bSAgID0gbnVtICAgPDwgc2hpZnROdW07CisgICAgc2NhbGUgPSBzY2FsZSA8PCBzaGlmdFNjYWxlOworCisgICAgdG1wID0gZk11bHREaXYyKG51bSxzY2FsZSk7CisKKyAgICBpZiAoIGRlbm9tID4gKHRtcCA+PiBmaXhNaW4oc2hpZnROdW0rc2hpZnRTY2FsZS0xLChERlJBQ1RfQklUUy0xKSkpICkgeworICAgICAgZGVub20gPSBkZW5vbSA8PCBzaGlmdERlbm9tOworICAgICAgdG1wID0gc2NodXJfZGl2KHRtcCxkZW5vbSwxNSk7CisgICAgICBzaGlmdENvbW1vbiA9IGZpeE1pbigoc2hpZnROdW0tc2hpZnREZW5vbStzaGlmdFNjYWxlLTEpLChERlJBQ1RfQklUUy0xKSk7CisgICAgICBpZiAoc2hpZnRDb21tb24gPCAwKQorICAgICAgICB0bXAgPDw9IC1zaGlmdENvbW1vbjsKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wID4+PSAgc2hpZnRDb21tb247CisgICAgfQorICAgIGVsc2UgeworICAgICAgdG1wID0gLypGTDJGWENPTlNUX0RCTCgxLjApKi8gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgfQorICB9CisKKyAgcmV0dXJuICh0bXApOworfQorCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5oIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcxOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuaApAQCAtMCwwICsxLDEwNiBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFNiciBtaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgcHJvdG90eXBlcyAgCisgIFxhdXRob3IKKyovCisKKyNpZm5kZWYgX1NCUl9NSVNDX0gKKyNkZWZpbmUgX1NCUl9NSVNDX0gKKworI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisKKy8qIFNvcnRpbmcgcm91dGluZXMgKi8KK3ZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdCAoRklYUF9EQkwgKmluLCBJTlQgbik7Cit2b2lkIEZES3NickVuY19TaGVsbHNvcnRfaW50ICAgKElOVCAqaW4sIElOVCBuKTsKKwordm9pZCBGREtzYnJFbmNfQWRkTGVmdCAoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKTsKK3ZvaWQgRkRLc2JyRW5jX0FkZFJpZ2h0IChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpOwordm9pZCBGREtzYnJFbmNfQWRkVmVjTGVmdCAoSU5UICpkc3QsIElOVCAqbGVuZ3RoX2RzdCwgSU5UICpzcmMsIElOVCBsZW5ndGhfc3JjKTsKK3ZvaWQgRkRLc2JyRW5jX0FkZFZlY1JpZ2h0IChJTlQgKmRzdCwgSU5UICpsZW5ndGhfdmVjdG9yX2RzdCwgSU5UICpzcmMsIElOVCBsZW5ndGhfc3JjKTsKKworRklYUF9EQkwgRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgRklYUF9EQkwgc2NhbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9yYW0uY3BwIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2YzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9yYW0uY3BwCkBAIC0wLDAgKzEsMjIyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiBNZW1vcnkgbGF5b3V0CisgICAKKworICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBhbGwgc3RhdGljIGFuZCBkeW5hbWljIG1lbW9yeSBzcGFjZXMKKyovCisjaW5jbHVkZSAic2JyX3JhbS5oIgorCisjaW5jbHVkZSAic2JyLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworQ19BTExPQ19NRU0gKFJhbV9TYnJEeW5hbWljX1JBTSwgRklYUF9EQkwsICgoU0JSX0VOQ19EWU5fUkFNX1NJWkUpL3NpemVvZihGSVhQX0RCTCkpKQorCisvKiEKKyAgXG5hbWUgU3RhdGljU2JyRGF0YQorCisgIFN0YXRpYyBtZW1vcnkgYXJlYXMsIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIGluIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBlbmNvZGVyCisqLworLyogQHsgKi8KKworLyohIHN0YXRpYyBzYnIgZW5jb2RlciBpbnN0YW5jZSBmb3Igb25lIGVuY29kZXIgKDIgY2hhbm5lbHMpCisgIGFsbCBtYWpvciBzdGF0aWMgYW5kIGR5bmFtaWMgbWVtb3J5IGFyZWFzIGFyZSBsb2NhdGVkCisgIGluIG1vZHVsZSBzYnJfcmFtIGFuZCBzYnIgcm9tCisqLworQ19BTExPQ19NRU0gKFJhbV9TYnJFbmNvZGVyLCBTQlJfRU5DT0RFUiwgMSkKK0NfQUxMT0NfTUVNMihSYW1fU2JyQ2hhbm5lbCwgU0JSX0NIQU5ORUwsIDEsICg4KSkKK0NfQUxMT0NfTUVNMihSYW1fU2JyRWxlbWVudCwgU0JSX0VMRU1FTlQsIDEsICg4KSkKKworLyohIEZpbHRlciBzdGF0ZXMgZm9yIFFNRi1hbmFseXNpcy4gPGJyPgorICBEaW1lbnNpb246ICNNQVhOUlNCUkNIQU5ORUxTICogI1NCUl9RTUZfRklMVEVSX0xFTkdUSAorKi8KK0NfQUFMTE9DX01FTTJfTCAoUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcywgRklYUF9RQVMsIFFNRl9GSUxURVJfTEVOR1RILCAoOCksIFNFQ1RfREFUQV9MMSkKKworCisvKiEgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBmb3IgYWxsIGVzdGltYXRlcywgYWxsIGNoYW5uZWxzCisgIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9DSEFOTkVMUyogI01BWF9OT19PRl9FU1RJTUFURVMKKyovCitDX0FMTE9DX01FTTJfTCAoUmFtX1Nicl9xdW90YU1hdHJpeCwgRklYUF9EQkwsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKlFNRl9DSEFOTkVMUyksICg4KSwgU0VDVF9EQVRBX0wxKQorCisvKiEgTWF0cml4IGhvbGRpbmcgdGhlIHNpZ24gdmFsdWVzIGZvciBhbGwgZXN0aW1hdGVzLCBhbGwgY2hhbm5lbHMKKyAgRGltZW5zaW9uICNNQVhOUlNCUkNIQU5ORUxTICogKyNTQlJfUU1GX0NIQU5ORUxTKiAjTUFYX05PX09GX0VTVElNQVRFUworKi8KK0NfQUxMT0NfTUVNMiAoUmFtX1Nicl9zaWduTWF0cml4LCBJTlQsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKlFNRl9DSEFOTkVMUyksICg4KSkKKworLyohIEZyZXF1ZW5jeSBiYW5kIHRhYmxlIChsb3cgcmVzKSA8YnI+CisgIERpbWVuc2lvbiAjTUFYX0ZSRVFfQ09FRkZTLzIrMQorKi8KK0NfQUxMT0NfTUVNMiAoUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8sIFVDSEFSLCAoTUFYX0ZSRVFfQ09FRkZTLzIrMSksICg4KSkKKworLyohIEZyZXF1ZW5jeSBiYW5kIHRhYmxlIChoaWdoIHJlcykgPGJyPgorICBEaW1lbnNpb24gI01BWF9GUkVRX0NPRUZGUyArMQorKi8KK0NfQUxMT0NfTUVNMiAoUmFtX1Nicl9mcmVxQmFuZFRhYmxlSEksIFVDSEFSLCAoTUFYX0ZSRVFfQ09FRkZTKzEpLCAoOCkpCisKKy8qISB2ayBtYXRzZXIgdGFibGUgPGJyPgorICBEaW1lbnNpb24gI01BWF9GUkVRX0NPRUZGUyArMQorKi8KK0NfQUxMT0NfTUVNMiAoUmFtX1Nicl92X2tfbWFzdGVyLCBVQ0hBUiwgKE1BWF9GUkVRX0NPRUZGUysxKSwgKDgpKQorCisKKy8qCisgIE1pc3NpbmcgaGFybW9uaWNzIGRldGVjdGlvbgorKi8KKworLyohIHNicl9kZXRlY3Rpb25WZWN0b3JzIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfTk9fT0ZfRVNUSU1BVEVTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yIChSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMsIFVDSEFSLCAoTUFYX05PX09GX0VTVElNQVRFUypNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCisKKy8qISBzYnJfcHJldkNvbXBWZWNbIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yIChSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwgVUNIQVIsIE1BWF9GUkVRX0NPRUZGUywgKDgpKQorLyohIHNicl9ndWlkZVNjZmJbIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yIChSYW1fU2JyX2d1aWRlU2NmYiwgVUNIQVIsIE1BWF9GUkVRX0NPRUZGUywgKDgpKQorCisvKiEgc2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQgPGJyPgorICBEaW1lbnNpb24gI01BWF9OVU1fQ0hBTk5FTFMqI01BWF9OT19PRl9FU1RJTUFURVMqI01BWF9GUkVRX0NPRUZGU10KKyovCitDX0FMTE9DX01FTTIgKFJhbV9TYnJfZ3VpZGVWZWN0b3JEZXRlY3RlZCwgVUNIQVIsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKk1BWF9GUkVRX0NPRUZGUyksICg4KSkKK0NfQUxMT0NfTUVNMiAoUmFtX1Nicl9ndWlkZVZlY3RvckRpZmYsIEZJWFBfREJMLCAoTUFYX05PX09GX0VTVElNQVRFUypNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCitDX0FMTE9DX01FTTIgKFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnLCBGSVhQX0RCTCwgKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQorCisvKgorICBTdGF0aWMgUGFyYW1ldHJpYyBTdGVyZW8gbWVtb3J5CisqLworQ19BQUxMT0NfTUVNX0woUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX0RCTCwgUU1GX0ZJTFRFUl9MRU5HVEgvMiwgU0VDVF9EQVRBX0wxKQorCitDX0FMTE9DX01FTV9MIChSYW1fUHNFbmNvZGUsICAgIFBTX0VOQ09ERSwgMSwgU0VDVF9EQVRBX0wxKQorQ19BTExPQ19NRU0gICAoUmFtX1BhcmFtU3RlcmVvLCBQQVJBTUVUUklDX1NURVJFTywgMSkKKworCisKKy8qIEB9ICovCisKKworLyohCisgIFxuYW1lIER5bmFtaWNTYnJEYXRhCisKKyAgRHluYW1pYyBtZW1vcnkgYXJlYXMsIG1pZ2h0IGJlIHJldXNlZCBpbiBvdGhlciBhbGdvcml0aG0gc2VjdGlvbnMsCisgIGUuZy4gdGhlIGNvcmUgZW5jb2Rlci4KKyovCisvKiBAeyAqLworCisgIC8qISBFbmVyZ3kgYnVmZmVyIGZvciBlbnZlbG9wZSBleHRyYWN0aW9uIDxicj4KKyAgICBEaW1lbnNpb24gI01BWE5SU0JSQ0hBTk5FTFMgKiArI1NCUl9RTUZfU0xPVFMgKiAgI1NCUl9RTUZfQ0hBTk5FTFMKKyAgKi8KKyAgQ19BTExPQ19NRU0yIChSYW1fU2JyX2VudllCdWZmZXIsIEZJWFBfREJMLCAoUU1GX01BWF9USU1FX1NMT1RTLzIgKiBRTUZfQ0hBTk5FTFMpLCAoOCkpCisKKyAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52WUJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgeworICAgIEZES19BU1NFUlQoZHluYW1pY19SQU0hPTApOworICAgIHJldHVybiAoKEZJWFBfREJMKikgKGR5bmFtaWNfUkFNICsgT0ZGU0VUX05SRyArIChuKllfMl9CVUZfQllURSkgKSk7CisgIH0KKworICAvKgorICAgKiBRTUYgZGF0YQorICAgKi8KKyAgLyogVGhlIFNCUiBlbmNvZGVyIHVzZXMgYSBzaW5nbGUgY2hhbm5lbCBvdmVybGFwcGluZyBidWZmZXIgc2V0IChhbHdheXMgbj0wKSwgYnV0IFBTIGRvZXMgbm90LiAqLworICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZSQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7CisgICAgcmV0dXJuICgoRklYUF9EQkwqKSAoZHluYW1pY19SQU0gKyBPRkZTRVRfUU1GICsgKG4qKEVOVl9SX0JVRkZfQllURStFTlZfSV9CVUZGX0JZVEUpKSApKTsKKyAgfQorICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZJQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7CisgICAgcmV0dXJuICgoRklYUF9EQkwqKSAoZHluYW1pY19SQU0gKyBPRkZTRVRfUU1GICsgKEVOVl9SX0JVRkZfQllURSkgKyAobiooRU5WX1JfQlVGRl9CWVRFK0VOVl9JX0JVRkZfQllURSkpKSk7CisgIH0KKworCisKKworLyogQH0gKi8KKworCisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmggYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZDBjOAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9yYW0uaApAQCAtMCwwICsxLDE4NyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorXGZpbGUKK1xicmllZiBNZW1vcnkgbGF5b3V0CisgCisqLworI2lmbmRlZiBfX1NCUl9SQU1fSAorI2RlZmluZSBfX1NCUl9SQU1fSAorCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgImVudl9lc3QuaCIKKyNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgorI2luY2x1ZGUgInNici5oIgorCisKKworI2luY2x1ZGUgInBzX21haW4uaCIKKyNpbmNsdWRlICJwc19lbmNvZGUuaCIKKworCisjZGVmaW5lIEVOVl9UUkFOU0lFTlRTX0JZVEUgICggKHNpemVvZihGSVhQX0RCTCkqKE1BWF9OVU1fQ0hBTk5FTFMqMypRTUZfTUFYX1RJTUVfU0xPVFMpKSApCisKKyAgI2RlZmluZSBFTlZfUl9CVUZGX0JZVEUgICAgICAoIChzaXplb2YoRklYUF9EQkwpKigoUU1GX01BWF9USU1FX1NMT1RTKSAqIE1BWF9IWUJSSURfQkFORFMpKSApCisgICNkZWZpbmUgRU5WX0lfQlVGRl9CWVRFICAgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSooKFFNRl9NQVhfVElNRV9TTE9UUykgKiBNQVhfSFlCUklEX0JBTkRTKSkgKQorICAjZGVmaW5lIFlfQlVGX0NIX0JZVEUgICAgICAgICggKDIqc2l6ZW9mKEZJWFBfREJMKSooKFFNRl9NQVhfVElNRV9TTE9UUykgKiBNQVhfSFlCUklEX0JBTkRTKSkgKQorCisKKyNkZWZpbmUgRU5WX1JfQlVGX1BTX0JZVEUgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSpRTUZfTUFYX1RJTUVfU0xPVFMgKiBRTUZfQ0hBTk5FTFMgLyAyKSApCisjZGVmaW5lIEVOVl9JX0JVRl9QU19CWVRFICAgICggKHNpemVvZihGSVhQX0RCTCkqUU1GX01BWF9USU1FX1NMT1RTICogUU1GX0NIQU5ORUxTIC8gMikgKQorCisjZGVmaW5lIFRPTl9CVUZfQ0hfQllURSAgICAgICggKHNpemVvZihGSVhQX0RCTCkqKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSkgKQorCisjZGVmaW5lIFlfMl9CVUZfQllURSAgICAgICAgICggWV9CVUZfQ0hfQllURT4+MSApCisKKworLyogV29ya2J1ZmZlciBSQU0gLSBBbGxvY2F0aW9uICovCisvKgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgICAgICBPRkZTRVRfUU1GICAgICAgIHwgICAgICAgIE9GRlNFVF9OUkcgICAgICB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAwLjUgKiAgICAgICAgICB8CisgfCAgICAgc2JyX2VudlJCdWZmZXIgICAgICB8IHNicl9lbnZZQnVmZmVyX3NpemUgICAgfAorIHwgICAgIHNicl9lbnZJQnVmZmVyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisgICNkZWZpbmUgQlVGX05SR19TSVpFICAgKCAoTUFYX05VTV9DSEFOTkVMUyAqIFlfMl9CVUZfQllURSkgKQorICAjZGVmaW5lIEJVRl9RTUZfU0laRSAgKEVOVl9SX0JVRkZfQllURSArIEVOVl9JX0JVRkZfQllURSkKKworICAvKiBTaXplIG9mIHRoZSBzaGFyZWFibGUgbWVtb3J5IHJlZ2lvbiB0aGFuIGNhbiBiZSByZXVzZWQgKi8KKyAgI2RlZmluZSBTQlJfRU5DX0RZTl9SQU1fU0laRSAgKCBCVUZfUU1GX1NJWkUgKyBCVUZfTlJHX1NJWkUgKQorCisgICNkZWZpbmUgT0ZGU0VUX1FNRiAgICAgICAgICggMCApCisgICNkZWZpbmUgT0ZGU0VUX05SRyAgICAgICAgICggT0ZGU0VUX1FNRiArIEJVRl9RTUZfU0laRSApCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyAgSF9BTExPQ19NRU0oUmFtX1NickR5bmFtaWNfUkFNLCBGSVhQX0RCTCkKKworICBIX0FMTE9DX01FTShSYW1fU2JyRW5jb2RlciwgU0JSX0VOQ09ERVIpCisgIEhfQUxMT0NfTUVNKFJhbV9TYnJDaGFubmVsLCBTQlJfQ0hBTk5FTCkKKyAgSF9BTExPQ19NRU0oUmFtX1NickVsZW1lbnQsIFNCUl9FTEVNRU5UKQorCisgIEhfQUxMT0NfTUVNKFJhbV9TYnJfcXVvdGFNYXRyaXgsIEZJWFBfREJMKQorICBIX0FMTE9DX01FTShSYW1fU2JyX3NpZ25NYXRyaXgsIElOVCkKKworICBIX0FMTE9DX01FTShSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzLCBGSVhQX1FBUykKKworICBIX0FMTE9DX01FTShSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTywgVUNIQVIpCisgIEhfQUxMT0NfTUVNKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJLCBVQ0hBUikKKyAgSF9BTExPQ19NRU0oUmFtX1Nicl92X2tfbWFzdGVyLCBVQ0hBUikKKworICBIX0FMTE9DX01FTShSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMsIFVDSEFSKQorICBIX0FMTE9DX01FTShSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwgVUNIQVIpCisgIEhfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVTY2ZiLCBVQ0hBUikKKyAgSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkLCBVQ0hBUikKKworICAvKiBEeW5hbWljIE1lbW9yeSBBbGxvY2F0aW9uICovCisKKyAgSF9BTExPQ19NRU0oUmFtX1Nicl9lbnZZQnVmZmVyLCBGSVhQX0RCTCkKKyAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52WUJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CisgIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudlJCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOworICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZJQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKTsKKworICBIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZiwgRklYUF9EQkwpCisgIEhfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnLCBGSVhQX0RCTCkKKworCisgIEhfQUxMT0NfTUVNKFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9EQkwpCisKKyAgSF9BTExPQ19NRU0oUmFtX1BzRW5jb2RlLCBQU19FTkNPREUpCisKKyAgRklYUF9EQkwqIEZES3NickVuY19TbGljZVJhbV9Qc1JxbWYgKEZJWFBfREJMKiByUW1mRGF0YSwgVUNIQVIqIGR5bmFtaWNfUkFNLCBpbnQgbiwgaW50IGksIGludCBxbWZTbG90cyk7CisgIEZJWFBfREJMKiBGREtzYnJFbmNfU2xpY2VSYW1fUHNJcW1mIChGSVhQX0RCTCogaVFtZkRhdGEsIFVDSEFSKiBkeW5hbWljX1JBTSwgaW50IG4sIGludCBpLCBpbnQgcW1mU2xvdHMpOworCisgIEhfQUxMT0NfTUVNKFJhbV9QYXJhbVN0ZXJlbywgUEFSQU1FVFJJQ19TVEVSRU8pCisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI2NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5jcHAKQEAgLTAsMCArMSw3OTIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBEZWZpbml0aW9uIG9mIGNvbnN0YW50IHRhYmxlcworICAgCisKKyAgVGhpcyBtb2R1bGUgY29udGFpbnMgbW9zdCBvZiB0aGUgY29uc3RhbnQgZGF0YSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gUk9NLgorKi8KKworI2luY2x1ZGUgInNicl9yb20uaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisvL0B7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBUYWJsZSBPdmVydmlldzoKKworIG8gZW52ZWxvcGUgbGV2ZWwsICAgMS41IGRCOgorICAgIDFhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUWzEyMV0KKyAgICAxYikgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVFsxMjFdCisgICAgMmEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXQorICAgIDJiKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGWzEyMV0KKworIG8gZW52ZWxvcGUgYmFsYW5jZSwgMS41IGRCOgorICAgIDNhKSAgYm9va1NickVudkJhbGFuY2VDMTBUWzQ5XQorICAgIDNiKSAgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XQorICAgIDRhKSAgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XQorICAgIDRiKSAgYm9va1NickVudkJhbGFuY2VMMTBGWzQ5XQorCisgbyBlbnZlbG9wZSBsZXZlbCwgICAzLjAgZEI6CisgICAgNWEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVRbNjNdCisgICAgNWIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVRbNjNdCisgICAgNmEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdCisgICAgNmIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdCisKKyBvIGVudmVsb3BlIGJhbGFuY2UsIDMuMCBkQjoKKyAgICA3YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzExVFsyNV0KKyAgICA3YikgIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV0KKyAgICA4YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV0KKyAgICA4YikgIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0KKworIG8gbm9pc2UgbGV2ZWwsICAgICAgMy4wIGRCOgorICAgIDlhKSAgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXQorICAgIDliKSAgdl9IdWZmX05vaXNlTGV2ZWxMMTFUWzYzXQorICAgIC0gKSAodl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXSBpcyB1c2VkIGZvciBmcmVxIGRpcikKKyAgICAtICkgKHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRls2M10gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCisKKyBvIG5vaXNlIGJhbGFuY2UsICAgIDMuMCBkQjoKKyAgIDEwYSkgIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XQorICAgMTBiKSAgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdCisgICAgLSApIChib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQorICAgIC0gKSAoYm9va1NickVudkJhbGFuY2VMMTFGWzI1XSBpcyB1c2VkIGZvciBmcmVxIGRpcikKKworCisgICgxLjUgZEIgaXMgbmV2ZXIgdXNlZCBmb3Igbm9pc2UpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMS41IGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGVvciByYW5nZSA6IFstNTgsNThdLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gNTggICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGltcGxlbSByYW5nZTogWy02MCw2MF0sIENPREVfQk9PS19TQ0ZfTEFWMTAgPSA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBUX2NGLm1hdC92X25DaGV4X2NGCisgICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFRbMTIxXSA9Cit7CisgIDB4MDAwM0ZGRDYsIDB4MDAwM0ZGRDcsIDB4MDAwM0ZGRDgsIDB4MDAwM0ZGRDksIDB4MDAwM0ZGREEsIDB4MDAwM0ZGREIsIDB4MDAwN0ZGQjgsIDB4MDAwN0ZGQjksCisgIDB4MDAwN0ZGQkEsIDB4MDAwN0ZGQkIsIDB4MDAwN0ZGQkMsIDB4MDAwN0ZGQkQsIDB4MDAwN0ZGQkUsIDB4MDAwN0ZGQkYsIDB4MDAwN0ZGQzAsIDB4MDAwN0ZGQzEsCisgIDB4MDAwN0ZGQzIsIDB4MDAwN0ZGQzMsIDB4MDAwN0ZGQzQsIDB4MDAwN0ZGQzUsIDB4MDAwN0ZGQzYsIDB4MDAwN0ZGQzcsIDB4MDAwN0ZGQzgsIDB4MDAwN0ZGQzksCisgIDB4MDAwN0ZGQ0EsIDB4MDAwN0ZGQ0IsIDB4MDAwN0ZGQ0MsIDB4MDAwN0ZGQ0QsIDB4MDAwN0ZGQ0UsIDB4MDAwN0ZGQ0YsIDB4MDAwN0ZGRDAsIDB4MDAwN0ZGRDEsCisgIDB4MDAwN0ZGRDIsIDB4MDAwN0ZGRDMsIDB4MDAwMUZGRTYsIDB4MDAwM0ZGRDQsIDB4MDAwMEZGRjAsIDB4MDAwMUZGRTksIDB4MDAwM0ZGRDUsIDB4MDAwMUZGRTcsCisgIDB4MDAwMEZGRjEsIDB4MDAwMEZGRUMsIDB4MDAwMEZGRUQsIDB4MDAwMEZGRUUsIDB4MDAwMDdGRjQsIDB4MDAwMDNGRjksIDB4MDAwMDNGRjcsIDB4MDAwMDFGRkEsCisgIDB4MDAwMDFGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDA3RkMsIDB4MDAwMDAzRkMsIDB4MDAwMDAxRkQsIDB4MDAwMDAwRkQsIDB4MDAwMDAwN0QsIDB4MDAwMDAwM0QsCisgIDB4MDAwMDAwMUQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMEMsIDB4MDAwMDAwMUMsCisgIDB4MDAwMDAwM0MsIDB4MDAwMDAwN0MsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsIDB4MDAwMDAzRkQsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjgsIDB4MDAwMDNGRjYsCisgIDB4MDAwMDNGRjgsIDB4MDAwMDdGRjUsIDB4MDAwMEZGRUYsIDB4MDAwMUZGRTgsIDB4MDAwMEZGRjIsIDB4MDAwN0ZGRDQsIDB4MDAwN0ZGRDUsIDB4MDAwN0ZGRDYsCisgIDB4MDAwN0ZGRDcsIDB4MDAwN0ZGRDgsIDB4MDAwN0ZGRDksIDB4MDAwN0ZGREEsIDB4MDAwN0ZGREIsIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsIDB4MDAwN0ZGREUsCisgIDB4MDAwN0ZGREYsIDB4MDAwN0ZGRTAsIDB4MDAwN0ZGRTEsIDB4MDAwN0ZGRTIsIDB4MDAwN0ZGRTMsIDB4MDAwN0ZGRTQsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsCisgIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwN0ZGRTksIDB4MDAwN0ZGRUEsIDB4MDAwN0ZGRUIsIDB4MDAwN0ZGRUMsIDB4MDAwN0ZGRUQsIDB4MDAwN0ZGRUUsCisgIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjAsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwN0ZGRjQsIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRjYsCisgIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjgsIDB4MDAwN0ZGRjksIDB4MDAwN0ZGRkEsIDB4MDAwN0ZGRkIsIDB4MDAwN0ZGRkMsIDB4MDAwN0ZGRkQsIDB4MDAwN0ZGRkUsCisgIDB4MDAwN0ZGRkYKK307CisKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwVF9jRi5tYXQvdl9uTGhleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXSA9Cit7CisgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgIDB4MTMsIDB4MTMsIDB4MTEsIDB4MTIsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEUsIDB4MEUsIDB4MEQsCisgIDB4MEQsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisgIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTAsIDB4MTMsIDB4MTMsIDB4MTMsCisgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBGX2NGLm1hdC92X25DaGV4X2NGCisgICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXSA9Cit7CisgIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwRkZGRDIsIDB4MDAwRkZGRDMsIDB4MDAwRkZGRDQsIDB4MDAwRkZGRDUsIDB4MDAwRkZGRDYsIDB4MDAwRkZGRDcsCisgIDB4MDAwRkZGRDgsIDB4MDAwN0ZGREEsIDB4MDAwRkZGRDksIDB4MDAwRkZGREEsIDB4MDAwRkZGREIsIDB4MDAwRkZGREMsIDB4MDAwN0ZGREIsIDB4MDAwRkZGREQsCisgIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsIDB4MDAwRkZGREUsIDB4MDAwM0ZGRTQsIDB4MDAwRkZGREYsIDB4MDAwRkZGRTAsIDB4MDAwRkZGRTEsIDB4MDAwN0ZGREUsCisgIDB4MDAwRkZGRTIsIDB4MDAwRkZGRTMsIDB4MDAwRkZGRTQsIDB4MDAwN0ZGREYsIDB4MDAwRkZGRTUsIDB4MDAwN0ZGRTAsIDB4MDAwM0ZGRTgsIDB4MDAwN0ZGRTEsCisgIDB4MDAwM0ZGRTAsIDB4MDAwM0ZGRTksIDB4MDAwMUZGRUYsIDB4MDAwM0ZGRTUsIDB4MDAwMUZGRUMsIDB4MDAwMUZGRUQsIDB4MDAwMUZGRUUsIDB4MDAwMEZGRjQsCisgIDB4MDAwMEZGRjMsIDB4MDAwMEZGRjAsIDB4MDAwMDdGRjcsIDB4MDAwMDdGRjYsIDB4MDAwMDNGRkEsIDB4MDAwMDFGRkEsIDB4MDAwMDFGRjksIDB4MDAwMDBGRkEsCisgIDB4MDAwMDBGRjgsIDB4MDAwMDA3RjksIDB4MDAwMDAzRkIsIDB4MDAwMDAxRkMsIDB4MDAwMDAxRkEsIDB4MDAwMDAwRkIsIDB4MDAwMDAwN0MsIDB4MDAwMDAwM0MsCisgIDB4MDAwMDAwMUMsIDB4MDAwMDAwMEMsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMUQsCisgIDB4MDAwMDAwM0QsIDB4MDAwMDAwRkEsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkIsIDB4MDAwMDAzRkEsIDB4MDAwMDA3RjgsIDB4MDAwMDA3RkEsIDB4MDAwMDA3RkIsCisgIDB4MDAwMDBGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksIDB4MDAwMEZGRjEsIDB4MDAwMEZGRjIsCisgIDB4MDAwMUZGRUEsIDB4MDAwMUZGRUIsIDB4MDAwM0ZGRTEsIDB4MDAwM0ZGRTIsIDB4MDAwM0ZGRUEsIDB4MDAwM0ZGRTMsIDB4MDAwM0ZGRTYsIDB4MDAwM0ZGRTcsCisgIDB4MDAwM0ZGRUIsIDB4MDAwRkZGRTYsIDB4MDAwN0ZGRTIsIDB4MDAwRkZGRTcsIDB4MDAwRkZGRTgsIDB4MDAwRkZGRTksIDB4MDAwRkZGRUEsIDB4MDAwRkZGRUIsCisgIDB4MDAwRkZGRUMsIDB4MDAwN0ZGRTMsIDB4MDAwRkZGRUQsIDB4MDAwRkZGRUUsIDB4MDAwRkZGRUYsIDB4MDAwRkZGRjAsIDB4MDAwN0ZGRTQsIDB4MDAwRkZGRjEsCisgIDB4MDAwM0ZGRUMsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsIDB4MDAwRkZGRjYsCisgIDB4MDAwRkZGRjcsIDB4MDAwRkZGRjgsIDB4MDAwRkZGRjksIDB4MDAwRkZGRkEsIDB4MDAwRkZGRkIsIDB4MDAwRkZGRkMsIDB4MDAwRkZGRkQsIDB4MDAwRkZGRkUsCisgIDB4MDAwRkZGRkYKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwRl9jRi5tYXQvdl9uTGhleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXSA9Cit7CisgIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsCisgIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTMsCisgIDB4MTIsIDB4MTIsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEYsIDB4MEUsIDB4MEQsIDB4MEQsIDB4MEMsCisgIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisgIDB4MDYsIDB4MDgsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEIsIDB4MEIsIDB4MEMsIDB4MEMsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MTAsIDB4MTAsCisgIDB4MTEsIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisgIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsCisgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IGVudmVsb3BlIGJhbGFuY2UsIDEuNSBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy00OCw0OF0sIENPREVfQk9PS19TQ0ZfTEFWID0gNDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaW1wbGVtIHJhbmdlOiBzYW1lIGJ1dCBtYXBwZWQgdG8gWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMCA9IDI0ICovCisvKiByYXcgc3RhdHMgICA6IGVudmVsb3BlUGFuXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMFQubWF0L3ZfbkJoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV0gPQoreworICAweDAwMDBGRkU0LCAweDAwMDBGRkU1LCAweDAwMDBGRkU2LCAweDAwMDBGRkU3LCAweDAwMDBGRkU4LCAweDAwMDBGRkU5LCAweDAwMDBGRkVBLCAweDAwMDBGRkVCLAorICAweDAwMDBGRkVDLCAweDAwMDBGRkVELCAweDAwMDBGRkVFLCAweDAwMDBGRkVGLCAweDAwMDBGRkYwLCAweDAwMDBGRkYxLCAweDAwMDBGRkYyLCAweDAwMDBGRkYzLAorICAweDAwMDBGRkY0LCAweDAwMDBGRkUyLCAweDAwMDAwRkZDLCAweDAwMDAwN0ZDLCAweDAwMDAwMUZFLCAweDAwMDAwMDdFLCAweDAwMDAwMDFFLCAweDAwMDAwMDA2LAorICAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDBFLCAweDAwMDAwMDNFLCAweDAwMDAwMEZFLCAweDAwMDAwN0ZELCAweDAwMDAwRkZELCAweDAwMDA3RkYwLAorICAweDAwMDBGRkUzLCAweDAwMDBGRkY1LCAweDAwMDBGRkY2LCAweDAwMDBGRkY3LCAweDAwMDBGRkY4LCAweDAwMDBGRkY5LCAweDAwMDBGRkZBLCAweDAwMDFGRkY2LAorICAweDAwMDFGRkY3LCAweDAwMDFGRkY4LCAweDAwMDFGRkY5LCAweDAwMDFGRkZBLCAweDAwMDFGRkZCLCAweDAwMDFGRkZDLCAweDAwMDFGRkZELCAweDAwMDFGRkZFLAorICAweDAwMDFGRkZGCit9OworCisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMFQubWF0L3ZfbkxoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XSA9Cit7CisgIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisgIDB4MTAsIDB4MTAsIDB4MEMsIDB4MEIsIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEIsIDB4MEMsIDB4MEYsCisgIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsCisgIDB4MTEKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBGLm1hdC92X25CaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldID0KK3sKKyAgMHgwMDAzRkZFMiwgMHgwMDAzRkZFMywgMHgwMDAzRkZFNCwgMHgwMDAzRkZFNSwgMHgwMDAzRkZFNiwgMHgwMDAzRkZFNywgMHgwMDAzRkZFOCwgMHgwMDAzRkZFOSwKKyAgMHgwMDAzRkZFQSwgMHgwMDAzRkZFQiwgMHgwMDAzRkZFQywgMHgwMDAzRkZFRCwgMHgwMDAzRkZFRSwgMHgwMDAzRkZFRiwgMHgwMDAzRkZGMCwgMHgwMDAwRkZGNywKKyAgMHgwMDAxRkZGMCwgMHgwMDAwM0ZGQywgMHgwMDAwMDdGRSwgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwMiwKKyAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDFGRSwgMHgwMDAwMDdGRCwgMHgwMDAwMEZGRSwgMHgwMDAwN0ZGQSwKKyAgMHgwMDAwRkZGNiwgMHgwMDAzRkZGMSwgMHgwMDAzRkZGMiwgMHgwMDAzRkZGMywgMHgwMDAzRkZGNCwgMHgwMDAzRkZGNSwgMHgwMDAzRkZGNiwgMHgwMDAzRkZGNywKKyAgMHgwMDAzRkZGOCwgMHgwMDAzRkZGOSwgMHgwMDAzRkZGQSwgMHgwMDAzRkZGQiwgMHgwMDAzRkZGQywgMHgwMDAzRkZGRCwgMHgwMDAzRkZGRSwgMHgwMDA3RkZGRSwKKyAgMHgwMDA3RkZGRgorfTsKKworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBGLm1hdC92X25MaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV0gPQoreworICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEwLAorICAweDExLCAweDBFLCAweDBCLCAweDBCLCAweDA4LCAweDA3LCAweDA0LCAweDAyLCAweDAxLCAweDAzLCAweDA1LCAweDA2LCAweDA5LCAweDBCLCAweDBDLCAweDBGLAorICAweDEwLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEzLAorICAweDEzCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMy4wIGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGVvciByYW5nZSA6IFstMjksMjldLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGltcGxlbSByYW5nZTogWy0zMSwzMV0sIENPREVfQk9PS19TQ0ZfTEFWMTEgPSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzExICBLSyAwMC0wMi0wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQorICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLworCitjb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUWzYzXSA9IHsKKyAgMHgwMDAzRkZFRCwgMHgwMDAzRkZFRSwgMHgwMDA3RkZERSwgMHgwMDA3RkZERiwgMHgwMDA3RkZFMCwgMHgwMDA3RkZFMSwgMHgwMDA3RkZFMiwgMHgwMDA3RkZFMywKKyAgMHgwMDA3RkZFNCwgMHgwMDA3RkZFNSwgMHgwMDA3RkZFNiwgMHgwMDA3RkZFNywgMHgwMDA3RkZFOCwgMHgwMDA3RkZFOSwgMHgwMDA3RkZFQSwgMHgwMDA3RkZFQiwKKyAgMHgwMDA3RkZFQywgMHgwMDAxRkZGNCwgMHgwMDAwRkZGNywgMHgwMDAwRkZGOSwgMHgwMDAwRkZGOCwgMHgwMDAwM0ZGQiwgMHgwMDAwM0ZGQSwgMHgwMDAwM0ZGOCwKKyAgMHgwMDAwMUZGQSwgMHgwMDAwMEZGQywgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCwKKyAgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDFGRSwgMHgwMDAwMDdGRCwgMHgwMDAwMUZGQiwgMHgwMDAwM0ZGOSwgMHgwMDAwM0ZGQywKKyAgMHgwMDAwN0ZGQSwgMHgwMDAwRkZGNiwgMHgwMDAxRkZGNSwgMHgwMDAzRkZFQywgMHgwMDA3RkZFRCwgMHgwMDA3RkZFRSwgMHgwMDA3RkZFRiwgMHgwMDA3RkZGMCwKKyAgMHgwMDA3RkZGMSwgMHgwMDA3RkZGMiwgMHgwMDA3RkZGMywgMHgwMDA3RkZGNCwgMHgwMDA3RkZGNSwgMHgwMDA3RkZGNiwgMHgwMDA3RkZGNywgMHgwMDA3RkZGOCwKKyAgMHgwMDA3RkZGOSwgMHgwMDA3RkZGQSwgMHgwMDA3RkZGQiwgMHgwMDA3RkZGQywgMHgwMDA3RkZGRCwgMHgwMDA3RkZGRSwgMHgwMDA3RkZGRgorfTsKKworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQorICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVRbNjNdID0geworICAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAweDEzLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDBFLCAweDBFLCAweDBFLCAweDBELCAweDBDLCAweDBCLCAweDA4LCAweDA2LCAweDA0LCAweDAyLCAweDAxLAorICAweDAzLCAweDA1LCAweDA3LCAweDA5LCAweDBCLCAweDBELCAweDBFLCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzCit9OworCisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10gPSB7CisgIDB4MDAwRkZGRjAsIDB4MDAwRkZGRjEsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsIDB4MDAwRkZGRjYsIDB4MDAwM0ZGRjMsCisgIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRUUsIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjYsIDB4MDAwM0ZGRjQsIDB4MDAwM0ZGRjIsIDB4MDAwRkZGRjcsIDB4MDAwN0ZGRjAsCisgIDB4MDAwMUZGRjUsIDB4MDAwM0ZGRjAsIDB4MDAwMUZGRjQsIDB4MDAwMEZGRjcsIDB4MDAwMEZGRjYsIDB4MDAwMDdGRjgsIDB4MDAwMDNGRkIsIDB4MDAwMDBGRkQsCisgIDB4MDAwMDA3RkQsIDB4MDAwMDAzRkQsIDB4MDAwMDAxRkQsIDB4MDAwMDAwRkQsIDB4MDAwMDAwM0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsCisgIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsIDB4MDAwMDAzRkMsIDB4MDAwMDA3RkMsIDB4MDAwMDBGRkMsIDB4MDAwMDFGRkMsCisgIDB4MDAwMDNGRkEsIDB4MDAwMDdGRjksIDB4MDAwMDdGRkEsIDB4MDAwMEZGRjgsIDB4MDAwMEZGRjksIDB4MDAwMUZGRjYsIDB4MDAwMUZGRjcsIDB4MDAwM0ZGRjUsCisgIDB4MDAwM0ZGRjYsIDB4MDAwM0ZGRjEsIDB4MDAwRkZGRjgsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwRkZGRjksIDB4MDAwN0ZGRjcsCisgIDB4MDAwN0ZGRjQsIDB4MDAwRkZGRkEsIDB4MDAwRkZGRkIsIDB4MDAwRkZGRkMsIDB4MDAwRkZGRkQsIDB4MDAwRkZGRkUsIDB4MDAwRkZGRkYKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXSA9IHsKKyAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxNCwgMHgxMywKKyAgMHgxMSwgMHgxMiwgMHgxMSwgMHgxMCwgMHgxMCwgMHgwRiwgMHgwRSwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMSwKKyAgMHgwMywgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwRiwgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwKKyAgMHgxMiwgMHgxMiwgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxNCwgMHgxMywgMHgxMywgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGVvciByYW5nZSA6IFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMTIsMTJdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTEgPSAxMiAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUJhbGFuY2VfMTEgIEtLIDAwLTAyLTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExVC5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XSA9Cit7CisgIDB4MDAwMDFGRjIsIDB4MDAwMDFGRjMsIDB4MDAwMDFGRjQsIDB4MDAwMDFGRjUsIDB4MDAwMDFGRjYsIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDBGRjgsCisgIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsCisgIDB4MDAwMDAxRkUsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsIDB4MDAwMDFGRkMsIDB4MDAwMDFGRkQsIDB4MDAwMDFGRkUsIDB4MDAwMDNGRkUsCisgIDB4MDAwMDNGRkYKK307CisKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMVQubWF0L3ZfbkxoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTFUWzI1XSA9Cit7CisgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEMsIDB4MDgsIDB4MDcsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDYsCisgIDB4MDksIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExRi5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFGWzI1XSA9Cit7CisgIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksIDB4MDAwMDA3RkMsCisgIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsCisgIDB4MDAwMDAxRkUsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjYsIDB4MDAwMDNGRkEsIDB4MDAwMDNGRkIsIDB4MDAwMDNGRkMsIDB4MDAwMDNGRkQsIDB4MDAwMDNGRkUsCisgIDB4MDAwMDNGRkYKK307CisKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMUYubWF0L3ZfbkxoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTFGWzI1XSA9Cit7CisgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEIsIDB4MDgsIDB4MDcsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDYsCisgIDB4MDksIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IG5vaXNlIGxldmVsLCAzLjAgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy0yOSwyOV0sIENPREVfQk9PS19TQ0ZfTEFWICAgPSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaW1wbGVtIHJhbmdlOiBbLTMxLDMxXSwgQ09ERV9CT09LX1NDRl9MQVYxMSA9IDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByYXcgc3RhdHMgICA6IG5vaXNlTGV2ZWxfMTEgIEtLIDAwLTAyLTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfTm9pc2VMZXZlbEMxMVRbNjNdID0geworICAweDAwMDAxRkNFLCAweDAwMDAxRkNGLCAweDAwMDAxRkQwLCAweDAwMDAxRkQxLCAweDAwMDAxRkQyLCAweDAwMDAxRkQzLCAweDAwMDAxRkQ0LCAweDAwMDAxRkQ1LAorICAweDAwMDAxRkQ2LCAweDAwMDAxRkQ3LCAweDAwMDAxRkQ4LCAweDAwMDAxRkQ5LCAweDAwMDAxRkRBLCAweDAwMDAxRkRCLCAweDAwMDAxRkRDLCAweDAwMDAxRkRELAorICAweDAwMDAxRkRFLCAweDAwMDAxRkRGLCAweDAwMDAxRkUwLCAweDAwMDAxRkUxLCAweDAwMDAxRkUyLCAweDAwMDAxRkUzLCAweDAwMDAxRkU0LCAweDAwMDAxRkU1LAorICAweDAwMDAxRkU2LCAweDAwMDAxRkU3LCAweDAwMDAwN0YyLCAweDAwMDAwMEZELCAweDAwMDAwMDNFLCAweDAwMDAwMDBFLCAweDAwMDAwMDA2LCAweDAwMDAwMDAwLAorICAweDAwMDAwMDAyLCAweDAwMDAwMDFFLCAweDAwMDAwMEZDLCAweDAwMDAwM0Y4LCAweDAwMDAxRkNDLCAweDAwMDAxRkU4LCAweDAwMDAxRkU5LCAweDAwMDAxRkVBLAorICAweDAwMDAxRkVCLCAweDAwMDAxRkVDLCAweDAwMDAxRkNELCAweDAwMDAxRkVELCAweDAwMDAxRkVFLCAweDAwMDAxRkVGLCAweDAwMDAxRkYwLCAweDAwMDAxRkYxLAorICAweDAwMDAxRkYyLCAweDAwMDAxRkYzLCAweDAwMDAxRkY0LCAweDAwMDAxRkY1LCAweDAwMDAxRkY2LCAweDAwMDAxRkY3LCAweDAwMDAxRkY4LCAweDAwMDAxRkY5LAorICAweDAwMDAxRkZBLCAweDAwMDAxRkZCLCAweDAwMDAxRkZDLCAweDAwMDAxRkZELCAweDAwMDAxRkZFLCAweDAwMDAzRkZFLCAweDAwMDAzRkZGCit9OworCisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M10gPSB7CisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEIsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDEsCisgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMEEsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMEUKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IG5vaXNlIGJhbGFuY2UsIDMuMCBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWID0gMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaW1wbGVtIHJhbmdlOiBzYW1lIGJ1dCBtYXBwZWQgdG8gWy0xMiwxMl0sIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMSA9IDEyICovCisvKiByYXcgc3RhdHMgICA6IG5vaXNlQmFsYW5jZV8xMSAgS0sgMDAtMDItMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9ub2lzZUJhbGFuY2VfMTEubWF0L3ZfbkJoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgSU5UIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XSA9Cit7CisgIDB4MDAwMDAwRUMsIDB4MDAwMDAwRUQsIDB4MDAwMDAwRUUsIDB4MDAwMDAwRUYsIDB4MDAwMDAwRjAsIDB4MDAwMDAwRjEsIDB4MDAwMDAwRjIsIDB4MDAwMDAwRjMsCisgIDB4MDAwMDAwRjQsIDB4MDAwMDAwRjUsIDB4MDAwMDAwMUMsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwM0EsIDB4MDAwMDAwRjYsCisgIDB4MDAwMDAwRjcsIDB4MDAwMDAwRjgsIDB4MDAwMDAwRjksIDB4MDAwMDAwRkEsIDB4MDAwMDAwRkIsIDB4MDAwMDAwRkMsIDB4MDAwMDAwRkQsIDB4MDAwMDAwRkUsCisgIDB4MDAwMDAwRkYKK307CisKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL25vaXNlQmFsYW5jZV8xMS5tYXQvdl9uTGhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBVQ0hBUiBib29rU2JyTm9pc2VCYWxhbmNlTDExVFsyNV0gPQoreworICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA1LCAweDAyLCAweDAxLCAweDAzLCAweDA2LCAweDA4LAorICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4Cit9OworCisvKgorICAgdHVuaW5nVGFibGUKKyovCitjb25zdCBzYnJUdW5pbmdUYWJsZV90IHNiclR1bmluZ1RhYmxlW10gPQoreworICAvKiBTb21lIG9mIHRoZSBsb3cgYml0cmF0ZXMgYXJlIGNvbW1lbnRlZCBvdXQgaGVyZSwgdGhpcyBpcyBiZWNhdXNlIHRoZQorICAgICBlbmNvZGVyIGNvdWxkIGxvc2UgZnJhbWVzIGF0IHRob3NlIGJpdHJhdGVzIGFuZCB0aHJvdyBhbiBlcnJvciBiZWNhdXNlCisgICAgIGl0IGhhcyBpbnN1ZmZpY2llbnQgYml0cyB0byBlbmNvZGUgZm9yIHNvbWUgdGVzdCBpdGVtcy4KKyAgKi8KKworICAvKioqIEhFLUFBQyBzZWN0aW9uICoqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZixzZnNwLHNmLHNmc3Asbm5iLG5mbyxzYW1sLFNNLEZTKi8KKworICAvKioqIG1vbm8gKioqLworCisgIC8qIDgvMTYga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgICA4MDAwLCAxLCAgNywgNiwgMTEsMTAsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCisgIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgIDgwMDAsIDEsIDExLCA3LCAxMywxMiwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKKyAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDEsICAgODAwMCwgMSwgMTQsMTAsIDEzLDEzLCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAorICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgICA4MDAwLCAxLCAxNCwxMCwgMTQsMTQsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KKyAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMzIwMDAsICAgODAwMCwgMSwgMTQsMTAsIDE0LDE0LCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCisgIHsgQ09ERUNfQUFDLCAgMzIwMDAsIDQ4MDAxLCAgIDgwMDAsIDEsIDE0LDExLCAxNSwxNSwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLyAvKiBiaXRyYXRlcyBoaWdoZXIgdGhhbiA0ODAwMCBub3Qgc3VwcG9ydGVkIGJ5IEFBQyBjb3JlICovCisKKyAgLyogMTEvMjIga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgIDExMDI1LCAxLCAgNSwgNCwgIDYsIDYsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCisgIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgMTEwMjUsIDEsICA4LCA1LCAxMiwgOSwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKKyAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDAsICAxMTAyNSwgMSwgMTIsIDgsIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAorICB7IENPREVDX0FBQywgIDE2MDAwLCAyMDAwMCwgIDExMDI1LCAxLCAxMiwgOCwgMTMsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIGF0IHN1Y2ggImhpZ2giIGJpdHJhdGVzIGl0J3MgYmV0dGVyIHRvIHVwc2FtcGxlIHRoZSBpbnB1dCAqLworICB7IENPREVDX0FBQywgIDIwMDAwLCAyNDAwMSwgIDExMDI1LCAxLCAxMywgOSwgMTMsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIHNpZ25hbCBieSBhIGZhY3RvciBvZiAyIGJlZm9yZSBzZW5kaW5nIGl0IGludG8gdGhlIGVuY29kZXIgKi8KKyAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMzIwMDAsICAxMTAyNSwgMSwgMTQsMTAsIDE0LCA5LCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCisgIHsgQ09ERUNfQUFDLCAgMzIwMDAsIDQ4MDAwLCAgMTEwMjUsIDEsIDE1LDExLCAxNSwxMCwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLworICB7IENPREVDX0FBQywgIDQ4MDAwLCA2NDAwMSwgIDExMDI1LCAxLCAxNSwxMSwgMTUsMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIHBsYWNlYm8gKi8KKworICAvKiAxMi8yNCBrSHogZHVhbCByYXRlICovCisgIHsgQ09ERUNfQUFDLCAgIDgwMDAsIDEwMDAwLCAgMTIwMDAsIDEsICA0LCAzLCAgNiwgNiwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogIDgga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgMTIwMDAsIDEsICA3LCA0LCAxMSwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMTIwMDAsIDE2MDAwLCAgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDIwMDAwLCAgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTYga2JpdC9zICovIC8qIGF0IHN1Y2ggImhpZ2giIGJpdHJhdGVzIGl0J3MgYmV0dGVyIHRvIHVwc2FtcGxlIHRoZSBpbnB1dCAqLworICB7IENPREVDX0FBQywgIDIwMDAwLCAyNDAwMSwgIDEyMDAwLCAxLCAxMiwgOCwgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLyAvKiBzaWduYWwgYnkgYSBmYWN0b3Igb2YgMiBiZWZvcmUgc2VuZGluZyBpdCBpbnRvIHRoZSBlbmNvZGVyICovCisgIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDMyMDAwLCAgMTIwMDAsIDEsIDEzLCA5LCAxMywgOSwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLworICB7IENPREVDX0FBQywgIDMyMDAwLCA0ODAwMCwgIDEyMDAwLCAxLCAxNCwxMCwgMTQsMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KKyAgeyBDT0RFQ19BQUMsICA0ODAwMCwgNjQwMDEsICAxMjAwMCwgMSwgMTQsMTEsIDE1LDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBwbGFjZWJvICovCisKKyAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgIDE2MDAwLCAxLCAgMSwgMSwgMCwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDEwMDAwLCAxMjAwMCwgIDE2MDAwLCAxLCAgMiwgMSwgNiwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDEyMDAwLCAxNjAwMCwgIDE2MDAwLCAxLCAgNCwgMiwgNiwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDE2MDAwLCAxODAwMCwgIDE2MDAwLCAxLCAgNCwgMiwgOCwgMywgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDE4MDAwLCAyMjAwMCwgIDE2MDAwLCAxLCAgNiwgNSwxMSwgNywgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDIyMDAwLCAyODAwMCwgIDE2MDAwLCAxLCAxMCwgOSwxMiwgOCwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgIDE2MDAwLCAxLCAxMiwxMiwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDE2MDAwLCAxLCAxNCwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA2NDAwMSwgIDE2MDAwLCAxLCAxNCwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLworCisgIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLworICAvKiB7IENPREVDX0FBQywgICA4MDAwLCAxMTM2OSwgIDIyMDUwLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sICovIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLyAgIC8qIGVuY29kZXIgY2FuIG5vdCB3b3JrIHN0YWJsZSBhdCB0aGlzIGV4dHJlbWVseSBsb3cgYml0cmF0ZSAqLworICB7IENPREVDX0FBQywgIDExMzY5LCAxNjAwMCwgIDIyMDUwLCAxLCAgMywgMSwgNCwgNCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDE2MDAwLCAxODAwMCwgIDIyMDUwLCAxLCAgMywgMSwgNSwgNCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDE4MDAwLCAyMjAwMCwgIDIyMDUwLCAxLCAgNCwgNCwgOCwgNSwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDIyMDAwLCAyODAwMCwgIDIyMDUwLCAxLCAgNywgNiwgOCwgNiwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgIDIyMDUwLCAxLCAxMCwxMCwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDIyMDUwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA2NDAwMSwgIDIyMDUwLCAxLCAxMywxMywxMiwxMiwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLworCisgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgLyogeyBDT0RFQ19BQUMsICAgODAwMCwgMTIwMDAsICAyNDAwMCwgMSwgIDEsIDEsIDEsIDEsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAqLyAvKiBub21pbmFsOiAgOCBrYml0L3MgKi8gICAvKiBlbmNvZGVyIGNhbiBub3Qgd29yayBzdGFibGUgYXQgdGhpcyBleHRyZW1lbHkgbG93IGJpdHJhdGUgKi8KKyAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDAsICAyNDAwMCwgMSwgIDMsIDEsIDQsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxMiBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMTgwMDAsICAyNDAwMCwgMSwgIDMsIDEsIDUsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxNiBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAxODAwMCwgMjIwMDAsICAyNDAwMCwgMSwgIDQsIDMsIDgsIDUsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAyMjAwMCwgMjgwMDAsICAyNDAwMCwgMSwgIDcsIDYsIDgsIDYsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMSwgMTAsMTAsIDksIDksICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAyNDAwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNjQwMDEsICAyNDAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKworICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCisgIHsgQ09ERUNfQUFDLCAgIDI0MDAwLCAzNjAwMCwgMzIwMDAsIDEsICA0LCA0LCA0LCA0LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlICAqLworICB7IENPREVDX0FBQywgICAzNjAwMCwgNjAwMDAsIDMyMDAwLCAxLCAgNywgNywgNiwgNiwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAqLworICB7IENPREVDX0FBQywgICA2MDAwMCwgNzIwMDAsIDMyMDAwLCAxLCAgOSwgOSwgOCwgOCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIGxvdyByYW5nZSAqLworICB7IENPREVDX0FBQywgICA3MjAwMCwxMDAwMDAsIDMyMDAwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIFNCUiBzd2VldCBzcG90ICovCisgIHsgQ09ERUNfQUFDLCAgMTAwMDAwLDE2MDAwMSwgMzIwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KKworICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLworICB7IENPREVDX0FBQywgICAyNDAwMCwgMzYwMDAsIDQ0MTAwLCAxLCAgNCwgNCwgNCwgNCwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDLCAgIDM2MDAwLCA2MDAwMCwgNDQxMDAsIDEsICA3LCA3LCA2LCA2LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KKyAgeyBDT0RFQ19BQUMsICAgNjAwMDAsIDcyMDAwLCA0NDEwMCwgMSwgIDksIDksIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KKyAgeyBDT0RFQ19BQUMsICAgNzIwMDAsMTAwMDAwLCA0NDEwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLworICB7IENPREVDX0FBQywgIDEwMDAwMCwxNjAwMDEsIDQ0MTAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCisKKyAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogbm90IHlldCBmaW5hbGx5IHR1bmVkICovCisgIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCAzNjAwMCwgNDgwMDAsIDEsICA0LCA0LCA5LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KKyAgeyBDT0RFQ19BQUMsICAgMzYwMDAsIDYwMDAwLCA0ODAwMCwgMSwgIDcsIDcsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiA0MCAqLworICB7IENPREVDX0FBQywgICA2MDAwMCwgNzIwMDAsIDQ4MDAwLCAxLCAgOSwgOSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0ICovCisgIHsgQ09ERUNfQUFDLCAgIDcyMDAwLDEwMDAwMCwgNDgwMDAsIDEsIDExLDExLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogODAgKi8KKyAgeyBDT0RFQ19BQUMsICAxMDAwMDAsMTYwMDAxLCA0ODAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KKworICAvKioqIHN0ZXJlbyAqKiovCisgIC8qIDA4LzE2IGtIeiBkdWFsIHJhdGUgKi8KKyAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAgODAwMCwgMiwgIDYsIDYsICA5LCA3LCAxLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8gLyogcGxhY2VibyAqLworICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgICA4MDAwLCAyLCAgOSwgOSwgMTEsIDksIDEsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgICA4MDAwLCAyLCAxMSwgOSwgMTEsIDksIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgICA4MDAwLCAyLCAxMywxMSwgMTMsMTEsIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgICA4MDAwLCAyLCAxNCwxMiwgMTMsMTIsIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDUyMDAwLCA2MDAwMCwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLworCisgIC8qIDExLzIyIGtIeiBkdWFsIHJhdGUgKi8KKyAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAxMTAyNSwgMiwgIDcsIDUsIDksIDcsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovIC8qIHBsYWNlYm8gKi8KKyAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAxMTAyNSwgMiwgMTAsIDgsMTAsIDgsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMTEwMjUsIDIsIDEyLCA4LDEyLCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDExMDI1LCAyLCAxMywgOSwxMywgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAxMTAyNSwgMiwgMTQsMTEsMTMsMTEsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMTEwMjUsIDIsIDE1LDE1LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDExMDI1LCAyLCAxNSwxNSwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAxMTAyNSwgMiwgMTUsMTUsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCisKKyAgLyogMTIvMjQga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgIDEyMDAwLCAyLCAgNiwgNCwgOSwgNywgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8gLyogcGxhY2VibyAqLworICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDEyMDAwLCAyLCAgOSwgNywxMCwgOCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAxMjAwMCwgMiwgMTEsIDcsMTIsIDgsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMTIwMDAsIDIsIDEyLCA5LDEyLCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDEyMDAwLCAyLCAxMywxMiwxMywxMiwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAxMjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMTIwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDEyMDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KKworICAvKiAxNi8zMiBrSHogZHVhbCByYXRlICovCisgIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMTYwMDAsIDIsICA0LCAyLCAxLCAwLCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDE2MDAwLCAyLCAgOCwgNywxMCwgOCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAxNjAwMCwgMiwgMTAsIDksMTIsMTEsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMTYwMDAsIDIsIDEzLDEzLDEzLDEzLCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDE2MDAwLCAyLCAxNCwxNCwxMywxMywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDE2MDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KKworICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KKyAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAyMjA1MCwgMiwgIDIsIDEsIDEsIDAsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDI4MDAwLCAgMjIwNTAsIDIsICA1LCA0LCA2LCA1LCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI4MDAwLCAzMjAwMCwgIDIyMDUwLCAyLCAgNSwgNCwgOCwgNywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAyOCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAzMjAwMCwgMzYwMDAsICAyMjA1MCwgMiwgIDcsIDYsIDgsIDcsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMjIwNTAsIDIsIDEwLDEwLCA5LCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDIyMDUwLCAyLCAxMiwxMiwgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAyMjA1MCwgMiwgMTMsMTMsMTAsMTAsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMjIwNTAsIDIsIDE0LDE0LDEyLDEyLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDIyMDUwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KKworICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCisgIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMjQwMDAsIDIsICAyLCAxLCAxLCAwLCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDI0MDAwLCAyLCAgNSwgNSwgNiwgNiwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMiwgIDcsIDYsIDgsIDcsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMjQwMDAsIDIsIDEwLDEwLCA5LCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDI0MDAwLCAyLCAxMiwxMiwgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAyNDAwMCwgMiwgMTMsMTMsMTAsMTAsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMjQwMDAsIDIsIDE0LDE0LDEyLDEyLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDI0MDAwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KKworICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCisgIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCA2MDAwMCwgMzIwMDAsIDIsICA0LCA0LCA0LCA0LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDLCAgIDYwMDAwLCA4MDAwMCwgMzIwMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDLCAgIDgwMDAwLDExMjAwMCwgMzIwMDAsIDIsICA5LCA5LCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGxvdyByYW5nZSAqLworICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDMyMDAwLCAyLCAxMSwxMSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLworICB7IENPREVDX0FBQywgIDE0NDAwMCwyNTYwMDEsIDMyMDAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCisgIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCisgIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCA2MDAwMCwgNDQxMDAsIDIsICA0LCA0LCA0LCA0LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDLCAgIDYwMDAwLCA4MDAwMCwgNDQxMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDLCAgIDgwMDAwLDExMjAwMCwgNDQxMDAsIDIsICA5LCA5LCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGxvdyByYW5nZSAqLworICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDQ0MTAwLCAyLCAxMSwxMSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLworICB7IENPREVDX0FBQywgIDE0NDAwMCwyNTYwMDEsIDQ0MTAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCisgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLworICB7IENPREVDX0FBQywgICAzNjAwMCwgNjAwMDAsIDQ4MDAwLCAyLCAgNCwgNCwgOSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLworICB7IENPREVDX0FBQywgICA2MDAwMCwgODAwMDAsIDQ4MDAwLCAyLCAgNywgNywgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA2NCAqLworICB7IENPREVDX0FBQywgICA4MDAwMCwxMTIwMDAsIDQ4MDAwLCAyLCAgOSwgOSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA5NiAqLworICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDQ4MDAwLCAyLCAxMSwxMSwxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KKyAgeyBDT0RFQ19BQUMsICAxNDQwMDAsMjU2MDAxLCA0ODAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogMTkyICovCisKKworICAvKiogQUFDIExPVyBERUxBWSBTRUNUSU9OICoqLworCisgIC8qKiogbW9ubyAqKiovCisgIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgbm90IHlldCB0dW5lZCAtPmFsYiBjb3BpZWQgZnJvbSBub24gTEQgdGFibGVzKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDE2MDAwLCAxODAwMCwgIDE2MDAwLCAxLCAgNCwgNSwgOSwgNywgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyB3cnI6IHR1bmVkICovCisgIHsgQ09ERUNfQUFDTEQsICAxODAwMCwgMjIwMDAsICAxNjAwMCwgMSwgIDcsIDcsMTIsMTIsICAxLCA2LCA5LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3Mgd3JyOiB0dW5lZCAqLworICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMTYwMDAsIDEsICA2LCA2LCA5LCA5LCAgMiwgMywgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zIHdycjogdHVuZWQgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDI4MDAwLCAzNjAwMCwgIDE2MDAwLCAxLCAgOCwgOCwxMiwgNywgIDIsIDksMTIsIFNCUl9NT05PLCAzIH0sIC8qIGpncjogc3BlY2lhbCAqLyAvKiB3cnI6IHR1bmVkICovCisgIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNDQwMDAsICAxNjAwMCwgMSwgMTAsMTQsMTIsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDQ0MDAwLCA2NDAwMSwgIDE2MDAwLCAxLCAxMSwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLworCisgIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQ0xELCAgMTgwMDAsIDIyMDAwLCAgMjIwNTAsIDEsICA0LCA0LCA1LCA1LCAgMiwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICAyMjAwMCwgMjgwMDAsICAyMjA1MCwgMSwgIDUsIDUsIDYsIDYsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDI4MDAwLCAzNjAwMCwgIDIyMDUwLCAxLCAgNywgOCwgOCwgOCwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMjIwNTAsIDEsICA5LCA5LCA5LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNTIwMDAsICAyMjA1MCwgMSwgMTIsMTEsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDUyMDAwLCA2NDAwMSwgIDIyMDUwLCAxLCAxMywxMSwxMSwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLworCisgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDIwMDAwLCAyMjAwMCwgIDI0MDAwLCAxLCAgNCwgMSwgOCwgNCwgIDIsIDMsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMjQwMDAsIDEsICAzLCA4LCA4LCA3LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMSwgIDQsIDgsIDgsIDcsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA1NjAwMCwgIDI0MDAwLCAxLCAgOCwgOSwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgNTYwMDAsIDY0MDAxLCAgMjQwMDAsIDEsIDEzLDExLDExLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCisKKyAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLyAgLypqZ3I6IG5ldywgY29weSBmcm9tIENPREVDX0FBQyAqLworICB7IENPREVDX0FBQ0xELCAgMjQwMDAsIDM2MDAwLCAgMzIwMDAsIDEsICA0LCA0LCA0LCA0LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlICAqLworICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgMzIwMDAsIDEsICA3LCA3LCA2LCA2LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbG93ZXN0IHJhbmdlICovCisgIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzIwMDAsICAzMjAwMCwgMSwgIDksIDksIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDcyMDAwLDEwMDAwMCwgIDMyMDAwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIFNCUiBzd2VldCBzcG90ICovCisgIHsgQ09ERUNfQUFDTEQsIDEwMDAwMCwxNjAwMDEsICAzMjAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCisgIC8qIDQ0Lzg4IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLworICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgNDQxMDAsIDEsICA4LCA3LCA2LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogNDAgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA3MjAwMCwgIDQ0MTAwLCAxLCAgOSwgOSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0ICovCisgIHsgQ09ERUNfQUFDTEQsICA3MjAwMCwxMDAwMDAsICA0NDEwMCwgMSwgMTEsMTEsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA4MCAqLworICB7IENPREVDX0FBQ0xELCAxMDAwMDAsMTYwMDAxLCAgNDQxMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogMTI4ICovCisKKyAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogMzIgYW5kIDQwa2JwcyBsaW5lIHR1bmVkIGZvciBkdWFsLXJhdGUgU0JSICovCisgIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNjAwMDAsICA0ODAwMCwgMSwgIDgsIDcsIDYsIDksICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiA0MCAqLworICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDcyMDAwLCAgNDgwMDAsIDEsICA5LCA5LDEwLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNjQgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDcyMDAwLDEwMDAwMCwgIDQ4MDAwLCAxLCAxMSwxMSwxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDgwICovCisgIHsgQ09ERUNfQUFDTEQsIDEwMDAwMCwxNjAwMDEsICA0ODAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KKworICAvKioqIHN0ZXJlbyAqKiovCisgIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgbm90IHlldCB0dW5lZCAtPmFsYiBjb3BpZWQgZnJvbSBub24gTEQgdGFibGVzKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDMyMDAwLCAzNjAwMCwgIDE2MDAwLCAyLCAxMCwgOSwxMiwxMSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA0NDAwMCwgIDE2MDAwLCAyLCAxMywxMywxMywxMywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDQ0MDAwLCA1MjAwMCwgIDE2MDAwLCAyLCAxMCwgOSwxMSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiB0dW5lMTIgbm9taW5hbDogNDgga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjAwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzYwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA3NjAwMCwxMjgwMDEsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCisKKyAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCisgIHsgQ09ERUNfQUFDTEQsICAzMjAwMCwgMzYwMDAsICAyMjA1MCwgMiwgIDUsIDQsIDcsIDYsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNDQwMDAsICAyMjA1MCwgMiwgIDUsIDgsIDgsIDgsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNTIwMDAsICAyMjA1MCwgMiwgIDcsMTAsIDgsIDgsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjAwMDAsICAyMjA1MCwgMiwgIDksMTEsIDksIDksICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzYwMDAsICAyMjA1MCwgMiwgMTAsMTIsMTAsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA3NjAwMCwgODIwMDAsICAyMjA1MCwgMiwgMTIsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCisgIHsgQ09ERUNfQUFDTEQsICA4MjAwMCwxMjgwMDEsICAyMjA1MCwgMiwgMTMsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCisKKyAgLyogMjQvNDgga0h6IGR1YWwgcmF0ZSAqLworICB7IENPREVDX0FBQ0xELCAgMzIwMDAsIDM2MDAwLCAgMjQwMDAsIDIsICA1LCA0LCA3LCA2LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMjQwMDAsIDIsICA0LCA4LCA4LCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgNDQwMDAsIDUyMDAwLCAgMjQwMDAsIDIsICA2LDEwLCA4LCA4LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgNTIwMDAsIDYwMDAwLCAgMjQwMDAsIDIsICA5LDExLCA5LCA5LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDc2MDAwLCAgMjQwMDAsIDIsIDExLDEyLDEwLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgNzYwMDAsIDg4MDAwLCAgMjQwMDAsIDIsIDEyLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgODgwMDAsMTI4MDAxLCAgMjQwMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDkyIGtiaXQvcyAqLworCisgIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8gIC8qIHBsYWNlYm8gc2V0dGluZ3MgKi8gLypqZ3I6IG5ldywgY29weSBmcm9tIENPREVDX0FBQyAqLworICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDgwMDAwLCAgMzIwMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCisgIHsgQ09ERUNfQUFDTEQsICA4MDAwMCwxMTIwMDAsICAzMjAwMCwgMiwgIDksIDksIDgsIDgsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbG93IHJhbmdlICovCisgIHsgQ09ERUNfQUFDTEQsIDExMjAwMCwxNDQwMDAsICAzMjAwMCwgMiwgMTEsMTEsMTAsMTAsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogU0JSIHN3ZWV0IHNwb3QgKi8KKyAgeyBDT0RFQ19BQUNMRCwgMTQ0MDAwLDI1NjAwMSwgIDMyMDAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCisgIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovIC8qd3JyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA4MDAwMCwgIDQ0MTAwLCAyLCAgNywgNywgNiwgNiwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLworICB7IENPREVDX0FBQ0xELCAgODAwMDAsMTEyMDAwLCAgNDQxMDAsIDIsIDEwLDEwLCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAxMS0wOC0yOSAqLworICB7IENPREVDX0FBQ0xELCAxMTIwMDAsMTQ0MDAwLCAgNDQxMDAsIDIsIDEyLDEyLDEwLDEwLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAxMS0wOC0yOSAqLworICB7IENPREVDX0FBQ0xELCAxNDQwMDAsMjU2MDAxLCAgNDQxMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCisKKyAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogbm90IHlldCBmaW5hbGx5IHR1bmVkICovIC8qd3JyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA4MDAwMCwgIDQ4MDAwLCAyLCAgNywgNywxMCwxMCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA2NCAqLworICB7IENPREVDX0FBQ0xELCAgODAwMDAsMTEyMDAwLCAgNDgwMDAsIDIsICA5LCA5LDEwLDEwLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDk2ICovCisgIHsgQ09ERUNfQUFDTEQsIDExMjAwMCwxNDQwMDAsICA0ODAwMCwgMiwgMTEsMTEsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogMTI4ICovCisgIHsgQ09ERUNfQUFDTEQsIDE0NDAwMCwxNzYwMDAsICA0ODAwMCwgMiwgMTIsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogaGxtIDA5LTEwLTE5ICovCisgIHsgQ09ERUNfQUFDTEQsIDE3NjAwMCwyNTYwMDEsICA0ODAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogaGxtIDA5LTEwLTE5ICovCisKK307CisKK2NvbnN0IGludCBzYnJUdW5pbmdUYWJsZVNpemUgPSBzaXplb2Yoc2JyVHVuaW5nVGFibGUpL3NpemVvZihzYnJUdW5pbmdUYWJsZVswXSk7CisKK2NvbnN0IHBzVHVuaW5nVGFibGVfdCBwc1R1bmluZ1RhYmxlWzRdID0KK3sKKyAgeyAgODAwMCwgIDIyMDAwLCBQU0VOQ19TVEVSRU9fQkFORFNfMTAsIFBTRU5DX05FTlZfMSwgRkwyRlhDT05TVF9EQkwoMy4wZi80LjBmKSB9LAorICB7IDIyMDAwLCAgMjgwMDAsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl8xLCBGTDJGWENPTlNUX0RCTCgyLjBmLzQuMGYpIH0sCisgIHsgMjgwMDAsICAzNjAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzIwLCBQU0VOQ19ORU5WXzIsIEZMMkZYQ09OU1RfREJMKDEuNWYvNC4wZikgfSwKKyAgeyAzNjAwMCwgMTYwMDAxLCBQU0VOQ19TVEVSRU9fQkFORFNfMjAsIFBTRU5DX05FTlZfNCwgRkwyRlhDT05TVF9EQkwoMS4xZi80LjBmKSB9LAorfTsKKworCisvL0B9CisKKworCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmggYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhOTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Nicl9yb20uaApAQCAtMCwwICsxLDEyNyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorXGZpbGUKK1xicmllZiBEZWNsYXJhdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKKyAKKyovCisjaWZuZGVmIF9fU0JSX1JPTV9ICisjZGVmaW5lIF9fU0JSX1JPTV9ICisKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKworI2luY2x1ZGUgInBzX21haW4uaCIKKworLyoKKyAgaHVmZm1hbiB0YWJsZXMKKyovCitleHRlcm4gY29uc3QgSU5UICAgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFRbMTIxXTsKK2V4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVFsxMjFdOworZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV07CitleHRlcm4gY29uc3QgVUNIQVIgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXTsKK2V4dGVybiBjb25zdCBJTlQgICAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV07CitleHRlcm4gY29uc3QgVUNIQVIgICAgICAgICBib29rU2JyRW52QmFsYW5jZUwxMFRbNDldOworZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XTsKK2V4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV07CitleHRlcm4gY29uc3QgSU5UICAgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVRbNjNdOworZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXTsKK2V4dGVybiBjb25zdCBJTlQgICAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUZbNjNdOworZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XTsKK2V4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV07CitleHRlcm4gY29uc3QgSU5UICAgICAgICAgICBib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdOworZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgYm9va1NickVudkJhbGFuY2VMMTFGWzI1XTsKK2V4dGVybiBjb25zdCBJTlQgICAgICAgICAgIHZfSHVmZl9Ob2lzZUxldmVsQzExVFs2M107CitleHRlcm4gY29uc3QgVUNIQVIgICAgICAgICB2X0h1ZmZfTm9pc2VMZXZlbEwxMVRbNjNdOworZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgYm9va1Nick5vaXNlQmFsYW5jZUMxMVRbMjVdOworZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdOworCitleHRlcm4gY29uc3Qgc2JyVHVuaW5nVGFibGVfdCBzYnJUdW5pbmdUYWJsZVtdOworZXh0ZXJuIGNvbnN0IGludCBzYnJUdW5pbmdUYWJsZVNpemU7CisKK2V4dGVybiBjb25zdCBwc1R1bmluZ1RhYmxlX3QgcHNUdW5pbmdUYWJsZVs0XTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmM1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuY3BwCkBAIC0wLDAgKzEsNjkxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgZnJlcXVlbmN5IHNjYWxlICAKKyAgXGF1dGhvciBUb2JpYXMgQ2hhbHVwa2EKKyovCisKKyNpbmNsdWRlICJzYnJlbmNfZnJlcV9zY2EuaCIKKyNpbmNsdWRlICJzYnJfbWlzYy5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworLyogIFN0YXJ0RnJlcSAqLworc3RhdGljIElOVCBnZXRTdGFydEZyZXEoSU5UIGZzQ29yZSwgY29uc3QgSU5UIHN0YXJ0X2ZyZXEpOworCisvKiBTdG9wRnJlcSAqLworc3RhdGljIElOVCBnZXRTdG9wRnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RvcF9mcmVxKTsKKworc3RhdGljIElOVCAgbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKTsKK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhJTlQgKiBkaWZmLCBJTlQgc3RhcnQgLCBJTlQgc3RvcCAsIElOVCBudW1fYmFuZHMpOworc3RhdGljIElOVCAgbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kLCBJTlQgKiBkaWZmLCBJTlQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGN1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCogZGlmZiwgSU5UIGxlbmd0aCwgVUNIQVIgICpzdGFydF9hZHJlc3MpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lOVAorRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoSU5UIHN0YXJ0RnJlcSwgSU5UIGZzQ29yZSkKK3sKKyAgSU5UIHJlc3VsdDsKKworICBpZiAoIHN0YXJ0RnJlcSA8IDAgfHwgc3RhcnRGcmVxID4gMTUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLyogVXBkYXRlIHN0YXJ0RnJlcSBzdHJ1Y3QgKi8KKyAgcmVzdWx0ID0gZ2V0U3RhcnRGcmVxKGZzQ29yZSwgc3RhcnRGcmVxKTsKKworICByZXN1bHQgPSAocmVzdWx0Kihmc0NvcmU+PjUpKzEpPj4xOyAvKiAocmVzdWx0KmZzU0JSL1FNRmJhbmRzKzEpPj4xOyAqLworCisgIHJldHVybiAocmVzdWx0KTsKKworfSAvKiBFbmQgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgZ2V0U2JyU3RvcEZyZXEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcgIChJTlQgc3RvcEZyZXEsIElOVCBmc0NvcmUpCit7CisgIElOVCByZXN1bHQ7CisKKyAgaWYgKCBzdG9wRnJlcSA8IDAgfHwgc3RvcEZyZXEgPiAxMykKKyAgICByZXR1cm4gLTE7CisKKyAgLyogVXBwZGF0ZSBzdG9wRnJlcSBzdHJ1Y3QgKi8KKyAgcmVzdWx0ID0gZ2V0U3RvcEZyZXEoZnNDb3JlLCBzdG9wRnJlcSk7CisgIHJlc3VsdCA9IChyZXN1bHQqKGZzQ29yZT4+NSkrMSk+PjE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCisKKyAgcmV0dXJuIChyZXN1bHQpOworfSAvKiBFbmQgZ2V0U2JyU3RvcEZyZXEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIGdldFN0YXJ0RnJlcQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czogIGZzQ29yZSAtIGNvcmUgc2FtcGxpbmcgcmF0ZQorCisKKyBSZXR1cm46CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2dldFN0YXJ0RnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RhcnRfZnJlcSkKK3sKKyAgSU5UIGswX21pbjsKKworICBzd2l0Y2goZnNDb3JlKXsKKyAgY2FzZSAgODAwMDogazBfbWluID0gMjQ7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgIGJyZWFrOworICBjYXNlIDExMDI1OiBrMF9taW4gPSAxNzsgLyogKDMwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgYnJlYWs7CisgIGNhc2UgMTIwMDA6IGswX21pbiA9IDE2OyAvKiAoMzAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICBicmVhazsKKyAgY2FzZSAxNjAwMDogazBfbWluID0gMTY7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgIGJyZWFrOworICBjYXNlIDIyMDUwOiBrMF9taW4gPSAxMjsgLyogKDQwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgYnJlYWs7CisgIGNhc2UgMjQwMDA6IGswX21pbiA9IDExOyAvKiAoNDAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICBicmVhazsKKyAgY2FzZSAzMjAwMDogazBfbWluID0gMTA7IC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgIGJyZWFrOworICBjYXNlIDQ0MTAwOiBrMF9taW4gPSA3OyAgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgYnJlYWs7CisgIGNhc2UgNDgwMDA6IGswX21pbiA9IDc7ICAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICBicmVhazsKKyAgY2FzZSA5NjAwMDogazBfbWluID0gMzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGswX21pbj0xMTsgLyogaWxsZWdhbCBmcyAqLworICB9CisKKworICBzd2l0Y2ggKGZzQ29yZSkgeworCisgIGNhc2UgIDgwMDA6CisgICAgeworICAgICAgSU5UIHZfb2Zmc2V0W109IHstOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBjYXNlIDExMDI1OgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7LTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTN9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBjYXNlIDEyMDAwOgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7LTUsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBjYXNlIDE2MDAwOgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7LTYsIC00LCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBjYXNlIDIyMDUwOgorICBjYXNlIDI0MDAwOgorICBjYXNlIDMyMDAwOgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7LTQsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjB9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBjYXNlIDQ0MTAwOgorICBjYXNlIDQ4MDAwOgorICBjYXNlIDk2MDAwOgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7LTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2LCAyMCwgMjR9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICBkZWZhdWx0OgorICAgIHsKKyAgICAgIElOVCB2X29mZnNldFtdPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjAsIDI0LCAyOCwgMzN9OworICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CisgICAgfQorICB9Cit9IC8qIEVuZCBnZXRTdGFydEZyZXEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIGdldFN0b3BGcmVxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgc3RhdGljIElOVAorZ2V0U3RvcEZyZXEoSU5UIGZzQ29yZSwgY29uc3QgSU5UIHN0b3BfZnJlcSkKK3sKKyAgSU5UIHJlc3VsdCxpOworICBJTlQgazFfbWluOworICBJTlQgdl9kc3RvcFsxM107CisKKyAgSU5UICp2X3N0b3BfZnJlcSA9IE5VTEw7CisgIElOVCB2X3N0b3BfZnJlcV8xNlsxNF0gPSB7NDgsNDksNTAsNTEsNTIsNTQsNTUsNTYsNTcsNTksNjAsNjEsNjMsNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfMjJbMTRdID0gezM1LDM3LDM4LDQwLDQyLDQ0LDQ2LDQ4LDUxLDUzLDU2LDU4LDYxLDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzI0WzE0XSA9IHszMiwzNCwzNiwzOCw0MCw0Miw0NCw0Niw0OSw1Miw1NSw1OCw2MSw2NH07CisgIElOVCB2X3N0b3BfZnJlcV8zMlsxNF0gPSB7MzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYsNDksNTIsNTUsNTgsNjEsNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfNDRbMTRdID0gezIzLDI1LDI3LDI5LDMyLDM0LDM3LDQwLDQzLDQ3LDUxLDU1LDU5LDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzQ4WzE0XSA9IHsyMSwyMywyNSwyNywzMCwzMiwzNSwzOCw0Miw0NSw0OSw1NCw1OSw2NH07CisgIElOVCB2X3N0b3BfZnJlcV82NFsxNF0gPSB7MjAsMjIsMjQsMjYsMjksMzEsMzQsMzcsNDEsNDUsNDksNTQsNTksNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfODhbMTRdID0gezE1LDE3LDE5LDIxLDIzLDI2LDI5LDMzLDM3LDQxLDQ2LDUxLDU3LDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzk2WzE0XSA9IHsxMywxNSwxNywxOSwyMSwyNCwyNywzMSwzNSwzOSw0NCw1MCw1Nyw2NH07CisgIElOVCB2X3N0b3BfZnJlcV8xOTJbMTRdID0gezcsIDgsMTAsMTIsMTQsMTYsMTksMjMsMjcsMzIsMzgsNDYsNTQsNjR9OworCisgIHN3aXRjaChmc0NvcmUpeworICBjYXNlICA4MDAwOiBrMV9taW4gPSA0ODsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzE2OworICAgIGJyZWFrOworICBjYXNlIDExMDI1OiBrMV9taW4gPSAzNTsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzIyOworICAgIGJyZWFrOworICBjYXNlIDEyMDAwOiBrMV9taW4gPSAzMjsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzI0OworICAgIGJyZWFrOworICBjYXNlIDE2MDAwOiBrMV9taW4gPSAzMjsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzMyOworICAgIGJyZWFrOworICBjYXNlIDIyMDUwOiBrMV9taW4gPSAyMzsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzQ0OworICAgIGJyZWFrOworICBjYXNlIDI0MDAwOiBrMV9taW4gPSAyMTsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzQ4OworICAgIGJyZWFrOworICBjYXNlIDMyMDAwOiBrMV9taW4gPSAyMDsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzY0OworICAgIGJyZWFrOworICBjYXNlIDQ0MTAwOiBrMV9taW4gPSAxNTsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzg4OworICAgIGJyZWFrOworICBjYXNlIDQ4MDAwOiBrMV9taW4gPSAxMzsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzk2OworICAgIGJyZWFrOworICBjYXNlIDk2MDAwOiBrMV9taW4gPSAgNzsKKyAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzE5MjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBrMV9taW4gPSAyMTsgLyogaWxsZWdhbCBmcyAgKi8KKyAgfQorCisgIC8qIGlmIG5vIHZhbGlkIGNvcmUgc2FtcGxpbmdyYXRlIGlzIHVzZWQgdGhpcyBsb29wIHByb2R1Y2VzCisgICAgIGEgc2VnZmF1bHQsIGJlY2F1c2Ugdl9zdG9wX2ZyZXEgaXMgbm90IGluaXRpYWxpemVkICovCisgIC8qIEVuc3VyZSBpbmNyZWFzaW5nIGJhbmR3aWR0aCAqLworICBmb3IoaSA9IDA7IGkgPD0gMTI7IGkrKykgeworICAgIHZfZHN0b3BbaV0gPSB2X3N0b3BfZnJlcVtpKzFdIC0gdl9zdG9wX2ZyZXFbaV07CisgIH0KKworICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCh2X2RzdG9wLCAxMyk7IC8qIFNvcnQgYmFuZHdpZHRoIGNoYW5nZXMgKi8KKworICByZXN1bHQgPSBrMV9taW47CisgIGZvcihpID0gMDsgaSA8IHN0b3BfZnJlcTsgaSsrKSB7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgdl9kc3RvcFtpXTsKKyAgfQorCisgIHJldHVybihyZXN1bHQpOworCit9LyogRW5kIGdldFN0b3BGcmVxICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6ICAgICBzclNiciAgICAgICAgICAgIFNCUiBzYW1wbGluZyBmcmVxZW5jeQorICAgICAgICAgICAgICAgIHNyQ29yZSAgICAgICAgICAgQUFDIGNvcmUgc2FtcGxpbmcgZnJlcWVuY3kKKyAgICAgICAgICAgICAgICBub0NoYW5uZWxzICAgICAgIE51bWJlciBvZiBRTUYgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICBzdGFydEZyZXEgICAgICAgIFNCUiBzdGFydCBmcmVxdWVuY3kgaW4gUU1GIGJhbmRzCisgICAgICAgICAgICAgICAgc3RvcEZyZXEgICAgICAgICBTQlIgc3RhcnQgZnJlcXVlbmN5IGluIFFNRiBiYW5kcworCisgICAgICAgICAgICAgICAqazAgICAgICAgICAgICAgICBPdXRwdXQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAqazIgICAgICAgICAgICAgICBPdXRwdXQgcGFyYW1ldGVyCisKKyBSZXR1cm46ICAgICAgIEVycm9yIGNvZGUgKDAgaXMgT0spCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKAorICAgICAgICBjb25zdCBJTlQgc3JTYnIsCisgICAgICAgIGNvbnN0IElOVCBzckNvcmUsCisgICAgICAgIGNvbnN0IElOVCBub0NoYW5uZWxzLAorICAgICAgICBjb25zdCBJTlQgc3RhcnRGcmVxLAorICAgICAgICBjb25zdCBJTlQgc3RvcEZyZXEsCisgICAgICAgIElOVCAqazAsCisgICAgICAgIElOVCAqazIKKyAgICAgICAgKQoreworCisgIC8qIFVwZGF0ZSBzdGFydEZyZXEgc3RydWN0ICovCisgICprMCA9IGdldFN0YXJ0RnJlcShzckNvcmUsIHN0YXJ0RnJlcSk7CisKKyAgLyogVGVzdCBpZiBzdGFydCBmcmVxIGlzIG91dHNpZGUgY29yZWNvZGVyIHJhbmdlICovCisgIGlmKCBzclNicipub0NoYW5uZWxzIDwgKmswICogc3JDb3JlICkgeworICAgIHJldHVybiAoMSk7IC8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5KSAqLworICB9CisKKyAgLypVcGRhdGUgc3RvcEZyZXEgc3RydWN0ICovCisgIGlmICggc3RvcEZyZXEgPCAxNCApIHsKKyAgICAqazIgPSBnZXRTdG9wRnJlcShzckNvcmUsIHN0b3BGcmVxKTsKKyAgfSBlbHNlIGlmKCBzdG9wRnJlcSA9PSAxNCApIHsKKyAgICAqazIgPSAyICogKmswOworICB9IGVsc2UgeworICAgICprMiA9IDMgKiAqazA7CisgIH0KKworICAvKiBsaW1pdCB0byBOeXF2aXN0ICovCisgIGlmICgqazIgPiBub0NoYW5uZWxzKSB7CisgICAgKmsyID0gbm9DaGFubmVsczsKKyAgfQorCisKKworICAvKiBUZXN0IGZvciBpbnZhbGlkICBrMCBrMiBjb21iaW5hdGlvbnMgKi8KKyAgaWYgKCAoc3JDb3JlID09IDIyMDUwKSAmJiAoICgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDAgKSApCisgICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvciBmcz00NC4xa0h6ICovCisKKyAgaWYgKCAoc3JDb3JlID49IDI0MDAwKSAmJiAoICgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTX0ZTNDgwMDAgKSApCisgICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvciBmcz49NDhrSHogKi8KKworICBpZiAoKCprMiAtICprMCkgPiBNQVhfRlJFUV9DT0VGRlMpCisgICAgcmV0dXJuICgxKTsvKk51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyAqLworCisgIGlmICgoKmsyIC0gKmswKSA8IDApCisgICAgcmV0dXJuICgxKTsvKiBOdW1iZXIgb2YgYmFuZHMgaXMgbmVnYXRpdmUgKi8KKworCisgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCisgICAgICAgIFVDSEFSICAgICAqdl9rX21hc3RlciwKKyAgICAgICAgSU5UICAgICAgICpoX251bV9iYW5kcywKKyAgICAgICAgY29uc3QgSU5UICBrMCwKKyAgICAgICAgY29uc3QgSU5UICBrMiwKKyAgICAgICAgY29uc3QgSU5UICBmcmVxU2NhbGUsCisgICAgICAgIGNvbnN0IElOVCAgYWx0ZXJTY2FsZQorICAgICAgICApCisKK3sKKworICBJTlQgICAgIGJfcF9vID0gMDsgICAgICAgIC8qIGJhbmRzX3Blcl9vY3RhdmUgKi8KKyAgRklYUF9EQkwgd2FycCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBJTlQgICAgIGRrID0gMDsKKworICAvKiBJbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgSU5UICAgICBrMSA9IDAsIGk7CisgIElOVCAgICAgbnVtX2JhbmRzMDsKKyAgSU5UICAgICBudW1fYmFuZHMxOworICBJTlQgICAgIGRpZmZfdG90W01BWF9PQ1RBVkUgKyBNQVhfU0VDT05EX1JFR0lPTl07CisgIElOVCAgICAgKmRpZmYwID0gZGlmZl90b3Q7CisgIElOVCAgICAgKmRpZmYxID0gZGlmZl90b3QrTUFYX09DVEFWRTsKKyAgSU5UICAgICBrMl9hY2hpdmVkOworICBJTlQgICAgIGsyX2RpZmY7CisgIElOVCAgICAgaW5jciA9IDA7CisKKyAgLyogSW5pdCAqLworICBpZiAoZnJlcVNjYWxlPT0xKSAgYl9wX28gPSAxMjsKKyAgaWYgKGZyZXFTY2FsZT09MikgIGJfcF9vID0gMTA7CisgIGlmIChmcmVxU2NhbGU9PTMpICBiX3BfbyA9IDg7CisKKworICBpZihmcmVxU2NhbGUgPiAwKSAvKkJhcmsqLworICAgIHsKKyAgICAgIGlmKGFsdGVyU2NhbGU9PTApCisgICAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgICAgICAgIC8qIDEuMC8oMS4wKjIuMCkgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgd2FycCA9IEZMMkZYQ09OU1RfREJMKDEuMGYvMi42Zik7ICAgLyogMS4wLygxLjMqMi4wKTsgKi8KKworCisgICAgICBpZig0KmsyID49IDkqazApICAvKnR3byBvciBtb3JlIHJlZ2lvbnMgKGhvdyBtYW55IHRpbWVzIHRoZSBiYXNpcyBiYW5kIGlzIGNvcGllZCkqLworICAgICAgICB7CisgICAgICAgICAgazE9MiprMDsKKworICAgICAgICAgIG51bV9iYW5kczA9bnVtYmVyT2ZCYW5kcyhiX3BfbywgazAsIGsxLCBGTDJGWENPTlNUX0RCTCgwLjVmKSk7CisgICAgICAgICAgbnVtX2JhbmRzMT1udW1iZXJPZkJhbmRzKGJfcF9vLCBrMSwgazIsIHdhcnApOworCisgICAgICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOy8qQ2FsY0JhbmRzMSA9PiBkaWZmMCAqLworICAgICAgICAgIEZES3NickVuY19TaGVsbHNvcnRfaW50KCBkaWZmMCwgbnVtX2JhbmRzMCk7LypTb3J0QmFuZHMgc29ydCBkaWZmMCAqLworCisgICAgICAgICAgaWYgKGRpZmYwWzBdID09IDApIC8qIHRvbyB3aWRlIEZCIGJhbmRzIGZvciB0YXJnZXQgdHVuaW5nICovCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgxKTsvKiByYWlzZSB0aGUgY3Jvc3Mtb3ZlciBmcmVxdWVuY3kgYW5kL29yIGxvd2VyIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsgLyogY3Vtc3VtICovCisKKyAgICAgICAgICBDYWxjQmFuZHMoZGlmZjEsIGsxLCBrMiwgbnVtX2JhbmRzMSk7ICAgICAvKiBDYWxjQmFuZHMyID0+IGRpZmYxICovCisgICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYxLCBudW1fYmFuZHMxKTsgICAgICAgICAgICAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMSAqLworICAgICAgICAgIGlmKGRpZmYwW251bV9iYW5kczAtMV0gPiBkaWZmMVswXSkgICAgICAgIC8qIG1heCgxKSA+IG1pbigyKSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZihtb2RpZnlCYW5kcyhkaWZmMFtudW1fYmFuZHMwLTFdLGRpZmYxLCBudW1fYmFuZHMxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBBZGQgMiduZCByZWdpb24gKi8KKyAgICAgICAgICBjdW1TdW0oazEsIGRpZmYxLCBudW1fYmFuZHMxLCAmdl9rX21hc3RlcltudW1fYmFuZHMwXSk7CisgICAgICAgICAgKmhfbnVtX2JhbmRzPW51bV9iYW5kczArbnVtX2JhbmRzMTsgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworCisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogb25lIHJlZ2lvbiAqLworICAgICAgICB7CisgICAgICAgICAgazE9azI7CisKKyAgICAgICAgICBudW1fYmFuZHMwPW51bWJlck9mQmFuZHMoYl9wX28sIGswLCBrMSwgRkwyRlhDT05TVF9EQkwoMC41ZikpOworICAgICAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsvKiBDYWxjQmFuZHMxID0+IGRpZmYwICovCisgICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYwLCBudW1fYmFuZHMwKTsgICAgICAgLyogU29ydEJhbmRzIHNvcnQgZGlmZjAgKi8KKworICAgICAgICAgIGlmIChkaWZmMFswXSA9PSAwKSAvKiB0b28gd2lkZSBGQiBiYW5kcyBmb3IgdGFyZ2V0IHR1bmluZyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoMSk7IC8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsvKiBjdW1zdW0gKi8KKyAgICAgICAgICAqaF9udW1fYmFuZHM9bnVtX2JhbmRzMDsgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgLyogTGluZWFyIG1vZGUgKi8KKyAgICB7CisgICAgICBpZiAoYWx0ZXJTY2FsZT09MCkgeworICAgICAgICBkayA9IDE7CisgICAgICAgIG51bV9iYW5kczAgPSAyICogKChrMiAtIGswKS8yKTsgICAgICAgICAvKiBGTE9PUiB0byBnZXQgdG8gZmV3IG51bWJlciBvZiBiYW5kcyovCisgICAgICB9IGVsc2UgeworICAgICAgICBkayA9IDI7CisgICAgICAgIG51bV9iYW5kczAgPSAyICogKCgoazIgLSBrMCkvZGsgKzEpLzIpOyAvKiBST1VORCB0byBnZXQgY2xvc2VzdCBmaXQgKi8KKyAgICAgIH0KKworICAgICAgazJfYWNoaXZlZCA9IGswICsgbnVtX2JhbmRzMCpkazsKKyAgICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7CisKKyAgICAgIGZvcihpPTA7aTxudW1fYmFuZHMwO2krKykKKyAgICAgICAgZGlmZl90b3RbaV0gPSBkazsKKworICAgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpdmVkICovCisgICAgICAvKiBhbmQgd2UgZ290IHdpZGUgU0JSIGFyZSAqLworICAgICAgaWYgKGsyX2RpZmYgPCAwKSB7CisgICAgICAgICAgaW5jciA9IDE7CisgICAgICAgICAgaSA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLworICAgICAgLyogYW5kIHdlIGdvdCBzbWFsbCBTQlIgYXJlICovCisgICAgICBpZiAoazJfZGlmZiA+IDApIHsKKyAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgICAgaSA9IG51bV9iYW5kczAtMTsKKyAgICAgIH0KKworICAgICAgLyogQWRqdXN0IGRpZmYgdmVjdG9yIHRvIGdldCBzZXBjLiBTQlIgcmFuZ2UgKi8KKyAgICAgIHdoaWxlIChrMl9kaWZmICE9IDApIHsKKyAgICAgICAgZGlmZl90b3RbaV0gPSBkaWZmX3RvdFtpXSAtIGluY3I7CisgICAgICAgIGkgPSBpICsgaW5jcjsKKyAgICAgICAgazJfZGlmZiA9IGsyX2RpZmYgKyBpbmNyOworICAgICAgfQorCisgICAgICBjdW1TdW0oazAsIGRpZmZfdG90LCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsvKiBjdW1zdW0gKi8KKyAgICAgICpoX251bV9iYW5kcz1udW1fYmFuZHMwOyAgICAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCisKKyAgICB9CisKKyAgaWYgKCpoX251bV9iYW5kcyA8IDEpCisgICAgcmV0dXJuKDEpOyAvKlRvIHNtYWxsIHNiciBhcmVhICovCisKKyAgcmV0dXJuICgwKTsKK30vKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSAqLworCitzdGF0aWMgSU5UCitudW1iZXJPZkJhbmRzKElOVCBiX3BfbywgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgRklYUF9EQkwgd2FycF9mYWN0b3IpCit7CisgIElOVCByZXN1bHQ9MDsKKyAgLyogcmVzdWx0ID0gMiogKElOVCkgKCAoZG91YmxlKWJfcF9vICogKGRvdWJsZSkoRkRLbG9nKChkb3VibGUpc3RvcC8oZG91YmxlKXN0YXJ0KS9GREtsb2coKGRvdWJsZSkyKSkgKiAoZG91YmxlKUZYX0RCTDJGTCh3YXJwX2ZhY3RvcikgKyAwLjUpOyAqLworICByZXN1bHQgPSAoICggYl9wX28gKiBmTXVsdCggKENhbGNMZEludChzdG9wKSAtIENhbGNMZEludChzdGFydCkpLCAgd2FycF9mYWN0b3IpICsgKEZMMkZYX0RCTCgwLjVmKT4+TERfREFUQV9TSElGVCkKKyAgICAgICAgICAgICAgICkgPj4gKChERlJBQ1RfQklUUy0xKS1MRF9EQVRBX1NISUZUKSApIDw8IDE7IC8qIGRvIG5vdCBvcHRpbWl6ZSBhbnltb3JlIChyb3VuZGluZyEhKSAqLworCisgIHJldHVybihyZXN1bHQpOworfQorCisKK3N0YXRpYyB2b2lkCitDYWxjQmFuZHMoSU5UICogZGlmZiwgSU5UIHN0YXJ0ICwgSU5UIHN0b3AgLCBJTlQgbnVtX2JhbmRzKQoreworICAgIElOVCBpLCBxYiwgcWUsIHF0bXA7CisgICAgSU5UIHByZXZpb3VzOworICAgIElOVCBjdXJyZW50OworICAgIEZJWFBfREJMIGJhc2UsIGV4cCwgdG1wOworCisgICAgcHJldmlvdXM9c3RhcnQ7CisgICAgZm9yKGk9MTsgaTw9IG51bV9iYW5kczsgaSsrKQorICAgIHsKKyAgICAgICAgYmFzZSA9IGZEaXZOb3JtKChGSVhQX0RCTClzdG9wLCAoRklYUF9EQkwpc3RhcnQsICZxYik7CisgICAgICAgIGV4cCA9IGZEaXZOb3JtKChGSVhQX0RCTClpLCAoRklYUF9EQkwpbnVtX2JhbmRzLCAmcWUpOworICAgICAgICB0bXAgPSBmUG93KGJhc2UsIHFiLCBleHAsIHFlLCAmcXRtcCk7CisgICAgICAgIHRtcCA9IGZNdWx0KHRtcCwgKEZJWFBfREJMKShzdGFydDw8MjQpKTsKKyAgICAgICAgY3VycmVudCAgID0gKElOVClzY2FsZVZhbHVlKHRtcCwgcXRtcC0yMyk7CisgICAgICAgIGN1cnJlbnQgICA9IChjdXJyZW50KzEpID4+IDE7IC8qIHJvdW5kaW5nKi8KKyAgICAgICAgZGlmZltpLTFdID0gY3VycmVudC1wcmV2aW91czsKKyAgICAgICAgcHJldmlvdXMgID0gY3VycmVudDsKKyAgICB9CisKK30vKiBFbmQgQ2FsY0JhbmRzICovCisKKworc3RhdGljIHZvaWQKK2N1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCogZGlmZiwgSU5UIGxlbmd0aCwgIFVDSEFSICpzdGFydF9hZHJlc3MpCit7CisgIElOVCBpOworICBzdGFydF9hZHJlc3NbMF09c3RhcnRfdmFsdWU7CisgIGZvcihpPTE7aTw9bGVuZ3RoO2krKykKKyAgICBzdGFydF9hZHJlc3NbaV09c3RhcnRfYWRyZXNzW2ktMV0rZGlmZltpLTFdOworfSAvKiBFbmQgY3VtU3VtICovCisKKworc3RhdGljIElOVAorbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kX3ByZXZpb3VzLCBJTlQgKiBkaWZmLCBJTlQgbGVuZ3RoKQoreworICBJTlQgY2hhbmdlPW1heF9iYW5kX3ByZXZpb3VzLWRpZmZbMF07CisKKyAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdCBvbmUgKi8KKyAgaWYgKCBjaGFuZ2UgPiAoZGlmZltsZW5ndGgtMV0gLSBkaWZmWzBdKSAvIDIgKQorICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aC0xXSAtIGRpZmZbMF0pIC8gMjsKKworICBkaWZmWzBdICs9IGNoYW5nZTsKKyAgZGlmZltsZW5ndGgtMV0gLT0gY2hhbmdlOworICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludChkaWZmLCBsZW5ndGgpOworCisgIHJldHVybigwKTsKK30vKiBFbmQgbW9kaWZ5QmFuZHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19VcGRhdGVIaVJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBEZXNjcmlwdGlvbjoKKworCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19VcGRhdGVIaVJlcygKKyAgICAgICAgVUNIQVIgICAqaF9oaXJlcywKKyAgICAgICAgSU5UICAgICAqbnVtX2hpcmVzLAorICAgICAgICBVQ0hBUiAgICp2X2tfbWFzdGVyLAorICAgICAgICBJTlQgICAgICBudW1fbWFzdGVyLAorICAgICAgICBJTlQgICAgICp4b3Zlcl9iYW5kCisgICAgICAgICkKK3sKKyAgSU5UIGk7CisgIElOVCBtYXgxLG1heDI7CisKKyAgaWYoICh2X2tfbWFzdGVyWyp4b3Zlcl9iYW5kXSA+IDMyICkgfHwgLyogdl9rX21hc3RlclsqeG92ZXJfYmFuZF0gPiBub1FNRkNoYW5uZWxzKGR1YWxSYXRlKS9kaXZpZGVyICovCisgICAgICAoICp4b3Zlcl9iYW5kID4gbnVtX21hc3RlciApICkgIHsKKyAgICAgIC8qIHhvdmVyX2JhbmQgZXJyb3IsIHRvbyBiaWcgZm9yIHRoaXMgc3RhcnRGcmVxLiBXaWxsIGJlIGNsaXBwZWQgKi8KKworICAgIC8qIENhbGN1bGF0ZSBtYXhpbXVtIHZhbHVlIGZvciB4b3Zlcl9iYW5kICovCisgICAgbWF4MT0wOworICAgIG1heDI9bnVtX21hc3RlcjsKKyAgICB3aGlsZSggKHZfa19tYXN0ZXJbbWF4MSsxXSA8IDMyICkgJiYgLyogbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLworICAgICAgICAgICAoIChtYXgxKzEpIDwgbWF4MikgKQorICAgICAgeworICAgICAgICBtYXgxKys7CisgICAgICB9CisKKyAgICAqeG92ZXJfYmFuZD1tYXgxOworICB9CisKKyAgKm51bV9oaXJlcyA9IG51bV9tYXN0ZXIgLSAqeG92ZXJfYmFuZDsKKyAgZm9yKGkgPSAqeG92ZXJfYmFuZDsgaSA8PSBudW1fbWFzdGVyOyBpKyspCisgICAgeworICAgICAgaF9oaXJlc1tpIC0gKnhvdmVyX2JhbmRdID0gdl9rX21hc3RlcltpXTsKKyAgICB9CisKKyAgcmV0dXJuICgwKTsKK30vKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUhpUmVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfVXBkYXRlTG9SZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19VcGRhdGVMb1JlcyhVQ0hBUiAqIGhfbG9yZXMsIElOVCAqbnVtX2xvcmVzLCBVQ0hBUiAqIGhfaGlyZXMsIElOVCBudW1faGlyZXMpCit7CisgIElOVCBpOworCisgIGlmKG51bV9oaXJlcyUyID09IDApIC8qIGlmIGV2ZW4gbnVtYmVyIG9mIGhpcmVzIGJhbmRzICovCisgICAgeworICAgICAgKm51bV9sb3Jlcz1udW1faGlyZXMvMjsKKyAgICAgIC8qIFVzZSBldmVyeSBzZWNvbmQgbG9yZXM9aGlyZXNbMCwyLDQuLi5dICovCisgICAgICBmb3IoaT0wO2k8PSpudW1fbG9yZXM7aSsrKQorICAgICAgICBoX2xvcmVzW2ldPWhfaGlyZXNbaSoyXTsKKworICAgIH0KKyAgZWxzZSAgICAgICAgICAgIC8qIG9kZCBudW1iZXIgb2YgaGlyZXMgd2hpY2ggbWVhbnMgeG92ZXIgaXMgb2RkICovCisgICAgeworICAgICAgKm51bV9sb3Jlcz0obnVtX2hpcmVzKzEpLzI7CisKKyAgICAgIC8qIFVzZSBsb3Jlcz1oaXJlc1swLDEsMyw1IC4uLl0gKi8KKyAgICAgIGhfbG9yZXNbMF09aF9oaXJlc1swXTsKKyAgICAgIGZvcihpPTE7aTw9Km51bV9sb3JlcztpKyspCisgICAgICAgIHsKKyAgICAgICAgICBoX2xvcmVzW2ldPWhfaGlyZXNbaSoyLTFdOworICAgICAgICB9CisgICAgfQorCit9LyogRW5kIEZES3NickVuY19VcGRhdGVMb1JlcyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmggYi9hYWMvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJiYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmgKQEAgLTAsMCArMSwxMzcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBmcmVxdWVuY3kgc2NhbGUgcHJvdG90eXBlcyAgCisqLworI2lmbmRlZiBfX0ZSRVFfU0NBMl9ICisjZGVmaW5lIF9fRlJFUV9TQ0EyX0gKKworI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisjaW5jbHVkZSAic2JyX2RlZi5oIgorCisjZGVmaW5lIE1BWF9PQ1RBVkUgICAgICAgIDI5CisjZGVmaW5lIE1BWF9TRUNPTkRfUkVHSU9OIDUwCisKKworSU5UCitGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKAorICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgSU5UICAgKmhfbnVtX2JhbmRzLAorICAgICAgICBjb25zdCAgSU5UIGswLAorICAgICAgICBjb25zdCAgSU5UIGsyLAorICAgICAgICBjb25zdCAgSU5UIGZyZXFfc2NhbGUsCisgICAgICAgIGNvbnN0ICBJTlQgYWx0ZXJfc2NhbGUKKyAgICAgICAgKTsKKworSU5UCitGREtzYnJFbmNfVXBkYXRlSGlSZXMoCisgICAgICAgIFVDSEFSICpoX2hpcmVzLAorICAgICAgICBJTlQgICAqbnVtX2hpcmVzLAorICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgSU5UICAgIG51bV9tYXN0ZXIsCisgICAgICAgIElOVCAgICp4b3Zlcl9iYW5kCisgICAgICAgICk7CisKK3ZvaWQgIEZES3NickVuY19VcGRhdGVMb1JlcygKKyAgICAgICAgVUNIQVIgKnZfbG9yZXMsCisgICAgICAgIElOVCAgICpudW1fbG9yZXMsCisgICAgICAgIFVDSEFSICp2X2hpcmVzLAorICAgICAgICBJTlQgICAgbnVtX2hpcmVzCisgICAgICAgICk7CisKK0lOVAorRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKAorICAgICAgICBjb25zdCBJTlQgc3JTYnIsCisgICAgICAgIGNvbnN0IElOVCBzckNvcmUsCisgICAgICAgIGNvbnN0IElOVCBub0NoYW5uZWxzLAorICAgICAgICBjb25zdCBJTlQgc3RhcnRGcmVxLAorICAgICAgICBjb25zdCBJTlQgc3RvcF9mcmVxLAorICAgICAgICBJTlQgKmswLAorICAgICAgICBJTlQgKmsyCisgICAgICAgICk7CisKK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXIChJTlQgc3RhcnRGcmVxLCBJTlQgZnNDb3JlKTsKK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcgIChJTlQgc3RvcEZyZXEsIElOVCBmc0NvcmUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU0JSZW5jL3NyYy90b25fY29yci5jcHAgYi9hYWMvbGliU0JSZW5jL3NyYy90b25fY29yci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcApAQCAtMCwwICsxLDg4MSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJ0b25fY29yci5oIgorCisjaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicl9taXNjLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIFNlbmQgYXV0b0NvcnJTZWNvbmRPcmRlciB0byBtbGZpbGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiBDYWxjdWxhdGVzIHRoZSB0b25hbCB0byBub2lzZSByYXRpb24gZm9yIGRpZmZlcmVudCBmcmVxdWVuY3kgYmFuZHMKKyAgIGFuZCB0aW1lIHNlZ21lbnRzLgorCisgICBUaGUgcmF0aW8gYmV0d2VlbiB0aGUgcHJlZGljdGVkIGVuZXJneSAodG9uYWwgZW5lcmd5IEEpIGFuZCB0aGUgdG90YWwKKyAgIGVuZXJneSAoQSArIEIpIGlzIGNhbGN1bGF0ZWQuIFRoaXMgaXMgY29udmVydGVkIHRvIHRoZSByYXRpbyBiZXR3ZWVuCisgICB0aGUgcHJlZGljdGVkIGVuZXJneSAodG9uYWwgZW5lcmd5IEEpIGFuZCB0aGUgbm9uLXByZWRpY3RhYmxlIGVuZXJneQorICAgKG5vaXNlIGVuZXJneSBCKS4gSGVuY2UgdGhlIHF1b3RhLW1hdHJpeCBjb250YWlucyBBL0IgPSBxLygxLXEpLgorCisgICBUaGUgc2FtcGxlcyBpbiBucmdWZWN0b3IgYXJlIHNjYWxlZCBieSAxLjAvMTYuMAorCQlUaGUgc2FtcGxlcyBpbiBwTnJnVmVjdG9yRnJlcQlhcmUgc2NhbGVkIGJ5IDEuMC8yLjAKKyAgIFRoZSBzYW1wbGVzIGluIHF1b3RhTWF0cml4IGFyZSBzY2FsZWQgYnkgUkVMQVhBVElPTgorCisgIFxyZXR1cm4gbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKCBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgICAgICAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHNvdXJjZUJ1ZmZlclJlYWwsICAvKiE8IFRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRi1tYXRyaXguICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHNvdXJjZUJ1ZmZlckltYWcsICAvKiE8IFRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GLW1hdHJpeC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlciBzaWRlIGJhbmQsIGhpZ2hlc3QgKyAxIFFNRiBiYW5kIGluIHRoZSBTQlIgcmFuZ2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBxbWZTY2FsZSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgIElOVCAgICAgaSwgaywgciwgcjIsIHRpbWVJbmRleCwgYXV0b0NvcnJTY2FsaW5nOworCisgIElOVCAgICAgc3RhcnRJbmRleE1hdHJpeCAgPSBoVG9uQ29yci0+c3RhcnRJbmRleE1hdHJpeDsKKyAgSU5UICAgICB0b3ROb0VzdCAgICAgICAgICA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlczsKKyAgSU5UICAgICBub0VzdFBlckZyYW1lICAgICA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOworICBJTlQgICAgIG1vdmUgICAgICAgICAgICAgID0gaFRvbkNvcnItPm1vdmU7CisgIElOVCAgICAgbm9RbWZDaGFubmVscyAgICAgPSBoVG9uQ29yci0+bm9RbWZDaGFubmVsczsgICAgIC8qIE51bWVyIG9mIEJhbmRzICovCisgIElOVCAgICAgYnVmZkxlbiAgICAgICAgICAgPSBoVG9uQ29yci0+YnVmZmVyTGVuZ3RoOyAgICAgIC8qIE51bWVyIG9mIFNsb3RzICovCisgIElOVCAgICAgc3RlcFNpemUgICAgICAgICAgPSBoVG9uQ29yci0+c3RlcFNpemU7CisgIElOVCAgICAqcEJsb2NrTGVuZ3RoICAgICAgPSBoVG9uQ29yci0+bHBjTGVuZ3RoOworICBJTlQqKiAgIFJFU1RSSUNUIHNpZ25NYXRyaXggICAgICAgID0gaFRvbkNvcnItPnNpZ25NYXRyaXg7CisgIEZJWFBfREJMKiBSRVNUUklDVCAgbnJnVmVjdG9yICAgICAgPSBoVG9uQ29yci0+bnJnVmVjdG9yOworICBGSVhQX0RCTCoqIFJFU1RSSUNUIHF1b3RhTWF0cml4ICAgID0gaFRvbkNvcnItPnF1b3RhTWF0cml4OworICBGSVhQX0RCTCogIFJFU1RSSUNUIHBOcmdWZWN0b3JGcmVxID0gaFRvbkNvcnItPm5yZ1ZlY3RvckZyZXE7CisKKyNkZWZpbmUgQkFORF9WX1NJWkUgUU1GX01BWF9USU1FX1NMT1RTCisjZGVmaW5lIE5VTV9WX0NPTUJJTkUgOCAvKiBNdXN0IGJlIGEgZGl2aXNvciBvZiA2NCBhbmQgZnVsZmlsbCB0aGUgQVNTRVJUcyBiZWxvdyAqLworCisgIEZJWFBfREJMICpyZWFsQnVmOworICBGSVhQX0RCTCAqaW1hZ0J1ZjsKKworICBGSVhQX0RCTCAgYWxwaGFyWzJdLGFscGhhaVsyXSxmYWM7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFjLCBBQ09SUl9DT0VGUywgMSk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChyZWFsQnVmUmVmLCBGSVhQX0RCTCwgMipCQU5EX1ZfU0laRSpOVU1fVl9DT01CSU5FKTsKKworICByZWFsQnVmID0gcmVhbEJ1ZlJlZjsKKyAgaW1hZ0J1ZiA9IHJlYWxCdWYgKyBCQU5EX1ZfU0laRSpOVU1fVl9DT01CSU5FOworCisKKyAgRkRLX0FTU0VSVChidWZmTGVuIDw9IEJBTkRfVl9TSVpFKTsKKyAgRkRLX0FTU0VSVChzaXplb2YoRklYUF9EQkwpKk5VTV9WX0NPTUJJTkUqQkFORF9WX1NJWkUqMiA8ICgxMDI0KnNpemVvZihGSVhQX0RCTCktc2l6ZW9mKEFDT1JSX0NPRUZTKSkgKTsKKworICAvKgorICAgKiBCdWZmZXJpbmcgb2YgdGhlIHF1b3RhTWF0cml4IGFuZCB0aGUgcXVvdGFNYXRyaXhUcmFuc3AuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGZvcihpID0gIDAgOyBpIDwgbW92ZTsgaSsrKXsKKyAgICBGREttZW1jcHkocXVvdGFNYXRyaXhbaV0scXVvdGFNYXRyaXhbaSArIG5vRXN0UGVyRnJhbWVdLG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkoc2lnbk1hdHJpeFtpXSxzaWduTWF0cml4W2kgKyBub0VzdFBlckZyYW1lXSxub1FtZkNoYW5uZWxzICogc2l6ZW9mKElOVCkpOworICB9CisKKyAgRkRLbWVtbW92ZShucmdWZWN0b3IsbnJnVmVjdG9yK25vRXN0UGVyRnJhbWUsbW92ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIobnJnVmVjdG9yK3N0YXJ0SW5kZXhNYXRyaXgsKHRvdE5vRXN0LXN0YXJ0SW5kZXhNYXRyaXgpKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihwTnJnVmVjdG9yRnJlcSxub1FtZkNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgLyoKKyAgICogQ2FsY3VsYXRlIHRoZSBxdW90YXMgZm9yIHRoZSBjdXJyZW50IHRpbWUgc3RlcHMuCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBmb3IgKHIgPSAwOyByIDwgdXNiOyByKyspCisgIHsKKyAgICBpbnQgYmxvY2tMZW5ndGg7CisKKyAgICBrID0gaFRvbkNvcnItPm5leHRTYW1wbGU7IC8qIHN0YXJ0U2FtcGxlICovCisgICAgdGltZUluZGV4ID0gc3RhcnRJbmRleE1hdHJpeDsKKyAgICAvKiBDb3B5IGFzIG1hbnkgYXMgcG9zc2libGUgQmFuZCBhY2Nyb3NzIGFsbCBTbG90cyBhdCBvbmNlICovCisgICAgaWYgKHJlYWxCdWYgIT0gcmVhbEJ1ZlJlZikgeworICAgICAgcmVhbEJ1ZiAtPSBCQU5EX1ZfU0laRTsKKyAgICAgIGltYWdCdWYgLT0gQkFORF9WX1NJWkU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlYWxCdWYgKz0gQkFORF9WX1NJWkUqKE5VTV9WX0NPTUJJTkUtMSk7CisgICAgICBpbWFnQnVmICs9IEJBTkRfVl9TSVpFKihOVU1fVl9DT01CSU5FLTEpOworICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZMZW47IGkrKykgeworICAgICAgICBpbnQgdjsKKyAgICAgICAgRklYUF9EQkwgKnB0cjsKKyAgICAgICAgcHRyID0gcmVhbEJ1ZitpOworICAgICAgICBmb3IgKHY9MDsgdjxOVU1fVl9DT01CSU5FOyB2KyspCisgICAgICAgIHsKKyAgICAgICAgICBwdHJbMF0gPSBzb3VyY2VCdWZmZXJSZWFsW2ldW3Irdl07CisgICAgICAgICAgcHRyWzArQkFORF9WX1NJWkUqTlVNX1ZfQ09NQklORV0gPSBzb3VyY2VCdWZmZXJJbWFnW2ldW3Irdl07CisgICAgICAgICAgcHRyIC09IEJBTkRfVl9TSVpFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYmxvY2tMZW5ndGggPSBwQmxvY2tMZW5ndGhbMF07CisKKyAgICB3aGlsZShrIDw9IGJ1ZmZMZW4gLSBibG9ja0xlbmd0aCkKKyAgICB7CisgICAgICBhdXRvQ29yclNjYWxpbmcgPSBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IoJnJlYWxCdWZbay1MUENfT1JERVJdLCBMUENfT1JERVIrYmxvY2tMZW5ndGgpLCBnZXRTY2FsZWZhY3RvcigmaW1hZ0J1ZltrLUxQQ19PUkRFUl0sIExQQ19PUkRFUitibG9ja0xlbmd0aCkpOworICAgICAgYXV0b0NvcnJTY2FsaW5nID0gZml4TWF4KDAsIGF1dG9Db3JyU2NhbGluZy0xKTsKKworICAgICAgc2NhbGVWYWx1ZXMoJnJlYWxCdWZbay1MUENfT1JERVJdLCBMUENfT1JERVIrYmxvY2tMZW5ndGgsIGF1dG9Db3JyU2NhbGluZyk7CisgICAgICBzY2FsZVZhbHVlcygmaW1hZ0J1ZltrLUxQQ19PUkRFUl0sIExQQ19PUkRFUitibG9ja0xlbmd0aCwgYXV0b0NvcnJTY2FsaW5nKTsKKworICAgICAgYXV0b0NvcnJTY2FsaW5nIDw8PSAxOyAvKiBjb25zaWRlciBxbWYgYnVmZmVyIHNjYWxpbmcgdHdpY2UgKi8KKyAgICAgIGF1dG9Db3JyU2NhbGluZyArPSBhdXRvQ29ycjJuZF9jcGx4ICggYWMsIHJlYWxCdWYraywgaW1hZ0J1ZitrLCBibG9ja0xlbmd0aCApOworCisKKyAgICAgIGlmKGFjLT5kZXQgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgICBhbHBoYXJbMV0gPSBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICBhbHBoYXJbMF0gPSAoYWMtPnIwMXIpPj4yOworICAgICAgICBhbHBoYWlbMF0gPSAoYWMtPnIwMWkpPj4yOworCisgICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgYWMtPnIxMXIpPj4xOworICAgICAgfQorICAgICAgZWxzZXsKKyAgICAgICAgYWxwaGFyWzFdID0gKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPnIxMnIpPj4xKSAtIChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5yMTJpKT4+MSkgLSAoZk11bHREaXYyKGFjLT5yMDJyLCBhYy0+cjExcik+PjEpOworICAgICAgICBhbHBoYWlbMV0gPSAoZk11bHREaXYyKGFjLT5yMDFpLCBhYy0+cjEycik+PjEpICsgKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPnIxMmkpPj4xKSAtIChmTXVsdERpdjIoYWMtPnIwMmksIGFjLT5yMTFyKT4+MSk7CisKKyAgICAgICAgYWxwaGFyWzBdID0gKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPmRldCk+PihhYy0+ZGV0X3NjYWxlKzEpKSArIGZNdWx0KGFscGhhclsxXSwgYWMtPnIxMnIpICsgZk11bHQoYWxwaGFpWzFdLCBhYy0+cjEyaSk7CisgICAgICAgIGFscGhhaVswXSA9IChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5kZXQpPj4oYWMtPmRldF9zY2FsZSsxKSkgKyBmTXVsdChhbHBoYWlbMV0sIGFjLT5yMTJyKSAtIGZNdWx0KGFscGhhclsxXSwgYWMtPnIxMmkpOworCisgICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgZk11bHQoYWMtPmRldCwgYWMtPnIxMXIpKT4+KGFjLT5kZXRfc2NhbGUrMSk7CisgICAgICB9CisKKyAgICAgIGlmKGZhYyA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgc2lnbk1hdHJpeFt0aW1lSW5kZXhdW3JdID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBxdW90YU1hdHJpeCBpcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIFJFTEFYQVRJT04KKyAgICAgICAgICAgcGFyc2UgUkVMQVhBVElPTiBpbiBmcmFjdGlvbmFsIHBhcnQgYW5kIHNoaWZ0IGZhY3RvcjogMS8oMS8wLjUyNDI4OCAqIDJeUkVMQVhBVElPTl9TSElGVCkgKi8KKyAgICAgICAgRklYUF9EQkwgdG1wLG51bSxkZW5vbTsKKyAgICAgICAgSU5UIG51bVNoaWZ0LGRlbm9tU2hpZnQsY29tbW9uU2hpZnQ7CisgICAgICAgIElOVCBzaWduOworCisgICAgICAgIG51bSA9IGZNdWx0RGl2MihhbHBoYXJbMF0sIGFjLT5yMDFyKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFjLT5yMDFpKSAtIGZNdWx0RGl2MihhbHBoYXJbMV0sIGZNdWx0KGFjLT5yMDJyLCBhYy0+cjExcikpIC0gZk11bHREaXYyKGFscGhhaVsxXSwgZk11bHQoYWMtPnIwMmksIGFjLT5yMTFyKSk7CisgICAgICAgIG51bSA9IGZpeHBfYWJzKG51bSk7CisKKyAgICAgICAgZGVub20gPSAoZmFjPj4xKSArIChmTXVsdERpdjIoZmFjLFJFTEFYQVRJT05fRlJBQ1QpPj5SRUxBWEFUSU9OX1NISUZUKSAtIG51bTsKKyAgICAgICAgZGVub20gPSBmaXhwX2FicyhkZW5vbSk7CisKKyAgICAgICAgbnVtID0gZk11bHQobnVtLFJFTEFYQVRJT05fRlJBQ1QpOworCisgICAgICAgIG51bVNoaWZ0ID0gQ291bnRMZWFkaW5nQml0cyhudW0pIC0gMjsKKyAgICAgICAgbnVtID0gc2NhbGVWYWx1ZShudW0sIG51bVNoaWZ0KTsKKworICAgICAgICBkZW5vbVNoaWZ0ID0gQ291bnRMZWFkaW5nQml0cyhkZW5vbSk7CisgICAgICAgIGRlbm9tID0gKEZJWFBfREJMKWRlbm9tIDw8IGRlbm9tU2hpZnQ7CisKKyAgICAgICAgaWYgKChudW0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGRlbm9tICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgICAgIGNvbW1vblNoaWZ0ID0gZml4TWluKG51bVNoaWZ0IC0gZGVub21TaGlmdCArIFJFTEFYQVRJT05fU0hJRlQsIERGUkFDVF9CSVRTLTEpOworICAgICAgICAgIGlmIChjb21tb25TaGlmdCA8IDApIHsKKyAgICAgICAgICAgIGNvbW1vblNoaWZ0ID0gLWNvbW1vblNoaWZ0OworICAgICAgICAgICAgdG1wID0gc2NodXJfZGl2KG51bSxkZW5vbSwxNik7CisgICAgICAgICAgICBjb21tb25TaGlmdCA9IGZpeE1pbihjb21tb25TaGlmdCxDb3VudExlYWRpbmdCaXRzKHRtcCkpOworICAgICAgICAgICAgcXVvdGFNYXRyaXhbdGltZUluZGV4XVtyXSA9IHRtcCA8PCBjb21tb25TaGlmdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBxdW90YU1hdHJpeFt0aW1lSW5kZXhdW3JdID0gc2NodXJfZGl2KG51bSxkZW5vbSwxNikgPj4gY29tbW9uU2hpZnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhYy0+cjExciAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgIGlmICggICggKGFjLT5yMDFyID49IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgJiYgKCBhYy0+cjExciA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApICkKKyAgICAgICAgICAgICAgfHwoIChhYy0+cjAxciA8ICBGTDJGWENPTlNUX0RCTCgwLjBmKSApICYmICggYWMtPnIxMXIgPCAgRkwyRlhDT05TVF9EQkwoMC4wZikgKSApICApIHsKKyAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZihzaWduIDwgMCkgeworICAgICAgICAgIHIyID0gcjsgICAgICAgLyogKElOVCkgcG93KC0xLCBiYW5kKTsgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICByMiA9IHIgKyAxOyAgIC8qIChJTlQpIHBvdygtMSwgYmFuZCsxKTsgKi8KKyAgICAgICAgfQorICAgICAgICBzaWduTWF0cml4W3RpbWVJbmRleF1bcl0gPSAxIC0gMioocjIgJiAweDEpOworICAgICAgfQorCisgICAgICBucmdWZWN0b3JbdGltZUluZGV4XSArPSAoKGFjLT5yMDByKSA+PiBmaXhNaW4oREZSQUNUX0JJVFMtMSwoMipxbWZTY2FsZSthdXRvQ29yclNjYWxpbmcgKyBTQ0FMRV9OUkdWRUMpKSk7CisgICAgICAvKiBwTnJnVmVjdG9yRnJlcVtyXSBmaW5hbGx5IGhhcyB0byBiZSBkaXZpZGVkIGJ5IG5vRXN0UGVyRnJhbWUsIHJlcGxhY2VkIGRpdmlzaW9uIGJ5IHNoaWZ0aW5nIHdpdGggb25lICovCisgICAgICBwTnJnVmVjdG9yRnJlcVtyXSA9IHBOcmdWZWN0b3JGcmVxW3JdICsgKChhYy0+cjAwcikgPj4gZml4TWluKERGUkFDVF9CSVRTLTEsKDIqcW1mU2NhbGUrYXV0b0NvcnJTY2FsaW5nICsgU0NBTEVfTlJHVkVDKSkpOworCisgICAgICBibG9ja0xlbmd0aCA9IHBCbG9ja0xlbmd0aFsxXTsKKyAgICAgIGsgKz0gc3RlcFNpemU7CisgICAgICB0aW1lSW5kZXgrKzsKKyAgICB9CisgIH0KKworCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocmVhbEJ1ZiwgRklYUF9EQkwsIDIqQkFORF9WX1NJWkUqTlVNX1ZfQ09NQklORSk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoYWMsIEFDT1JSX0NPRUZTLCAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiBFeHRyYWN0cyB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCBpbiB0aGUgZGVjb2RlciB0byBvYnRhaW4gdGhlCisgIGNvcnJlY3QgdG9uYWwgdG8gbm9pc2UgcmF0aW8gYWZ0ZXIgU0JSLgorCisgIEVzdGltYXRlcyB0aGUgdG9uYWwgdG8gbm9pc2UgcmF0aW8gb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCAodXNpbmcgTFBDKS4KKyAgUHJlZGljdHMgdGhlIHRvbmFsIHRvIG5vaXNlIHJhdGlvbiBvZiB0aGUgU0JSIHNpZ25hbCAoaW4gdGhlIGRlY29kZXIpIGJ5CisgIHBhdGNoaW5nIHRoZSB0b25hbCB0byBub2lzZSByYXRpbyB2YWx1ZXMgc2ltaWxhciB0byB0aGUgcGF0Y2hpbmcgb2YgdGhlCisgIGxvd2JhbmQgaW4gdGhlIGRlY29kZXIuIEdpdmVuIHRoZSB0b25hbCB0byBub2lzZSByYXRpbyBvZiB0aGUgb3JpZ2luYWwKKyAgYW5kIHRoZSBTQlIgc2lnbmFsLCBpdCBlc3RpbWF0ZXMgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiBpbnZlcnNlIGZpbHRlcmluZywKKyAgYWRkaXRpb25hbCBub2lzZSBhcyB3ZWxsIGFzIGFueSBhZGRpdGlvbmFsIHNpbmVzLgorCisgIFxyZXR1cm4gbm9uZS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19Ub25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUqIGluZlZlYywgICAgICAgICAgICAgICAvKiE8IFZlY3RvciB3aGVyZSB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzIHdpbGwgYmUgc3RvcmVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBub2lzZUxldmVscywgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIG5vaXNlIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogbWlzc2luZ0hhcm1vbmljRmxhZywgICAgICAgIC8qITwgRmxhZyBzZXQgdG8gb25lIG9yIHplcm8sIGRlcGVuZGVudCBvbiBpZiBhbnkgc3Ryb25nIHNpbmVzIGFyZSBtaXNzaW5nLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqIG1pc3NpbmdIYXJtb25pY3NJbmRleCwgICAvKiE8IFZlY3RvciBpbmRpY2F0aW5nIHdoZXJlIHNpbmVzIGFyZSBtaXNzaW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKiBlbnZlbG9wZUNvbXBlbnNhdGlvbiwgICAgLyohPCBWZWN0b3IgdG8gc3RvcmUgY29tcGVuc2F0aW9uIHZhbHVlcyBmb3IgdGhlIGVuZXJnaWVzIGluLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lSW5mbywgLyohPCBGcmFtZSBpbmZvIHN0cnVjdCwgY29udGFpbnMgdGhlIHRpbWUgYW5kIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogdHJhbnNpZW50SW5mbywgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBpbmZvLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogZnJlcUJhbmRUYWJsZSwgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlcyBmb3IgaGlnaC1yZXMuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGZvciBoaWdoLXJlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQT1NfTU9ERSB4cG9zVHlwZSwgICAgICAgICAgICAgIC8qITwgVHlwZSBvZiB0cmFuc3Bvc2VyIHVzZWQgaW4gdGhlIGRlY29kZXIuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgSU5UIGJhbmQ7CisgIElOVCB0cmFuc2llbnRGbGFnID0gdHJhbnNpZW50SW5mb1sxXSA7ICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuICovCisgIElOVCB0cmFuc2llbnRQb3MgID0gdHJhbnNpZW50SW5mb1swXTsgICAgIC8qITwgUG9zaXRpb24gb2YgdGhlIHRyYW5zaWVudC4qLworICBJTlQgdHJhbnNpZW50RnJhbWUsIHRyYW5zaWVudEZyYW1lSW52ZkVzdDsKKyAgSU5WRl9NT0RFKiBpbmZWZWNQdHI7CisKKworICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGZyYW1lIHdoZXJlIGEgdHJhbnNpZW50IHN0YXJ0cy4uLgorCisgIFRoZSBkZXRlY3Rpb24gb2Ygbm9pc2UtZmxvb3IsIG1pc3NpbmcgaGFybW9uaWNzIGFuZCBpbnZmX2VzdCwgaXMgbm90IGluIHN5bmMgZm9yIHRoZQorICBub24tYnVmLW9wdCBkZWNvZGVyIHN1Y2ggYXMgQUFDLiBIZW5jZSB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb24gdGhlIHRyYW5zaWVudCBpbiB0aGUKKyAgcHJlc2VudCBmcmFtZSBhcyB3ZWxsIGFzIGluIHRoZSBuZXh0LgorICAqLworICB0cmFuc2llbnRGcmFtZSA9IDA7CisgIGlmKGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUpeyAgICAgICAvKiBUaGUgdHJhbnNpZW50IHdhcyBkZXRlY3RlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUsIGJ1dCBpcyBhY3R1YWxseSAqLworICAgIHRyYW5zaWVudEZyYW1lID0gMTsKKyAgICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKKworICAgIGlmKHRyYW5zaWVudEZsYWcpeworICAgICAgaWYodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA+PSBmcmFtZUluZm8tPmJvcmRlcnNbZnJhbWVJbmZvLT5uRW52ZWxvcGVzXSl7CisgICAgICAgIGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUgPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNleworICAgIGlmKHRyYW5zaWVudEZsYWcpeworICAgICAgaWYodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA8IGZyYW1lSW5mby0+Ym9yZGVyc1tmcmFtZUluZm8tPm5FbnZlbG9wZXNdKXsKKyAgICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOworICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2V7CisgICAgICAgIGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUgPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICB0cmFuc2llbnRGcmFtZUludmZFc3QgPSB0cmFuc2llbnRGcmFtZTsKKworCisgIC8qCisgICAgRXN0aW1hdGUgdGhlIHJlcXVpcmVkIGludmVzZSBmaWx0ZXJlaW5nIGxldmVsLgorICAqLworICBpZiAoaFRvbkNvcnItPnN3aXRjaEludmVyc2VGaWx0KQorICAgIEZES3NickVuY19xbWZJbnZlcnNlRmlsdGVyaW5nRGV0ZWN0b3IoJmhUb25Db3JyLT5zYnJJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPnF1b3RhTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm5yZ1ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5pbmRleFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgKyBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudEZyYW1lSW52ZkVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZlZlYyk7CisKKyAgLyoKKyAgICAgIERldGVjdCB3aGF0IHRvbmVzIHdpbGwgYmUgbWlzc2luZy4KKyAgICovCisgIGlmICh4cG9zVHlwZSA9PSBYUE9TX0xDICl7CisgICAgRkRLc2JyRW5jX1Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvclFtZigmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5xdW90YU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5zaWduTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNzSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlQ29tcGVuc2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm5yZ1ZlY3RvckZyZXEpOworICB9CisgIGVsc2V7CisgICAgKm1pc3NpbmdIYXJtb25pY0ZsYWcgPSAwOworICAgIEZES21lbWNsZWFyKG1pc3NpbmdIYXJtb25pY3NJbmRleCxuU2ZiKnNpemVvZihVQ0hBUikpOworICB9CisKKworCisgIC8qCisgICAgTm9pc2UgZmxvb3IgZXN0aW1hdGlvbgorICAqLworCisgIGluZlZlY1B0ciA9IGhUb25Db3JyLT5zYnJJbnZGaWx0LnByZXZJbnZmTW9kZTsKKworICBGREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKCZoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUxldmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptaXNzaW5nSGFybW9uaWNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mVmVjUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKKworCisgIC8qIFN0b3JlIHRoZSBpbnZmVmVjIGRhdGEgZm9yIHRoZSBuZXh0IGZyYW1lLi4uKi8KKyAgZm9yKGJhbmQgPSAwIDsgYmFuZCA8IGhUb25Db3JyLT5zYnJJbnZGaWx0Lm5vRGV0ZWN0b3JCYW5kczsgYmFuZCsrKXsKKyAgICBoVG9uQ29yci0+c2JySW52RmlsdC5wcmV2SW52Zk1vZGVbYmFuZF0gPSBpbmZWZWNbYmFuZF07CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgU2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IG1hdGNoIGluIHRoZSBmcmVxdWVuY3kgbWFzdGVyIHRhYmxlLgorCisKKworICBccmV0dXJuICAgY2xvc2VzdCBlbnRyeS4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK2ZpbmRDbG9zZXN0RW50cnkoSU5UIGdvYWxTYiwKKyAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgIElOVCBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgIElOVCBkaXJlY3Rpb24pCit7CisgIElOVCBpbmRleDsKKworICBpZiggZ29hbFNiIDw9IHZfa19tYXN0ZXJbMF0gKQorICAgIHJldHVybiB2X2tfbWFzdGVyWzBdOworCisgIGlmKCBnb2FsU2IgPj0gdl9rX21hc3RlcltudW1NYXN0ZXJdICkKKyAgICByZXR1cm4gdl9rX21hc3RlcltudW1NYXN0ZXJdOworCisgIGlmKGRpcmVjdGlvbikgeworICAgIGluZGV4ID0gMDsKKyAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IgKSB7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRleCA9IG51bU1hc3RlcjsKKyAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPiBnb2FsU2IgKSB7CisgICAgICBpbmRleC0tOworICAgIH0KKyAgfQorCisgIHJldHVybiB2X2tfbWFzdGVyW2luZGV4XTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICByZXNldHMgdGhlIHBhdGNoCisKKworCisgIFxyZXR1cm4gICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgc3VjY2Vzc2Z1bC4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQKK3Jlc2V0UGF0Y2goSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICBJTlQgeHBvc2N0cmwsICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgICAgICAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgIC8qITwgU3RhcnQgYmFuZCBvZiB0aGUgU0JSIHJhbmdlLiAqLworICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlIGFyZSBkZXJpdmVkLiovCisgICAgICAgICAgIElOVCBudW1NYXN0ZXIsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hc3RlciB0YWJsZS4gKi8KKyAgICAgICAgICAgSU5UIGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KKyAgICAgICAgICAgSU5UIG5vQ2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYtY2hhbm5lbHMuICovCit7CisgIElOVCBwYXRjaCxrLGk7CisgIElOVCB0YXJnZXRTdG9wQmFuZDsKKworICBQQVRDSF9QQVJBTSAgKnBhdGNoUGFyYW0gPSBoVG9uQ29yci0+cGF0Y2hQYXJhbTsKKworICBJTlQgc2JHdWFyZCA9IGhUb25Db3JyLT5ndWFyZDsKKyAgSU5UIHNvdXJjZVN0YXJ0QmFuZDsKKyAgSU5UIHBhdGNoRGlzdGFuY2U7CisgIElOVCBudW1CYW5kc0luUGF0Y2g7CisKKyAgSU5UIGxzYiA9IHZfa19tYXN0ZXJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93ZXN0IHN1YmJhbmQgcmVsYXRlZCB0byB0aGUgc3ludGhlc2lzIGZpbHRlcmJhbmsgKi8KKyAgSU5UIHVzYiA9IHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsgICAgICAgICAgICAgICAgICAgLyogU3RvcCBzdWJiYW5kIHJlbGF0ZWQgdG8gdGhlIHN5bnRoZXNpcyBmaWx0ZXJiYW5rICovCisgIElOVCB4b3Zlck9mZnNldCA9IGhpZ2hCYW5kU3RhcnRTYiAtIHZfa19tYXN0ZXJbMF07IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBzdWJiYW5kcyBiZXR3ZWVuIGswIGFuZCBreCAqLworCisgIElOVCBnb2FsU2I7CisKKworICAvKgorICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKKyAgICovCisKKyAgaWYgKHhwb3NjdHJsID09IDEpIHsKKyAgICBsc2IgKz0geG92ZXJPZmZzZXQ7CisgICAgeG92ZXJPZmZzZXQgPSAwOworICB9CisKKyAgZ29hbFNiID0gKElOVCkoICgyICogbm9DaGFubmVscyAqIDE2MDAwICsgKGZzPj4xKSkgLyBmcyApOyAvKiAxNiBrSHogYmFuZCAqLworICBnb2FsU2IgPSBmaW5kQ2xvc2VzdEVudHJ5KGdvYWxTYiwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAxKTsgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLworCisgIC8qIEZpcnN0IHBhdGNoICovCisgIHNvdXJjZVN0YXJ0QmFuZCA9IGhUb25Db3JyLT5zaGlmdFN0YXJ0U2IgKyB4b3Zlck9mZnNldDsKKyAgdGFyZ2V0U3RvcEJhbmQgPSBsc2IgKyB4b3Zlck9mZnNldDsKKworICAvKiBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgbXVzdCBiZSBwYXRjaGVkIHRvIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCAqLworICBwYXRjaCA9IDA7CisgIHdoaWxlKHRhcmdldFN0b3BCYW5kIDwgdXNiKSB7CisKKyAgICAvKiBUbyBtYW55IHBhdGNoZXMgKi8KKyAgICBpZiAocGF0Y2ggPj0gTUFYX05VTV9QQVRDSEVTKQorICAgICAgcmV0dXJuKDEpOyAvKk51bWJlciBvZiBwYXRjaGVzIHRvIGhpZ2ggKi8KKworICAgIHBhdGNoUGFyYW1bcGF0Y2hdLmd1YXJkU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CisgICAgdGFyZ2V0U3RvcEJhbmQgKz0gc2JHdWFyZDsKKyAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKKworICAgIG51bUJhbmRzSW5QYXRjaCA9IGdvYWxTYiAtIHRhcmdldFN0b3BCYW5kOyAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGRlc2lyZWQgcmFuZ2Ugb2YgdGhlIHBhdGNoICovCisKKyAgICBpZiAoIG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQgKSB7CisgICAgICAvKiBkZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgbm90IGF2YWlsYWJsZSAtPiBwYXRjaCB3aG9sZSBzb3VyY2UgcmFuZ2UgKi8KKyAgICAgIHBhdGNoRGlzdGFuY2UgICA9IHRhcmdldFN0b3BCYW5kIC0gc291cmNlU3RhcnRCYW5kOyAgICAgICAgLyogZ2V0IHRoZSB0YXJnZXRPZmZzZXQgKi8KKyAgICAgIHBhdGNoRGlzdGFuY2UgICA9IHBhdGNoRGlzdGFuY2UgJiB+MTsgICAgICAgICAgICAgICAgICAgICAgLyogcm91bmRpbmcgb2ZmIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCisgICAgICBudW1CYW5kc0luUGF0Y2ggPSBsc2IgLSAodGFyZ2V0U3RvcEJhbmQgLSBwYXRjaERpc3RhbmNlKTsKKyAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQ7ICAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCisgICAgfQorCisgICAgLyogZGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIGF2YWlsYWJsZSAtPiBnZXQgdGhlIG1pbmltYWwgZXZlbiBwYXRjaGluZyBkaXN0YW5jZSAqLworICAgIHBhdGNoRGlzdGFuY2UgICA9IG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAgLyogZ2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KKyAgICBwYXRjaERpc3RhbmNlICAgPSAocGF0Y2hEaXN0YW5jZSArIDEpICYgfjE7ICAgICAgICAgICAgICAgIC8qIHJvdW5kaW5nIHVwIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCisKKyAgICBpZiAobnVtQmFuZHNJblBhdGNoIDw9IDApIHsKKyAgICAgIHBhdGNoLS07CisgICAgfSBlbHNlIHsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZTsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzICA9IHBhdGNoRGlzdGFuY2U7CisgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2ggPSBudW1CYW5kc0luUGF0Y2g7CisgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZCAgPSBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgKyBudW1CYW5kc0luUGF0Y2g7CisKKyAgICAgIHRhcmdldFN0b3BCYW5kICs9IHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKKyAgICB9CisKKyAgICAvKiBBbGwgcGF0Y2hlcyBidXQgZmlyc3QgKi8KKyAgICBzb3VyY2VTdGFydEJhbmQgPSBoVG9uQ29yci0+c2hpZnRTdGFydFNiOworCisgICAgLyogQ2hlY2sgaWYgd2UgYXJlIGNsb3NlIHRvIGdvYWxTYiAqLworICAgIGlmKCBmaXhwX2Ficyh0YXJnZXRTdG9wQmFuZCAtIGdvYWxTYikgPCAzKSB7CisgICAgICBnb2FsU2IgPSB1c2I7CisgICAgfQorCisgICAgcGF0Y2grKzsKKworICB9CisKKyAgcGF0Y2gtLTsKKworICAvKiBpZiBoaWdoZXN0IHBhdGNoIGNvbnRhaW5zIGxlc3MgdGhhbiB0aHJlZSBzdWJiYW5kOiBza2lwIGl0ICovCisgIGlmICggcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoIDwgMyAmJiBwYXRjaCA+IDAgKSB7CisgICAgcGF0Y2gtLTsKKyAgICB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKKyAgfQorCisgIGhUb25Db3JyLT5ub09mUGF0Y2hlcyA9IHBhdGNoICsgMTsKKworCisgIC8qIEFzc2lnbiB0aGUgaW5kZXgtdmVjdG9yLCBzbyB3ZSBrbm93IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBoaWdoLWJhbmQuCisgICAgIC0xIHJlcHJlc2VudHMgYSBndWFyZC1iYW5kLiAqLworICBmb3IoayA9IDA7IGsgPCBoVG9uQ29yci0+cGF0Y2hQYXJhbVswXS5ndWFyZFN0YXJ0QmFuZDsgaysrKQorICAgIGhUb25Db3JyLT5pbmRleFZlY3RvcltrXSA9IGs7CisKKyAgZm9yKGkgPSAwOyBpIDwgaFRvbkNvcnItPm5vT2ZQYXRjaGVzOyBpKyspCisgIHsKKyAgICBJTlQgc291cmNlU3RhcnQgICAgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS5zb3VyY2VTdGFydEJhbmQ7CisgICAgSU5UIHRhcmdldFN0YXJ0ICAgID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0udGFyZ2V0U3RhcnRCYW5kOworICAgIElOVCBudW1iZXJPZkJhbmRzICA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLm51bUJhbmRzSW5QYXRjaDsKKyAgICBJTlQgc3RhcnRHdWFyZEJhbmQgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS5ndWFyZFN0YXJ0QmFuZDsKKworICAgIGZvcihrID0gMDsgayA8ICh0YXJnZXRTdGFydC0gc3RhcnRHdWFyZEJhbmQpOyBrKyspCisgICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3Jbc3RhcnRHdWFyZEJhbmQra10gPSAtMTsKKworICAgIGZvcihrID0gMDsgayA8IG51bWJlck9mQmFuZHM7IGsrKykKKyAgICAgIGhUb25Db3JyLT5pbmRleFZlY3Rvclt0YXJnZXRTdGFydCtrXSA9IHNvdXJjZVN0YXJ0K2s7CisgIH0KKworICByZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyAgXGJyaWVmICAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0b25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBtb2R1bGUuCisKKyAgVGhlIG1vZHVsZSBpbmNsdWRlcyBtb2R1bGVzIGZvciBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCBlc3RpbWF0aW9uLAorICBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24gYW5kIG5vaXNlIGZsb29yIGxldmVsIGVzdGltYXRpb24uCisKKyAgXHJldHVybiAgIGVycm9yQ29kZSwgbm9FcnJvciBpZiBzdWNjZXNzZnVsLgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgIGNoYW4pICAgICAvKiE8IENoYW5uZWwgaW5kZXgsIG5lZWRlZCBmb3IgbWVtIGFsbG9jYXRpb24gKi8KK3sKKyAgSU5UIGk7CisgIEZJWFBfREJMKiBxdW90YU1hdHJpeCA9IEdldFJhbV9TYnJfcXVvdGFNYXRyaXgoY2hhbik7CisgIElOVCogICAgICBzaWduTWF0cml4ICA9IEdldFJhbV9TYnJfc2lnbk1hdHJpeChjaGFuKTsKKworICBGREttZW1jbGVhcihoVG9uQ29yciwgc2l6ZW9mKFNCUl9UT05fQ09SUl9FU1QpKTsKKworICBmb3IgKGk9MDsgaTxNQVhfTk9fT0ZfRVNUSU1BVEVTOyBpKyspIHsKKyAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXhbaV0gPSBxdW90YU1hdHJpeCArIChpKlFNRl9DSEFOTkVMUyk7CisgICAgaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0gID0gc2lnbk1hdHJpeCAgKyAoaSpRTUZfQ0hBTk5FTFMpOworICB9CisKKyAgRkRLc2JyRW5jX0NyZWF0ZVNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciAoJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsIGNoYW4pOworCisgIHJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgIFxicmllZiAgICAgSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgdG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbWV0ZXIgbW9kdWxlLgorCisgIFRoZSBtb2R1bGUgaW5jbHVkZXMgbW9kdWxlcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZXN0aW1hdGlvbiwKKyAgbWlzc2luZyBoYXJtb25pY3MgZGV0ZWN0aW9uIGFuZCBub2lzZSBmbG9vciBsZXZlbCBlc3RpbWF0aW9uLgorCisgIFxyZXR1cm4gICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgc3VjY2Vzc2Z1bC4KKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQKK0ZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0ciAoSU5UIGZyYW1lU2l6ZSwgICAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnJlbnQgU0JSIGZyYW1lIHNpemUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNmZywgICAgIC8qITwgUG9pbnRlciB0byBTQlIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdGltZVNsb3RzLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUtc2xvdHMgcGVyIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB4cG9zQ3RybCwgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgICAgICAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZykgICAgICAgICAgICAgIC8qITwgU3BlZWNoIG9yIG11c2ljIHR1bmluZy4gKi8KK3sKKyAgSU5UIG5Db2xzID0gc2JyQ2ZnLT5ub1FtZlNsb3RzOworICBJTlQgZnMgICAgPSBzYnJDZmctPnNhbXBsZUZyZXE7CisgIElOVCBub1FtZkNoYW5uZWxzID0gc2JyQ2ZnLT5ub1FtZkJhbmRzOworCisgIElOVCBoaWdoQmFuZFN0YXJ0U2IgPSBzYnJDZmctPmZyZXFCYW5kVGFibGVbTE9XX1JFU11bMF07CisgIFVDSEFSICp2X2tfbWFzdGVyICAgPSBzYnJDZmctPnZfa19tYXN0ZXI7CisgIElOVCBudW1NYXN0ZXIgICAgICAgPSBzYnJDZmctPm51bV9NYXN0ZXI7CisKKyAgVUNIQVIgKipmcmVxQmFuZFRhYmxlICAgPSBzYnJDZmctPmZyZXFCYW5kVGFibGU7CisgIElOVCAgICAqblNmYiAgICAgICAgICAgID0gc2JyQ2ZnLT5uU2ZiOworCisgIElOVCBpOworCisgIC8qCisgIFJlc2V0IHRoZSBwYXRjaGluZyBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcXVvdGEgbWF0cml4LgorICBBc3NpbmcgcGFyYW1ldGVycyBmb3IgdGhlIExQQyBhbmFseXNpcy4KKyAgKi8KKyAgaWYgKHNickNmZy0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIHN3aXRjaCAodGltZVNsb3RzKSB7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOworICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSA3IC0gTFBDX09SREVSOworICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEQ7CisgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDc7CisgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7CisgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOworICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOworICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEQ7CisgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDg7CisgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7CisgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UKKyAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gICAgICAgICAgICAgID0gMTYgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCisgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSAxNiAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KKyAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgICAgICAgICA9IE5PX09GX0VTVElNQVRFU19MQzsKKyAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDE2OworICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ICAgID0gMDsKKyAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzIwNDg7CisgICAgYnJlYWs7CisgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdICAgICAgICAgICAgICA9IDE1IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLworICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gICAgICAgICAgICAgID0gMTUgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCisgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEM7CisgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSBzYnJDZmctPm5vUW1mU2xvdHMgLyAxNTsKKyAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7CisgICAgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCAgICAgICAgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGhUb25Db3JyLT5idWZmZXJMZW5ndGggICAgICAgICAgICAgID0gbkNvbHM7CisgIGhUb25Db3JyLT5zdGVwU2l6ZSAgICAgICAgICAgICAgICAgID0gaFRvbkNvcnItPmxwY0xlbmd0aFswXSArIExQQ19PUkRFUjsgLyogc3RlcFNpemVbMF0gaW1wbGljaXRseSAwLiAqLworCisgIGhUb25Db3JyLT5uZXh0U2FtcGxlICAgICAgICAgICAgICAgID0gTFBDX09SREVSOyAvKiBmaXJzdFNhbXBsZSAqLworICBoVG9uQ29yci0+bW92ZSAgICAgICAgICAgICAgICAgICAgICA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAtIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAgICAvKiBOdW1iZXIgb2YgZXN0aW1hdGVzIHRvIG1vdmUgd2hlbiBidWZmZXJpbmcuKi8KKyAgaFRvbkNvcnItPnN0YXJ0SW5kZXhNYXRyaXggICAgICAgICAgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgLSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgICAgLyogV2hlcmUgdG8gc3RvcmUgdGhlIGxhdGVzdCBlc3RpbWF0aW9ucyBpbiB0aGUgdG9uYWxpdHkgTWF0cml4LiovCisgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXggICAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgaW4gdGhlIHRvbmFsaXR5IG1hdHJpeCB0aGUgY3VycmVudCBmcmFtZSAodG8gYmUgc2VudCB0byB0aGUgZGVjb2Rlcikgc3RhcnRzLiAqLworICBoVG9uQ29yci0+cHJldlRyYW5zaWVudEZsYWcgPSAwOworICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKKworICBoVG9uQ29yci0+bm9RbWZDaGFubmVscyA9IG5vUW1mQ2hhbm5lbHM7CisKKyAgZm9yIChpPTA7IGk8aFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzOyBpKyspIHsKKyAgICBGREttZW1jbGVhciAoaFRvbkNvcnItPnF1b3RhTWF0cml4W2ldICwgc2l6ZW9mKEZJWFBfREJMKSpub1FtZkNoYW5uZWxzKTsKKyAgICBGREttZW1jbGVhciAoaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0gLCBzaXplb2YoSU5UKSpub1FtZkNoYW5uZWxzKTsKKyAgfQorCisgICAvKiBSZXNldCB0aGUgcGF0Y2guKi8KKyAgaFRvbkNvcnItPmd1YXJkID0gMDsKKyAgaFRvbkNvcnItPnNoaWZ0U3RhcnRTYiA9IDE7CisKKyAgaWYocmVzZXRQYXRjaChoVG9uQ29yciwKKyAgICAgICAgICAgICAgICB4cG9zQ3RybCwKKyAgICAgICAgICAgICAgICBoaWdoQmFuZFN0YXJ0U2IsCisgICAgICAgICAgICAgICAgdl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgZnMsCisgICAgICAgICAgICAgICAgbm9RbWZDaGFubmVscykpCisgICAgcmV0dXJuKDEpOworCisgIGlmKEZES3NickVuY19Jbml0U2JyTm9pc2VGbG9vckVzdGltYXRlICgmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hX21heF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZVtMT10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbTE9dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUZsb29yT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNwZWVjaENvbmZpZykpCisgICAgcmV0dXJuKDEpOworCisKKyAgaWYoRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IoJmhUb25Db3JyLT5zYnJJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUuZnJlcUJhbmRUYWJsZVFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTcGVlY2hDb25maWcpKQorICAgIHJldHVybigxKTsKKworCisKKyAgaWYoRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbSEldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5tb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNmZy0+c2JyU3ludGF4RmxhZ3MpKQorICAgIHJldHVybigxKTsKKworCisKKyAgcmV0dXJuICgwKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgICAgIHJlc2V0cyB0b25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBtb2R1bGUuCisKKworCisgIFxyZXR1cm4gICBlcnJvckNvZGUsIG5vRXJyb3IgaWYgc3VjY2Vzc2Z1bC4KKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVAorRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgeHBvc2N0cmwsICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGhpZ2hCYW5kU3RhcnRTYiwgICAgICAgICAgICAgIC8qITwgU3RhcnQgYmFuZCBvZiB0aGUgU0JSIHJhbmdlLiAqLworICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlIGFyZSBkZXJpdmVkLiovCisgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bU1hc3RlciwgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5IChvZiB0aGUgU0JSIHBhcnQpLiAqLworICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqIGZyZXFCYW5kVGFibGUsICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgbG93LXJlcyBhbmQgaGlnaC1yZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgSU5UKiBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcyAoaGlnLXJlcyBhbmQgbG93LXJlcykuICovCisgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vUW1mQ2hhbm5lbHMgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBjaGFubmVscy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICApCit7CisKKyAgLyogUmVzZXQgdGhlIHBhdGNoLiovCisgIGhUb25Db3JyLT5ndWFyZCA9IDA7CisgIGhUb25Db3JyLT5zaGlmdFN0YXJ0U2IgPSAxOworCisgIGlmKHJlc2V0UGF0Y2goaFRvbkNvcnIsCisgICAgICAgICAgICAgICAgeHBvc2N0cmwsCisgICAgICAgICAgICAgICAgaGlnaEJhbmRTdGFydFNiLAorICAgICAgICAgICAgICAgIHZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgbnVtTWFzdGVyLAorICAgICAgICAgICAgICAgIGZzLAorICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMpKQorICAgIHJldHVybigxKTsKKworCisKKyAgLyogUmVzZXQgdGhlIG5vaXNlIGZsb29yIGVzdGltYXRlLiovCisgIGlmKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoJmhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW0xPXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbTE9dKSkKKyAgICByZXR1cm4oMSk7CisKKyAgLyoKKyAgUmVzZXQgdGhlIGludmVlcnNlIGZpbHRlcmVpbmcgZGV0ZWN0b3IuCisgICovCisgIGlmKEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcigmaFRvbkNvcnItPnNickludkZpbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLmZyZXFCYW5kVGFibGVRbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcykpCisgICAgcmV0dXJuKDEpOworLyogUmVzZXQgdGhlIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdG9yLiAqLworICBpZihGREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKCZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYltISV0pKQorICAgIHJldHVybigxKTsKKworICByZXR1cm4gKDApOworfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorICBcYnJpZWYgIERlbGV0ZXMgdGhlIHRvbmFsaXR5IGNvcnJlY3Rpb24gcGFyYW10ZXJlIG1vZHVsZS4KKworCisKKyAgXHJldHVybiAgIG5vbmUKKworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0ZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyIChIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29ycikgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KK3sKKworICBpZiAoaFRvbkNvcnIpIHsKKworICAgRnJlZVJhbV9TYnJfcXVvdGFNYXRyaXgoaFRvbkNvcnItPnF1b3RhTWF0cml4KTsKKworICAgRnJlZVJhbV9TYnJfc2lnbk1hdHJpeChoVG9uQ29yci0+c2lnbk1hdHJpeCk7CisKKyAgIEZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKCZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaCBiL2FhYy9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4NDI1YwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmgKQEAgLTAsMCArMSwyMTIgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBHZW5lcmFsIHRvbmFsaXR5IGNvcnJlY3Rpb24gZGV0ZWN0b3IgbW9kdWxlLgorKi8KKyNpZm5kZWYgX1RPTl9DT1JSX0VTVF9ICisjZGVmaW5lIF9UT05fQ09SUl9FU1RfSAorCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKyNpbmNsdWRlICJtaF9kZXQuaCIKKyNpbmNsdWRlICJuZl9lc3QuaCIKKyNpbmNsdWRlICJpbnZmX2VzdC5oIgorCisKKyNkZWZpbmUgTUFYX05VTV9QQVRDSEVTIDYKKyNkZWZpbmUgU0NBTEVfTlJHVkVDIDQKKworLyoqIHBhcmFtZXRlciBzZXQgZm9yIG9uZSBzaW5nbGUgcGF0Y2ggKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UICAgIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hlcmUgdG8gdGFrZSB0aGUgc2FtcGxlcyBmcm9tICovCisgIElOVCAgICBzb3VyY2VTdG9wQmFuZDsgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggYW55bW9yZSAqLworICBJTlQgICAgZ3VhcmRTdGFydEJhbmQ7ICAgICAgICAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlIGludGVyZmVyZW5jZXMgYmV0d2VlbiBwYXRjaGVzICovCisgIElOVCAgICB0YXJnZXRTdGFydEJhbmQ7ICAgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZCBsb3diYW5kIHNpZ25hbCAqLworICBJTlQgICAgdGFyZ2V0QmFuZE9mZnM7ICAgICAgICAgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZCAnc3RhcnRTb3VyY2VCYW5kJyAqLworICBJTlQgICAgbnVtQmFuZHNJblBhdGNoOyAgICAgICAgIC8qITwgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhbmRzIGluIHRoaXMgb25lIHBhdGNoICovCit9IFBBVENIX1BBUkFNOworCisKKworCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQgc3dpdGNoSW52ZXJzZUZpbHQ7ICAgICAgICAgIC8qITwgRmxhZyB0byBlbmFibGUgZHluYW1pYyBhZGFwdGlvbiBvZiBpbnZmLiBkZXRlY3Rpb24gKi8KKyAgSU5UIG5vUW1mQ2hhbm5lbHM7CisgIElOVCBidWZmZXJMZW5ndGg7ICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgdGhlIHIgYW5kIGkgYnVmZmVycy4gKi8KKyAgSU5UIHN0ZXBTaXplOyAgICAgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmb3IgdGhlIGxwYyBlc3RpbWF0ZS4gKi8KKyAgSU5UIG51bWJlck9mRXN0aW1hdGVzOyAgICAgICAgICAvKiE8IFRoZSB0b3RhbCBudW1iZXIgb2YgZXN0aWFtdGVzLCBhdmFpbGFibGUgaW4gdGhlIHF1b3RhTWF0cml4LiovCisgIElOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAgLyohPCBUaGUgbnVtYmVyIG9mIGVzdGltYXRlcyBwZXIgZnJhbWUgYXZhaWxhYmxlIGluIHRoZSBxdW90YU1hdHJpeC4qLworICBJTlQgbHBjTGVuZ3RoWzJdOyAgICAgICAgICAgICAgIC8qITwgU2VnbWVudCBsZW5ndGggdXNlZCBmb3Igc2Vjb25kIG9yZGVyIExQQyBhbmFseXNpcy4qLworICBJTlQgbmV4dFNhbXBsZTsgICAgICAgICAgICAgICAgIC8qITwgV2hlcmUgdG8gc3RhcnQgdGhlIExQQyBhbmFseXNpcyBvZiB0aGUgY3VycmVudCBmcmFtZS4qLworICBJTlQgbW92ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSG93IG1hbnkgZXN0aW1hdGVzIHRvIG1vdmUgaW4gdGhlIHF1b3RhTWF0cml4LCB3aGVuIGJ1ZmZlcmluZy4gKi8KKyAgSU5UIGZyYW1lU3RhcnRJbmRleDsgICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIHIgYW5kIGkgYnVmZmVycy4gKi8KKyAgSU5UIHN0YXJ0SW5kZXhNYXRyaXg7ICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIHF1b3RhTWF0cml4LiAqLworICBJTlQgZnJhbWVTdGFydEluZGV4SW52ZkVzdDsgICAgIC8qITwgVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZywgbm90IHRoZSBzYW1lIGFzIHRoZSBvdGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gd2hhdCBkZWNvZGVyIGlzIHVzZWQgKGJ1ZmZlciBvcHQsIG9yIG5vIGJ1ZmZlciBvcHQpLiAqLworICBJTlQgcHJldlRyYW5zaWVudEZsYWc7ICAgICAgICAgIC8qITwgVGhlIHRyYW5zaXNlbnQgZmxhZyAoZnJvbSB0aGUgdHJhbnNpZW50IGRldGVjdG9yKSBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLiAqLworICBJTlQgdHJhbnNpZW50TmV4dEZyYW1lOyAgICAgICAgIC8qITwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFuc2llbnQgd2lsbCBzaG93IHVwIGluIHRoZSBuZXh0IGZyYW1lLiAqLworICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0OyAgICAgICAgIC8qITwgQW4gb2Zmc2V0IHZhbHVlIHRvIG1hdGNoIHRoZSB0cmFuc2llbnQgcG9zIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIHRyYW5zaWVudCBkZXRlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHBvc2l0aW9uIGluIHRoZSBmcmFtZS4qLworCisgIElOVCAqc2lnbk1hdHJpeFtNQVhfTk9fT0ZfRVNUSU1BVEVTXTsgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBzaWduIG9mIGVhY2ggY2hhbm5lLCBpLmUuIGluZGljYXRpbmcgaW4gd2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIGEgUU1GIGNoYW5uZWwgYSBwb3NzaWJsZSBzaW5lIGlzLiAqLworCisgIEZJWFBfREJMICpxdW90YU1hdHJpeFtNQVhfTk9fT0ZfRVNUSU1BVEVTXTsvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgZm9yIGFsbCBlc3RpbWF0ZXMsIGFsbCBjaGFubmVscy4gKi8KKworICBGSVhQX0RCTCBucmdWZWN0b3JbTUFYX05PX09GX0VTVElNQVRFU107ICAgLyohPCBWZWN0b3IgaG9sZGluZyB0aGUgYXZlcmFnZWQgZW5lcmdpZXMgZm9yIGV2ZXJ5IFFNRiBiYW5kLiAqLworICBGSVhQX0RCTCBucmdWZWN0b3JGcmVxW1FNRl9DSEFOTkVMU107ICAgICAgLyohPCBWZWN0b3IgaG9sZGluZyB0aGUgYXZlcmFnZWQgZW5lcmdpZXMgZm9yIGV2ZXJ5IFFNRiBjaGFubmVsICovCisKKyAgU0NIQVIgaW5kZXhWZWN0b3JbUU1GX0NIQU5ORUxTXTsgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHBvSU5UaW5nIHRvIHRoZSBjb3JyZWN0IGxvd2JhbmQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBpbmRleGluZyBhIGhpZ2hiYW5kIGNoYW5uZWwsIC0xIHJlcHJlc2VudHMgYSBndWFyZCBiYW5kICovCisgIFBBVENIX1BBUkFNICBwYXRjaFBhcmFtW01BWF9OVU1fUEFUQ0hFU107ICAvKiE8IG5ldyBwYXJhbWV0ZXIgc2V0IGZvciBwYXRjaGluZyAqLworICBJTlQgICAgZ3VhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgZ3VhcmRiYW5kcyBiZXR3ZWVuIGV2ZXJ5IHBhdGNoICovCisgIElOVCAgICBzaGlmdFN0YXJ0U2I7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGxvd2VzdCBzdWJiYW5kIG9mIHNvdXJjZSByYW5nZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcGF0Y2hlcyAqLworICBJTlQgICAgbm9PZlBhdGNoZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgcGF0Y2hlcyAqLworCisgIFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBzYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3I7ICAvKiE8IFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBzdHJ1Y3QuICovCisgIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzYnJOb2lzZUZsb29yRXN0aW1hdGU7ICAgICAgICAgICAgICAvKiE8IFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QuICovCisgIFNCUl9JTlZfRklMVF9FU1Qgc2JySW52RmlsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworfQorU0JSX1RPTl9DT1JSX0VTVDsKKwordHlwZWRlZiBTQlJfVE9OX0NPUlJfRVNUICpIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVDsKKwordm9pZAorRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMsICAgICAgICAgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KKyAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBub2lzZUxldmVscywgICAgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIG5vaXNlIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KKyAgICAgICAgICAgICAgICAgSU5UKiBtaXNzaW5nSGFybW9uaWNGbGFnLCAgICAgICAgICAgLyohPCBGbGFnIHNldCB0byBvbmUgb3IgemVybywgZGVwZW5kZW50IG9uIGlmIGFueSBzdHJvbmcgc2luZXMgYXJlIG1pc3NpbmcuKi8KKyAgICAgICAgICAgICAgICAgVUNIQVIqIG1pc3NpbmdIYXJtb25pY3NJbmRleCwgICAgICAgLyohPCBWZWN0b3IgaW5kaWNhdGluZyB3aGVyZSBzaW5lcyBhcmUgbWlzc2luZy4gKi8KKyAgICAgICAgICAgICAgICAgVUNIQVIqIGVudmVsb3BlQ29tcGVuc2F0aW9uLCAgICAgICAgLyohPCBWZWN0b3IgdG8gc3RvcmUgY29tcGVuc2F0aW9uIHZhbHVlcyBmb3IgdGhlIGVuZXJnaWVzIGluLiAqLworICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVJbmZvLCAgICAvKiE8IEZyYW1lIGluZm8gc3RydWN0LCBjb250YWlucyB0aGUgdGltZSBhbmQgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuKi8KKyAgICAgICAgICAgICAgICAgVUNIQVIqIHRyYW5zaWVudEluZm8sICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgaW5mby4qLworICAgICAgICAgICAgICAgICBVQ0hBUiAqIGZyZXFCYW5kVGFibGUsICAgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlcyBmb3IgaGlnaC1yZXMuKi8KKyAgICAgICAgICAgICAgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGhpZ2gtcmVzLiAqLworICAgICAgICAgICAgICAgICBYUE9TX01PREUgeHBvc1R5cGUsICAgICAgICAgICAgICAgICAvKiE8IFR5cGUgb2YgdHJhbnNwb3NlciB1c2VkIGluIHRoZSBkZWNvZGVyLiovCisgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKKyAgICAgICAgICAgICAgICAgKTsKKworSU5UCitGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgY2hhbik7ICAgIC8qITwgQ2hhbm5lbCBpbmRleCwgbmVlZGVkIGZvciBtZW0gYWxsb2NhdGlvbiAqLworCitJTlQKK0ZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0cihJTlQgZnJhbWVTaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnJlbnQgU0JSIGZyYW1lIHNpemUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ2ZnLCAgICAgIC8qITwgUG9pbnRlciB0byBTQlIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUtc2xvdHMgcGVyIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHhwb3NDdHJsLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAgICAgICAgICAgICAgIC8qITwgU3BlZWNoIG9yIG11c2ljIHR1bmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK3ZvaWQKK0ZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyKTsgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKworCit2b2lkCitGREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNiLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHFtZlNjYWxlICAgICAgICAgICAgICAgICAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworSU5UCitGREtzYnJFbmNfUmVzZXRUb25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgICAgICAgICAgICAgICAgICAgIElOVCB4cG9zY3RybCwgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgLyohPCBTdGFydCBiYW5kIG9mIHRoZSBTQlIgcmFuZ2UuICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAvKiE8IE1hc3RlciBmcmVxdWVuY3kgdGFibGUgZnJvbSB3aGljaCBhbGwgb3RoZXIgdGFibGUgYXJlIGRlcml2ZWQuKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hc3RlciB0YWJsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKG9mIHRoZSBTQlIgcGFydCkuICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqKiBmcmVxQmFuZFRhYmxlLCAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciBsb3ctcmVzIGFuZCBoaWdoLXJlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQqIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzIChoaWctcmVzIGFuZCBsb3ctcmVzKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9RbWZDaGFubmVscyAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIGNoYW5uZWxzLiAqLworICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuY3BwIGIvYWFjL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGE1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKQEAgLTAsMCArMSw3MDEgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAidHJhbl9kZXQuaCIKKworI2luY2x1ZGUgImZyYW1fZ2VuLmgiCisjaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicl9taXNjLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjZGVmaW5lIE5PUk1fUU1GX0VORVJHWSA1LjY4NDM0MTg4NjA4MDgwMTQ4Njk2ODk5NDE0MDYyNWUtMTQgLyogMl4tNDQgKi8KKworLyogc3RhdGljIEZJWFBfREJMIEFCU19USFJFUyA9IGZpeE1heCggRkwyRlhDT05TVF9EQkwoMS4yOGU1ICogIE5PUk1fUU1GX0VORVJHWSksIChGSVhQX0RCTCkxKSAgTWluaW11bSB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBjaGFuZ2VzICovCisjZGVmaW5lIEFCU19USFJFUyAoKEZJWFBfREJMKTE2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIHNwZWN0cmFsQ2hhbmdlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFxicmllZiAgIENhbGN1bGF0ZXMgYSBtZWFzdXJlIGZvciB0aGUgc3BlY3RyYWwgY2hhbmdlIHdpdGhpbiB0aGUgZnJhbWUKKworIFRoZSBmdW5jdGlvbiBzYXlzIGhvdyBnb29kIGl0IHdvdWxkIGJlIHRvIHNwbGl0IHRoZSBmcmFtZSBhdCB0aGUgZ2l2ZW4gYm9yZGVyCisgcG9zaXRpb24gaW50byAyIGVudmVsb3Blcy4KKworIFRoZSByZXR1cm4gdmFsdWUgZGVsdGFfc3VtIGlzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMS82NAorCisgXHJldHVybiAgY2FsY3VsYXRlZCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGSVhQX0RCTCBzcGVjdHJhbENoYW5nZShGSVhQX0RCTCBFbmVyZ2llc1tOVU1CRVJfVElNRV9TTE9UU18yMzA0XVtNQVhfRlJFUV9DT0VGRlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCkKK3sKKyAgSU5UIGksajsKKyAgSU5UIGxlbjEsbGVuMjsKKyAgRklYUF9EQkwgZGVsdGEsdG1wMCx0bXAxLHRtcDI7CisgIEZJWFBfREJMIGFjY3UxLGFjY3UyLGRlbHRhX3N1bSxyZXN1bHQ7CisKKyAgRkRLX0FTU0VSVChzY2FsZUVuZXJnaWVzWzBdID49IDApOworCisgIC8qIGVxdWFsIGZvciBhYWMgKHdvdWxkIGJlIG5vdCBlcXVhbCBmb3IgbXAzKSAqLworICBsZW4xID0gYm9yZGVyLXN0YXJ0OworICBsZW4yID0gc3RvcC1ib3JkZXI7CisKKyAgLyogcHJlZmVyIGJvcmRlcnMgbmVhciB0aGUgbWlkZGxlIG9mIHRoZSBmcmFtZSAqLworICBGSVhQX0RCTCAgIHBvc193ZWlnaHQ7CisgIHBvc193ZWlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChsZW4xKkdldEludkludChsZW4xK2xlbjIpKTsKKyAgcG9zX3dlaWdodCA9IC8qRkwyRlhDT05TVF9EQkwoMS4wKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gKGZNdWx0KHBvc193ZWlnaHQsIHBvc193ZWlnaHQpPDwyKTsKKworICBkZWx0YV9zdW0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAvKiBTdW0gdXAgZW5lcmdpZXMgb2YgYWxsIFFNRi10aW1lc2xvdHMgZm9yIGJvdGggaGFsZnMgKi8KKyAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7CisgICAgI2RlZmluZSBOUkdfU0NBTEUgIDMKKyAgICAvKiBpbml0IHdpdGggc29tZSBlbmVyZ3kgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvCisgICAgICAgYW5kIHRvIHByZXZlbnQgc3BsaXR0aW5nIGZvciB2ZXJ5IGxvdyBsZXZlbHMgKi8KKyAgICBhY2N1MSA9ICgoRkwyRlhDT05TVF9EQkwoKDEuMGU2Kk5PUk1fUU1GX0VORVJHWSo4LjAvMzIpKSkgPDwgZml4TWluKHNjYWxlRW5lcmdpZXNbMF0sMjUpKT4+TlJHX1NDQUxFOyAgLyogY29tcGxleCBpbml0IGZvciBjb21wYXJlIHdpdGggb3JpZ2luYWwgdmVyc2lvbiAqLworICAgIGFjY3UyID0gKChGTDJGWENPTlNUX0RCTCgoMS4wZTYqTk9STV9RTUZfRU5FUkdZKjguMC8zMikpKSA8PCBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSwyNSkpPj5OUkdfU0NBTEU7ICAvKiBjYW4gYmUgc2ltcGxpZmllZCBpbiBkc3AgaW1wbGVtZW50YXRpb24gKi8KKworICAgIC8qIFN1bSB1cCBlbmVyZ2llcyBpbiBmaXJzdCBoYWxmICovCisgICAgZm9yIChpPXN0YXJ0OyBpPGJvcmRlcjsgaSsrKSB7CisgICAgICBhY2N1MSArPSAoRW5lcmdpZXNbaV1bal0+Pk5SR19TQ0FMRSk7CisgICAgfQorCisgICAgLyogU3VtIHVwIGVuZXJnaWVzIGluIHNlY29uZCBoYWxmICovCisgICAgZm9yIChpPWJvcmRlcjsgaTxzdG9wOyBpKyspIHsKKyAgICAgIGFjY3UyICs9IChFbmVyZ2llc1tpXVtqXT4+TlJHX1NDQUxFKTsKKyAgICB9CisKKyAgICAvKiBFbmVyZ3kgY2hhbmdlIGluIGN1cnJlbnQgYmFuZCAqLworICAgIHRtcDAgPSBDYWxjTGREYXRhKGFjY3UyKTsKKyAgICB0bXAxID0gQ2FsY0xkRGF0YShhY2N1MSk7CisgICAgdG1wMiA9ICh0bXAwIC0gdG1wMSArIENhbGNMZERhdGEobGVuMSktQ2FsY0xkRGF0YShsZW4yKSk7CisgICAgZGVsdGEgPSBmaXhwX2FicyhmTXVsdCh0bXAyLCBGTDJGWENPTlNUX0RCTCgwLjY5MzE0NzE4MDZmKSkpOworCisgICAgLyogV2VpZ2h0aW5nIHdpdGggYW1wbGl0dWRlIHJhdGlvIG9mIHRoaXMgYmFuZCAqLworICAgIHJlc3VsdCA9IChFbmVyZ3lUb3RhbCA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgICAgID8gRkwyRlhDT05TVF9EQkwoMC5mKQorICAgICAgICAgICAgOiBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdCggKGFjY3UxK2FjY3UyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVuZXJneVRvdGFsPj5OUkdfU0NBTEUpKyhGSVhQX0RCTCkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSwoREZSQUNUX0JJVFMtMSkpICk7CisKKyAgICBkZWx0YV9zdW0gKz0gKEZJWFBfREJMKShmTXVsdChzcXJ0Rml4cChyZXN1bHQpLCBkZWx0YSkpOworICB9CisKKyAgcmV0dXJuIGZNdWx0KGRlbHRhX3N1bSwgcG9zX3dlaWdodCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBhZGRMb3diYW5kRW5lcmdpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgXGJyaWVmICAgQ2FsY3VsYXRlcyB0b3RhbCBsb3diYW5kIGVuZXJneQorCisgVGhlIHJldHVybiB2YWx1ZSBucmdUb3RhbCBpcyBzY2FsZWQgYnkgdGhlIGZhY3RvciAoMS8zMi4wKQorCisgXHJldHVybiAgdG90YWwgZW5lcmd5IGluIHRoZSBsb3diYW5kCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZJWFBfREJMIGFkZExvd2JhbmRFbmVyZ2llcyhGSVhQX0RCTCAqKkVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgKnNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5yZ1N6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgdHJhbl9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAqZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzbG90cykKK3sKKyAgRklYUF9EQkwgbnJnVG90YWw7CisgIEZJWFBfREJMIGFjY3UxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIEZJWFBfREJMIGFjY3UyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGludCB0cmFuX29mZmRpdjIgPSB0cmFuX29mZj4+bnJnU3pTaGlmdDsKKyAgaW50IHRzLGs7CisKKyAgLyogU3VtIHVwIGxvd2JhbmQgZW5lcmd5IGZyb20gb25lIGZyYW1lIGF0IG9mZnNldCB0cmFuX29mZiAqLworICBmb3IgKHRzPXRyYW5fb2ZmZGl2MjsgdHM8WUJ1ZmZlcldyaXRlT2Zmc2V0OyB0cysrKSB7CisgICAgZm9yIChrID0gMDsgayA8IGZyZXFCYW5kVGFibGVbMF07IGsrKykgeworICAgICAgYWNjdTEgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDY7CisgICAgfQorICB9CisgIGZvciAoOyB0czx0cmFuX29mZmRpdjIrKHNsb3RzPj5ucmdTelNoaWZ0KTsgdHMrKykgeworICAgIGZvciAoayA9IDA7IGsgPCBmcmVxQmFuZFRhYmxlWzBdOyBrKyspIHsKKyAgICAgIGFjY3UyICs9IEVuZXJnaWVzW3RzXVtrXSA+PiA2OworICAgIH0KKyAgfQorCisgIG5yZ1RvdGFsID0gKCAoYWNjdTEgPj4gZml4TWluKHNjYWxlRW5lcmdpZXNbMF0sKERGUkFDVF9CSVRTLTEpKSkKKyAgICAgICAgICAgKyAgIChhY2N1MiA+PiBmaXhNaW4oc2NhbGVFbmVyZ2llc1sxXSwoREZSQUNUX0JJVFMtMSkpKSApIDw8ICgyKTsKKworICByZXR1cm4obnJnVG90YWwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgYWRkSGlnaGJhbmRFbmVyZ2llcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBcYnJpZWYgICBBZGQgaGlnaGJhbmQgZW5lcmdpZXMKKworIEhpZ2hiYW5kIGVuZXJnaWVzIGFyZSBtYXBwZWQgdG8gYW4gYXJyYXkgd2l0aCBzbWFsbGVyIGRpbWVuc2lvbjoKKyBJdHMgdGltZSByZXNvbHV0aW9uIGlzIG9ubHkgMSBTQlItdGltZXNsb3QgYW5kIGl0cyBmcmVxdWVuY3kgcmVzb2x1dGlvbgorIGlzIDEgU0JSLWJhbmQuIFRoZXJlZm9yZSB0aGUgZGF0YSB0byBiZSBmZWQgaW50byB0aGUgc3BlY3RyYWxDaGFuZ2UKKyBmdW5jdGlvbiBpcyByZWR1Y2VkLgorCisgVGhlIHZhbHVlcyBFbmVyZ2llc00gYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yICgxLzMyLjApIGFuZCBzY2FsZUVuZXJnaWVzWzBdCisgVGhlIHJldHVybiB2YWx1ZSBucmdUb3RhbCBpcyBzY2FsZWQgYnkgdGhlIGZhY3RvciAoMS8zMi4wKQorCisgXHJldHVybiAgdG90YWwgZW5lcmd5IGluIHRoZSBoaWdoYmFuZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEZJWFBfREJMIGFkZEhpZ2hiYW5kRW5lcmdpZXMoRklYUF9EQkwgKipSRVNUUklDVCBFbmVyZ2llcywgLyohPCBpbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBFbmVyZ2llc01bTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwgLyohPCBDb21iaW5lZCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAqUkVTVFJJQ1QgZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgc2JyU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHRpbWVTdGVwKQoreworICBJTlQgaSxqLGssc2xvdEluLHNsb3RPdXQsc2NhbGU7CisgIElOVCBsaSx1aTsKKyAgRklYUF9EQkwgbnJnVG90YWw7CisgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAvKiBDb21iaW5lIFFNRi10aW1lc2xvdHMgdG8gU0JSLXRpbWVzbG90cywKKyAgICAgY29tYmluZSBRTUYtYmFuZHMgdG8gU0JSLWJhbmRzLAorICAgICBjb21iaW5lIExlZnQgYW5kIFJpZ2h0IGNoYW5uZWwgKi8KKyAgZm9yIChzbG90T3V0PTA7IHNsb3RPdXQ8c2JyU2xvdHM7IHNsb3RPdXQrKykgeworICAgIHNsb3RJbiA9IDIqc2xvdE91dDsKKworICAgIGZvciAoaj0wOyBqPG5TZmI7IGorKykgeworICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgICBsaSA9IGZyZXFCYW5kVGFibGVbal07CisgICAgICB1aSA9IGZyZXFCYW5kVGFibGVbaiArIDFdOworCisgICAgICBmb3IgKGs9bGk7IGs8dWk7IGsrKykgeworICAgICAgICBmb3IgKGk9MDsgaTx0aW1lU3RlcDsgaSsrKSB7CisgICAgICAgICBhY2N1ICs9IChFbmVyZ2llc1soc2xvdEluK2kpPj4xXVtrXSA+PiA1KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRW5lcmdpZXNNW3Nsb3RPdXRdW2pdID0gYWNjdTsKKyAgICB9CisgIH0KKworICBzY2FsZSA9IGZpeE1pbig4LHNjYWxlRW5lcmdpZXNbMF0pOyAgICAgIC8qIHNjYWxlIGVuZXJnaWVzIGRvd24gYmVmb3JlIGFkZCB1cCAqLworCisgIGlmICgoc2NhbGVFbmVyZ2llc1swXS0xKSA+IChERlJBQ1RfQklUUy0xKSApCisgICAgbnJnVG90YWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZWxzZSB7CisgICAgLyogTm93IGFkZCBhbGwgZW5lcmdpZXMgKi8KKyAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZm9yIChzbG90T3V0PTA7IHNsb3RPdXQ8c2JyU2xvdHM7IHNsb3RPdXQrKykgeworICAgICAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7CisgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZSk7CisgICAgICB9CisgICAgfQorICAgIG5yZ1RvdGFsID0gYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1swXS1zY2FsZSk7CisgIH0KKworICByZXR1cm4obnJnVG90YWwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgXGJyaWVmICAgRGVjaWRlcyBpZiBhIEZJWEZJWC1mcmFtZSBzaGFsbCBiZSBzcGxpdHRlZCBpbnRvIDIgZW52ZWxvcGVzCisKKyBJZiBubyB0cmFuc2llbnQgaGFzIGJlZW4gZGV0ZWN0ZWQgYmVmb3JlLCB0aGUgZnJhbWUgY2FuIHN0aWxsIGJlIHNwbGl0dGVkCisgaW50byAyIGVudmVsb3Blcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitGREtzYnJFbmNfZnJhbWVTcGxpdHRlcihGSVhQX0RCTCAqKkVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnRyYW5fdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMpCit7CisgIGlmICh0cmFuX3ZlY3RvclsxXT09MCkgLyogbm8gdHJhbnNpZW50IHdhcyBkZXRlY3RlZCAqLworICB7CisgICAgRklYUF9EQkwgZGVsdGE7CisgICAgRklYUF9EQkwgRW5lcmdpZXNNW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdW01BWF9GUkVRX0NPRUZGU107CisgICAgRklYUF9EQkwgRW5lcmd5VG90YWwsbmV3TG93YmFuZEVuZXJneSxuZXdIaWdoYmFuZEVuZXJneTsKKyAgICBJTlQgYm9yZGVyOworICAgIElOVCBzYnJTbG90cyA9IGZNdWx0SShHZXRJbnZJbnQodGltZVN0ZXApLG5vX2NvbHMpOworCisgICAgRkRLX0FTU0VSVCggc2JyU2xvdHMgKiB0aW1lU3RlcCA9PSBub19jb2xzICk7CisKKyAgICAvKgorICAgICAgR2V0IExvd2JhbmQtZW5lcmd5IG92ZXIgYSByYW5nZSBvZiAyIGZyYW1lcyAoTG9vayBoYWxmIGEgZnJhbWUgYmFjayBhbmQgYWhlYWQpLgorICAgICovCisgICAgbmV3TG93YmFuZEVuZXJneSA9IGFkZExvd2JhbmRFbmVyZ2llcyhFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2NvbHMpOworCisgICAgbmV3SGlnaGJhbmRFbmVyZ3kgPSBhZGRIaWdoYmFuZEVuZXJnaWVzKEVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyZ2llc00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RlcCk7CisKKyAgICBpZiAoIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPmZyYW1lU2hpZnQgIT0gMCApIHsKKyAgICAgIGlmICh0cmFuX3ZlY3RvclsxXT09MCkKKyAgICAgICAgdHJhbl92ZWN0b3JbMF0gPSAwOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgIC8qIHByZXZMb3dCYW5kRW5lcmd5OiBDb3JyZXNwb25kcyB0byAxIGZyYW1lLCBzdGFydGluZyB3aXRoIGhhbGYgYSBmcmFtZSBsb29rLWJlaGluZAorICAgICAgICAgbmV3TG93YmFuZEVuZXJneTogIENvcnJlc3BvbmRzIHRvIDEgZnJhbWUsIHN0YXJ0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgIEVuZXJneVRvdGFsID0gKG5ld0xvd2JhbmRFbmVyZ3kgKyBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSkgPj4gMTsKKyAgICAgIEVuZXJneVRvdGFsICs9IG5ld0hpZ2hiYW5kRW5lcmd5OworICAgICAgLyogVGhlIGJlbG93IGJvcmRlciBzaG91bGQgc3BlY2lmeSB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbWlkZGxlIGJvcmRlcgorICAgICAgICAgb2YgYSBGSVhGSVgtZnJhbWUgd2l0aCAyIGVudmVsb3Blcy4gKi8KKyAgICAgIGJvcmRlciA9IChzYnJTbG90cysxKSA+PiAxOworCisgICAgICBkZWx0YSA9IHNwZWN0cmFsQ2hhbmdlKEVuZXJnaWVzTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmd5VG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU2xvdHMpOworCisgICAgICBpZiAoZGVsdGEgPiAoaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyID4+IExEX0RBVEFfU0hJRlQpKSAvKiBkZWx0YSBzY2FsZWQgYnkgMS82NCAqLworICAgICAgICB0cmFuX3ZlY3RvclswXSA9IDE7IC8qIFNldCBmbGFnIGZvciBzcGxpdHRpbmcgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgdHJhbl92ZWN0b3JbMF0gPSAwOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBwcmV2TG93QmFuZEVuZXJneSAqLworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID0gbmV3TG93YmFuZEVuZXJneTsKKyAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2SGlnaEJhbmRFbmVyZ3kgPSBuZXdIaWdoYmFuZEVuZXJneTsKKyAgfQorfQorCisvKgorICogQ2FsY3VsYXRlIHRyYW5zaWVudCBlbmVyZ3kgdGhyZXNob2xkIGZvciBlYWNoIFFNRiBiYW5kCisgKi8KK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVUaHJlc2hvbGRzKEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqUkVTVFJJQ1Qgc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpSRVNUUklDVCB0aHJlc2hvbGRzLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBub0NvbHMsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbm9Sb3dzLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHRyYW5fb2ZmKQoreworICBGSVhQX0RCTCBtZWFuX3ZhbCxzdGRfdmFsLHRlbXA7CisgIEZJWFBfREJMIGlfbm9Db2xzOworICBGSVhQX0RCTCBpX25vQ29sczE7CisgIEZJWFBfREJMIGFjY3UsYWNjdTAsYWNjdTE7CisgIGludCBzY2FsZUZhY3RvcjAsc2NhbGVGYWN0b3IxLGNvbW1vblNjYWxlOworICBpbnQgaSxqOworCisgIGlfbm9Db2xzICA9IEdldEludkludChub0NvbHMgKyB0cmFuX29mZiApIDw8IFlCdWZmZXJTelNoaWZ0OworICBpX25vQ29sczEgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYgLSAxKSA8PCBZQnVmZmVyU3pTaGlmdDsKKworICAvKiBjYWxjIG1pbmltdW0gc2NhbGUgb2YgZW5lcmdpZXMgb2YgcHJldmlvdXMgYW5kIGN1cnJlbnQgZnJhbWUgKi8KKyAgY29tbW9uU2NhbGUgPSBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSxzY2FsZUVuZXJnaWVzWzFdKTsKKworICAvKiBjYWxjIHNjYWxlZmFjdG9ycyB0byBhZGFwdCBlbmVyZ2llcyB0byBjb21tb24gc2NhbGUgKi8KKyAgc2NhbGVGYWN0b3IwID0gZml4TWluKChzY2FsZUVuZXJnaWVzWzBdLWNvbW1vblNjYWxlKSwgKERGUkFDVF9CSVRTLTEpKTsKKyAgc2NhbGVGYWN0b3IxID0gZml4TWluKChzY2FsZUVuZXJnaWVzWzFdLWNvbW1vblNjYWxlKSwgKERGUkFDVF9CSVRTLTEpKTsKKworICBGREtfQVNTRVJUKChzY2FsZUZhY3RvcjAgPj0gMCkgJiYgKHNjYWxlRmFjdG9yMSA+PSAwKSk7CisKKyAgLyogY2FsY3VsYXRlIHN0YW5kYXJkIGRldmlhdGlvbiBpbiBldmVyeSBzdWJiYW5kICovCisgIGZvciAoaT0wOyBpPG5vUm93czsgaSsrKQorICB7CisgICAgaW50IHN0YXJ0RW5lcmd5ID0gKHRyYW5fb2ZmPj5ZQnVmZmVyU3pTaGlmdCk7CisgICAgaW50IGVuZEVuZXJneSA9ICgobm9Db2xzPj5ZQnVmZmVyU3pTaGlmdCkrdHJhbl9vZmYpOworICAgIGludCBzaGlmdDsKKworICAgIC8qIGNhbGN1bGF0ZSBtZWFuIHZhbHVlIG92ZXIgZGVjaW1hdGVkIGVuZXJneSB2YWx1ZXMgKGRvd25zYW1wbGVkIGJ5IDIpLiAqLworICAgIGFjY3UwID0gYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgIGZvciAoaj1zdGFydEVuZXJneTsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykKKyAgICAgIGFjY3UwICs9IGZNdWx0KEVuZXJnaWVzW2pdW2ldLCBpX25vQ29scyk7CisgICAgZm9yICg7IGo8ZW5kRW5lcmd5OyBqKyspCisgICAgICBhY2N1MSArPSBmTXVsdChFbmVyZ2llc1tqXVtpXSwgaV9ub0NvbHMpOworCisgICAgbWVhbl92YWwgPSAoYWNjdTAgPj4gc2NhbGVGYWN0b3IwKSArIChhY2N1MSA+PiBzY2FsZUZhY3RvcjEpOyAgLyogYXZlcmFnZSAqLworICAgIHNoaWZ0ICAgID0gZml4TWF4KDAsQ291bnRMZWFkaW5nQml0cyhtZWFuX3ZhbCktNik7ICAgICAgICAgICAgIC8qIC02IHRvIGtlZXAgcm9vbSBmb3IgYWNjdW11bGF0aW5nIHVwdG8gTiA9IDI0IHZhbHVlcyAqLworCisgICAgLyogY2FsY3VsYXRlIHN0YW5kYXJkIGRldmlhdGlvbiAqLworICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgIC8qIHN1bW1lIHsgKChtZWFuX3ZhbC1ucmcpXjIpICogaV9ub0NvbHMxIH0gKi8KKyAgICBmb3IgKGo9c3RhcnRFbmVyZ3k7IGo8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspIHsKKyAgICAgIHRlbXAgPSAoKEZJWFBfREJMKW1lYW5fdmFsIC0gKChGSVhQX0RCTClFbmVyZ2llc1tqXVtpXSA+PiBzY2FsZUZhY3RvcjApKTw8c2hpZnQ7CisgICAgICB0ZW1wID0gZlBvdzIodGVtcCk7CisgICAgICB0ZW1wID0gZk11bHQodGVtcCwgaV9ub0NvbHMxKTsKKyAgICAgIGFjY3UgKz0gdGVtcDsKKyAgICB9CisgICAgZm9yICg7IGo8ZW5kRW5lcmd5OyBqKyspIHsKKyAgICAgIHRlbXAgPSAoKEZJWFBfREJMKW1lYW5fdmFsIC0gKChGSVhQX0RCTClFbmVyZ2llc1tqXVtpXSA+PiBzY2FsZUZhY3RvcjEpKTw8c2hpZnQ7CisgICAgICB0ZW1wID0gZlBvdzIodGVtcCk7CisgICAgICB0ZW1wID0gZk11bHQodGVtcCwgaV9ub0NvbHMxKTsKKyAgICAgIGFjY3UgKz0gdGVtcDsKKyAgICB9CisKKyAgICBzdGRfdmFsID0gc3FydEZpeHAoYWNjdSk+PnNoaWZ0OyAgICAgLyogc3RhbmRhcmQgZGV2aWF0aW9uICovCisKKyAgICAvKgorICAgIFRha2UgbmV3IHRocmVzaG9sZCBhcyBhdmVyYWdlIG9mIGNhbGN1bGF0ZWQgc3RhbmRhcmQgZGV2aWF0aW9uIHJhdGlvCisgICAgYW5kIG9sZCB0aHJlc2hvbGQgaWYgZ3JlYXRlciB0aGFuIGFic29sdXRlIHRocmVzaG9sZAorICAgICovCisgICAgdGVtcCA9ICggY29tbW9uU2NhbGU8PShERlJBQ1RfQklUUy0xKSApCisgICAgICAgICAgICA/IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjZmKSwgdGhyZXNob2xkc1tpXSkgKyAoZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNGYpLCBzdGRfdmFsKSA+PiBjb21tb25TY2FsZSkKKyAgICAgICAgICAgIDogKEZJWFBfREJMKSAwOworCisgICAgdGhyZXNob2xkc1tpXSA9IGZpeE1heChBQlNfVEhSRVMsdGVtcCk7CisKKyAgICBGREtfQVNTRVJUKGNvbW1vblNjYWxlID49IDApOworICB9Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdHJhbnNpZW50IGxldmVscyBmb3IgZWFjaCBRTUYgdGltZSBzbG90LgorICovCitzdGF0aWMgdm9pZAorZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoRklYUF9EQkwgICoqUkVTVFJJQ1QgRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICpSRVNUUklDVCBzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqUkVTVFJJQ1QgdGhyZXNob2xkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHRyYW5zaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5vQ29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHN0YXJ0X2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdG9wX2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0cmFuX29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFkZFByZXZTYW1wbGVzKQoreworICBGSVhQX0RCTCBpX3RocmVzOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoRW5lcmdpZXNUZW1wLCBGSVhQX0RCTCwgMipRTUZfTUFYX1RJTUVfU0xPVFMpOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEVuZXJnaWVzVGVtcCA9IEVuZXJnaWVzVGVtcDsKKyAgaW50IHRtcFNjYWxlRW5lcmdpZXMwLCB0bXBTY2FsZUVuZXJnaWVzMTsKKyAgaW50IGVuZENvbmQ7CisgIGludCBzdGFydEVuZXJnLGVuZEVuZXJnOworICBpbnQgaSxqLGpJbmRleCxqcEJNOworCisgIHRtcFNjYWxlRW5lcmdpZXMwID0gc2NhbGVFbmVyZ2llc1swXTsKKyAgdG1wU2NhbGVFbmVyZ2llczEgPSBzY2FsZUVuZXJnaWVzWzFdOworCisgIC8qIFNjYWxlIHZhbHVlIGZvciBmaXJzdCBlbmVyZ2llcywgdXB0byBZQnVmZmVyV3JpdGVPZmZzZXQgKi8KKyAgdG1wU2NhbGVFbmVyZ2llczAgPSBmaXhNaW4odG1wU2NhbGVFbmVyZ2llczAsIE1BWF9TSElGVF9EQkwpOworICAvKiBTY2FsZSB2YWx1ZSBmb3IgZmlyc3QgZW5lcmdpZXMsIGZyb20gWUJ1ZmZlcldyaXRlT2Zmc2V0IHVwd2FyZHMgKi8KKyAgdG1wU2NhbGVFbmVyZ2llczEgPSBmaXhNaW4odG1wU2NhbGVFbmVyZ2llczEsIE1BWF9TSElGVF9EQkwpOworCisgIEZES19BU1NFUlQoKHRtcFNjYWxlRW5lcmdpZXMwID49IDApICYmICh0bXBTY2FsZUVuZXJnaWVzMSA+PSAwKSk7CisKKyAgLyogS2VlcCBhZGRQcmV2U2FtcGxlcyBleHRyYSBwcmV2aW91cyB0cmFuc2llbnQgY2FuZGlkYXRlcy4gKi8KKyAgRkRLbWVtbW92ZSh0cmFuc2llbnRzLCB0cmFuc2llbnRzICsgbm9Db2xzIC0gYWRkUHJldlNhbXBsZXMsICh0cmFuX29mZithZGRQcmV2U2FtcGxlcykgKiBzaXplb2YgKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHRyYW5zaWVudHMgKyB0cmFuX29mZiArIGFkZFByZXZTYW1wbGVzLCBub0NvbHMgKiBzaXplb2YgKEZJWFBfREJMKSk7CisKKyAgZW5kQ29uZCA9IG5vQ29sczsgLyogQW1vdW50IG9mIG5ldyB0cmFuc2llbnQgdmFsdWVzIHRvIGJlIGNhbGN1bGF0ZWQuICovCisgIHN0YXJ0RW5lcmcgPSAodHJhbl9vZmYtMyk+PllCdWZmZXJTelNoaWZ0OyAvKiA+PllCdWZmZXJTelNoaWZ0IGJlY2F1c2Ugb2YgYW1vdW50IG9mIGVuZXJneSB2YWx1ZXMuIC0zIGJlY2F1c2Ugb2YgbmVpZ2hib3JzIGJlaW5nIHdhdGNoZWQuICovCisgIGVuZEVuZXJnID0gKChub0NvbHMrIChZQnVmZmVyV3JpdGVPZmZzZXQ8PFlCdWZmZXJTelNoaWZ0KSktMSk+PllCdWZmZXJTelNoaWZ0OyAvKiBZQnVmZmVyU3pTaGlmdCBzaGlmdHMgYmVjYXVzZSBvZiBoYWxmIGVuZXJneSB2YWx1ZXMuICovCisKKyAgLyogQ29tcHV0ZSBkaWZmZXJlbnRpYWwgdmFsdWVzIHdpdGggdHdvIGRpZmZlcmVudCB3ZWlnaHRpbmdzIGluIGV2ZXJ5IHN1YmJhbmQgKi8KKyAgZm9yIChpPXN0YXJ0X2JhbmQ7IGk8c3RvcF9iYW5kOyBpKyspCisgIHsKKyAgICBGSVhQX0RCTCB0aHJlcyA9IHRocmVzaG9sZHNbaV07CisKKyAgICBpZigoTE9ORyl0aHJlc2hvbGRzW2ldPj0yNTYpCisgICAgICBpX3RocmVzID0gKExPTkcpKCAoTE9ORylNQVhWQUxfREJMIC8gKCgoKExPTkcpdGhyZXNob2xkc1tpXSkpKzEpICk8PCgzMi0yNCk7CisgICAgZWxzZQorICAgICAgaV90aHJlcyA9IChMT05HKU1BWFZBTF9EQkw7CisKKyAgICAvKiBDb3B5IG9uZSB0aW1lc2xvdCBhbmQgZGUtc2NhbGUgYW5kIGRlLXNxdWlzaCAqLworICAgIGlmIChZQnVmZmVyU3pTaGlmdCA9PSAxKSB7CisgICAgICBmb3Ioaj1zdGFydEVuZXJnOyBqPFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CisgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOworICAgICAgICBFbmVyZ2llc1RlbXBbKGo8PDEpKzFdID0gRW5lcmdpZXNUZW1wW2o8PDFdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMDsKKyAgICAgIH0KKyAgICAgIGZvcig7IGo8PWVuZEVuZXJnOyBqKyspIHsKKyAgICAgICAgRklYUF9EQkwgdG1wID0gRW5lcmdpZXNbal1baV07CisgICAgICAgIEVuZXJnaWVzVGVtcFsoajw8MSkrMV0gPSBFbmVyZ2llc1RlbXBbajw8MV0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3Ioaj1zdGFydEVuZXJnOyBqPFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CisgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOworICAgICAgICBFbmVyZ2llc1RlbXBbal0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMwOworICAgICAgfQorICAgICAgZm9yKDsgajw9ZW5kRW5lcmc7IGorKykgeworICAgICAgICBGSVhQX0RCTCB0bXAgPSBFbmVyZ2llc1tqXVtpXTsKKyAgICAgICAgRW5lcmdpZXNUZW1wW2pdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZXRlY3QgcGVha3MgaW4gZW5lcmd5IHZhbHVlcy4gKi8KKworICAgIGpJbmRleCA9IHRyYW5fb2ZmOworICAgIGpwQk0gPSBqSW5kZXgrYWRkUHJldlNhbXBsZXM7CisKKyAgICBmb3IgKGo9ZW5kQ29uZDsgai0tOyBqSW5kZXgrKywganBCTSsrKQorICAgIHsKKworICAgICAgRklYUF9EQkwgZGVsdGEsIHRyYW47CisgICAgICBpbnQgZDsKKworICAgICAgZGVsdGEgPSAoRklYUF9EQkwpMDsKKyAgICAgIHRyYW4gID0gKEZJWFBfREJMKTA7CisKKyAgICAgIGZvciAoZD0xOyBkPDQ7IGQrKykgeworICAgICAgICBkZWx0YSArPSBwRW5lcmdpZXNUZW1wW2pJbmRleCtkXTsgLyogUiAqLworICAgICAgICBkZWx0YSAtPSBwRW5lcmdpZXNUZW1wW2pJbmRleC1kXTsgLyogTCAqLworICAgICAgICBkZWx0YSAtPSB0aHJlczsKKworICAgICAgICBpZiAoIGRlbHRhID4gKEZJWFBfREJMKTAgKSB7CisgICAgICAgICAgdHJhbiArPSBmTXVsdChpX3RocmVzLCBkZWx0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRyYW5zaWVudHNbanBCTV0gKz0gdHJhbjsKKyAgICB9CisgIH0KKyAgQ19BTExPQ19TQ1JBVENIX0VORChFbmVyZ2llc1RlbXAsIEZJWFBfREJMLCAyKlFNRl9NQVhfVElNRV9TTE9UUyk7Cit9CisKK3ZvaWQKK0ZES3NickVuY190cmFuc2llbnREZXRlY3QoSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKkVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuc2llbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJTelNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZU1pZGRsZUJvcmRlcikKK3sKKyAgaW50IG5vX2NvbHMgPSBoX3NiclRyYW4tPm5vX2NvbHM7CisgIGludCBxbWZTdGFydFNhbXBsZTsKKyAgaW50IGFkZFByZXZTYW1wbGVzOworICBpbnQgdGltZVN0ZXBTaGlmdD0wOworICBpbnQgaSwgY29uZDsKKworICAvKiBXaGVyZSB0byBzdGFydCBsb29raW5nIGZvciB0cmFuc2llbnRzIGluIHRoZSB0cmFuc2llbnQgY2FuZGlkYXRlIGJ1ZmZlciAqLworICBxbWZTdGFydFNhbXBsZSA9IHRpbWVTdGVwICogZnJhbWVNaWRkbGVCb3JkZXI7CisgIC8qIFdlIG5lZWQgdG8gbG9vayBvbmUgdmFsdWUgYmFja3dhcmRzIGluIHRoZSB0cmFuc2llbnRzLCBzbyB3ZSBtaWdodCBuZWVkIG9uZSBtb3JlIHByZXZpb3VzIHZhbHVlLiAqLworICBhZGRQcmV2U2FtcGxlcyA9IChxbWZTdGFydFNhbXBsZSA+IDApID8gMDogMTsKKworICBzd2l0Y2ggKHRpbWVTdGVwKSB7CisgICAgY2FzZSAxOiB0aW1lU3RlcFNoaWZ0ID0gMDsgYnJlYWs7CisgICAgY2FzZSAyOiB0aW1lU3RlcFNoaWZ0ID0gMTsgYnJlYWs7CisgICAgY2FzZSA0OiB0aW1lU3RlcFNoaWZ0ID0gMjsgYnJlYWs7CisgIH0KKworICBjYWxjdWxhdGVUaHJlc2hvbGRzKEVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50aHJlc2hvbGRzLAorICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPm5vX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT5ub19yb3dzLAorICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dHJhbl9vZmYpOworCisgIGV4dHJhY3RUcmFuc2llbnRDYW5kaWRhdGVzKEVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dHJhbnNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT5ub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPm5vX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dHJhbl9vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByZXZTYW1wbGVzICk7CisKKyAgdHJhbnNpZW50X2luZm9bMF0gPSAwOworICB0cmFuc2llbnRfaW5mb1sxXSA9IDA7CisgIHRyYW5zaWVudF9pbmZvWzJdID0gMDsKKworICAvKiBPZmZzZXQgYnkgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHByZXZpb3VzIHRyYW5zaWVudCBjYW5kaWRhdGVzIGJlaW5nIGtlcHQuICovCisgIHFtZlN0YXJ0U2FtcGxlICs9IGFkZFByZXZTYW1wbGVzOworCisgIC8qIENoZWNrIGZvciB0cmFuc2llbnRzIGluIHNlY29uZCBncmFudWxlIChwaWNrIHRoZSBsYXN0IHZhbHVlIG9mIHN1YnNlcXVlbnQgdmFsdWVzKSAgKi8KKyAgZm9yIChpPXFtZlN0YXJ0U2FtcGxlOyBpPHFtZlN0YXJ0U2FtcGxlICsgbm9fY29sczsgaSsrKSB7CisgICAgY29uZCA9ICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkgKQorICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOworCisgICAgaWYgKGNvbmQpIHsKKyAgICAgIHRyYW5zaWVudF9pbmZvWzBdID0gKGkgLSBxbWZTdGFydFNhbXBsZSk+PnRpbWVTdGVwU2hpZnQ7CisgICAgICB0cmFuc2llbnRfaW5mb1sxXSA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIGhfc2JyVHJhbi0+ZnJhbWVTaGlmdCAhPSAwKSB7CisgICAgICAvKiB0cmFuc2llbnQgcHJlZGljdGlvbiBmb3IgTERTQlIgKi8KKyAgICAgIC8qIENoZWNrIGZvciB0cmFuc2llbnRzIGluIGZpcnN0IDxmcmFtZVNoaWZ0PiBxbWYtc2xvdHMgb2Ygc2Vjb25kIGZyYW1lICovCisgICAgICBmb3IgKGk9cW1mU3RhcnRTYW1wbGUrbm9fY29sczsgaTxxbWZTdGFydFNhbXBsZSArIG5vX2NvbHMraF9zYnJUcmFuLT5mcmFtZVNoaWZ0OyBpKyspIHsKKworICAgICAgICBjb25kID0gICAgKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpXSA8IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuOWYpLCBoX3NiclRyYW4tPnRyYW5zaWVudHNbaSAtIDFdKSApCisgICAgICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOworCisgICAgICAgIGlmIChjb25kKSB7CisgICAgICAgICAgaW50IHBvcyA9IChpbnQpICggKGkgLSBxbWZTdGFydFNhbXBsZS1ub19jb2xzKSA+PiB0aW1lU3RlcFNoaWZ0ICk7CisgICAgICAgICAgaWYgKChwb3MgPCAzKSAmJiAodHJhbnNpZW50X2luZm9bMV09PTApKSB7CisgICAgICAgICAgICB0cmFuc2llbnRfaW5mb1syXSA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgIH0KK30KKworaW50CitGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yKEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgc2FtcGxlRnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHRyYW5fZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5vX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5vX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIGZyYW1lU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHRyYW5fb2ZmKQoreworICAgIElOVCB0b3RhbEJpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc3RhbmRhcmRCaXRyYXRlICogcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKKyAgICBJTlQgY29kZWNCaXRyYXRlID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLmJpdFJhdGU7CisgICAgRklYUF9EQkwgYml0cmF0ZUZhY3Rvcl9maXgsIGZyYW1lZHVyX2ZpeDsKKyAgICBJTlQgc2NhbGVfMCwgc2NhbGVfMTsKKworICAgIEZES21lbWNsZWFyKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3Isc2l6ZW9mKFNCUl9UUkFOU0lFTlRfREVURUNUT1IpKTsKKworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPmZyYW1lU2hpZnQgPSBmcmFtZVNoaWZ0OworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmID0gdHJhbl9vZmY7CisKKyAgICBpZihjb2RlY0JpdHJhdGUpIHsKKyAgICAgIGJpdHJhdGVGYWN0b3JfZml4ID0gZkRpdk5vcm0oKEZJWFBfREJMKXRvdGFsQml0cmF0ZSwgKEZJWFBfREJMKShjb2RlY0JpdHJhdGU8PDIpLCZzY2FsZV8wKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBiaXRyYXRlRmFjdG9yX2ZpeCA9IEZMMkZYQ09OU1RfREJMKDEuMC80LjApOworICAgICAgc2NhbGVfMCA9IDA7CisgICAgfQorCisgICAgZnJhbWVkdXJfZml4ID0gZkRpdk5vcm0oZnJhbWVTaXplLCBzYW1wbGVGcmVxKTsKKworICAgIC8qIFRoZSBsb25nZXIgdGhlIGZyYW1lcywgdGhlIG1vcmUgb2Z0ZW4gc2hvdWxkIHRoZSBGSVhGSVgtCisgICAgY2FzZSB0cmFuc21pdCAyIGVudmVsb3BlcyBpbnN0ZWFkIG9mIDEuCisgICAgRnJhbWUgZHVyYXRpb25zIGJlbG93IDEwIG1zIHByb2R1Y2UgdGhlIGhpZ2hlc3QgdGhyZXNob2xkCisgICAgc28gdGhhdCBwcmFjdGljYWxseSBhbHdheXMgb25seSAxIGVudiBpcyB0cmFuc21pdHRlZC4gKi8KKyAgICBGSVhQX0RCTCB0bXAgPSBmcmFtZWR1cl9maXggLSBGTDJGWENPTlNUX0RCTCgwLjAxMCk7CisKKyAgICB0bXAgPSBmaXhNYXgodG1wLCBGTDJGWENPTlNUX0RCTCgwLjAwMDEpKTsKKyAgICB0bXAgPSBmRGl2Tm9ybShGTDJGWENPTlNUX0RCTCgwLjAwMDA3NSksIGZQb3cyKHRtcCksICZzY2FsZV8xKTsKKworICAgIHNjYWxlXzEgPSAtKHNjYWxlXzEgKyBzY2FsZV8wICsgMik7CisKKyAgICBGREtfQVNTRVJUKG5vX2NvbHMgPD0gUU1GX01BWF9USU1FX1NMT1RTKTsKKyAgICBGREtfQVNTRVJUKG5vX3Jvd3MgPD0gUU1GX0NIQU5ORUxTKTsKKworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm5vX2NvbHMgPSBub19jb2xzOworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fdGhyID0gKEZJWFBfREJMKSgocGFyYW1zLT50cmFuX3RociA8PCAoMzItMjQtMSkpIC8gbm9fcm93cyk7CisgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9mYyA9IHRyYW5fZmM7CisKKyAgICBpZiAoc2NhbGVfMT49MCkgeworICAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyID0gZk11bHQodG1wLCBiaXRyYXRlRmFjdG9yX2ZpeCkgPj4gc2NhbGVfMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHIgPSBmTXVsdCh0bXAsIGJpdHJhdGVGYWN0b3JfZml4KSA8PCAoLXNjYWxlXzEpOworICAgIH0KKworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm5vX3Jvd3MgPSBub19yb3dzOworICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm1vZGUgPSBwYXJhbXMtPnRyYW5fZGV0X21vZGU7CisgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkxvd0JhbmRFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgIHJldHVybiAoMCk7Cit9CisKZGlmZiAtLWdpdCBhL2FhYy9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmggYi9hYWMvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjVkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oCkBAIC0wLDAgKzEsMTUwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgVHJhbnNpZW50IGRldGVjdG9yIHByb3RvdHlwZXMgIAorKi8KKyNpZm5kZWYgX19UUkFOX0RFVF9ICisjZGVmaW5lIF9fVFJBTl9ERVRfSAorCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJWFBfREJMICB0cmFuc2llbnRzW1FNRl9NQVhfVElNRV9TTE9UUysoUU1GX01BWF9USU1FX1NMT1RTLzIpXTsKKyAgRklYUF9EQkwgIHRocmVzaG9sZHNbUU1GX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgIHRyYW5fdGhyOyAgICAgICAgICAgICAgLyogTWFzdGVyIHRocmVzaG9sZCBmb3IgdHJhbnNpZW50IHNpZ25hbHMgKi8KKyAgRklYUF9EQkwgIHNwbGl0X3RocjsgICAgICAgICAgICAgLyogVGhyZXNob2xkIGZvciBzcGxpdHRpbmcgRklYRklYLWZyYW1lcyBpbnRvIDIgZW52ICovCisgIEZJWFBfREJMICBwcmV2TG93QmFuZEVuZXJneTsgICAgIC8qIEVuZXJneSBvZiBsb3cgYmFuZCAqLworICBGSVhQX0RCTCAgcHJldkhpZ2hCYW5kRW5lcmd5OyAgICAvKiBFbmVyZ3kgb2YgaGlnaCBiYW5kICovCisgIElOVCAgICB0cmFuX2ZjOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBsb3diYW5kIHN1YmJhbmRzIHRvIGRpc2NhcmQgICovCisgIElOVCAgICBub19jb2xzOworICBJTlQgICAgbm9fcm93czsKKyAgSU5UICAgIG1vZGU7CisKKyAgaW50ICAgIGZyYW1lU2hpZnQ7CisgIGludCAgICB0cmFuX29mZjsgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgcmVhZGluZyBlbmVyZ3kgdmFsdWVzLiAqLworfQorU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUjsKKworCit0eXBlZGVmIFNCUl9UUkFOU0lFTlRfREVURUNUT1IgKkhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SOworCit2b2lkCitGREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnRyYW5fdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lTWlkZGxlQm9yZGVyKTsKKworaW50CitGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yIChIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzYW1wbGVGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHRyYW5fZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbm9fY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBub19yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBmcmFtZVNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHRyYW5fb2ZmKTsKKwordm9pZAorRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoRklYUF9EQkwgKipFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL2luY2x1ZGUvRkRLX2F1ZGlvLmggYi9hYWMvbGliU1lTL2luY2x1ZGUvRkRLX2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2MGY0YwotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTWVMvaW5jbHVkZS9GREtfYXVkaW8uaApAQCAtMCwwICsxLDY1NSBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcZmlsZSAgIEZES19hdWRpby5oCisgKiAgXGJyaWVmICBHbG9iYWwgYXVkaW8gc3RydWN0IGFuZCBjb25zdGFudCBkZWZpbml0aW9ucy4KKyAqLworCisjaWZuZGVmIEZES19BVURJT19ICisjZGVmaW5lIEZES19BVURJT19ICisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKioKKyAqIEZpbGUgZm9ybWF0IGlkZW50aWZpZXJzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgRkZfVU5LTk9XTiAgICAgICAgICAgPSAtMSwgLyoqPCBVbmtub3duIGZvcm1hdC4gICAgICAgICovCisgIEZGX1JBVyAgICAgICAgICAgICAgID0gMCwgIC8qKjwgTm8gY29udGFpbmVyLCBiaXQgc3RyZWFtIGRhdGEgY29udmV5ZWQgImFzIGlzIi4gKi8KKworICBGRl9NUDRfM0dQUCAgICAgICAgICA9IDMsICAvKio8IDNHUFAgZmlsZSBmb3JtYXQuICAgICAgKi8KKyAgRkZfTVA0X01QNEYgICAgICAgICAgPSA0LCAgLyoqPCBNUEVHLTQgRmlsZSBmb3JtYXQuICAgICAqLworCisgIEZGX1JBV1BBQ0tFVFMgICAgICAgID0gNSwgIC8qKjwgUHJvcHJpZXRhcnkgcmF3IHBhY2tldCBmaWxlLiAqLworCisgIEZGX0RSTUNUICAgICAgICAgICAgID0gMTIgIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBDVCBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdC4gKi8KKworfSBGSUxFX0ZPUk1BVDsKKworLyoqCisgKiBUcmFuc3BvcnQgdHlwZSBpZGVudGlmaWVycy4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRUX1VOS05PV04gICAgICAgICAgID0gLTEsIC8qKjwgVW5rbm93biBmb3JtYXQuICAgICAgICAgICAgKi8KKyAgVFRfTVA0X1JBVyAgICAgICAgICAgPSAwLCAgLyoqPCAiYXMgaXMiIGFjY2VzcyB1bml0cyAocGFja2V0IGJhc2VkIHNpbmNlIHRoZXJlIGlzIG9idmlvdXNseSBubyBzeW5jIGxheWVyKSAqLworICBUVF9NUDRfQURJRiAgICAgICAgICA9IDEsICAvKio8IEFESUYgYml0c3RyZWFtIGZvcm1hdC4gICAgICovCisgIFRUX01QNF9BRFRTICAgICAgICAgID0gMiwgIC8qKjwgQURUUyBiaXRzdHJlYW0gZm9ybWF0LiAgICAgKi8KKworICBUVF9NUDRfTEFUTV9NQ1AxICAgICA9IDYsICAvKio8IEF1ZGlvIE11eCBFbGVtZW50cyB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxICovCisgIFRUX01QNF9MQVRNX01DUDAgICAgID0gNywgIC8qKjwgQXVkaW8gTXV4IEVsZW1lbnRzIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZyAqLworCisgIFRUX01QNF9MT0FTICAgICAgICAgID0gMTAsIC8qKjwgQXVkaW8gU3luYyBTdHJlYW0uICAgICAgICAgKi8KKworICBUVF9EUk0gICAgICAgICAgICAgICA9IDEyLCAvKio8IERpZ2l0YWwgUmFkaW8gTW9uZGlhbCAoRFJNMzAvRFJNKykgYml0c3RyZWFtIGZvcm1hdC4gKi8KKworICBUVF9NUDFfTDEgICAgICAgICAgICA9IDE2LCAvKio8IE1QRUcgMSBBdWRpbyBMYXllciAxIGF1ZGlvIGJpdHN0cmVhbS4gKi8KKyAgVFRfTVAxX0wyICAgICAgICAgICAgPSAxNywgLyoqPCBNUEVHIDEgQXVkaW8gTGF5ZXIgMiBhdWRpbyBiaXRzdHJlYW0uICovCisgIFRUX01QMV9MMyAgICAgICAgICAgID0gMTgsIC8qKjwgTVBFRyAxIEF1ZGlvIExheWVyIDMgYXVkaW8gYml0c3RyZWFtLiAqLworCisgIFRUX1JTVkQ1MCAgICAgICAgICAgID0gNTAgLyoqPCAqLworCit9IFRSQU5TUE9SVF9UWVBFOworCisjZGVmaW5lIFRUX0lTX1BBQ0tFVCh4KSBcCisgICAgICAgKCAoKHgpID09IFRUX01QNF9SQVcpIFwKKyAgICAgIHx8ICgoeCkgPT0gVFRfRFJNKSBcCisgICAgICB8fCAoKHgpID09IFRUX01QNF9MQVRNX01DUDApIFwKKyAgICAgIHx8ICgoeCkgPT0gVFRfTVA0X0xBVE1fTUNQMSkgKQorCisvKioKKyAqIEF1ZGlvIE9iamVjdCBUeXBlIGRlZmluaXRpb25zLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKKyAgQU9UX05VTExfT0JKRUNUICAgICAgPSAwLAorICBBT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0FBQ19MQyAgICAgICAgICAgPSAyLCAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9BQUNfU1NSICAgICAgICAgID0gMywKKyAgQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAorICBBT1RfU0JSICAgICAgICAgICAgICA9IDUsCisgIEFPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKKyAgQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAorICBBT1RfQ0VMUCAgICAgICAgICAgICA9IDgsCisgIEFPVF9IVlhDICAgICAgICAgICAgID0gOSwKKyAgQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfUlNWRF8xMSAgICAgICAgICA9IDExLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfV0FWX1RBQl9TWU5USCAgICA9IDE0LCAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCisgIEFPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLworICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvdyBDb21wbGV4aXR5ICAgICovCisgIEFPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLworICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIFNjYWxhYmxlIG9iamVjdCAgICovCisgIEFPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KKyAgQU9UX0VSX0JTQUMgICAgICAgICAgPSAyMiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLworICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvd0RlbGF5IG9iamVjdCAgICovCisgIEFPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KKyAgQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLworICBBT1RfRVJfSElMTiAgICAgICAgICA9IDI2LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSElMTiBvYmplY3QgICAgICAgICAgICovCisgIEFPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KKyAgQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAvKio8IFBTLCBQYXJhbWV0cmljIFN0ZXJlbyAoaW5jbHVkZXMgU0JSKSAgICAgICovCisgIEFPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBBT1RfRVNDQVBFICAgICAgICAgICA9IDMxLCAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCisKKyAgQU9UX01QM09OTVA0X0wxICAgICAgPSAzMiwgLyoqPCBNUEVHLUxheWVyMSBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1JTVkRfMzUgICAgICAgICAgPSAzNSwgLyoqPCBtaWdodCBiZWNvbWUgRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1NMUyAgICAgICAgICAgICAgPSAzOCwgLyoqPCBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCisKKyAgQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfU0FPQyAgICAgICAgICAgICA9IDQzLCAvKio8IFNBT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KKworICBBT1RfUlNWRDUwICAgICAgICAgICA9IDUwLCAgLyoqPCBJbnRlcmltIEFPVCBmb3IgUnN2ZDUwICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogUHNldWRvIEFPVHMgKi8KKyAgQU9UX01QMl9BQUNfTUFJTiAgICAgPSAxMjgsIC8qKjwgVmlydHVhbCBBT1QgTVAyIE1haW4gcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NUDJfQUFDX0xDICAgICAgID0gMTI5LCAvKio8IFZpcnR1YWwgQU9UIE1QMiBMb3cgQ29tcGxleGl0eSBwcm9maWxlICAgICAgICAgICAgICAgICAqLworICBBT1RfTVAyX0FBQ19TU1IgICAgICA9IDEzMCwgLyoqPCBWaXJ0dWFsIEFPVCBNUDIgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZSBwcm9maWxlICAgICAgICAgKi8KKworICBBT1RfTVAyX1NCUiAgICAgICAgICA9IDEzMiwgLyoqPCBWaXJ0dWFsIEFPVCBNUDIgTG93IENvbXBsZXhpdHkgUHJvZmlsZSB3aXRoIFNCUiAgICAgICAgKi8KKworICBBT1RfREFCICAgICAgICAgICAgICA9IDEzNCwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgREFCIChMYXllcjIgd2l0aCBzY2FsZWZhY3RvciBDUkMpICAgICAgKi8KKyAgQU9UX0RBQlBMVVNfQUFDX0xDICAgPSAxMzUsIC8qKjwgVmlydHVhbCBBT1QgZm9yIERBQiBwbHVzIEFBQy1MQyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9EQUJQTFVTX1NCUiAgICAgID0gMTM2LCAvKio8IFZpcnR1YWwgQU9UIGZvciBEQUIgcGx1cyBIRS1BQUMgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfREFCUExVU19QUyAgICAgICA9IDEzNywgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgREFCIHBsdXMgSEUtQUFDIHYyICAgICAgICAgICAgICAgICAgICAgKi8KKworICBBT1RfUExBSU5fTVAxICAgICAgICA9IDE0MCwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgcGxhaW4gbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1BMQUlOX01QMiAgICAgICAgPSAxNDEsIC8qKjwgVmlydHVhbCBBT1QgZm9yIHBsYWluIG1wMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9QTEFJTl9NUDMgICAgICAgID0gMTQyLCAvKio8IFZpcnR1YWwgQU9UIGZvciBwbGFpbiBtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFPVF9EUk1fQUFDICAgICAgICAgID0gMTQzLCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGhvdXQgU0JSKSAgICAgICAgICAqLworICBBT1RfRFJNX1NCUiAgICAgICAgICA9IDE0NCwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIChFUi1BQUMtU0NBTCB3aXRoIFNCUikgICAgICAgICAgICAgKi8KKyAgQU9UX0RSTV9NUEVHX1BTICAgICAgPSAxNDUsIC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSAoRVItQUFDLVNDQUwgd2l0aCBTQlIgYW5kIE1QRUctUFMpICovCisgIEFPVF9EUk1fU1VSUk9VTkQgICAgID0gMTQ2LCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gU3Vycm91bmQgKEVSLUFBQy1TQ0FMICgrU0JSKSArTVBTKSAqLworCisgIEFPVF9NUDJfUFMgICAgICAgICAgID0gMTU2LCAvKio8IFZpcnR1YWwgQU9UIE1QMiBMb3cgQ29tcGxleGl0eSBQcm9maWxlIHdpdGggU0JSIGFuZCBQUyAqLworCisgIEFPVF9NUEVHU19SRVNJRFVBTFMgID0gMjU2ICAvKio8IFZpcnR1YWwgQU9UIGZvciBNUEVHIFN1cnJvdW5kIHJlc2lkdWFscyAgICAgICAgICAgICAgICAqLworCit9IEFVRElPX09CSkVDVF9UWVBFOworCisjZGVmaW5lIElTX1VTQUMoYW90KSBcCisgICgoYW90KSA9PSBBT1RfVVNBQyBcCit8fCAoYW90KSA9PSBBT1RfUlNWRDUwKQorCisjZGVmaW5lIElTX0xPV0RFTEFZKGFvdCkgXAorICAoKGFvdCkgPT0gQU9UX0VSX0FBQ19MRCBcCit8fCAoYW90KSA9PSBBT1RfRVJfQUFDX0VMRCkKKworLyoqIENoYW5uZWwgTW9kZSAoIDEtNyBlcXVhbHMgTVBFRyBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLCBvdGhlcnMgYXJlIGFyYml0cmFyeSkuICovCit0eXBlZGVmIGVudW0geworICBNT0RFX0lOVkFMSUQgICAgICAgICAgICAgICAgICA9IC0xLAorICBNT0RFX1VOS05PV04gICAgICAgICAgICAgICAgICA9ICAwLAorICBNT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICA9ICAxLCAgICAgICAvKio8IEMgKi8KKyAgTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgPSAgMiwgICAgICAgLyoqPCBMK1IgKi8KKyAgTU9ERV8xXzIgICAgICAgICAgICAgICAgICAgICAgPSAgMywgICAgICAgLyoqPCBDLCBMK1IgKi8KKyAgTU9ERV8xXzJfMSAgICAgICAgICAgICAgICAgICAgPSAgNCwgICAgICAgLyoqPCBDLCBMK1IsIFJlYXIgKi8KKyAgTU9ERV8xXzJfMiAgICAgICAgICAgICAgICAgICAgPSAgNSwgICAgICAgLyoqPCBDLCBMK1IsIExTK1JTICovCisgIE1PREVfMV8yXzJfMSAgICAgICAgICAgICAgICAgID0gIDYsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUywgTEZFICovCisgIE1PREVfMV8yXzJfMl8xICAgICAgICAgICAgICAgID0gIDcsICAgICAgIC8qKjwgQywgTEMrUkMsIEwrUiwgTFMrUlMsIExGRSAqLworCisKKyAgTU9ERV8xXzEgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgLyoqPCAyIFNDRXMgKGR1YWwgbW9ubykgKi8KKyAgTU9ERV8xXzFfMV8xICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCA0IFNDRXMgKi8KKyAgTU9ERV8xXzFfMV8xXzFfMSAgICAgICAgICAgICAgPSAxOCwgICAgICAgLyoqPCA2IFNDRXMgKi8KKyAgTU9ERV8xXzFfMV8xXzFfMV8xXzEgICAgICAgICAgPSAxOSwgICAgICAgLyoqPCA4IFNDRXMgKi8KKyAgTU9ERV8xXzFfMV8xXzFfMV8xXzFfMV8xXzFfMSAgPSAyMCwgICAgICAgLyoqPCAxMiBTQ0VzICovCisKKyAgTU9ERV8yXzIgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgLyoqPCAyIENQRXMgKi8KKyAgTU9ERV8yXzJfMiAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgLyoqPCAzIENQRXMgKi8KKyAgTU9ERV8yXzJfMl8yICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCA0IENQRXMgKi8KKyAgTU9ERV8yXzJfMl8yXzJfMiAgICAgICAgICAgICAgPSAyNCwgICAgICAgLyoqPCA2IENQRXMgKi8KKworICBNT0RFXzJfMSAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAvKio8IENQRSxTQ0UgKEFSSUIgc3RhbmRhcmQgQjMyKSAqLworCisgIE1PREVfN18xX1JFQVJfU1VSUk9VTkQgICAgICAgID0gMzMsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUywgTHJlYXIrUnJlYXIsIExGRSAqLworICBNT0RFXzdfMV9GUk9OVF9DRU5URVIgICAgICAgICA9IDM0ICAgICAgICAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KKworfSBDSEFOTkVMX01PREU7CisKKy8qKgorICogU3BlYWtlciBkZXNjcmlwdGlvbiB0YWdzLgorICogRG8gbm90IGNoYW5nZSB0aGUgZW51bWVyYXRpb24gdmFsdWVzIHVubGVzcyBpdCBrZWVwcyB0aGUgZm9sbG93aW5nIHNlZ21lbnRhdGlvbjoKKyAqIC0gQml0IDAtMzogSG9yaXpvbnRhbCBwb3N0aW9uICgwOiBub25lLCAxOiBmcm9udCwgMjogc2lkZSwgMzogYmFjaywgNDogbGZlKQorICogLSBCaXQgNC03OiBWZXJ0aWNhbCBwb3NpdGlvbiAoMDogbm9ybWFsLCAxOiB0b3AsIDI6IGJvdHRvbSkKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQUNUX05PTkUgICAgICAgICA9IDB4MDAsCisgIEFDVF9GUk9OVCAgICAgICAgPSAweDAxLCAgLyohPCBGcm9udCBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLworICBBQ1RfU0lERSAgICAgICAgID0gMHgwMiwgIC8qITwgU2lkZSBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLworICBBQ1RfQkFDSyAgICAgICAgID0gMHgwMywgIC8qITwgQmFjayBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLworICBBQ1RfTEZFICAgICAgICAgID0gMHgwNCwgIC8qITwgTG93IGZyZXF1ZW5jeSBlZmZlY3Qgc3BlYWtlciBwb3N0aW9uIChmcm9udCkgKi8KKworICBBQ1RfVE9QICAgICAgICAgID0gMHgxMCwgIC8qITwgVG9wIHNwZWFrZXIgYXJlYSAoZm9yIGNvbWJpbmF0aW9uIHdpdGggc3BlYWtlciBwb3NpdGlvbnMpICovCisgIEFDVF9GUk9OVF9UT1AgICAgPSAweDExLCAgLyohPCBUb3AgZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX1RPUCkgKi8KKyAgQUNUX1NJREVfVE9QICAgICA9IDB4MTIsICAvKiE8IFRvcCBzaWRlIHNwZWFrZXIgID0gKEFDVF9TSURFIHxBQ1RfVE9QKSAqLworICBBQ1RfQkFDS19UT1AgICAgID0gMHgxMywgIC8qITwgVG9wIGJhY2sgc3BlYWtlciAgPSAoQUNUX0JBQ0sgfEFDVF9UT1ApICovCisKKyAgQUNUX0JPVFRPTSAgICAgICA9IDB4MjAsICAvKiE8IEJvdHRvbSBzcGVha2VyIGFyZWEgKGZvciBjb21iaW5hdGlvbiB3aXRoIHNwZWFrZXIgcG9zaXRpb25zKSAqLworICBBQ1RfRlJPTlRfQk9UVE9NID0gMHgyMSwgIC8qITwgQm90dG9tIGZyb250IHNwZWFrZXIgPSAoQUNUX0ZST05UfEFDVF9CT1RUT00pICovCisgIEFDVF9TSURFX0JPVFRPTSAgPSAweDIyLCAgLyohPCBCb3R0b20gc2lkZSBzcGVha2VyICA9IChBQ1RfU0lERSB8QUNUX0JPVFRPTSkgKi8KKyAgQUNUX0JBQ0tfQk9UVE9NICA9IDB4MjMgICAvKiE8IEJvdHRvbSBiYWNrIHNwZWFrZXIgID0gKEFDVF9CQUNLIHxBQ1RfQk9UVE9NKSAqLworCit9IEFVRElPX0NIQU5ORUxfVFlQRTsKKwordHlwZWRlZiBlbnVtCit7CisgIFNJR19VTktOT1dOICAgICAgICAgICAgICAgICA9IC0xLAorICBTSUdfSU1QTElDSVQgICAgICAgICAgICAgICAgPSAgMCwKKyAgU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUgID0gIDEsCisgIFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgICA9ICAyCisKK30gU0JSX1BTX1NJR05BTElORzsKKworLyoqCisgKiBBdWRpbyBDb2RlYyBmbGFncy4KKyAqLworI2RlZmluZSBBQ19FUl9WQ0IxMSAgICAgMHgwMDAwMDEgIC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSB2aXJ0dWFsIGNvZGVib29rcyAgKi8KKyNkZWZpbmUgQUNfRVJfUlZMQyAgICAgIDB4MDAwMDAyICAvKiE8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIGh1ZmZtYW4gY29kZXdvcmQgcmVvcmRlcmluZyAqLworI2RlZmluZSBBQ19FUl9IQ1IgICAgICAgMHgwMDAwMDQgIC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSB2aXJ0dWFsIGNvZGVib29rcyAgKi8KKyNkZWZpbmUgQUNfU0NBTEFCTEUgICAgIDB4MDAwMDA4ICAvKiE8IEFBQyBTY2FsYWJsZSovCisjZGVmaW5lIEFDX0VMRCAgICAgICAgICAweDAwMDAxMCAgLyohPCBBQUMtRUxEICovCisjZGVmaW5lIEFDX0xEICAgICAgICAgICAweDAwMDAyMCAgLyohPCBBQUMtTEQgKi8KKyNkZWZpbmUgQUNfRVIgICAgICAgICAgIDB4MDAwMDQwICAvKiE8IEVSIHN5bnRheCAqLworI2RlZmluZSBBQ19CU0FDICAgICAgICAgMHgwMDAwODAgIC8qITwgQlNBQyAqLworI2RlZmluZSBBQ19VU0FDICAgICAgICAgMHgwMDAxMDAgIC8qITwgVVNBQyAqLworI2RlZmluZSBBQ19VU0FDX1RXICAgICAgMHgwMDAyMDAgIC8qITwgVVNBQyB0aW1lIHdhcnBlZCBmaWx0ZXIgYmFuayBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfVVNBQ19OT0lTRSAgIDB4MDAwNDAwICAvKiE8IFVTQUMgbm9pc2UgZmlsbGluZyBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfVVNBQ19IQkUgICAgIDB4MDAwODAwICAvKiE8IFVTQUMgaGFybW9uaWMgYmFuZHdpZHRoIGV4dGVuc2lvbiBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfUlNWRDUwICAgICAgIDB4MDAxMDAwICAvKiE8IFJzdmQ1MCAqLworI2RlZmluZSBBQ19TQlJfUFJFU0VOVCAgMHgwMDIwMDAgIC8qITwgU0JSIHByZXNlbnQgZmxhZyAoZnJvbSBBU0MpICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX1NCUkNSQyAgICAgICAweDAwNDAwMCAgLyohPCBTQlIgQ1JDIHByZXNlbnQgZmxhZy4gT25seSByZWxldmFudCBmb3IgQUFDLUVMRCBmb3Igbm93LiAqLworI2RlZmluZSBBQ19QU19QUkVTRU5UICAgMHgwMDgwMDAgIC8qITwgUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgICovCisjZGVmaW5lIEFDX01QU19QUkVTRU5UICAweDAxMDAwMCAgLyohPCBNUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgKi8KKyNkZWZpbmUgQUNfRFJNICAgICAgICAgIDB4MDIwMDAwICAvKiE8IERSTSBiaXQgc3RyZWFtIHN5bnRheCAqLworI2RlZmluZSBBQ19JTkRFUCAgICAgICAgMHgwNDAwMDAgIC8qITwgSW5kZXBlbmRlbmN5IGZsYWcgKi8KKyNkZWZpbmUgQUNfTVBTX1JFUyAgICAgIDB4MDgwMDAwICAvKiE8IE1QUyByZXNpZHVhbCBpbmRpdmlkdWFsIGNoYW5uZWwgZGF0YS4gKi8KKyNkZWZpbmUgQUNfREFCICAgICAgICAgIDB4ODAwMDAwICAvKiE8IERBQiBiaXQgc3RyZWFtIHN5bnRheCAqLworI2RlZmluZSBBQ19MRF9NUFMgICAgIDB4MDEwMDAwMDAgIC8qITwgTG93IERlbGF5IE1QUy4gKi8KKworCisvKiBDT0RFUl9DT05GSUc6OmZsYWdzICovCisjZGVmaW5lIENDX01QRUdfSUQgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIENDX0lTX0JBU0VMQVlFUiAgICAweDAwMjAwMDAwCisjZGVmaW5lIENDX1BST1RFQ1RJT04gICAgICAweDAwNDAwMDAwCisjZGVmaW5lIENDX1NCUiAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENDX1NCUkNSQyAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIENDX1JWTEMgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENDX1ZDQjExICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENDX0hDUiAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIENDX1BTRVVET19TVVJST1VORCAweDA4MDAwMDAwCisjZGVmaW5lIENDX1VTQUNfTk9JU0UgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENDX1VTQUNfVFcgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENDX1VTQUNfSEJFICAgICAgICAweDQwMDAwMDAwCisKKy8qKiBHZW5lcmljIGF1ZGlvIGNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKS4gICAgICAgICAgICovCisgIEFVRElPX09CSkVDVF9UWVBFIGV4dEFPVDsgICAgICAvKio8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoU0JSKS4gKi8KKyAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlOyAgICAgIC8qKjwgQ2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgICAgICAgIHNhbXBsaW5nUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlLiAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAvKio8IEV4dGVuZGVkIHNhbXBsZXJhdGUgKFNCUikuICAgICAgICAgKi8KKyAgSU5UICAgICAgICBiaXRSYXRlOyAgICAgICAgICAgIC8qKjwgQXZlcmFnZSBiaXRyYXRlLiAgICAgICAgICAgICAgICAgICAqLworICBpbnQgICAgICAgIHNhbXBsZXNQZXJGcmFtZTsgICAgLyoqPCBOdW1iZXIgb2YgUENNIHNhbXBsZXMgcGVyIGNvZGVjIGZyYW1lIGFuZCBhdWRpbyBjaGFubmVsLiAqLworICBpbnQgICAgICAgIG5vQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuICAgICAgICAgICovCisgIGludCAgICAgICAgYml0c0ZyYW1lOworICBpbnQgICAgICAgIG5TdWJGcmFtZXM7ICAgICAgICAgLyoqPCBBbW91bnQgb2YgZW5jb2RlciBzdWJmcmFtZXMuIDEgbWVhbnMgbm8gc3ViZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICAgICAgICBCU0FDbnVtT2ZTdWJGcmFtZTsgIC8qKjwgVGhlIG51bWJlciBvZiB0aGUgc3ViLWZyYW1lcyB3aGljaCBhcmUgZ3JvdXBlZCBhbmQgdHJhbnNtaXR0ZWQgaW4gYSBzdXBlci1mcmFtZSAoQlNBQykuICovCisgIGludCAgICAgICAgQlNBQ2xheWVyTGVuZ3RoOyAgICAvKio8IFRoZSBhdmVyYWdlIGxlbmd0aCBvZiB0aGUgbGFyZ2Utc3RlcCBsYXllcnMgaW4gYnl0ZXMgKEJTQUMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVSU5UICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgLyoqPCBmbGFncyAqLworICBVQ0hBUiAgICAgIG1hdHJpeE1peGRvd25BOyAgICAgLyoqPCBNYXRyaXggbWl4ZG93biBpbmRleCB0byBwdXQgaW50byBQQ0UuIERlZmF1bHQgdmFsdWUgMCBtZWFucyBubyBtaXhkb3duIGNvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXJlIDEtNCB3aGljaCBjb3JyZXNwb25kIHRvIG1hdHJpeF9taXhkb3duX2lkeCAwLTMuICovCisgIFVDSEFSICAgICAgaGVhZGVyUGVyaW9kOyAgICAgICAvKio8IEZyYW1lIHBlcmlvZCBmb3Igc2VuZGluZyBpbiBiYW5kIGNvbmZpZ3VyYXRpb24gYnVmZmVycyBpbiB0aGUgdHJhbnNwb3J0IGxheWVyLiAqLworCisgIFVDSEFSICAgICAgc3RlcmVvQ29uZmlnSW5kZXg7IC8qKjwgVVNBQyBNUFMgc3RlcmVvIG1vZGUgKi8KKyAgVUNIQVIgICAgICBzYnJNb2RlOyAgICAgICAgICAgLyoqPCBVU0FDIFNCUiBtb2RlICovCisgIFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nOy8qKjwgMDogaW1wbGljaXQgc2lnbmFsaW5nLCAxOiBiYWNrd2FyZHMgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcsIDI6IGhpZXJhcmNpY2FsIGV4cGxpY2l0IHNpZ25hbGluZyAqLworCisgIFVDSEFSICAgICAgc2JyUHJlc2VudDsKKyAgVUNIQVIgICAgICBwc1ByZXNlbnQ7Cit9IENPREVSX0NPTkZJRzsKKworLyoqIE1QNCBFbGVtZW50IElEcy4gKi8KK3R5cGVkZWYgZW51bQoreworICBJRF9OT05FID0gLTEsICAgLyoqPCBJbnZhbGlkIEVsZW1lbnQgaGVscGVyIElELiAgICAgICAgICAgICAqLworICBJRF9TQ0UgPSAwLCAgICAgLyoqPCBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAqLworICBJRF9DUEUgPSAxLCAgICAgLyoqPCBDaGFubmVsIFBhaXIgRWxlbWVudC4gICAgICAgICAgICAgICAgICAqLworICBJRF9DQ0UgPSAyLCAgICAgLyoqPCBDb3VwbGluZyBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAqLworICBJRF9MRkUgPSAzLCAgICAgLyoqPCBMRkUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAqLworICBJRF9EU0UgPSA0LCAgICAgLyoqPCBDdXJyZW50bHkgb25lIERhdGEgU3RyZWFtIEVsZW1lbnQgZm9yIGFuY2lsbGFyeSBkYXRhIGlzIHN1cHBvcnRlZC4gKi8KKyAgSURfUENFID0gNSwgICAgIC8qKjwgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4gICAgICAgICAgICAgICAgKi8KKyAgSURfRklMID0gNiwgICAgIC8qKjwgRmlsbCBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSURfRU5EID0gNywgICAgIC8qKjwgQXJuaWUgKEVuZCBFbGVtZW50ID0gVGVybWluYXRvcikuICAgICAgKi8KKyAgSURfRVhUID0gOCwgICAgIC8qKjwgRXh0ZW5zaW9uIFBheWxvYWQgKEVSIG9ubHkpLiAgICAgICAgICAgKi8KKyAgSURfU0NBTCA9IDksICAgIC8qKjwgQUFDIHNjYWxhYmxlIGVsZW1lbnQgKEVSIG9ubHkpLiAgICAgICAgKi8KKyAgSURfTEFTVAorfSBNUDRfRUxFTUVOVF9JRDsKKworI2RlZmluZSBJU19DSEFOTkVMX0VMRU1FTlQoZWxlbWVudElkKSBcCisgICgoZWxlbWVudElkKSA9PSBJRF9TQ0UgXAorfHwgKGVsZW1lbnRJZCkgPT0gSURfQ1BFIFwKK3x8IChlbGVtZW50SWQpID09IElEX0xGRSkKKworI2RlZmluZSBFWFRfSURfQklUUyA0ICAvKio8IFNpemUgaW4gYml0cyBvZiBleHRlbnNpb24gcGF5bG9hZCB0eXBlIHRhZ3MuICovCisKKy8qKiBFeHRlbnNpb24gcGF5bG9hZCB0eXBlcy4gKi8KK3R5cGVkZWYgZW51bSB7CisgIEVYVF9GSUwgICAgICAgICAgID0gMHgwMCwKKyAgRVhUX0ZJTExfREFUQSAgICAgPSAweDAxLAorICBFWFRfREFUQV9FTEVNRU5UICA9IDB4MDIsCisgIEVYVF9EQVRBX0xFTkdUSCAgID0gMHgwMywKKyAgRVhUX0xEU0FDX0RBVEEgICAgPSAweDA5LAorICBFWFRfU0FPQ19EQVRBICAgICA9IDB4MGEsCisgIEVYVF9EWU5BTUlDX1JBTkdFID0gMHgwYiwKKyAgRVhUX1NBQ19EQVRBICAgICAgPSAweDBjLAorICBFWFRfU0JSX0RBVEEgICAgICA9IDB4MGQsCisgIEVYVF9TQlJfREFUQV9DUkMgID0gMHgwZQorfSBFWFRfUEFZTE9BRF9UWVBFOworCisKKy8qKgorICogUHJvcHJpZXRhcnkgcmF3IHBhY2tldCBmaWxlIGNvbmZpZ3VyYXRpb24gZGF0YSB0eXBlIGlkZW50aWZpZXIuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBUQ19OT1RISU5HID0gMCwgICAgIC8qIE5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIC0+IGluLWJhbmQgY29uZmlndXJhdGlvbi4gICAqLworICBUQ19SQVdfQVNDLCAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBBdWRpb1NwZWNpZmljQ29uZmlnLiAqLworICBUQ19SQVdfU01DLCAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBTdHJlYW1NdXhDb25maWcuICAgICAqLworICBUQ19SQVdfU0RDICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBEcm0gU0RDLiAgICAgICAgICAgICAqLworCit9IFRQX0NPTkZJR19UWVBFOworCisvKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogTGlicmFyeSBpZGVudGlmaWNhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworLyogXGNvbmQgKi8KKyNkZWZpbmUgTU9EVUxFX0lEX01BU0sgICgweDAwMDAwMGZmKQorI2RlZmluZSBNT0RVTEVfSURfU0hJRlQgKDI0KQorCit0eXBlZGVmIGVudW0geworICBGREtfTk9ORSAgID0gMCwKKyAgRkRLX1RPT0xTICA9IDEsCisgIEZES19TWVNMSUIgPSAyLAorICBGREtfQUFDREVDID0gMywKKyAgRkRLX0FBQ0VOQyA9IDQsCisgIEZES19TQlJERUMgPSA1LAorICBGREtfU0JSRU5DID0gNiwKKyAgRkRLX1RQREVDICA9IDcsCisgIEZES19UUEVOQyAgPSA4LAorICBGREtfTVBTREVDID0gOSwKKyAgRkRLX01QRUdGSUxFUkVBRCAgPSAxMCwKKyAgRkRLX01QRUdGSUxFV1JJVEUgPSAxMSwKKyAgRkRLX01QMkRFQyA9IDEyLAorICBGREtfREFCREVDID0gMTMsCisgIEZES19EQUJQQVJTRSA9IDE0LAorICBGREtfRFJNREVDID0gMTUsCisgIEZES19EUk1QQVJTRSA9IDE2LAorICBGREtfQUFDTERFTkMgPSAxNywKKyAgRkRLX01QMkVOQyA9IDE4LAorICBGREtfTVAzRU5DID0gMTksCisgIEZES19NUDNERUMgPSAyMCwKKyAgRkRLX01QM0hFQURQSE9ORSA9IDIxLAorICBGREtfTVAzU0RFQyA9IDIyLAorICBGREtfTVAzU0VOQyA9IDIzLAorICBGREtfRUFFQyAgICA9IDI0LAorICBGREtfREFCRU5DICA9IDI1LAorICBGREtfRE1CREVDICA9IDI2LAorICBGREtfRkRSRVZFUkIgPSAyNywKKyAgRkRLX0RSTUVOQyAgPSAyOCwKKyAgRkRLX01FVEFEQVRBVFJBTlNDT0RFUiA9IDI5LAorICBGREtfQUMzREVDID0gMzAsCisgIEZES19QQ01ETVggPSAzMSwKKworICBGREtfTU9EVUxFX0xBU1QKKworfSBGREtfTU9EVUxFX0lEOworCisvKiBBQUMgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDQVBGX0FBQ19MQyAgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgQ29tcGxleGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0xEICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBEZWxheSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfU0NBTCAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgU2NhbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0VSX0FBQ19MQyAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICovCisjZGVmaW5lIENBUEZfQUFDXzQ4MCAgICAgICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggNDgwIGZyYW1lbGVuZ3RoLiAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfNTEyICAgICAgICAgIDB4MDAwMDAwMjAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCA1MTIgZnJhbWVsZW5ndGguICAqLworI2RlZmluZSBDQVBGX0FBQ185NjAgICAgICAgICAgMHgwMDAwMDA0MCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDk2MCBmcmFtZWxlbmd0aC4gICovCisjZGVmaW5lIENBUEZfQUFDXzEwMjQgICAgICAgICAweDAwMDAwMDgwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggMTAyNCBmcmFtZWxlbmd0aC4gKi8KKyNkZWZpbmUgQ0FQRl9BQUNfSENSICAgICAgICAgIDB4MDAwMDAxMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcuICAgICovCisjZGVmaW5lIENBUEZfQUFDX1ZDQjExICAgICAgICAweDAwMDAwMjAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFZpcnR1YWwgQ29kZWJvb2sgMTEuICAgICovCisjZGVmaW5lIENBUEZfQUFDX1JWTEMgICAgICAgICAweDAwMDAwNDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFJldmVyc2libGUgVmFyaWFibGUgTGVuZ3RoIENvZGluZy4gICAqLworI2RlZmluZSBDQVBGX0FBQ19NUEVHNCAgICAgICAgMHgwMDAwMDgwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgZmlsZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfRFJDICAgICAgICAgIDB4MDAwMDEwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRHluYW1pYyBSYW5nZSBDb250cm9sLiAqLworI2RlZmluZSBDQVBGX0FBQ19DT05DRUFMTUVOVCAgMHgwMDAwMjAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBjb25jZWFsbWVudC4gICAgICAgICAgICovCisjZGVmaW5lIENBUEZfQUFDX0RSTV9CU0ZPUk1BVCAweDAwMDA0MDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIERSTSBiaXN0cmVhbSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0VMRCAgICAgICAweDAwMDA4MDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIEVuaGFuY2VkIExvdyBEZWxheSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICAqLworI2RlZmluZSBDQVBGX0VSX0FBQ19CU0FDICAgICAgMHgwMDAxMDAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBCU0FDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfQUFDX1NVUEVSRlJBTUlORyAweDAwMDIwMDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFN1cGVyZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUcmFuc3BvcnQgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDQVBGX0FEVFMgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCisjZGVmaW5lIENBUEZfQURJRiAgICAgICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQURJRiB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9MQVRNICAgICAgICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMQVRNIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX0xPQVMgICAgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExPQVMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCisjZGVmaW5lIENBUEZfUkFXUEFDS0VUUyAgICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUkFXIFBBQ0tFVFMgdHJhbnNwb3J0IGZvcm1hdC4gKi8KKyNkZWZpbmUgQ0FQRl9EUk0gICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEUk0vRFJNKyB0cmFuc3BvcnQgZm9ybWF0LiAgICAqLworI2RlZmluZSBDQVBGX1JTVkQ1MCAgICAgICAgICAgMHgwMDAwMDA0MCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFJTVkQ1MCB0cmFuc3BvcnQgZm9ybWF0ICAgICAgICovCisKKy8qIFNCUiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENBUEZfU0JSX0xQICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIExvdyBQb3dlciBtb2RlLiAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfSFEgICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgSGlnaCBRdWFsaXR5IG1vZGUuICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9EUk1fQlMgICAgICAgMHgwMDAwMDAwNCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0NPTkNFQUxNRU5UICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIGNvbmNlYWxtZW50LiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRFJDICAgICAgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAqLworI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHICAgICAgMHgwMDAwMDAyMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgUGFyYW1ldHJpYyBTdGVyZW8uICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX1BTX0RSTSAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNIFBhcmFtZXRyaWMgU3RlcmVvLiAgICAgICAgKi8KKworLyogTVAyIGVuY29kZXIgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDQVBGX01QMkVOQ19TUyAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNlYW1sZXNzIFN3aXRjaGluZy4gICAgICAgICAgICovCisjZGVmaW5lIENBUEZfTVAyRU5DX0RBQiAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTGF5ZXIyIERBQi4gICAgICAgICAgICAgICAgICAgKi8KKworLyogREFCIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgQ0FQRl9EQUJfTVAyICAgICAgICAgIDB4MDAwMDAwMDEgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMYXllcjIgREFCLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0RBQl9BQUMgICAgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERBQisgKEhFLUFBQyB2MikuICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfREFCX1BBRCAgICAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUEFEIGV4dHJhY3Rpb24uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9EQUJfRFJDICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICAgICAqLworI2RlZmluZSBDQVBGX0RBQl9TVVJST1VORCAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERBQiBTdXJyb3VuZCAoTVBTKS4gICAgICAgICAgICovCisKKy8qIERNQiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENBUEZfRE1CX0JTQUMgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRVIgQUFDIEJTQUMuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9ETUJfRFJDICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICAgICAqLworI2RlZmluZSBDQVBGX0RNQl9TVVJST1VORCAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERNQiBTdXJyb3VuZCAoTVBTKS4gICAgICAgICAgICovCisKKy8qIFBDTSB1cC9kb3dubW1peCBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENBUEZfRE1YX0JMSU5EICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgYmxpbmQgZG93bm1peGluZy4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9ETVhfUENFICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBndWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KKyNkZWZpbmUgQ0FQRl9ETVhfQVJJQiAgICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZXF1YXRpb25zIGFuZCBsZXZlbHMgdG8gZnVsZmlsbCBBUklCIHN0YW5kYXJkLiAqLworI2RlZmluZSBDQVBGX0RNWF9EVkIgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIGd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkgZGF0YSBmaWVsZHMuICovCisjZGVmaW5lIENBUEZfRE1YX0NIX0VYUCAgICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3Igc2ltcGxlIHVwbWl4aW5nIGJ5IGR1YmxpY2F0aW5nIGNoYW5uZWxzIG9yIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLworLyogXGVuZGNvbmQgKi8KKworCisvKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogTGlicmFyeSB2ZXJzaW9uaW5nCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKworLyoqCisgKiBDb252ZXJ0IGVhY2ggbWVtYmVyIG9mIHZlcnNpb24gbnVtYmVycyB0byBvbmUgc2luZ2xlIG51bWVyaWMgdmVyc2lvbiByZXByZXNlbnRhdGlvbi4KKyAqIFxwYXJhbSBsZXYwICAxc3QgbGV2ZWwgb2YgdmVyc2lvbiBudW1iZXIuCisgKiBccGFyYW0gbGV2MSAgMm5kIGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgorICogXHBhcmFtIGxldjIgIDNyZCBsZXZlbCBvZiB2ZXJzaW9uIG51bWJlci4KKyAgKi8KKyNkZWZpbmUgTElCX1ZFUlNJT04obGV2MCwgbGV2MSwgbGV2MikgKChsZXYwPDwyNCAmIDB4ZmYwMDAwMDApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldjE8PDE2ICYgMHgwMGZmMDAwMCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV2Mjw8OCAgJiAweDAwMDBmZjAwKSkKKworLyoqCisgKiAgQnVpbGQgdGV4dCBzdHJpbmcgb2YgdmVyc2lvbi4KKyAqLworI2RlZmluZSBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbykgRkRLc3ByaW50ZigoaW5mbyktPnZlcnNpb25TdHIsICIlZC4lZC4lZCIsICgoKGluZm8pLT52ZXJzaW9uID4+IDI0KSAmIDB4ZmYpLCAoKChpbmZvKS0+dmVyc2lvbiA+PiAxNikgJiAweGZmKSwgKCgoaW5mbyktPnZlcnNpb24gPj4gOCApICYgMHhmZikpCisKKy8qKgorICogIExpYnJhcnkgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IExJQl9JTkZPCit7CisgIGNvbnN0IGNoYXIqIHRpdGxlOworICBjb25zdCBjaGFyKiBidWlsZF9kYXRlOworICBjb25zdCBjaGFyKiBidWlsZF90aW1lOworICBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZDsKKyAgSU5UIHZlcnNpb247CisgIFVJTlQgIGZsYWdzOworICBjaGFyIHZlcnNpb25TdHJbMzJdOworfSBMSUJfSU5GTzsKKworLyoqIEluaXRpYWxpemUgbGlicmFyeSBpbmZvLiAqLworc3RhdGljIGlubGluZSB2b2lkIEZES2luaXRMaWJJbmZvKCBMSUJfSU5GTyogaW5mbyApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX05PTkU7CisgIH0KK30KKworLyoqIEFxdWlyZSBzdXBwb3J0ZWQgZmVhdHVyZXMgb2YgbGlicmFyeS4gKi8KK3N0YXRpYyBpbmxpbmUgVUlOVCBGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcyggY29uc3QgTElCX0lORk8qIGluZm8sIEZES19NT0RVTEVfSUQgbW9kdWxlX2lkICkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpPTA7IGk8RkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKSB7CisgICAgICByZXR1cm4gaW5mb1tpXS5mbGFnczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKiBTZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIuICovCitzdGF0aWMgaW5saW5lIElOVCBGREtsaWJJbmZvX2xvb2t1cCggY29uc3QgTElCX0lORk8qIGluZm8sIEZES19NT0RVTEVfSUQgbW9kdWxlX2lkICkKK3sKKyAgaW50IGkgPSAtMTsKKworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIGk7Cit9CisKKworLyoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIEJ1ZmZlciBkZXNjcmlwdGlvbgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICovCisKKy8qKgorICogIEkvTyBidWZmZXIgZGVzY3JpcHRvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRkRLX2J1ZkRlc2NyCit7CisgIHZvaWQgICoqcHBCYXNlOyAgICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYnVmZmVyIGJhc2UgYWRkcmVzc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIE5VTEwgZm9yIGJ1ZmZlciByZXF1aXJlbWVudCBpbmZvLiAqLworICBVSU5UICAgKnBCdWZTaXplOyAgIC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHBsYWNlZCBpbiB0aGUgc3BlY2lmaWMgYnVmZmVyLiAqLworICBVSU5UICAgKnBFbGVTaXplOyAgIC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50IHNpemUgZm9yIGVhY2ggYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlcy4gVGhhdCBpcyBtb3N0bHkgdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgc2l6ZW9mKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGZvciB0aGUgZGF0YSB0eXBlIHVzZWQgZm9yIHRoZSBzcGVjaWZpYyBidWZmZXIuICovCisgIFVJTlQgICAqcEJ1ZlR5cGU7ICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGJpdCBmaWVsZHMgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBidWZmZXIuIFNlZSBYWFggYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4gICovCisgIFVJTlQgICAgbnVtQnVmczsgICAgLyohPCBUb3RhbCBudW1iZXIgb2YgYnVmZmVycy4gKi8KKworfSBGREtfYnVmRGVzY3I7CisKKy8qKgorICogQnVmZmVyIHR5cGUgZGVzY3JpcHRpb24gZmllbGQuCisgKi8KKyNkZWZpbmUgRkRLX0JVRl9UWVBFX01BU0tfSU8gICAgICggMHgwMyA8PCAzMCApCisjZGVmaW5lIEZES19CVUZfVFlQRV9NQVNLX0RFU0NSICAoIDB4M0YgPDwgMTYgKQorI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19JRCAgICAgKCAweEZGICkKKworI2RlZmluZSBGREtfQlVGX1RZUEVfSU5QVVQgICAgICAgKCAweDEgPDwgMzAgKQorI2RlZmluZSBGREtfQlVGX1RZUEVfT1VUUFVUICAgICAgKCAweDIgPDwgMzAgKQorCisjZGVmaW5lIEZES19CVUZfVFlQRV9QQ01fREFUQSAgICAoIDB4MSA8PCAxNiApCisjZGVmaW5lIEZES19CVUZfVFlQRV9BTkNfREFUQSAgICAoIDB4MiA8PCAxNiApCisjZGVmaW5lIEZES19CVUZfVFlQRV9CU19EQVRBICAgICAoIDB4NCA8PCAxNiApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGREtfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9pbmNsdWRlL2F1ZGlvLmggYi9hYWMvbGliU1lTL2luY2x1ZGUvYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY4M2FlCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNZUy9pbmNsdWRlL2F1ZGlvLmgKQEAgLTAsMCArMSwxMDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yOiBNYW51ZWwgSmFuZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgYXVkaW8uaAorICogIFxicmllZiAgQXVkaW8gZGV2aWNlIHN1cHBvcnQuCisgKgorICogVGhpcyBjb21wb25lbnQgZmVhdHVyZXMgYXVkaW8gcGxheWJhY2sgYW5kIGNhcHR1cmUgd2l0aCBhIGNvbW1vbiBBUEkgZm9yCisgKiBhbnkgc29mdHdhcmUvaGFyZHdhcmUgcGxhdGZvcm0uCisgKgorICogSWYgeW91IHVzZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyBWZXJzaW9uIDYgYW5kIEtzbWVkaWEuaCBjYW5ub3QgYmUgZm91bmQsCisgKiBpbnN0YWxsaW5nIERpcmVjdFggKGUuZy4gZHg5c2RrX3N1bW1lcjIwMDQuZXhlKSBzb2x2ZXMgaXQuCisgKgorICovCisKKyNpZm5kZWYgQVVESU9fSAorI2RlZmluZSBBVURJT19ICisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FhYy9saWJTWVMvaW5jbHVkZS9jbWRsX3BhcnNlci5oIGIvYWFjL2xpYlNZUy9pbmNsdWRlL2NtZGxfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2ZTQxZAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTWVMvaW5jbHVkZS9jbWRsX3BhcnNlci5oCkBAIC0wLDAgKzEsMjIxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBjb21tYW5kIGxpbmUgcGFyc2VyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgY21kbF9wYXJzZXIuaAorICogIFxicmllZiAgQ29tbWFuZCBsaW5lIHBhcnNlci4KKyAqCisgKiAgVGhlIGNvbW1hbmQgbGluZSBwYXJzZXIgY2FuIGV4dHJhY3QgY2VydGFpbiBkYXRhIGZpZWxkcyBvdXQgb2YgYSBjaGFyYWN0ZXIKKyAqICBzdHJpbmcgYW5kIGFzc2lnbiB2YWx1ZXMgdG8gdmFyaWFibGVzLiBJdCBoYXMgMiBtYWluIGZ1bmN0aW9ucy4gT25lIHRvIHBhcnNlCisgKiAgYSBjb21tYW5kIGxpbmUgaW4gdGhlIGZvcm0gb2Ygc3RhbmRhcmQgQyBydW50aW1lICJhcmdjIiBhbmQgImFyZ3YiIHBhcmFtZXRlcnMsCisgKiAgYW5kIHRoZSBvdGhlciB0byBhc3NlbWJsZSB0aGVzZSBwYXJhbWV0ZXJzIHJlYWRpbmcgdGV4dCBsaW5lcyBmcm9tIGEgZmlsZSBpbgorICogIGNhc2UgdGhlIEMgcnVudGltZSBkb2VzIG5vdCBwcm92aWRlIHRoZW0uCisgKi8KKworI2lmbmRlZiAgX19QQVJTRVJfSAorI2RlZmluZSBfX1BBUlNFUl9ICisKKworCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisKKyNkZWZpbmUgQ01ETF9NQVhfU1RSTEVOIDI1NQorI2RlZmluZSBDTURMX01BWF9BUkdDICAgIDMwCisKKy8qIFxjb25kICovCisvKiBUeXBlIGRlZmluaXRpb24gZm9yIHRleHQgKi8KKworCisjaWZkZWYgV0lOMzIKKyAgI2luY2x1ZGUgPHRjaGFyLmg+CisgICNpZm5kZWYgX3RzdG9mICAvKiBGb3IgVmlzdWFsIFN0dWRpbyA2ICovCisgICAgI2lmZGVmIF9VTklDT0RFCisgICAgICAjaW5jbHVkZSA8d2NoYXIuaD4KKyAgICAgICNkZWZpbmUgX3RzdG9mKHgpICAgKGZsb2F0KSB3Y3N0b2QoeCwgTlVMTCkgIC8qIEZvciBWaXN1YWwgU3R1ZGlvIDYgKi8KKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBfdHN0b2YgICAgICBhdG9mCisgICAgI2VuZGlmCisgICNlbmRpZgorCisgICNpZm5kZWYgX3RzdG9sICAvKiBGb3IgVmlzdWFsIFN0dWRpbyA2ICovCisgICAgI2lmZGVmIF9VTklDT0RFCisgICAgICAjZGVmaW5lIF90c3RvbCAgICAgIF93dG9sCisgICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgX3RzdG9sICAgICAgYXRvbAorICAgICNlbmRpZgorICAjZW5kaWYKKworICAjaWZuZGVmIF90c3RvaSAgLyogRm9yIFZpc3VhbCBTdHVkaW8gNiAqLworICAgICNpZmRlZiBfVU5JQ09ERQorICAgICAgI2RlZmluZSBfdHN0b2kgICAgICBfd3RvaQorICAgICNlbHNlCisgICAgICAjZGVmaW5lIF90c3RvaSAgICAgIGF0b2kKKyAgICAjZW5kaWYKKyAgI2VuZGlmCisKKyAgI2lmbmRlZiBURVhUQ0hBUgorICAgICNkZWZpbmUgVEVYVENIQVIgY2hhcgorICAjZW5kaWYKKworICAjaWZuZGVmIF9URVhUCisgICAgI2RlZmluZSBfVEVYVAorICAjZW5kaWYKKworI2Vsc2UgLyogV0lOMzIgKi8KKworICAgICNkZWZpbmUgVEVYVENIQVIgY2hhcgorICAgICNkZWZpbmUgX3Rjc2xlbihhKSAgRkRLc3RybGVuKGEpCisgICAgI2RlZmluZSBfdGNzY3B5ICAgICBzdHJjcHkKKyAgICAjZGVmaW5lIF90Y3NjbXAgICAgIEZES3N0cmNtcAorICAgICNkZWZpbmUgX3Rjc25jbXAgICAgRkRLc3RybmNtcAorICAgICNkZWZpbmUgX3RzY2FuZiAgICAgc2NhbmYKKyAgICAjZGVmaW5lIF9URVhUKHgpICAgIHgKKyAgICAjZGVmaW5lIF90Zm9wZW4gICAgIGZvcGVuCisgICAgI2RlZmluZSBfZnRwcmludGYgICBmcHJpbnRmCisgICAgI2RlZmluZSBfdGNzbmNweSAgICBGREtzdHJuY3B5CisgICAgI2RlZmluZSBfdHN0b2YgICAgICBGREthdG9mCisgICAgI2RlZmluZSBfdHN0b2wgICAgICBGREthdG9sCisgICAgI2RlZmluZSBfdHN0b2kgICAgICBGREthdG9pCisgICAgI2RlZmluZSBfdGNzdG9sICAgICBzdHJ0b2wKKyAgICAjZGVmaW5lIF9pc3RkaWdpdCAgIGlzZGlnaXQKKyNlbmRpZiAvKiBXSU4zMiAqLworCisvKiBcZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKioKKyAqICBTY2FucyBhcmdjLCBhcmd2IGFuZCBhIHNjYW5mIHN0eWxlIGZvcm1hdCBzdHJpbmcgZm9yIHBhcmFtZXRlcnMgYW5kIHN0b3JlcyB0aGUKKyAqICB2YWx1ZXMgaW4gdGhlIHZhcmlhYmxlIG51bWJlciBvZiBwb2ludGVycyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorCisgRm9yIGV4YW1wbGU6CisgICBcY29kZQorICAgI2RlZmluZSBBUkdfUEFSQU0gICIoLWEgJWQpICgtdiAlMSkiCisgICAjZGVmaW5lIEFSR19WQUxVRSAmY29uZmlnLT5hb3QsICZ2ZXJib3NlCisgICBpbnQgbkZvdW5kQXJncyA9IElJU19TY2FuQ21kbChhcmdjLCBhcmd2LCBBUkdfUEFSQU0sIEFSR19WQUxVRSk7CisgICBcZW5kY29kZQorICAgd2hlcmFzIHRoZSB3aWxkLWNhcmRzIChcJWQsIFwlMSwgLi4pIGRlZmluZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBhcmd1bWVudDoKKwktIFwlMSBib29sZWFuIChlLiBnLiAteCkKKwktIFwlZCBpbnRlZ2VyIChlLiBnLiAteCAyMykKKwktIFwlZiBmbG9hdCAoZS4gZy4gLXggMy40KQorCS0gXCV5IGRvdWJsZSAoZS4gZy4gLXggMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEpCisJLSBcJXMgc3RyaW5nIChlLiBnLiAteCAiZmlsZS5kYXQiKQorCS0gXCV1IHVuc2lnbmVkIGNoYXJhY3RlciAoZS4gZy4gLXggMykKKwktIFwlYyBzaWduZWQgY2hhcmFjdGVyIChlLiBnLiAteCAtMykKKyAgICBNb3JlIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgaXQgYXJlIGxvY2F0ZWQgaW4gZXZlcnkgKGVuY29kZXIvZGVjb2RlcikgZXhhbXBsZSBmcmFtZXdvcmsuCisKKyAqIFxwYXJhbSBhcmdjICAgICAgTnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAqIFxwYXJhbSBhcmd2ICAgICAgQ29tcGxldGUgY2hhcmFjdGVyIHN0cmluZyBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAqIFxwYXJhbSBwUmVxQXJncyAgQSBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIGEgY29ycmVzcG9uZGluZyBsaXN0IG9mIG1lbW9yeSBhZGRyZXNzZXMgdG8KKyAqICAgICAgICAgICAgICAgICAgYXNzaWduIGVhY2ggcGFyYW1ldGVyIHRvLgorICoKKyAqIFxyZXR1cm4gIE51bWJlciBvZiBmb3VuZCBhcmd1bWVudHMuCisgKi8KK0lOVCBJSVNfU2NhbkNtZGwoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgLi4uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyoqCisgKiAgUmVhZHMgYSB0ZXh0IGZpbGUsIGFzc2VtYmxlcyBhcmdjIGFuZCBhcmd2IHBhcmFtZXRlcnMgZm9yIGVhY2ggdGV4dCBsaW5lCisgKiAgYW5kIGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBzZXQgb2YgYXJnYywgYXJndiBwYXJhbWV0ZXJzLgorICoKKyAqIFxwYXJhbSBwYXJhbV9maWxlbmFtZSAgTmFtZSBvZiB0ZXh0IGZpbGUgdGhhdCBzaG91bGQgYmUgcGFyc2VkLgorICogXHBhcmFtIHBGdW5jdGlvbiAgICAgICBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZXZlcnkgdGV4dCBsaW5lIGZvdW5kLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2VzcywgMSBvbiBmYWlsdXJlLgorICovCitJTlQgSUlTX1Byb2Nlc3NDbWRsTGlzdChjb25zdCBURVhUQ0hBUiogcGFyYW1fZmlsZW5hbWUsIGludCAoKnBGdW5jdGlvbikoaW50LCBURVhUQ0hBUioqKSk7CisKKworI2VuZGlmIC8qIF9fUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTWVMvaW5jbHVkZS9jb252X3N0cmluZy5oIGIvYWFjL2xpYlNZUy9pbmNsdWRlL2NvbnZfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwOWRjMAotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTWVMvaW5jbHVkZS9jb252X3N0cmluZy5oCkBAIC0wLDAgKzEsMTM2IEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGZpbGUgICBjb252X3N0cmluZy5oCisgKiAgXGJyaWVmICBTdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMuCisgKi8KKworI2lmbmRlZiBfQ09OVl9TVFJJTkdfSAorI2RlZmluZSBfQ09OVl9TVFJJTkdfSAorCisKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIENvbnZlcnQgYSBiaXRidWZmZXIgdG8gYSBoZXggc3RyaW5nLgorICogXHBhcmFtIHN0cmluZyAgICAgICAgIEhleCBzdHJpbmcuCisgKiBccGFyYW0gY2hhckJ1ZiAgICAgICAgSW5wdXQgYnVmZmVyIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KKyAqIFxwYXJhbSBjaGFyQnVmTGVuZ3RoICBTaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgRXJyb3IgY29kZS4KKyAqLworSU5UIGNoYXJCdWYySGV4U3RyaW5nKGNoYXIgKnN0cmluZywgVUNIQVIgKmNoYXJCdWYsIElOVCBjaGFyQnVmTGVuZ3RoKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgQ29udmVydCBhIGhleCBzdHJpbmcgdG8gYml0cy4KKyAqIFxwYXJhbSBzdHJpbmcgICAgICAgICBIZXggc3RyaW5nIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KKyAqIFxwYXJhbSBjaGFyQnVmICAgICAgICBPdXRwdXQgYnVmZmVyIGhvbGRpbmcgdGhlIGJpdHMsIHdpbGwgYmUgZmlsbGVkIHVwIHdpdGggemVyb3MuCisgKiBccGFyYW0gY2hhckJ1Zkxlbmd0aCAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitJTlQgaGV4U3RyaW5nMkNoYXJCdWYoY29uc3QgY2hhciAqc3RyaW5nLCBVQ0hBUiAqY2hhckJ1ZiwgVUlOVCBjaGFyQnVmTGVuZ3RoKTsKKworLyoqCisgKiBcYnJpZWYgICAgQ29udmVydCBhIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBoZXggc2lnbiB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCisgKiBccGFyYW0gYyAgQ2hhcmFjdGVyIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KKyAqIFxyZXR1cm4gICBDb252ZXJ0ZWQgdmFsdWUgKHZhbHVlIGJldHdlZW4gMCBhbmQgMTUpLCBpZiAxNiwgYW4gZXJyb3IgaGFzIG9jY3VyZWQuCisgKi8KK1VDSEFSIGhleENoYXIyRGVjKGNvbnN0IGNoYXIgYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9DT05WX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL2luY2x1ZGUvZ2VuZXJpY1N0ZHMuaCBiL2FhYy9saWJTWVMvaW5jbHVkZS9nZW5lcmljU3Rkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL2luY2x1ZGUvZ2VuZXJpY1N0ZHMuaApAQCAtMCwwICsxLDQ4MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgZ2VuZXJpY1N0ZHMuaAorICAgIFxicmllZiAgR2VuZXJpYyBSdW4tVGltZSBTdXBwb3J0IGZ1bmN0aW9uIHdyYXBwZXJzIGFuZCBoZWFwIGFsbG9jYXRpb24gbW9uaXRvcmluZy4KKyAqLworCisjaWYgIWRlZmluZWQoX19HRU5FUklDU1REU19IX18pCisjZGVmaW5lIF9fR0VORVJJQ1NURFNfSF9fCisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworCisvKiBBbHdheXMgaW5jcmVhc2UgdmVyYm9zaXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGluIGNhc2Ugb2YgYSBkZWJ1ZyBidWlsdC4gREVCVUcgaXMgZGVmaW5lZCBnbG9iYWxseSBpbiB0aGF0IGNhc2UuICovCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChGREtfREVCVUcpCisvLyNkZWZpbmUgTUVNT1JZX01FQVNVUkVNRU5UCisjZW5kaWYKKworI2lmbmRlZiBNX1BJCisgICNkZWZpbmUgTV9QSSAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYgIC8qISBQaS4gT25seSB1c2VkIGluIGV4YW1wbGUgcHJvamVjdHMuICovCisjZW5kaWYKKworCisvKiAjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAqLworCisKKy8qKgorICogSWRlbnRpZmllcnMgZm9yIHZhcmlvdXMgbWVtb3J5IGxvY2F0aW9ucy4gVGhleSBhcmUgdXNlZCBhbG9uZyB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmdW5jdGlvbnMgbGlrZSBGREtjYWxsb2NfTCgpIHRvIHNwZWNpZnkgdGhlIHJlcXVlc3RlZCBtZW1vcnkncyBsb2NhdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgLyogSW50ZXJuYWwgKi8KKyAgU0VDVF9EQVRBX0wxID0gMHgyMDAwLAorICBTRUNUX0RBVEFfTDIsCisgIFNFQ1RfREFUQV9MMV9BLAorICBTRUNUX0RBVEFfTDFfQiwKKyAgU0VDVF9DT05TVERBVEFfTDEsCisKKyAgLyogRXh0ZXJuYWwgKi8KKyAgU0VDVF9EQVRBX0VYVEVSTiA9IDB4NDAwMCwKKyAgU0VDVF9DT05TVERBVEFfRVhURVJOCisKK30gTUVNT1JZX1NFQ1RJT047CisKKworLyoqCisgKiBUaGUgSF8gcHJlZml4IGluZGljYXRlcyBoZWFkZXIgZmlsZSB2ZXJzaW9uLCB0aGUgQ18qIHByZWZpeCBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIG9iamVjdCB2ZXJzaW9uLgorICoKKyAqIERlY2xhcmluZyBtZW1vcnkgYXJlYXMgcmVxdWlyZXMgdG8gc3BlY2lmeSBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRhdGEgdHlwZS4gVXNlIHRoZSBIXyBtYWNybworICogZm9yIHRoaXMgcHVycG9zZSBpbnNpZGUgYSBoZWFkZXIgZmlsZS4KKyAqCisgKiBGb3IgZGVmaW5pbmcgYSBtZW1vcnkgYXJlYSB5b3VyIHJlcXVpcmUgYWRkaXRpb25hbGx5IG9uZSBvciB0d28gc2l6ZXMsIGRlcGVuZGluZyBpZiB0aGUKKyAqIG1lbW9yeSBzaG91bGQgYmUgb3JnYW5pemVkIGludG8gb25lIG9yIHR3byBkaW1lbnNpb25zLgorICoKKyAqIFRoZSBtYWNyb3MgY29udGFpbmluZyB0aGUga2V5d29yZCBBQUxMT0MgaW5zdGVhZCBvZiBBTExPQyBhbHNvIGRvIHRha2UgY2FyZSBvZiByZXR1cm5pbmcKKyAqIGFsaWduZWQgbWVtb3J5IGFkZHJlc3NlcyAoYmV5b25kIHRoZSBuYXR1cmFsIGFsaWdubWVudCBvZiBpdHMgdHlwZSkuIFRoZSBwcmVwcm9jZXNvciBtYWNybworICogOjpBTElHTk1FTlRfREVGQVVMVCBpbmRpY2F0ZXMgdGhlIGFsaWdtZW50IHRvIGJlIHVzZWQgKHRoaXMgaXMgaGFyZHdhcmUgc3BlY2lmaWMpLgorICoKKyAqIFRoZSBfTCBzdWZmaXggaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSB3aWxsIGJlIGxvY2F0ZWQgaW4gYSBzcGVjaWZpYyBzZWN0aW9uLiBUaGlzIGlzCisgKiB1c2VmdWwgdG8gYWxsb2NhdGUgY3JpdGljYWwgbWVtb3J5IHNlY3Rpb24gaW50byBmYXN0IGludGVybmFsIFNSQU0gZm9yIGV4YW1wbGUuCisgKgorICovCisKKyNkZWZpbmUgSF9BTExPQ19NRU0obmFtZSx0eXBlKSAgICAgICAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG49MCk7IHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKTsKKworLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBIX0FMTE9DX01FTV9PVkVSTEFZKG5hbWUsdHlwZSkgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbj0wKTsgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpOworCisKKyAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLworICAjZGVmaW5lIENfQUxMT0NfTUVNKG5hbWUsdHlwZSxudW0pIFwKKyAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhudW0sIHNpemVvZih0eXBlKSkpOyB9IFwKKyAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2ZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAorICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpKTsgfQorCisgIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KKyAgI2RlZmluZSBDX0FMTE9DX01FTV9TVEFUSUMobmFtZSx0eXBlLG51bSkgXAorICAgIHN0YXRpYyB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhudW0sIHNpemVvZih0eXBlKSkpOyB9IFwKKyAgICBzdGF0aWMgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKKyAgICBzdGF0aWMgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyB9CisKKyAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLworICAjZGVmaW5lIENfQUxMT0NfTUVNMihuYW1lLHR5cGUsbjEsbjIpIFwKKyAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhuMSwgc2l6ZW9mKHR5cGUpKSk7IH0gXAorICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCisgICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSkgKiAobjIpOyB9CisKKyAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLworICAjZGVmaW5lIENfQUFMTE9DX01FTShuYW1lLHR5cGUsbnVtKSBcCisgICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2MoKG51bSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyB9IFwKKyAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2FmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKKyAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHZvaWQgKikpOyB9CisKKyAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLworICAjZGVmaW5lIENfQUFMTE9DX01FTTIobmFtZSx0eXBlLG4xLG4yKSBcCisgICAgdHlwZSAqIEdldCAjIyBuYW1lIChpbnQgbikgeyBGREtfQVNTRVJUKChuKSA8IChuMikpOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2MoKG4xKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxUKSk7IH0gXAorICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAorICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih2b2lkICopKSAqIChuMik7IH0KKworICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCisgICNkZWZpbmUgQ19BTExPQ19NRU1fTChuYW1lLHR5cGUsbnVtLHMpIFwKKyAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvY19MKG51bSwgc2l6ZW9mKHR5cGUpLCBzKSk7IH0gXAorICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKKyAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSk7IH0KKworICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCisgICNkZWZpbmUgQ19BTExPQ19NRU0yX0wobmFtZSx0eXBlLG4xLG4yLHMpIFwKKyAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAodHlwZSopRkRLY2FsbG9jX0wobjEsIHNpemVvZih0eXBlKSwgcyk7IH0gXAorICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKKyAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpKSAqIChuMik7IH0KKworICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCisgICNkZWZpbmUgQ19BQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzKSBcCisgICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2NfTCgobnVtKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxULCBzKSk7IH0gXAorICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWVfTCgqcCk7ICpwPU5VTEw7IH0gfSBcCisgICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih2b2lkICopKTsgfQorCisgIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KKyAgI2RlZmluZSBDX0FBTExPQ19NRU0yX0wobmFtZSx0eXBlLG4xLG4yLHMpIFwKKyAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2FhbGxvY19MKChuMSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCwgcykpOyB9IFwKKyAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2FmcmVlX0woKnApOyAqcD1OVUxMOyB9IH0gXAorICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih2b2lkICopKSAqIChuMik7IH0KKworLyoqIFNlZSAjSF9BTExPQ19NRU1fT1ZFUkxBWSBmb3IgZGVzY3JpcHRpb24uICovCisKKworICAjZGVmaW5lIENfQUxMT0NfTUVNX09WRVJMQVkobmFtZSx0eXBlLG51bSxzZWN0LHRhZykgQ19BQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzZWN0KQorCisKKyAgICNkZWZpbmUgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChuYW1lLHR5cGUsbikgXAorICAgICB0eXBlIF8gIyMgbmFtZVsobikrKEFMSUdOTUVOVF9ERUZBVUxUK3NpemVvZih0eXBlKS0xKV07IFwKKyAgICAgdHlwZSAqIG5hbWUgPSAodHlwZSopQUxJR05fUFRSKF8gIyMgbmFtZSk7IFwKKworICAgI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQobmFtZSx0eXBlLG4pIFwKKyAgICAgdHlwZSBuYW1lW25dOworCisgICAjZGVmaW5lIENfQUFMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsdHlwZSxuKQorICAgI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsdHlwZSxuKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJ1bnRpbWUgc3VwcG9ydCBkZWNsYXJhdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIHByaW50ZigpIHVzaW5nIHN0ZG91dC4gSWYgOjpBUkNIX1dBX0ZMVVNIX0NPTlNPTEUgZGVmaW5lZCwgYSBmbHVzaCBpcyAgZG9uZSBhZGRpdGlvbmFsbHkgYWZ0ZXIgcHJpbnRmKCkuICovCit2b2lkIEZES3ByaW50ZiAgICAoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pOworCisvKiogcHJpbnRmKCkgdXNpbmcgc3RkZXJyLiBJZiA6OkFSQ0hfV0FfRkxVU0hfQ09OU09MRSBkZWZpbmVkLCBhIGZsdXNoIGlzIGRvbmUgYWRkaXRpb25hbGx5IGFmdGVyIHByaW50ZigpLiAqLwordm9pZCBGREtwcmludGZFcnIgKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKTsKKworLyoqIFdyYXBwZXIgZm9yIDxzdGRpby5oPidzIGdldGNoYXIoKS4gKi8KK2ludCBGREtnZXRjaGFyKHZvaWQpOworCitJTlQgIEZES2ZwcmludGYodm9pZCAgKnN0cmVhbSwgIGNvbnN0ICBjaGFyICpmb3JtYXQsIC4uLik7CitJTlQgIEZES3NwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKworCitjb25zdCBjaGFyICpGREtzdHJjaHIoY29uc3QgY2hhciAqcywgSU5UIGMpOworY29uc3QgY2hhciAqRkRLc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOworY2hhciAqRkRLc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CitjaGFyICpGREtzdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgVUlOVCBuKTsKKworI2RlZmluZSBGREtfTUFYX09WRVJMQVlTIDggICAvKio8IE1heGltdW0gbnVtYmVyIG9mIG1lbW9yeSBvdmVybGF5cy4gKi8KKworCit2b2lkICpGREtjYWxsb2MgKGNvbnN0IFVJTlQgbiwgY29uc3QgVUlOVCBzaXplKTsKK3ZvaWQgKkZES21hbGxvYyAoY29uc3QgVUlOVCBzaXplKTsKK3ZvaWQgIEZES2ZyZWUgICAodm9pZCAqcHRyKTsKKworLyoqCisgKiAgQWxsb2NhdGUgYW5kIGNsZWFyIGFuIGFsaWduZWQgbWVtb3J5IGFyZWEuIFVzZSBGREthZnJlZSgpIGluc3RlYWQgb2YgRkRLZnJlZSgpIGZvciB0aGVzZSBtZW1vcnkgYXJlYXMuCisgKgorICogXHBhcmFtIHNpemUgICAgICAgU2l6ZSBvZiByZXF1ZXN0ZWQgbWVtb3J5IGluIGJ5dGVzLgorICogXHBhcmFtIGFsaWdubWVudCAgQWxpZ25tZW50IG9mIHJlcXVlc3RlZCBtZW1vcnkgaW4gYnl0ZXMuCisgKiBccmV0dXJuICAgICAgICAgICBQb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3ZvaWQgKkZES2FhbGxvYyAoY29uc3QgVUlOVCBzaXplLCBjb25zdCBVSU5UIGFsaWdubWVudCk7CisKKy8qKgorICogIEZyZWUgYW4gYWxpZ25lZCBtZW1vcnkgYXJlYS4KKyAqCisgKiBccGFyYW0gcHRyICBQb2ludGVyIHRvIGJlIGZyZWVkLgorICogXHJldHVybiAgICAgdm9pZAorICovCit2b2lkIEZES2FmcmVlICh2b2lkICpwdHIpOworCisKKy8qKgorICogIEFsbG9jYXRlIG1lbW9yeSBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgorICogIFJlcXVlc3RzIGNhbiBiZSBtYWRlIGZvciBpbnRlcm5hbCBvciBleHRlcm5hbCBtZW1vcnkuIElmIGludGVybmFsIG1lbW9yeSBpcworICogIHJlcXVlc3RlZCwgRkRLY2FsbG9jX0woKSBmaXJzdCB0cmllcyB0byB1c2UgTDEgbWVtb3J5LCB3aGljaCBzaXplcyBhcmUgZGVmaW5lZAorICogIGJ5IDo6REFUQV9MMV9BX1NJWkUgYW5kIDo6REFUQV9MMV9CX1NJWkUuIElmIG5vIEwxIG1lbW9yeSBpcyBhdmFpbGFibGUsIHRoZW4KKyAqICBGREtjYWxsb2NfTCgpIHRyaWVzIHRvIHVzZSBMMiBtZW1vcnkuIElmIHRoYXQgZmFpbHMgYXMgd2VsbCwgdGhlIHJlcXVlc3RlZAorICogIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYXQgYW4gZXh0ZXJuIGxvY2F0aW9uIHVzaW5nIHRoZSBmYWxsYmFjayBGREtjYWxsb2MoKS4KKyAqCisgKiBccGFyYW0gbiAgICAgU2VlIE1TRE4gZG9jdW1lbnRhdGlvbiBvbiBjYWxsb2MoKS4KKyAqIFxwYXJhbSBzaXplICBTZWUgTVNETiBkb2N1bWVudGF0aW9uIG9uIGNhbGxvYygpLgorICogXHBhcmFtIHMgICAgIE1lbW9yeSBzZWN0aW9uLgorICogXHJldHVybiAgICAgIFNlZSBNU0ROIGRvY3VtZW50YXRpb24gb24gY2FsbG9jKCkuCisgKi8KK3ZvaWQgKkZES2NhbGxvY19MKGNvbnN0IFVJTlQgbiwgY29uc3QgVUlOVCBzaXplLCBNRU1PUllfU0VDVElPTiBzKTsKKworLyoqCisgKiAgQWxsb2NhdGUgYWxpZ25lZCBtZW1vcnkgaW4gYSBzcGVjaWZpYyBtZW1vcnkgc2VjdGlvbi4KKyAqICBTZWUgRkRLY2FsbG9jX0woKSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscyAtIHNhbWUgYXBwbGllcyBoZXJlLgorICovCit2b2lkICpGREthYWxsb2NfTChjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50LCBNRU1PUllfU0VDVElPTiBzKTsKKworLyoqCisgKiAgRnJlZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHNlY3Rpb24uCisgKi8KK3ZvaWQgIEZES2ZyZWVfTCh2b2lkICpwdHIpOworCisvKioKKyAqICBGcmVlIGFsaWduZWQgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgorICovCit2b2lkICBGREthZnJlZV9MKHZvaWQgKnB0cik7CisKKworLyoqCisgKiBDb3B5IG1lbW9yeS4gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgbXVzdCBub3Qgb3ZlcmxhcC4KKyAqIEVpdGhlciB1c2UgaW1wbGVtZW50YXRpb24gZnJvbSBhIFN0YW5kYXJkIExpYnJhcnksIG9yLCBpZiBubyBTdGFuZGFyZCBMaWJyYXJ5CisgKiBpcyBhdmFpbGFibGUsIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KKyAqIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtY3B5KCkuIFBsZWFzZSBzZWUgTVNETgorICogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgorICovCit2b2lkIEZES21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKTsKKworLyoqCisgKiBDb3B5IG1lbW9yeS4gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcC4KKyAqIEVpdGhlciB1c2UgaW1wbGVtZW50YXRpb24gZnJvbSBhIFN0YW5kYXJkIExpYnJhcnksIG9yLCBpZiBubyBTdGFuZGFyZCBMaWJyYXJ5CisgKiBpcyBhdmFpbGFibGUsIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KKyAqIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtbW92ZSgpLiBQbGVhc2Ugc2VlIE1TRE4KKyAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKyovCit2b2lkIEZES21lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGNvbnN0IFVJTlQgc2l6ZSk7CisKKy8qKgorICogQ2xlYXIgbWVtb3J5LgorICogRWl0aGVyIHVzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgU3RhbmRhcmQgTGlicmFyeSwgb3IsIGlmIG5vIFN0YW5kYXJkIExpYnJhcnkKKyAqIGlzIGF2YWlsYWJsZSwgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorICogVGhlIGRlZmluZSA6OlVTRV9CVUlMVElOX01FTV9GVU5DVElPTlMgaW4gZ2VuZXJpY1N0ZHMuY3BwIGNvbnRyb2xzIHdoYXQgdG8gdXNlLgorICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1jbGVhcigpLiBQbGVhc2Ugc2VlIE1TRE4KKyAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKyovCit2b2lkIEZES21lbWNsZWFyKHZvaWQgKm1lbVB0ciwgY29uc3QgVUlOVCBzaXplKTsKKworLyoqCisgKiBGaWxsIG1lbW9yeSB3aXRoIHZhbHVlcy4KKyAqIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtc2V0KCkuIFBsZWFzZSBzZWUgTVNETgorICogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgorICovCit2b2lkIEZES21lbXNldCh2b2lkICptZW1QdHIsIGNvbnN0IElOVCB2YWx1ZSwgY29uc3QgVUlOVCBzaXplKTsKKworLyogQ29tcGFyZSBmdW5jdGlvbiB3cmFwcGVycyAqLworSU5UICAgRkRLbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgY29uc3QgVUlOVCBzaXplKTsKK0lOVCAgIEZES3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworSU5UICAgRkRLc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IFVJTlQgc2l6ZSk7CisKK1VJTlQgIEZES3N0cmxlbihjb25zdCBjaGFyICpzKTsKKworI2RlZmluZSBGREttYXgoYSxiKSAoIChhKSA+IChiKSA/IChhKTooYikpCisjZGVmaW5lIEZES21pbihhLGIpICggKGEpIDwgKGIpID8gKGEpOihiKSkKKworI2RlZmluZSBGREtfSU5UX01BWCAoKElOVCkweDdGRkZGRkZGKQorI2RlZmluZSBGREtfSU5UX01JTiAoKElOVCkweDgwMDAwMDAwKQorCisvKiBNYXRoIGZ1bmN0aW9uIHdyYXBwZXJzLiBPbmx5IGludGVuZGVkIGZvciBjb21wYXRpYmlsaXR5LCBub3QgdG8gYmUgaGlnaGx5IG9wdGltaXplZC4gKi8KKy8qIFVzZWQgZm9yIGRlYnVnZ2luZywgZGV2IGNvZGUgLi4gKi8KKworSU5UIEZES2FicyhJTlQgaik7Citkb3VibGUgRkRLZmFicyhkb3VibGUgeCk7Citkb3VibGUgRkRLcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7Citkb3VibGUgRkRLc3FydChkb3VibGUgeCk7Citkb3VibGUgRkRLYXRhbihkb3VibGUgeCk7Citkb3VibGUgRkRLbG9nKGRvdWJsZSB4KTsKK2RvdWJsZSBGREtzaW4oZG91YmxlIHgpOworZG91YmxlIEZES2Nvcyhkb3VibGUgeCk7Citkb3VibGUgRkRLZXhwKGRvdWJsZSB4KTsKKyNkZWZpbmUgRkRLbG9nMihhKSAoRkRLbG9nKGEpKjEuNDQyNjk1MDQxKSAvKiBsb2coMi4wKSA9IDEuNDQyNjk1MDQxICovCisjZGVmaW5lIEZES2xvZzEwKGEpIChGREtsb2coYSkqMC40MzQyOTQ0ODIpIC8qIDEuMC9sb2coMTAuMCkgPSAwLjQzNDI5NDQ4MiAqLworZG91YmxlIEZES2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCk7Citkb3VibGUgRkRLYWNvcyhkb3VibGUgeCk7Citkb3VibGUgRkRLdGFuKGRvdWJsZSB4KTsKK2RvdWJsZSBGREtmbG9vcihkb3VibGUgeCk7Citkb3VibGUgRkRLY2VpbChkb3VibGUgeCk7CitJTlQgICBGREthdG9pKGNvbnN0IGNoYXIgKm5wdHIpOworbG9uZyAgRkRLYXRvbChjb25zdCBjaGFyICpucHRyKTsKK2Zsb2F0IEZES2F0b2YoY29uc3QgY2hhciAqbnB0cik7CisvKiBMT05HIExPTkcgRkRLYXRvbGwoY29uc3QgY2hhciAqbnB0cik7ICovCisvKiBMT05HIExPTkcgRkRLYXRvcShjb25zdCBjaGFyICpucHRyKTsgKi8KKworCisKKy8qIEZJTEUgSS9PICovCisKKy8qIQorICogIENoZWNrIHBsYXRmb3JtIGZvciBlbmRpYW5lc3MuCisgKgorICogXHJldHVybiAgMSBpZiBwbGF0Zm9ybSBpcyBsaXR0bGUgZW5kaWFuLCBub24tMSBpZiBwbGF0Zm9ybSBpcyBiaWcgZW5kaWFuLgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2lubGluZQorI2Vsc2UKK3N0YXRpYworI2VuZGlmCitpbnQgSVNfTElUVExFX0VORElBTih2b2lkKSB7CisgIGludCBfX2R1bW15ID0gMTsKKyAgcmV0dXJuICggKiggKFVDSEFSKikoJihfX2R1bW15KSApICkgKTsKK30KKworLyohCisgKiAgQ29udmVydCBpbnB1dCB2YWx1ZSB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKyAqCisgKiBccGFyYW0gdmFsICBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQuIEl0IG1heSBiZSBpbiBib3RoIGJpZyBvciBsaXR0bGUgZW5kaWFuLgorICogXHJldHVybiAgICAgVmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCisgKi8KKyNkZWZpbmUgVE9fTElUVExFX0VORElBTih2YWwpIFwKKyAgKCAoSVNfTElUVExFX0VORElBTigpKSA/IFwKKyAgICAgKHZhbCkgXAorICAgOiAoICgoKHZhbCkgJiAweGZmKSA8PCAyNCkgfHwgKCgodmFsKSAmIDB4ZmYwMCk8PCA4KSB8fCAoKCh2YWwpICYgMHhmZjAwMDApPj44KSB8fCAoKCh2YWwpICYgMHhmZjAwMDAwMCkgPj4gMjQpICkgKQorCisKKy8qIQorICogXGZuICAgICBGREtGSUxFICpGREtmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CisgKiAgICAgICAgIFN0YW5kYXJkIGZvcGVuKCkgd3JhcHBlci4KKyAqIFxmbiAgICAgSU5UIEZES2ZjbG9zZShGREtGSUxFICpGUCk7CisgKiAgICAgICAgIFN0YW5kYXJkIGZjbG9zZSgpIHdyYXBwZXIuCisgKiBcZm4gICAgIElOVCBGREtmc2VlayhGREtGSUxFICpGUCwgTE9ORyBPRkZTRVQsIGludCBXSEVOQ0UpOworICogICAgICAgICBTdGFuZGFyZCBmc2VlaygpIHdyYXBwZXIuCisgKiBcZm4gICAgIElOVCBGREtmdGVsbChGREtGSUxFICpGUCk7CisgKiAgICAgICAgIFN0YW5kYXJkIGZ0ZWxsKCkgd3JhcHBlci4KKyAqIFxmbiAgICAgSU5UIEZES2ZmbHVzaChGREtGSUxFICpmcCk7CisgKiAgICAgICAgIFN0YW5kYXJkIGZmbHVzaCgpIHdyYXBwZXIuCisgKiBcZm4gICAgIFVJTlQgRkRLZndyaXRlKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CisgKiAgICAgICAgIFN0YW5kYXJkIGZ3cml0ZSgpIHdyYXBwZXIuCisgKiBcZm4gICAgIFVJTlQgRkRLZnJlYWQodm9pZCAqZHN0LCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOworICogICAgICAgICBTdGFuZGFyZCBmcmVhZCgpIHdyYXBwZXIuCisgKi8KK3R5cGVkZWYgdm9pZCBGREtGSUxFOworZXh0ZXJuIGNvbnN0IElOVCBGREtTRUVLX1NFVCwgRkRLU0VFS19DVVIsIEZES1NFRUtfRU5EOworCitGREtGSUxFICpGREtmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CitJTlQgRkRLZmNsb3NlKEZES0ZJTEUgKkZQKTsKK0lOVCBGREtmc2VlayhGREtGSUxFICpGUCwgTE9ORyBPRkZTRVQsIGludCBXSEVOQ0UpOworSU5UIEZES2Z0ZWxsKEZES0ZJTEUgKkZQKTsKK0lOVCBGREtmZmx1c2goRkRLRklMRSAqZnApOworVUlOVCBGREtmd3JpdGUodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKK1VJTlQgRkRLZnJlYWQodm9pZCAqZHN0LCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOworY2hhciogRkRLZmdldHModm9pZCAqZHN0LCBJTlQgc2l6ZSwgRkRLRklMRSAqZnApOwordm9pZCBGREtyZXdpbmQoRkRLRklMRSAqZnApOworSU5UIEZES2Zlb2YoRkRLRklMRSAqZnApOworCisvKioKKyAqIFxicmllZiAgICAgICAgV3JpdGUgZWFjaCBtZW1iZXIgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4gQ29udmVydCBhdXRvbWF0aWNhbGx5IHRvIGhvc3QgZW5kaWFuZXNzLgorICogXHBhcmFtIHB0cmYgICBQb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIFxwYXJhbSBzaXplICAgU2l6ZSBvZiBlYWNoIGl0ZW0gdG8gYmUgd3JpdHRlbi4KKyAqIFxwYXJhbSBubWVtYiAgTnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHdyaXR0ZW4uCisgKiBccGFyYW0gZnAgICAgIEZpbGUgcG9pbnRlciBvZiB0eXBlIEZES0ZJTEUuCisgKiBccmV0dXJuICAgICAgIE51bWJlciBvZiBpdGVtcyByZWFkIG9uIHN1Y2Nlc3MgYW5kIGZyZWFkKCkgZXJyb3Igb24gZmFpbHVyZS4KKyAqLworVUlOVCBGREtmd3JpdGVfRUwodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgIFJlYWQgdmFyaWFibGUgb2Ygc2l6ZSAic2l6ZSIgYXMgbGl0dGxlIGVuZGlhbi4gQ29udmVydCBhdXRvbWF0aWNhbGx5IHRvIGhvc3QgZW5kaWFuZXNzLgorICogICAgICAgICAgICAgICAgNC1ieXRlIGFsaWdubWVudCBpcyBlbmZvcmNlZCBmb3IgMjQgYml0IGRhdGEsIGF0IDMyIGJpdCBmdWxsIHNjYWxlLgorICogXHBhcmFtIGRzdCAgICBQb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0byBzdG9yZSBkYXRhIGludG8uCisgKiBccGFyYW0gc2l6ZSAgIFNpemUgb2YgZWFjaCBpdGVtIHRvIGJlIHJlYWQuCisgKiBccGFyYW0gbm1lbWIgIE51bWJlciBvZiBpdGVtcyB0byBiZSByZWFkLgorICogXHBhcmFtIGZwICAgICBGaWxlIHBvaW50ZXIgb2YgdHlwZSBGREtGSUxFLgorICogXHJldHVybiAgICAgICBOdW1iZXIgb2YgaXRlbXMgcmVhZCBvbiBzdWNjZXNzIGFuZCBmcmVhZCgpIGVycm9yIG9uIGZhaWx1cmUuCisgKi8KK1VJTlQgRkRLZnJlYWRfRUwodm9pZCAqZHN0LCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOworCisKKy8qKgorICogXGJyaWVmICBQcmludCBGREsgc29mdHdhcmUgZGlzY2xhaW1lci4KKyAqLwordm9pZCBGREtwcmludERpc2NsYWltZXIodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dFTkVSSUNTVERTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oIGIvYWFjL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjg5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL2luY2x1ZGUvbWFjaGluZV90eXBlLmgKQEAgLTAsMCArMSwzNTcgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcZmlsZSAgIG1hY2hpbmVfdHlwZS5oCisgKiAgXGJyaWVmICBUeXBlIGRlZmluZXMgZm9yIHZhcmlvdXMgcHJvY2Vzc29ycyBhbmQgY29tcGlsZXIgdG9vbHMuCisgKi8KKworI2lmICFkZWZpbmVkKF9fTUFDSElORV9UWVBFX0hfXykKKyNkZWZpbmUgX19NQUNISU5FX1RZUEVfSF9fCisKKworLyogTGlicmFyeSBjYWxsaW5nIGNvbnZlbnRpb24gc3BlYy4gX19jZGVjbCBhbmQgZnJpZW5kcyBtaWdodCBiZSBhZGRlZCBoZXJlIGFzIHJlcXVpcmVkLiAqLworICAjZGVmaW5lIExJTktTUEVDX0gKKyAgI2RlZmluZSBMSU5LU1BFQ19DUFAKKworCisvKioKKyAqICBjb2xsYXRlIGFsbCBjb3JyZXNwb25kaW5nIGNvbXBpbGVyIHNwZWNpZmljIG1hY3JvcyB0byBkZXRlY3QgYSBkZWJ1ZyBidWlsZCwgYW5kIHNldCB0aGUgREVCVUcgbWFjcm8gaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAqLworI2lmIGRlZmluZWQoX0RFQlVHKQorI2RlZmluZSBERUJVRworI2VuZGlmCisKKworLyogZm9yIGRveHlnZW4gdGhlIGZvbGxvd2luZyBkb2N1IHBhcnRzIG11c3QgYmUgc2VwYXJhdGVkICovCisvKiogXHZhciAgU0NIQVIKKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDEgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqLworLyoqIFx2YXIgIFVDSEFSCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyBhdCBsZWFzdCAxIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqLworLyoqIFx2YXIgIElOVAorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICovCisvKiogXHZhciAgVUlOVAorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgNCBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKi8KKy8qKiBcdmFyICBMT05HCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA0IGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKi8KKy8qKiBcdmFyICBVTE9ORworICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgNCBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKi8KKy8qKiBcdmFyICBTSE9SVAorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgMiBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICovCisvKiogXHZhciAgVVNIT1JUCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyAyIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqLworLyoqIFx2YXIgIElOVDY0CisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKi8KKy8qKiBcdmFyICBVSU5UNjQKKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDggYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICovCisvKiogXGRlZiAgU0hPUlRfQklUUworICogICAgICAgIE51bWJlciBvZiBiaXRzIHRoZSBkYXRhIHR5cGUgc2hvcnQgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZCB0byBnZXQgdGhpcyBpbmZvLAorICogICAgICAgIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCisgKi8KKy8qKiBcZGVmICBDSEFSX0JJVFMKKyAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIGNoYXIgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZCB0byBnZXQgdGhpcyBpbmZvLAorICogICAgICAgIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCisgKi8KKy8qKiBcdmFyICBJTlRfUENNCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyB0aGUgd2lkdGggb2YgaW5wdXQgYW5kIG91dHB1dCBQQ00gc2FtcGxlcy4KKyAqLworCisKKyAgdHlwZWRlZiBzaWduZWQgaW50IElOVDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKKyNpZmRlZiBfX0xQNjRfXworICAvKiBmb3JjZSBGREsgbG9uZy1kYXRhdHlwZXMgdG8gNCBieXRlICAqLworICAvKiBqZHI6IFVzZSBkZWZpbmVzIHRvIGF2b2lkIHR5cGUgYWxpYXMgcHJvYmxlbXMgb24gNjQgYml0IG1hY2hpbmVzLiAqLworICAjZGVmaW5lIExPTkcgSU5UCisgICNkZWZpbmUgVUxPTkcgVUlOVAorI2Vsc2UgLyogX19MUDY0X18gKi8KKyAgdHlwZWRlZiBzaWduZWQgbG9uZyBMT05HOworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7CisjZW5kaWYJLyogX19MUDY0X18gKi8KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgU0hPUlQ7CisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNIT1JUOworICB0eXBlZGVmIHNpZ25lZCBjaGFyIFNDSEFSOworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7CisKKyAgI2RlZmluZSBTSE9SVF9CSVRTIDE2CisgICNkZWZpbmUgQ0hBUl9CSVRTIDgKKworCisvKiBEZWZpbmUgNjQgYml0IGJhc2UgaW50ZWdlciB0eXBlLiAqLworI2lmZGVmIF9NU0NfVkVSCisgIHR5cGVkZWYgX19pbnQ2NCBJTlQ2NDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJTlQ2NDsKKyNlbHNlCisgIHR5cGVkZWYgbG9uZyBsb25nIElOVDY0OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7CisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisgICNpZmRlZiBfX2NwbHVzcGx1cworICAgICNkZWZpbmUgTlVMTCAgICAwCisgICNlbHNlCisgICAgI2RlZmluZSBOVUxMICAgICgodm9pZCAqKTApCisgICNlbmRpZgorI2VuZGlmCisKKy8qIEFzc2VydCBpcyBmdW5jdGlvbmFsIG9uIHg4NiBQQydzIGFuZCBhbHNvIHdoZW4gZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4gKi8KKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9faTY4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChGREtfREVCVUcpIHx8IGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgI2RlZmluZSBGREtfQVNTRVJUKHgpIGFzc2VydCh4KQorI2Vsc2UKKyAgI2RlZmluZSBGREtfQVNTRVJUKGlnbm9yZSkKKyNlbmRpZgorCisgIHR5cGVkZWYgU0hPUlQgICAgICAgIElOVF9QQ007CisgICNkZWZpbmUgV0FWX0JJVFMgICAgIDE2CisgICNkZWZpbmUgU0FNUExFX0JJVFMgIDE2CisgICNkZWZpbmUgU0FNUExFX01BWCAoKChMT05HKTE8PChTQU1QTEVfQklUUy0xKSktMSkKKyAgI2RlZmluZSBTQU1QTEVfTUlOICh+U0FNUExFX01BWCkKKworLyohCisqIFxkZWYgICAgUkFNX0FMSUdOCisqICBVc2VkIHRvIGFsaWduIG1lbW9yeSBhcyBwcmVmaXggYmVmb3JlIG1lbW9yeSBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGU6CisgICBcY29kZQorICAgUkFNX0FMSUdOCisgICBpbnQgbXlBcnJheVsxNl07CisgICBcZW5kY29kZQorCisgICBOb3RlLCB0aGF0IG5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgdGhpcyBtZWNoYW5pc20uIEZvciBleGFtcGxlIHdpdGggVEkgY29tcGlsZXJzCisgICBhIHByZXByb2Nlc3NvciBwcmFnbWEgaXMgdXNlZCwgYnV0IHRvIGRvIHNvbWV0aGluZyBsaWtlCisKKyAgIFxjb2RlCisgICAjZGVmaW5lIFJBTV9BTElHTiAjcHJhZ21hIERBVEFfQUxJR04oeCkKKyAgIFxlbmNvZGUKKworICAgd291bGQgcmVxdWlyZSB0aGUgcHJlcHJvY2Vzc29yIHRvIHByb2Nlc3MgdGhpcyBsaW5lIHR3aWNlIHRvIGZ1bGx5IHJlc29sdmUgaXQuIEhlbmNlLAorICAgYSBmdWxseSBwbGF0Zm9ybS1pbmRlcGVuZGFudCB3YXkgdG8gdXNlIGFsaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkLgorCisqIFxkZWYgICAgQUxJR05NRU5UX0RFRkFVTFQKKyogICAgICAgICBEZWZhdWx0IGFsaWdubWVudCBpbiBieXRlcy4KKyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworICAjZGVmaW5lIEFMSUdOTUVOVF9ERUZBVUxUIDgKKyAgI2RlZmluZSBSQU1fQUxJR04gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChBTElHTk1FTlRfREVGQVVMVCkpKQorI2Vsc2UKKyAgI2RlZmluZSBBTElHTk1FTlRfREVGQVVMVCA4CisgICNkZWZpbmUgUkFNX0FMSUdOCisjZW5kaWYKKworCisvKiEKKyogXGRlZiAgUkVTVFJJQ1QKKyogICAgICAgVGhlIHJlc3RyaWN0IGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IHNvbWUgcGxhdGZvcm1zIGFuZCBSRVNUUklDVCBtYXBzIHRvCisqICAgICAgIGVpdGhlciB0aGUgY29ycmVzcG9uZGluZyBrZXl3b3JkIG9uIGVhY2ggcGxhdGZvcm0gb3IgdG8gdm9pZCBpZiB0aGUKKyogICAgICAgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSBzdWNoIGZlYXR1cmUuCisqCisqIFxkZWYgIFdPUkRfQUxJR05FRCh4KQorKiAgICAgICBUZWxscyB0aGUgY29tcGlsZXIgdGhhdCBwb2ludGVyIHggaXMgV09SRCBhbGlnbmVkLgorKiAgICAgICBBdCB0aGUgbW9tZW50IG9ubHkgc3VwcG9ydGVkIGJ5IFRJIGNvbXBpbGVycy4KKyoKKyogXGRlZiAgRFdPUkRfQUxJR05FRCh4KQorKiAgICAgICBUZWxscyB0aGUgY29tcGlsZXIgdGhhdCBwb2ludGVyIHggaXMgRFdPUkQgYWxpZ25lZC4KKyogICAgICAgQXQgdGhlIG1vbWVudCBvbmx5IHN1cHBvcnRlZCBieSBUSSBjb21waWxlcnMuCisqLworICAjZGVmaW5lIFJFU1RSSUNUCisgICNkZWZpbmUgV09SRF9BTElHTkVEKHgpCisgICNkZWZpbmUgRFdPUkRfQUxJR05FRCh4KQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFMSUdOX1NJWkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyohCisgKiBcYnJpZWYgIFRoaXMgbWFjcm8gYWxpZ25zIGEgZ2l2ZW4gdmFsdWUgZGVwZW5kaW5nIG9uIDo6QUxJR05NRU5UX0RFRkFVTFQuCisgKgorICogRm9yIGV4YW1wbGUgaWYgI0FMSUdOTUVOVF9ERUZBVUxUIGVxdWFscyA4LCB0aGVuOgorICogLSBBTElHTl9TSVpFKDMpIHJldHVybnMgOAorICogLSBBTElHTl9TSVpFKDgpIHJldHVybnMgOAorICogLSBBTElHTl9TSVpFKDkpIHJldHVybnMgMTYKKyAqLworI2RlZmluZSBBTElHTl9TSVpFKGEpICgoYSkrICgoKElOVClBTElHTk1FTlRfREVGQVVMVCAtICgoSU5UKShhKSAmIChBTElHTk1FTlRfREVGQVVMVC0xKSkgKSAmIChBTElHTk1FTlRfREVGQVVMVC0xKSkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFMSUdOX1BUUgorICogY2FzdCAoYSkgdG8gd2lkdGggb2YgcG9pbnRlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiEKKyAqIFxicmllZiAgVGhpcyBtYWNybyBhbGlnbnMgYSBnaXZlbiBhZGRyZXNzIGRlcGVuZGluZyBvbiA6OkFMSUdOTUVOVF9ERUZBVUxULgorICovCisjZGVmaW5lIEFMSUdOX1BUUihhKSAoICh1bnNpZ25lZCBjaGFyKikoYSkgKyAoKChJTlQpQUxJR05NRU5UX0RFRkFVTFQgLSAoKElOVCkoVUlOVDY0KShhKSAmIChBTElHTk1FTlRfREVGQVVMVC0xKSkgKSAmIChBTElHTk1FTlRfREVGQVVMVC0xKSkgKQorCisgLyogQWxpZ25tZW50IG1hY3JvIGZvciBsaWJTWVMgaGVhcCBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBBTElHTk1FTlRfRVhUUkVTICAgICggQUxJR05NRU5UX0RFRkFVTFQgKQorI2RlZmluZSBBTEdOX1NJWkVfRVhUUkVTKGEpICgoYSkrICgoKElOVClBTElHTk1FTlRfRVhUUkVTIC0gKChJTlQpKGEpICYgKEFMSUdOTUVOVF9FWFRSRVMtMSkpICkgJiAoQUxJR05NRU5UX0VYVFJFUy0xKSkpCisKKworLyohCisgKiBcZGVmICBGT1JDRUlOTElORQorICogICAgICAgU29tZXRpbWVzIGNvbXBpbGVyIGRvIG5vdCBkbyB3aGF0IHRoZXkgYXJlIHRvbGQgdG8gZG8sIGFuZCBpbiBjYXNlIG9mIGlubGluaW5nIHNvbWUKKyAqICAgICAgIGFkZGl0aW9uYWwgY29tbWFuZCBtaWdodCBiZSBuZWNlc3NhcnkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KKyAqCisgKiBcZGVmICBGREtfSU5MSU5FCisgKiAgICAgICBEZWZpbmVzIGhvdyB0aGUgY29tcGlsZXIgaXMgdG9sZCB0byBpbmxpbmUgc3R1ZmYuCisgKi8KKyNpZmRlZiBERUJVRworI3VuZGVmIEZPUkNFSU5MSU5FCisjZGVmaW5lIEZPUkNFSU5MSU5FCisjZWxzZQorI2lmbmRlZiBGT1JDRUlOTElORQorICAjaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworICAgICNkZWZpbmUgRk9SQ0VJTkxJTkUgX19hdHRyaWJ1dGUoKGFsd2F5c19pbmxpbmUpKQorICAjZWxzZQorICAgICNkZWZpbmUgRk9SQ0VJTkxJTkUKKyAgI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisgIC8qIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zICovCisgICNkZWZpbmUgRkRLX0lOTElORSBpbmxpbmUKKworCisvKiEKKyAqIFxkZWYgIExOS19TRUNUSU9OX0RBVEFfTDEKKyAqICAgICAgIFRoZSBMTktfU0VDVElPTl8qIGRlZmluZXMgYWxsb3cgbWVtb3J5IHRvIGJlIGRyYXduIGZyb20gc3BlY2lmaWMgbWVtb3J5CisgKiAgICAgICBzZWN0aW9ucy4gVXNlZCBhcyBwcmVmaXggYmVmb3JlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICoKKyAqIFxkZWYgIExOS19TRUNUSU9OX0RBVEFfTDIKKyAqICAgICAgIFNlZSA6OkxOS19TRUNUSU9OX0RBVEFfTDEKKyAqIFxkZWYgIExOS19TRUNUSU9OX0wxX0RBVEFfQQorICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQorICogXGRlZiAgTE5LX1NFQ1RJT05fTDFfREFUQV9CCisgKiAgICAgICBTZWUgOjpMTktfU0VDVElPTl9EQVRBX0wxCisgKiBcZGVmICBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKKyAqICAgICAgIFNlZSA6OkxOS19TRUNUSU9OX0RBVEFfTDEKKyAqIFxkZWYgIExOS19TRUNUSU9OX0NPTlNUREFUQQorICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQorICogXGRlZiAgTE5LX1NFQ1RJT05fQ09ERV9MMQorICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQorICogXGRlZiAgTE5LX1NFQ1RJT05fQ09ERV9MMgorICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQorICogXGRlZiAgTE5LX1NFQ1RJT05fSU5JVENPREUKKyAqICAgICAgIFNlZSA6OkxOS19TRUNUSU9OX0RBVEFfTDEKKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb2RlIFNlY3Rpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICNkZWZpbmUgTE5LX1NFQ1RJT05fQ09ERV9MMQorICAjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDIKKyAgI2RlZmluZSBMTktfU0VDVElPTl9JTklUQ09ERQorCisvKiBNZW1vcnkgc2VjdGlvbiBtYWNyb3MuICovCisKKyAgLyogZGVmYXVsdCBmYWxsIGJhY2sgKi8KKyAgI2RlZmluZSBMTktfU0VDVElPTl9EQVRBX0wxCisgICNkZWZpbmUgTE5LX1NFQ1RJT05fREFUQV9MMgorICAjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQQorICAjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorCisgICNkZWZpbmUgTE5LX1NFQ1RJT05fTDFfREFUQV9BCisgICNkZWZpbmUgTE5LX1NFQ1RJT05fTDFfREFUQV9CCisKKworI2lmZGVmIF9NU0NfVkVSCisgIC8qCisgICAqIFNvbWV0aW1lcyBjZXJ0YWluIGZlYXR1cmVzIGFyZSBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIHdhcm5pbmcgNDA2NSBtYXkgb2NjdXI6CisgICAqICJzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscyIKKyAgICogV2UgY29uc2lkZXIgdGhpcyB3YXJuaW5nIGlycmVsZXZhbnQgYW5kIGRpc2FibGUgaXQuCisgICAqLworICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MDY1ICkKKyNlbmRpZgorCisjZW5kaWYgLyogX19NQUNISU5FX1RZUEVfSF9fICovCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL2luY2x1ZGUvd2F2X2ZpbGUuaCBiL2FhYy9saWJTWVMvaW5jbHVkZS93YXZfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzQzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL2luY2x1ZGUvd2F2X2ZpbGUuaApAQCAtMCwwICsxLDIzMyBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgRXJpYyBBbGxhbWFuY2hlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgd2F2X2ZpbGUuaAorICogIFxicmllZiAgUnVkaW1lbnRhcnkgV0FWRSBmaWxlIHJlYWQvd3JpdGUgc3VwcG9ydC4KKyAqCisgKiAgVGhlIFdBVkUgZmlsZSByZWFkZXIvd3JpdGVyIGlzIGludGVudGVkIHRvIGJlIHVzZWQgaW4gdGhlIGNvZGVjJ3MgZXhhbXBsZQorICogIGZyYW1ld29yayBmb3IgZWFzaWx5IGdldHRpbmcgc3RhcnRlZCB3aXRoIGVuY29kaW5nL2RlY29kaW5nLiBUaGVyZWZvcmUKKyAqICBpdCBzZXJ2ZXMgbWFpbmx5IGZvciBoZWxwaW5nIHF1aWNrbHkgdW5kZXJzdGFuZCBob3cgYSBjb2RlYydzIEFQSSBhY3R1YWxseQorICogIHdvcmtzLgorICogIEJlaW5nIGEgV0FWRSBmaWxlIHJlYWRlci93cml0ZXIgd2l0aCB2ZXJ5IGJhc2ljIGZ1bmN0aW9uYWxpdHksIGl0IG1heSBub3QgYmUKKyAqICBhYmxlIHRvIHJlYWQgV0FWRSBmaWxlcyB0aGF0IGNvbWUgd2l0aCB1bnVzdWFsIGNvbmZpZ3VyYXRpb25zLgorICogIERldGFpbHMgb24gaG93IHRvIHVzZSB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gZXZlcnkKKyAqICAoZW5jb2Rlci9kZWNvZGVyKSBleGFtcGxlIGZyYW1ld29yay4KKyAqLworCisjaWZuZGVmIF9fV0FWX0ZJTEVfSF9fCisjZGVmaW5lIF9fV0FWX0ZJTEVfSF9fCisKKworCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNQRUFLRVJfRlJPTlRfTEVGVCAgICAgICAgICAgICAweDEKKyNkZWZpbmUgU1BFQUtFUl9GUk9OVF9SSUdIVCAgICAgICAgICAgIDB4MgorI2RlZmluZSBTUEVBS0VSX0ZST05UX0NFTlRFUiAgICAgICAgICAgMHg0CisjZGVmaW5lIFNQRUFLRVJfTE9XX0ZSRVFVRU5DWSAgICAgICAgICAweDgKKyNkZWZpbmUgU1BFQUtFUl9CQUNLX0xFRlQgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU1BFQUtFUl9CQUNLX1JJR0hUICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU1BFQUtFUl9GUk9OVF9MRUZUX09GX0NFTlRFUiAgIDB4NDAKKyNkZWZpbmUgU1BFQUtFUl9GUk9OVF9SSUdIVF9PRl9DRU5URVIgIDB4ODAKKyNkZWZpbmUgU1BFQUtFUl9CQUNLX0NFTlRFUiAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIFNQRUFLRVJfU0lERV9MRUZUICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBTUEVBS0VSX1NJREVfUklHSFQgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgU1BFQUtFUl9UT1BfQ0VOVEVSICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIFNQRUFLRVJfVE9QX0ZST05UX0xFRlQgICAgICAgICAweDEwMDAKKyNkZWZpbmUgU1BFQUtFUl9UT1BfRlJPTlRfQ0VOVEVSICAgICAgIDB4MjAwMAorI2RlZmluZSBTUEVBS0VSX1RPUF9GUk9OVF9SSUdIVCAgICAgICAgMHg0MDAwCisjZGVmaW5lIFNQRUFLRVJfVE9QX0JBQ0tfTEVGVCAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgU1BFQUtFUl9UT1BfQkFDS19DRU5URVIgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgU1BFQUtFUl9UT1BfQkFDS19SSUdIVCAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgU1BFQUtFUl9SRVNFUlZFRCAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyohCisgKiBSSUZGIFdBVkUgZmlsZSBzdHJ1Y3QuCisgKiBGb3IgZGV0YWlscyBzZWUgV0FWRSBmaWxlIGZvcm1hdCBkb2N1bWVudGF0aW9uIChmb3IgZXhhbXBsZSBhdCBodHRwOi8vd3d3LndvdHNpdC5vcmcpLgorICovCit0eXBlZGVmIHN0cnVjdCBXQVZfSEVBREVSCit7CisgIGNoYXIgICByaWZmVHlwZVs0XTsKKyAgVUlOVCAgIHJpZmZTaXplOworICBjaGFyICAgd2F2ZVR5cGVbNF07CisgIGNoYXIgICBmb3JtYXRUeXBlWzRdOworICBVSU5UICAgZm9ybWF0U2l6ZTsKKyAgVVNIT1JUIGNvbXByZXNzaW9uQ29kZTsKKyAgVVNIT1JUIG51bUNoYW5uZWxzOworICBVSU5UICAgc2FtcGxlUmF0ZTsKKyAgVUlOVCAgIGJ5dGVzUGVyU2Vjb25kOworICBVU0hPUlQgYmxvY2tBbGlnbjsKKyAgVVNIT1JUIGJpdHNQZXJTYW1wbGU7CisgIGNoYXIgICBkYXRhVHlwZVs0XTsKKyAgVUlOVCAgIGRhdGFTaXplOworfSBXQVZfSEVBREVSOworCitzdHJ1Y3QgV0FWCit7CisgIFdBVl9IRUFERVIgaGVhZGVyOworICBGREtGSUxFICpmcDsKKyAgVUlOVCBjaGFubmVsTWFzazsKK307CisKK3R5cGVkZWYgc3RydWN0IFdBViAqSEFORExFX1dBVjsKKworLyoqCisgKiBcYnJpZWYgIE9wZW4gYSBXQVYgZmlsZSBoYW5kbGUgZm9yIHJlYWRpbmcuCisgKgorICogXHBhcmFtIHBXYXYgICAgICBQb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uLCB3aGVyZSBhIFdBViBoYW5kbGUgaXMgcmV0dXJuZWQuCisgKiBccGFyYW0gZmlsZW5hbWUgIEZpbGUgbmFtZSB0byBiZSBvcGVuZWQuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbiBmYWlsdXJlLgorICovCitJTlQgV0FWX0lucHV0T3BlbiAoSEFORExFX1dBViAqcFdhdiwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKioKKyAqIFxicmllZiAgUmVhZCBzYW1wbGVzIGZyb20gYSBXQVZFIGZpbGUuIFRoZSBzYW1wbGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlLW9yZGVyZWQgdG8gdGhlCisgKiAgICAgICAgIG5hdGl2ZSBob3N0IGVuZGlhbmVzcyBhbmQgc2NhbGVkIHRvIGZ1bGwgc2NhbGUgb2YgdGhlIElOVF9QQ00gdHlwZSwgZnJvbQorICogICAgICAgICB3aGF0ZXZlciBCUFMgdGhlIFdBVkUgZmlsZSBoYWQgc3BlY2lmaWVkIGluIGl0cyBoZWFkZXIgZGF0YS4KKyAqCisgKiAgXHBhcmFtIHdhdiAgICAgICAgICAgSGFuZGxlIG9mIFdBViBmaWxlLgorICogIFxwYXJhbSBzYW1wbGVCdWZmZXIgIFBvaW50ZXIgdG8gc3RvcmUgYXVkaW8gZGF0YS4KKyAqICBccGFyYW0gbnVtU2FtcGxlcyAgICBEZXNpcmVkIG51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQuCisgKiAgXHBhcmFtIG5CdWZCaXRzICAgICAgU2l6ZSBpbiBiaXQgb2YgZWFjaCBhdWRpbyBzYW1wbGUgb2Ygc2FtcGxlQnVmZmVyLgorICoKKyAqICBccmV0dXJuICBOdW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZWFkLgorICovCitJTlQgV0FWX0lucHV0UmVhZCAoSEFORExFX1dBViB3YXYsIHZvaWQgKnNhbXBsZUJ1ZmZlciwgVUlOVCBudW1TYW1wbGVzLCBpbnQgbkJ1ZkJpdHMpOworCisvKioKKyAqIFxicmllZiAgICAgICBDbG9zZSBhIFdBViBmaWxlIHJlYWRpbmcgaGFuZGxlLgorICogXHBhcmFtIHBXYXYgIFBvaW50ZXIgdG8gYSBXQVYgZmlsZSByZWFkaW5nIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICB2b2lkCisgKi8KK3ZvaWQgV0FWX0lucHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdik7CisKKy8qKgorICogXGJyaWVmICBPcGVuIFdBViBvdXRwdXQvd3JpdGVyIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gcFdhdiAgICAgICAgICAgIFBvaW50ZXIgdG8gV0FWIGhhbmRsZSB0byBiZSByZXR1cm5lZC4KKyAqIFxwYXJhbSBvdXRwdXRGaWxlbmFtZSAgRmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4gdG8uCisgKiBccGFyYW0gc2FtcGxlUmF0ZSAgICAgIERlc2lyZWQgc2FtcGxlcmF0ZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlLgorICogXHBhcmFtIG51bUNoYW5uZWxzICAgICBEZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlLgorICogXHBhcmFtIGJpdHNQZXJTYW1wbGUgICBEZXNpcmVkIG51bWJlciBvZiBiaXRzIHBlciBhdWRpbyBzYW1wbGUgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZS4KKyAqCisgKiBccmV0dXJuICAwOiBvazsgLTE6IGVycm9yCisgKi8KK0lOVCBXQVZfT3V0cHV0T3BlbihIQU5ETEVfV0FWICpwV2F2LCBjb25zdCBjaGFyICpvdXRwdXRGaWxlbmFtZSwgSU5UIHNhbXBsZVJhdGUsIElOVCBudW1DaGFubmVscywgSU5UIGJpdHNQZXJTYW1wbGUpOworCisvKioKKyAqIFxicmllZiAgV3JpdGUgZGF0YSB0byBXQVYgZmlsZSBhc29jaWF0ZWQgdG8gV0FWIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gd2F2ICAgICAgICAgICAgICBIYW5kbGUgb2YgV0FWIGZpbGUKKyAqIFxwYXJhbSBzYW1wbGVCdWZmZXIgICAgIFBvaW50ZXIgdG8gYXVkaW8gc2FtcGxlcywgcmlnaHQganVzdGlmaWVkIGludGVnZXIgdmFsdWVzLgorICogXHBhcmFtIG51bWJlck9mU2FtcGxlcyAgVGhlIG51bWJlciBvZiBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZSB2YWx1ZXN0byBiZSB3cml0dGVuLgorICogXHBhcmFtIG5CdWZCaXRzICAgICAgICAgU2l6ZSBpbiBiaXRzIG9mIGVhY2ggYXVkaW8gc2FtcGxlIGluIHNhbXBsZUJ1ZmZlci4KKyAqIFxwYXJhbSBuU2lnQml0cyAgICAgICAgIEFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbkJ1ZkJpdHMgaW4gc2FtcGxlQnVmZmVyLgorICoKKyAqIFxyZXR1cm4gMDogb2s7IC0xOiBlcnJvcgorICovCitJTlQgV0FWX091dHB1dFdyaXRlKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpzYW1wbGVCdWZmZXIsIFVJTlQgbnVtYmVyT2ZTYW1wbGVzLCBpbnQgbkJ1ZkJpdHMsIGludCBuU2lnQml0cyk7CisKKy8qKgorICogXGJyaWVmICAgICAgIENsb3NlIFdBViBvdXRwdXQgaGFuZGxlLgorICogXHBhcmFtIHBXYXYgIFBvaW50ZXIgdG8gV0FWIGhhbmRsZS4gKnBXYXYgaXMgc2V0IHRvIE5VTEwuCisgKiBccmV0dXJuICAgICAgdm9pZAorICovCit2b2lkIFdBVl9PdXRwdXRDbG9zZShIQU5ETEVfV0FWICpwV2F2KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX19XQVZfRklMRV9IX18gKi8KZGlmZiAtLWdpdCBhL2FhYy9saWJTWVMvc3JjL2NtZGxfcGFyc2VyLmNwcCBiL2FhYy9saWJTWVMvc3JjL2NtZGxfcGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVjMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNZUy9zcmMvY21kbF9wYXJzZXIuY3BwCkBAIC0wLDAgKzEsNTgxIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKyAgIERlc2NyaXB0aW9uOiBjb21tYW5kIGxpbmUgcGFyc2VyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImNtZGxfcGFyc2VyLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIElOVCAgR2V0QXJnRnJvbVN0cmluZyhJTlQgYXJnYywgVEVYVENIQVIqIGFyZ3ZbXSwgVEVYVENIQVIqIHNlYXJjaF9zdHJpbmcsIFRFWFRDSEFSIHR5cGUsIFRFWFRDSEFSKiBmb3VuZF9zdHJpbmcgLCBJTlQqIHN3aXRjaGVzX3VzZWQpOworc3RhdGljIHZvaWQgUmVtb3ZlV2hpdGVTcGFjZShjb25zdCBURVhUQ0hBUiogcFJlcUFyZ3MsIFRFWFRDSEFSKiBSZW1vdmVkKTsKK3N0YXRpYyBJTlQgQ2hlY2tBcmcoVEVYVENIQVIqIGFyZywgIFRFWFRDSEFSKiBzdHIsIFVJTlQgbnVtQXJncywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGN1cnJlbnRfc3RyKTsKK3N0YXRpYyBJTlQgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhJTlQgYXJnYywgLypURVhUQ0hBUiogYXJndltdLCovIElOVCogc3dpdGNoZXNfdXNlZCk7CitzdGF0aWMgSU5UIFBhcnNlU3RyaW5nKFRFWFRDSEFSKiBzdHIsIElOVCosIFRFWFRDSEFSKiwgVEVYVENIQVIqKTsKK3N0YXRpYyB2b2lkIEdldE51bWJlck9mQXJncyhURVhUQ0hBUiogc3RyLCBJTlQqIG5BcmdzKTsKKworc3RhdGljCit2b2lkIHJlbW92ZVF1b3RlcyhjaGFyICpzdHIpCit7CisgIGlmIChzdHJbMF0gPT0gJyInKSB7CisgICAgRkRLc3RyY3B5KHN0ciwgc3RyKzEpOworICAgIHN0cltGREtzdHJsZW4oc3RyKS0xXSA9IDA7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKiovCisKK0lOVCBJSVNfU2NhbkNtZGwoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIGNvbnN0IFRFWFRDSEFSKiBzdHIsIC4uLikKK3sKKyAgSU5UIGkgICAgICAgICAgICAgID0gMDsKKyAgSU5UIGZvdW5kX2FuZF9zZXQgID0gMDsKKyAgSU5UIG5BcmdzICAgICAgICAgID0gMDsKKyAgSU5UKiBzd2l0Y2hlc191c2VkID0gMDsKKyAgSU5UKiAgIGJfc3RyX29wdCAgID0gMDsKKyAgVEVYVENIQVIqICBzX3N0ciAgICAgICA9IDA7CisgIFRFWFRDSEFSKiAgY19zdHJfdHlwZSAgPSAwOworICBURVhUQ0hBUiogIHN0cl9jbGVhbiAgID0gMDsKKworICB2YV9saXN0IGFwOworCisgIGlmIChhcmdjID09IDAgfHwgYXJnYyA9PSAxKQorICB7CisgICAgRkRLcHJpbnRmKCJObyBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4iKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBzdHJfY2xlYW4gID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYygodW5zaWduZWQgaW50KV90Y3NsZW4oc3RyKSwgc2l6ZW9mKFRFWFRDSEFSKSk7CisgIGlmIChzdHJfY2xlYW4gPT0gTlVMTCkgeworICAgIEZES3ByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgbGluZSAlZCwgZmlsZSAlc1xuIiwgIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBSZW1vdmVXaGl0ZVNwYWNlKHN0ciwgc3RyX2NsZWFuICk7CisgIEdldE51bWJlck9mQXJncyhzdHJfY2xlYW4sICZuQXJncyk7CisKKyAgYl9zdHJfb3B0ICA9IChJTlQqKSAgIEZES2NhbGxvYyhuQXJncywgICAgc2l6ZW9mKElOVCkpOworICBzX3N0ciAgICAgID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYyhuQXJncypDTURMX01BWF9BUkdDLCBzaXplb2YoVEVYVENIQVIpICk7CisgIGNfc3RyX3R5cGUgPSAoVEVYVENIQVIqKSAgRkRLY2FsbG9jKG5BcmdzLCAgICBzaXplb2YoVEVYVENIQVIpKTsKKyAgc3dpdGNoZXNfdXNlZCA9IChJTlQqKSBGREtjYWxsb2MoYXJnYywgc2l6ZW9mKElOVCkpOworCisgIGlmIChiX3N0cl9vcHQgPT0gTlVMTCB8fCBzX3N0ciA9PSBOVUxMIHx8IGNfc3RyX3R5cGUgPT0gTlVMTCB8fCBzd2l0Y2hlc191c2VkID09IE5VTEwpIHsKKyAgICBGREtwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGxpbmUgJWQsIGZpbGUgJXNcbiIsICBfX0xJTkVfXywgX19GSUxFX18pOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICggUGFyc2VTdHJpbmcoIHN0cl9jbGVhbiwgYl9zdHJfb3B0LCBzX3N0ciwgY19zdHJfdHlwZSApKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgdmFfc3RhcnQoYXAsIHN0cik7CisKKyAgZm9yICggaSA9IDA7IGkgPCBuQXJnczsgaSsrICkKKyAgICB7CisgICAgICBURVhUQ0hBUiBhcmdbQ01ETF9NQVhfU1RSTEVOXSA9IHtMJ1wwJ307CisgICAgICBURVhUQ0hBUiogcF9hcmcgPSBhcmc7CisgICAgICBURVhUQ0hBUiogY3VycmVudF9zdHIgPSAmKHNfc3RyW2kqQ01ETF9NQVhfQVJHQ10pOworCisgICAgICBpZiAoR2V0QXJnRnJvbVN0cmluZyhhcmdjLCBhcmd2LCBjdXJyZW50X3N0ciwgY19zdHJfdHlwZVtpXSwgYXJnLCBzd2l0Y2hlc191c2VkICkKKyAgICAgICAgICAmJiAhYl9zdHJfb3B0W2ldICkKKyAgICAgICAgeworI2lmZGVmIF9VTklDT0RFCisgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogUGFyc2luZyBhcmd1bWVudCBmb3IgcmVxdWlyZWQgc3dpdGNoICclbHMnLlxuIiApLCBjdXJyZW50X3N0cik7CisjZWxzZQorICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IFBhcnNpbmcgYXJndW1lbnQgZm9yIHJlcXVpcmVkIHN3aXRjaCAnJXMnLlxuIiApLCBjdXJyZW50X3N0cik7CisjZW5kaWYKKyAgICAgICAgICBmb3VuZF9hbmRfc2V0ID0gMDsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIGlmIChDaGVja0FyZyhwX2FyZywgc19zdHIsIG5BcmdzLCBjX3N0cl90eXBlW2ldLCBjdXJyZW50X3N0cikpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKworICAgICAgc3dpdGNoIChjX3N0cl90eXBlW2ldICkKKyAgICAgICAgeworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBURVhUQ0hBUiogdG1wOworICAgICAgICAgICAgdG1wID0gdmFfYXJnKGFwLCBURVhUQ0hBUiopOworCisgICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIF90Y3NuY3B5KCB0bXAsIGFyZywgQ01ETF9NQVhfU1RSTEVOICk7CisgICAgICAgICAgICAvKiBSZW1vdmUgcXVvdGVzLiBXaW5kb3dzIE1vYmlsZSBXb3JrYXJvdW5kLiAqLworICAgICAgICAgICAgcmVtb3ZlUXVvdGVzKHRtcCk7CisgICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIElOVCogdG1wID0gdmFfYXJnKGFwLCBJTlQqKTsKKworICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAqdG1wID0gX3Rjc3RvbChhcmcsIE5VTEwsIDApOworICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyKiB0bXAgPSB2YV9hcmcoYXAsIGNoYXIqKTsKKworICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAqdG1wID0gKmFyZzsKKyAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgeworICAgICAgICAgICAgVUNIQVIqIHRtcCA9IHZhX2FyZyhhcCwgVUNIQVIqKTsKKworICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAqdG1wID0gX3RzdG9pKGFyZyk7CisgICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiB0bXAgPSAoZmxvYXQqKSB2YV9hcmcoIGFwLGRvdWJsZSopOworCisgICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICp0bXAgPSAoZmxvYXQpIF90c3RvZihhcmcpOworICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlICd5JzogLy8gc3VwcG9ydCAnZGF0YSB0eXBlIGRvdWJsZScKKyAgICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIHRtcCA9IChkb3VibGUqKSB2YV9hcmcoIGFwLGRvdWJsZSopOworICAgICAgICAgICAgLy8gdXNlIHNzY2FuZiBpbnN0ZWFkIF90c3RvZiBiZWNhdXNlIG9mIGdjYworICAgICAgICAgICAgLy9fdHN0b2YoYXJnLCIlbGYiLHRtcCk7IC8vICclbGYnIHJlYWRzIGFzIGRvdWJsZQorICAgICAgICAgICAgKnRtcCA9IF90c3RvZihhcmcpOyAvLyAnJWxmJyByZWFkcyBhcyBkb3VibGUKKyAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgeworCisgICAgICAgICAgICBJTlQqIHRtcCA9IHZhX2FyZyggYXAsIElOVCopOworCisgICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICp0bXAgPSAxOworICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLcHJpbnRmRXJyKCJCdWc6IHVuc3VwcG9ydGVkIGRhdGEgaWRlbnRpZmllciBcIiVjXCJcbiIsIGNfc3RyX3R5cGVbaV0pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworICB2YV9lbmQoYXApOworCisgIENoZWNrRm9yVW51c2VkU3dpdGNoZXMoYXJnYywgLyphcmd2LCovIHN3aXRjaGVzX3VzZWQpOworCitiYWlsOgorICBpZiAoYl9zdHJfb3B0KSAgICAgRkRLZnJlZShiX3N0cl9vcHQpOworICBpZiAoc19zdHIpICAgICAgICAgRkRLZnJlZShzX3N0cik7CisgIGlmIChjX3N0cl90eXBlKSAgICBGREtmcmVlKGNfc3RyX3R5cGUpOworICBpZiAoc3RyX2NsZWFuKSAgICAgRkRLZnJlZShzdHJfY2xlYW4pOworICBpZiAoc3dpdGNoZXNfdXNlZCkgRkRLZnJlZShzd2l0Y2hlc191c2VkKTsKKworICByZXR1cm4gZm91bmRfYW5kX3NldDsKK30KKworCit2b2lkIEdldE51bWJlck9mQXJncyhURVhUQ0hBUiogc3RyLCBJTlQqIG5BcmdzKQoreworICBVSU5UIGkgPSAwOworICBmb3IgKCBpID0gMDsgaSA8IF90Y3NsZW4oc3RyKTsgKytpICkKKyAgICB7CisgICAgICBpZiAoIHN0cltpXSA9PSAnJScpCisgICAgICAgICpuQXJncys9IDE7CisgICAgfQorCit9CisKK0lOVCBQYXJzZVN0cmluZyhURVhUQ0hBUiogc3RyLCBJTlQqIGJfc3RyX29wdCwgVEVYVENIQVIqIHNfc3RyLCBURVhUQ0hBUiogY19zdHJfdHlwZSApCit7CisgICAgVUlOVCBpID0gMDsKKyAgICBJTlQgYXJnQ291bnRlciA9IDA7CisKKyAgICBURVhUQ0hBUiogc3RyX3N0YXJ0ID0gMDsKKyAgICBURVhUQ0hBUiogc3RyX3N0b3AgPSAwOworCisKKyAgICBzdHJfc3RhcnQgPSBzdHI7CisgICAgc3RyX3N0b3AgPSBzdHJfc3RhcnQ7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IF90Y3NsZW4oc3RyKSAtIDE7ICsraSApCisgICAgICB7CisgICAgICAgIGlmICggc3RyW2ldID09ICclJyApICAvKiBXZSBoYXZlIGFuIEFyZ3VtZW50ICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhcmdDb3VudGVyICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggYl9zdHJfb3B0W2FyZ0NvdW50ZXItMV0gKQorICAgICAgICAgICAgICAgICAgc3RyX3N0YXJ0ID0gc3RyX3N0b3AgKyAzOworCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgc3RyX3N0YXJ0ID0gc3RyX3N0b3AgKyAyOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNhdmUgQXJndW1lbnQgdHlwZSAqLworICAgICAgICAgICAgY19zdHJfdHlwZVthcmdDb3VudGVyXSA9IHN0cltpKzFdOworCisgICAgICAgICAgICBpZiAoICpzdHJfc3RhcnQgPT0gJygnICkgLyogT3B0aW9uYWwgQXJndW1lbnQgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJfc3RyX29wdFthcmdDb3VudGVyXSA9IDE7CisgICAgICAgICAgICAgICAgc3RyX3N0YXJ0Kys7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2F2ZSBBcmd1bWVudCAqLworICAgICAgICAgICAgc3RyW2ldID0gJ1wwJzsKKworICAgICAgICAgICAgX3Rjc25jcHkoJihzX3N0clthcmdDb3VudGVyKkNNRExfTUFYX0FSR0NdKSwgc3RyX3N0YXJ0LCBDTURMX01BWF9BUkdDICk7CisKKyAgICAgICAgICAgIHN0cltpXSA9ICclJzsKKworICAgICAgICAgICAgc3RyX3N0b3AgPSAmKHN0cltpXSk7CisKKyAgICAgICAgICAgIGlmICggYl9zdHJfb3B0W2FyZ0NvdW50ZXJdICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaSsyID4gKCBfdGNzbGVuKHN0cikgLTEgKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVycixfVEVYVCgiXG5cbkludGVybmFsIFBhcnNlciBFcnJvcjogU3RybGVuIFByb2JsZW1cbiIpICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggc3RyW2krMl0gIT0gJyknICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVycixfVEVYVCgiXG5cbkludGVybmFsIFBhcnNlciBFcnJvcjogTWlzc2luZyBicmFja2V0ICcpJ1xuIikgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGFyZ0NvdW50ZXIrKzsKKyAgICAgICAgICB9CisKKworICAgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKworCisKKwordm9pZCBSZW1vdmVXaGl0ZVNwYWNlKGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgVEVYVENIQVIqIHBSZW1vdmVkKQoreworICBVSU5UIGkgPSAwOworICBJTlQgayA9IDA7CisgIFVJTlQgbGVuID0gKFVJTlQpX3Rjc2xlbihwUmVxQXJncyk7CisKKworICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkKKyAgICB7CisKKyAgICAgIGlmICggcFJlcUFyZ3NbaV0gIT0gJyAnICkKKyAgICAgICAgeworICAgICAgICAgIHBSZW1vdmVkW2tdID0gcFJlcUFyZ3NbaV07CisgICAgICAgICAgaysrOworICAgICAgICB9CisgICAgfQorfQorCisKK0lOVCBHZXRBcmdGcm9tU3RyaW5nKElOVCBhcmdjLCBURVhUQ0hBUiogYXJndltdLCBURVhUQ0hBUiogc2VhcmNoX3N0cmluZywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGZvdW5kX3N0cmluZywgSU5UKiBzd191c2VkICkKK3sKKyAgSU5UIGkgPSAwOworCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kgKSB7CisgICAgaWYgKCAhX3Rjc2NtcChzZWFyY2hfc3RyaW5nLCBhcmd2W2ldKSApIC8qIFN0cmluZ3MgYXJlIGVxdWFsICovCisgICAgICB7CisgICAgICAgIGlmICggdHlwZSA9PSAnMScgKSAvKiBTd2l0Y2ggd2l0aG91dCBhcmd1bWVudCAqLworICAgICAgICB7CisgICAgICAgICAgX3Rjc25jcHkoIGZvdW5kX3N0cmluZywgX1RFWFQoIjEiKSwgMSk7CisgICAgICAgICAgc3dfdXNlZFtpXSA9IDE7CisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICggaSA9PSAoYXJnYyAtIDEpKSAgLyogV2UgaGF2ZSAlcyBvciAlZCBidXQgYXJlIGZpbmlzaGVkKi8KKyAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpZiAoIF90Y3NsZW4oYXJndltpKzFdKSA+IENNRExfTUFYX1NUUkxFTiApCisgICAgICAgICAgeworI2lmZGVmIF9VTklDT0RFCisgICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiV2FybmluZzogSWdub3JpbmcgYXJndW1lbnQgZm9yIHN3aXRjaCAnJWxzJy4gIiksIHNlYXJjaF9zdHJpbmcgKTsKKyNlbHNlCisgICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiV2FybmluZzogSWdub3JpbmcgYXJndW1lbnQgZm9yIHN3aXRjaCAnJXMnLiAiKSwgc2VhcmNoX3N0cmluZyApOworI2VuZGlmCisgICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiQXJndW1lbnQgaXMgdG9vIExPTkcuXG4iKSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfdGNzbmNweSggZm91bmRfc3RyaW5nLCBhcmd2W2krMV0sIENNRExfTUFYX1NUUkxFTik7CisgICAgICAgICAgc3dfdXNlZFtpXSA9IDE7CisgICAgICAgICAgc3dfdXNlZFtpKzFdID0gMTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisKKworSU5UIENoZWNrQXJnKFRFWFRDSEFSKiBhcmcsIFRFWFRDSEFSKiBzdHIsIFVJTlQgbnVtQXJncywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGN1cl9zdHIpCit7CisgIFVJTlQgaSA9IDA7CisKKyAgLyogTm8gYXJndW1lbnQgZ2l2ZW4tPiByZXR1cm4gKi8KKyAgaWYgKGFyZ1swXSA9PSAnXDAnKQorICAgIHJldHVybiAwOworCisKKyAgLyogQ2hlY2sgaWYgYXJnIGlzIHN3aXRjaCAqLworICBmb3IgKCBpID0gMDsgaSA8IG51bUFyZ3M7ICsraSApCisgICAgeworICAgICAgaWYgKCFfdGNzY21wKGFyZywgJihzdHJbaSpDTURMX01BWF9BUkdDXSkpKQorICAgICAgICB7CisjaWZkZWYgX1VOSUNPREUKKyAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBBcmd1bWVudCAnJWxzJyBmb3Igc3dpdGNoICclbHMnIGlzIG5vdCB2YWxpZCBcbiIgKSwgYXJnLCBjdXJfc3RyICk7CisjZWxzZQorICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclcycgZm9yIHN3aXRjaCAnJXMnIGlzIG5vdCB2YWxpZCBcbiIgKSwgYXJnLCBjdXJfc3RyICk7CisjZW5kaWYKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgfQorICAvKiBDaGVjayBpZiB0eXBlIGlzICVkIGJ1dCBhIHN0cmluZyBpcyBnaXZlbiAqLworCisgIGZvciAoIGkgPSAwOyBpIDwgX3Rjc2xlbihhcmcpOyArK2kgKQorICAgIHsKKyAgICAgIGlmICggKHR5cGUgPT0gJ2QnKSAmJiAhX2lzdGRpZ2l0KGFyZ1tpXSkgJiYgYXJnW2ldICE9ICd4JyAmJiBhcmdbaV0gIT0gJy0nKQorICAgICAgICB7CisjaWZkZWYgX1VOSUNPREUKKyAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBBcmd1bWVudCAnJWxzJyBmb3Igc3dpdGNoICclbHMnIGlzIG5vdCBhIHZhbGlkIG51bWJlci5cbiIgKSwgYXJnLCBjdXJfc3RyKTsKKyNlbHNlCisgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogQXJndW1lbnQgJyVzJyBmb3Igc3dpdGNoICclcycgaXMgbm90IGEgdmFsaWQgbnVtYmVyLlxuIiApLCBhcmcsIGN1cl9zdHIpOworI2VuZGlmCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKworICByZXR1cm4gMDsKK30KKworCitJTlQgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhJTlQgYXJnYywgLypURVhUQ0hBUiogYXJndltdLCovIElOVCogc3dpdGNoZXNfdXNlZCkKK3sKKyAgSU5UIGkgPSAwOworCisgIGZvciggaSA9IDE7IGkgPCBhcmdjOyArK2kgKQorICAgIHsKKyAgICAgIGlmICggIXN3aXRjaGVzX3VzZWRbaV0gKQorICAgICAgICB7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisKKworc3RhdGljIGNoYXIgbGluZVtDTURMX01BWF9TVFJMRU4qQ01ETF9NQVhfQVJHQ107CitzdGF0aWMgY2hhciAqYXJndl9wdHJbQ01ETF9NQVhfQVJHQ107CisjaWZkZWYgQ01ERklMRV9QUkVGSVgKK3N0YXRpYyBjaGFyIHRtcFsyNTZdOyAvKiB0aGlzIGFycmF5IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZWZpeCBhbmQgdGhlIGZpbGVwYXRoL25hbWUgKi8KKyNlbmRpZgorCitpbnQgSUlTX1Byb2Nlc3NDbWRsTGlzdChjb25zdCBjaGFyKiBwYXJhbV9maWxlbmFtZSwgaW50ICgqcEZ1bmN0aW9uKShpbnQsIFRFWFRDSEFSKiopKQoreworICAvKiBzdGF0aWMgdG8gcmVkdWNlIHJlcXVpcmVkIHN0YWNrIHNpemUgKi8KKworICBGREtGSUxFICpjb25maWdfZnA7CisgIGludCBhcmdjOworICBjaGFyICpsaW5lX3B0cjsKKworI2lmZGVmIENNREZJTEVfUFJFRklYCisgIEZES3N0cmNweSh0bXAsIENNREZJTEVfUFJFRklYKTsKKyAgRkRLc3RyY3B5KHRtcCtGREtzdHJsZW4oQ01ERklMRV9QUkVGSVgpLCBwYXJhbV9maWxlbmFtZSk7CisgIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCisgIGNvbmZpZ19mcCA9IEZES2ZvcGVuKHRtcCwgInIiKTsKKyNlbHNlCisgIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCisgIGNvbmZpZ19mcCA9IEZES2ZvcGVuKHBhcmFtX2ZpbGVuYW1lLCAiciIpOworI2VuZGlmCisKKyAgaWYoY29uZmlnX2ZwID09IE5VTEwpCisgIHsKKyNpZmRlZiBDTURGSUxFX1BSRUZJWAorICAgIEZES3ByaW50ZigiXG5jb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsIHRtcCk7CisjZWxzZQorICAgIEZES3ByaW50ZigiXG5jb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsIHBhcmFtX2ZpbGVuYW1lKTsKKyNlbmRpZgorICAgIHJldHVybiAxOworICB9CisKKyAgLyogT2J0YWluIGEgY29tbWFuZCBsaW5lIGZyb20gY29uZmlnIGZpbGUgKi8KKyAgd2hpbGUgKEZES2ZnZXRzKGxpbmUsIENNRExfTUFYX1NUUkxFTipDTURMX01BWF9BUkdDLCBjb25maWdfZnApICE9IE5VTEwpCisgIHsKKyAgICBhcmdjID0gMTsKKworICAgIC8qIEVhdCBcbiAqLworICAgIGxpbmVfcHRyID0gIChjaGFyKilGREtzdHJjaHIobGluZSwgJ1xuJyk7CisgICAgaWYgKGxpbmVfcHRyICE9IE5VTEwpCisgICAgICAqbGluZV9wdHIgPSAnICc7CisKKyAgICBsaW5lX3B0ciA9IGxpbmU7CisKKyAgICAvKiBTY2FuIHRoZSBsaW5lIGFuZCBwdXQgdGhlIGNvbW1hbmQgbGluZSBwYXJhbXMgaW50byBhcmd2ICovCisgICAgZG8geworICAgICAgLyogU2tpcCBjb25zZWN1dGl2ZSBibGFua3MuICovCisgICAgICB3aGlsZSAoKmxpbmVfcHRyID09ICcgJyAmJiBsaW5lX3B0ciA8IGxpbmUrQ01ETF9NQVhfU1RSTEVOKQorICAgICAgICBsaW5lX3B0cisrOworICAgICAgLyogQXNzaWduIGFyZ3VtZW50LiAqLworICAgICAgYXJndl9wdHJbYXJnY10gPSBsaW5lX3B0cjsKKyAgICAgIC8qIEdldCBwb2ludGVyIHRvIG5leHQgYmxhbmsuICovCisgICAgICBsaW5lX3B0ciA9IChjaGFyKilGREtzdHJjaHIobGluZV9wdHIsICcgJyk7CisgICAgICAvKiAgKi8KKyAgICAgIGlmIChsaW5lX3B0ciAhPSBOVUxMKSB7CisgICAgICAgIC8qIE51bGwgdGVybWluYXRlICovCisgICAgICAgICpsaW5lX3B0ciA9IDA7CisgICAgICAgIC8qIFNraXAgZm9ybWVyIGJsYW5rIChub3cgbnVsbCBjaGFyYWN0ZXIpICovCisgICAgICAgIGxpbmVfcHRyKys7CisgICAgICAgIC8qIEFkdmFuY2UgYXJndW1lbnQgY291bnRlciAqLworICAgICAgfQorICAgICAgYXJnYysrOworICAgIH0gd2hpbGUgKCBsaW5lX3B0ciAhPSBOVUxMICYmIGFyZ2MgPCBDTURMX01BWF9BUkdDKTsKKworICAgIC8qIGNhbGwgIndvdWxkIGJlIG1haW4oKSIgKi8KKyAgICBpZiAoYXJnYyA+IDIgJiYgKmFyZ3ZfcHRyWzFdICE9ICcjJyAmJiBGREtzdHJsZW4oYXJndl9wdHJbMV0pPjEpCisgICAgeworICAgICAgaW50IHJldHZhbDsKKworICAgICAgcmV0dmFsID0gKCpwRnVuY3Rpb24pKGFyZ2MsIGFyZ3ZfcHRyKTsKKworICAgICAgRkRLcHJpbnRmKCJtYWluIHJldHVybmVkICVkXG4iLCByZXR2YWwpOworICAgIH0KKyAgfQorCisgIEZES2ZjbG9zZShjb25maWdfZnApOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9zcmMvY29udl9zdHJpbmcuY3BwIGIvYWFjL2xpYlNZUy9zcmMvY29udl9zdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Y2JjODMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9jb252X3N0cmluZy5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJjb252X3N0cmluZy5oIgorCitJTlQgY2hhckJ1ZjJIZXhTdHJpbmcoY2hhciAqc3RyaW5nLCBVQ0hBUiAqY2hhckJ1ZiwgSU5UIGNoYXJCdWZMZW5ndGgpCit7CisgIElOVCBpOworICBVQ0hBUiBjMSwgYzI7CisKKyAgLyogc2FuaXR5IGNoZWNrcyAqLworICAvKiBjaGVjayBhcnJheSBsZW5ndGggKi8KKyAgaWYgKGNoYXJCdWZMZW5ndGggPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGRlZmluZSBoZXggc3RyaW5nIFRhYmxlICovCisgIFVDSEFSIGhleFN5bWJbMTZdPXsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ2EnLCdiJywnYycsJ2QnLCdlJywnZid9OworCisgIC8qIGNhbGN1bGF0ZSBjb3JyZXNwb25kaW5nIGhleCBzdHJpbmcgZnJvbSBjaGFyQnVmZmVyICovCisgIGZvciAoaT0wO2k8Y2hhckJ1Zkxlbmd0aDtpKyspIHsKKyAgICBjMSA9ICgoY2hhckJ1ZltpXSk+PjQpJjB4MGY7IC8qIHVwcGVyIG5pYmJsZSAqLworICAgIGMyID0gKGNoYXJCdWZbaV0pJjB4MGY7ICAgICAgLyogbG93ZXIgbmliYmxlICovCisKKyAgICBzdHJpbmdbaSoyXSAgID0gaGV4U3ltYltjMV07ICAvKiBjb252ZXJ0IHRvIHN0cmluZyAqLworICAgIHN0cmluZ1tpKjIrMV0gPSBoZXhTeW1iW2MyXTsgIC8qIGNvbnZlcnQgdG8gc3RyaW5nICovCisgIH0KKworICAvKiB0ZXJtaW5hdGUgc3RyaW5nICovCisgIHN0cmluZ1tjaGFyQnVmTGVuZ3RoPDwxXT0nXDAnOworCisgIHJldHVybiAwOworCit9CisKK0lOVCBoZXhTdHJpbmcyQ2hhckJ1Zihjb25zdCBjaGFyICpzdHJpbmcsIFVDSEFSICpjaGFyQnVmLCBVSU5UIGNoYXJCdWZMZW5ndGgpCit7CisgIFVJTlQgaSwgayA9IDA7CisgIFVDSEFSIGhOaWJibGUsIGxOaWJibGU7CisKKyAgLyogc2FuaXR5IGNoZWNrcyAqLworICBpZiAoc3RyaW5nWzBdID09ICdcMCcpIHsKKyAgICByZXR1cm4gLTE7IC8qIGludmFsaWQgc3RyaW5nIHNpemUgKi8KKyAgfQorCisgIGlmIChjaGFyQnVmTGVuZ3RoPD0wKXsKKyAgICByZXR1cm4gLTI7IC8qIGludmFsaWQgYnVmZmVyIHNpemUgKi8KKyAgfQorCisgIC8qIGNvbnZlcnQgdG8gaGV4IGNoYXJhY3RlcnMgdG8gY29ycmVzcG9uZGluZyA4Yml0IHZhbHVlICovCisgIGZvciAoaT0wOyhzdHJpbmdbaV0hPSdcMCcpJiYoKGk+PjEpPGNoYXJCdWZMZW5ndGgpO2krPTIpIHsKKyAgICBrID0gaT4+MTsKKyAgICBoTmliYmxlID0gaGV4Q2hhcjJEZWMoc3RyaW5nW2ldKTsKKyAgICBsTmliYmxlID0gaGV4Q2hhcjJEZWMoc3RyaW5nW2krMV0pOworICAgIGlmICgoaE5pYmJsZSA9PSAxNikgfHwgKGxOaWJibGUgPT0gMTYpKSB7CisgICAgICByZXR1cm4gLTM7IC8qIGludmFsaWQgY2hhcmFjdGVyICovCisgICAgfQorICAgIGNoYXJCdWZba10gPSAoKGhOaWJibGU8PDQpJjB4ZjApICsgbE5pYmJsZTsKKyAgfQorCisgIC8qIGNoZWNrIGlmIGxhc3QgY2hhcmFjdGVyIHdhcyBzdHJpbmcgdGVybWluYXRvciAqLworICBpZiAoKHN0cmluZ1tpLTJdIT0wKSAmJiAoc3RyaW5nW2ldIT0wKSkgeworICAgIHJldHVybiAtMTsgLyogaW52YWxpZCBzdHJpbmcgc2l6ZSAqLworICB9CisKKyAgLyogZmlsbCBjaGFyQnVmZmVyIHdpdGggemVyb3MgKi8KKyAgZm9yIChpPWsrMTtpPGNoYXJCdWZMZW5ndGg7aSsrKSB7CisgICAgY2hhckJ1ZltpXSA9IDA7CisgIH0KKworICByZXR1cm4gMDsKKworfQorCitVQ0hBUiBoZXhDaGFyMkRlYyhjb25zdCBjaGFyIGMpCit7CisgIElOVCByID0gMDsKKyAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkKKyAgICByID0gYy0nMCc7CisgIGVsc2UgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkKKyAgICByID0gYy0nYScrMTA7CisgIGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkKKyAgICByID0gYy0nQScrMTA7CisgIGVsc2UKKyAgICByID0gMTY7IC8qIGludmFsaWQgaGV4IGNoYXJhY3RlciAqLworCisgIHJldHVybiAoVUNIQVIpcjsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9zcmMvZ2VuZXJpY1N0ZHMuY3BwIGIvYWFjL2xpYlNZUy9zcmMvZ2VuZXJpY1N0ZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDYyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKQEAgLTAsMCArMSw0OTYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorICAgRGVzY3JpcHRpb246IC0gR2VuZXJpYyBtZW1vcnksIHN0ZGlvLCBzdHJpbmcsIGV0Yy4gZnVuY3Rpb24gd3JhcHBlcnMgb3IKKyAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLgorICAgICAgICAgICAgICAgIC0gT1MgZGVwZW5kYW50IGZ1bmN0aW9uIHdyYXBwZXJzLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBTWVNfTElCX1ZMMCAxCisjZGVmaW5lIFNZU19MSUJfVkwxIDMKKyNkZWZpbmUgU1lTX0xJQl9WTDIgNgorI2RlZmluZSBTWVNfTElCX1RJVExFICJTeXN0ZW0gSW50ZWdyYXRpb24gTGlicmFyeSIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBTWVNfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgU1lTX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBTWVNfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgU1lTX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKKworICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICNpbmNsdWRlIDxzdGRpby5oPgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICAgI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1lbW9yeSBhbGxvY2F0aW9uIG1vbml0b3JpbmcgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIEluY2x1ZGUgT1MvU3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucy4gKi8KKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX18pIC8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyAgI2luY2x1ZGUgImxpbnV4L2dlbmVyaWNTdGRzX2xpbnV4LmNwcCIKKyNlbmRpZgorCisKKyNpZiAhKGRlZmluZWQoVVNFX0JVSUxUSU5fU1RSSU5HX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIEZVTkNUSU9OX0ZES3ByaW50Zgordm9pZCAgRkRLcHJpbnRmKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSAgICB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBzekZtdCk7CisgIHZwcmludGYoc3pGbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyNpZmRlZiBBUkNIX1dBX0ZMVVNIX0NPTlNPTEUKKyAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX0ZES3ByaW50ZkVycgordm9pZCAgRkRLcHJpbnRmRXJyKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBzekZtdCk7CisjaWYgZGVmaW5lZChBUkNIX1dBX1NMT1dDT04pCisgIHZwcmludGYoc3pGbXQsIGFwKTsKKyNlbHNlCisgIHZmcHJpbnRmKHN0ZGVyciwgc3pGbXQsIGFwKTsKKyNlbmRpZgorICB2YV9lbmQoYXApOworI2lmZGVmIEFSQ0hfV0FfRkxVU0hfQ09OU09MRQorICBmZmx1c2goc3RkZXJyKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK2ludCBGREtnZXRjaGFyKHZvaWQpIHsgcmV0dXJuIGdldGNoYXIoKTsgfQorCitJTlQgIEZES2ZwcmludGYoRkRLRklMRSAgKnN0cmVhbSwgIGNvbnN0ICBjaGFyICpmb3JtYXQsIC4uLikgeworICBJTlQgY2hhcnMgPSAwOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgY2hhcnMgKz0gdmZwcmludGYoKEZJTEUqKXN0cmVhbSwgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBjaGFyczsKK30KKworI2lmbmRlZiBGVU5DVElPTl9GREtzcHJpbnRmCitJTlQgIEZES3NwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICBJTlQgY2hhcnMgPSAwOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgY2hhcnMgKz0gdnNwcmludGYoc3RyLCBmb3JtYXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIGNoYXJzOworfQorI2VuZGlmCisKKyNlbHNlCisKK3ZvaWQgRkRLcHJpbnRmKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSB7IC8qIHN0dWIhICovOyB9Cit2b2lkIEZES3ByaW50ZkVyciggY29uc3QgY2hhciogc3pGbXQsIC4uLikgeyAvKiBzdHViISAqLzsgfQorSU5UICBGREtmcHJpbnRmKEZJTEUgICpzdHJlYW0sICBjb25zdCAgY2hhciAqZm9ybWF0LCAuLi4pIHsgLypzdHViICEgKi87IH0KK0lOVCAgRkRLc3ByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7IC8qIHN0dWIhICovOyB9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2NvbnN0IGNoYXIgKkZES3N0cmNocihjb25zdCBjaGFyICpzLCBJTlQgYykgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHN0cmNocihzLCBjKTsgfQorY29uc3QgY2hhciAqRkRLc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpICAgeyByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpOyB9CisjaWZuZGVmIEZVTkNUSU9OX0ZES3N0cmNweQorY2hhciAqRkRLc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyY3B5KGRlc3QsIHNyYyk7IH0KKyNlbmRpZgorY2hhciAqRkRLc3RybmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIFVJTlQgbikgICAgICAgICAgICAgeyByZXR1cm4gc3RybmNweShkZXN0LCBzcmMsIG4pOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEWU5BTUlDIE1FTU9SWSBtYW5hZ2VtZW50IChoZWFwKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlVOQ1RJT05fRkRLY2FsbG9jCit2b2lkICpGREtjYWxsb2MgKGNvbnN0IFVJTlQgbiwgY29uc3QgVUlOVCBzaXplKQoreworICB2b2lkKiBwdHI7CisKKyAgcHRyID0gY2FsbG9jKG4sIHNpemUpOworCisgIHJldHVybiBwdHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9GREttYWxsb2MKK3ZvaWQgKkZES21hbGxvYyAoY29uc3QgVUlOVCBzaXplKQoreworICB2b2lkKiBwdHI7CisKKyAgcHRyID0gbWFsbG9jKHNpemUpOworCisgIHJldHVybiBwdHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9GREtmcmVlCit2b2lkICBGREtmcmVlICh2b2lkICpwdHIpCit7CisgIC8qIEZES3ByaW50ZigiZiwgaGVhcFNpemU6ICVkXG4iLCBoZWFwU2l6ZUN1cnIpOyAqLworICBmcmVlKChJTlQqKXB0cik7Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9GREthYWxsb2MKK3ZvaWQgKkZES2FhbGxvYyhjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50KQoreworICB2b2lkICphZGRyLCAqcmVzdWx0PU5VTEw7CisgIGFkZHIgPSBGREtjYWxsb2MoMSwgc2l6ZSArIGFsaWdubWVudCArIHNpemVvZih2b2lkKikpOyAgICAgICAgICAgICAgIC8qIE1hbGxvYyBhbmQgY2xlYXIgbWVtb3J5LiAgICAgICAgICovCisKKyAgaWYgKGFkZHIhPU5VTEwpCisgIHsKKyAgICByZXN1bHQgPSBBTElHTl9QVFIoKHVuc2lnbmVkIGNoYXIqKWFkZHIgKyBzaXplb2Yodm9pZCopKTsgICAgLyogR2V0IGFsaWduZWQgbWVtb3J5IGJhc2UgYWRkcmVzcy4gKi8KKyAgICAqKCgodm9pZCoqKXJlc3VsdCkgLSAxKSA9IGFkZHI7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbWFsbG9jJ2VkIG1lbW9yeSBwb2ludGVyLiAgICovCisgIH0KKworICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBhbGlnbmVkIGFkZHJlc3MuICAgICAgICAgICovCit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9GREthZnJlZQordm9pZCAgRkRLYWZyZWUgKHZvaWQgKnB0cikKK3sKKyAgdm9pZCAqYWRkcjsKKyAgYWRkciA9ICooKCh2b2lkKiopcHRyKS0xKTsgLyogR2V0IHBvaW50ZXIgdG8gbWFsbG9jJ2VkIG1lbW9yeS4gKi8KKyAgRkRLZnJlZShhZGRyKTsgICAgICAgICAgICAgICAgLyogRnJlZSBtYWxsb2MnZWQgbWVtb3J5IGFyZWEuICAgICAgKi8KK30KKyNlbmRpZgorCisKKyNpZm5kZWYgRlVOQ1RJT05fRkRLY2FsbG9jX0wKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIERBVEEgTUVNT1JZIEwxL0wyIChmYWxsYmFjaykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEZES2NhbGxvY19MCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgKkZES2NhbGxvY19MKGNvbnN0IFVJTlQgZGltLCBjb25zdCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpCit7CisgIGludCBhX3NpemU7CisKKyAgaWYgKHMgPT0gU0VDVF9EQVRBX0VYVEVSTikKKyAgICBnb3RvIGZhbGxiYWNrOworCisgIGFfc2l6ZSA9ICgoZGltKnNpemUrMykmMHhmZmZmZmZmYyk7IC8qIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgKDExMTEgLi4uLiAxMTExIDExMDApICovCisKKworCisKKworICAvL3ByaW50ZigiV2FybmluZywgb3V0IG9mIGludGVybmFsIG1lbW9yeVxuIik7CisKK2ZhbGxiYWNrOgorICByZXR1cm4gRkRLY2FsbG9jKGRpbSwgc2l6ZSk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fRkRLY2FsbG9jX0wgKi8KKworI2lmbmRlZiBGVU5DVElPTl9GREtmcmVlX0wKK3ZvaWQgIEZES2ZyZWVfTCAodm9pZCAqcCkKK3sKKworICAgIEZES2ZyZWUocCk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fRkRLZnJlZV9MICovCisKKyNpZm5kZWYgRlVOQ1RJT05fRkRLYWFsbG9jX0wKK3ZvaWQgKkZES2FhbGxvY19MKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQsIE1FTU9SWV9TRUNUSU9OIHMpCit7CisgIHZvaWQgKmFkZHIsICpyZXN1bHQ9TlVMTDsKKyAgYWRkciA9IEZES2NhbGxvY19MKDEsIHNpemUgKyBhbGlnbm1lbnQgKyBzaXplb2Yodm9pZCopLCBzKTsgICAgICAgLyogTWFsbG9jIGFuZCBjbGVhciBtZW1vcnkuICAgICAgICAgKi8KKworICBpZiAoYWRkciE9TlVMTCkKKyAgeworICAgIHJlc3VsdCA9IEFMSUdOX1BUUigodW5zaWduZWQgY2hhciAqKWFkZHIgKyBzaXplb2Yodm9pZCopKTsgICAgLyogR2V0IGFsaWduZWQgbWVtb3J5IGJhc2UgYWRkcmVzcy4gKi8KKyAgICAqKCgodm9pZCoqKXJlc3VsdCkgLSAxKSA9IGFkZHI7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbWFsbG9jJ2VkIG1lbW9yeSBwb2ludGVyLiAgICovCisgIH0KKworICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBhbGlnbmVkIGFkZHJlc3MuICAgICAgICAgICovCit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9GREthZnJlZV9MCit2b2lkICBGREthZnJlZV9MICh2b2lkICpwdHIpCit7CisgIHZvaWQgKmFkZHI7CisKKyAgYWRkciA9ICooKCh2b2lkKiopcHRyKS0xKTsgLyogR2V0IHBvaW50ZXIgdG8gbWFsbG9jJ2VkIG1lbW9yeS4gKi8KKyAgRkRLZnJlZV9MKGFkZHIpOyAgICAgICAgICAgICAgICAvKiBGcmVlIG1hbGxvYydlZCBtZW1vcnkgYXJlYS4gICAgICAqLworfQorI2VuZGlmCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRlVOQ1RJT046ICAgIEZES21lbWNweQorICogREVTQ1JJUFRJT046IC0gY29waWVzIG1lbW9yeSBmcm9tICJzcmMiIHRvICJkc3QiIHdpdGggbGVuZ3RoICJzaXplIiBieXRlcworICogICAgICAgICAgICAgIC0gY29tcGlsZWQgd2l0aCBGREtfREVCVUcgd2lsbCBnaXZlIHlvdSB3YXJuaW5ncworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGREttZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGNvbnN0IFVJTlQgc2l6ZSkKK3sKKworICAvKiBkbyB0aGUgY29weSAqLworICBtZW1jcHkoZHN0LCBzcmMsIHNpemUpOworfQorCit2b2lkIEZES21lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGNvbnN0IFVJTlQgc2l6ZSkgICAgIHsgbWVtbW92ZShkc3QsIHNyYywgc2l6ZSk7IH0KK3ZvaWQgRkRLbWVtc2V0KHZvaWQgKm1lbVB0ciwgY29uc3QgSU5UIHZhbHVlLCBjb25zdCBVSU5UIHNpemUpICAgeyBtZW1zZXQobWVtUHRyLCB2YWx1ZSwgc2l6ZSk7IH0KK3ZvaWQgRkRLbWVtY2xlYXIodm9pZCAqbWVtUHRyLCBjb25zdCBVSU5UIHNpemUpICAgICAgICAgICAgICAgICAgeyBGREttZW1zZXQobWVtUHRyLDAsc2l6ZSk7IH0KK1VJTlQgRkRLc3RybGVuKGNvbnN0IGNoYXIgKnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKFVJTlQpc3RybGVuKHMpOyB9CisKKy8qIENvbXBhcmUgZnVuY3Rpb24gd3JhcHBlcnMgKi8KK0lOVCBGREttZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCBVSU5UIHNpemUpICB7IHJldHVybiBtZW1jbXAoczEsIHMyLCBzaXplKTsgfQorSU5UIEZES3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHN0cmNtcChzMSwgczIpOyB9CitJTlQgRkRLc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IFVJTlQgc2l6ZSkgeyByZXR1cm4gc3RybmNtcChzMSwgczIsIHNpemUpOyB9CisKKworLyogTWF0aCBmdW5jdGlvbiB3cmFwcGVycy4gT25seSBpbnRlbmRlZCBmb3IgY29tcGF0aWJpbGl0eSwgbm90IHRvIGJlIGhpZ2hseSBvcHRpbWl6ZWQuICovCisKK0lOVCBGREthYnMoSU5UIGopIHsgcmV0dXJuIGFicyhqKTsgfQorZG91YmxlIEZES2ZhYnMoZG91YmxlIHgpIHsgcmV0dXJuIGZhYnMoeCk7IH0KK2RvdWJsZSBGREtwb3coZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiBwb3coeCx5KTsgfQorZG91YmxlIEZES3NxcnQoZG91YmxlIHgpIHsgcmV0dXJuIHNxcnQoeCk7IH0KK2RvdWJsZSBGREthdGFuKGRvdWJsZSB4KSB7IHJldHVybiBhdGFuKHgpOyB9Citkb3VibGUgRkRLbG9nKGRvdWJsZSB4KSB7IHJldHVybiBsb2coeCk7IH0KK2RvdWJsZSBGREtzaW4oZG91YmxlIHgpIHsgcmV0dXJuIHNpbih4KTsgfQorZG91YmxlIEZES2Nvcyhkb3VibGUgeCkgeyByZXR1cm4gY29zKHgpOyB9Citkb3VibGUgRkRLZXhwKGRvdWJsZSB4KSB7IHJldHVybiBleHAoeCk7IH0KK2RvdWJsZSBGREthdGFuMihkb3VibGUgeSwgZG91YmxlIHgpIHsgcmV0dXJuIGF0YW4yKHksIHgpOyB9Citkb3VibGUgRkRLYWNvcyhkb3VibGUgeCkgeyByZXR1cm4gYWNvcyh4KTsgfQorZG91YmxlIEZES3Rhbihkb3VibGUgeCkgeyByZXR1cm4gdGFuKHgpOyB9Citkb3VibGUgRkRLZmxvb3IoZG91YmxlIHgpIHsgcmV0dXJuIGZsb29yKHgpOyB9Citkb3VibGUgRkRLY2VpbChkb3VibGUgeCkgeyByZXR1cm4gY2VpbCh4KTsgfQorCitJTlQgICBGREthdG9pKGNvbnN0IGNoYXIgKm5wdHIpIHsgcmV0dXJuIGF0b2kobnB0cik7IH0KK2xvbmcgIEZES2F0b2woY29uc3QgY2hhciAqbnB0cikgeyByZXR1cm4gYXRvbChucHRyKTsgfQorZmxvYXQgRkRLYXRvZihjb25zdCBjaGFyICpucHRyKSB7IHJldHVybiAoZmxvYXQpYXRvZihucHRyKTsgfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09IEZJTEUgSS9PID09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2ZvcGVuKQorRkRLRklMRSAqRkRLZm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZmNsb3NlKQorSU5UIEZES2ZjbG9zZShGREtGSUxFICpmcCkgeyByZXR1cm4gZmNsb3NlKChGSUxFKilmcCk7fQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZnNlZWspCitJTlQgRkRLZnNlZWsoRkRLRklMRSAqZnAsIExPTkcgT0ZGU0VULCBpbnQgV0hFTkNFKSB7IHJldHVybiBmc2VlaygoRklMRSopZnAsIE9GRlNFVCwgV0hFTkNFKTt9CisjZW5kaWYKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmdGVsbCkKK0lOVCBGREtmdGVsbChGREtGSUxFICpmcCkgeyByZXR1cm4gZnRlbGwoKEZJTEUqKWZwKTsgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZmZsdXNoKQorSU5UIEZES2ZmbHVzaChGREtGSUxFICpmcCkgeyByZXR1cm4gZmZsdXNoKChGSUxFKilmcCk7IH0KKyNlbmRpZgorY29uc3QgSU5UIEZES1NFRUtfU0VUID0gU0VFS19TRVQ7Citjb25zdCBJTlQgRkRLU0VFS19DVVIgPSBTRUVLX0NVUjsKK2NvbnN0IElOVCBGREtTRUVLX0VORCA9IFNFRUtfRU5EOworCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZndyaXRlKQorVUlOVCBGREtmd3JpdGUodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7IHJldHVybiBmd3JpdGUocHRyZiwgc2l6ZSwgbm1lbWIsIChGSUxFKilmcCk7IH0KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2ZyZWFkKQorVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgeyByZXR1cm4gZnJlYWQoZHN0LCBzaXplLCBubWVtYiwgKEZJTEUqKWZwKTsgfQorI2VuZGlmCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZmdldHMpCitjaGFyKiBGREtmZ2V0cyh2b2lkICpkc3QsIElOVCBzaXplLCBGREtGSUxFICpmcCkgeyByZXR1cm4gZmdldHMoKGNoYXIgKilkc3QsIHNpemUsIChGSUxFKilmcCk7IH0KKyNlbmRpZgorI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES3Jld2luZCkKK3ZvaWQgRkRLcmV3aW5kKEZES0ZJTEUgKmZwKSB7IEZES2ZzZWVrKChGSUxFKilmcCwwLEZES1NFRUtfU0VUKTsgfQorI2VuZGlmCisKKworVUlOVCBGREtmd3JpdGVfRUwodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7CisKKyAgICBpZiAoSVNfTElUVExFX0VORElBTigpKSB7CisgICAgICBGREtmd3JpdGUocHRyZiwgc2l6ZSwgbm1lbWIsIGZwKTsKKyAgICB9IGVsc2UgeworICAgICAgVUlOVCBuOworICAgICAgSU5UIHM7CisKKyAgICAgIFVDSEFSICpwdHIgPSAoVUNIQVIqKSBwdHJmOworCisgICAgICBmb3IgKG49MDsgbjxubWVtYjsgbisrKSB7CisgICAgICAgIGZvciAocz1zaXplLTE7IHM+PTA7IHMtLSkgeworICAgICAgICAgIC8vRkRLcHJpbnRmKCJjaGFyID0gJWNcbiIsIChjaGFyKSoocHRyK3MpKTsKKyAgICAgICAgICBGREtmd3JpdGUocHRyICsgcywgMSwgMSwgZnApOworICAgICAgICB9CisgICAgICAgIHB0ciA9IHB0ciArIHNpemU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBubWVtYjsKK30KKworCitVSU5UIEZES2ZyZWFkX0VMKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7CisgIFVJTlQgbiwgczAsIHMxLCBlcnI7CisgIFVDSEFSIHRtcCwgKnB0cjsKKyAgVUNIQVIgdG1wMjRbM107CisKKyAgLyogRW5mb3JjZSBhbGlnbm1lbnQgb2YgMjQgYml0IGRhdGEuICovCisgIGlmIChzaXplID09IDMpIHsKKyAgICBwdHIgPSAoVUNIQVIqKWRzdDsKKyAgICBlcnIgPSAwOworICAgIGZvciAobj0wOyBuPG5tZW1iOyBuKyspIHsKKyAgICAgIGlmICgoZXJyID0gRkRLZnJlYWQodG1wMjQsIDEsIDMsIGZwKSkgIT0gMykgeworICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorICAgICAgKnB0cisrID0gdG1wMjRbMF07CisgICAgICAqcHRyKysgPSB0bXAyNFsxXTsKKyAgICAgICpwdHIrKyA9IHRtcDI0WzJdOworICAgICAgLyogU2lnbiBleHRlbnNpb24gKi8KKyAgICAgIGlmICh0bXAyNFsyXSAmIDB4ODApIHsKKyAgICAgICAgKnB0cisrID0gMHhmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwdHIrKyA9IDA7CisgICAgICB9CisgICAgfQorICAgIGVyciA9IG5tZW1iOworICAgIHNpemUgPSBzaXplb2YoTE9ORyk7CisgIH0gZWxzZSB7CisgICAgaWYgKChlcnIgPSBGREtmcmVhZChkc3QsIHNpemUsIG5tZW1iLCBmcCkpICE9IG5tZW1iKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorICBpZiAoIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiBzaXplID4gMSkgeworICAgIHB0ciA9IChVQ0hBUiopZHN0OworICAgIGZvciAobj0wOyBuPG5tZW1iOyBuKyspIHsKKyAgICAgIGZvciAoczA9MCwgczE9c2l6ZS0xOyBzMCA8IHMxOyBzMCsrLCBzMS0tKSB7CisgICAgICAgIHRtcCA9IHB0cltzMF07CisgICAgICAgIHB0cltzMF0gPSBwdHJbczFdOworICAgICAgICBwdHJbczFdID0gdG1wOworICAgICAgfQorICAgICAgcHRyICs9IHNpemU7CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CisKK0lOVCBGREtmZW9mKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZW9mKChGSUxFKilmcCk7IH0KKworLyogR2xvYmFsIGluaXRpYWxpemF0aW9uL2NsZWFudXAgKi8KKworI2lmIGRlZmluZWQoX0RFQlVHKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgI2RlZmluZSBfQ1JUREJHX01BUF9BTExPQworICAjaW5jbHVkZSA8Y3J0ZGJnLmg+CisjZW5kaWYKKworCisKKwordm9pZCBGREtwcmludERpc2NsYWltZXIodm9pZCkKK3sKKyAgRkRLcHJpbnRmKAorICAiVGhpcyBwcm9ncmFtIGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3IGFuZCBpbnRlcm5hdGlvbmFsIHRyZWF0aWVzLlxuIiAgXAorICAiQW55IHJlcHJvZHVjdGlvbiBvciBkaXN0cmlidXRpb24gb2YgdGhpcyBwcm9ncmFtLCBvciBhbnkgcG9ydGlvblxuIiAgICAgICAgXAorICAib2YgaXQsIG1heSByZXN1bHQgaW4gc2V2ZXJlIGNpdmlsIGFuZCBjcmltaW5hbCBwZW5hbHRpZXMsIGFuZCB3aWxsIGJlXG4iICAgXAorICAicHJvc2VjdXRlZCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LlxuXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9zcmMvbGludXgvRkRLX3N0YWNrbG9hZF9saW51eC5jcHAgYi9hYWMvbGliU1lTL3NyYy9saW51eC9GREtfc3RhY2tsb2FkX2xpbnV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZhOWFiCi0tLSAvZGV2L251bGwKKysrIGIvYWFjL2xpYlNZUy9zcmMvbGludXgvRkRLX3N0YWNrbG9hZF9saW51eC5jcHAKQEAgLTAsMCArMSw5MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IFN0YWNrIGNvbnN1bXB0aW9uIGluZm9ybWF0aW9uIGdhdGhlcmluZy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL3NyYy9saW51eC9hdWRpb19saW51eC5jcHAgYi9hYWMvbGliU1lTL3NyYy9saW51eC9hdWRpb19saW51eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1YjI3YgotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTWVMvc3JjL2xpbnV4L2F1ZGlvX2xpbnV4LmNwcApAQCAtMCwwICsxLDkwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcjogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IEF1ZGlvIHN1cHBvcnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL3NyYy9saW51eC9jb3Jlc3VwX2xpbnV4LmNwcCBiL2FhYy9saWJTWVMvc3JjL2xpbnV4L2NvcmVzdXBfbGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9saW51eC9jb3Jlc3VwX2xpbnV4LmNwcApAQCAtMCwwICsxLDkwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IFN5c3RlbSBzdXBwb3J0IHJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvYWFjL2xpYlNZUy9zcmMvbGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwIGIvYWFjL2xpYlNZUy9zcmMvbGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzc1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9saW51eC9nZW5lcmljU3Rkc19saW51eC5jcHAKQEAgLTAsMCArMSwyOTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKyAgIERlc2NyaXB0aW9uOiBMaW51eCBnZW5lcmljU3RkcyAobW9zdGx5IGtlcm5lbCBTUkFNIGRyaXZlciBiaW5kaW5ncykKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBOT1RFOiBpdCBtYWtlcyBvbmx5IHNlbnNlIHRvIGVuYWJsZSB0aGlzIGlmIHlvdSBhbHNvIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIEdOVS9MaW51eCBrZXJuZWwgZHJpdmVyIHRvIGFjY2VzcyBmYXN0IFNSQU0uCisgKi8KKyNpZiBkZWZpbmVkKF9fYXJtX18pIC8qIHx8IGRlZmluZWQoX19taXBzX18pICovCisKKy8qKgorICogRUFCSSBzdGF0aWMgbGlua2luZyBwcm9ibGVtIHdvcmthcm91bmQKKyAqCisgKiBUaGVzZSBmdW5jdGlvbiBhcmUgbm9ybWFsbHkgcHJlc2VudCBpbiBsaWJjLmEgYnV0CisgKiBhcHBhcmVudGx5IGNhbiBiZSBsaW5rZWQgb25seSBzdGF0aWNhbGx5LgorICogV2hpbGUgdXNpbmcgQysrIChpaXNpc29mZikgdGhhdCBpcyBhIHByb2JsZW0sCisgKiBiZWNhdXNlIGl0IHdvbnQgd29yayAoc3RhdGljIGdsb2JhbCBjb25zdHJ1Y3RvcnMKKyAqIGNhdXNlIHByb2JsZW1zIHdpdGggc3RhdGljIGxpbmtlZCBwcm9ncmFtcykuCisgKiBTbyB0aGUgd29ya2Fyb3VuZCBpcyB0byBpbmNsdWRlIHRob3NlIGZ1bmN0aW9ucyBoZXJlLAorICogYmVjYXVzZSBsaWJTWVMuYSBpcyBsaW5rZWQgc3RhdGljYWxseSwgYW5kIGxpYmMgY2FuIGJlCisgKiBsaW5rZWQgZHluYW1pY2FsbHkgYXMgdXN1YWwuCisgKgorICogQWRkIG1vcmUgRUFCSSBmdW5jdGlvbnMgaGVyZSBpZiB5b3UgZ2V0IHVucmVzb2x2ZWQKKyAqIHN5bWJvbHMgb2YgRUFCSSBmdW5jdGlvbnMuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2FlYWJpX21lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIGludCBzaXplKQoreworICBtZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsKK30KK3ZvaWQgX19hZWFiaV9tZW1jcHk0KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgaW50IHNpemUpCit7CisgIG1lbWNweShkZXN0LCBzcmMsIHNpemUpOworfQordm9pZCBfX2FlYWJpX21lbW1vdmU0KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgaW50IHNpemUpCit7CisgIG1lbW1vdmUoZGVzdCwgc3JjLCBzaXplKTsKK30KK3ZvaWQgX19hZWFiaV9tZW1jbHIodm9pZCAqcHRyLCBpbnQgc2l6ZSkKK3sKKyAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7Cit9Cit2b2lkIF9fYWVhYmlfbWVtY2xyNCh2b2lkICpwdHIsIGludCBzaXplKQoreworICBtZW1zZXQocHRyLCAwLCBzaXplKTsKK30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIEluY2x1ZGUgTGludXgga2VybmVsIGNvbmZpZywgb3Igc2V0IEFSQ0ggYW5kIHByb2Nlc3NvciBtYWNyb3MgZGlyZWN0bHkgKi8KKy8qCisjZGVmaW5lIENPTkZJR19BUkNIX01YQworI2RlZmluZSBDT05GSUdfQVJDSF9NWDI1CisqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKKyNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAgICAgICA2NTUzNgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDMxKQorI2RlZmluZSBLRVJORUxfU1JBTV9TSVpFICAgICAgIDE2Mzg0CisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YMjUpCisjZGVmaW5lIEtFUk5FTF9TUkFNX1NJWkUgICAgICAxMzEwNzIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzNSkKKyNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAgICAgIDEzMTA3MgorI2Vsc2UKKyNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAwCisjZW5kaWYKKworI2lmIChLRVJORUxfU1JBTV9TSVpFID4gMCkKKyNkZWZpbmUgS0VSTkVMX1NDUkFUQ0hfU0laRSAoNDA5NikKKyNkZWZpbmUgRkRLX1NDUkFUQ0hCVUZfU0laRSAoS0VSTkVMX1NDUkFUQ0hfU0laRS9zaXplb2YoSU5UKSkKKyNkZWZpbmUgREFUQV9MMV9BX1NJWkUgKEtFUk5FTF9TUkFNX1NJWkUtS0VSTkVMX1NDUkFUQ0hfU0laRSkKKworI2RlZmluZSBSRVNPVVJDRV9zY3JhdGNoQnVmZmVyCisjZGVmaW5lIEZVTkNUSU9OX0ZES3Byb2xvZworI2RlZmluZSBGVU5DVElPTl9GREtlcGlsb2cKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKkwxX0RBVEFfQT1OVUxMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKl9hPU5VTEw7CisKKworI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKK3N0YXRpYyBJTlQgKl9fc2NyYXRjaEJ1ZmZlcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpfX3BTY3JhdGNoQnVmZmVyID0gTlVMTDsKKyNlbmRpZgorCisKKyNpZmRlZiBfX2xpbnV4X18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBpbnQgZmQ7CitzdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgKnB0ciA9IE5VTEw7CisKKyAgLyogT3BlbiBkcml2ZXIgKi8KKyAgZmQgPSBvcGVuKCIvZGV2L3NyYW0iLCAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgeworICAgIHByaW50ZigiVW5hYmxlIHRvIG9wZW4gL2Rldi9zcmFtLiBGYWxsYmFjayB0byBtYWxsb2NcbiIpOworICAgIC8qIFNpZ25hbCAibm8gc3JhbSBkcml2ZXIgYXQgdXNlIi4gKi8KKyAgICBmZCA9IC0xOworICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KKyAgICByZXR1cm4gRkRLYWFsbG9jKEtFUk5FTF9TUkFNX1NJWkUsIDgpOworICB9CisKKyAgLyogR2V0IG1lbW9yeSBtYXBwZWQgaW50byBDUFUgKHZpcnR1YWwpIGFkZHJlc3Mgc3BhY2UgKi8KKyAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKiltbWFwKE5VTEwsIEtFUk5FTF9TUkFNX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKHB0ciA9PSBNQVBfRkFJTEVEKQorICB7CisgICAgIHByaW50ZigiVW5hYmxlIHRvIG1tYXAoKS4gRmFsbGJhY2sgdG8gbWFsbG9jXG4iKTsKKyAgICAgLyogR2l2ZSB1cCBvbiB0aGUgc3JhbSBkcml2ZXIgKi8KKyAgICAgY2xvc2UoZmQpOworICAgICAvKiBTaWduYWwgIm5vIHNyYW0gZHJpdmVyIGF0IHVzZSIuICovCisgICAgIGZkID0gLTE7CisgICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KKyAgICAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKilGREthYWxsb2MoS0VSTkVMX1NSQU1fU0laRSwgOCk7CisgIH0KKworCisgIC8qIFJldHVybiBwb2ludGVyIHRvIHNyYW0gKi8KKyAgcmV0dXJuICh2b2lkKilwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlU3JhbSh2b2lkKiBwdHIpCit7CisgIC8qIENoZWNrIGlmIHNyYW0gZHJpdmVyIGlzIGJlaW5nIHVzZWQuICovCisgIGlmIChmZCA9PSAtMSkKKyAgeworICAgIEZES2FmcmVlKHB0cik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVW5tYXAgbWVtb3J5ICovCisgIG11bm1hcChwdHIsIEtFUk5FTF9TUkFNX1NJWkUpOworICAvKiBDbG9zZSBkcml2ZXIgKi8KKyAgY2xvc2UoZmQpOworCisgIHJldHVybjsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkICogZ2V0U3JhbSh2b2lkKQoreworICByZXR1cm4gRkRLYWFsbG9jKEtFUk5FTF9TUkFNX1NJWkUsIDgpOworfQorc3RhdGljIGlubGluZSB2b2lkICogZnJlZVNyYW0odm9pZCogcHRyKQoreworICBGREthZnJlZShwdHIpOworfQorCisjZW5kaWYKKworCisjaWZkZWYgRlVOQ1RJT05fRkRLcHJvbG9nCit2b2lkIEZES3Byb2xvZyh2b2lkKQoreworICAgdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyKilnZXRTcmFtKCk7CisKKworICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgIHsKKyAgICAgcHJpbnRmKCJTUkFNIGFsbG9jYXRpb24gZmFpbGVkICEgVGhpcyBpcyBmYXRhbC5cbiIpOworICAgICBleGl0KC0xKTsKKyAgIH0KKworI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKKyAgIF9fc2NyYXRjaEJ1ZmZlciA9IChJTlQqKSAoIGFkZHIgKyAoS0VSTkVMX1NSQU1fU0laRS1LRVJORUxfU0NSQVRDSF9TSVpFKSApOworICAgX19wU2NyYXRjaEJ1ZmZlciA9IGFkZHIgKyAoS0VSTkVMX1NSQU1fU0laRSk7CisjZW5kaWYKKworICAgcHJpbnRmKCJTUkFNIEAgMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSBhZGRyKTsKKyAgIGF0ZXhpdChGREtlcGlsb2cpOworCisgICBGREtwcm9sb2dfZ2VuZXJpYygpOworfQorI2VuZGlmCisKKyNpZmRlZiBGVU5DVElPTl9GREtlcGlsb2cKK3ZvaWQgRkRLZXBpbG9nKHZvaWQpCit7CisgICAvKiBCZWNhdXNlIG9mIGF0ZXhpdCgpLCBtYWtlIHN1cmUgdG8gY2FsbCB0aGlzIG9ubHkgb25jZSAqLworICAgaWYgKEwxX0RBVEFfQSAhPSBOVUxMKQorICAgeworICAgICBmcmVlU3JhbShMMV9EQVRBX0EpOworICAgICBMMV9EQVRBX0EgPSBOVUxMOworCisgICAgIEZES2VwaWxvZ19nZW5lcmljKCk7CisgICB9Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtFUk5FTF9TUkFNID4gMCAqLworCisjZW5kaWYgLyogaWZkZWYgX19hcm1fXyAqLworCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL3NyYy9saW51eC91YXJ0X2xpbnV4LmNwcCBiL2FhYy9saWJTWVMvc3JjL2xpbnV4L3VhcnRfbGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTU2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9saW51eC91YXJ0X2xpbnV4LmNwcApAQCAtMCwwICsxLDkwIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcjogTWFudWVsIEphbmRlcgorICAgRGVzY3JpcHRpb246IFVBUlQgc3VwcG9ydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2FhYy9saWJTWVMvc3JjL21pcHMvZ2VuZXJpY1N0ZHNfbWlwcy5jcHAgYi9hYWMvbGliU1lTL3NyYy9taXBzL2dlbmVyaWNTdGRzX21pcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGVjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hYWMvbGliU1lTL3NyYy9taXBzL2dlbmVyaWNTdGRzX21pcHMuY3BwCkBAIC0wLDAgKzEsMjkyIEBACisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKK3RoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAorYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQoraW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKK29mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCittYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCitpbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCit0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQordGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAorYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAorYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKK3BheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCitZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCithbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQorIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCisiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKK0FSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCityZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAorYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcworb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCitvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKK2FkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKKyNkZWZpbmUgRlVOQ1RJT05fRkRLcHJvbG9nCisjZGVmaW5lIEZVTkNUSU9OX0ZES2VwaWxvZworCisjZGVmaW5lIE1JUFNfVklSVFVBTF9TVEFSVCAgKDB4ODAwMDAwMDApCisvKiB2YWx1ZSBiZWxvdyBpcyBkZWZpbmVkIGluIHNpbXVsYXRvciBjb25maWcgKE1pcHNNZW1JbnRmLXsyNEtFLDRLRX0uY2ZnKSAqLworI2RlZmluZSBNSVBTX1NERV9TQ1JBVENIUEFEICgweDAwMDU4MDAwKQorCisvLyNkZWZpbmUgTUlQU19TUkFNX1NJWkUgICgzMjc2OCkKKyNkZWZpbmUgTUlQU19TUkFNX1NJWkUgICg0MDk2KQorCisjZGVmaW5lIE1JUFNfU0NSQVRDSF9TSVpFICg0MDk2KQorI2RlZmluZSBEQVRBX0wxX0FfU0laRSAoTUlQU19TUkFNX1NJWkUtTUlQU19TQ1JBVENIX1NJWkUpCisKKworCisKKyNpZmRlZiBSRVNPVVJDRV9zY3JhdGNoQnVmZmVyCisjZGVmaW5lIEZES19TQ1JBVENIQlVGX1NJWkUgMTAyNAorc3RhdGljIExPTkcgKl9fX3NjcmF0Y2hCdWZmZXIgPSBOVUxMOworc3RhdGljIExPTkcgKl9fc2NyYXRjaEJ1ZmZlciA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqX19wU2NyYXRjaEJ1ZmZlciA9IE5VTEw7CisjZW5kaWYKKworCisjaWZkZWYgX19saW51eF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgaW50IGZkOworc3RhdGljIGlubGluZSB2b2lkICogZ2V0U3JhbSh2b2lkKQoreworICB1bnNpZ25lZCBsb25nICpwdHIgPSBOVUxMOworCisgIC8qIE9wZW4gZHJpdmVyICovCisgIGZkID0gb3BlbigiL2Rldi9zcmFtIiwgMCk7CisgIGlmIChmZCA8IDApCisgIHsKKyAgICBwcmludGYoIlVuYWJsZSB0byBhY2Nlc3Mgc3JhbS4gRmFsbGJhY2sgdG8gbWFsbG9jXG4iKTsKKyAgICAvKiBTaWduYWwgIm5vIHNyYW0gZHJpdmVyIGF0IHVzZSIuICovCisgICAgZmQgPSAtMTsKKyAgICAvKiBSZXR1cm4gbWFsbG9jZWQgcG9pbnRlciAoZmFsbGJhY2spICovCisgICAgcmV0dXJuIG1hbGxvYyhNSVBTX1NSQU1fU0laRSk7CisgIH0KKworICAvKiBHZXQgbWVtb3J5IG1hcHBlZCBpbnRvIENQVSAodmlydHVhbCkgYWRkcmVzcyBzcGFjZSAqLworICBwdHIgPSAodW5zaWduZWQgbG9uZyAqKW1tYXAoTlVMTCwgTUlQU19TUkFNX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKHB0ciA9PSBNQVBfRkFJTEVEKQorICB7CisgICAgIHByaW50ZigiVW5hYmxlIHRvIGFjY2VzcyBzcmFtLiBGYWxsYmFjayB0byBtYWxsb2NcbiIpOworICAgICAvKiBHaXZlIHVwIG9uIHRoZSBzcmFtIGRyaXZlciAqLworICAgICBjbG9zZShmZCk7CisgICAgIC8qIFNpZ25hbCAibm8gc3JhbSBkcml2ZXIgYXQgdXNlIi4gKi8KKyAgICAgZmQgPSAtMTsKKyAgICAgLyogUmV0dXJuIG1hbGxvY2VkIHBvaW50ZXIgKGZhbGxiYWNrKSAqLworICAgICBwdHIgPSAodW5zaWduZWQgbG9uZyAqKW1hbGxvYyhNSVBTX1NSQU1fU0laRSk7CisgIH0KKworCisgIC8qIFJldHVybiBwb2ludGVyIHRvIHNyYW0gKi8KKyAgcmV0dXJuICh2b2lkKilwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlU3JhbSh2b2lkKiBwdHIpCit7CisgIC8qIENoZWNrIGlmIHNyYW0gZHJpdmVyIGlzIGJlaW5nIHVzZWQuICovCisgIGlmIChmZCA9PSAtMSkKKyAgeworICAgIGZyZWUocHRyKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBVbm1hcCBtZW1vcnkgKi8KKyAgbXVubWFwKHB0ciwgTUlQU19TUkFNX1NJWkUpOworICAvKiBDbG9zZSBkcml2ZXIgKi8KKyAgY2xvc2UoZmQpOworCisgIHJldHVybjsKK30KKworI2VsaWYgZGVmaW5lZChfX1NERV9NSVBTX18pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1pcHMvY3B1Lmg+CisKK3N0YXRpYyBpbnQgaGFzSVNQUkFNLCBoYXNEU1BSQU07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGdldFNyYW0odm9pZCkKK3sKKyAgdm9pZCAqYWRkcjsKKyAgdW5zaWduZWQgaW50IENvbmZpZzsKKworICBDb25maWcgPSBtaXBzX2dldGNvbmZpZygpOworICBoYXNJU1BSQU0gPSAoQ29uZmlnID4+IDI0KSAmIDE7CisgIGhhc0RTUFJBTSA9IChDb25maWcgPj4gMjMpICYgMTsKKworICBGREtwcmludGYoIkNvbmZpZyBJU1AvRFNQOiAlZC8lZFxuIiwgaGFzSVNQUkFNLCBoYXNEU1BSQU0pOworCisgIGlmIChoYXNEU1BSQU0pIHsKKyAgICBsb25nIHBhZGRyLCBsYWRkcjsKKworICAgIEZES3ByaW50Zigid3JvbmdcbiIpOworICAgIHBhZGRyID0gTUlQU19TREVfU0NSQVRDSFBBRDsKKyAgICAvKiBGaXhlZCBtYXBwaW5nIG9mIGtzZWcwOiAweDgwMDAwMDAwLTB4OWZmZmZmZmYgdmlydHVhbCA9PiAweDAwMDAwMDAwLTB4MWZmZmZmZmYgcGh5c2ljYWwgKi8KKyAgICBsYWRkciA9IE1JUFNfVklSVFVBTF9TVEFSVCArIE1JUFNfU0RFX1NDUkFUQ0hQQUQ7CisgICAgYWRkciA9ICh2b2lkKikobGFkZHIpOworICB9IGVsc2UgeworICAgIEZES3ByaW50Zigib2tcbiIpOworICAgIGFkZHIgPSBtYWxsb2MoTUlQU19TUkFNX1NJWkUpOworICAgIEZES3ByaW50ZigiYWRkciAlZFxuIiwgKGludClhZGRyKTsKKyAgfQorICByZXR1cm4gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlU3JhbSh2b2lkKiBwdHIpCit7CisgIGlmICghaGFzRFNQUkFNKSB7CisgICAgZnJlZShwdHIpOworICB9Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGdldFNyYW0odm9pZCkKK3sKKyAgcmV0dXJuIG1hbGxvYyhNSVBTX1NSQU1fU0laRSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZVNyYW0odm9pZCogcHRyKQoreworICBmcmVlKHB0cik7Cit9CisKKyNlbmRpZgorCisKKyNpZmRlZiBGVU5DVElPTl9GREtwcm9sb2cKK3ZvaWQgRkRLcHJvbG9nKHZvaWQpCit7CisgICB1bnNpZ25lZCBjaGFyICphZGRyOworCisjaWZkZWYgX01JUFNfQVJDSF9NSVBTMzJSMgorICAgdW5zaWduZWQgc3RhdHVzOworICAgYXNtIHZvbGF0aWxlKCJtZmMwICUwLCAkMTIsIDA7XG4iIDogIj1yIiAoc3RhdHVzKSk7CisgICBzdGF0dXMgfD0gKDEgPDwgMjQpOworICAgYXNtIHZvbGF0aWxlKCJtdGMwICUwLCAkMTIsIDA7XG4iIDo6ICJyIiAoc3RhdHVzKSk7CisjZW5kaWYKKworICAgYWRkciA9ICh1bnNpZ25lZCBjaGFyKilnZXRTcmFtKCk7CisgICBpZiAoYWRkciA9PSBOVUxMKSB7CisgICAgIEZES3ByaW50ZkVycigiU1JBTSBhbGxvY2F0aW9uIGZhaWxlZCAhIFRoaXMgaXMgZmF0YWwuXG4iKTsKKyAgICAgZXhpdCgtMSk7CisgICB9IGVsc2UgeworICAgICBGREtwcmludGYoIlNSQU0gQCAweCUwOHgsIHNpemUgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KSBhZGRyLCBNSVBTX1NSQU1fU0laRSk7CisgICB9CisKKworI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKKyAgIF9fX3NjcmF0Y2hCdWZmZXIgPSAoTE9ORyopKGFkZHIgKyBNSVBTX1NSQU1fU0laRSAtIE1JUFNfU0NSQVRDSF9TSVpFKTsKKyNlbmRpZgorCisgICBhdGV4aXQoRkRLZXBpbG9nKTsKKworICAgRkRLcHJvbG9nX2dlbmVyaWMoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgRlVOQ1RJT05fRkRLZXBpbG9nCit2b2lkIEZES2VwaWxvZyh2b2lkKQoreworCisjaWZkZWYgX01JUFNfQVJDSF9NSVBTMzJSMgorICAgdW5zaWduZWQgc3RhdHVzOworICAgYXNtIHZvbGF0aWxlKCJtZmMwICUwLCAkMTIsIDA7XG4iIDogIj1yIiAoc3RhdHVzKSk7CisgICAgICAgICAgIHN0YXR1cyAmPSB+KDEgPDwgMjQpOworICAgYXNtIHZvbGF0aWxlKCJtdGMwICUwLCAkMTIsIDA7XG4iIDo6ICJyIiAoc3RhdHVzKSk7CisjZW5kaWYKKworICAgRkRLZXBpbG9nX2dlbmVyaWMoKTsKK30KKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChfX2xpbnV4X18pCisKKyNkZWZpbmUgRlVOQ1RJT05fRkRLY2xvY2sKKworI2lmbmRlZiBNSVBTX0NQVV9DTEsKKyNkZWZpbmUgTUlQU19DUFVfQ0xLIDEwMDAwMDAwMAorI2VuZGlmCisKK0lOVCBGREtjbG9jayh2b2lkKSB7CisgIElOVCBjbGs7CisKKyAgYXNtIHZvbGF0aWxlICgibWZjMCAlMCwkOSAiIDogIj1yIiAoY2xrKSk7CisgIHJldHVybiBjbGs7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfX2xpbnV4X18pICovCmRpZmYgLS1naXQgYS9hYWMvbGliU1lTL3NyYy93YXZfZmlsZS5jcHAgYi9hYWMvbGliU1lTL3NyYy93YXZfZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiY2ZhYQotLS0gL2Rldi9udWxsCisrKyBiL2FhYy9saWJTWVMvc3JjL3dhdl9maWxlLmNwcApAQCAtMCwwICsxLDU2MCBAQAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCit0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKK2F1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKK2luZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0CitvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQorbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycworaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAordGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKK3RoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYworc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKK2FyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKK2FwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CitwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKK3Byb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgorWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0CitwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQorYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KKyJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQorIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCitBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAorcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKK2J5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKKyJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKK29mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAorb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCithZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgRXJpYyBBbGxhbWFuY2hlCisgICBEZXNjcmlwdGlvbjogYSBydWRpbWVudGFyeSB3YXYgZmlsZSBpbnRlcmZhY2UKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2luY2x1ZGUgIndhdl9maWxlLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworCitzdGF0aWMgSU5UX1BDTSB1bGF3MnBjbSAoVUNIQVIgdWxhd2J5dGUpOworCisvKiEKKyAqCisgKiAgXGJyaWVmIFJlYWQgaGVhZGVyIGZyb20gYSBXQVZFZmlsZS4gSG9zdCBlbmRpYW5lc3MgaXMgaGFuZGxlZCBhY2NvcmRpbmdseS4KKyAqICBcd2F2LT5mcCBmaWxlcG9pbnRlciBvZiB0eXBlIEZJTEUqLgorICogIFx3YXZpbmZvIFNXYXZJbmZvIHN0cnVjdCB3aGVyZSB0aGUgZGVjb2RlZCBoZWFkZXIgaW5mbyBpcyBzdG9yZWQgaW50by4KKyAqICBccmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqCisgKi8KK0lOVCBXQVZfSW5wdXRPcGVuIChIQU5ETEVfV0FWICpwV2F2LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBIQU5ETEVfV0FWIHdhdiA9IChIQU5ETEVfV0FWKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IFdBVikpOworICAgIElOVCBvZmZzZXQ7CisKKyAgICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBVbmFibGUgdG8gYWxsb2NhdGUgV0FWIHN0cnVjdC5cbiIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB3YXYtPmZwID0gRkRLZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgIGlmICh3YXYtPmZwID09IE5VTEwpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBVbmFibGUgdG8gb3BlbiB3YXYgZmlsZS4gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogcmVhZCBSSUZGLWNodW5rICovCisgICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIucmlmZlR5cGUpLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7CisgICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogY291bGRuJ3QgcmVhZCBSSUZGX0lEXG4iKTsKKyAgICAgIGdvdG8gZXJyb3I7ICAvKiBiYWQgZXJyb3IgImNvdWxkbid0IHJlYWQgUklGRl9JRCIgKi8KKyAgICB9CisgICAgaWYgKEZES3N0cm5jbXAoIlJJRkYiLCB3YXYtPmhlYWRlci5yaWZmVHlwZSwgNCkpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBSSUZGIGRlc2NyaXB0b3Igbm90IGZvdW5kLlxuIikgOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZWFkIFJJRkYgc2l6ZS4gSWdub3JlZC4gKi8KKyAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLnJpZmZTaXplKSwgNCwgMSwgd2F2LT5mcCk7CisKKyAgICAvKiByZWFkIFdBVkUtY2h1bmsgKi8KKyAgICBpZiAoRkRLZnJlYWQoJndhdi0+aGVhZGVyLndhdmVUeXBlLCAxLCA0LCB3YXYtPmZwKSAhPTQpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBjb3VsZG4ndCByZWFkIGZvcm1hdFxuIik7CisgICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIGZvcm1hdCIgKi8KKyAgICB9CisgICAgaWYgKEZES3N0cm5jbXAoIldBVkUiLCB3YXYtPmhlYWRlci53YXZlVHlwZSwgNCkpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBXQVZFIGNodW5rIElEIG5vdCBmb3VuZC5cbiIpIDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogcmVhZCBmb3JtYXQtY2h1bmsgKi8KKyAgICBpZiAoRkRLZnJlYWQoJih3YXYtPmhlYWRlci5mb3JtYXRUeXBlKSwgMSwgNCwgd2F2LT5mcCkgIT0gNCkgeworICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGNvdWxkbid0IHJlYWQgZm9ybWF0X0lEXG4iKTsKKyAgICAgIGdvdG8gZXJyb3I7ICAvKiBiYWQgZXJyb3IgImNvdWxkbid0IHJlYWQgZm9ybWF0X0lEIiAqLworICAgIH0KKyAgICBpZiAoRkRLc3RybmNtcCgiZm10Iiwgd2F2LT5oZWFkZXIuZm9ybWF0VHlwZSwgMykpIHsKKyAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBmbXQgY2h1bmsgZm9ybWF0IG5vdCBmb3VuZC5cbiIpIDsKKyAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKworICAgIEZES2ZyZWFkX0VMKCZ3YXYtPmhlYWRlci5mb3JtYXRTaXplLCA0LCAxLCB3YXYtPmZwKTsgICAvKiBzaG91bGQgYmUgMTYgZm9yIFBDTS1mb3JtYXQgKHVuY29tcHJlc3NlZCkgKi8KKworCisgICAgLyogcmVhZCAgaW5mbyAqLworICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlKSwgMiwgMSwgd2F2LT5mcCk7CisgICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5udW1DaGFubmVscyksIDIsIDEsIHdhdi0+ZnApOworICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSksIDQsIDEsIHdhdi0+ZnApOworICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuYnl0ZXNQZXJTZWNvbmQpLCA0LCAxLCB3YXYtPmZwKTsKKyAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmJsb2NrQWxpZ24pLCAyLCAxLCB3YXYtPmZwKTsKKyAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpLCAyLCAxLCB3YXYtPmZwKTsKKworICAgIG9mZnNldCA9IHdhdi0+aGVhZGVyLmZvcm1hdFNpemUgLSAxNjsKKworICAgIC8qIFdhdmUgZm9ybWF0IGV4dGVuc2libGUgKi8KKyAgICBpZiAod2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlID09IDB4RkZGRSkgeworICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIGd1aWRQQ01bMTZdID0geworICAgICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsCisgICAgICAgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHhhYSwgMHgwMCwgMHgzOCwgMHg5YiwgMHg3MQorICAgICAgfTsKKyAgICAgIFVTSE9SVCBleHRyYUZvcm1hdEJ5dGVzLCB2YWxpZEJpdHNQZXJTYW1wbGU7CisgICAgICBVQ0hBUiBndWlkWzE2XTsKKyAgICAgIElOVCBpOworCisgICAgICAvKiByZWFkIGV4dHJhIGJ5dGVzICovCisgICAgICBGREtmcmVhZF9FTCgmKGV4dHJhRm9ybWF0Qnl0ZXMpLCAyLCAxLCB3YXYtPmZwKTsKKyAgICAgIG9mZnNldCAtPSAyOworCisgICAgICBpZiAoZXh0cmFGb3JtYXRCeXRlcyA+PSAyMikgeworICAgICAgICBGREtmcmVhZF9FTCgmKHZhbGlkQml0c1BlclNhbXBsZSksIDIsIDEsIHdhdi0+ZnApOworICAgICAgICBGREtmcmVhZF9FTCgmKHdhdi0+Y2hhbm5lbE1hc2spLCA0LCAxLCB3YXYtPmZwKTsKKyAgICAgICAgRkRLZnJlYWRfRUwoJihndWlkKSwgMTYsIDEsIHdhdi0+ZnApOworCisgICAgICAgIC8qIGNoZWNrIGZvciBQQ00gR1VJRCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgaWYgKGd1aWRbaV0gIT0gZ3VpZFBDTVtpXSkgYnJlYWs7CisgICAgICAgIGlmIChpID09IDE2KSB3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUgPSAweDAxOworCisgICAgICAgIG9mZnNldCAtPSAyMjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTa2lwIHJlc3Qgb2YgZm10IGhlYWRlciBpZiBhbnkuICovCisgICAgZm9yICg7b2Zmc2V0ID4gMDsgb2Zmc2V0LS0pIHsKKyAgICAgIEZES2ZyZWFkKCZ3YXYtPmhlYWRlci5mb3JtYXRTaXplLCAxLCAxLCB3YXYtPmZwKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAvKiBSZWFkIGRhdGEgY2h1bmsgSUQgKi8KKyAgICAgIGlmIChGREtmcmVhZCh3YXYtPmhlYWRlci5kYXRhVHlwZSwgMSwgNCwgd2F2LT5mcCkgIT0gNCkgeworICAgICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogVW5hYmxlIHRvIHJlYWQgZGF0YSBjaHVuayBJRC5cbiIpOworICAgICAgICBGREtmcmVlKHdhdik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisKKyAgICAgIC8qIFJlYWQgY2h1bmsgbGVuZ3RoLiAqLworICAgICAgRkRLZnJlYWRfRUwoJm9mZnNldCwgNCwgMSwgd2F2LT5mcCk7CisKKyAgICAgIC8qIENoZWNrIGZvciBkYXRhIGNodW5rIHNpZ25hdHVyZS4gKi8KKyAgICAgIGlmIChGREtzdHJuY21wKCJkYXRhIiwgd2F2LT5oZWFkZXIuZGF0YVR5cGUsIDQpID09IDApIHsKKyAgICAgICAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogSnVtcCBvdmVyIG5vbiBkYXRhIGNodW5rLiAqLworICAgICAgZm9yICg7b2Zmc2V0ID4gMDsgb2Zmc2V0LS0pIHsKKyAgICAgICAgRkRLZnJlYWQoJih3YXYtPmhlYWRlci5kYXRhU2l6ZSksIDEsIDEsIHdhdi0+ZnApOworICAgICAgfQorICAgIH0gd2hpbGUgKCFGREtmZW9mKHdhdi0+ZnApKTsKKworICAgIC8qIHJldHVybiBzdWNjZXNzICovCisgICAgKnBXYXYgPSB3YXY7CisgICAgcmV0dXJuIDA7CisKKyAgICAvKiBFcnJvciBwYXRoICovCitlcnJvcjoKKworICAgIGlmICh3YXYpIHsKKyAgICAgIGlmICh3YXYtPmZwKSB7CisgICAgICAgIEZES2ZjbG9zZSh3YXYtPmZwKTsKKyAgICAgICAgd2F2LT5mcCA9IE5VTEw7CisgICAgICB9CisgICAgICBGREtmcmVlKHdhdik7CisgICAgfQorCisgICAgKnBXYXYgPSBOVUxMOworCisgICAgcmV0dXJuIC0xOworfQorCisvKiEKKyAqCisgKiAgXGJyaWVmIFJlYWQgc2FtcGxlcyBmcm9tIGEgV0FWRWZpbGUuIFRoZSBzYW1wbGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlb3JkZXIgdG8gdGhlIG5hdGl2ZQorICogICAgaG9zdCBlbmRpYW5lc3MgYW5kIHNjYWxlZCB0byBmdWxsIHNjYWxlIG9mIHRoZSBJTlRfUENNIHR5cGUsIGZyb20gd2hhdGV2ZXIgYnBzIHRoZSBXQVZFZmlsZQorICogICAgaGFkIHNwZWNpZmllZCBpbiBpdHMgaGFhZGVyIGRhdGEuCisgKgorICogIFx3YXYgSEFORExFX1dBViBvZiB0aGUgd2F2IGZpbGUuCisgKiAgXGJ1ZmZlciBQb2ludGVyIHRvIHN0b3JlIHJlYWQgZGF0YS4KKyAqICBcbnVtU2FtcGxlcyBEZXNpcmVkIG51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQuCisgKiAgXG5CaXRzIHNhbXBsZSBzaXplIGluIGJpdHMgdG8gYmUgdXNlZCBmb3IgdGhlIGJ1ZmZlcgorICoKKyAqICBccmV0dXJuIE51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHJlYWQuCisgKgorICovCisKK0lOVCBXQVZfSW5wdXRSZWFkIChIQU5ETEVfV0FWIHdhdiwgdm9pZCAqYnVmZmVyLCBVSU5UIG51bVNhbXBsZXMsIGludCBuQml0cykKK3sKKyAgVUlOVCByZXN1bHQgPSAwIDsKKyAgVUlOVCBpOworICBTQ0hBUiAqYnB0ciA9IChTQ0hBUiopYnVmZmVyOworICBMT05HICAqbHB0ciA9IChMT05HKilidWZmZXI7CisgIFNIT1JUICpzcHRyID0gKFNIT1JUKilidWZmZXI7CisKKyAgc3dpdGNoICh3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUpCisgIHsKKyAgICBjYXNlIDB4MDE6ICAvKiBQQ00gdW5jb21wcmVzc2VkICovCisgICAgICBpZiAobkJpdHMgPT0gd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSkgeworICAgICAgICByZXN1bHQgPSBGREtmcmVhZF9FTChidWZmZXIsIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPj4gMywgbnVtU2FtcGxlcywgd2F2LT5mcCkgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpPTA7IGk8bnVtU2FtcGxlczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgTE9ORyB0bXAgPSAwOworICAgICAgICAgIHJlc3VsdCArPSBGREtmcmVhZF9FTCgmdG1wLCB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlID4+IDMsIDEsIHdhdi0+ZnApIDsKKworICAgICAgICAgIC8qIE1vdmUgcmVhZCBiaXRzIHRvIGxvd2VyIGJpdHMgb2YgTE9ORy4gKi8KKyAgICAgICAgICBpZiAoICFJU19MSVRUTEVfRU5ESUFOKCkgJiYgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSAhPSAyNCAmJiB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlIDwgMzIpIHsKKyAgICAgICAgICAgIHRtcCA+Pj0gKDMyLXdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEZ1bGwgc2NhbGUgKi8KKyAgICAgICAgICBpZiAod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA+IG5CaXRzKQorICAgICAgICAgICAgdG1wID4+PSAod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZS1uQml0cyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG1wIDw8PSAobkJpdHMtd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICBpZiAobkJpdHMgPT0gOCkKKyAgICAgICAgICAgICpicHRyKysgPSAoU0NIQVIpIHRtcDsKKyAgICAgICAgICBpZiAobkJpdHMgPT0gMTYpCisgICAgICAgICAgICAqc3B0cisrID0gKFNIT1JUKSB0bXA7CisgICAgICAgICAgaWYgKG5CaXRzID09IDMyKQorICAgICAgICAgICAgKmxwdHIrKyA9IChMT05HKSB0bXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDA3OiAgLyogdS1MYXcgY29tcHJlc3Npb24gKi8KKyAgICAgIGZvciAoaT0wOyBpPG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICByZXN1bHQgKz0gRkRLZnJlYWQoJihicHRyW2k8PDFdKSwgMSwgMSwgd2F2LT5mcCkgOworICAgICAgICBzcHRyW2ldID0gdWxhdzJwY20oYnB0cltpPDwxXSkgOworICAgICAgfQorICAgICAgYnJlYWsgOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZES3ByaW50ZigiV0FWX0lucHV0UmVhZCgpOiB1bnN1cHBvcnRlZCBkYXRhLWNvbXByZXNzaW9uISEiKSA7CisgICAgICBicmVhayA7CisgIH0KKyAgcmV0dXJuIHJlc3VsdCA7Cit9CisKK3ZvaWQgV0FWX0lucHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdikKK3sKKyAgSEFORExFX1dBViB3YXYgPSAqcFdhdjsKKworICBpZiAod2F2ICE9IE5VTEwpIHsKKyAgICBpZiAod2F2LT5mcCAhPSBOVUxMKSB7CisgICAgICAgRkRLZmNsb3NlKHdhdi0+ZnApOworICAgICAgIHdhdi0+ZnAgPSBOVUxMOworICAgIH0KKyAgICBpZiAod2F2KSB7CisgICAgICAgRkRLZnJlZSh3YXYpOworICAgIH0KKyAgfQorICAqcFdhdiA9IE5VTEw7Cit9CisKKy8qIGNvbnZlcnNpb24gb2YgdS1sYXcgdG8gbGluZWFyIGNvZGluZyAqLworc3RhdGljIElOVF9QQ00gdWxhdzJwY20gKFVDSEFSIHVsYXdieXRlKQoreworICBzdGF0aWMgY29uc3QgSU5UIGV4cF9sdXRbOF0gPSB7IDAsIDEzMiwgMzk2LCA5MjQsIDE5ODAsIDQwOTIsIDgzMTYsIDE2NzY0IH0gOworICBJTlQgc2lnbiwgZXhwb25lbnQsIG1hbnRpc3NhLCBzYW1wbGUgOworCisgIHVsYXdieXRlID0gKFVDSEFSKX51bGF3Ynl0ZSA7CisgIHNpZ24gPSAodWxhd2J5dGUgJiAweDgwKSA7CisgIGV4cG9uZW50ID0gKHVsYXdieXRlID4+IDQpICYgMHgwNyA7CisgIG1hbnRpc3NhID0gdWxhd2J5dGUgJiAweDBGIDsKKworICBzYW1wbGUgPSBleHBfbHV0W2V4cG9uZW50XSArIChtYW50aXNzYSA8PCAoZXhwb25lbnQgKyAzKSkgOworICBpZiAoc2lnbiAhPSAwKQorICAgIHNhbXBsZSA9IC1zYW1wbGUgOworCisgIHJldHVybiAoSU5UX1BDTSlzYW1wbGUgOworfQorCisvKioqKioqKioqKioqKiogV3JpdGVyICoqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgVUlOVCBMaXR0bGVFbmRpYW4zMihVSU5UIHYpCit7CisgICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkKKyAgICAgICAgcmV0dXJuIHYgOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICh2ICYgMHgwMDAwMDBGRikgPDwgMjQgfCAodiAmIDB4MDAwMEZGMDApIDw8ICA4IHwgKHYgJiAweDAwRkYwMDAwKSA+PiAgOCB8ICh2ICYgMHhGRjAwMDAwMCkgPj4gMjQ7Cit9CisKK3N0YXRpYyBTSE9SVCBMaXR0bGVFbmRpYW4xNihTSE9SVCB2KQoreworICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpCisgICAgICAgIHJldHVybiB2OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChTSE9SVCkoKCh2IDw8IDgpICYgMHhGRjAwKSB8ICgodiA+PiA4KSAmIDB4MDBGRikpOworfQorCitzdGF0aWMgVVNIT1JUIFVucGFjayhVU0hPUlQgdikKK3sKKyAgICBpZiAoSVNfTElUVExFX0VORElBTigpKQorICAgICAgcmV0dXJuIHY7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChTSE9SVCkoKCh2IDw8IDgpICYgMHhGRjAwKSB8ICgodiA+PiA4KSAmIDB4MDBGRikpOworfQorCisvKioKKyAqIFdBVl9PdXRwdXRPcGVuCisgKiBcYnJpZWYgT3BlbiBXQVYgb3V0cHV0L3dyaXRlciBoYW5kbGUKKyAqIFxwYXJhbSBwV2F2IHBvaW50ZXIgdG8gV0FWIGhhbmRsZSB0byBiZSByZXR1cm5lZAorICogXHBhcmFtIHNhbXBsZVJhdGUgZGVzaXJlZCBzYW1wbGVyYXRlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKKyAqIFxwYXJhbSBudW1DaGFubmVscyBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCisgKiBccGFyYW0gYml0c1BlclNhbXBsZSBkZXNpcmVkIG51bWJlciBvZiBiaXRzIHBlciBhdWRpbyBzYW1wbGUgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZQorICoKKyAqIFxyZXR1cm4gdmFsdWU6ICAgMDogb2sKKyAqICAgICAgICAgICAgICAgICAtMTogZXJyb3IKKyAqLworSU5UIFdBVl9PdXRwdXRPcGVuKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKm91dHB1dEZpbGVuYW1lLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIG51bUNoYW5uZWxzLCBJTlQgYml0c1BlclNhbXBsZSkKK3sKKyAgSEFORExFX1dBViB3YXYgPSAoSEFORExFX1dBVilGREtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBXQVYpKTsKKyAgVUlOVCBzaXplID0gMDsKKworICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBXQVYgc3RydWN0LlxuIik7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKGJpdHNQZXJTYW1wbGUgIT0gMTYgJiYgYml0c1BlclNhbXBsZSAhPSAyNCAmJiBiaXRzUGVyU2FtcGxlICE9IDMyKQorICB7CisgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IEludmFsaWQgYXJndW1lbnQgKGJpdHNQZXJTYW1wbGUpLlxuIik7CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworICB3YXYtPmZwID0gRkRLZm9wZW4ob3V0cHV0RmlsZW5hbWUsICJ3YiIpOworICBpZiAod2F2LT5mcCA9PSBOVUxMKQorICB7CisgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IHVuYWJsZSB0byBjcmVhdGUgZmlsZSAlc1xuIiwgb3V0cHV0RmlsZW5hbWUpOworICAgICAgZ290byBiYWlsOworICB9CisKKyAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLnJpZmZUeXBlLCAiUklGRiIpOworICB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IExpdHRsZUVuZGlhbjMyKDB4N2ZmZmZmZmYpOyAgLyogaW4gY2FzZSBmc2VlaygpIGRvZXNuJ3Qgd29yayBsYXRlciBpbiBXQVZfT3V0cHV0Q2xvc2UoKSAqLworICBGREtzdHJjcHkod2F2LT5oZWFkZXIud2F2ZVR5cGUsICJXQVZFIik7CisKKyAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLmZvcm1hdFR5cGUsICJmbXQgIik7CisgIHdhdi0+aGVhZGVyLmZvcm1hdFNpemUgPSBMaXR0bGVFbmRpYW4zMigxNik7CisKKyAgd2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlID0gTGl0dGxlRW5kaWFuMTYoMHgwMSk7CisgIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgICA9IExpdHRsZUVuZGlhbjE2KChTSE9SVCliaXRzUGVyU2FtcGxlKTsKKyAgd2F2LT5oZWFkZXIubnVtQ2hhbm5lbHMgICAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKW51bUNoYW5uZWxzKTsKKyAgd2F2LT5oZWFkZXIuYmxvY2tBbGlnbiAgICAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKShudW1DaGFubmVscyAqIChiaXRzUGVyU2FtcGxlID4+IDMpKSk7CisgIHdhdi0+aGVhZGVyLnNhbXBsZVJhdGUgICAgICA9IExpdHRsZUVuZGlhbjMyKHNhbXBsZVJhdGUpOworICB3YXYtPmhlYWRlci5ieXRlc1BlclNlY29uZCAgPSBMaXR0bGVFbmRpYW4zMihzYW1wbGVSYXRlICogd2F2LT5oZWFkZXIuYmxvY2tBbGlnbik7CisgIEZES3N0cmNweSh3YXYtPmhlYWRlci5kYXRhVHlwZSwgImRhdGEiKTsKKyAgd2F2LT5oZWFkZXIuZGF0YVNpemUgICAgICAgID0gTGl0dGxlRW5kaWFuMzIoMHg3ZmZmZmZmZiAtIDM2KTsKKworCisgIHNpemUgPSBzaXplb2YoV0FWX0hFQURFUik7CisgIGlmIChGREtmd3JpdGUoJndhdi0+aGVhZGVyLCAxLCBzaXplLCB3YXYtPmZwKSAhPSBzaXplKQorICB7CisgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IGVycm9yIHdyaXRpbmcgdG8gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGVuYW1lKTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgfQorCisKKyAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IDA7CisKKyAgKnBXYXYgPSB3YXY7CisKKyAgcmV0dXJuIDA7CisKK2JhaWw6CisgIGlmICh3YXYpIHsKKyAgICBpZiAod2F2LT5mcCkgeworICAgICAgRkRLZmNsb3NlKHdhdi0+ZnApOworICAgIH0KKyAgICBGREtmcmVlKHdhdik7CisgIH0KKworICBwV2F2ID0gTlVMTDsKKworICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBXQVZfT3V0cHV0V3JpdGUKKyAqIFxicmllZiBXcml0ZSBkYXRhIHRvIFdBViBmaWxlIGFzb2NpYXRlZCB0byBXQVYgaGFuZGxlCisgKgorICogXHBhcmFtIHdhdiBoYW5kbGUgb2Ygd2F2ZSBmaWxlCisgKiBccGFyYW0gc2FtcGxlQnVmZmVyIHBvaW50ZXIgdG8gYXVkaW8gc2FtcGxlcywgcmlnaHQganVzdGlmaWVkIGludGVnZXIgdmFsdWVzCisgKiBccGFyYW0gbkJ1ZkJpdHMgc2l6ZSBpbiBiaXRzIG9mIGVhY2ggYXVkaW8gc2FtcGxlIGluIHNhbXBsZUJ1ZmZlcgorICogXHBhcmFtIG5TaWdCaXRzIGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbkJ1ZkJpdHMgaW4gc2FtcGxlQnVmZmVyCisgKgorICogXHJldHVybiB2YWx1ZTogICAgMDogb2sKKyAqICAgICAgICAgICAgICAgICAgLTE6IGVycm9yCisgKi8KK0lOVCBXQVZfT3V0cHV0V3JpdGUoSEFORExFX1dBViB3YXYsIHZvaWQgKnNhbXBsZUJ1ZmZlciwgVUlOVCBudW1iZXJPZlNhbXBsZXMsIGludCBuQnVmQml0cywgaW50IG5TaWdCaXRzKQoreworICAgIFNDSEFSICpicHRyID0gKFNDSEFSKilzYW1wbGVCdWZmZXI7CisgICAgU0hPUlQgKnNwdHIgPSAoU0hPUlQqKXNhbXBsZUJ1ZmZlcjsKKyAgICBMT05HICAqbHB0ciA9IChMT05HKilzYW1wbGVCdWZmZXI7CisgICAgTE9ORyB0bXA7CisgICAgCisgICAgaW50IGJwcyA9IFVucGFjayh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKKyAgICBVSU5UIGk7CisKKyAgICAvKiBQYWNrIHNhbXBsZXMgaWYgcmVxdWlyZWQgKi8KKyAgICBpZiAoYnBzID09IG5CdWZCaXRzICYmIGJwcyA9PSBuU2lnQml0cykgeworICAgICAgaWYgKEZES2Z3cml0ZV9FTChzYW1wbGVCdWZmZXIsIChicHM+PjMpLCBudW1iZXJPZlNhbXBsZXMsIHdhdi0+ZnApICE9IG51bWJlck9mU2FtcGxlcykKKyAgICAgIHsKKyAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0V3JpdGUoKTogZXJyb3I6IHVuYWJsZSB0byB3cml0ZSB0byBmaWxlICVkXG4iLCB3YXYtPmZwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSAgeworICAgICAgZm9yIChpPTA7IGk8bnVtYmVyT2ZTYW1wbGVzOyBpKyspCisgICAgICB7CisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAobkJ1ZkJpdHMpIHsKKyAgICAgICAgICBjYXNlIDg6ICB0bXAgPSAqYnB0cisrOyBicmVhazsKKyAgICAgICAgICBjYXNlIDE2OiB0bXAgPSAqc3B0cisrOyBicmVhazsKKyAgICAgICAgICBjYXNlIDMyOiB0bXAgPSAqbHB0cisrOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgLyogQWRhcHQgc2FtcGxlIHNpemUgKi8KKyAgICAgICAgc2hpZnQgPSAobkJ1ZkJpdHMtblNpZ0JpdHMpLSgzMi1icHMpOworCisgICAgICAgIC8qIENvcnJlY3QgYWxpZ25tZW50IGRpZmZlcmVuY2UgYmV0d2VlbiAzMiBiaXQgZGF0YSBidWZmZXIgInRtcCIgYW5kIDI0IGJpdHMgdG8gYmUgd3JpdHRlbi4gKi8KKyAgICAgICAgaWYgKCAhSVNfTElUVExFX0VORElBTigpICYmIGJwcyA9PSAyNCkgeworICAgICAgICAgIHNoaWZ0ICs9IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hpZnQgPCAwKQorICAgICAgICAgIHRtcCA+Pj0gLXNoaWZ0OworICAgICAgICBlbHNlCisgICAgICAgICAgdG1wIDw8PSBzaGlmdDsKKworICAgICAgICAvKiBXcml0ZSBzYW1wbGUgKi8gICAgICAgIAorICAgICAgICByZXN1bHQ9RkRLZndyaXRlX0VMKCZ0bXAsIGJwcz4+MywgMSwgd2F2LT5mcCk7CisgICAgICAgIGlmIChyZXN1bHQgPD0gMCkgeworICAgICAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dFdyaXRlKCk6IGVycm9yOiB1bmFibGUgdG8gd3JpdGUgdG8gZmlsZSAlZFxuIiwgd2F2LT5mcCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgfSAKKworICAgIHdhdi0+aGVhZGVyLmRhdGFTaXplICs9IChudW1iZXJPZlNhbXBsZXMgKiAoYnBzPj4zKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBXQVZfT3V0cHV0Q2xvc2UKKyAqIFxicmllZiBDbG9zZSBXQVYgT3V0cHV0IGhhbmRsZQorICogXHBhcmFtIHBXYXYgcG9pbnRlciB0byBXQVYgaGFuZGxlLiAqcFdhdiBpcyBzZXQgdG8gTlVMTC4KKyAqLwordm9pZCBXQVZfT3V0cHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdikKK3sKKyAgSEFORExFX1dBViB3YXYgPSAqcFdhdjsKKyAgVUlOVCBzaXplID0gMDsKKworICBpZiAoIHdhdiA9PSBOVUxMICkgeworICAgICAgcmV0dXJuOworICB9CisKKyAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSk7CisgIHdhdi0+aGVhZGVyLnJpZmZTaXplID0gTGl0dGxlRW5kaWFuMzIod2F2LT5oZWFkZXIuZGF0YVNpemUgKyAzNik7CisKKyAgaWYgKHdhdi0+ZnAgIT0gTlVMTCkKKyAgeworICAgIGlmIChGREtmc2Vlayh3YXYtPmZwLCAwLCBGREtTRUVLX1NFVCkpIHsKKyAgICAgICBGREtwcmludGYoIldBVl9PdXRwdXRDbG9zZSgpOiBmc2VlaygpIGZhaWxlZC5cbiIpOworICAgIH0KKworICBzaXplID0gc2l6ZW9mKFdBVl9IRUFERVIpOworICAgIGlmIChGREtmd3JpdGUoJndhdi0+aGVhZGVyLnJpZmZUeXBlLCAxLCBzaXplLCB3YXYtPmZwKSAhPSBzaXplKQorICAgIHsKKyAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0Q2xvc2UoKTogdW5hYmxlIHRvIHdyaXRlIGhlYWRlclxuIik7CisJfQorCisgICAgaWYgKEZES2ZjbG9zZSh3YXYtPmZwKSkKKyAgICB7CisgICAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dENsb3NlKCk6IHVuYWJsZSB0byBjbG9zZSB3YXYgZmlsZVxuIik7CisgICAgfQorICAgIHdhdi0+ZnAgPSBOVUxMOworICB9CisKKyAgRkRLZnJlZSh3YXYpOworICAqcFdhdiA9IE5VTEw7Cit9CisK