LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBQlNUUkFDVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgQ09ORklHX1BBQ0tFVF9NTUFQIG9wdGlvbiBhdmFpbGFibGUgd2l0aCB0aGUgUEFDS0VUCnNvY2tldCBpbnRlcmZhY2Ugb24gMi40IGFuZCAyLjYga2VybmVscy4gVGhpcyB0eXBlIG9mIHNvY2tldHMgaXMgdXNlZCBmb3IgCmNhcHR1cmUgbmV0d29yayB0cmFmZmljIHdpdGggdXRpbGl0aWVzIGxpa2UgdGNwZHVtcCBvciBhbnkgb3RoZXIgdGhhdCB1c2VzIAp0aGUgbGlicGNhcCBsaWJyYXJ5LiAKCllvdSBjYW4gZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAoKICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLwoKUGxlYXNlIHNlbmQgbWUgeW91ciBjb21tZW50cyB0bwoKICAgIFVsaXNzZXMgQWxvbnNvIENhbWFy8yA8dWFjYUBpLmhhdGUuc3BhbS5hbHVtbmkudXYuZXM+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV2h5IHVzZSBQQUNLRVRfTU1BUAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gTGludXggMi40LzIuNiBpZiBQQUNLRVRfTU1BUCBpcyBub3QgZW5hYmxlZCwgdGhlIGNhcHR1cmUgcHJvY2VzcyBpcyB2ZXJ5CmluZWZmaWNpZW50LiBJdCB1c2VzIHZlcnkgbGltaXRlZCBidWZmZXJzIGFuZCByZXF1aXJlcyBvbmUgc3lzdGVtIGNhbGwKdG8gY2FwdHVyZSBlYWNoIHBhY2tldCwgaXQgcmVxdWlyZXMgdHdvIGlmIHlvdSB3YW50IHRvIGdldCBwYWNrZXQncyAKdGltZXN0YW1wIChsaWtlIGxpYnBjYXAgYWx3YXlzIGRvZXMpLgoKSW4gdGhlIG90aGVyIGhhbmQgUEFDS0VUX01NQVAgaXMgdmVyeSBlZmZpY2llbnQuIFBBQ0tFVF9NTUFQIHByb3ZpZGVzIGEgc2l6ZSAKY29uZmlndXJhYmxlIGNpcmN1bGFyIGJ1ZmZlciBtYXBwZWQgaW4gdXNlciBzcGFjZS4gVGhpcyB3YXkgcmVhZGluZyBwYWNrZXRzIGp1c3QgCm5lZWRzIHRvIHdhaXQgZm9yIHRoZW0sIG1vc3Qgb2YgdGhlIHRpbWUgdGhlcmUgaXMgbm8gbmVlZCB0byBpc3N1ZSBhIHNpbmdsZSAKc3lzdGVtIGNhbGwuIEJ5IHVzaW5nIGEgc2hhcmVkIGJ1ZmZlciBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIHRoZSB1c2VyIAphbHNvIGhhcyB0aGUgYmVuZWZpdCBvZiBtaW5pbWl6aW5nIHBhY2tldCBjb3BpZXMuCgpJdCdzIGZpbmUgdG8gdXNlIFBBQ0tFVF9NTUFQIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjYXB0dXJlIHByb2Nlc3MsIApidXQgaXQgaXNuJ3QgZXZlcnl0aGluZy4gQXQgbGVhc3QsIGlmIHlvdSBhcmUgY2FwdHVyaW5nIGF0IGhpZ2ggc3BlZWRzICh0aGlzIAppcyByZWxhdGl2ZSB0byB0aGUgY3B1IHNwZWVkKSwgeW91IHNob3VsZCBjaGVjayBpZiB0aGUgZGV2aWNlIGRyaXZlciBvZiB5b3VyIApuZXR3b3JrIGludGVyZmFjZSBjYXJkIHN1cHBvcnRzIHNvbWUgc29ydCBvZiBpbnRlcnJ1cHQgbG9hZCBtaXRpZ2F0aW9uIG9yIAooZXZlbiBiZXR0ZXIpIGlmIGl0IHN1cHBvcnRzIE5BUEksIGFsc28gbWFrZSBzdXJlIGl0IGlzIGVuYWJsZWQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhvdyB0byB1c2UgQ09ORklHX1BBQ0tFVF9NTUFQCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tIHRoZSB1c2VyIHN0YW5kcG9pbnQsIHlvdSBzaG91bGQgdXNlIHRoZSBoaWdoZXIgbGV2ZWwgbGlicGNhcCBsaWJyYXJ5LCB3aGljaAppcyBhIGRlIGZhY3RvIHN0YW5kYXJkLCBwb3J0YWJsZSBhY3Jvc3MgbmVhcmx5IGFsbCBvcGVyYXRpbmcgc3lzdGVtcwppbmNsdWRpbmcgV2luMzIuIAoKU2FpZCB0aGF0LCBhdCB0aW1lIG9mIHRoaXMgd3JpdGluZywgb2ZmaWNpYWwgbGlicGNhcCAwLjguMSBpcyBvdXQgYW5kIGRvZXNuJ3QgaW5jbHVkZQpzdXBwb3J0IGZvciBQQUNLRVRfTU1BUCwgYW5kIGFsc28gcHJvYmFibHkgdGhlIGxpYnBjYXAgaW5jbHVkZWQgaW4geW91ciBkaXN0cmlidXRpb24uIAoKSSdtIGF3YXJlIG9mIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgUEFDS0VUX01NQVAgaW4gbGlicGNhcDoKCiAgICBodHRwOi8vcHVzYS51di5lcy9+dWxpc3Nlcy9wYWNrZXRfbW1hcC8gIChieSBTaW1vbiBQYXRhcmluLCBiYXNlZCBvbiBsaWJwY2FwIDAuNi4yKQogICAgaHR0cDovL3B1YmxpYy5sYW5sLmdvdi9jcHcvICAgICAgICAgICAgICAoYnkgUGhpbCBXb29kLCBiYXNlZCBvbiBsYXN0ZXN0IGxpYnBjYXApCgpUaGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gdW5kZXJzdGFuZAp0aGUgbG93IGxldmVsIGRldGFpbHMgb3Igd2FudCB0byBpbXByb3ZlIGxpYnBjYXAgYnkgaW5jbHVkaW5nIFBBQ0tFVF9NTUFQCnN1cHBvcnQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhvdyB0byB1c2UgQ09ORklHX1BBQ0tFVF9NTUFQIGRpcmVjdGx5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tIHRoZSBzeXN0ZW0gY2FsbHMgc3RhbmQgcG9pbnQsIHRoZSB1c2Ugb2YgUEFDS0VUX01NQVAgaW52b2x2ZXMKdGhlIGZvbGxvd2luZyBwcm9jZXNzOgoKCltzZXR1cF0gICAgIHNvY2tldCgpIC0tLS0tLS0+IGNyZWF0aW9uIG9mIHRoZSBjYXB0dXJlIHNvY2tldAogICAgICAgICAgICBzZXRzb2Nrb3B0KCkgLS0tPiBhbGxvY2F0aW9uIG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKHJpbmcpCiAgICAgICAgICAgIG1tYXAoKSAtLS0tLS0tLS0+IG1hcHBpbmcgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJvY2VzcwoKW2NhcHR1cmVdICAgcG9sbCgpIC0tLS0tLS0tLT4gdG8gd2FpdCBmb3IgaW5jb21pbmcgcGFja2V0cwoKW3NodXRkb3duXSAgY2xvc2UoKSAtLS0tLS0tLT4gZGVzdHJ1Y3Rpb24gb2YgdGhlIGNhcHR1cmUgc29ja2V0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgYWxsIGFzc29jaWF0ZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy4KCgpzb2NrZXQgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGlzIHN0cmFpZ2h0IGZvcndhcmQsIGFuZCBpcyBkb25lIAp0aGUgc2FtZSB3YXkgd2l0aCBvciB3aXRob3V0IFBBQ0tFVF9NTUFQOgoKaW50IGZkOwoKZmQ9IHNvY2tldChQRl9QQUNLRVQsIG1vZGUsIGh0b25zKEVUSF9QX0FMTCkpCgp3aGVyZSBtb2RlIGlzIFNPQ0tfUkFXIGZvciB0aGUgcmF3IGludGVyZmFjZSB3ZXJlIGxpbmsgbGV2ZWwKaW5mb3JtYXRpb24gY2FuIGJlIGNhcHR1cmVkIG9yIFNPQ0tfREdSQU0gZm9yIHRoZSBjb29rZWQKaW50ZXJmYWNlIHdoZXJlIGxpbmsgbGV2ZWwgaW5mb3JtYXRpb24gY2FwdHVyZSBpcyBub3QgCnN1cHBvcnRlZCBhbmQgYSBsaW5rIGxldmVsIHBzZXVkby1oZWFkZXIgaXMgcHJvdmlkZWQgCmJ5IHRoZSBrZXJuZWwuCgpUaGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIHNvY2tldCBhbmQgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzCmlzIGRvbmUgYnkgYSBzaW1wbGUgY2FsbCB0byBjbG9zZShmZCkuCgpOZXh0IEkgd2lsbCBkZXNjcmliZSBQQUNLRVRfTU1BUCBzZXR0aW5ncyBhbmQgaXQncyBjb25zdHJhaW50cywKYWxzbyB0aGUgbWFwcGluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGluIHRoZSB1c2VyIHByb2Nlc3MgYW5kIAp0aGUgdXNlIG9mIHRoaXMgYnVmZmVyLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQQUNLRVRfTU1BUCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClRvIHNldHVwIFBBQ0tFVF9NTUFQIGZyb20gdXNlciBsZXZlbCBjb2RlIGlzIGRvbmUgd2l0aCBhIGNhbGwgbGlrZQoKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywgKHZvaWQgKikgJnJlcSwgc2l6ZW9mKHJlcSkpCgpUaGUgbW9zdCBzaWduaWZpY2FudCBhcmd1bWVudCBpbiB0aGUgcHJldmlvdXMgY2FsbCBpcyB0aGUgcmVxIHBhcmFtZXRlciwgCnRoaXMgcGFyYW1ldGVyIG11c3QgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKCiAgICBzdHJ1Y3QgdHBhY2tldF9yZXEKICAgIHsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgdHBfYmxvY2tfc2l6ZTsgIC8qIE1pbmltYWwgc2l6ZSBvZiBjb250aWd1b3VzIGJsb2NrICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2Jsb2NrX25yOyAgICAvKiBOdW1iZXIgb2YgYmxvY2tzICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX3NpemU7ICAvKiBTaXplIG9mIGZyYW1lICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX25yOyAgICAvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCiAgICB9OwoKVGhpcyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYW5kIGVzdGFibGlzaGVzIGEgCmNpcmN1bGFyIGJ1ZmZlciAocmluZykgb2YgdW5zd2FwcGFibGUgbWVtb3J5IG1hcHBlZCBpbiB0aGUgY2FwdHVyZSBwcm9jZXNzLiAKQmVpbmcgbWFwcGVkIGluIHRoZSBjYXB0dXJlIHByb2Nlc3MgYWxsb3dzIHJlYWRpbmcgdGhlIGNhcHR1cmVkIGZyYW1lcyBhbmQgCnJlbGF0ZWQgbWV0YS1pbmZvcm1hdGlvbiBsaWtlIHRpbWVzdGFtcHMgd2l0aG91dCByZXF1aXJpbmcgYSBzeXN0ZW0gY2FsbC4KCkNhcHR1cmVkIGZyYW1lcyBhcmUgZ3JvdXBlZCBpbiBibG9ja3MuIEVhY2ggYmxvY2sgaXMgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgCnJlZ2lvbiBvZiBtZW1vcnkgYW5kIGhvbGRzIHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZSBmcmFtZXMuIFRoZSB0b3RhbCBudW1iZXIgCm9mIGJsb2NrcyBpcyB0cF9ibG9ja19uci4gTm90ZSB0aGF0IHRwX2ZyYW1lX25yIGlzIGEgcmVkdW5kYW50IHBhcmFtZXRlciBiZWNhdXNlCgogICAgZnJhbWVzX3Blcl9ibG9jayA9IHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZQoKaW5kZWVkLCBwYWNrZXRfc2V0X3JpbmcgY2hlY2tzIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZQoKICAgIGZyYW1lc19wZXJfYmxvY2sgKiB0cF9ibG9ja19uciA9PSB0cF9mcmFtZV9ucgoKCkxldHMgc2VlIGFuIGV4YW1wbGUsIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CgogICAgIHRwX2Jsb2NrX3NpemU9IDQwOTYKICAgICB0cF9mcmFtZV9zaXplPSAyMDQ4CiAgICAgdHBfYmxvY2tfbnIgID0gNAogICAgIHRwX2ZyYW1lX25yICA9IDgKCndlIHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgYnVmZmVyIHN0cnVjdHVyZToKCiAgICAgICAgYmxvY2sgIzEgICAgICAgICAgICAgICAgIGJsb2NrICMyICAgICAgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCnwgZnJhbWUgMSB8IGZyYW1lIDIgfCAgICB8IGZyYW1lIDMgfCBmcmFtZSA0IHwgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCgogICAgICAgIGJsb2NrICMzICAgICAgICAgICAgICAgICBibG9jayAjNAorLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rCnwgZnJhbWUgNSB8IGZyYW1lIDYgfCAgICB8IGZyYW1lIDcgfCBmcmFtZSA4IHwKKy0tLS0tLS0tLSstLS0tLS0tLS0rICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKwoKQSBmcmFtZSBjYW4gYmUgb2YgYW55IHNpemUgd2l0aCB0aGUgb25seSBjb25kaXRpb24gaXQgY2FuIGZpdCBpbiBhIGJsb2NrLiBBIGJsb2NrCmNhbiBvbmx5IGhvbGQgYW4gaW50ZWdlciBudW1iZXIgb2YgZnJhbWVzLCBvciBpbiBvdGhlciB3b3JkcywgYSBmcmFtZSBjYW5ub3QgCmJlIHNwYXduZWQgYWNjcm9zcyB0d28gYmxvY2tzLCBzbyB0aGVyZSBhcmUgc29tZSBkZXRhaWxzIHlvdSBoYXZlIHRvIHRha2UgaW50byAKYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBmcmFtZV9zaXplLiBTZWUgIk1hcHBpbmcgYW5kIHVzZSBvZiB0aGUgY2lyY3VsYXIgCmJ1ZmZlciAocmluZykiLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUEFDS0VUX01NQVAgc2V0dGluZyBjb25zdHJhaW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4ga2VybmVsIHZlcnNpb25zIHByaW9yIHRvIDIuNC4yNiAoZm9yIHRoZSAyLjQgYnJhbmNoKSBhbmQgMi42LjUgKDIuNiBicmFuY2gpLAp0aGUgUEFDS0VUX01NQVAgYnVmZmVyIGNvdWxkIGhvbGQgb25seSAzMjc2OCBmcmFtZXMgaW4gYSAzMiBiaXQgYXJjaGl0ZWN0dXJlIG9yCjE2Mzg0IGluIGEgNjQgYml0IGFyY2hpdGVjdHVyZS4gRm9yIGluZm9ybWF0aW9uIG9uIHRoZXNlIGtlcm5lbCB2ZXJzaW9ucwpzZWUgaHR0cDovL3B1c2EudXYuZXMvfnVsaXNzZXMvcGFja2V0X21tYXAvcGFja2V0X21tYXAucHJlLTIuNC4yNl8yLjYuNS50eHQKCiBCbG9jayBzaXplIGxpbWl0Ci0tLS0tLS0tLS0tLS0tLS0tLQoKQXMgc3RhdGVkIGVhcmxpZXIsIGVhY2ggYmxvY2sgaXMgYSBjb250aWd1b3VzIHBoeXNpY2FsIHJlZ2lvbiBvZiBtZW1vcnkuIFRoZXNlIAptZW1vcnkgcmVnaW9ucyBhcmUgYWxsb2NhdGVkIHdpdGggY2FsbHMgdG8gdGhlIF9fZ2V0X2ZyZWVfcGFnZXMoKSBmdW5jdGlvbi4gQXMgCnRoZSBuYW1lIGluZGljYXRlcywgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgcGFnZXMgb2YgbWVtb3J5LCBhbmQgdGhlIHNlY29uZAphcmd1bWVudCBpcyAib3JkZXIiIG9yIGEgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBwYWdlcywgdGhhdCBpcyAKKGZvciBQQUdFX1NJWkUgPT0gNDA5Nikgb3JkZXI9MCA9PT4gNDA5NiBieXRlcywgb3JkZXI9MSA9PT4gODE5MiBieXRlcywgCm9yZGVyPTIgPT0+IDE2Mzg0IGJ5dGVzLCBldGMuIFRoZSBtYXhpbXVtIHNpemUgb2YgYSAKcmVnaW9uIGFsbG9jYXRlZCBieSBfX2dldF9mcmVlX3BhZ2VzIGlzIGRldGVybWluZWQgYnkgdGhlIE1BWF9PUkRFUiBtYWNyby4gTW9yZSAKcHJlY2lzZWx5IHRoZSBsaW1pdCBjYW4gYmUgY2FsY3VsYXRlZCBhczoKCiAgIFBBR0VfU0laRSA8PCBNQVhfT1JERVIKCiAgIEluIGEgaTM4NiBhcmNoaXRlY3R1cmUgUEFHRV9TSVpFIGlzIDQwOTYgYnl0ZXMgCiAgIEluIGEgMi40L2kzODYga2VybmVsIE1BWF9PUkRFUiBpcyAxMAogICBJbiBhIDIuNi9pMzg2IGtlcm5lbCBNQVhfT1JERVIgaXMgMTEKClNvIGdldF9mcmVlX3BhZ2VzIGNhbiBhbGxvY2F0ZSBhcyBtdWNoIGFzIDRNQiBvciA4TUIgaW4gYSAyLjQvMi42IGtlcm5lbCAKcmVzcGVjdGl2ZWx5LCB3aXRoIGFuIGkzODYgYXJjaGl0ZWN0dXJlLgoKVXNlciBzcGFjZSBwcm9ncmFtcyBjYW4gaW5jbHVkZSAvdXNyL2luY2x1ZGUvc3lzL3VzZXIuaCBhbmQgCi91c3IvaW5jbHVkZS9saW51eC9tbXpvbmUuaCB0byBnZXQgUEFHRV9TSVpFIE1BWF9PUkRFUiBkZWNsYXJhdGlvbnMuCgpUaGUgcGFnZXNpemUgY2FuIGFsc28gYmUgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSB3aXRoIHRoZSBnZXRwYWdlc2l6ZSAoMikgCnN5c3RlbSBjYWxsLiAKCgogQmxvY2sgbnVtYmVyIGxpbWl0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUbyB1bmRlcnN0YW5kIHRoZSBjb25zdHJhaW50cyBvZiBQQUNLRVRfTU1BUCwgd2UgaGF2ZSB0byBzZWUgdGhlIHN0cnVjdHVyZSAKdXNlZCB0byBob2xkIHRoZSBwb2ludGVycyB0byBlYWNoIGJsb2NrLgoKQ3VycmVudGx5LCB0aGlzIHN0cnVjdHVyZSBpcyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB2ZWN0b3Igd2l0aCBrbWFsbG9jIApjYWxsZWQgcGdfdmVjLCBpdHMgc2l6ZSBsaW1pdHMgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBjYW4gYmUgYWxsb2NhdGVkLgoKICAgICstLS0rLS0tKy0tLSstLS0rCiAgICB8IHggfCB4IHwgeCB8IHggfAogICAgKy0tLSstLS0rLS0tKy0tLSsKICAgICAgfCAgIHwgICB8ICAgfAogICAgICB8ICAgfCAgIHwgICB2CiAgICAgIHwgICB8ICAgdiAgYmxvY2sgIzQKICAgICAgfCAgIHYgIGJsb2NrICMzCiAgICAgIHYgIGJsb2NrICMyCiAgICAgYmxvY2sgIzEKCgprbWFsbG9jIGFsbG9jYXRlcyBhbnkgbnVtYmVyIG9mIGJ5dGVzIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgZnJvbSAKYSBwb29sIG9mIHByZS1kZXRlcm1pbmVkIHNpemVzLiBUaGlzIHBvb2wgb2YgbWVtb3J5IGlzIG1haW50YWluZWQgYnkgdGhlIHNsYWIgCmFsbG9jYXRvciB3aGljaCBpcyBhdCB0aGUgZW5kIHRoZSByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIGFsbG9jYXRpb24gYW5kIApoZW5jZSB3aGljaCBpbXBvc2VzIHRoZSBtYXhpbXVtIG1lbW9yeSB0aGF0IGttYWxsb2MgY2FuIGFsbG9jYXRlLiAKCkluIGEgMi40LzIuNiBrZXJuZWwgYW5kIHRoZSBpMzg2IGFyY2hpdGVjdHVyZSwgdGhlIGxpbWl0IGlzIDEzMTA3MiBieXRlcy4gVGhlIApwcmVkZXRlcm1pbmVkIHNpemVzIHRoYXQga21hbGxvYyB1c2VzIGNhbiBiZSBjaGVja2VkIGluIHRoZSAic2l6ZS08Ynl0ZXM+IiAKZW50cmllcyBvZiAvcHJvYy9zbGFiaW5mbwoKSW4gYSAzMiBiaXQgYXJjaGl0ZWN0dXJlLCBwb2ludGVycyBhcmUgNCBieXRlcyBsb25nLCBzbyB0aGUgdG90YWwgbnVtYmVyIG9mIApwb2ludGVycyB0byBibG9ja3MgaXMKCiAgICAgMTMxMDcyLzQgPSAzMjc2OCBibG9ja3MKCgogUEFDS0VUX01NQVAgYnVmZmVyIHNpemUgY2FsY3VsYXRvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkRlZmluaXRpb25zOgoKPHNpemUtbWF4PiAgICA6IGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgYWxsb2NhYmxlIHdpdGgga21hbGxvYyAoc2VlIC9wcm9jL3NsYWJpbmZvKQo8cG9pbnRlciBzaXplPjogZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlIC0tIHNpemVvZih2b2lkICopCjxwYWdlIHNpemU+ICAgOiBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUgLS0gUEFHRV9TSVpFIG9yIGdldHBhZ2VzaXplICgyKQo8bWF4LW9yZGVyPiAgIDogaXMgdGhlIHZhbHVlIGRlZmluZWQgd2l0aCBNQVhfT1JERVIKPGZyYW1lIHNpemU+ICA6IGl0J3MgYW4gdXBwZXIgYm91bmQgb2YgZnJhbWUncyBjYXB0dXJlIHNpemUgKG1vcmUgb24gdGhpcyBsYXRlcikKCmZyb20gdGhlc2UgZGVmaW5pdGlvbnMgd2Ugd2lsbCBkZXJpdmUgCgoJPGJsb2NrIG51bWJlcj4gPSA8c2l6ZS1tYXg+Lzxwb2ludGVyIHNpemU+Cgk8YmxvY2sgc2l6ZT4gPSA8cGFnZXNpemU+IDw8IDxtYXgtb3JkZXI+CgpzbywgdGhlIG1heCBidWZmZXIgc2l6ZSBpcwoKCTxibG9jayBudW1iZXI+ICogPGJsb2NrIHNpemU+CgphbmQsIHRoZSBudW1iZXIgb2YgZnJhbWVzIGJlCgoJPGJsb2NrIG51bWJlcj4gKiA8YmxvY2sgc2l6ZT4gLyA8ZnJhbWUgc2l6ZT4KClN1cHBvc2UgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLCB3aGljaCBhcHBseSBmb3IgMi42IGtlcm5lbCBhbmQgYW4KaTM4NiBhcmNoaXRlY3R1cmU6CgoJPHNpemUtbWF4PiA9IDEzMTA3MiBieXRlcwoJPHBvaW50ZXIgc2l6ZT4gPSA0IGJ5dGVzCgk8cGFnZXNpemU+ID0gNDA5NiBieXRlcwoJPG1heC1vcmRlcj4gPSAxMQoKYW5kIGEgdmFsdWUgZm9yIDxmcmFtZSBzaXplPiBvZiAyMDQ4IGJ5dGVzLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgeWllbGQKCgk8YmxvY2sgbnVtYmVyPiA9IDEzMTA3Mi80ID0gMzI3NjggYmxvY2tzCgk8YmxvY2sgc2l6ZT4gPSA0MDk2IDw8IDExID0gOCBNaUIuCgphbmQgaGVuY2UgdGhlIGJ1ZmZlciB3aWxsIGhhdmUgYSAyNjIxNDQgTWlCIHNpemUuIFNvIGl0IGNhbiBob2xkIAoyNjIxNDQgTWlCIC8gMjA0OCBieXRlcyA9IDEzNDIxNzcyOCBmcmFtZXMKCgpBY3R1YWxseSwgdGhpcyBidWZmZXIgc2l6ZSBpcyBub3QgcG9zc2libGUgd2l0aCBhbiBpMzg2IGFyY2hpdGVjdHVyZS4gClJlbWVtYmVyIHRoYXQgdGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4ga2VybmVsIHNwYWNlLCBpbiB0aGUgY2FzZSBvZiAKYW4gaTM4NiBrZXJuZWwncyBtZW1vcnkgc2l6ZSBpcyBsaW1pdGVkIHRvIDFHaUIuCgpBbGwgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBub3QgZnJlZWQgdW50aWwgdGhlIHNvY2tldCBpcyBjbG9zZWQuIFRoZSBtZW1vcnkgCmFsbG9jYXRpb25zIGFyZSBkb25lIHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSwgdGhpcyBiYXNpY2FsbHkgbWVhbnMgdGhhdCAKdGhlIGFsbG9jYXRpb24gY2FuIHdhaXQgYW5kIHN3YXAgb3RoZXIgcHJvY2VzcycgbWVtb3J5IGluIG9yZGVyIHRvIGFsbG9jYXRlIAp0aGUgbmVjZXNzYXJ5IG1lbW9yeSwgc28gbm9ybWFsbHkgbGltaXRzIGNhbiBiZSByZWFjaGVkLgoKIE90aGVyIGNvbnN0cmFpbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0KCklmIHlvdSBjaGVjayB0aGUgc291cmNlIGNvZGUgeW91IHdpbGwgc2VlIHRoYXQgd2hhdCBJIGRyYXcgaGVyZSBhcyBhIGZyYW1lCmlzIG5vdCBvbmx5IHRoZSBsaW5rIGxldmVsIGZyYW1lLiBBdCB0aGUgYmVnaW5pbmcgb2YgZWFjaCBmcmFtZSB0aGVyZSBpcyBhIApoZWFkZXIgY2FsbGVkIHN0cnVjdCB0cGFja2V0X2hkciB1c2VkIGluIFBBQ0tFVF9NTUFQIHRvIGhvbGQgbGluayBsZXZlbCdzIGZyYW1lCm1ldGEgaW5mb3JtYXRpb24gbGlrZSB0aW1lc3RhbXAuIFNvIHdoYXQgd2UgZHJhdyBoZXJlIGEgZnJhbWUgaXQncyByZWFsbHkgCnRoZSBmb2xsb3dpbmcgKGZyb20gaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCk6CgovKgogICBGcmFtZSBzdHJ1Y3R1cmU6CgogICAtIFN0YXJ0LiBGcmFtZSBtdXN0IGJlIGFsaWduZWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKICAgLSBzdHJ1Y3QgdHBhY2tldF9oZHIKICAgLSBwYWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKICAgLSBzdHJ1Y3Qgc29ja2FkZHJfbGwKICAgLSBHYXAsIGNob3NlbiBzbyB0aGF0IHBhY2tldCBkYXRhIChTdGFydCt0cF9uZXQpIGFsaWducyB0byAKICAgICBUUEFDS0VUX0FMSUdOTUVOVD0xNgogICAtIFN0YXJ0K3RwX21hYzogWyBPcHRpb25hbCBNQUMgaGVhZGVyIF0KICAgLSBTdGFydCt0cF9uZXQ6IFBhY2tldCBkYXRhLCBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2LgogICAtIFBhZCB0byBhbGlnbiB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgogKi8KICAgICAgICAgICAKIAogVGhlIGZvbGxvd2luZyBhcmUgY29uZGl0aW9ucyB0aGF0IGFyZSBjaGVja2VkIGluIHBhY2tldF9zZXRfcmluZwoKICAgdHBfYmxvY2tfc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgUEFHRV9TSVpFICgxKQogICB0cF9mcmFtZV9zaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIFRQQUNLRVRfSERSTEVOIChvYnZpb3VzKQogICB0cF9mcmFtZV9zaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBUUEFDS0VUX0FMSUdOTUVOVAogICB0cF9mcmFtZV9uciAgIG11c3QgYmUgZXhhY3RseSBmcmFtZXNfcGVyX2Jsb2NrKnRwX2Jsb2NrX25yCgpOb3RlIHRoYXQgdHBfYmxvY2tfc2l6ZSBzaG91bGQgYmUgY2hvc2VuIHRvIGJlIGEgcG93ZXIgb2YgdHdvIG9yIHRoZXJlIHdpbGwKYmUgYSB3YXN0ZSBvZiBtZW1vcnkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1hcHBpbmcgYW5kIHVzZSBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIChyaW5nKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgdXNlciBwcm9jZXNzIGlzIGRvbmUgd2l0aCB0aGUgY29udmVudGlvbmFsIAptbWFwIGZ1bmN0aW9uLiBFdmVuIHRoZSBjaXJjdWxhciBidWZmZXIgaXMgY29tcG91bmQgb2Ygc2V2ZXJhbCBwaHlzaWNhbGx5CmRpc2NvbnRpZ3VvdXMgYmxvY2tzIG9mIG1lbW9yeSwgdGhleSBhcmUgY29udGlndW91cyB0byB0aGUgdXNlciBzcGFjZSwgaGVuY2UKanVzdCBvbmUgY2FsbCB0byBtbWFwIGlzIG5lZWRlZDoKCiAgICBtbWFwKDAsIHNpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7CgpJZiB0cF9mcmFtZV9zaXplIGlzIGEgZGl2aXNvciBvZiB0cF9ibG9ja19zaXplIGZyYW1lcyB3aWxsIGJlIApjb250aWd1b3NseSBzcGFjZWQgYnkgdHBfZnJhbWVfc2l6ZSBieXRlcy4gSWYgbm90LCBlYWNoIAp0cF9ibG9ja19zaXplL3RwX2ZyYW1lX3NpemUgZnJhbWVzIHRoZXJlIHdpbGwgYmUgYSBnYXAgYmV0d2VlbiAKdGhlIGZyYW1lcy4gVGhpcyBpcyBiZWNhdXNlIGEgZnJhbWUgY2Fubm90IGJlIHNwYXduIGFjcm9zcyB0d28KYmxvY2tzLiAKCkF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZSB0aGVyZSBpcyBhbiBzdGF0dXMgZmllbGQgKHNlZSAKc3RydWN0IHRwYWNrZXRfaGRyKS4gSWYgdGhpcyBmaWVsZCBpcyAwIG1lYW5zIHRoYXQgdGhlIGZyYW1lIGlzIHJlYWR5CnRvIGJlIHVzZWQgZm9yIHRoZSBrZXJuZWwsIElmIG5vdCwgdGhlcmUgaXMgYSBmcmFtZSB0aGUgdXNlciBjYW4gcmVhZCAKYW5kIHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXBwbHk6CgogICAgIGZyb20gaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAoKICAgICAjZGVmaW5lIFRQX1NUQVRVU19DT1BZICAgICAgICAgIDIgCiAgICAgI2RlZmluZSBUUF9TVEFUVVNfTE9TSU5HICAgICAgICA0IAogICAgICNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWSAgOCAKCgpUUF9TVEFUVVNfQ09QWSAgICAgICAgOiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGZyYW1lIChhbmQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgICAgICBtZXRhIGluZm9ybWF0aW9uKSBoYXMgYmVlbiB0cnVuY2F0ZWQgYmVjYXVzZSBpdCdzIAogICAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIgdGhhbiB0cF9mcmFtZV9zaXplLiBUaGlzIHBhY2tldCBjYW4gYmUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgZW50aXJlbHkgd2l0aCByZWN2ZnJvbSgpLgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gbWFrZSB0aGlzIHdvcmsgaXQgbXVzdCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIHByZXZpb3VzbHkgd2l0aCBzZXRzb2Nrb3B0KCkgYW5kIAogICAgICAgICAgICAgICAgICAgICAgICB0aGUgUEFDS0VUX0NPUFlfVEhSRVNIIG9wdGlvbi4gCgogICAgICAgICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGFuIGNhbiBiZSBidWZmZXJlZCB0byAKICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVhZCB3aXRoIHJlY3Zmcm9tIGlzIGxpbWl0ZWQgbGlrZSBhIG5vcm1hbCBzb2NrZXQuCiAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgU09fUkNWQlVGIG9wdGlvbiBpbiB0aGUgc29ja2V0ICg3KSBtYW4gcGFnZS4KClRQX1NUQVRVU19MT1NJTkcgICAgICA6IGluZGljYXRlcyB0aGVyZSB3ZXJlIHBhY2tldCBkcm9wcyBmcm9tIGxhc3QgdGltZSAKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljcyB3aGVyZSBjaGVja2VkIHdpdGggZ2V0c29ja29wdCgpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICB0aGUgUEFDS0VUX1NUQVRJU1RJQ1Mgb3B0aW9uLgoKVFBfU1RBVFVTX0NTVU1OT1RSRUFEWTogY3VycmVudGx5IGl0J3MgdXNlZCBmb3Igb3V0Z29pbmcgSVAgcGFja2V0cyB3aGljaCAKICAgICAgICAgICAgICAgICAgICAgICAgaXQncyBjaGVja3N1bSB3aWxsIGJlIGRvbmUgaW4gaGFyZHdhcmUuIFNvIHdoaWxlIAogICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nIHRoZSBwYWNrZXQgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gY2hlY2sgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bS4gCgpmb3IgY29udmVuaWVuY2UgdGhlcmUgYXJlIGFsc28gdGhlIGZvbGxvd2luZyBkZWZpbmVzOgoKICAgICAjZGVmaW5lIFRQX1NUQVRVU19LRVJORUwgICAgICAgIDAKICAgICAjZGVmaW5lIFRQX1NUQVRVU19VU0VSICAgICAgICAgIDEKClRoZSBrZXJuZWwgaW5pdGlhbGl6ZXMgYWxsIGZyYW1lcyB0byBUUF9TVEFUVVNfS0VSTkVMLCB3aGVuIHRoZSBrZXJuZWwKcmVjZWl2ZXMgYSBwYWNrZXQgaXQgcHV0cyBpbiB0aGUgYnVmZmVyIGFuZCB1cGRhdGVzIHRoZSBzdGF0dXMgd2l0aAphdCBsZWFzdCB0aGUgVFBfU1RBVFVTX1VTRVIgZmxhZy4gVGhlbiB0aGUgdXNlciBjYW4gcmVhZCB0aGUgcGFja2V0LApvbmNlIHRoZSBwYWNrZXQgaXMgcmVhZCB0aGUgdXNlciBtdXN0IHplcm8gdGhlIHN0YXR1cyBmaWVsZCwgc28gdGhlIGtlcm5lbCAKY2FuIHVzZSBhZ2FpbiB0aGF0IGZyYW1lIGJ1ZmZlci4KClRoZSB1c2VyIGNhbiB1c2UgcG9sbCAoYW55IG90aGVyIHZhcmlhbnQgc2hvdWxkIGFwcGx5IHRvbykgdG8gY2hlY2sgaWYgbmV3CnBhY2tldHMgYXJlIGluIHRoZSByaW5nOgoKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwoKICAgIHBmZC5mZCA9IGZkOwogICAgcGZkLnJldmVudHMgPSAwOwogICAgcGZkLmV2ZW50cyA9IFBPTExJTnxQT0xMUkROT1JNfFBPTExFUlI7CgogICAgaWYgKHN0YXR1cyA9PSBUUF9TVEFUVVNfS0VSTkVMKQogICAgICAgIHJldHZhbCA9IHBvbGwoJnBmZCwgMSwgdGltZW91dCk7CgpJdCBkb2Vzbid0IGluY3VyIGluIGEgcmFjZSBjb25kaXRpb24gdG8gZmlyc3QgY2hlY2sgdGhlIHN0YXR1cyB2YWx1ZSBhbmQgCnRoZW4gcG9sbCBmb3IgZnJhbWVzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBUSEFOS1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgCiAgIEplc3NlIEJyYW5kZWJ1cmcsIGZvciBmaXhpbmcgbXkgZ3JhbW1hdGhpY2FsL3NwZWxsaW5nIGVycm9ycwoK