Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756845AbcDEDoL (ORCPT ); Mon, 4 Apr 2016 23:44:11 -0400 Received: from mail-wm0-f47.google.com ([74.125.82.47]:35622 "EHLO mail-wm0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753067AbcDEDoJ (ORCPT ); Mon, 4 Apr 2016 23:44:09 -0400 MIME-Version: 1.0 In-Reply-To: <56B2744D.6080202@hpe.com> References: <1451549374-30875-1-git-send-email-ling.ma.program@gmail.com> <20160105211834.GR6344@twins.programming.kicks-ass.net> <20160105214227.3a2adcd2@lxorguk.ukuu.org.uk> <20160106081643.GS6344@twins.programming.kicks-ass.net> <20160106082106.GU6373@twins.programming.kicks-ass.net> <20160106112450.6c5ad08b@lxorguk.ukuu.org.uk> <20160112135016.247c6ca5@lxorguk.ukuu.org.uk> <569E5816.6000909@hpe.com> <56B2744D.6080202@hpe.com> Date: Tue, 5 Apr 2016 11:44:06 +0800 Message-ID: Subject: Re: [RFC PATCH] alispinlock: acceleration from lock integration on multi-core platform From: Ling Ma To: Waiman Long Cc: One Thousand Gnomes , Peter Zijlstra , mingo@redhat.com, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, Ling Content-Type: multipart/mixed; boundary=001a1142b97a41e8cf052fb4a8da Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 42728 Lines: 573 --001a1142b97a41e8cf052fb4a8da Content-Type: text/plain; charset=UTF-8 Hi Longman, > with some modest increase in performance. That can be hard to justify. Maybe > you should find other use cases that involve less changes, but still have > noticeable performance improvement. That will make it easier to be accepted. The attachment is for other use case with the new lock optimization. It include two files: main.c (user space workload), fcntl-lock-opt.patch (kernel patch on 4.3.0-rc4 version) (The hardware platform is on Intel E5 2699 V3, 72 threads (18core *2Socket *2HT) 1. when we run a.out from main.c on original 4.3.0-rc4 version, the average throughput from a.out is 1887592( 98% cpu cost from perf top -d1) 2. when we run a.out from main.c with the fcntl-lock-opt.patch , the average throughput from a.out is 5277281 (91% cpu cost from perf top -d1) So we say the new mechanism give us about 2.79x (5277281 / 1887592) improvement. Appreciate your comments. Thanks Ling --001a1142b97a41e8cf052fb4a8da Content-Type: application/x-tar; name="test-lock.tar" Content-Disposition: attachment; filename="test-lock.tar" Content-Transfer-Encoding: base64 X-Attachment-Id: f_immuyaw00 Li90ZXN0LWxvY2svAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMDAw MAAwMDAwMDAwADAwMDAwMDAwMDAwADEyNzAwNjI3MTY1ADAxMTYyNAAgNQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu L3Rlc3QtbG9jay9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwMDAwMDAw ADAwMDAwMDAAMDAwMDAwMDAwNDIAMTI3MDA2MjU1NjYAMDEzMjYzACAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFs bDoKCWdjYyAtZyAtTzIgbWFpbi5jIC1scHRocmVhZAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi90 ZXN0LWxvY2svZmNudGwtbG9jay1vcHQucGF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMDAwMAAw MDAwMDAwADAwMDAwMDM3MzIyADEyNzAwNjI1NzEwADAxNTUwMgAgMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGcm9t IDk2ODE5MTVlMzY0ZGNiOGJlMTZhZWQ0OWZkOGIyYzgwYTk1NzNkYTYgTW9uIFNlcCAxNyAwMDow MDowMCAyMDAxCkZyb206IHJvb3QgPHJvb3RAbG9jYWxob3N0LmxvY2FsZG9tYWluPgpEYXRlOiBT YXQsIDIgQXByIDIwMTYgMTQ6NDc6MjQgKzA4MDAKU3ViamVjdDogW1BBVENIXSBmY250bAoKLS0t CiBmcy9maWxlLmMgICAgICAgICAgICAgICAgICAgICAgIHwgICA0NCArKystCiBpbmNsdWRlL2Fz bS1nZW5lcmljL3FzcGlubG9jay5oIHwgICAgMyArLQogaW5jbHVkZS9saW51eC9zbGFiX2xvY2su aCAgICAgICB8ICA1NjcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAz IGZpbGVzIGNoYW5nZWQsIDYwNiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvc2xhYl9sb2NrLmgKCmRpZmYgLS1naXQgYS9mcy9m aWxlLmMgYi9mcy9maWxlLmMKaW5kZXggNmM2NzJhZC4uYTgyYmNmMyAxMDA2NDQKLS0tIGEvZnMv ZmlsZS5jCisrKyBiL2ZzL2ZpbGUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4 L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51 eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiX2xvY2suaD4KIAogaW50IHN5c2N0 bF9ucl9vcGVuIF9fcmVhZF9tb3N0bHkgPSAxMDI0KjEwMjQ7CiBpbnQgc3lzY3RsX25yX29wZW5f bWluID0gQklUU19QRVJfTE9ORzsKQEAgLTc1NywxNyArNzU4LDQ2IEBAIHVuc2lnbmVkIGxvbmcg X19mZGdldF9wb3ModW5zaWduZWQgaW50IGZkKQogICogZmlsZSBjb3VudCAoZG9uZSBlaXRoZXIg YnkgZmRnZXQoKSBvciBieSBmb3JrKCkpLgogICovCiAKK3N0cnVjdCBleGVjX3BhcmEgeworICAg ICAgICBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKyAgICAgICAgdW5zaWduZWQgZmQ7Cisg ICAgICAgIGludCBmbGFnOworfTsKKworc3RhdGljIHZvaWQgZXhlY19mbih2b2lkICpwKQorewor CXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJc3RydWN0IGV4ZWNfcGFyYSAqcGEgPSBwOworCisgICAg ICAgIGZkdCA9IGZpbGVzX2ZkdGFibGUocGEtPmZpbGVzKTsKKyAgICAgICAgaWYgKHBhLT5mbGFn KQorICAgICAgICAgICAgICAgIF9fc2V0X2Nsb3NlX29uX2V4ZWMocGEtPmZkLCBmZHQpOworICAg ICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19jbGVhcl9jbG9zZV9vbl9leGVjKHBhLT5mZCwg ZmR0KTsKKworfQogdm9pZCBzZXRfY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQsIGludCBm bGFnKQogeworCiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsK IAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0J ZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JaWYgKGZsYWcpCi0JCV9fc2V0X2Nsb3NlX29u X2V4ZWMoZmQsIGZkdCk7Ci0JZWxzZQotCQlfX2NsZWFyX2Nsb3NlX29uX2V4ZWMoZmQsIGZkdCk7 Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJhd19zcGlubG9ja190ICpsb2Nr OworCWFyY2hfc3BpbmxvY2tfdCAqYXJjaF9sb2NrOworCXN0cnVjdCBleGVjX3BhcmEgcGE7CisK KwlwYS5maWxlcyA9IGZpbGVzOworCXBhLmZkID0gZmQ7CisJcGEuZmxhZyA9IGZsYWc7CisKKwls b2NrID0gJmZpbGVzLT5maWxlX2xvY2sucmxvY2s7CisJYXJjaF9sb2NrID0gJmxvY2stPnJhd19s b2NrOworI2lmIDAKKwlvcmdfcXVldWVkX3NwaW5fbG9jayhhcmNoX2xvY2spOworCWV4ZWNfZm4o JnBhKTsKKwlvcmdfcXVldWVkX3NwaW5fdW5sb2NrKGFyY2hfbG9jayk7CisjZWxzZQorCWFsaV9z cGluX2xvY2soYXJjaF9sb2NrLCBleGVjX2ZuLCAmcGEpOworI2VuZGlmCiB9CiAKIGJvb2wgZ2V0 X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20t Z2VuZXJpYy9xc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcXNwaW5sb2NrLmgKaW5k ZXggZTJhYWRiYy4uMTdhZjZkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9xc3Bp bmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3FzcGlubG9jay5oCkBAIC03NiwxMCAr NzYsMTEgQEAgZXh0ZXJuIHZvaWQgcXVldWVkX3NwaW5fbG9ja19zbG93cGF0aChzdHJ1Y3QgcXNw aW5sb2NrICpsb2NrLCB1MzIgdmFsKTsKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBxdWV1 ZWRfc3Bpbl9sb2NrKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2spCiB7CiAJdTMyIHZhbDsKLQorcmVw ZWF0OgogCXZhbCA9IGF0b21pY19jbXB4Y2hnKCZsb2NrLT52YWwsIDAsIF9RX0xPQ0tFRF9WQUwp OwogCWlmIChsaWtlbHkodmFsID09IDApKQogCQlyZXR1cm47CisJZ290byByZXBlYXQ7CiAJcXVl dWVkX3NwaW5fbG9ja19zbG93cGF0aChsb2NrLCB2YWwpOwogfQogCmRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L3NsYWJfbG9jay5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2xvY2suaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUxZDllCi0tLSAvZGV2L251bGwKKysrIGIv aW5jbHVkZS9saW51eC9zbGFiX2xvY2suaApAQCAtMCwwICsxLDU2NyBAQAorI2lmbmRlZiBfTElO VVhfU0xBQl9MT0NLX0gKKyNkZWZpbmUJX0xJTlVYX1NMQUJfTE9DS19ICisjIGRlZmluZSBIUF9U SU1JTkdfTk9XKFZhcikgXAorICh7IHVuc2lnbmVkIGxvbmcgbG9uZyBfaGksIF9sbzsgXAorICBh c20gdm9sYXRpbGUgKCJyZHRzYyIgOiAiPWEiIChfbG8pLCAiPWQiIChfaGkpKTsgXAorICAoVmFy KSA9IF9oaSA8PCAzMiB8IF9sbzsgfSkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX3RvdGFsXyA9 IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfbnVtYmVyXyA9IDA7CitzdGF0aWMgIHZvaWQgYXRv bWljX2FkZHEodW5zaWduZWQgbG9uZyAqdiwgdW5zaWduZWQgbG9uZyBpKQoreworCWFzbSB2b2xh dGlsZSggIiBsb2NrIGFkZHEgJTEsJTAiCisJCSAgICAgOiAiK20iICgqdikKKwkJICAgICA6ICJp ciIgKGkpKTsKK30KKyNkZWZpbmUJX1FfU0VUX01BU0sodHlwZSkJKCgoMVUgPDwgX1FfICMjIHR5 cGUgIyMgX0JJVFMpIC0gMSlcCisJCQkJICAgICAgPDwgX1FfICMjIHR5cGUgIyMgX09GRlNFVCkK KyNkZWZpbmUgX1FfTE9DS0VEX09GRlNFVAkwCisjZGVmaW5lIF9RX0xPQ0tFRF9CSVRTCQk4Cisj ZGVmaW5lIF9RX0xPQ0tFRF9NQVNLCQlfUV9TRVRfTUFTSyhMT0NLRUQpCisKKyNkZWZpbmUgX1Ff UEVORElOR19PRkZTRVQJKF9RX0xPQ0tFRF9PRkZTRVQgKyBfUV9MT0NLRURfQklUUykKKyNpZiBD T05GSUdfTlJfQ1BVUyA8ICgxVSA8PCAxNCkKKyNkZWZpbmUgX1FfUEVORElOR19CSVRTCQk4Cisj ZWxzZQorI2RlZmluZSBfUV9QRU5ESU5HX0JJVFMJCTEKKyNlbmRpZgorI2RlZmluZSBfUV9QRU5E SU5HX01BU0sJCV9RX1NFVF9NQVNLKFBFTkRJTkcpCisKKyNkZWZpbmUgX1FfVEFJTF9JRFhfT0ZG U0VUCShfUV9QRU5ESU5HX09GRlNFVCArIF9RX1BFTkRJTkdfQklUUykKKyNkZWZpbmUgX1FfVEFJ TF9JRFhfQklUUwkyCisjZGVmaW5lIF9RX1RBSUxfSURYX01BU0sJX1FfU0VUX01BU0soVEFJTF9J RFgpCisKKyNkZWZpbmUgX1FfVEFJTF9DUFVfT0ZGU0VUCShfUV9UQUlMX0lEWF9PRkZTRVQgKyBf UV9UQUlMX0lEWF9CSVRTKQorI2RlZmluZSBfUV9UQUlMX0NQVV9CSVRTCSgzMiAtIF9RX1RBSUxf Q1BVX09GRlNFVCkKKyNkZWZpbmUgX1FfVEFJTF9DUFVfTUFTSwlfUV9TRVRfTUFTSyhUQUlMX0NQ VSkKKworI2RlZmluZSBfUV9UQUlMX09GRlNFVAkJX1FfVEFJTF9JRFhfT0ZGU0VUCisjZGVmaW5l IF9RX1RBSUxfTUFTSwkJKF9RX1RBSUxfSURYX01BU0sgfCBfUV9UQUlMX0NQVV9NQVNLKQorCisj ZGVmaW5lIF9RX0xPQ0tFRF9WQUwJCSgxVSA8PCBfUV9MT0NLRURfT0ZGU0VUKQorI2RlZmluZSBf UV9QRU5ESU5HX1ZBTAkJKDFVIDw8IF9RX1BFTkRJTkdfT0ZGU0VUKQorCisKKyNkZWZpbmUgX1Ff TE9DS0VEX1BFTkRJTkdfTUFTSyAoX1FfTE9DS0VEX01BU0sgfCBfUV9QRU5ESU5HX01BU0spCisK K3N0cnVjdCBfX3FzcGlubG9jayB7CisJdW5pb24geworCQlhdG9taWNfdCB2YWw7CisjaWZkZWYg X19MSVRUTEVfRU5ESUFOCisJCXN0cnVjdCB7CisJCQl1OAlsb2NrZWQ7CisJCQl1OAlwZW5kaW5n OworCQl9OworCQlzdHJ1Y3QgeworCQkJdTE2CWxvY2tlZF9wZW5kaW5nOworCQkJdTE2CXRhaWw7 CisJCX07CisjZWxzZQorCQlzdHJ1Y3QgeworCQkJdTE2CXRhaWw7CisJCQl1MTYJbG9ja2VkX3Bl bmRpbmc7CisJCX07CisJCXN0cnVjdCB7CisJCQl1OAlyZXNlcnZlZFsyXTsKKwkJCXU4CXBlbmRp bmc7CisJCQl1OAlsb2NrZWQ7CisJCX07CisjZW5kaWYKKwl9OworfTsKKworI2lmbmRlZiBhcmNo X21jc19zcGluX2xvY2tfY29udGVuZGVkCisvKgorICogVXNpbmcgc21wX2xvYWRfYWNxdWlyZSgp IHByb3ZpZGVzIGEgbWVtb3J5IGJhcnJpZXIgdGhhdCBlbnN1cmVzCisgKiBzdWJzZXF1ZW50IG9w ZXJhdGlvbnMgaGFwcGVuIGFmdGVyIHRoZSBsb2NrIGlzIGFjcXVpcmVkLgorICovCisjZGVmaW5l IGFyY2hfbmV3X3NwaW5fbG9ja19jb250ZW5kZWQobCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJ d2hpbGUgKCEoc21wX2xvYWRfYWNxdWlyZShsKSkpCQkJCQlcCisJCWNwdV9yZWxheF9sb3dsYXRl bmN5KCk7CQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgYXJjaF9uZXdfc3Bp bl91bmxvY2tfY29udGVuZGVkCisvKgorICogc21wX3N0b3JlX3JlbGVhc2UoKSBwcm92aWRlcyBh IG1lbW9yeSBiYXJyaWVyIHRvIGVuc3VyZSBhbGwKKyAqIG9wZXJhdGlvbnMgaW4gdGhlIGNyaXRp Y2FsIHNlY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZQorICogdW5sb2NraW5nLgorICov CisjZGVmaW5lIGFyY2hfbmV3X3NwaW5fdW5sb2NrX2NvbnRlbmRlZChsKQkJCQlcCisJc21wX3N0 b3JlX3JlbGVhc2UoKGwpLCAxKQorI2VuZGlmCisKKyNkZWZpbmUgQUxJX01BWF9OT0RFUwk0Citz dHJ1Y3QgYWxpX3NwaW5sb2NrIHsKKwlzdHJ1Y3QgYWxpX3NwaW5sb2NrICpuZXh0OworCXZvaWQg KnBhcmE7CisgICAgICAgIHZvaWQgKCpmbikodm9pZCAqKTsKKwlzdHJ1Y3QgYWxpX3NwaW5sb2Nr ICpsb2NrZWQ7CisJdTE2IGNvdW50OyAKKwlpbnQgdGFpbDsKK307CisKK3N0YXRpYyBERUZJTkVf UEVSX0NQVV9BTElHTkVEKHN0cnVjdCBhbGlfc3BpbmxvY2ssIGFsaV9ub2Rlc1tBTElfTUFYX05P REVTXSk7CisKK3R5cGVkZWYgc3RydWN0IGFsaXNwaW5sb2NrIHsKKwlhdG9taWNfdAl2YWw7Cit9 IGFsaV9zcGlubG9ja190OworCisjZGVmaW5lIF9BTElfVEFJTF9DUFVfT0ZGU0VUCTE4IAorI2Rl ZmluZSBfQUxJX1RBSUxfSURYX09GRlNFVAkoKDEgPDwgX0FMSV9UQUlMX0NQVV9PRkZTRVQpIC0g MSkKK3N0YXRpYyBpbmxpbmUgdTMyIGFsaV9lbmNvZGVfdGFpbChpbnQgY3B1LCBpbnQgaWR4KQor eworCXUzMiB0YWlsOworCisJdGFpbCAgPSAoY3B1ICsgMSkgPDwgX0FMSV9UQUlMX0NQVV9PRkZT RVQ7CisJdGFpbCB8PSBpZHggPDwgMTY7CisJCisJcmV0dXJuIHRhaWw7Cit9CisKK3N0YXRpYyBp bmxpbmUgc3RydWN0IGFsaV9zcGlubG9jayAqYWxpX2RlY29kZV90YWlsKHUzMiB0YWlsKQorewor CWludCBjcHUgPSAodGFpbCA+PiAgX0FMSV9UQUlMX0NQVV9PRkZTRVQpIC0gMTsKKwlpbnQgaWR4 ID0gKHRhaWwgJiAgX0FMSV9UQUlMX0lEWF9PRkZTRVQpID4+IDE2OworCisJcmV0dXJuIHBlcl9j cHVfcHRyKCZhbGlfbm9kZXNbaWR4XSwgY3B1KTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGlu ZSB1MzIgYWxpX3hjaGdfdGFpbChzdHJ1Y3QgYWxpc3BpbmxvY2sgKmxvY2ssIHUzMiB0YWlsKQor eworCXN0cnVjdCBfX3FzcGlubG9jayAqbCA9ICh2b2lkICopbG9jazsKKwl1MzIgdmFsOworCisJ dmFsID0gKHUzMil4Y2hnKCZsLT50YWlsLCB0YWlsID4+IDE2KSA8PCAxNjsKKworCXdoaWxlIChS RUFEX09OQ0UobG9jay0+dmFsLmNvdW50ZXIpICYgX1FfTE9DS0VEX1ZBTCkKKwkJY3B1X3JlbGF4 KCk7CisKKwlyZXR1cm4gdmFsOworfQorCit2b2lkICBhbGlfc3Bpbl9sb2NrKHN0cnVjdCBhbGlz cGlubG9jayAqbG9jaywgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICpwYXJhKQoreworCXN0cnVj dCBhbGlfc3BpbmxvY2sgKnByZXYsICpuZXh0LCAqbm9kZTsKKwl1MzIgIG9sZCwgdGFpbDsKKwlp bnQgaWR4OworCisJbm9kZSA9IHRoaXNfY3B1X3B0cigmYWxpX25vZGVzWzBdKTsKKwlpZHggPSBu b2RlLT5jb3VudCsrOworCXRhaWwgPSBhbGlfZW5jb2RlX3RhaWwoc21wX3Byb2Nlc3Nvcl9pZCgp LCBpZHgpOworCisJbm9kZSArPSBpZHg7CisJbm9kZS0+bG9ja2VkID0gbm9kZTsKKwlub2RlLT5u ZXh0ID0gTlVMTDsKKwlub2RlLT5mbiA9IGZuOworCW5vZGUtPnBhcmEgPSBwYXJhOworCW5vZGUt PnRhaWwgPSB0YWlsOworCisJb2xkID0gYWxpX3hjaGdfdGFpbChsb2NrLCB0YWlsKTsKKworCisJ aWYgKG9sZCkgeworCQlzdHJ1Y3QgYWxpX3NwaW5sb2NrICpzZWxmOworCQlwcmV2ID0gYWxpX2Rl Y29kZV90YWlsKG9sZCk7CisJCVdSSVRFX09OQ0UocHJldi0+bmV4dCwgbm9kZSk7CisKKwkJd2hp bGUoKHNlbGYgPSBub2RlLT5sb2NrZWQpICE9IE5VTEwpCisJCQlXUklURV9PTkNFKG5vZGUsIHNl bGYpOworCisJCXRoaXNfY3B1X2RlYyhhbGlfbm9kZXNbMF0uY291bnQpOworCQlyZXR1cm47CisJ fQorCQorCW9sZCA9IFJFQURfT05DRShsb2NrLT52YWwuY291bnRlcik7CityZXBlYXQ6CQorCXRh aWwgPSBub2RlLT50YWlsOworCWlmKG9sZCA9PSB0YWlsKQorCQlnb3RvIGVuZDsKKworCXdoaWxl ICghKG5leHQgPSBSRUFEX09OQ0Uobm9kZS0+bmV4dCkpKQorCQljcHVfcmVsYXgoKTsKKworCW5v ZGUtPmZuKG5vZGUtPnBhcmEpOworCW5vZGUtPmxvY2tlZCA9IE5VTEw7CisJdGFpbCA9IG5leHQt PnRhaWw7CisJaWYob2xkICE9IHRhaWwpIHsKKwkJd2hpbGUgKCEobm9kZSA9IFJFQURfT05DRShu ZXh0LT5uZXh0KSkpCisJCQljcHVfcmVsYXgoKTsKKwkJbmV4dC0+Zm4obmV4dC0+cGFyYSk7CisJ CW5leHQtPmxvY2tlZCA9IE5VTEw7CisJCWdvdG8gcmVwZWF0OworCQkKKwl9IGVsc2UKKwkJbm9k ZSA9IG5leHQ7CisKK2VuZDoKKwlub2RlLT5mbihub2RlLT5wYXJhKTsKKwlvbGQgPSBhdG9taWNf Y21weGNoZygmbG9jay0+dmFsLCBvbGQsIDApOworCisJaWYob2xkICE9IG5vZGUtPnRhaWwpIHsK KwkJd2hpbGUgKCEobmV4dCA9IFJFQURfT05DRShub2RlLT5uZXh0KSkpCisJCQljcHVfcmVsYXgo KTsKKwkJbm9kZS0+bG9ja2VkID0gTlVMTDsKKwkJbm9kZSA9IG5leHQ7CisJCWdvdG8gcmVwZWF0 OwkKKwkJCisJfQorCisJbm9kZS0+bG9ja2VkID0gTlVMTDsKKwl0aGlzX2NwdV9kZWMoYWxpX25v ZGVzWzBdLmNvdW50KTsKKwkJCisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCittY3MgbG9jaworKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwor I2RlZmluZSBNQVhfTk9ERVMJNAorCitzdHJ1Y3QgbWNzX3NwaW5sb2NrIHsKKwlzdHJ1Y3QgbWNz X3NwaW5sb2NrICpuZXh0OworCWludCBsb2NrZWQ7IC8qIDEgaWYgbG9jayBhY3F1aXJlZCAqLwor CWludCBjb3VudDsgIC8qIG5lc3RpbmcgY291bnQsIHNlZSBxc3BpbmxvY2suYyAqLworfTsKKwor c3RhdGljIERFRklORV9QRVJfQ1BVX0FMSUdORUQoc3RydWN0IG1jc19zcGlubG9jaywgbWNzX25v ZGVzW01BWF9OT0RFU10pOworI2lmIF9RX1BFTkRJTkdfQklUUyA9PSA4CisvKioKKyAqIGNsZWFy X3BlbmRpbmdfc2V0X2xvY2tlZCAtIHRha2Ugb3duZXJzaGlwIGFuZCBjbGVhciB0aGUgcGVuZGlu ZyBiaXQuCisgKiBAbG9jazogUG9pbnRlciB0byBxdWV1ZWQgc3BpbmxvY2sgc3RydWN0dXJlCisg KgorICogKiwxLDAgLT4gKiwwLDEKKyAqCisgKiBMb2NrIHN0ZWFsaW5nIGlzIG5vdCBhbGxvd2Vk IGlmIHRoaXMgZnVuY3Rpb24gaXMgdXNlZC4KKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2 b2lkIGNsZWFyX3BlbmRpbmdfc2V0X2xvY2tlZChzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQorewor CXN0cnVjdCBfX3FzcGlubG9jayAqbCA9ICh2b2lkICopbG9jazsKKworCVdSSVRFX09OQ0UobC0+ bG9ja2VkX3BlbmRpbmcsIF9RX0xPQ0tFRF9WQUwpOworfQorCisvKgorICogeGNoZ190YWlsIC0g UHV0IGluIHRoZSBuZXcgcXVldWUgdGFpbCBjb2RlIHdvcmQgJiByZXRyaWV2ZSBwcmV2aW91cyBv bmUKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1ZWQgc3BpbmxvY2sgc3RydWN0dXJlCisgKiBA dGFpbCA6IFRoZSBuZXcgcXVldWUgdGFpbCBjb2RlIHdvcmQKKyAqIFJldHVybjogVGhlIHByZXZp b3VzIHF1ZXVlIHRhaWwgY29kZSB3b3JkCisgKgorICogeGNoZyhsb2NrLCB0YWlsKQorICoKKyAq IHAsKiwqIC0+IG4sKiwqIDsgcHJldiA9IHhjaGcobG9jaywgbm9kZSkKKyAqLworc3RhdGljIF9f YWx3YXlzX2lubGluZSB1MzIgeGNoZ190YWlsKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2ssIHUzMiB0 YWlsKQoreworCXN0cnVjdCBfX3FzcGlubG9jayAqbCA9ICh2b2lkICopbG9jazsKKworCXJldHVy biAodTMyKXhjaGcoJmwtPnRhaWwsIHRhaWwgPj4gX1FfVEFJTF9PRkZTRVQpIDw8IF9RX1RBSUxf T0ZGU0VUOworfQorCisjZWxzZSAvKiBfUV9QRU5ESU5HX0JJVFMgPT0gOCAqLworCisvKioKKyAq IGNsZWFyX3BlbmRpbmdfc2V0X2xvY2tlZCAtIHRha2Ugb3duZXJzaGlwIGFuZCBjbGVhciB0aGUg cGVuZGluZyBiaXQuCisgKiBAbG9jazogUG9pbnRlciB0byBxdWV1ZWQgc3BpbmxvY2sgc3RydWN0 dXJlCisgKgorICogKiwxLDAgLT4gKiwwLDEKKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2 b2lkIGNsZWFyX3BlbmRpbmdfc2V0X2xvY2tlZChzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQorewor CWF0b21pY19hZGQoLV9RX1BFTkRJTkdfVkFMICsgX1FfTE9DS0VEX1ZBTCwgJmxvY2stPnZhbCk7 Cit9CisKKy8qKgorICogeGNoZ190YWlsIC0gUHV0IGluIHRoZSBuZXcgcXVldWUgdGFpbCBjb2Rl IHdvcmQgJiByZXRyaWV2ZSBwcmV2aW91cyBvbmUKKyAqIEBsb2NrIDogUG9pbnRlciB0byBxdWV1 ZWQgc3BpbmxvY2sgc3RydWN0dXJlCisgKiBAdGFpbCA6IFRoZSBuZXcgcXVldWUgdGFpbCBjb2Rl IHdvcmQKKyAqIFJldHVybjogVGhlIHByZXZpb3VzIHF1ZXVlIHRhaWwgY29kZSB3b3JkCisgKgor ICogeGNoZyhsb2NrLCB0YWlsKQorICoKKyAqIHAsKiwqIC0+IG4sKiwqIDsgcHJldiA9IHhjaGco bG9jaywgbm9kZSkKKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1MzIgeGNoZ190YWlsKHN0 cnVjdCBxc3BpbmxvY2sgKmxvY2ssIHUzMiB0YWlsKQoreworCXUzMiBvbGQsIG5ldywgdmFsID0g YXRvbWljX3JlYWQoJmxvY2stPnZhbCk7CisKKwlmb3IgKDs7KSB7CisJCW5ldyA9ICh2YWwgJiBf UV9MT0NLRURfUEVORElOR19NQVNLKSB8IHRhaWw7CisJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCZs b2NrLT52YWwsIHZhbCwgbmV3KTsKKwkJaWYgKG9sZCA9PSB2YWwpCisJCQlicmVhazsKKworCQl2 YWwgPSBvbGQ7CisJfQorCXJldHVybiBvbGQ7Cit9CisjZW5kaWYgLyogX1FfUEVORElOR19CSVRT ID09IDggKi8KKworCitzdGF0aWMgaW5saW5lIHUzMiBlbmNvZGVfdGFpbChpbnQgY3B1LCBpbnQg aWR4KQoreworCXUzMiB0YWlsOworCisJdGFpbCAgPSAoY3B1ICsgMSkgPDwgX1FfVEFJTF9DUFVf T0ZGU0VUOworCXRhaWwgfD0gaWR4IDw8IF9RX1RBSUxfSURYX09GRlNFVDsgLyogYXNzdW1lIDwg NCAqLworCisJcmV0dXJuIHRhaWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1jc19zcGlu bG9jayAqZGVjb2RlX3RhaWwodTMyIHRhaWwpCit7CisJaW50IGNwdSA9ICh0YWlsID4+IF9RX1RB SUxfQ1BVX09GRlNFVCkgLSAxOworCWludCBpZHggPSAodGFpbCAmICBfUV9UQUlMX0lEWF9NQVNL KSA+PiBfUV9UQUlMX0lEWF9PRkZTRVQ7CisKKwlyZXR1cm4gcGVyX2NwdV9wdHIoJm1jc19ub2Rl c1tpZHhdLCBjcHUpOworfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2V0X2xvY2tl ZChzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQoreworCXN0cnVjdCBfX3FzcGlubG9jayAqbCA9ICh2 b2lkICopbG9jazsKKworCVdSSVRFX09OQ0UobC0+bG9ja2VkLCBfUV9MT0NLRURfVkFMKTsKK30K K3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3B2X2luaXRfbm9kZShzdHJ1Y3QgbWNzX3Nw aW5sb2NrICpub2RlKSB7IH0KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3B2X3dhaXRf bm9kZShzdHJ1Y3QgbWNzX3NwaW5sb2NrICpub2RlKSB7IH0KK3N0YXRpYyBfX2Fsd2F5c19pbmxp bmUgdm9pZCBfX3B2X2tpY2tfbm9kZShzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrLAorCQkJCQkgICBz dHJ1Y3QgbWNzX3NwaW5sb2NrICpub2RlKSB7IH0KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9p ZCBfX3B2X3dhaXRfaGVhZChzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrLAorCQkJCQkgICBzdHJ1Y3Qg bWNzX3NwaW5sb2NrICpub2RlKSB7IH0KKworCisjZGVmaW5lIHB2X2VuYWJsZWQoKQkJZmFsc2UK KworI2RlZmluZSBwdl9pbml0X25vZGUJCV9fcHZfaW5pdF9ub2RlCisjZGVmaW5lIHB2X3dhaXRf bm9kZQkJX19wdl93YWl0X25vZGUKKyNkZWZpbmUgcHZfa2lja19ub2RlCQlfX3B2X2tpY2tfbm9k ZQorI2RlZmluZSBwdl93YWl0X2hlYWQJCV9fcHZfd2FpdF9oZWFkCisKKyNpZmRlZiBDT05GSUdf UEFSQVZJUlRfU1BJTkxPQ0tTCisjZGVmaW5lIG9yZ19xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRo CW5hdGl2ZV9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoCisjZW5kaWYKKyNpZm5kZWYgYXJjaF9t Y3Nfc3Bpbl9sb2NrX2NvbnRlbmRlZAorLyoKKyAqIFVzaW5nIHNtcF9sb2FkX2FjcXVpcmUoKSBw cm92aWRlcyBhIG1lbW9yeSBiYXJyaWVyIHRoYXQgZW5zdXJlcworICogc3Vic2VxdWVudCBvcGVy YXRpb25zIGhhcHBlbiBhZnRlciB0aGUgbG9jayBpcyBhY3F1aXJlZC4KKyAqLworI2RlZmluZSBh cmNoX21jc19zcGluX2xvY2tfY29udGVuZGVkKGwpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXdo aWxlICghKHNtcF9sb2FkX2FjcXVpcmUobCkpKQkJCQkJXAorCQljcHVfcmVsYXhfbG93bGF0ZW5j eSgpOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIGFyY2hfbWNzX3NwaW5f dW5sb2NrX2NvbnRlbmRlZAorLyoKKyAqIHNtcF9zdG9yZV9yZWxlYXNlKCkgcHJvdmlkZXMgYSBt ZW1vcnkgYmFycmllciB0byBlbnN1cmUgYWxsCisgKiBvcGVyYXRpb25zIGluIHRoZSBjcml0aWNh bCBzZWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUKKyAqIHVubG9ja2luZy4KKyAqLwor I2RlZmluZSBhcmNoX21jc19zcGluX3VubG9ja19jb250ZW5kZWQobCkJCQkJXAorCXNtcF9zdG9y ZV9yZWxlYXNlKChsKSwgMSkKKyNlbmRpZgorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQg X3F1ZXVlZF9wZW5kaW5nX2xvY2soc3RydWN0IHFzcGlubG9jayAqbG9jaykKK3sKKwlzdHJ1Y3Qg X19xc3BpbmxvY2sgKmwgPSAodm9pZCAqKWxvY2s7CisJd2hpbGUoY21weGNoZygmbC0+bG9ja2Vk X3BlbmRpbmcsIF9RX1BFTkRJTkdfVkFMLCBfUV9MT0NLRURfVkFMKSAhPSBfUV9MT0NLRURfVkFM KQorCQljcHVfcmVsYXgoKTsKK30KK3ZvaWQgIG9yZ19xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRo KHN0cnVjdCBxc3BpbmxvY2sgKmxvY2ssIHUzMiB2YWwpCit7CisJc3RydWN0IG1jc19zcGlubG9j ayAqcHJldiwgKm5leHQsICpub2RlOworCXUzMiBuZXcsIG9sZCwgdGFpbDsKKwlpbnQgaWR4Owor CisJQlVJTERfQlVHX09OKENPTkZJR19OUl9DUFVTID49ICgxVSA8PCBfUV9UQUlMX0NQVV9CSVRT KSk7CisKKwlpZiAocHZfZW5hYmxlZCgpKQorCQlnb3RvIHF1ZXVlOworCisJaWYgKHZpcnRfc3Bp bl9sb2NrKGxvY2spKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHdhaXQgZm9yIGluLXByb2dyZXNz IHBlbmRpbmctPmxvY2tlZCBoYW5kLW92ZXJzCisJICoKKwkgKiAwLDEsMCAtPiAwLDAsMQorCSAq LworCQorCWlmICh2YWwgPT0gX1FfUEVORElOR19WQUwpIHsKKwkJd2hpbGUgKCh2YWwgPSBhdG9t aWNfcmVhZCgmbG9jay0+dmFsKSkgPT0gX1FfUEVORElOR19WQUwpCisJCQljcHVfcmVsYXgoKTsK Kwl9CisKKwkvKgorCSAqIHRyeWxvY2sgfHwgcGVuZGluZworCSAqCisJICogMCwwLDAgLT4gMCww LDEgOyB0cnlsb2NrCisJICogMCwwLDEgLT4gMCwxLDEgOyBwZW5kaW5nCisJICovCisJZm9yICg7 OykgeworCQkvKgorCQkgKiBJZiB3ZSBvYnNlcnZlIGFueSBjb250ZW50aW9uOyBxdWV1ZS4KKwkJ ICovCisJCWlmICh2YWwgJiB+X1FfTE9DS0VEX01BU0spCisJCQlnb3RvIHF1ZXVlOworCisJCW5l dyA9IF9RX0xPQ0tFRF9WQUw7CisJCWlmICh2YWwgPT0gbmV3KQorCQkJbmV3IHw9IF9RX1BFTkRJ TkdfVkFMOworCisJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCZsb2NrLT52YWwsIHZhbCwgbmV3KTsK KwkJaWYgKG9sZCA9PSB2YWwpCisJCQlicmVhazsKKworCQl2YWwgPSBvbGQ7CisJfQorCisJLyoK KwkgKiB3ZSB3b24gdGhlIHRyeWxvY2sKKwkgKi8KKwlpZiAobmV3ID09IF9RX0xPQ0tFRF9WQUwp CisJCXJldHVybjsKKworCS8qCisJICogd2UncmUgcGVuZGluZywgd2FpdCBmb3IgdGhlIG93bmVy IHRvIGdvIGF3YXkuCisJICoKKwkgKiAqLDEsMSAtPiAqLDEsMAorCSAqCisJICogdGhpcyB3YWl0 IGxvb3AgbXVzdCBiZSBhIGxvYWQtYWNxdWlyZSBzdWNoIHRoYXQgd2UgbWF0Y2ggdGhlCisJICog c3RvcmUtcmVsZWFzZSB0aGF0IGNsZWFycyB0aGUgbG9ja2VkIGJpdCBhbmQgY3JlYXRlIGxvY2sK KwkgKiBzZXF1ZW50aWFsaXR5OyB0aGlzIGlzIGJlY2F1c2Ugbm90IGFsbCBjbGVhcl9wZW5kaW5n X3NldF9sb2NrZWQoKQorCSAqIGltcGxlbWVudGF0aW9ucyBpbXBseSBmdWxsIGJhcnJpZXJzLgor CSAqLworCQorIAkKKwl3aGlsZSAoKHZhbCA9IHNtcF9sb2FkX2FjcXVpcmUoJmxvY2stPnZhbC5j b3VudGVyKSkgJiBfUV9MT0NLRURfTUFTSykgeworCQljcHVfcmVsYXgoKTsKKwl9CisJLyoKKwkg KiB0YWtlIG93bmVyc2hpcCBhbmQgY2xlYXIgdGhlIHBlbmRpbmcgYml0LgorCSAqCisJICogKiwx LDAgLT4gKiwwLDEKKwkgKi8KKwljbGVhcl9wZW5kaW5nX3NldF9sb2NrZWQobG9jayk7CisJcmV0 dXJuOworCisJLyoKKwkgKiBFbmQgb2YgcGVuZGluZyBiaXQgb3B0aW1pc3RpYyBzcGlubmluZyBh bmQgYmVnaW5uaW5nIG9mIE1DUworCSAqIHF1ZXVpbmcuCisJICovCitxdWV1ZToKKwlub2RlID0g dGhpc19jcHVfcHRyKCZtY3Nfbm9kZXNbMF0pOworCWlkeCA9IG5vZGUtPmNvdW50Kys7CisJdGFp bCA9IGVuY29kZV90YWlsKHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKworCW5vZGUgKz0gaWR4 OworCW5vZGUtPmxvY2tlZCA9IDA7CisJbm9kZS0+bmV4dCA9IE5VTEw7CisJcHZfaW5pdF9ub2Rl KG5vZGUpOworCisJLyoKKwkgKiBXZSB0b3VjaGVkIGEgKHBvc3NpYmx5KSBjb2xkIGNhY2hlbGlu ZSBpbiB0aGUgcGVyLWNwdSBxdWV1ZSBub2RlOworCSAqIGF0dGVtcHQgdGhlIHRyeWxvY2sgb25j ZSBtb3JlIGluIHRoZSBob3BlIHNvbWVvbmUgbGV0IGdvIHdoaWxlIHdlCisJICogd2VyZW4ndCB3 YXRjaGluZy4KKwkgKi8KKwlpZiAocXVldWVkX3NwaW5fdHJ5bG9jayhsb2NrKSkKKwkJZ290byBy ZWxlYXNlOworCisJLyoKKwkgKiBXZSBoYXZlIGFscmVhZHkgdG91Y2hlZCB0aGUgcXVldWVpbmcg Y2FjaGVsaW5lOyBkb24ndCBib3RoZXIgd2l0aAorCSAqIHBlbmRpbmcgc3R1ZmYuCisJICoKKwkg KiBwLCosKiAtPiBuLCosKgorCSAqLworCW9sZCA9IHhjaGdfdGFpbChsb2NrLCB0YWlsKTsKKwor CS8qCisJICogaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgbm9kZTsgbGluayBpdCBhbmQgd2FpdCB1 bnRpbCByZWFjaGluZyB0aGUKKwkgKiBoZWFkIG9mIHRoZSB3YWl0cXVldWUuCisJICovCisJaWYg KG9sZCAmIF9RX1RBSUxfTUFTSykgeworCQlwcmV2ID0gZGVjb2RlX3RhaWwob2xkKTsKKwkJV1JJ VEVfT05DRShwcmV2LT5uZXh0LCBub2RlKTsKKworCQlwdl93YWl0X25vZGUobm9kZSk7CisJCWFy Y2hfbWNzX3NwaW5fbG9ja19jb250ZW5kZWQoJm5vZGUtPmxvY2tlZCk7CisJfQorCisJLyoKKwkg KiB3ZSdyZSBhdCB0aGUgaGVhZCBvZiB0aGUgd2FpdHF1ZXVlLCB3YWl0IGZvciB0aGUgb3duZXIg JiBwZW5kaW5nIHRvCisJICogZ28gYXdheS4KKwkgKgorCSAqICoseCx5IC0+ICosMCwwCisJICoK KwkgKiB0aGlzIHdhaXQgbG9vcCBtdXN0IHVzZSBhIGxvYWQtYWNxdWlyZSBzdWNoIHRoYXQgd2Ug bWF0Y2ggdGhlCisJICogc3RvcmUtcmVsZWFzZSB0aGF0IGNsZWFycyB0aGUgbG9ja2VkIGJpdCBh bmQgY3JlYXRlIGxvY2sKKwkgKiBzZXF1ZW50aWFsaXR5OyB0aGlzIGlzIGJlY2F1c2UgdGhlIHNl dF9sb2NrZWQoKSBmdW5jdGlvbiBiZWxvdworCSAqIGRvZXMgbm90IGltcGx5IGEgZnVsbCBiYXJy aWVyLgorCSAqCisJICovCisJcHZfd2FpdF9oZWFkKGxvY2ssIG5vZGUpOworCXdoaWxlICgodmFs ID0gc21wX2xvYWRfYWNxdWlyZSgmbG9jay0+dmFsLmNvdW50ZXIpKSAmIF9RX0xPQ0tFRF9QRU5E SU5HX01BU0spIHsKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJLyoKKwkgKiBjbGFpbSB0aGUgbG9j azoKKwkgKgorCSAqIG4sMCwwIC0+IDAsMCwxIDogbG9jaywgdW5jb250ZW5kZWQKKwkgKiAqLDAs MCAtPiAqLDAsMSA6IGxvY2ssIGNvbnRlbmRlZAorCSAqCisJICogSWYgdGhlIHF1ZXVlIGhlYWQg aXMgdGhlIG9ubHkgb25lIGluIHRoZSBxdWV1ZSAobG9jayB2YWx1ZSA9PSB0YWlsKSwKKwkgKiBj bGVhciB0aGUgdGFpbCBjb2RlIGFuZCBncmFiIHRoZSBsb2NrLiBPdGhlcndpc2UsIHdlIG9ubHkg bmVlZAorCSAqIHRvIGdyYWIgdGhlIGxvY2suCisJICovCisJZm9yICg7OykgeworCQlpZiAodmFs ICE9IHRhaWwpIHsKKwkJCXNldF9sb2NrZWQobG9jayk7CisJCQlicmVhazsKKwkJfQorCQlvbGQg PSBhdG9taWNfY21weGNoZygmbG9jay0+dmFsLCB2YWwsIF9RX0xPQ0tFRF9WQUwpOworCQlpZiAo b2xkID09IHZhbCkKKwkJCWdvdG8gcmVsZWFzZTsJLyogTm8gY29udGVudGlvbiAqLworCisJCXZh bCA9IG9sZDsKKwl9CisKKwkvKgorCSAqIGNvbnRlbmRlZCBwYXRoOyB3YWl0IGZvciBuZXh0LCBy ZWxlYXNlLgorCSAqLworCXdoaWxlICghKG5leHQgPSBSRUFEX09OQ0Uobm9kZS0+bmV4dCkpKQor CQljcHVfcmVsYXgoKTsKKworCWFyY2hfbWNzX3NwaW5fdW5sb2NrX2NvbnRlbmRlZCgmbmV4dC0+ bG9ja2VkKTsKKwlwdl9raWNrX25vZGUobG9jaywgbmV4dCk7CisKK3JlbGVhc2U6CisJLyoKKwkg KiByZWxlYXNlIHRoZSBub2RlCisJICovCisJdGhpc19jcHVfZGVjKG1jc19ub2Rlc1swXS5jb3Vu dCk7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBvcmdfcXVldWVkX3NwaW5fbG9j ayhzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBhdG9taWNf Y21weGNoZygmbG9jay0+dmFsLCAwLCBfUV9MT0NLRURfVkFMKTsKKwlpZiAobGlrZWx5KHZhbCA9 PSAwKSkKKwkJcmV0dXJuOworCW9yZ19xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoKGxvY2ssIHZh bCk7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBvcmdfcXVldWVkX3NwaW5fdW5s b2NrKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2spCit7CisJLyoKKwkgKiBzbXBfbWJfX2JlZm9yZV9h dG9taWMoKSBpbiBvcmRlciB0byBndWFyYW50ZWUgcmVsZWFzZSBzZW1hbnRpY3MKKwkgKi8KKwkv L3NtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKTsKKwlhdG9taWNfc3ViKF9RX0xPQ0tFRF9WQUws ICZsb2NrLT52YWwpOworfQorI2VuZGlmCS8qIF9MSU5VWF9TTEFCX0xPQ0tfSCAqLwotLSAKMS43 LjEKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAALi90ZXN0LWxvY2svbWFpbi5jAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADAwMDA2NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAzMjYzADEyNzAwNjI1NTYxADAx MjcxNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAg AHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c3RkaW8u aD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2luY2x1ZGUgPHN5 cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNs dWRlIDxzaWduYWwuaD4KCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldHBhY2tldC9w YWNrZXQuaD4KI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2luY2x1ZGUgPG5ldGluZXQv dGNwLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+IAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAK I2luY2x1ZGUgPHN5cy93YWl0Lmg+IAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxh cnBhL2luZXQuaD4KI2luY2x1ZGUgPHN5cy91bi5oPgoKI2luY2x1ZGUgPHRpbWUuaD4KCiNkZWZp bmUgTUFYX1RIUkVBRCA2NgppbnQgY291bnRbTUFYX1RIUkVBRF07CnZvaWQgc2lnX2hhbmRsZXIo aW50IHNpZ251bSkgIAp7ICAKICAgIHByaW50ZigiY2F0Y2ggU0lHSU5UXG4iKTsgIAp9ICAKICAK Y29uc3QgY2hhciAqc29ja2V0X3BhdGggPSAiL3RtcC90ZXN0LnNvY2siOwoKdm9pZCAqdGhyZWFk KHZvaWQgKnBhcmEpCnsKI2lmIDAKCWludCBpID0gKGludCkodW5zaWduZWQgbG9uZylwYXJhOwoJ c3RydWN0IHRpbWVzcGVjIHR2OwoJdHYudHZfbnNlYyA9MTsKCXR2LnR2X3NlYyA9MDsKCQoJaSA9 IGxpbmtfc2VydmVyKCJ0ZXN0Iik7Cgl3aGlsZSAoMSkKCXsKCQkvL3NldHVwX3NpZ25hbCgpOwoJ CQoJCS8vY2xvc2UoaSk7CgkJY2hhciBidWZbMV07CgkJd3JpdGUoaSwgYnVmLCBzaXplb2YoYnVm KSk7Cgl9CiNlbHNlCgljaGFyIHN0clszMl07CglzcHJpbnRmKHN0ciwgIi4vYS4lZC50ZXh0Iiwg cGFyYSk7CglpbnQgZiA9IG9wZW4oc3RyLCBPX0NSRUFUIHwgT19UUlVOQyk7CglpbnQgZmRzWzFd OwoJaW50IGk7CgkKCWlmIChmICA9PSAtMSApCgkJcHJpbnRmKCJlcnJvclxuIik7Cglmb3IgKGkg PSAwOyBpIDwgc2l6ZW9mKGZkcykgLyA0OyBpKyspCgkJCWZkc1tpXSA9IGR1cChmKTsKCXByaW50 ZigiZHVwIG9rICVkXG4iLCBwYXJhKTsJCQoJc2xlZXAoMik7Cgl3aGlsZSAoMSkKCXsJCQoJCWZv ciAoaSA9IDA7IGkgPCBzaXplb2YoZmRzKSAvIDQ7IGkrKykKCQl7CgkJCS8vZmxvY2soZmRzW2ld LCBMT0NLX1NIKTsKCQkJLy9mbG9jayhmZHNbaV0sIExPQ0tfVU4pOwoJCQlpbnQgZmQgPSBmZHNb aV07CgkJCWludCB2YWw9ZmNudGwoZmQsRl9HRVRGRCk7CgkJCXZhbHw9RkRfQ0xPRVhFQzsKCQkJ ZmNudGwoZmQsRl9TRVRGRCx2YWwpOwoJCQljb3VudFsoaW50KXBhcmFdICs9IDE7CgkJfQkJCgl9 CQojZW5kaWYKfQoKdm9pZCBtYWluKCkKewoJaW50IGk7CglwdGhyZWFkX3QgdGlkOwoKCWZvciAo aSA9IDA7IGkgPCBNQVhfVEhSRUFEOyBpKyspCgl7CgkJcHRocmVhZF9jcmVhdGUoJnRpZCwgTlVM TCwgdGhyZWFkLCBpKTsKCX0KCQoJd2hpbGUoMSkgewoJCXVuc2lnbmVkIGxvbmcgbnVtID0gMDsK CQlzbGVlcCgxKTsKCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RIUkVBRDsgaSsrKQoJCXsKCQkvLwlw cmludGYoInRocmVhZCAlZCAncyBwZXJmb3JtYW5jZSBjb3VudGVyIGlzICVkLlxuIiwgaSwgY291 bnRbaV0pOwoJCQludW0gKz0gY291bnRbaV07CgkJCWNvdW50W2ldID0gMDsKCQl9CgkJcHJpbnRm KCJcbiAlbGRcbiIsIG51bSk7Cgl9Cn0KCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA --001a1142b97a41e8cf052fb4a8da--