Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nrdhl-0006Dc-8e for pgsql-hackers@arkaria.postgresql.org; Thu, 19 May 2022 10:48:30 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nrdhj-0000Um-Qj for pgsql-hackers@arkaria.postgresql.org; Thu, 19 May 2022 10:48:27 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nrdhj-0000Ud-5d for pgsql-hackers@lists.postgresql.org; Thu, 19 May 2022 10:48:27 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nrdhe-0000CO-4S for pgsql-hackers@lists.postgresql.org; Thu, 19 May 2022 10:48:26 +0000 Received: from [192.168.28.53] (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 9564021C89E4; Thu, 19 May 2022 13:48:19 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1652957300; bh=ZgrJ6mqI60pgCLMfOEysU9QRwgQ3YwaxHlnHo+FC3uQ=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=ZVY9LFM+P3eemzjrHUuenRNRUkCOKZOYYlj6K7cF9ufL3RrY89L3mMFYV3kUxQiwa rXVikOlTfwYQjC4SXGt/FgZNoZxv34XnSWHDyUazKc19Ihgi2xSTe+yVuru+aUPU72 vu0Fp/TptRG3fueLyaa5oSCqxvnj3gFh+XZnYHBA= Content-Type: multipart/mixed; boundary="------------Oc8S0Z6y70bKiikVPvhmdCSv" Message-ID: Date: Thu, 19 May 2022 15:48:18 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: Removing unneeded self joins Content-Language: en-US To: Ronan Dunklau , Greg Stark Cc: Andres Freund , Laurenz Albe , Hywel Carver , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <2537176.Lt9SDvczpP@aivenronan> From: Andrey Lepikhov Organization: Postgres Professional In-Reply-To: <2537176.Lt9SDvczpP@aivenronan> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------Oc8S0Z6y70bKiikVPvhmdCSv Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 5/17/22 19:14, Ronan Dunklau wrote: > Le vendredi 13 mai 2022, 07:07:47 CEST Andrey Lepikhov a écrit : >> New version of the feature. >> Here a minor bug with RowMarks is fixed. A degenerated case is fixed, >> when uniqueness of an inner deduced not from join quals, but from a >> baserestrictinfo clauses 'x=const', where x - unique field. >> Code, dedicated to solve second issue is controversial, so i attached >> delta.txt for quick observation. >> Maybe we should return to previous version of code, when we didn't split >> restriction list into join quals and base quals? > > Hello, > > I tried to find problematic cases, which would make the planning time grow > unacceptably, and couldn't devise it. > > The worst case scenario I could think of was as follows: > > - a query with many different self joins > - an abundance of unique indexes on combinations of this table columns to > consider > - additional predicates on the where clause on columns. Looking into the patch I can imagine, that the most difficult case is when a set of relations with the same OID is huge, but only small part of them (or nothing) can be removed. Also, removing a clause from restrictinfo list or from equivalence class adds non-linear complexity. So, you can dig this way ). > > The base table I used for this was a table with 40 integers. 39 unique indexes > were defined on every combination of (c1, cX) with cX being columns c2 to c40. > > I turned geqo off, set from_collapse_limit and join_collapse_limit to > unreasonably high values (30), and tried to run queries of the form: > > SELECT * FROM test_table t1 > JOIN test_table tX ON t1.c1 = tX.c1 AND t1.c[X+2] = tX.cX > ... > JOIN test_table tX ON t1.c1 = tX.c1 AND t1.c[X+2] = tX.cX. > > So no self join can be eliminated in that case. I think, you should compare t1.cX with tX.cX to eliminate self-join. Cross-unique-index proof isn't supported now. > The performance was very similar with or without the GUC enabled. I tested the > same thing without the patch, since the test for uniqueness has been slightly > altered and incurs a new allocation, but it doesn't seem to change. > > One interesting side effect of this patch, is that removing any unneeded self > join cuts down the planification time very significantly, as we lower the number > of combinations to consider. Even more - removing a join we improve cardinality estimation. > > As for the code: > > - Comments on relation_has_unique_index_ext and relation_has_unique_index_for > should be rewritten, as relation_has_unique_index_for is now just a special > case of relation_has_unique_index_ext. By the way, the comment would probably > be better read as: "but if extra_clauses isn't NULL". > - The whole thing about "extra_clauses", ie, baserestrictinfos which were > used to determine uniqueness, is not very clear. Most functions where the new > argument has been added have not seen an update in their comments, and the > name itself doesn't really convey the intented meaning: perhaps > required_non_join_clauses ? > > The way this works should be explained a bit more thoroughly, for example in > remove_self_joins_one_group the purpose of uclauses should be explained. The > fact that degenerate_case returns true when we don't have any additional base > restrict info is also confusing, as well as the degenerate_case name. Agree, but after this case thoughts wander in my head: should we make one step back to pre-[1] approach? It looks like we have quite similar changes, but without special function for a 'degenerate case' detection and restrictlist splitting. > > I'll update if I think of more interesting things to add. Thank you for your efforts! See in attachment next version which fixes mistakes detected by zyu@yugabyte.com. [1] https://www.postgresql.org/message-id/raw/CAApHDvpggnFMC4yP-jUO7PKN%3DfXeErW5bOxisvJ0HvkHQEY%3DWw%40mail.gmail.com -- Regards Andrey Lepikhov Postgres Professional --------------Oc8S0Z6y70bKiikVPvhmdCSv Content-Type: text/x-patch; charset=UTF-8; name="v34-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v34-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSAxNzc0YjRiY2ZlMzM3YjE1MWI3NmM3ZjM1N2RjNjc0ODc1NWJmMWQ5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAxNSBKdWwgMjAyMSAxNToyNjoxMyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKQSBTZWxmIEpvaW4gUmVt b3ZhbCAoU0pSKSBmZWF0dXJlIHJlbW92ZXMgaW5uZXIgam9pbiBvZiBwbGFuZSB0YWJsZSB0 byBpdHNlbGYKaW4gYSBxdWVyeSBwbGFuIGlmIGNhbiBiZSBwcm92ZWQgdGhhdCB0aGUgam9p biBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIHNjYW4uClRoZSBwcm9vZiBiYXNlZCBvbiBpbm5l cnJlbF9pc191bmlxdWUgbWFjaGluZXJ5LgoKV2UgY2FuIHJlbW92ZSBhIHNlbGYtam9pbiB3 aGVuIGZvciBlYWNoIG91dGVyIHJvdzoKMS4gQXQgbW9zdCBvbmUgaW5uZXIgcm93IG1hdGNo ZXMgdGhlIGpvaW4gY2xhdXNlcy4KMi4gSWYgdGhlIGpvaW4gdGFyZ2V0IGxpc3QgY29udGFp bnMgYW55IGlubmVyIHZhcnMsIGFuIGlubmVyIHJvdwptdXN0IGJlIChwaHlzaWNhbGx5KSB0 aGUgc2FtZSByb3cgYXMgdGhlIG91dGVyIG9uZS4KCkluIHRoaXMgcGF0Y2ggd2UgdXNlIFJv d2xleSdzIFsxXSBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVj dCBhbGwgbWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIHdoaWNoIGxvb2sgbGlrZSBhLnggPSBi LngKMi4gQ2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJv bSAoMSkuIElmIGl0CnJldHVybnMgdHJ1ZSwgdGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5 IHRoZSBzYW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpyZWxhdGlvbi4KMy4gSWYgdW5pcXVlbmVz cyBvZiBvdXRlciByZWxhdGlvbiBkZWR1Y2VzIGZyb20gYmFzZXJlc3RyaWN0aW5mbyBjbGF1 c2UgbGlrZQoneD1jb25zdCcgb24gdW5pcXVlIGZpZWxkKHMpLCBjaGVjayB0aGF0IGlubmVy IGhhcyB0aGUgc2FtZSBjbGF1c2Ugd2l0aCB0aGUKc2FtZSBjb25zdGFudChzKS4KNC4gQ29t cGFyZSBSb3dNYXJrcyBvZiBpbm5lciBhbmQgb3V0ZXIgcmVsYXRpb25zLiBUaGV5IG11c3Qg aGF2ZSB0aGUgc2FtZQpzdHJlbmd0aC4KClNvbWUgcmVncmVzc2lvbiB0ZXN0cyBjaGFuZ2Vk IGR1ZSB0byBzZWxmLWpvaW4gcmVtb3ZhbCBsb2dpYy4KClsxXSBodHRwczovL3d3dy5wb3N0 Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL3Jhdy9DQUFwSER2cGdnbkZNQzR5UC1qVU83UEtOJTNE ZlhlRXJXNWJPeGlzdkowSHZrSFFFWSUzRFd3JTQwbWFpbC5nbWFpbC5jb20KLS0tCiBzcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jICAgICB8ICAgMzEgKwogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMgfCAxMDE2ICsrKysrKysrKysr KysrKysrKysrLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyAgICAg fCAgICA1ICsKIHNyYy9iYWNrZW5kL29wdGltaXplci91dGlsL2pvaW5pbmZvLmMgICAgIHwg ICAgMyArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMgICAgICB8ICAg MjYgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjLmMgICAgICAgICAgICAgIHwgICAx MCArCiBzcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUuaCAgICAgICAgICB8ICAgIDQg Kwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggICAgICAgICAgICAgfCAgICAzICsK IHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAgICAgIHwgICAgNiArCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0ICB8ICAgMzIgKwogc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgfCAgNjQ4ICsrKysrKysr KysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAg MyArLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwgICAgICAgfCAgIDE2 ICsKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsICAgICAgICAgICAgIHwgIDI4NiAr KysrKysKIDE0IGZpbGVzIGNoYW5nZWQsIDIwNDggaW5zZXJ0aW9ucygrKSwgNDEgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBh dGguYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKaW5kZXggMGVm NzBhZDdmMS4uMzY5MGY3ZmVhZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4 cGF0aC5jCkBAIC0zNDk4LDggKzM0OTgsMjQgQEAgYm9vbAogcmVsYXRpb25faGFzX3VuaXF1 ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJ CQkgIExpc3QgKnJlc3RyaWN0bGlzdCwKIAkJCQkJCQkgIExpc3QgKmV4cHJsaXN0LCBMaXN0 ICpvcHJsaXN0KQoreworCXJldHVybiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChy b290LCByZWwsIHJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJCQkgZXhwcmxpc3QsIG9wcmxpc3Qs IE5VTEwpOworfQorCisvKgorICogcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQKKyAq IGlmIGV4dHJhX2NsYXVzZXMgaXNuJ3QgTlVMTCwgcmV0dXJuIGJhc2VyZXN0cmljdGluZm8g Y2xhdXNlcyB3aGljaCB3ZXJlCisgKiB1c2VkIHRvIGRlcml2ZSB1bmlxdWVuZXNzLgorICov Citib29sCityZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJ CQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QsCisJCQkJCQkJICBMaXN0ICoq ZXh0cmFfY2xhdXNlcykKIHsKIAlMaXN0Q2VsbCAgICppYzsKKwlMaXN0CSAgICpleHByczsK IAogCUFzc2VydChsaXN0X2xlbmd0aChleHBybGlzdCkgPT0gbGlzdF9sZW5ndGgob3BybGlz dCkpOwogCkBAIC0zNTU0LDYgKzM1NzAsOCBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4 X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQlJbmRleE9wdElu Zm8gKmluZCA9IChJbmRleE9wdEluZm8gKikgbGZpcnN0KGljKTsKIAkJaW50CQkJYzsKIAor CQlleHBycyA9IE5JTDsKKwogCQkvKgogCQkgKiBJZiB0aGUgaW5kZXggaXMgbm90IHVuaXF1 ZSwgb3Igbm90IGltbWVkaWF0ZWx5IGVuZm9yY2VkLCBvciBpZiBpdCdzCiAJCSAqIGEgcGFy dGlhbCBpbmRleCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHF1ZXJ5LCBpdCdzIHVzZWxlc3Mg aGVyZS4KQEAgLTM2MDAsNyArMzYxOCwxNiBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4 X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCiAJCQkJaWYgKG1h dGNoX2luZGV4X3RvX29wZXJhbmQocmV4cHIsIGMsIGluZCkpCiAJCQkJeworCQkJCQlNZW1v cnlDb250ZXh0IG9sZENvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ocm9vdC0+cGxh bm5lcl9jeHQpOworCiAJCQkJCW1hdGNoZWQgPSB0cnVlOyAvKiBjb2x1bW4gaXMgdW5pcXVl ICovCisKKwkJCQkJLyogU3RvcmUgYSBmaWx0ZXIgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9u cy4gKi8KKwkJCQkJaWYgKGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CisJ CQkJCQlibXNfaXNfZW1wdHkocmluZm8tPnJpZ2h0X3JlbGlkcykpCisJCQkJCQlleHBycyA9 IGxhcHBlbmQoZXhwcnMsIHJpbmZvKTsKKworCQkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o b2xkQ29udGV4dCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTM2NDMsNyArMzY3 MCwxMSBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAogCiAJCS8qIE1hdGNoZWQgYWxsIGtleSBjb2x1bW5zIG9m IHRoaXMgaW5kZXg/ICovCiAJCWlmIChjID09IGluZC0+bmtleWNvbHVtbnMpCisJCXsKKwkJ CWlmIChleHRyYV9jbGF1c2VzKQorCQkJCSpleHRyYV9jbGF1c2VzID0gZXhwcnM7CiAJCQly ZXR1cm4gdHJ1ZTsKKwkJfQogCX0KIAogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMKaW5kZXggMzM3ZjQ3MGQ1OC4uYTc4YmEz ZGFlYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpv aW5zLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMK QEAgLTIyLDYgKzIyLDcgQEAKICAqLwogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNs dWRlICJjYXRhbG9nL3BnX2NsYXNzLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgi CiAjaW5jbHVkZSAib3B0aW1pemVyL2NsYXVzZXMuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIv am9pbmluZm8uaCIKQEAgLTMyLDIxICszMyw0MCBAQAogI2luY2x1ZGUgIm9wdGltaXplci90 bGlzdC5oIgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgogCisvKgorICogVW5pcXVl UmVsSW5mbyBjYWNoZXMgYSBmYWN0IHRoYXQgYSByZWxhdGlvbiBpcyB1bmlxdWUgd2hlbiBi ZWluZyBqb2luZWQKKyAqIHRvIG90aGVyIHJlbGF0aW9uKHMpIHNwZWNpZmllZCBieSBvdXRl cnJlbGlkcy4KKyAqIGV4dHJhX2NsYXVzZXMgY29udGFpbnMgYWRkaXRpb25hbCBjbGF1c2Vz IGZyb20gYSBiYXNlcmVzdHJpY3RpbmZvIGxpc3QgdGhhdAorICogd2VyZSB1c2VkIHRvIHBy b3ZlIHVuaXF1ZW5lc3MuIFdlIGNhY2hlIGl0IGZvciBTSiBjaGVja2luZyBwcm9jZWR1cmU6 IFNKIGNhbgorICogYmUgcmVtb3ZlZCBpZiBvdXRlciByZWxhdGlvbiBjb250YWlucyBzdHJp Y3RseSB0aGUgc2FtZSBzZXQgb2YgY2xhdXNlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVW5p cXVlUmVsSW5mbworeworCVJlbGlkcwkJb3V0ZXJyZWxpZHM7CisJTGlzdAkgICAqZXh0cmFf Y2xhdXNlczsKK30gVW5pcXVlUmVsSW5mbzsKKworYm9vbCBlbmFibGVfc2VsZl9qb2luX3Jl bW92YWw7CisKIC8qIGxvY2FsIGZ1bmN0aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19y ZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsK IHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwg aW50IHJlbGlkLAotCQkJCQkJCQkgIFJlbGlkcyBqb2lucmVsaWRzKTsKKwkJCQkJCQkJICBS ZWxpZHMgam9pbnJlbGlkcywgaW50IHN1YnN0X3JlbGlkKTsKIHN0YXRpYyBMaXN0ICpyZW1v dmVfcmVsX2Zyb21fam9pbmxpc3QoTGlzdCAqam9pbmxpc3QsIGludCByZWxpZCwgaW50ICpu cmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCByZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOwogc3RhdGljIGJvb2wgcmVsX2lzX2Rp c3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAotCQkJCQkJ CQlMaXN0ICpjbGF1c2VfbGlzdCk7CisJCQkJCQkJCUxpc3QgKmNsYXVzZV9saXN0LCBMaXN0 ICoqZXh0cmFfY2xhdXNlcyk7CiBzdGF0aWMgT2lkCWRpc3RpbmN0X2NvbF9zZWFyY2goaW50 IGNvbG5vLCBMaXN0ICpjb2xub3MsIExpc3QgKm9waWRzKTsKIHN0YXRpYyBib29sIGlzX2lu bmVycmVsX3VuaXF1ZV9mb3IoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCSAgIFJlbGlk cyBqb2lucmVsaWRzLAogCQkJCQkJCQkgICBSZWxpZHMgb3V0ZXJyZWxpZHMsCiAJCQkJCQkJ CSAgIFJlbE9wdEluZm8gKmlubmVycmVsLAogCQkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlw ZSwKLQkJCQkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0KTsKKwkJCQkJCQkJICAgTGlzdCAq cmVzdHJpY3RsaXN0LAorCQkJCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CitzdGF0 aWMgdm9pZCBjaGFuZ2VfcmluZm8oUmVzdHJpY3RJbmZvKiByaW5mbywgSW5kZXggZnJvbSwg SW5kZXggdG8pOworc3RhdGljIEJpdG1hcHNldCogY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxp ZHMsIEluZGV4IG9sZElkLCBJbmRleCBuZXdJZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFy bm8oRXhwciAqZXhwciwgSW5kZXggb2xkUmVsaWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAv KgpAQCAtODYsNyArMTA2LDcgQEAgcmVzdGFydDoKIAogCQlyZW1vdmVfcmVsX2Zyb21fcXVl cnkocm9vdCwgaW5uZXJyZWxpZCwKIAkJCQkJCQkgIGJtc191bmlvbihzamluZm8tPm1pbl9s ZWZ0aGFuZCwKLQkJCQkJCQkJCQlzamluZm8tPm1pbl9yaWdodGhhbmQpKTsKKwkJCQkJCQkJ CQlzamluZm8tPm1pbl9yaWdodGhhbmQpLCAwKTsKIAogCQkvKiBXZSB2ZXJpZnkgdGhhdCBl eGFjdGx5IG9uZSByZWZlcmVuY2UgZ2V0cyByZW1vdmVkIGZyb20gam9pbmxpc3QgKi8KIAkJ bnJlbW92ZWQgPSAwOwpAQCAtMjg3LDcgKzMwNyw3IEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBs YW5uZXJJbmZvICpyb290LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAkgKiBOb3cgdGhh dCB3ZSBoYXZlIHRoZSByZWxldmFudCBlcXVhbGl0eSBqb2luIGNsYXVzZXMsIHRyeSB0byBw cm92ZSB0aGUKIAkgKiBpbm5lcnJlbCBkaXN0aW5jdC4KIAkgKi8KLQlpZiAocmVsX2lzX2Rp c3RpbmN0X2Zvcihyb290LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3QpKQorCWlmIChyZWxfaXNf ZGlzdGluY3RfZm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCwgTlVMTCkpCiAJCXJl dHVybiB0cnVlOwogCiAJLyoKQEAgLTMwMCw3ICszMjAsMTAgQEAgam9pbl9pc19yZW1vdmFi bGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKQogCiAvKgog ICogUmVtb3ZlIHRoZSB0YXJnZXQgcmVsaWQgZnJvbSB0aGUgcGxhbm5lcidzIGRhdGEgc3Ry dWN0dXJlcywgaGF2aW5nCi0gKiBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0 byBpbmNsdWRlIGl0IGluIHRoZSBxdWVyeS4KKyAqIGRldGVybWluZWQgdGhhdCB0aGVyZSBp cyBubyBuZWVkIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHF1ZXJ5LiBPciByZXBsYWNlCisgKiB3 aXRoIGFub3RoZXIgcmVsaWQuCisgKiBUbyByZXVzYWJpbGl0eSwgdGhpcyByb3V0aW5lIGNh biB3b3JrIGluIHR3byBtb2RlczogZGVsZXRlIHJlbGlkIGZyb20gYSBwbGFuCisgKiBvciBy ZXBsYWNlIGl0LiBJdCBpcyB1c2VkIGluIHJlcGxhY2UgbW9kZSBpbiBhIHNlbGYtam9pbiBy ZW1vdmluZyBwcm9jZXNzLgogICoKICAqIFdlIGFyZSBub3QgdGVycmlibHkgdGhvcm91Z2gg aGVyZS4gIFdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHJlbCBpcwogICogbm8gbG9uZ2Vy IHRyZWF0ZWQgYXMgYSBiYXNlcmVsLCBhbmQgdGhhdCBhdHRyaWJ1dGVzIG9mIG90aGVyIGJh c2VyZWxzCkBAIC0zMDksMTMgKzMzMiwxNiBAQCBqb2luX2lzX3JlbW92YWJsZShQbGFubmVy SW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCiAgKiBsaXN0cywgYnV0IG9u bHkgaWYgdGhleSBiZWxvbmcgdG8gdGhlIG91dGVyIGpvaW4gaWRlbnRpZmllZCBieSBqb2lu cmVsaWRzLgogICovCiBzdGF0aWMgdm9pZAotcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5u ZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQorcmVtb3ZlX3Jl bF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lu cmVsaWRzLAorCQkJCQkgIGludCBzdWJzdF9yZWxpZCkKIHsKIAlSZWxPcHRJbmZvICpyZWwg PSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKIAlMaXN0CSAgICpqb2luaW5mb3M7CiAJ SW5kZXgJCXJ0aTsKIAlMaXN0Q2VsbCAgICpsOwogCisJQXNzZXJ0KHN1YnN0X3JlbGlkID09 IDAgfHwgcmVsaWQgIT0gc3Vic3RfcmVsaWQpOworCiAJLyoKIAkgKiBNYXJrIHRoZSByZWwg YXMgImRlYWQiIHRvIHNob3cgaXQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGpvaW4gdHJl ZS4KIAkgKiAoUmVtb3ZpbmcgaXQgZnJvbSB0aGUgYmFzZXJlbCBhcnJheSBhbHRvZ2V0aGVy IHNlZW1zIHRvbyByaXNreS4pCkBAIC0zNDUsOCArMzcxLDExIEBAIHJlbW92ZV9yZWxfZnJv bV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlk cykKIAkJCSBhdHRyb2ZmLS0pCiAJCXsKIAkJCW90aGVycmVsLT5hdHRyX25lZWRlZFthdHRy b2ZmXSA9Ci0JCQkJYm1zX2RlbF9tZW1iZXIob3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJv ZmZdLCByZWxpZCk7CisJCQkJY2hhbmdlX3JlbGlkKG90aGVycmVsLT5hdHRyX25lZWRlZFth dHRyb2ZmXSwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAkJfQorCisJCS8qIFVwZGF0ZSBsYXRl cmFsIHJlZmVyZW5jZXMuICovCisJCWNoYW5nZV92YXJubygoRXhwciopb3RoZXJyZWwtPmxh dGVyYWxfdmFycywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAl9CiAKIAkvKgpAQCAtMzYxLDEw ICszOTAsMTIgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBp bnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCXsKIAkJU3BlY2lhbEpvaW5JbmZvICpz amluZm8gPSAoU3BlY2lhbEpvaW5JbmZvICopIGxmaXJzdChsKTsKIAotCQlzamluZm8tPm1p bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+bWluX2xlZnRoYW5kLCByZWxp ZCk7Ci0JCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+ bWluX3JpZ2h0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPnN5bl9sZWZ0aGFuZCA9IGJtc19k ZWxfbWVtYmVyKHNqaW5mby0+c3luX2xlZnRoYW5kLCByZWxpZCk7Ci0JCXNqaW5mby0+c3lu X3JpZ2h0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+c3luX3JpZ2h0aGFuZCwgcmVs aWQpOworCQlzamluZm8tPm1pbl9sZWZ0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPm1p bl9sZWZ0aGFuZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJc2ppbmZvLT5taW5fcmlnaHRo YW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+bWluX3JpZ2h0aGFuZCwgcmVsaWQsIHN1YnN0 X3JlbGlkKTsKKwkJc2ppbmZvLT5zeW5fbGVmdGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZv LT5zeW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+c3luX3Jp Z2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8tPnN5bl9yaWdodGhhbmQsIHJlbGlkLCBz dWJzdF9yZWxpZCk7CisKKwkJY2hhbmdlX3Zhcm5vKChFeHByKilzamluZm8tPnNlbWlfcmhz X2V4cHJzLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCX0KIAogCS8qCkBAIC0zODUsMTYgKzQx NiwyOSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCBy ZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJewogCQlQbGFjZUhvbGRlckluZm8gKnBoaW5m byA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGwpOwogCi0JCUFzc2VydCghYm1zX2lz X21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9sYXRlcmFsKSk7Ci0JCWlmIChibXNfaXNfc3Vi c2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRzKSAmJgorCQlpZiAoc3Vic3RfcmVs aWQgPT0gMCAmJiBibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRz KSAmJgogCQkJYm1zX2lzX21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9ldmFsX2F0KSkKIAkJ CXJvb3QtPnBsYWNlaG9sZGVyX2xpc3QgPSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KHJvb3Qt PnBsYWNlaG9sZGVyX2xpc3QsCiAJCQkJCQkJCQkJCQkJCQlsKTsKIAkJZWxzZQogCQl7Ci0J CQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNfZGVsX21lbWJlcihwaGluZm8tPnBoX2V2YWxf YXQsIHJlbGlkKTsKKwkJCXBoaW5mby0+cGhfZXZhbF9hdCA9IGNoYW5nZV9yZWxpZChwaGlu Zm8tPnBoX2V2YWxfYXQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJCQlBc3NlcnQoIWJtc19p c19lbXB0eShwaGluZm8tPnBoX2V2YWxfYXQpKTsKLQkJCXBoaW5mby0+cGhfbmVlZGVkID0g Ym1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9uZWVkZWQsIHJlbGlkKTsKKwkJCXBoaW5mby0+ cGhfbmVlZGVkID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbmVlZGVkLCByZWxpZCwgc3Vi c3RfcmVsaWQpOworCQkJQXNzZXJ0KHN1YnN0X3JlbGlkICE9IDAgfHwgIWJtc19pc19tZW1i ZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0ZXJhbCkpOworCQkJcGhpbmZvLT5waF9sYXRlcmFs ID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfbGF0ZXJhbCwgcmVsaWQsIHN1YnN0X3JlbGlk KTsKKwkJCXBoaW5mby0+cGhfdmFyLT5waHJlbHMgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5w aF92YXItPnBocmVscywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJfQorCX0KKworCWlmIChz dWJzdF9yZWxpZCAhPSAwKQorCXsKKwkJZm9yZWFjaChsLCByZWwtPmJhc2VyZXN0cmljdGlu Zm8pCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxm aXJzdChsKTsKKworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVsaWQp OworCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGluZm9fdG9fcmVscyhyb290LCByaW5mbyk7CiAJ CX0KIAl9CiAKQEAgLTQxOCw2ICs0NjIsNyBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxh bm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCVJlc3Ry aWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsKTsKIAogCQlyZW1v dmVfam9pbl9jbGF1c2VfZnJvbV9yZWxzKHJvb3QsIHJpbmZvLCByaW5mby0+cmVxdWlyZWRf cmVsaWRzKTsKKwkJY2hhbmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVsaWQpOwog CiAJCWlmIChSSU5GT19JU19QVVNIRURfRE9XTihyaW5mbywgam9pbnJlbGlkcykpCiAJCXsK QEAgLTQzMyw2ICs0NzgsOCBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8g KnJvb3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCQkJCQkJCQkJCQkJcmVs aWQpOwogCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGluZm9fdG9fcmVscyhyb290LCByaW5mbyk7 CiAJCX0KKwkJZWxzZSBpZiAoc3Vic3RfcmVsaWQgIT0gMCkKKwkJCWRpc3RyaWJ1dGVfcmVz dHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCX0KIAogCS8qCkBAIC02MzYsOSAr NjgzLDE0IEBAIHJlbF9zdXBwb3J0c19kaXN0aW5jdG5lc3MoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCkKICAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIGNsYXVzZV9s aXN0IG1heSBiZSBkZXN0cnVjdGl2ZWx5IG1vZGlmaWVkISAgVGhpcwogICogaXMgT0sgZm9y IGN1cnJlbnQgdXNlcywgYmVjYXVzZSB0aGUgY2xhdXNlX2xpc3QgaXMgYnVpbHQgYnkgdGhl IGNhbGxlciBmb3IKICAqIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcGFzc2luZyB0byB0aGlzIGZ1 bmN0aW9uLgorICoKKyAqIG91dGVyX2V4cHJzIGNvbnRhaW5zIHJpZ2h0IHNpZGVzIG9mIGJh c2VyZXN0cmljdGluZm8gY2xhdXNlcyBsb29rcyBsaWtlCisgKiB4ID0gY29uc3QgaWYgZGlz dGluY3RuZXNzIGlzIGRlcml2ZWQgZnJvbSBzdWNoIGNsYXVzZXMsIG5vdCBqb2luaW5mbyBj bGF1c2UuCisgKiBQYXNzIE5VTEwgZm9yIHRoZSBwYXJhbSB2YWx1ZSwgaWYgaXQgaXMgbm90 IGludGVyZXN0ZWQuCiAgKi8KIHN0YXRpYyBib29sCi1yZWxfaXNfZGlzdGluY3RfZm9yKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNsYXVzZV9saXN0KQor cmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LCBMaXN0ICpjbGF1c2VfbGlzdCwKKwkJCQkJTGlzdCAqKmV4dHJhX2NsYXVzZXMpCiB7CiAJ LyoKIAkgKiBXZSBjb3VsZCBza2lwIGEgY291cGxlIG9mIHRlc3RzIGhlcmUgaWYgd2UgYXNz dW1lIGFsbCBjYWxsZXJzIGNoZWNrZWQKQEAgLTY1MSwxMCArNzAzLDExIEBAIHJlbF9pc19k aXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgTGlzdCAq Y2xhdXNlX2xpc3QpCiAJewogCQkvKgogCQkgKiBFeGFtaW5lIHRoZSBpbmRleGVzIHRvIHNl ZSBpZiB3ZSBoYXZlIGEgbWF0Y2hpbmcgdW5pcXVlIGluZGV4LgotCQkgKiByZWxhdGlvbl9o YXNfdW5pcXVlX2luZGV4X2ZvciBhdXRvbWF0aWNhbGx5IGFkZHMgYW55IHVzYWJsZQorCQkg KiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dCBhdXRvbWF0aWNhbGx5IGFkZHMgYW55 IHVzYWJsZQogCQkgKiByZXN0cmljdGlvbiBjbGF1c2VzIGZvciB0aGUgcmVsLCBzbyB3ZSBu ZWVkbid0IGRvIHRoYXQgaGVyZS4KIAkJICovCi0JCWlmIChyZWxhdGlvbl9oYXNfdW5pcXVl X2luZGV4X2Zvcihyb290LCByZWwsIGNsYXVzZV9saXN0LCBOSUwsIE5JTCkpCisJCWlmIChy ZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChyb290LCByZWwsIGNsYXVzZV9saXN0LCBO SUwsIE5JTCwKKwkJCWV4dHJhX2NsYXVzZXMpKQogCQkJcmV0dXJuIHRydWU7CiAJfQogCWVs c2UgaWYgKHJlbC0+cnRla2luZCA9PSBSVEVfU1VCUVVFUlkpCkBAIC05NjgsOSArMTAyMSwy MSBAQCBpbm5lcnJlbF9pc191bmlxdWUoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJICAgSm9p blR5cGUgam9pbnR5cGUsCiAJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCSAgIGJv b2wgZm9yY2VfY2FjaGUpCit7CisJcmV0dXJuIGlubmVycmVsX2lzX3VuaXF1ZV9leHQocm9v dCwgam9pbnJlbGlkcywgb3V0ZXJyZWxpZHMsIGlubmVycmVsLAorCQkJCQkJCQkgIGpvaW50 eXBlLCByZXN0cmljdGxpc3QsIGZvcmNlX2NhY2hlLCBOVUxMKTsKK30KKworYm9vbAoraW5u ZXJyZWxfaXNfdW5pcXVlX2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxp ZHMsIFJlbGlkcyBvdXRlcnJlbGlkcywKKwkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWws IEpvaW5UeXBlIGpvaW50eXBlLAorCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QsIGJvb2wg Zm9yY2VfY2FjaGUsCisJCQkJCSAgIExpc3QgKipleHRyYV9jbGF1c2VzKQogewogCU1lbW9y eUNvbnRleHQgb2xkX2NvbnRleHQ7CiAJTGlzdENlbGwgICAqbGM7CisJVW5pcXVlUmVsSW5m byAqdW5pcXVlUmVsSW5mbzsKKwlMaXN0CQkgICpvdXRlcl9leHBycyA9IE5JTDsKIAogCS8q IENlcnRhaW5seSBjYW4ndCBwcm92ZSB1bmlxdWVuZXNzIHdoZW4gdGhlcmUgYXJlIG5vIGpv aW5jbGF1c2VzICovCiAJaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwpCkBAIC05OTIsMTAgKzEw NTcsMTQgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCSAqLwog CWZvcmVhY2gobGMsIGlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMpCiAJewotCQlSZWxpZHMJ CXVuaXF1ZV9mb3JfcmVscyA9IChSZWxpZHMpIGxmaXJzdChsYyk7CisJCXVuaXF1ZVJlbElu Zm8gPSAoVW5pcXVlUmVsSW5mbyAqKSBsZmlyc3QobGMpOwogCi0JCWlmIChibXNfaXNfc3Vi c2V0KHVuaXF1ZV9mb3JfcmVscywgb3V0ZXJyZWxpZHMpKQorCQlpZiAoYm1zX2lzX3N1YnNl dCh1bmlxdWVSZWxJbmZvLT5vdXRlcnJlbGlkcywgb3V0ZXJyZWxpZHMpKQorCQl7CisJCQlp ZiAoZXh0cmFfY2xhdXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9IHVuaXF1ZVJlbEluZm8t PmV4dHJhX2NsYXVzZXM7CiAJCQlyZXR1cm4gdHJ1ZTsJCS8qIFN1Y2Nlc3MhICovCisJCX0K IAl9CiAKIAkvKgpAQCAtMTAxMiw3ICsxMDgxLDcgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBs YW5uZXJJbmZvICpyb290LAogCiAJLyogTm8gY2FjaGVkIGluZm9ybWF0aW9uLCBzbyB0cnkg dG8gbWFrZSB0aGUgcHJvb2YuICovCiAJaWYgKGlzX2lubmVycmVsX3VuaXF1ZV9mb3Iocm9v dCwgam9pbnJlbGlkcywgb3V0ZXJyZWxpZHMsIGlubmVycmVsLAotCQkJCQkJCSAgIGpvaW50 eXBlLCByZXN0cmljdGxpc3QpKQorCQkJCQkJCSAgIGpvaW50eXBlLCByZXN0cmljdGxpc3Qs ICZvdXRlcl9leHBycykpCiAJewogCQkvKgogCQkgKiBDYWNoZSB0aGUgcG9zaXRpdmUgcmVz dWx0IGZvciBmdXR1cmUgcHJvYmVzLCBiZWluZyBzdXJlIHRvIGtlZXAgaXQKQEAgLTEwMjUs MTAgKzEwOTQsMTUgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAog CQkgKiBzdXBlcnNldHMgb2YgdGhlbSBhbnl3YXkuCiAJCSAqLwogCQlvbGRfY29udGV4dCA9 IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVyX2N4dCk7CisJCXVuaXF1ZVJl bEluZm8gPSBwYWxsb2Moc2l6ZW9mKFVuaXF1ZVJlbEluZm8pKTsKKwkJdW5pcXVlUmVsSW5m by0+ZXh0cmFfY2xhdXNlcyA9IG91dGVyX2V4cHJzOworCQl1bmlxdWVSZWxJbmZvLT5vdXRl cnJlbGlkcyA9IGJtc19jb3B5KG91dGVycmVsaWRzKTsKIAkJaW5uZXJyZWwtPnVuaXF1ZV9m b3JfcmVscyA9IGxhcHBlbmQoaW5uZXJyZWwtPnVuaXF1ZV9mb3JfcmVscywKLQkJCQkJCQkJ CQkJYm1zX2NvcHkob3V0ZXJyZWxpZHMpKTsKKwkJCQkJCQkJCQkJdW5pcXVlUmVsSW5mbyk7 CiAJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRfY29udGV4dCk7CiAKKwkJaWYgKGV4dHJh X2NsYXVzZXMpCisJCQkqZXh0cmFfY2xhdXNlcyA9IG91dGVyX2V4cHJzOwogCQlyZXR1cm4g dHJ1ZTsJCQkvKiBTdWNjZXNzISAqLwogCX0KIAllbHNlCkBAIC0xMDc0LDcgKzExNDgsOCBA QCBpc19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkgICBS ZWxpZHMgb3V0ZXJyZWxpZHMsCiAJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVycmVsLAogCQkJ CQkgICBKb2luVHlwZSBqb2ludHlwZSwKLQkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0KQor CQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QsCisJCQkJCSAgIExpc3QgKipleHRyYV9jbGF1 c2VzKQogewogCUxpc3QJICAgKmNsYXVzZV9saXN0ID0gTklMOwogCUxpc3RDZWxsICAgKmxj OwpAQCAtMTExNiw1ICsxMTkxLDg5NiBAQCBpc19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5u ZXJJbmZvICpyb290LAogCX0KIAogCS8qIExldCByZWxfaXNfZGlzdGluY3RfZm9yKCkgZG8g dGhlIGhhcmQgd29yayAqLwotCXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJvb3QsIGlu bmVycmVsLCBjbGF1c2VfbGlzdCk7CisJcmV0dXJuIHJlbF9pc19kaXN0aW5jdF9mb3Iocm9v dCwgaW5uZXJyZWwsIGNsYXVzZV9saXN0LCBleHRyYV9jbGF1c2VzKTsKK30KKwordHlwZWRl ZiBzdHJ1Y3QgQ2hhbmdlVmFybm9Db250ZXh0Cit7CisJSW5kZXggb2xkUmVsaWQ7CisJSW5k ZXggbmV3UmVsaWQ7Cit9IENoYW5nZVZhcm5vQ29udGV4dDsKKworCitzdGF0aWMgYm9vbAor Y2hhbmdlX3Zhcm5vX3dhbGtlcihOb2RlICpub2RlLCBDaGFuZ2VWYXJub0NvbnRleHQgKmNv bnRleHQpCit7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYg KElzQShub2RlLCBWYXIpKQorCXsKKwkJVmFyKiB2YXIgPSAoVmFyKilub2RlOworCQlpZiAo dmFyLT52YXJubyA9PSBjb250ZXh0LT5vbGRSZWxpZCkKKwkJeworCQkJdmFyLT52YXJubyA9 IGNvbnRleHQtPm5ld1JlbGlkOworCQkJdmFyLT52YXJub3N5biA9IGNvbnRleHQtPm5ld1Jl bGlkOworCQkJdmFyLT5sb2NhdGlvbiA9IC0xOworCQl9CisJCWVsc2UgaWYgKHZhci0+dmFy bm8gPT0gY29udGV4dC0+bmV3UmVsaWQpCisJCQl2YXItPmxvY2F0aW9uID0gLTE7CisKKwkJ cmV0dXJuIGZhbHNlOworCX0KKwlpZiAoSXNBKG5vZGUsIFJlc3RyaWN0SW5mbykpCisJewor CQljaGFuZ2VfcmluZm8oKFJlc3RyaWN0SW5mbyopbm9kZSwgY29udGV4dC0+b2xkUmVsaWQs IGNvbnRleHQtPm5ld1JlbGlkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gZXhw cmVzc2lvbl90cmVlX3dhbGtlcihub2RlLCBjaGFuZ2VfdmFybm9fd2Fsa2VyLCBjb250ZXh0 KTsKK30KKworLyoKKyAqIEZvciBhbGwgVmFycyBpbiB0aGUgZXhwcmVzc2lvbiB0aGF0IGhh dmUgdmFybm8gPSBvbGRSZWxpZCwgc2V0CisgKiB2YXJubyA9IG5ld1JlbGlkLgorICovCitz dGF0aWMgdm9pZAorY2hhbmdlX3Zhcm5vKEV4cHIgKmV4cHIsIEluZGV4IG9sZFJlbGlkLCBJ bmRleCBuZXdSZWxpZCkKK3sKKwlDaGFuZ2VWYXJub0NvbnRleHQgY29udGV4dDsKKworCWlm IChuZXdSZWxpZCA9PSAwKQorCQlyZXR1cm47CisKKwljb250ZXh0Lm9sZFJlbGlkID0gb2xk UmVsaWQ7CisJY29udGV4dC5uZXdSZWxpZCA9IG5ld1JlbGlkOworCWNoYW5nZV92YXJub193 YWxrZXIoKE5vZGUgKikgZXhwciwgJmNvbnRleHQpOworfQorCisvKgorICogU3Vic3RpdHV0 ZSBuZXdJZCBmb3Igb2xkSWQgaW4gcmVsaWRzLgorICovCitzdGF0aWMgQml0bWFwc2V0Kgor Y2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJbmRleCBuZXdJZCkK K3sKKwlpZiAobmV3SWQgPT0gMCkKKwkJLyogRGVsZXRlIHJlbGlkIHdpdGhvdXQgc3Vic3Rp dHV0aW9uLiAqLworCQlyZXR1cm4gYm1zX2RlbF9tZW1iZXIocmVsaWRzLCBvbGRJZCk7CisK KwlpZiAoYm1zX2lzX21lbWJlcihvbGRJZCwgcmVsaWRzKSkKKwkJcmV0dXJuIGJtc19hZGRf bWVtYmVyKGJtc19kZWxfbWVtYmVyKGJtc19jb3B5KHJlbGlkcyksIG9sZElkKSwgbmV3SWQp OworCisJcmV0dXJuIHJlbGlkczsKK30KKworc3RhdGljIHZvaWQKK2NoYW5nZV9yaW5mbyhS ZXN0cmljdEluZm8qIHJpbmZvLCBJbmRleCBmcm9tLCBJbmRleCB0bykKK3sKKwlib29sIGlz X3JlcV9lcXVhbDsKKworCWlmICh0byA9PSAwKQorCQlyZXR1cm47CisKKwlpc19yZXFfZXF1 YWwgPSAocmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9PSByaW5mby0+Y2xhdXNlX3JlbGlkcyk7 CisKKwljaGFuZ2VfdmFybm8ocmluZm8tPmNsYXVzZSwgZnJvbSwgdG8pOworCWNoYW5nZV92 YXJubyhyaW5mby0+b3JjbGF1c2UsIGZyb20sIHRvKTsKKwlyaW5mby0+Y2xhdXNlX3JlbGlk cyA9IGNoYW5nZV9yZWxpZChyaW5mby0+Y2xhdXNlX3JlbGlkcywgZnJvbSwgdG8pOworCWlm IChpc19yZXFfZXF1YWwpCisJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSByaW5mby0+Y2xh dXNlX3JlbGlkczsKKwllbHNlCisJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSBjaGFuZ2Vf cmVsaWQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgZnJvbSwgdG8pOworCXJpbmZvLT5sZWZ0 X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+bGVmdF9yZWxpZHMsIGZyb20sIHRvKTsK KwlyaW5mby0+cmlnaHRfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5yaWdodF9yZWxp ZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+b3V0ZXJfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJp bmZvLT5vdXRlcl9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+bnVsbGFibGVfcmVsaWRz ID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5udWxsYWJsZV9yZWxpZHMsIGZyb20sIHRvKTsKK30K KworLyoKKyAqIFVwZGF0ZSBFQyBtZW1iZXJzIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcg cmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3ZlZAorICogb25lLCByZW1vdmluZyBkdXBs aWNhdGVzLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlX2VjX21lbWJlcnMoRXF1aXZhbGVu Y2VDbGFzcyAqZWMsIEluZGV4IHRvUmVtb3ZlLCBJbmRleCB0b0tlZXApCit7CisJaW50CQkJ Y291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBsaXN0X2xlbmd0aChl Yy0+ZWNfbWVtYmVycyk7ICkKKwl7CisJCUxpc3RDZWxsCQkJKmNlbGwgPSBsaXN0X250aF9j ZWxsKGVjLT5lY19tZW1iZXJzLCBjb3VudGVyKTsKKwkJRXF1aXZhbGVuY2VNZW1iZXIJKmVt ID0gbGZpcnN0KGNlbGwpOworCQlpbnQJCQkJCWNvdW50ZXIxOworCisJCWlmICghYm1zX2lz X21lbWJlcih0b1JlbW92ZSwgZW0tPmVtX3JlbGlkcykpCisJCXsKKwkJCWNvdW50ZXIrKzsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChl bS0+ZW1fcmVsaWRzLCB0b1JlbW92ZSwgdG9LZWVwKTsKKwkJLyogV2Ugb25seSBwcm9jZXNz IGlubmVyIGpvaW5zICovCisJCWNoYW5nZV92YXJubyhlbS0+ZW1fZXhwciwgdG9SZW1vdmUs IHRvS2VlcCk7CisKKwkJLyoKKwkJICogQWZ0ZXIgd2Ugc3dpdGNoZWQgdGhlIGVxdWl2YWxl bmNlIG1lbWJlciB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uLAorCQkgKiBjaGVjayB0aGF0 IGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgbWVtYmVyLCBhbmQgaWYgaXQK KwkJICogaXMsIGRlbGV0ZSBpdC4KKwkJICovCisJCWZvciAoY291bnRlcjEgPSAwOyBjb3Vu dGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJzKTsgY291bnRlcjErKykKKwkJewor CQkJRXF1aXZhbGVuY2VNZW1iZXIJKm90aGVyOworCisJCQlpZiAoY291bnRlcjEgPT0gY291 bnRlcikKKwkJCQljb250aW51ZTsKKworCQkJb3RoZXIgPSBjYXN0Tm9kZShFcXVpdmFsZW5j ZU1lbWJlciwgbGlzdF9udGgoZWMtPmVjX21lbWJlcnMsIGNvdW50ZXIxKSk7CisKKwkJCWlm IChlcXVhbChvdGhlci0+ZW1fZXhwciwgZW0tPmVtX2V4cHIpKQorCQkJCWJyZWFrOworCQl9 CisKKwkJaWYgKGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgoZWMtPmVjX21lbWJlcnMpKQorCQkJ ZWMtPmVjX21lbWJlcnMgPSBsaXN0X2RlbGV0ZV9jZWxsKGVjLT5lY19tZW1iZXJzLCBjZWxs KTsKKwkJZWxzZQorCQkJY291bnRlcisrOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSBFQyBz b3VyY2VzIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0 aGUKKyAqIHJlbW92ZWQgb25lLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlX2VjX3NvdXJj ZXMoTGlzdCAqKnNvdXJjZXMsIEluZGV4IHRvUmVtb3ZlLCBJbmRleCB0b0tlZXApCit7CisJ aW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBsaXN0X2xl bmd0aCgqc291cmNlcyk7ICkKKwl7CisJCUxpc3RDZWxsCQkqY2VsbCA9IGxpc3RfbnRoX2Nl bGwoKnNvdXJjZXMsIGNvdW50ZXIpOworCQlSZXN0cmljdEluZm8JKnJpbmZvID0gY2FzdE5v ZGUoUmVzdHJpY3RJbmZvLCBsZmlyc3QoY2VsbCkpOworCQlpbnQJCQkJY291bnRlcjE7CisK KwkJaWYgKCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLCByaW5mby0+cmVxdWlyZWRfcmVsaWRz KSkKKwkJeworCQkJY291bnRlcisrOworCQkJY29udGludWU7CisJCX0KKworCQljaGFuZ2Vf dmFybm8ocmluZm8tPmNsYXVzZSwgdG9SZW1vdmUsIHRvS2VlcCk7CisKKwkJLyoKKwkJICog QWZ0ZXIgc3dpdGNoaW5nIHRoZSBjbGF1c2UgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiwg Y2hlY2sgaXQgZm9yCisJCSAqIHJlZHVuZGFuY3kgd2l0aCBleGlzdGluZyBvbmVzLiBXZSBk b24ndCBoYXZlIHRvIGNoZWNrIGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZGVyaXZlZCBj bGF1c2VzLCBiZWNhdXNlIHdlJ3ZlIGp1c3QgZGVsZXRlZCB0aGVtLgorCQkgKi8KKwkJZm9y IChjb3VudGVyMSA9IDA7IGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgoKnNvdXJjZXMpOyBjb3Vu dGVyMSsrKQorCQl7CisJCQlSZXN0cmljdEluZm8gKm90aGVyOworCisJCQlpZiAoY291bnRl cjEgPT0gY291bnRlcikKKwkJCQljb250aW51ZTsKKworCQkJb3RoZXIgPSBjYXN0Tm9kZShS ZXN0cmljdEluZm8sIGxpc3RfbnRoKCpzb3VyY2VzLCBjb3VudGVyMSkpOworCQkJaWYgKGVx dWFsKHJpbmZvLT5jbGF1c2UsIG90aGVyLT5jbGF1c2UpKQorCQkJCWJyZWFrOworCQl9CisK KwkJaWYgKGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgoKnNvdXJjZXMpKQorCQkJKnNvdXJjZXMg PSBsaXN0X2RlbGV0ZV9jZWxsKCpzb3VyY2VzLCBjZWxsKTsKKwkJZWxzZQorCQl7CisJCQlj b3VudGVyKys7CisKKwkJCS8qIFdlIHdpbGwga2VlcCB0aGlzIFJlc3RyaWN0SW5mbywgY29y cmVjdCBpdHMgcmVsaWRzLiAqLworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCB0b1JlbW92ZSwg dG9LZWVwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlbW92ZSBhIHJlbGF0aW9uIGFmdGVy IHdlIGhhdmUgcHJvdmVuIHRoYXQgaXQgcGFydGljaXBhdGVzIG9ubHkgaW4gYW4KKyAqIHVu bmVlZGVkIHVuaXF1ZSBzZWxmIGpvaW4uCisgKgorICogVGhlIGpvaW5jbGF1c2VzIGxpc3Qg aXMgZGVzdHJ1Y3RpdmVseSBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX3Nl bGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsIFBsYW5Sb3dNYXJrICprbWFyaywgUGxh blJvd01hcmsgKnJtYXJrLAorCQkJCQkgUmVsT3B0SW5mbyAqdG9LZWVwLCBSZWxPcHRJbmZv ICp0b1JlbW92ZSkKK3sKKwlMaXN0Q2VsbCAqY2VsbDsKKwlpbnQgaTsKKwlMaXN0ICp0YXJn ZXQgPSBOSUw7CisKKwkvKgorCSAqIEluY2x1ZGUgYWxsIGVjbGFzcyBtZW50aW9ucyBvZiBy ZW1vdmVkIHJlbGF0aW9uIGludG8gdGhlIGVjbGFzcyBtZW50aW9ucworCSAqIG9mIGtlcHQg cmVsYXRpb24uCisJICovCisJdG9LZWVwLT5lY2xhc3NfaW5kZXhlcyA9IGJtc19hZGRfbWVt YmVycyh0b1JlbW92ZS0+ZWNsYXNzX2luZGV4ZXMsCisJCQkJCQkJCQkJCQkJCXRvS2VlcC0+ ZWNsYXNzX2luZGV4ZXMpOworCisJLyoKKwkgKiBOb3csIGJhc2VyZXN0cmljdGluZm8gcmVw bGVuaXNoZWQgd2l0aCByZXN0cmljdGlvbnMgZnJvbSByZW1vdmluZworCSAqIHJlbGF0aW9u LiBJdCBpcyBuZWVkZWQgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHJlcGxhY2UgZGVnZW5l cmF0ZWQKKwkgKiBjbGF1c2VzIHdpdGggYSBOdWxsVGVzdC4KKwkgKi8KKwlmb3JlYWNoKGNl bGwsIHRvS2VlcC0+YmFzZXJlc3RyaWN0aW5mbykKKwl7CisJCVJlc3RyaWN0SW5mbyAqcmlu Zm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGNlbGwpOworCQlMaXN0Q2VsbCAqb3Ro ZXJDZWxsID0gTlVMTDsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJl bGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpOworCisJCS8qCisJCSAqIElmIHRoaXMgY2xh dXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVhbGl0eSBjbGF1c2UgdGhhdCBjb21wYXJlcyBh CisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwgaS5lLiwgaGFzIHRoZSBmb3JtIG9mICJYPVgi LCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVsbCB0ZXN0LgorCQkgKi8KKwkJaWYgKHJpbmZv LT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikpCisJCXsK KwkJCUV4cHIgKmxlZnRPcDsKKwkJCUV4cHIgKnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9IChF eHByICopIGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSk7CisJCQlyaWdodE9wID0gKEV4cHIg KikgZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0gTlVM TCAmJiBlcXVhbChsZWZ0T3AsIHJpZ2h0T3ApKQorCQkJeworCQkJCU51bGxUZXN0ICpudWxs VGVzdCA9IG1ha2VOb2RlKE51bGxUZXN0KTsKKworCQkJCW51bGxUZXN0LT5hcmcgPSBsZWZ0 T3A7CisJCQkJbnVsbFRlc3QtPm51bGx0ZXN0dHlwZSA9IElTX05PVF9OVUxMOworCQkJCW51 bGxUZXN0LT5hcmdpc3JvdyA9IGZhbHNlOworCQkJCW51bGxUZXN0LT5sb2NhdGlvbiA9IC0x OworCQkJCXJpbmZvLT5jbGF1c2UgPSAoRXhwciAqKSBudWxsVGVzdDsKKwkJCX0KKwkJfQor CisJCS8qIFNlYXJjaCBmb3IgZHVwbGljYXRlcy4gKi8KKwkJZm9yZWFjaChvdGhlckNlbGws IHRhcmdldCkKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlciA9IGxmaXJzdF9ub2RlKFJl c3RyaWN0SW5mbywgb3RoZXJDZWxsKTsKKworCQkJaWYgKG90aGVyID09IHJpbmZvIHx8CisJ CQkJKHJpbmZvLT5wYXJlbnRfZWMgIT0gTlVMTAorCQkJCSAmJiBvdGhlci0+cGFyZW50X2Vj ID09IHJpbmZvLT5wYXJlbnRfZWMpCisJCQkJIHx8IGVxdWFsKHJpbmZvLT5jbGF1c2UsIG90 aGVyLT5jbGF1c2UpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG90 aGVyQ2VsbCAhPSBOVUxMKQorCQkJLyogRHVwbGljYXRlIGZvdW5kICovCisJCQljb250aW51 ZTsKKworCQl0YXJnZXQgPSBsYXBwZW5kKHRhcmdldCwgcmluZm8pOworCX0KKworCWxpc3Rf ZnJlZSh0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pOworCXRvS2VlcC0+YmFzZXJlc3RyaWN0 aW5mbyA9IHRhcmdldDsKKworCS8qCisJICogVXBkYXRlIHRoZSBlcXVpdmFsZW5jZSBjbGFz c2VzIHRoYXQgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJlbGF0aW9ucy4KKwkgKi8KKwlmb3Jl YWNoKGNlbGwsIHJvb3QtPmVxX2NsYXNzZXMpCisJeworCQlFcXVpdmFsZW5jZUNsYXNzICpl YyA9IGxmaXJzdChjZWxsKTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJl bGlkLCBlYy0+ZWNfcmVsaWRzKSkKKwkJeworCQkJLyoKKwkJCSAqIFRoaXMgRUMgZG9lc24n dCByZWZlcmVuY2UgdGhlIHJlbW92ZWQgcmVsYXRpb24sIG5vdGhpbmcgdG8gYmUKKwkJCSAq IGRvbmUgZm9yIGl0LgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAq IFVwZGF0ZSB0aGUgRUMgbWVtYmVycyB0byByZWZlcmVuY2UgdGhlIHJlbWFpbmluZyByZWxh dGlvbiBpbnN0ZWFkCisJCSAqIG9mIHRoZSByZW1vdmVkIG9uZS4KKwkJICovCisJCXVwZGF0 ZV9lY19tZW1iZXJzKGVjLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQll Yy0+ZWNfcmVsaWRzID0gY2hhbmdlX3JlbGlkKGVjLT5lY19yZWxpZHMsIHRvUmVtb3ZlLT5y ZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwkJLyoKKwkJICogV2Ugd2lsbCBub3cgdXBkYXRl IHNvdXJjZSBhbmQgZGVyaXZlZCBjbGF1c2VzIG9mIHRoZSBFQy4KKwkJICoKKwkJICogUmVz dHJpY3Rpb24gY2xhdXNlcyBmb3IgYmFzZSByZWxhdGlvbnMgYXJlIGFscmVhZHkgZGlzdHJp YnV0ZWQgdG8KKwkJICogdGhlIHJlc3BlY3RpdmUgYmFzZXJlc3RyaWN0aW5mbyBsaXN0cyAo c2VlCisJCSAqIGdlbmVyYXRlX2ltcGxpZWRfZXF1YWxpdGllcykuIFRoZSBhYm92ZSBjb2Rl IGhhcyBhbHJlYWR5IHByb2Nlc3NlZAorCQkgKiB0aGlzIGxpc3QsIGFuZCB1cGRhdGVkIHRo ZXNlIGNsYXVzZXMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcKKwkJICogcmVsYXRpb24s IHNvIHdlIGNhbiBza2lwIHRoZW0gaGVyZSBiYXNlZCBvbiB0aGVpciByZWxpZHMuCisJCSAq CisJCSAqIExpa2V3aXNlLCB3ZSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBqb2luIGNs YXVzZXMgdGhhdCBqb2luIHRoZQorCQkgKiByZW1vdmVkIHJlbGF0aW9uIHRvIHRoZSByZW1h aW5pbmcgb25lLgorCQkgKgorCQkgKiBGaW5hbGx5LCB0aGVyZSBhcmUgam9pbiBjbGF1c2Vz IHRoYXQgam9pbiB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0bworCQkgKiBzb21lIHRoaXJkIHJl bGF0aW9uLiBXZSBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUgc291cmNlIGNsYXVzZXMgYW5kCisJ CSAqIHJlZ2VuZXJhdGUgdGhlbSBmcm9tIHRoZSBFQywgYmVjYXVzZSB0aGUgY29ycmVzcG9u ZGluZyBlcXVhbGl0eQorCQkgKiBvcGVyYXRvcnMgbWlnaHQgYmUgbWlzc2luZyAoc2VlIHRo ZSBoYW5kbGluZyBvZiBlY19icm9rZW4pLgorCQkgKiBUaGVyZWZvcmUsIHdlIHdpbGwgdXBk YXRlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzb3VyY2UgY2xhdXNlcy4KKwkJICoKKwkJICog RGVyaXZlZCBjbGF1c2VzIGNhbiBiZSBnZW5lcmF0ZWQgYWdhaW4sIHNvIGl0IGlzIHNpbXBs ZXIgdG8ganVzdAorCQkgKiBkZWxldGUgdGhlbS4KKwkJICovCisJCWxpc3RfZnJlZShlYy0+ ZWNfZGVyaXZlcyk7CisJCWVjLT5lY19kZXJpdmVzID0gTlVMTDsKKwkJdXBkYXRlX2VjX3Nv dXJjZXMoJmVjLT5lY19zb3VyY2VzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQp OworCX0KKworCS8qCisJICogVHJhbnNmZXIgdGhlIHRhcmdldGxpc3QgYW5kIGF0dHJfbmVl ZGVkIGZsYWdzLgorCSAqLworCUFzc2VydCh0b1JlbW92ZS0+cmVsdGFyZ2V0LT5zb3J0Z3Jv dXByZWZzID09IDApOworCisJZm9yZWFjaCAoY2VsbCwgdG9SZW1vdmUtPnJlbHRhcmdldC0+ ZXhwcnMpCisJeworCQlFeHByICpub2RlID0gbGZpcnN0KGNlbGwpOworCQljaGFuZ2VfdmFy bm8obm9kZSwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJaWYgKCFsaXN0 X21lbWJlcih0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMsIG5vZGUpKQorCQkJdG9LZWVwLT5y ZWx0YXJnZXQtPmV4cHJzID0gbGFwcGVuZCh0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMsIG5v ZGUpOworCX0KKworCWZvciAoaSA9IHRvS2VlcC0+bWluX2F0dHI7IGkgPD0gdG9LZWVwLT5t YXhfYXR0cjsgaSsrKQorCXsKKwkJaW50IGF0dG5vID0gaSAtIHRvS2VlcC0+bWluX2F0dHI7 CisJCXRvS2VlcC0+YXR0cl9uZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2Vl cC0+YXR0cl9uZWVkZWRbYXR0bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9u ZWVkZWRbYXR0bm9dKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9u IGhhcyBhIHJvdyBtYXJrLCB0cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25l LgorCSAqCisJICogSWYgYm90aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhl IG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVj YXVzZSB3ZSB2ZXJpZmllZCBlYXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICog c3RyZW5ndGguCisJICoKKwkgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY3JhdGNoLT5y b3dfbWFya3MgY2FjaGUgaXMgdXAgdG8gZGF0ZSwgYmVjYXVzZQorCSAqIHdlIGFyZSBnb2lu ZyB0byB1c2UgaXQgZm9yIGZ1cnRoZXIgam9pbiByZW1vdmFscy4KKwkgKi8KKwlpZiAocm1h cmspCisJeworCQlpZiAoa21hcmspCisJCXsKKwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUg PT0gcm1hcmstPm1hcmtUeXBlKTsKKworCQkJLyogWFhYOiBXaHkgaGVyZSB3ZSBoYXZlbid0 IGFueSBkaWZmZXJlbmNlcyBpbiByZW1vdmluZyBybWFyayBvciBrbWFyaz8gKi8KKwkJCXJv b3QtPnJvd01hcmtzID0gbGlzdF9kZWxldGVfcHRyKHJvb3QtPnJvd01hcmtzLCBybWFyayk7 CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTaG91bGRuJ3QgaGF2ZSBpbmhlcml0YW5jZSBj aGlsZHJlbiBoZXJlLiAqLworCQkJQXNzZXJ0KHJtYXJrLT5ydGkgPT0gcm1hcmstPnBydGkp OworCisJCQlybWFyay0+cnRpID0gcm1hcmstPnBydGkgPSB0b0tlZXAtPnJlbGlkOworCQl9 CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgdmFybm8gaW4gc29tZSBzcGVjaWFsIGNhc2VzIHdp dGggbm9uLXRyaXZpYWwgUmFuZ2VUYmxFbnRyeQorCSAqLworCWZvcmVhY2goY2VsbCwgcm9v dC0+cGFyc2UtPnJ0YWJsZSkKKwl7CisJCVJhbmdlVGJsRW50cnkgKnJ0ZQk9IGxmaXJzdChj ZWxsKTsKKworCQlzd2l0Y2gocnRlLT5ydGVraW5kKQorCQl7CisJCQljYXNlIFJURV9GVU5D VElPTjoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIqKXJ0ZS0+ZnVuY3Rpb25zLCB0b1JlbW92 ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVEVfVEFC TEVGVU5DOgorCQkJCWNoYW5nZV92YXJubygoRXhwciopcnRlLT50YWJsZWZ1bmMsIHRvUmVt b3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJURV9W QUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByKilydGUtPnZhbHVlc19saXN0cywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6 CisJCQkJLyogbm8gb3AgKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogUmVw bGFjZSB2YXJubyBpbiByb290IHRhcmdldGxpc3QgYW5kIEhBVklORyBjbGF1c2UuCisJICov CisJY2hhbmdlX3Zhcm5vKChFeHByICopIHJvb3QtPnByb2Nlc3NlZF90bGlzdCwgdG9SZW1v dmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwljaGFuZ2VfdmFybm8oKEV4cHIgKikgcm9v dC0+cGFyc2UtPmhhdmluZ1F1YWwsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7 CisKKwkvKgorCSAqIFRyYW5zZmVyIGpvaW4gYW5kIHJlc3RyaWN0aW9uIGNsYXVzZXMgZnJv bSB0aGUgcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUKKwkgKiByZW1haW5pbmcgb25lLiBXZSBj aGFuZ2UgdGhlIFZhcnMgb2YgdGhlIGNsYXVzZSB0byBwb2ludCB0byB0aGUKKwkgKiByZW1h aW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3ZlZCBvbmUuIFRoZSBjbGF1c2Vz IHRoYXQgcmVxdWlyZQorCSAqIGEgc3Vic2V0IG9mIGpvaW5yZWxpZHMgYmVjb21lIHJlc3Ry aWN0aW9uIGNsYXVzZXMgb2YgdGhlIHJlbWFpbmluZworCSAqIHJlbGF0aW9uLCBhbmQgb3Ro ZXJzIHJlbWFpbiBqb2luIGNsYXVzZXMuIFdlIGFwcGVuZCB0aGVtIHRvCisJICogYmFzZXJl c3RyaWN0aW5mbyBhbmQgam9pbmluZm8gcmVzcGVjdGl2ZWx5LCB0cnlpbmcgbm90IHRvIGlu dHJvZHVjZQorCSAqIGR1cGxpY2F0ZXMuCisJICoKKwkgKiBXZSBhbHNvIGhhdmUgdG8gcHJv Y2VzcyB0aGUgJ2pvaW5jbGF1c2VzJyBsaXN0IGhlcmUsIGJlY2F1c2UgaXQKKwkgKiBjb250 YWlucyBFQy1kZXJpdmVkIGpvaW4gY2xhdXNlcyB3aGljaCBtdXN0IGJlY29tZSBmaWx0ZXIg Y2xhdXNlcy4gSXQKKwkgKiBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29ycmVjdCB0aGUgRUNz LCBiZWNhdXNlIHRoZSBFQy1kZXJpdmVkCisJICogcmVzdHJpY3Rpb25zIGFyZSBnZW5lcmF0 ZWQgYmVmb3JlIGpvaW4gcmVtb3ZhbCAoc2VlCisJICogZ2VuZXJhdGVfYmFzZV9pbXBsaWVk X2VxdWFsaXRpZXMpLgorCSAqLworfQorCisvKgorICogc3BsaXRfc2VsZmpvaW5fcXVhbHMK KyAqCQlQcm9jZXNzZXMgJ2pvaW5xdWFscycgYnVpbGRpbmcgdHdvIGxpc3RzLCBvbmUgd2l0 aCBhIGxpc3Qgb2YgcXVhbHMKKyAqCQl3aGVyZSB0aGUgY29sdW1ucy9leHBycyBvbiBlaXRo ZXIgc2lkZSBvZiB0aGUgam9pbiBtYXRjaCBhbmQgYW5vdGhlcgorICoJCWxpc3QgY29udGFp bmluZyB0aGUgcmVtYWluaW5nIHF1YWxzLgorICoKKyAqICdqb2lucXVhbHMnIG11c3Qgb25s eSBjb250YWluIHF1YWxzIGZvciBhIFJURV9SRUxBVElPTiBiZWluZyBqb2luZWQgdG8KKyAq IGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQKK3NwbGl0X3NlbGZqb2luX3F1YWxzKFBsYW5u ZXJJbmZvICpyb290LCBMaXN0ICpqb2lucXVhbHMsIExpc3QgKipzZWxmam9pbnF1YWxzLAor CQkJCQkgTGlzdCAqKm90aGVyam9pbnF1YWxzKQoreworCUxpc3RDZWxsICpsYzsKKwlMaXN0 CSAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAqb2pvaW5xdWFscyA9IE5JTDsKKworCWZv cmVhY2gobGMsIGpvaW5xdWFscykKKwl7CisJCVJlc3RyaWN0SW5mbwkqcmluZm8gPSBsZmly c3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKwkJT3BFeHByCQkJKmV4cHI7CisJCUV4cHIJ CQkqbGVmdGV4cHI7CisJCUV4cHIJCQkqcmlnaHRleHByOworCisJCS8qIEluIGdlbmVyYWws IGNsYXVzZSBsb29rcyBsaWtlIEYoYXJnMSkgPSBHKGFyZzIpID8gKi8KKwkJaWYgKCFyaW5m by0+bWVyZ2VvcGZhbWlsaWVzIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPmNsYXVz ZV9yZWxpZHMpICE9IDIgfHwKKwkJCWJtc19udW1fbWVtYmVycyhyaW5mby0+bGVmdF9yZWxp ZHMpICE9IDEgfHwKKwkJCWJtc19udW1fbWVtYmVycyhyaW5mby0+cmlnaHRfcmVsaWRzKSAh PSAxKQorCQl7CisJCQlvam9pbnF1YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7 CisJCQljb250aW51ZTsKKwkJfQorCisJCWV4cHIgPSAoT3BFeHByICopIHJpbmZvLT5jbGF1 c2U7CisKKwkJaWYgKCFJc0EoZXhwciwgT3BFeHByKSB8fCBsaXN0X2xlbmd0aChleHByLT5h cmdzKSAhPSAyKQorCQl7CisJCQlvam9pbnF1YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCBy aW5mbyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWxlZnRleHByID0gKEV4cHIgKikgY29w eU9iamVjdChnZXRfbGVmdG9wKHJpbmZvLT5jbGF1c2UpKTsKKwkJcmlnaHRleHByID0gKEV4 cHIgKikgY29weU9iamVjdChnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNlKSk7CisKKwkJLyog Q2FuJ3QgbWF0Y2ggb2YgdGhlIGV4cHJzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZSAqLwor CQlpZiAobGVmdGV4cHItPnR5cGUgIT0gcmlnaHRleHByLT50eXBlKQorCQl7CisJCQlvam9p bnF1YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJ fQorCisJCWNoYW5nZV92YXJubyhyaWdodGV4cHIsCisJCQkJCSBibXNfbmV4dF9tZW1iZXIo cmluZm8tPnJpZ2h0X3JlbGlkcywgLTEpLAorCQkJCQkgYm1zX25leHRfbWVtYmVyKHJpbmZv LT5sZWZ0X3JlbGlkcywgLTEpKTsKKworCQlpZiAoZXF1YWwobGVmdGV4cHIsIHJpZ2h0ZXhw cikpCisJCQlzam9pbnF1YWxzID0gbGFwcGVuZChzam9pbnF1YWxzLCByaW5mbyk7CisJCWVs c2UKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwl9CisK Kwkqc2VsZmpvaW5xdWFscyA9IHNqb2lucXVhbHM7CisJKm90aGVyam9pbnF1YWxzID0gb2pv aW5xdWFsczsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIGNhc2Ugd2hlbiB1bmlxdWVuZXNz IFtwYXJ0bHldIGRlcml2ZWQgZnJvbSBhIGJhc2VyZXN0cmljdGluZm8KKyAqIGNsYXVzZS4g SW4gdGhpcyBjYXNlIHdlIGhhdmUgYSBjaGFuY2UgdG8gcmV0dXJuIHRoZSBvbmx5IG9uZSBy b3cgKGlmIHN1Y2gKKyAqIGNsYXVzZXMgb24gYm90aCBzaWRlcyBvZiBTSiBpcyBlcXVhbCkg b3Igbm90aGluZyAtIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KKyAqLworc3RhdGljIGJvb2wK K2RlZ2VuZXJhdGVfY2FzZShSZWxPcHRJbmZvICpvdXRlciwgTGlzdCAqdWNsYXVzZXMsIElu ZGV4IHJlbGlkKQoreworCUxpc3RDZWxsICpsYzsKKworCWZvcmVhY2gobGMsIHVjbGF1c2Vz KQorCXsKKwkJUmVzdHJpY3RJbmZvICAgKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJ bmZvLCBsYyk7CisJCUV4cHIJCSAgICpjbGF1c2U7CisJCUNvbnN0CQkgICAqYzE7CisJCWJv b2wJCQltYXRjaGVkID0gZmFsc2U7CisJCUxpc3RDZWxsCSAgICpvbGM7CisKKwkJLyogT25s eSBmaWx0ZXJzIGxpa2UgeCA9PSBjb25zdCB3ZSBzaG91bGQgY29uc2lkZXIuICovCisJCUFz c2VydChibXNfaXNfZW1wdHkocmluZm8tPmxlZnRfcmVsaWRzKSB8fAorCQkJICBibXNfaXNf ZW1wdHkocmluZm8tPnJpZ2h0X3JlbGlkcykpOworCisJCWNsYXVzZSA9IChFeHByICopIChy aW5mby0+b3V0ZXJfaXNfbGVmdCA/CisJCQkJCQlnZXRfcmlnaHRvcChyaW5mby0+Y2xhdXNl KSA6IGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSkpOworCQljMSA9IChDb25zdCAqKSAocmlu Zm8tPm91dGVyX2lzX2xlZnQgPworCQkJCQkJZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKSA6 IGdldF9yaWdodG9wKHJpbmZvLT5jbGF1c2UpKTsKKwkJQXNzZXJ0KElzQShjMSwgQ29uc3Qp ICYmIG91dGVyLT5yZWxpZCA+IDAgJiYgcmVsaWQgPiAwKTsKKworCQljbGF1c2UgPSAoRXhw ciAqKSBjb3B5T2JqZWN0KGNsYXVzZSk7CisJCWNoYW5nZV92YXJubyhjbGF1c2UsIHJlbGlk LCBvdXRlci0+cmVsaWQpOworCisJCS8qCisJCSAqIENvbXBhcmUgdGhlc2UgbGVmdCBhbmQg cmlnaHQgc2lkZXMgd2l0aCBjb3JyZXNwb25kaW5nIHNpZGVzIG9mCisJCSAqIHRoZSBvdXRl cidzIGZpbHRlcnMuIElmIG5vIG9uZSBkZXRlY3RlZCAtIHJldHVybiBpbW1lZGlhdGVseS4K KwkJICovCisJCWZvcmVhY2gob2xjLCBvdXRlci0+YmFzZXJlc3RyaWN0aW5mbykKKwkJewor CQkJUmVzdHJpY3RJbmZvICpvcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIG9s Yyk7CisJCQlFeHByCQkgKm9jbGF1c2U7CisJCQlFeHByCQkgKmMyOworCisJCQlpZiAob3Jp bmZvLT5tZXJnZW9wZmFtaWxpZXMgPT0gTklMKQorCQkJCS8qIERvbid0IGNvbnNpZGVyIGNs YXVzZXMgd2hpY2ggYXJlbid0IHNpbWlsYXIgdG8gJ0YoWCk9RyhZKScgKi8KKwkJCQljb250 aW51ZTsKKworCQkJb2NsYXVzZSA9IChFeHByICopIChibXNfaXNfZW1wdHkob3JpbmZvLT5s ZWZ0X3JlbGlkcykgPworCQkJCQlnZXRfcmlnaHRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRf bGVmdG9wKG9yaW5mby0+Y2xhdXNlKSk7CisJCQljMiA9IChFeHByICopIChibXNfaXNfZW1w dHkob3JpbmZvLT5sZWZ0X3JlbGlkcykgPworCQkJCQlnZXRfbGVmdG9wKG9yaW5mby0+Y2xh dXNlKSA6IGdldF9yaWdodG9wKG9yaW5mby0+Y2xhdXNlKSk7CisKKwkJCWlmIChlcXVhbChj bGF1c2UsIG9jbGF1c2UpICYmIGVxdWFsKGMxLGMyKSkKKwkJCXsKKwkJCQltYXRjaGVkID0g dHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghbWF0Y2hlZCkKKwkJCXJl dHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEZpbmQgYW5k IHJlbW92ZSB1bmlxdWUgc2VsZiBqb2lucyBpbiBhIGdyb3VwIG9mIGJhc2UgcmVsYXRpb25z IHRoYXQgaGF2ZQorICogdGhlIHNhbWUgT2lkLgorICoKKyAqIFJldHVybnMgYSBzZXQgb2Yg cmVsaWRzIHRoYXQgd2VyZSByZW1vdmVkLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVf c2VsZl9qb2luc19vbmVfZ3JvdXAoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMp Cit7CisJUmVsaWRzIGpvaW5yZWxpZHMgPSBOVUxMOworCVJlbGlkcyByZXN1bHQgPSBOVUxM OworCWludCBrOyAvKiBJbmRleCBvZiBrZXB0IHJlbGF0aW9uICovCisJaW50IHIgPSAtMTsg LyogSW5kZXggb2YgcmVtb3ZlZCByZWxhdGlvbiAqLworCisJaWYgKGJtc19udW1fbWVtYmVy cyhyZWxpZHMpIDwgMikKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoKHIgPSBibXNfbmV4 dF9tZW1iZXIocmVsaWRzLCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5mbyAqb3V0ZXIgPSBy b290LT5zaW1wbGVfcmVsX2FycmF5W3JdOworCQlrID0gcjsKKworCQl3aGlsZSAoKGsgPSBi bXNfbmV4dF9tZW1iZXIocmVsaWRzLCBrKSkgPiAwKQorCQl7CisJCQlSZWxPcHRJbmZvCSpp bm5lciA9IHJvb3QtPnNpbXBsZV9yZWxfYXJyYXlba107CisJCQlMaXN0CSAgIAkqcmVzdHJp Y3RsaXN0OworCQkJTGlzdAkgICAJKnNlbGZqb2lucXVhbHM7CisJCQlMaXN0CSAgIAkqb3Ro ZXJqb2lucXVhbHM7CisJCQlMaXN0Q2VsbAkqbGM7CisJCQlib29sCQlqaW5mb19jaGVjayA9 IHRydWU7CisJCQlQbGFuUm93TWFyawkqb21hcmsgPSBOVUxMOworCQkJUGxhblJvd01hcmsJ KmltYXJrID0gTlVMTDsKKwkJCUxpc3QgCQkqdWNsYXVzZXMgPSBOSUw7CisKKwkJCS8qIEEg c2FuaXR5IGNoZWNrOiB0aGUgcmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJ QXNzZXJ0KHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9v dC0+c2ltcGxlX3J0ZV9hcnJheVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMg aW1wb3NzaWJsZSB0byBvcHRpbWl6ZSB0d28gcmVsYXRpb25zIGlmIHRoZXkgYmVsb25nIHRv CisJCQkgKiBkaWZmZXJlbnQgcnVsZXMgb2Ygb3JkZXIgcmVzdHJpY3Rpb24uIE90aGVyd2lz ZSBwbGFubmVyIGNhbid0CisJCQkgKiBiZSBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9m IGNvcnJlY3QgcXVlcnkgcGxhbi4KKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9p bl9pbmZvX2xpc3QpCisJCQl7CisJCQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNp YWxKb2luSW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJaWYgKChibXNfaXNfbWVtYmVyKGss IGluZm8tPnN5bl9sZWZ0aGFuZCkgXgorCQkJCQlibXNfaXNfbWVtYmVyKHIsIGluZm8tPnN5 bl9sZWZ0aGFuZCkpIHx8CisJCQkJCShibXNfaXNfbWVtYmVyKGssIGluZm8tPnN5bl9yaWdo dGhhbmQpIF4KKwkJCQkJYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSkp CisJCQkJeworCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9 CisJCQl9CisKKwkJCWlmICghamluZm9fY2hlY2spCisJCQkJY29udGludWU7CisKKwkJCS8q IFJldXNlIGpvaW5yZWxpZHMgYml0c2V0IHRvIGF2b2lkIHJlYWxsb2NhdGlvbi4gKi8KKwkJ CWpvaW5yZWxpZHMgPSBibXNfZGVsX21lbWJlcnMoam9pbnJlbGlkcywgam9pbnJlbGlkcyk7 CisKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBiYXNlIHJlbHMgaGVyZSwgc28g dGhlaXIgcmVsaWRzIGJpdHNldAorCQkJICogY29udGFpbnMgb25seSBvbmUgbWVtYmVyIC0t IHRoZWlyIHJlbGlkLgorCQkJICovCisJCQlqb2lucmVsaWRzID0gYm1zX2FkZF9tZW1iZXIo am9pbnJlbGlkcywgcik7CisJCQlqb2lucmVsaWRzID0gYm1zX2FkZF9tZW1iZXIoam9pbnJl bGlkcywgayk7CisKKwkJCS8qIElzIGl0IGEgdW5pcXVlIHNlbGYgam9pbj8gKi8KKwkJCXJl c3RyaWN0bGlzdCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KHJvb3QsIGpvaW5yZWxp ZHMsIG91dGVyLAorCQkJCQkJCQkJCQkJCSAgaW5uZXIpOworCisJCQkvKgorCQkJICogUHJv Y2VzcyByZXN0cmljdGxpc3QgdG8gc2VwZXJhdGUgb3V0IHRoZSBzZWxmIGpvaW4gcXVhbHMg ZnJvbQorCQkJICogdGhlIG90aGVyIHF1YWxzLiBlLmcgeCA9IHggZ29lcyB0byBzZWxmam9p bnF1YWxzIGFuZCBhID0gYiB0bworCQkJICogb3RoZXJqb2lucXVhbHMuCisJCQkgKi8KKwkJ CXNwbGl0X3NlbGZqb2luX3F1YWxzKHJvb3QsIHJlc3RyaWN0bGlzdCwgJnNlbGZqb2lucXVh bHMsCisJCQkJCQkJCSAmb3RoZXJqb2lucXVhbHMpOworCisJCQlpZiAobGlzdF9sZW5ndGgo c2VsZmpvaW5xdWFscykgPT0gMCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFhYWDoKKwkJCQkg KiB3ZSB3b3VsZCBkZXRlY3Qgc2VsZi1qb2luIHdpdGhvdXQgcXVhbHMgbGlrZSAneD09eCcg aWYgd2UgaGFkCisJCQkJICogYW4gZm9yZWlnbiBrZXkgY29uc3RyYWludCBvbiBzb21lIG9m IG90aGVyIHF1YWxzIGFuZCB0aGlzIGpvaW4KKwkJCQkgKiBoYXZlbid0IGFueSBjb2x1bW5z IGZyb20gdGhlIG91dGVyIGluIHRoZSB0YXJnZXQgbGlzdC4KKwkJCQkgKiBCdXQgaXQgaXMg c3RpbGwgY29tcGxleCB0YXNrLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJ CQkvKgorCQkJICogRGV0ZXJtaW5lIGlmIHRoZSBpbm5lciB0YWJsZSBjYW4gZHVwbGljYXRl IG91dGVyIHJvd3MuICBXZSBtdXN0CisJCQkgKiBieXBhc3MgdGhlIHVuaXF1ZSByZWwgY2Fj aGUgaGVyZSBzaW5jZSB3ZSdyZSBwb3NzaWJseSB1c2luZyBhCisJCQkgKiBzdWJzZXQgb2Yg am9pbiBxdWFscy4gV2UgY2FuIHVzZSAnZm9yY2VfY2FjaGUnID0gdHJ1ZSB3aGVuIGFsbAor CQkJICogam9pbiBxdWFscyBhcmUgc2VsZmpvaW4gcXVhbHMuICBPdGhlcndpc2Ugd2UgY291 bGQgZW5kIHVwCisJCQkgKiBwdXR0aW5nIGZhbHNlIG5lZ2F0aXZlcyBpbiB0aGUgY2FjaGUu CisJCQkgKi8KKwkJCWlmICghaW5uZXJyZWxfaXNfdW5pcXVlX2V4dChyb290LCBqb2lucmVs aWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJCWlubmVyLCBKT0lOX0lOTkVSLCBzZWxm am9pbnF1YWxzLAorCQkJCQkJCQkJCWxpc3RfbGVuZ3RoKG90aGVyam9pbnF1YWxzKSA9PSAw LAorCQkJCQkJCQkJCSZ1Y2xhdXNlcykpCisJCQkJY29udGludWU7CisKKwkJCWlmICghZGVn ZW5lcmF0ZV9jYXNlKG91dGVyLCB1Y2xhdXNlcywgaW5uZXItPnJlbGlkKSkKKwkJCQljb250 aW51ZTsKKworCQkJLyogU2VlIGZvciByb3cgbWFya3MuICovCisJCQlmb3JlYWNoIChsYywg cm9vdC0+cm93TWFya3MpCisJCQl7CisJCQkJUGxhblJvd01hcmsgKnJvd01hcmsgPSAoUGxh blJvd01hcmsgKikgbGZpcnN0KGxjKTsKKworCQkJCWlmIChyb3dNYXJrLT5ydGkgPT0gaykK KwkJCQl7CisJCQkJCUFzc2VydChpbWFyayA9PSBOVUxMKTsKKwkJCQkJaW1hcmsgPSByb3dN YXJrOworCQkJCX0KKwkJCQllbHNlIGlmIChyb3dNYXJrLT5ydGkgPT0gcikKKwkJCQl7CisJ CQkJCUFzc2VydChvbWFyayA9PSBOVUxMKTsKKwkJCQkJb21hcmsgPSByb3dNYXJrOworCQkJ CX0KKworCQkJCWlmIChvbWFyayAmJiBpbWFyaykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJ CS8qCisJCQkgKiBXZSBjYW4ndCByZW1vdmUgdGhlIGpvaW4gaWYgdGhlIHJlbGF0aW9ucyBo YXZlIHJvdyBtYXJrcyBvZgorCQkJICogZGlmZmVyZW50IHN0cmVuZ3RoIChlLmcuIG9uZSBp cyBsb2NrZWQgRk9SIFVQREFURSBhbmQgYW5vdGhlcgorCQkJICoganVzdCBoYXMgUk9XX01B UktfUkVGRVJFTkNFIGZvciBFdmFsUGxhblF1YWwgcmVjaGVja2luZykuCisJCQkgKi8KKwkJ CWlmIChvbWFyayAmJiBpbWFyayAmJiBvbWFyay0+bWFya1R5cGUgIT0gaW1hcmstPm1hcmtU eXBlKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogQmUgc2FmZSB0byBkbyBub3Qg cmVtb3ZlIHRhYmxlIHBhcnRpY2lwYXRlZCBpbiBjb21wbGljYXRlZCBQSAorCQkJICovCisJ CQlmb3JlYWNoKGxjLCByb290LT5wbGFjZWhvbGRlcl9saXN0KQorCQkJeworCQkJCVBsYWNl SG9sZGVySW5mbyAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobGMpOwor CisJCQkJLyogdGhlcmUgaXNuJ3QgYW55IG90aGVyIHBsYWNlIHRvIGV2YWwgUEhWICovCisJ CQkJaWYgKGJtc19pc19zdWJzZXQocGhpbmZvLT5waF9ldmFsX2F0LCBqb2lucmVsaWRzKSB8 fAorCQkJCQlibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRzKSkK KwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChsYykKKwkJCQljb250aW51ZTsKKworCQkJ LyoKKwkJCSAqIFdlIGNhbiByZW1vdmUgZWl0aGVyIHJlbGF0aW9uLCBzbyByZW1vdmUgdGhl IG91dGVyIG9uZSwgdG8KKwkJCSAqIHNpbXBsaWZ5IHRoaXMgbG9vcC4KKwkJCSAqLworCisJ CQkvKgorCQkJICogQWRkIGpvaW4gcmVzdHJpY3Rpb25zIHRvIGpvaW5pbmZvIG9mIHJlbW92 aW5nIHJlbGF0aW9uIHRvIHNpbXBsaWZ5CisJCQkgKiB0aGUgcmVsaWRzIHJlcGxhY2luZyBw cm9jZWR1cmUuCisJCQkgKi8KKwkJCW91dGVyLT5qb2luaW5mbyA9IGxpc3RfY29uY2F0KG91 dGVyLT5qb2luaW5mbywgcmVzdHJpY3RsaXN0KTsKKworCQkJLyogRmlyc3RseSwgcmVwbGFj ZSBpbmRleCBvZiBleGNsdWRpbmcgcmVsYXRpb24gd2l0aCBrZWVwaW5nLiAqLworCQkJcmVt b3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIG91dGVyLT5yZWxpZCwgam9pbnJlbGlkcywgaW5u ZXItPnJlbGlkKTsKKworCQkJLyogU2Vjb25kbHksIGZpeCByZXN0cmljdGlvbnMgb2Yga2Vl cGluZyByZWxhdGlvbiAqLworCQkJcmVtb3ZlX3NlbGZfam9pbl9yZWwocm9vdCwgaW1hcmss IG9tYXJrLCBpbm5lciwgb3V0ZXIpOworCQkJcmVzdWx0ID0gYm1zX2FkZF9tZW1iZXIocmVz dWx0LCByKTsKKworCQkJLyogV2UgcmVtb3ZlZCB0aGUgb3V0ZXIgcmVsYXRpb24sIHRyeSB0 aGUgbmV4dCBvbmUuICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7 Cit9CisKKy8qCisgKiBJdGVyYXRpdmVseSBmb3JtIGEgZ3JvdXAgb2YgcmVsYXRpb24gaW5k ZXhlcyB3aXRoIHRoZSBzYW1lIG9pZCBhbmQgbGF1bmNoCisgKiB0aGUgcm91dGluZSB0aGF0 IGRldGVjdHMgc2VsZi1qb2lucyBpbiB0aGlzIGdyb3VwIGFuZCByZW1vdmVzIGV4Y2Vzc2l2 ZQorICogcmFuZ2UgdGFibGUgZW50cmllcy4KKyAqCisgKiBBdCB0aGUgZW5kIG9mIGl0ZXJh dGlvbiwgZXhjbHVkZSB0aGUgZ3JvdXAgZnJvbSB0aGUgb3ZlcmFsbCByZWxpZHMgbGlzdC4K KyAqIFNvIGVhY2ggbmV4dCBpdGVyYXRpb24gb2YgdGhlIGN5Y2xlIHdpbGwgaW52b2x2ZSBs ZXNzIGFuZCBsZXNzIHZhbHVlIG9mCisgKiByZWxpZHMuCisgKi8KK3N0YXRpYyBSZWxpZHMK K3JlbW92ZV9zZWxmX2pvaW5zX29uZV9sZXZlbChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRz IHJlbGlkcywgUmVsaWRzIFRvUmVtb3ZlKQoreworCXdoaWxlICghYm1zX2lzX2VtcHR5KHJl bGlkcykpCisJeworCQlSZWxpZHMgZ3JvdXAgPSBOVUxMOworCQlPaWQgZ3JvdXBPaWQ7CisJ CWludCBpOworCisJCWkgPSBibXNfZmlyc3RfbWVtYmVyKHJlbGlkcyk7CisJCWdyb3VwT2lk ID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXS0+cmVsaWQ7CisJCUFzc2VydChPaWRJc1Zh bGlkKGdyb3VwT2lkKSk7CisJCWdyb3VwID0gYm1zX2FkZF9tZW1iZXIoZ3JvdXAsIGkpOwor CisJCS8qIENyZWF0ZSBncm91cCBvZiByZWxhdGlvbiBpbmRleGVzIHdpdGggdGhlIHNhbWUg b2lkLiAqLworCQl3aGlsZSAoKGkgPSBibXNfbmV4dF9tZW1iZXIocmVsaWRzLCBpKSkgPiAw KQorCQl7CisJCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5 W2ldOworCisJCQlBc3NlcnQoT2lkSXNWYWxpZChydGUtPnJlbGlkKSk7CisKKwkJCWlmIChy dGUtPnJlbGlkID09IGdyb3VwT2lkKQorCQkJCWdyb3VwID0gYm1zX2FkZF9tZW1iZXIoZ3Jv dXAsIGkpOworCQl9CisKKwkJcmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKHJlbGlkcywgZ3Jv dXApOworCQlUb1JlbW92ZSA9IGJtc19hZGRfbWVtYmVycyhUb1JlbW92ZSwKKwkJCQkJCQkJ ICAgcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKHJvb3QsIGdyb3VwKSk7CisJCWJtc19m cmVlKGdyb3VwKTsKKwl9CisJcmV0dXJuIFRvUmVtb3ZlOworfQorCisvKgorICogRm9yIGVh Y2ggbGV2ZWwgb2Ygam9pbmxpc3QgZm9ybSBhIHNldCBvZiBiYXNlIHJlbGF0aW9ucyBhbmQg bGF1bmNoIHRoZQorICogcm91dGluZSBvZiB0aGUgc2VsZi1qb2luIHJlbW92YWwgb3B0aW1p emF0aW9uLiBSZWN1cnNlIGludG8gc3ViLWpvaW5saXN0cyB0bworICogaGFuZGxlIGRlZXBl ciBsZXZlbHMuCisgKi8KK3N0YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX3JlY3Vy c2UoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0LCBSZWxpZHMgVG9SZW1vdmUp Cit7CisJTGlzdENlbGwgKmxjOworCVJlbGlkcyByZWxpZHMgPSBOVUxMOworCisJLyogQ29s bGVjdCB0aGUgaWRzIG9mIGJhc2UgcmVsYXRpb25zIGF0IG9uZSBsZXZlbCBvZiB0aGUgam9p biB0cmVlLiAqLworCWZvcmVhY2ggKGxjLCBqb2lubGlzdCkKKwl7CisJCXN3aXRjaCAoKChO b2RlICopIGxmaXJzdChsYykpLT50eXBlKQorCQl7CisJCQljYXNlIFRfTGlzdDoKKwkJCQkv KiBSZWN1cnNpdmVseSBnbyBpbnNpZGUgdGhlIHN1Yi1qb2lubGlzdCAqLworCQkJCVRvUmVt b3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShyb290LAorCQkJCQkJCQkJCQkJCSAo TGlzdCAqKSBsZmlyc3QobGMpLAorCQkJCQkJCQkJCQkJCSBUb1JlbW92ZSk7CisJCQkJYnJl YWs7CisJCQljYXNlIFRfUmFuZ2VUYmxSZWY6CisJCQl7CisJCQkJUmFuZ2VUYmxSZWYgKnJl ZiA9IChSYW5nZVRibFJlZiAqKSBsZmlyc3QobGMpOworCQkJCVJhbmdlVGJsRW50cnkgKnJ0 ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmVmLT5ydGluZGV4XTsKKworCQkJCS8qCisJ CQkJICogV2Ugb25seSBjYXJlIGFib3V0IGJhc2UgcmVsYXRpb25zIGZyb20gd2hpY2ggd2Ug c2VsZWN0CisJCQkJICogc29tZXRoaW5nLgorCQkJCSAqLworCQkJCWlmIChydGUtPnJ0ZWtp bmQgIT0gUlRFX1JFTEFUSU9OIHx8CisJCQkJCXJ0ZS0+cmVsa2luZCAhPSBSRUxLSU5EX1JF TEFUSU9OIHx8CisJCQkJCXJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcmVmLT5ydGluZGV4XSA9 PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCUFzc2VydCghYm1zX2lzX21lbWJlcihyZWYt PnJ0aW5kZXgsIHJlbGlkcykpOworCQkJCXJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKHJlbGlk cywgcmVmLT5ydGluZGV4KTsKKworCQkJCS8qCisJCQkJICogTGltaXQgdGhlIG51bWJlciBv ZiBqb2lucyB3ZSBwcm9jZXNzIHRvIGNvbnRyb2wgdGhlIHF1YWRyYXRpYworCQkJCSAqIGJl aGF2aW9yLgorCQkJCSAqLworCQkJCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA+IGpv aW5fY29sbGFwc2VfbGltaXQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCWJyZWFrOworCQkJ ZGVmYXVsdDoKKwkJCQlBc3NlcnQoZmFsc2UpOworCQl9CisJfQorCisJaWYgKGJtc19udW1f bWVtYmVycyhyZWxpZHMpID49IDIpCisJCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNf b25lX2xldmVsKHJvb3QsIHJlbGlkcywgVG9SZW1vdmUpOworCisJYm1zX2ZyZWUocmVsaWRz KTsKKwlyZXR1cm4gVG9SZW1vdmU7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdXNl bGVzcyBzZWxmIGpvaW5zLgorICoKKyAqIFdlIHNlYXJjaCBmb3Igam9pbnMgd2hlcmUgdGhl IHNhbWUgcmVsYXRpb24gaXMgam9pbmVkIHRvIGl0c2VsZiBvbiBhbGwKKyAqIGNvbHVtbnMg b2Ygc29tZSB1bmlxdWUgaW5kZXguIElmIHRoaXMgY29uZGl0aW9uIGhvbGRzLCB0aGVuLCBm b3IKKyAqIGVhY2ggb3V0ZXIgcm93LCBvbmx5IG9uZSBpbm5lciByb3cgbWF0Y2hlcywgYW5k IGl0IGlzIHRoZSBzYW1lIHJvdworICogb2YgdGhlIHNhbWUgcmVsYXRpb24uIFRoaXMgYWxs b3dzIHVzIHRvIHJlbW92ZSB0aGUgam9pbiBhbmQgcmVwbGFjZQorICogaXQgd2l0aCBhIHNj YW4gdGhhdCBjb21iaW5lcyBXSEVSRSBjbGF1c2VzIGZyb20gYm90aCBzaWRlcy4gVGhlIGpv aW4KKyAqIGNsYXVzZXMgdGhlbXNlbHZlcyBhc3N1bWUgdGhlIGZvcm0gb2YgWCA9IFggYW5k IGNhbiBiZSByZXBsYWNlZCB3aXRoCisgKiBOT1QgTlVMTCBjbGF1c2VzLgorICoKKyAqIEZv ciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCB3ZSBkb24ndCBhcHBseSB0aGlzIG9wdGltaXph dGlvbiB0byBzcGVjaWFsCisgKiBqb2lucy4gSGVyZSBpcyBhIGxpc3Qgb2Ygd2hhdCB3ZSBj b3VsZCBkbyBpbiBzb21lIHBhcnRpY3VsYXIgY2FzZXM6CisgKiAnYSBhMSBzZW1pIGpvaW4g YSBhMic6IGlzIHJlZHVjZWQgdG8gaW5uZXIgYnkgcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMs CisgKiBhbmQgdGhlbiByZW1vdmVkIG5vcm1hbGx5LgorICogJ2EgYTEgYW50aSBqb2luIGEg YTInOiBjb3VsZCBzaW1wbGlmeSB0byBhIHNjYW4gd2l0aCAnb3V0ZXIgcXVhbHMgQU5ECisg KiAoSVMgTlVMTCBvbiBqb2luIGNvbHVtbnMgT1IgTk9UIGlubmVyIHF1YWxzKScuCisgKiAn YSBhMSBsZWZ0IGpvaW4gYSBhMic6IGNvdWxkIHNpbXBsaWZ5IHRvIGEgc2NhbiBsaWtlIGlu bmVyLCBidXQgd2l0aG91dAorICogTk9UIE5VTEwgY29uZGl0aW9ucyBvbiBqb2luIGNvbHVt bnMuCisgKiAnYSBhMSBsZWZ0IGpvaW4gKGEgYTIgam9pbiBiKSc6IGNhbid0IHNpbXBsaWZ5 IHRoaXMsIGJlY2F1c2Ugam9pbiB0byBiCisgKiBjYW4gYm90aCByZW1vdmUgcm93cyBhbmQg aW50cm9kdWNlIGR1cGxpY2F0ZXMuCisgKgorICogVG8gc2VhcmNoIGZvciByZW1vdmFibGUg am9pbnMsIHdlIG9yZGVyIGFsbCB0aGUgcmVsYXRpb25zIG9uIHRoZWlyIE9pZCwKKyAqIGdv IG92ZXIgZWFjaCBzZXQgd2l0aCB0aGUgc2FtZSBPaWQsIGFuZCBjb25zaWRlciBlYWNoIHBh aXIgb2YgcmVsYXRpb25zCisgKiBpbiB0aGlzIHNldC4gV2UgY2hlY2sgdGhhdCBib3RoIHJl bGF0aW9uIGFyZSBtYWRlIHVuaXF1ZSBieSB0aGUgc2FtZQorICogdW5pcXVlIGluZGV4IHdp dGggdGhlIHNhbWUgY2xhdXNlcy4KKyAqCisgKiBUbyByZW1vdmUgdGhlIGpvaW4sIHdlIG1h cmsgb25lIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHJlbGF0aW9ucyBhcworICogZGVhZCwgYW5k IHJld3JpdGUgYWxsIHJlZmVyZW5jZXMgdG8gaXQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmlu ZworICogcmVsYXRpb24uIFRoaXMgaW5jbHVkZXMgbW9kaWZ5aW5nIFJlc3RyaWN0SW5mb3Ms IEVxdWl2YWxlbmNlQ2xhc3NlcyBhbmQKKyAqIEVxdWl2YWxlbmNlTWVtYmVycy4gV2UgYWxz byBoYXZlIHRvIG1vZGlmeSB0aGUgcm93IG1hcmtzLiBUaGUgam9pbiBjbGF1c2VzCisgKiBv ZiB0aGUgcmVtb3ZlZCByZWxhdGlvbiBiZWNvbWUgZWl0aGVyIHJlc3RyaWN0aW9uIG9yIGpv aW4gY2xhdXNlcywgYmFzZWQgb24KKyAqIHdoZXRoZXIgdGhleSByZWZlcmVuY2UgYW55IHJl bGF0aW9ucyBub3QgcGFydGljaXBhdGluZyBpbiB0aGUgcmVtb3ZlZCBqb2luLgorICoKKyAq ICd0YXJnZXRsaXN0JyBpcyB0aGUgdG9wLWxldmVsIHRhcmdldGxpc3Qgb2YgcXVlcnkuIElm IGl0IGhhcyBhbnkgcmVmZXJlbmNlcworICogdG8gdGhlIHJlbW92ZWQgcmVsYXRpb25zLCB3 ZSB1cGRhdGUgdGhlbSB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIG9uZXMuCisgKi8KK0xp c3QgKgorcmVtb3ZlX3VzZWxlc3Nfc2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlz dCAqam9pbmxpc3QpCit7CisJUmVsaWRzIFRvUmVtb3ZlID0gTlVMTDsKKwlpbnQgcmVsaWQg PSAtMTsKKworCWlmICghZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsKQorCQlyZXR1cm4gam9p bmxpc3Q7CisKKwkvKgorCSAqIE1lcmdlIHBhaXJzIG9mIHJlbGF0aW9ucyBwYXJ0aWNpcGF0 ZWQgaW4gc2VsZi1qb2luLiBSZW1vdmUKKwkgKiB1bm5lY2Vzc2FyeSByYW5nZSB0YWJsZSBl bnRyaWVzLgorCSAqLworCVRvUmVtb3ZlID0gcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShy b290LCBqb2lubGlzdCwgVG9SZW1vdmUpOworCXdoaWxlICgocmVsaWQgPSBibXNfbmV4dF9t ZW1iZXIoVG9SZW1vdmUsIHJlbGlkKSkgPj0gMCkKKwl7CisJCWludCBucmVtb3ZlZCA9IDA7 CisJCWpvaW5saXN0ID0gcmVtb3ZlX3JlbF9mcm9tX2pvaW5saXN0KGpvaW5saXN0LCByZWxp ZCwgJm5yZW1vdmVkKTsKKwl9CisKKwlyZXR1cm4gam9pbmxpc3Q7CiB9CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYwppbmRleCBjOTJkZGQyN2VkLi44ZjZkNWU1NjM5 IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCisr KyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMKQEAgLTIyNiw2ICsy MjYsMTEgQEAgcXVlcnlfcGxhbm5lcihQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlyZWR1 Y2VfdW5pcXVlX3NlbWlqb2lucyhyb290KTsKIAorCS8qCisJICogUmVtb3ZlIHNlbGYgam9p bnMgb24gYSB1bmlxdWUgY29sdW1uLgorCSAqLworCWpvaW5saXN0ID0gcmVtb3ZlX3VzZWxl c3Nfc2VsZl9qb2lucyhyb290LCBqb2lubGlzdCk7CisKIAkvKgogCSAqIE5vdyBkaXN0cmli dXRlICJwbGFjZWhvbGRlcnMiIHRvIGJhc2UgcmVscyBhcyBuZWVkZWQuICBUaGlzIGhhcyB0 byBiZQogCSAqIGRvbmUgYWZ0ZXIgam9pbiByZW1vdmFsIGJlY2F1c2UgcmVtb3ZhbCBjb3Vs ZCBjaGFuZ2Ugd2hldGhlciBhCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv dXRpbC9qb2luaW5mby5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8u YwppbmRleCBkNGNmZmRiMTk4Li5kZDNlMzIzZjIxIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXpl ci91dGlsL2pvaW5pbmZvLmMKQEAgLTEzMCw2ICsxMzAsOSBAQCByZW1vdmVfam9pbl9jbGF1 c2VfZnJvbV9yZWxzKFBsYW5uZXJJbmZvICpyb290LAogCXsKIAkJUmVsT3B0SW5mbyAqcmVs ID0gZmluZF9iYXNlX3JlbChyb290LCBjdXJfcmVsaWQpOwogCisJCWlmICghbGlzdF9tZW1i ZXJfcHRyKHJlbC0+am9pbmluZm8sIHJlc3RyaWN0aW5mbykpCisJCQljb250aW51ZTsKKwog CQkvKgogCQkgKiBSZW1vdmUgdGhlIHJlc3RyaWN0aW5mbyBmcm9tIHRoZSBsaXN0LiAgUG9p bnRlciBjb21wYXJpc29uIGlzCiAJCSAqIHN1ZmZpY2llbnQuCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvdXRpbC9yZWxub2RlLmMKaW5kZXggNTIwNDA5ZjRiYS4uMmU3M2NhY2MwZCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jCisrKyBiL3NyYy9i YWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYwpAQCAtNDAsMTQgKzQwLDEwIEBAIHR5 cGVkZWYgc3RydWN0IEpvaW5IYXNoRW50cnkKIAogc3RhdGljIHZvaWQgYnVpbGRfam9pbnJl bF90bGlzdChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqam9pbnJlbCwKIAkJCQkJ CQkJUmVsT3B0SW5mbyAqaW5wdXRfcmVsKTsKLXN0YXRpYyBMaXN0ICpidWlsZF9qb2lucmVs X3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwKLQkJCQkJCQkJCQlSZWxPcHRJbmZv ICpqb2lucmVsLAotCQkJCQkJCQkJCVJlbE9wdEluZm8gKm91dGVyX3JlbCwKLQkJCQkJCQkJ CQlSZWxPcHRJbmZvICppbm5lcl9yZWwpOwogc3RhdGljIHZvaWQgYnVpbGRfam9pbnJlbF9q b2lubGlzdChSZWxPcHRJbmZvICpqb2lucmVsLAogCQkJCQkJCQkgICBSZWxPcHRJbmZvICpv dXRlcl9yZWwsCiAJCQkJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVyX3JlbCk7Ci1zdGF0aWMg TGlzdCAqc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUmVsT3B0SW5mbyAqam9pbnJl bCwKK3N0YXRpYyBMaXN0ICpzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChSZWxpZHMg am9pbnJlbGlkcywKIAkJCQkJCQkJCQkgICBMaXN0ICpqb2luaW5mb19saXN0LAogCQkJCQkJ CQkJCSAgIExpc3QgKm5ld19yZXN0cmljdGxpc3QpOwogc3RhdGljIExpc3QgKnN1YmJ1aWxk X2pvaW5yZWxfam9pbmxpc3QoUmVsT3B0SW5mbyAqam9pbnJlbCwKQEAgLTYwMCw3ICs1OTYs NyBAQCBidWlsZF9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwKIAkJICovCiAJCWlmIChy ZXN0cmljdGxpc3RfcHRyKQogCQkJKnJlc3RyaWN0bGlzdF9wdHIgPSBidWlsZF9qb2lucmVs X3Jlc3RyaWN0bGlzdChyb290LAotCQkJCQkJCQkJCQkJCQkgICBqb2lucmVsLAorCQkJCQkJ CQkJCQkJCQkgICBqb2lucmVsLT5yZWxpZHMsCiAJCQkJCQkJCQkJCQkJCSAgIG91dGVyX3Jl bCwKIAkJCQkJCQkJCQkJCQkJICAgaW5uZXJfcmVsKTsKIAkJcmV0dXJuIGpvaW5yZWw7CkBA IC03MDcsNyArNzAzLDcgQEAgYnVpbGRfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJ ICogY2FsbGVyIG1pZ2h0IG9yIG1pZ2h0IG5vdCBuZWVkIHRoZSByZXN0cmljdGxpc3QsIGJ1 dCBJIG5lZWQgaXQgYW55d2F5CiAJICogZm9yIHNldF9qb2lucmVsX3NpemVfZXN0aW1hdGVz KCkuKQogCSAqLwotCXJlc3RyaWN0bGlzdCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0 KHJvb3QsIGpvaW5yZWwsCisJcmVzdHJpY3RsaXN0ID0gYnVpbGRfam9pbnJlbF9yZXN0cmlj dGxpc3Qocm9vdCwgam9pbnJlbC0+cmVsaWRzLAogCQkJCQkJCQkJCQkgIG91dGVyX3JlbCwg aW5uZXJfcmVsKTsKIAlpZiAocmVzdHJpY3RsaXN0X3B0cikKIAkJKnJlc3RyaWN0bGlzdF9w dHIgPSByZXN0cmljdGxpc3Q7CkBAIC0xMDU5LDcgKzEwNTUsNyBAQCBidWlsZF9qb2lucmVs X3RsaXN0KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLAogICoJICB0 aGUgdmFyaW91cyBqb2lubGlzdCBlbnRyaWVzIHVsdGltYXRlbHkgcmVmZXIgdG8gUmVzdHJp Y3RJbmZvcwogICoJICBwdXNoZWQgaW50byB0aGVtIGJ5IGRpc3RyaWJ1dGVfcmVzdHJpY3Rp bmZvX3RvX3JlbHMoKS4KICAqCi0gKiAnam9pbnJlbCcgaXMgYSBqb2luIHJlbGF0aW9uIG5v ZGUKKyAqICdqb2lucmVsaWRzJyBpcyBhIGpvaW4gcmVsYXRpb24gaWQgc2V0CiAgKiAnb3V0 ZXJfcmVsJyBhbmQgJ2lubmVyX3JlbCcgYXJlIGEgcGFpciBvZiByZWxhdGlvbnMgdGhhdCBj YW4gYmUgam9pbmVkCiAgKgkJdG8gZm9ybSBqb2lucmVsLgogICoKQEAgLTEwNzIsOSArMTA2 OCw5IEBAIGJ1aWxkX2pvaW5yZWxfdGxpc3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKmpvaW5yZWwsCiAgKiBSZXN0cmljdEluZm8gbm9kZXMgYXJlIG5vIGxvbmdlciBjb250 ZXh0LWRlcGVuZGVudC4gIEluc3RlYWQsIGp1c3QgaW5jbHVkZQogICogdGhlIG9yaWdpbmFs IG5vZGVzIGluIHRoZSBsaXN0cyBtYWRlIGZvciB0aGUgam9pbiByZWxhdGlvbi4KICAqLwot c3RhdGljIExpc3QgKgorTGlzdCAqCiBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChQbGFu bmVySW5mbyAqcm9vdCwKLQkJCQkJCSAgIFJlbE9wdEluZm8gKmpvaW5yZWwsCisJCQkJCQkg ICBSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCSAgIFJlbE9wdEluZm8gKm91dGVyX3JlbCwK IAkJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVyX3JlbCkKIHsKQEAgLTEwODUsOCArMTA4MSw4 IEBAIGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFBsYW5uZXJJbmZvICpyb290LAogCSAq IGVsaW1pbmF0aW5nIGFueSBkdXBsaWNhdGVzIChpbXBvcnRhbnQgc2luY2Ugd2Ugd2lsbCBz ZWUgbWFueSBvZiB0aGUKIAkgKiBzYW1lIGNsYXVzZXMgYXJyaXZpbmcgZnJvbSBib3RoIGlu cHV0IHJlbGF0aW9ucykuCiAJICovCi0JcmVzdWx0ID0gc3ViYnVpbGRfam9pbnJlbF9yZXN0 cmljdGxpc3Qoam9pbnJlbCwgb3V0ZXJfcmVsLT5qb2luaW5mbywgTklMKTsKLQlyZXN1bHQg PSBzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChqb2lucmVsLCBpbm5lcl9yZWwtPmpv aW5pbmZvLCByZXN1bHQpOworCXJlc3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3Rs aXN0KGpvaW5yZWxpZHMsIG91dGVyX3JlbC0+am9pbmluZm8sIE5JTCk7CisJcmVzdWx0ID0g c3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qoam9pbnJlbGlkcywgaW5uZXJfcmVsLT5q b2luaW5mbywgcmVzdWx0KTsKIAogCS8qCiAJICogQWRkIG9uIGFueSBjbGF1c2VzIGRlcml2 ZWQgZnJvbSBFcXVpdmFsZW5jZUNsYXNzZXMuICBUaGVzZSBjYW5ub3QgYmUKQEAgLTEwOTUs NyArMTA5MSw3IEBAIGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KFBsYW5uZXJJbmZvICpy b290LAogCSAqLwogCXJlc3VsdCA9IGxpc3RfY29uY2F0KHJlc3VsdCwKIAkJCQkJCSBnZW5l cmF0ZV9qb2luX2ltcGxpZWRfZXF1YWxpdGllcyhyb290LAotCQkJCQkJCQkJCQkJCQkgIGpv aW5yZWwtPnJlbGlkcywKKwkJCQkJCQkJCQkJCQkJICBqb2lucmVsaWRzLAogCQkJCQkJCQkJ CQkJCQkgIG91dGVyX3JlbC0+cmVsaWRzLAogCQkJCQkJCQkJCQkJCQkgIGlubmVyX3JlbCkp OwogCkBAIC0xMTIxLDcgKzExMTcsNyBAQCBidWlsZF9qb2lucmVsX2pvaW5saXN0KFJlbE9w dEluZm8gKmpvaW5yZWwsCiB9CiAKIHN0YXRpYyBMaXN0ICoKLXN1YmJ1aWxkX2pvaW5yZWxf cmVzdHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCitzdWJidWlsZF9qb2lucmVsX3Jl c3RyaWN0bGlzdChSZWxpZHMgam9pbnJlbGlkcywKIAkJCQkJCQkgIExpc3QgKmpvaW5pbmZv X2xpc3QsCiAJCQkJCQkJICBMaXN0ICpuZXdfcmVzdHJpY3RsaXN0KQogewpAQCAtMTEzMSw3 ICsxMTI3LDcgQEAgc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUmVsT3B0SW5mbyAq am9pbnJlbCwKIAl7CiAJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICop IGxmaXJzdChsKTsKIAotCQlpZiAoYm1zX2lzX3N1YnNldChyaW5mby0+cmVxdWlyZWRfcmVs aWRzLCBqb2lucmVsLT5yZWxpZHMpKQorCQlpZiAoYm1zX2lzX3N1YnNldChyaW5mby0+cmVx dWlyZWRfcmVsaWRzLCBqb2lucmVsaWRzKSkKIAkJewogCQkJLyoKIAkJCSAqIFRoaXMgY2xh dXNlIGJlY29tZXMgYSByZXN0cmljdGlvbiBjbGF1c2UgZm9yIHRoZSBqb2lucmVsLCBzaW5j ZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYyBiL3NyYy9iYWNr ZW5kL3V0aWxzL21pc2MvZ3VjLmMKaW5kZXggOGU5YjcxMzc1Yy4uZDJiZGZmZTM3MyAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYworKysgYi9zcmMvYmFja2Vu ZC91dGlscy9taXNjL2d1Yy5jCkBAIC0xMjI0LDYgKzEyMjQsMTYgQEAgc3RhdGljIHN0cnVj dCBjb25maWdfYm9vbCBDb25maWd1cmVOYW1lc0Jvb2xbXSA9CiAJCXRydWUsCiAJCU5VTEws IE5VTEwsIE5VTEwKIAl9LAorCXsKKwkJeyJlbmFibGVfc2VsZl9qb2luX3JlbW92YWwiLCBQ R0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgiRW5h YmxlIHJlbW92YWwgb2YgdW5pcXVlIHNlbGYtam9pbnMuIiksCisJCQlOVUxMLAorCQkJR1VD X0VYUExBSU4gfCBHVUNfTk9UX0lOX1NBTVBMRQorCQl9LAorCQkmZW5hYmxlX3NlbGZfam9p bl9yZW1vdmFsLAorCQl0cnVlLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKIAl7CiAJCXsi Z2VxbyIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdfR0VRTywKIAkJCWdldHRleHRfbm9v cCgiRW5hYmxlcyBnZW5ldGljIHF1ZXJ5IG9wdGltaXphdGlvbi4iKSwKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3BhdGhub2RlLmgKaW5kZXggZDJkNDZiMTVkZi4uYzcxZTI1NDlhOCAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmgKKysrIGIvc3JjL2luY2x1ZGUv b3B0aW1pemVyL3BhdGhub2RlLmgKQEAgLTMwOSw2ICszMDksMTAgQEAgZXh0ZXJuIFJlbE9w dEluZm8gKmJ1aWxkX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkgIFJl bE9wdEluZm8gKmlubmVyX3JlbCwKIAkJCQkJCQkJICBTcGVjaWFsSm9pbkluZm8gKnNqaW5m bywKIAkJCQkJCQkJICBMaXN0ICoqcmVzdHJpY3RsaXN0X3B0cik7CitleHRlcm4gTGlzdCAq YnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkg ICBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJCSAgIFJlbE9wdEluZm8gKm91dGVyX3JlbCwK KwkJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVyX3JlbCk7CiBleHRlcm4gUmVsaWRzIG1pbl9q b2luX3BhcmFtZXRlcml6YXRpb24oUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJUmVs aWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkJCQkJUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLApkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggYi9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvcGF0aHMuaAppbmRleCBiNmUxMzdjZjgzLi5kMGRhMTdlYTA3IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAorKysgYi9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvcGF0aHMuaApAQCAtNzYsNiArNzYsOSBAQCBleHRlcm4gdm9pZCBjcmVhdGVf aW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBleHRl cm4gYm9vbCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAog CQkJCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QpOworZXh0ZXJuIGJv b2wgcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwKKwkJCQkJCQkJCQkgIExpc3QgKnJlc3RyaWN0bGlzdCwgTGlzdCAq ZXhwcmxpc3QsCisJCQkJCQkJCQkJICBMaXN0ICpvcHJsaXN0LCBMaXN0ICoqZXh0cmFfY2xh dXNlcyk7CiBleHRlcm4gYm9vbCBpbmRleGNvbF9pc19ib29sX2NvbnN0YW50X2Zvcl9xdWVy eShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJCUluZGV4T3B0SW5mbyAqaW5kZXgs CiAJCQkJCQkJCQkJCQlpbnQgaW5kZXhjb2wpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv b3B0aW1pemVyL3BsYW5tYWluLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4u aAppbmRleCBjNGY2MWMxYTA5Li5lZjk2M2U0YmNmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9vcHRpbWl6ZXIvcGxhbm1haW4uaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxh bm1haW4uaApAQCAtMjAsNiArMjAsNyBAQAogLyogR1VDIHBhcmFtZXRlcnMgKi8KICNkZWZp bmUgREVGQVVMVF9DVVJTT1JfVFVQTEVfRlJBQ1RJT04gMC4xCiBleHRlcm4gUEdETExJTVBP UlQgZG91YmxlIGN1cnNvcl90dXBsZV9mcmFjdGlvbjsKK2V4dGVybiBQR0RMTElNUE9SVCBi b29sIGVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDsKIAogLyogcXVlcnlfcGxhbm5lciBjYWxs YmFjayB0byBjb21wdXRlIHF1ZXJ5X3BhdGhrZXlzICovCiB0eXBlZGVmIHZvaWQgKCpxdWVy eV9wYXRoa2V5c19jYWxsYmFjaykgKFBsYW5uZXJJbmZvICpyb290LCB2b2lkICpleHRyYSk7 CkBAIC0xMDcsNiArMTA4LDExIEBAIGV4dGVybiBib29sIHF1ZXJ5X2lzX2Rpc3RpbmN0X2Zv cihRdWVyeSAqcXVlcnksIExpc3QgKmNvbG5vcywgTGlzdCAqb3BpZHMpOwogZXh0ZXJuIGJv b2wgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCSAgIFJl bGlkcyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsIFJlbE9wdEluZm8gKmlubmVy cmVsLAogCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmljdGxpc3Qs IGJvb2wgZm9yY2VfY2FjaGUpOworZXh0ZXJuIGJvb2wgaW5uZXJyZWxfaXNfdW5pcXVlX2V4 dChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxpZHMsCisJCQkJCQkJCSAgIFJl bGlkcyBvdXRlcnJlbGlkcywgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCisJCQkJCQkJCSAgIEpv aW5UeXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmljdGxpc3QsCisJCQkJCQkJCSAgIGJvb2wg Zm9yY2VfY2FjaGUsIExpc3QgKip1Y2xhdXNlcyk7CitleHRlcm4gTGlzdCAqIHJlbW92ZV91 c2VsZXNzX3NlbGZfam9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW50cmVlKTsK IAogLyoKICAqIHByb3RvdHlwZXMgZm9yIHBsYW4vc2V0cmVmcy5jCmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0IGIvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAppbmRleCAxMjZmNzA0N2ZlLi5kZTcxNDQx MDUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mu b3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKQEAg LTQzMCw2ICs0MzAsMzggQEAgZXhwbGFpbiAoY29zdHMgb2ZmKQogICAgRmlsdGVyOiAoKHVu aXF1ZTEgSVMgTk9UIE5VTEwpIEFORCAodW5pcXVlMiBJUyBOT1QgTlVMTCkpCiAoMiByb3dz KQogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBhcmUgcHJvY2Vzc2VkIGNvcnJlY3RseSBk dXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBEaXNhYmxlIG1lcmdlIGpvaW5zIHNvIHRo YXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0IG1pc3NpbmcgY29tbXV0YXRvci4KKy0t IFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhlIGpvaW4gY2xhdXNlLCBiZWNhdXNlIG9u bHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUgRUMuCitzZXQgZW5hYmxlX21lcmdlam9p biB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCAqIGZyb20gZWMwIG0g am9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBwIG9uIG0uZmYgKyBuLmZm ID0gcC5mMTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6ICgobi5mZiArIG4uZmYpID0gcC5mMSkKKyAgIC0+ICBTZXEgU2Nh biBvbiBlYzEgcAorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4g b24gZWMwIG4KKyAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQorKDYg cm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpv aW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBwLmYxOjppbnQ4ID0g KG0uZmYgKyBuLmZmKTo6aW50OGFsaWFzMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoKHAuZjEpOjpiaWdpbnQgPSAoKG4uZmYgKyBu LmZmKSk6OmludDhhbGlhczEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBN YXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCisgICAgICAgICAg ICAgICBGaWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK3Jlc2V0IGVuYWJs ZV9tZXJnZWpvaW47CiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCwgYnV0IGlzbid0IGF0 IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3 aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0gdW5pcXVlMjsKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pvaW4ub3V0CmluZGV4IDI1MzhiZDZhNzkuLjFkNzE1MGNmMWUgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dApAQCAtNDkxOCw2ICs0OTE4LDY1NCBA QCBzZWxlY3QgKiBmcm9tCiAtLS0tKy0tLS0rLS0tLSstLS0tCiAoMCByb3dzKQogCistLQor LS0gdGVzdCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlxdWUgY29s dW1uIGFyZSByZW1vdmVkCistLQorLS0gZW5hYmxlIG9ubHkgbmVzdGxvb3AgdG8gZ2V0IG1v cmUgcHJlZGljdGFibGUgcGxhbnMKK3NldCBlbmFibGVfaGFzaGpvaW4gdG8gb2ZmOworc2V0 IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworY3JlYXRlIHRhYmxlIHNqIChhIGludCB1bmlx dWUsIGIgaW50LCBjIGludCB1bmlxdWUpOworaW5zZXJ0IGludG8gc2ogdmFsdWVzICgxLCBu dWxsLCAyKSwgKG51bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7CithbmFseXplIHNqOworLS0g VHJpdmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBw LiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsK KyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAoYSAtIDEp KSkKKygyIHJvd3MpCisKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9 IHAuYSBhbmQgcS5iID0gcS5hIC0gMTsKKyBhIHwgYiB8IGMgCistLS0rLS0tKy0tLQorIDIg fCAxIHwgMQorKDEgcm93KQorCistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJmb3JtcyBhZnRl ciBhIHN1YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3ZlCistLSBzdWNo IGtpbmQgb2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAoc2VsZWN0ICog ZnJvbSBzaiBxCisJCQkJd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPCAxMCk7CisgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRl cjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPCAxMCkpCisoMiByb3dzKQorCitzZWxlY3Qg KiBmcm9tIHNqIHAgd2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEgd2hlcmUgcS5h ID0gcC5hIGFuZCBxLmIgPCAxMCk7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKyAyIHwg MSB8IDEKKygxIHJvdykKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBmb3IgdGhlIGNh c2Ugb2YgZXF1YWxpdHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1ucy4KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEg PSB0Mi5jIGFuZCB0MS5iIGlzIG5vdCBudWxsOworICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYykKKyAgIC0+ ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGIgSVMgTk9UIE5V TEwpCisoNiByb3dzKQorCistLSBEZWdlbmVyYXRlZCBjYXNlLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbQorCShzZWxlY3QgYSBhcyB4IGZyb20gc2ogd2hlcmUgZmFs c2UpIGFzIHExLAorCShzZWxlY3QgYSBhcyB5IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFzIHEy Cit3aGVyZSBxMS54ID0gcTIueTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUmVzdWx0CisgICBPbmUt VGltZSBGaWx0ZXI6IGZhbHNlCisgICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZp bHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNCByb3dzKQorCistLSBXZSBjYW4ndCB1c2UgYSBj cm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBjdXJyZW50IGxv Z2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMgcm91dGlu ZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdo ZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmE7CisgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQorICAg LT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICBGaWx0ZXI6IChhID0gYikKKyAgIC0+ ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisoNiByb3dz KQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwg c2ogdDMKK3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQy LmEKKwlhbmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDMuYikKKyAg IC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYikK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgICAgICAgRmlsdGVy OiAoYSA9IGIpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAgICAg ICAgIEZpbHRlcjogKGIgPSBhKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQzCisgICAgICAg ICBGaWx0ZXI6IChiID0gYSkKKygxMCByb3dzKQorCistLSBEb3VibGUgc2VsZi1qb2luIHJl bW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwgbm90IG9uICJiIiwgZm9y IHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIGlz IGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBjYW4KKy0tIHRlc3QgdGhl IG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t IHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSB0Mi5iCisJam9p biBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0My5iICsgMTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogdDMKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwp IEFORCAoKGIgKyAxKSBJUyBOT1QgTlVMTCkpCisoMiByb3dzKQorCistLSBzdWJzZWxlY3Qg dGhhdCByZWZlcmVuY2VzIHRoZSByZW1vdmVkIHJlbGF0aW9uCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgdDEuYSwgKHNlbGVjdCBhIGZyb20gc2ogd2hlcmUgYSA9IHQyLmEgYW5k IGEgPSB0MS5hKQorZnJvbSBzaiB0MSwgc2ogdDIKK3doZXJlIHQxLmEgPSB0Mi5hOworICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiB0MgorICAg RmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIFN1YlBsYW4gMQorICAgICAtPiAgUmVzdWx0 CisgICAgICAgICAgIE9uZS1UaW1lIEZpbHRlcjogKHQyLmEgPSB0Mi5hKQorICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgICAgICAgICAgRmlsdGVyOiAoYSA9IHQy LmEpCisoNyByb3dzKQorCistLSBzZWxmLWpvaW4gdW5kZXIgb3V0ZXIgam9pbgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5 LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHguYSA9IHoucTE7CisgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEg PSB6LnExKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEg SVMgTk9UIE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBpbnQ4X3RibCB6CisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl Y3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhf dGJsIHogb24geS5hID0gei5xMTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHkuYSA9IHoucTEpCisgICAtPiAgU2Vx IFNjYW4gb24gc2ogeQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIHoKKyg2 IHJvd3MpCisKKy0tIFRlc3QgdGhhdCBwbGFjZWhvbGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVj dGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSAodmFsdWVzICgxKSkgeAorbGVmdCBqb2luIChzZWxlY3QgY29hbGVzY2UoeS5xMSwg MSkgZnJvbSBpbnQ4X3RibCB5CisJcmlnaHQgam9pbiBzaiBqMSBpbm5lciBqb2luIHNqIGoy IG9uIGoxLmEgPSBqMi5hCisJb24gdHJ1ZSkgegorb24gdHJ1ZTsKKyAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAtPiAgUmVz dWx0CisgICAtPiAgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAgICAgICAtPiAgU2VxIFNj YW4gb24gc2ogajIKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisg ICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biBpbnQ4X3RibCB5CisoNyByb3dzKQorCistLQorLS0gU0pSIGNvcm5lciBjYXNlOiB1bmlx dWVuZXNzIG9mIGFuIGlubmVyIGlzIFtwYXJ0aWFsbHldIGRlcml2ZWQgZnJvbQorLS0gYmFz ZXJlc3RyaWN0aW5mbyBjbGF1c2VzLgorLS0gWFhYOiBXZSByZWFsbHkgc2hvdWxkIGFsbG93 IFNKUiBmb3IgdGhlc2UgY29ybmVyIGNhc2VzPworLS0KK0lOU0VSVCBJTlRPIHNqIFZBTFVF UyAoMywgMSwgMyk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgor CVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5h ID0gMiBBTkQgajIuYSA9IDM7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZp bHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAg ICBGaWx0ZXI6IChhID0gMikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAg RmlsdGVyOiAoYSA9IDMpCisoNiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBq MgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBqMi5hID0gMzsgLS0gUmV0 dXJuIG9uZSBjb2x1bW4KKyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSst LS0rLS0tKy0tLQorIDIgfCAxIHwgMSB8IDMgfCAxIHwgMworKDEgcm93KQorCitleHBsYWlu IChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy IFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7CisgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVy OiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9IDIpKQorKDIgcm93cykKKworU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQg ajIuYSA9IDI7IC0tIFJldHVybiBvbmUgY29sdW1uCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBj IAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEgfCAyIHwgMSB8IDEKKygx IHJvdykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBG Uk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDEgQU5EIGoy LmEgPSAxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAxKSkKKygyIHJv d3MpCisKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBB TkQgajEuYSA9IDEgQU5EIGoyLmEgPSAxOyAtLSBSZXR1cm4gbm8gY29sdW1ucworIGEgfCBi IHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisoMCByb3dzKQor CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFNodWZmbGUgYSBjbGF1c2UuIFJlbW92ZSBTSgor CVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAxID0g ajEuYSBBTkQgajIuYSA9IDE7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBT ZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9 IDEpKQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGox LmIgPSBqMi5iIEFORCAxID0gajEuYSBBTkQgajIuYSA9IDE7IC0tIFJldHVybiBubyBjb2x1 bW5zCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0K KygwIHJvd3MpCisKKy0tIEZ1bmN0aW9uYWwgaW5kZXgKK0NSRUFURSBVTklRVUUgSU5ERVgg c2pfZm5faWR4IE9OIHNqKChhICogYSkpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1v dmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5i IEFORCBqMS5hKmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAxOworICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZp bHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKChhICogYSkgPSAxKSkKKygyIHJvd3MpCisK K2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBB TkQgajIuYSpqMi5hID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBG aWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgICAg ICAgRmlsdGVyOiAoKGEgKiBhKSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAg ICAgICAgIEZpbHRlcjogKChhICogYSkgPSAyKQorKDYgcm93cykKKworLS0gTXVsdGlwbGUg ZmlsdGVycworQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeDEgT04gc2ooYSxiLGMp OworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajEuYyA9 IDMgQU5EIGoyLmEgPSAyIEFORCAzID0gajIuYzsKKyAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisg ICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMikgQU5EIChjID0gMykpCiso MiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNF TEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBq MS5hIEFORCBqMS5jID0gMyBBTkQgajIuYSA9IDEgQU5EIDMgPSBqMi5jOworICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5i ID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgICAgICAgRmlsdGVyOiAo KDIgPSBhKSBBTkQgKGMgPSAzKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAg ICAgRmlsdGVyOiAoKGMgPSAzKSBBTkQgKGEgPSAxKSkKKyg2IHJvd3MpCisKK0NSRUFURSBV TklRVUUgSU5ERVggc2pfdGVtcF9pZHggT04gc2ooYSxiKTsKK2V4cGxhaW4gKGNvc3RzIG9m ZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hF UkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyOworICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBq MQorICAgICAgICAgRmlsdGVyOiAoYSA9IDIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIK Kyg1IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJ U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDIgPSBq Mi5hOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5iID0g ajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoMiA9 IGEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyg1IHJvd3MpCisKK2V4cGxhaW4gKGNv c3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIChqMS5hID0gMSBPUiBqMi5hID0gMSk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKChqMS5i ID0gajIuYikgQU5EICgoajEuYSA9IDEpIE9SIChqMi5hID0gMSkpKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNqIGoxCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBzaiBqMgorKDUgcm93cykKKworRFJPUCBJTkRFWCBzal9mbl9pZHgsIHNqX3RlbXBf aWR4MSwgc2pfdGVtcF9pZHg7CistLSBUZXN0IHRoYXQgT1IgcHJlZGljYXRlZCBhcmUgdXBk YXRlZCBjb3JyZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgdGFiX3dp dGhfZmxhZyAoIGlkIElOVCBQUklNQVJZIEtFWSwgaXNfZmxhZyBTTUFMTElOVCk7CitDUkVB VEUgSU5ERVggaWR4X3Rlc3RfaXNfZmxhZyBPTiB0YWJfd2l0aF9mbGFnIChpc19mbGFnKTsK K2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHRhYl93aXRoX2Zs YWcKK1dIRVJFCisJKGlzX2ZsYWcgSVMgTlVMTCBPUiBpc19mbGFnID0gMCkKKwlBTkQgaWQg SU4gKFNFTEVDVCBpZCBGUk9NIHRhYl93aXRoX2ZsYWcgV0hFUkUgaWQgSU4gKDIsIDMpKTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRo X2ZsYWcKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50 ZWdlcltdKSkgQU5EIChpZCBJUyBOT1QgTlVMTCkpCisgICAgICAgICBGaWx0ZXI6ICgoaXNf ZmxhZyBJUyBOVUxMKSBPUiAoaXNfZmxhZyA9IDApKQorICAgICAgICAgLT4gIEJpdG1hcCBJ bmRleCBTY2FuIG9uIHRhYl93aXRoX2ZsYWdfcGtleQorICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkgQU5EIChpZCBJUyBOT1Qg TlVMTCkpCisoNiByb3dzKQorCitEUk9QIFRBQkxFIHRhYl93aXRoX2ZsYWc7CistLSBIQVZJ TkcgY2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBq b2luIHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAx OworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoQWdncmVnYXRlCisgICBHcm91cCBLZXk6IHEuYgor ICAgRmlsdGVyOiAoc3VtKHEuYSkgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHEKKyAg ICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNSByb3dzKQorCistLSB1cGRhdGUg bGF0ZXJhbCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4 cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4Liog ZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0 ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDog MQorICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHku YSwgeS5iLCB5LmMKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAg ICAgICBPdXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3Nl cmllcygxLCB5LmEpCisoOCByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CitzZWxlY3QgMSBmcm9tIChzZWxlY3QgeS4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEg PSB5LmEpIHEsCisgIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7Cisg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IDEKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJs aWMuc2ogeQorICAgICAgICAgT3V0cHV0OiB5LmEsIHkuYiwgeS5jCisgICAgICAgICBGaWx0 ZXI6ICh5LmEgSVMgTk9UIE5VTEwpCisgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRh bG9nLmdlbmVyYXRlX3NlcmllcyBncworICAgICAgICAgT3V0cHV0OiBncy5pCisgICAgICAg ICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMoMSwgeS5hKQorKDggcm93cykKKwor LS0gVGVzdCB0aGF0IGEgbm9uLUVDLWRlcml2ZWQgam9pbiBjbGF1c2UgaXMgcHJvY2Vzc2Vk IGNvcnJlY3RseS4gVXNlIGFuCistLSBvdXRlciBqb2luIHNvIHRoYXQgd2UgY2FuJ3QgZm9y bSBhbiBFQy4KK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBzaiBwIGpvaW4g c2ogcSBvbiBwLmEgPSBxLmEKKyAgbGVmdCBqb2luIHNqIHIgb24gcC5hICsgcS5hID0gci5h OworICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpv aW4gRmlsdGVyOiAoKHEuYSArIHEuYSkgPSByLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2og cQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBNYXRlcmlhbGl6 ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHIKKyg2IHJvd3MpCisKKy0tIEZJWE1F IHRoaXMgY29uc3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQg d2UgbWVyZ2UKKy0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAx IGFuZCBxLmIgPSAyOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMg Tk9UIE5VTEwpIEFORCAoYiA9IDIpIEFORCAoYiA9IDEpKQorKDIgcm93cykKKworLS0gQ2hl Y2sgdGhhdCBhdHRyX25lZWRlZCBpcyB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBzZWxmLWpv aW4gcmVtb3ZhbC4gSW4gdGhpcworLS0gdGVzdCwgdGhlIGpvaW4gb2YgajEgd2l0aCBqMiBp cyByZW1vdmVkLiBrMS5iIGlzIHJlcXVpcmVkIGF0IGVpdGhlciBqMSBvciBqMi4KKy0tIElm IHRoaXMgaW5mbyBpcyBsb3N0LCBqb2luIHRhcmdldGxpc3QgZm9yIChrMSwgazIpIHdpbGwg bm90IGNvbnRhaW4gazEuYi4KKy0tIFVzZSBpbmRleCBzY2FuIGZvciBrMSBzbyB0aGF0IHdl IGRvbid0IGdldCAnYicgZnJvbSBwaHlzaWNhbCB0bGlzdCB1c2VkIGZvcgorLS0gc2Vxc2Nh bi4gQWxzbyBkaXNhYmxlIHJlb3JkZXJpbmcgb2Ygam9pbnMgYmVjYXVzZSB0aGlzIHRlc3Qg ZGVwZW5kcyBvbiBhCistLSBwYXJ0aWN1bGFyIGpvaW4gdHJlZS4KK2NyZWF0ZSB0YWJsZSBz ayAoYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSBpbmRleCBvbiBzayhhKTsKK3NldCBqb2luX2Nv bGxhcHNlX2xpbWl0IHRvIDE7CitzZXQgZW5hYmxlX3NlcXNjYW4gdG8gb2ZmOworZXhwbGFp biAoY29zdHMgb2ZmKSBzZWxlY3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEu YSA9IGsyLmEpCisJam9pbiAoc2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24g ajEuYiA9IGsxLmI7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChrMS5iID0g ajIuYikKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNp bmcgc2tfYV9pZHggb24gc2sgazEKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNp bmcgc2tfYV9pZHggb24gc2sgazIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhID0g azEuYSkKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNp bmcgc2pfYV9rZXkgb24gc2ogajIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhIElT IE5PVCBOVUxMKQorKDkgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgMSBm cm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAoc2ogajEg am9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajIuYiA9IGsxLmI7CisgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQg TG9vcAorICAgSm9pbiBGaWx0ZXI6IChrMS5iID0gajIuYikKKyAgIC0+ICBOZXN0ZWQgTG9v cAorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazEKKyAg ICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2tfYV9pZHggb24gc2sgazIKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhID0gazEuYSkKKyAgIC0+ICBNYXRlcmlhbGl6 ZQorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgc2pfYV9rZXkgb24gc2ogajIKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhIElTIE5PVCBOVUxMKQorKDkgcm93cykKKwor cmVzZXQgam9pbl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworLS0g Q2hlY2sgdGhhdCBjbGF1c2VzIGZyb20gdGhlIGpvaW4gZmlsdGVyIGxpc3QgaXMgbm90IGxv c3Qgb24gdGhlIHNlbGYtam9pbiByZW1vdmFsCitDUkVBVEUgVEFCTEUgZW1wMSAoIGlkIFNF UklBTCBQUklNQVJZIEtFWSBOT1QgTlVMTCwgY29kZSBpbnQpOworZXhwbGFpbiAodmVyYm9z ZSwgY29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSBlbXAxIGUxLCBlbXAxIGUyIFdIRVJFIGUx LmlkID0gZTIuaWQgQU5EIGUyLmNvZGUgPD4gZTEuY29kZTsKKyAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEg U2NhbiBvbiBwdWJsaWMuZW1wMSBlMgorICAgT3V0cHV0OiBlMi5pZCwgZTIuY29kZSwgZTIu aWQsIGUyLmNvZGUKKyAgIEZpbHRlcjogKChlMi5pZCBJUyBOT1QgTlVMTCkgQU5EIChlMi5j b2RlIDw+IGUyLmNvZGUpKQorKDMgcm93cykKKworLS0gV2UgY2FuIHJlbW92ZSB0aGUgam9p biBldmVuIGlmIHdlIGZpbmQgdGhlIGpvaW4gY2FuJ3QgZHVwbGljYXRlIHJvd3MgYW5kCist LSB0aGUgYmFzZSBxdWFscyBvZiBlYWNoIHNpZGUgYXJlIGRpZmZlcmVudC4gIEluIHRoZSBm b2xsb3dpbmcgY2FzZSB3ZSBlbmQgdXAKKy0tIG1vdmluZyBxdWFscyBvdmVyIHRvIHMxIHRv IG1ha2UgaXQgc28gaXQgY2FuJ3QgbWF0Y2ggYW55IHJvd3MuCitjcmVhdGUgdGFibGUgc2wo YSBpbnQsIGIgaW50LCBjIGludCk7CitjcmVhdGUgdW5pcXVlIGluZGV4IG9uIHNsKGEsIGIp OwordmFjdXVtIGFuYWx5emUgc2w7CistLSBCb3RoIHNpZGVzIGFyZSB1bmlxdWUsIGJ1dCBi YXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAq IGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQg dDIuYiA9IDI7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQx LmEgPSB0Mi5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNsIHQxCisgICAgICAgICBGaWx0ZXI6 IChiID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0MgorICAgICAgICAgRmlsdGVyOiAo YiA9IDIpCisoNiByb3dzKQorCistLSBDaGVjayBOdWxsVGVzdCBpbiBiYXNlcmVzdHJpY3Rp bmZvIGxpc3QKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyCit3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyCisgIGFu ZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElT IE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxM IGFuZCB0Mi5hIElTIE5PVCBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAor ICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzbCB0 MQorICAgICAgICAgRmlsdGVyOiAoKGMgSVMgTk9UIE5VTEwpIEFORCAoYiBJUyBOT1QgTlVM TCkgQU5EIChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAxKSkKKyAgIC0+ICBTZXEgU2NhbiBv biBzbCB0MgorICAgICAgICAgRmlsdGVyOiAoKGMgSVMgTk9UIE5VTEwpIEFORCAoYiBJUyBO T1QgTlVMTCkgQU5EIChhIElTIE5PVCBOVUxMKSBBTkQgKGIgPSAyKSkKKyg2IHJvd3MpCisK K2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNs IHQyCit3aGVyZSB0MS5iID0gdDIuYiBhbmQgdDIuYSA9IDMgYW5kIHQxLmEgPSAzCisgIGFu ZCB0MS5jIElTIE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElT IE5PVCBOVUxMIGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxM IGFuZCB0Mi5hIElTIE5PVCBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBT ZXEgU2NhbiBvbiBwdWJsaWMuc2wgdDIKKyAgIE91dHB1dDogdDIuYSwgdDIuYiwgdDIuYywg dDIuYSwgdDIuYiwgdDIuYworICAgRmlsdGVyOiAoKHQyLmMgSVMgTk9UIE5VTEwpIEFORCAo dDIuYiBJUyBOT1QgTlVMTCkgQU5EICh0Mi5hIElTIE5PVCBOVUxMKSBBTkQgKHQyLmEgPSAz KSkKKygzIHJvd3MpCisKKy0tIEpvaW4gcXVhbCBpc24ndCBtZXJnZWpvaW5hYmxlLCBidXQg aW5uZXIgaXMgdW5pcXVlLgorZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJP TSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hIEFORCBuMi5hID0gMTsKKyAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChuMS5hIDw+IG4yLmEpCisg ICAtPiAgU2VxIFNjYW4gb24gc2ogbjIKKyAgICAgICAgIEZpbHRlcjogKGEgPSAxKQorICAg LT4gIFNlcSBTY2FuIG9uIHNqIG4xCisoNSByb3dzKQorCitleHBsYWluIChDT1NUUyBPRkYp CitTRUxFQ1QgKiBGUk9NCisJKFNFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJF IG4xLmEgPD4gbjIuYSkgcTAsIHNsCitXSEVSRSBxMC5hID0gMTsKKyAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChuMS5hIDw+IG4yLmEpCisgICAtPiAgTmVz dGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzbAorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHNqIG4yCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhID0gMSkKKyAgIC0+ ICBTZXEgU2NhbiBvbiBzaiBuMQorKDcgcm93cykKKworLS0KKy0tLS0gT25seSBvbmUgc2lk ZSBpcyB1bnFpdWUKKy0tc2VsZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9 IHQyLmEgYW5kIHQxLmIgPSAxOworLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVy ZSB0MS5hID0gdDIuYSBhbmQgdDIuYiA9IDE7CistLQorLS0tLSBTZXZlcmFsIHVuaXF1ZXMg aW5kZXhlcyBtYXRjaCwgYW5kIHdlIHNlbGVjdCBhIGRpZmZlcmVudCBvbmUKKy0tLS0gZm9y IGVhY2ggc2lkZSwgc28gdGhlIGpvaW4gaXMgbm90IHJlbW92ZWQKKy0tY3JlYXRlIHRhYmxl IHNtKGEgaW50IHVuaXF1ZSwgYiBpbnQgdW5pcXVlLCBjIGludCB1bmlxdWUpOworLS1leHBs YWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEg PSBuLmIgYW5kIG0uYyA9IG4uYzsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3Qg KiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5hID0gbi5jIGFuZCBtLmIgPSBuLmI7CistLWV4 cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0u YyA9IG4uYiBhbmQgbS5hID0gbi5hOworLS0gQ2hlY2sgb3B0aW1pemF0aW9uIGRpc2FibGlu ZyBpZiBpdCB3aWxsIHZpb2xhdGUgc3BlY2lhbCBqb2luIGNvbmRpdGlvbnMuCistLSBUd28g aWRlbnRpY2FsIGpvaW5lZCByZWxhdGlvbnMgc2F0aXNmaWVzIHNlbGYgam9pbiByZW1vdmFs IGNvbmRpdGlvbnMgYnV0CistLSBzdGF5IGluIGRpZmZlcmVudCBzcGVjaWFsIGpvaW4gaW5m b3MuCitDUkVBVEUgVEFCTEUgc2pfdDEgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRB QkxFIHNqX3QyIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MyAoaWQg c2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDQgKGlkIHNlcmlhbCwgYSBpbnQp OworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitD UkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CitFWFBMQUlO IChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pf dDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBU UlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0g c2pfdDIuaWQKKwkJKQorCSkgdDJ0M3Q0CitPTiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9J TiAoCisJU0VMRUNUIHNqX3QyLmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMK KwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAx IEFORCBzal90My5pZCA9IHNqX3QyLmlkCisJCSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlk ID0gX3QydDN0NC5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0 ZXI6IChzal90My5pZCA9IHNqX3QxLmlkKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAg ICBKb2luIEZpbHRlcjogKHNqX3QzLmlkID0gc2pfdDIuaWQpCisgICAgICAgICAtPiAgTmVz dGVkIExvb3AgU2VtaSBKb2luCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAg ICAgICAgICAgICAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBHcm91cCBLZXk6IHNqX3QzLmlkCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBzal90NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiBzal90MworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjaGVjayBDb25kOiAoYSA9IDEpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIElu ZGV4IFNjYW4gb24gc2pfdDNfYV9pZF9pZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChhID0gMSkKKyAgICAgICAg ICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9u IHNqX3QyIHNqX3QyXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6 IChpZCA9IHNqX3QzLmlkKQorICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAg ICAgICAgICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QzX2FfaWRf aWR4IG9uIHNqX3QzIHNqX3QzXzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4 IENvbmQ6ICgoYSA9IDEpIEFORCAoaWQgPSBzal90My5pZCkpCisgICAgICAgICAgICAgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gc2pfdDQgc2pfdDRfMQorICAgICAgICAgLT4gIEluZGV4 IE9ubHkgU2NhbiB1c2luZyBzal90Ml9pZF9pZHggb24gc2pfdDIKKyAgICAgICAgICAgICAg IEluZGV4IENvbmQ6IChpZCA9IHNqX3QyXzEuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gc2pf dDEKKygyNCByb3dzKQorCistLQorLS0gVGVzdCBSb3dNYXJrcy1yZWxhdGVkIGNvZGUKKy0t CistLSBUT0RPOiBXaHkgdGhpcyBzZWxlY3QgcmV0dXJucyB0d28gY29pZXMgb2YgY3RpZCBm aWVsZD8gU2hvdWxkIHdlIGZpeCBpdD8KK0VYUExBSU4gKENPU1RTIE9GRikgLS0gQm90aCBz aWRlcyBoYXZlIGV4cGxpY2l0IExvY2tSb3dzIG1hcmtzCitTRUxFQ1QgYTEuYSBGUk9NIHNq IGExLHNqIGEyIFdIRVJFIChhMS5hPWEyLmEpIEZPUiBVUERBVEU7CisgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIExvY2tSb3dzCisgICAtPiAgU2VxIFNjYW4gb24gc2ogYTIKKyAgICAgICAgIEZpbHRl cjogKGEgSVMgTk9UIE5VTEwpCisoMyByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpIC0t IEEgUm93TWFyayBleGlzdHMgZm9yIHRoZSB0YWJsZSBiZWluZyBrZXB0CitVUERBVEUgc2og c3EgU0VUIGIgPSAxIEZST00gc2ogYXMgc3ogV0hFUkUgc3EuYSA9IHN6LmE7CisgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFVwZGF0ZSBvbiBzaiBzcQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHN6Cisg ICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDMgcm93cykKKworQ1JFQVRFIFJV TEUgc2pfZGVsX3J1bGUgQVMgT04gREVMRVRFIFRPIHNqCisgIERPIElOU1RFQUQKKyAgICBV UERBVEUgc2ogU0VUIGEgPSAxIFdIRVJFIGEgPSBvbGQuYTsKK0VYUExBSU4gKENPU1RTIE9G RikgREVMRVRFIEZST00gc2o7IC0tIEEgUm93TWFyayBleGlzdHMgZm9yIHRoZSB0YWJsZSBi ZWluZyBkcm9wcGVkCisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFVwZGF0ZSBvbiBzagorICAgLT4gIFNl cSBTY2FuIG9uIHNqCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDMgcm93 cykKKworRFJPUCBSVUxFIHNqX2RlbF9ydWxlIE9OIHNqIENBU0NBREU7CityZXNldCBlbmFi bGVfaGFzaGpvaW47CityZXNldCBlbmFibGVfbWVyZ2Vqb2luOwogLS0KIC0tIFRlc3QgaGlu dHMgZ2l2ZW4gb24gaW5jb3JyZWN0IGNvbHVtbiByZWZlcmVuY2VzIGFyZSB1c2VmdWwKIC0t CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CmluZGV4IDRlNzc1YWYx NzUuLmM3MzRkNWVjYTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv c3lzdmlld3Mub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mu b3V0CkBAIC0xMjksMTAgKzEyOSwxMSBAQCBzZWxlY3QgbmFtZSwgc2V0dGluZyBmcm9tIHBn X3NldHRpbmdzIHdoZXJlIG5hbWUgbGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxlX3BhcnRpdGlv bl9wcnVuaW5nICAgICAgIHwgb24KICBlbmFibGVfcGFydGl0aW9ud2lzZV9hZ2dyZWdhdGUg fCBvZmYKICBlbmFibGVfcGFydGl0aW9ud2lzZV9qb2luICAgICAgfCBvZmYKKyBlbmFibGVf c2VsZl9qb2luX3JlbW92YWwgICAgICAgfCBvbgogIGVuYWJsZV9zZXFzY2FuICAgICAgICAg ICAgICAgICB8IG9uCiAgZW5hYmxlX3NvcnQgICAgICAgICAgICAgICAgICAgIHwgb24KICBl bmFibGVfdGlkc2NhbiAgICAgICAgICAgICAgICAgfCBvbgotKDIxIHJvd3MpCisoMjIgcm93 cykKIAogLS0gVGVzdCB0aGF0IHRoZSBwZ190aW1lem9uZV9uYW1lcyBhbmQgcGdfdGltZXpv bmVfYWJicmV2cyB2aWV3cyBhcmUKIC0tIG1vcmUtb3ItbGVzcyB3b3JraW5nLiAgV2UgY2Fu J3QgdGVzdCB0aGVpciBjb250ZW50cyBpbiBhbnkgZ3JlYXQgZGV0YWlsCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCBiL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL2VxdWl2Y2xhc3Muc3FsCmluZGV4IDI0N2IwYTMxMDUuLjc3ZGQ5NjRlYmYgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsCisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsCkBAIC0yNTksNiArMjU5LDIyIEBA IGRyb3AgdXNlciByZWdyZXNzX3VzZXJfZWN0ZXN0OwogZXhwbGFpbiAoY29zdHMgb2ZmKQog ICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIGFuZCB1bmlx dWUyID0gdW5pcXVlMjsKIAorLS0gVGVzdCB0aGF0IGJyb2tlbiBFQ3MgYXJlIHByb2Nlc3Nl ZCBjb3JyZWN0bHkgZHVyaW5nIHNlbGYgam9pbiByZW1vdmFsLgorLS0gRGlzYWJsZSBtZXJn ZSBqb2lucyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBlcnJvciBhYm91dCBtaXNzaW5nIGNv bW11dGF0b3IuCistLSBUZXN0IGJvdGggb3JpZW50YXRpb25zIG9mIHRoZSBqb2luIGNsYXVz ZSwgYmVjYXVzZSBvbmx5IG9uZSBvZiB0aGVtIGJyZWFrcworLS0gdGhlIEVDLgorc2V0IGVu YWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworCitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVj dCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2luIGVjMSBw IG9uIG0uZmYgKyBuLmZmID0gcC5mMTsKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxl Y3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEg cCBvbiBwLmYxOjppbnQ4ID0gKG0uZmYgKyBuLmZmKTo6aW50OGFsaWFzMTsKKworcmVzZXQg ZW5hYmxlX21lcmdlam9pbjsKKwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQsIGJ1dCBp c24ndCBhdCBwcmVzZW50CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20g dGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVuaXF1ZTI7CmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2pvaW4uc3FsCmluZGV4IGEyN2E3MjA4NmUuLmNjYTMxODk2ZDAgMTAwNjQ0 Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2pvaW4uc3FsCkBAIC0xNzUzLDYgKzE3NTMsMjkyIEBAIHNlbGVjdCAqIGZy b20KIHNlbGVjdCAqIGZyb20KICAgaW50OF90YmwgeCBqb2luIChpbnQ0X3RibCB4IGNyb3Nz IGpvaW4gaW50NF90YmwgeShmZikpIGogb24gcTEgPSBmMTsgLS0gb2sKIAorLS0KKy0tIHRl c3QgdGhhdCBzZW1pLSBvciBpbm5lciBzZWxmLWpvaW5zIG9uIGEgdW5pcXVlIGNvbHVtbiBh cmUgcmVtb3ZlZAorLS0KKworLS0gZW5hYmxlIG9ubHkgbmVzdGxvb3AgdG8gZ2V0IG1vcmUg cHJlZGljdGFibGUgcGxhbnMKK3NldCBlbmFibGVfaGFzaGpvaW4gdG8gb2ZmOworc2V0IGVu YWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworCitjcmVhdGUgdGFibGUgc2ogKGEgaW50IHVuaXF1 ZSwgYiBpbnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50byBzaiB2YWx1ZXMgKDEsIG51 bGwsIDIpLCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsKK2FuYWx5emUgc2o7CisKKy0t IFRyaXZpYWwgc2VsZi1qb2luIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3Qg cC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9IHEuYSAtIDE7 CitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9 IHEuYSAtIDE7CisKKy0tIFNlbGYtam9pbiByZW1vdmFsIHBlcmZvcm1zIGFmdGVyIGEgc3Vi cXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3VsZCByZW1vdmUKKy0tIHN1Y2gga2luZCBv ZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9wdGlvbi4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNq IHEKKwkJCQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKK3NlbGVjdCAqIGZyb20g c2ogcCB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2ogcSB3aGVyZSBxLmEgPSBwLmEg YW5kIHEuYiA8IDEwKTsKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBmb3IgdGhlIGNh c2Ugb2YgZXF1YWxpdHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1ucy4KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEg PSB0Mi5jIGFuZCB0MS5iIGlzIG5vdCBudWxsOworCistLSBEZWdlbmVyYXRlZCBjYXNlLgor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbQorCShzZWxlY3QgYSBhcyB4IGZy b20gc2ogd2hlcmUgZmFsc2UpIGFzIHExLAorCShzZWxlY3QgYSBhcyB5IGZyb20gc2ogd2hl cmUgZmFsc2UpIGFzIHEyCit3aGVyZSBxMS54ID0gcTIueTsKKworLS0gV2UgY2FuJ3QgdXNl IGEgY3Jvc3MtRUMgZ2VuZXJhdGVkIHNlbGYgam9pbiBxdWFsIGJlY2F1c2Ugb2YgY3VycmVu dCBsb2dpYyBvZgorLS0gdGhlIGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0aWVzIHJv dXRpbmUuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0 MiB3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hOwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIsIHNqIHQz Cit3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hCisJ YW5kIHQxLmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKworLS0gRG91YmxlIHNlbGYtam9p biByZW1vdmFsLgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5vdCBvbiAiYiIs IGZvciB0aGUgc2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFsZW5jZSBjbGFz cyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2FuCistLSB0ZXN0 IHRoZSBub24tZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzaiB0MSBqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gdDIuYgor CWpvaW4gc2ogdDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMuYiArIDE7CisK Ky0tIHN1YnNlbGVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVsYXRpb24KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJvbSBzaiB3aGVy ZSBhID0gdDIuYSBhbmQgYSA9IHQxLmEpCitmcm9tIHNqIHQxLCBzaiB0Mgord2hlcmUgdDEu YSA9IHQyLmE7CisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBqb2luCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQor bGVmdCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKworZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQg am9pbiBpbnQ4X3RibCB6IG9uIHkuYSA9IHoucTE7CisKKy0tIFRlc3QgdGhhdCBwbGFjZWhv bGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAorbGVmdCBqb2lu IChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJcmlnaHQgam9p biBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24gdHJ1ZSkgegor b24gdHJ1ZTsKKworLS0KKy0tIFNKUiBjb3JuZXIgY2FzZTogdW5pcXVlbmVzcyBvZiBhbiBp bm5lciBpcyBbcGFydGlhbGx5XSBkZXJpdmVkIGZyb20KKy0tIGJhc2VyZXN0cmljdGluZm8g Y2xhdXNlcy4KKy0tIFhYWDogV2UgcmVhbGx5IHNob3VsZCBhbGxvdyBTSlIgZm9yIHRoZXNl IGNvcm5lciBjYXNlcz8KKy0tCisKK0lOU0VSVCBJTlRPIHNqIFZBTFVFUyAoMywgMSwgMyk7 CisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBq Mi5hID0gMzsKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIu YiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOyAtLSBSZXR1cm4gb25lIGNvbHVtbgorCitl eHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7CitT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEg PSAyIEFORCBqMi5hID0gMjsgLS0gUmV0dXJuIG9uZSBjb2x1bW4KKworZXhwbGFpbiAoY29z dHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVS RSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDEgQU5EIGoyLmEgPSAxOworU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIu YSA9IDE7IC0tIFJldHVybiBubyBjb2x1bW5zCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0g U2h1ZmZsZSBhIGNsYXVzZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEg QU5EIGoyLmEgPSAxOyAtLSBSZXR1cm4gbm8gY29sdW1ucworCistLSBGdW5jdGlvbmFsIGlu ZGV4CitDUkVBVEUgVU5JUVVFIElOREVYIHNqX2ZuX2lkeCBPTiBzaigoYSAqIGEpKTsKK2V4 cGxhaW4gKGNvc3RzIG9mZikgLS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwg c2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIuYSpq Mi5hID0gMTsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpq MS5hID0gMSBBTkQgajIuYSpqMi5hID0gMjsKKworLS0gTXVsdGlwbGUgZmlsdGVycworQ1JF QVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeDEgT04gc2ooYSxiLGMpOworZXhwbGFpbiAo Y29zdHMgb2ZmKSAtLSBSZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgor CVdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQgajEuYyA9IDMgQU5EIGoyLmEg PSAyIEFORCAzID0gajIuYzsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3Zl IFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBB TkQgMiA9IGoxLmEgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMSBBTkQgMyA9IGoyLmM7CisK K0NSRUFURSBVTklRVUUgSU5ERVggc2pfdGVtcF9pZHggT04gc2ooYSxiKTsKK2V4cGxhaW4g KGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwg c2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyOworZXhwbGFpbiAoY29zdHMg b2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBX SEVSRSBqMS5iID0gajIuYiBBTkQgMiA9IGoyLmE7CitleHBsYWluIChjb3N0cyBvZmYpIC0t IERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGox LmIgPSBqMi5iIEFORCAoajEuYSA9IDEgT1IgajIuYSA9IDEpOworRFJPUCBJTkRFWCBzal9m bl9pZHgsIHNqX3RlbXBfaWR4MSwgc2pfdGVtcF9pZHg7CisKKy0tIFRlc3QgdGhhdCBPUiBw cmVkaWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK0NS RUFURSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBpc19mbGFn IFNNQUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRhYl93aXRo X2ZsYWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENPVU5UKCop IEZST00gdGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNfZmxhZyBJUyBOVUxMIE9SIGlzX2Zs YWcgPSAwKQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVS RSBpZCBJTiAoMiwgMykpOworRFJPUCBUQUJMRSB0YWJfd2l0aF9mbGFnOworCistLSBIQVZJ TkcgY2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBq b2luIHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAx OworCistLSB1cGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRy eSByZWZlcmVuY2UKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZy b20gKHNlbGVjdCB4LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAg bGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKworZXhwbGFpbiAodmVy Ym9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHkuKiBmcm9tIHNqIHgs IHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3Nlcmllcygx LCBxLmEpIGdzKGkpOworCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNs YXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28g dGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3Qg KiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBv biBwLmEgKyBxLmEgPSByLmE7CisKKy0tIEZJWE1FIHRoaXMgY29uc3RhbnQgZmFsc2UgZmls dGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2UgbWVyZ2UKKy0tIGVxdWl2YWxlbmNl IGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAsIHNq IHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFuZCBxLmIgPSAyOworCistLSBDaGVj ayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9p biByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlz IHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYg dGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBu b3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2Ug ZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2Fu LiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBk ZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNr IChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29s bGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWlu IChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5h ID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBq MS5iID0gazEuYjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBr MSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIg b24gajEuYSA9IGoyLmEpIG9uIGoyLmIgPSBrMS5iOworcmVzZXQgam9pbl9jb2xsYXBzZV9s aW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworCistLSBDaGVjayB0aGF0IGNsYXVzZXMg ZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1qb2lu IHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5P VCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxF Q1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIu Y29kZSA8PiBlMS5jb2RlOworCistLSBXZSBjYW4gcmVtb3ZlIHRoZSBqb2luIGV2ZW4gaWYg d2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUgcm93cyBhbmQKKy0tIHRoZSBiYXNl IHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50LiAgSW4gdGhlIGZvbGxvd2luZyBj YXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92ZXIgdG8gczEgdG8gbWFrZSBpdCBz byBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0ZSB0YWJsZSBzbChhIGludCwgYiBp bnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2woYSwgYik7Cit2YWN1dW0g YW5hbHl6ZSBzbDsKKworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFzZSBxdWFs cyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNs IHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAy OworCistLSBDaGVjayBOdWxsVGVzdCBpbiBiYXNlcmVzdHJpY3RpbmZvIGxpc3QKK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyCit3aGVyZSB0MS5h ID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyCisgIGFuZCB0MS5jIElTIE5PVCBO VUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElTIE5PVCBOVUxMIGFuZCB0 MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxMIGFuZCB0Mi5hIElTIE5P VCBOVUxMOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz bCB0MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFuZCB0Mi5hID0gMyBhbmQgdDEuYSA9 IDMKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAgYW5k IHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEgSVMg Tk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisKKy0tIEpvaW4gcXVhbCBpc24ndCBt ZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVlLgorZXhwbGFpbiAoQ09TVFMgT0ZG KQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hIEFO RCBuMi5hID0gMTsKK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00KKwkoU0VM RUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hKSBxMCwgc2wK K1dIRVJFIHEwLmEgPSAxOworCistLQorLS0tLSBPbmx5IG9uZSBzaWRlIGlzIHVucWl1ZQor LS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEu YiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5h IGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwgdW5pcXVlcyBpbmRleGVzIG1hdGNo LCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQorLS0tLSBmb3IgZWFjaCBzaWRlLCBz byB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVhdGUgdGFibGUgc20oYSBpbnQgdW5p cXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7CistLWV4cGxhaW4gKGNvc3RzIG9m ZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYiBhbmQgbS5j ID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwg c20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4uYjsKKy0tZXhwbGFpbiAoY29zdHMg b2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5jID0gbi5iIGFuZCBt LmEgPSBuLmE7CisKKy0tIENoZWNrIG9wdGltaXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2ls bCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBq b2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25z IGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRF IFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAo aWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBp bnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJpYWwsIGEgaW50KTsKKworQ1JFQVRF IFVOSVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5J UVVFIElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CisKK0VYUExBSU4gKENPU1RT IE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBB UyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJP TSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5p ZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0gdDJ0M3Q0LmlkCitKT0lOICgKKwlT RUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJFIEVYSVNUUworCQkoCisJ CVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNq X3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0NAorT04gc2pfdDEuaWQgPSBfdDJ0 M3Q0LmlkOworCistLQorLS0gVGVzdCBSb3dNYXJrcy1yZWxhdGVkIGNvZGUKKy0tCisKKy0t IFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3byBjb2llcyBvZiBjdGlkIGZpZWxk PyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBCb3RoIHNpZGVz IGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NFTEVDVCBhMS5hIEZST00gc2ogYTEs c2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKworRVhQTEFJTiAoQ09TVFMg T0ZGKSAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVpbmcga2VwdAorVVBE QVRFIHNqIHNxIFNFVCBiID0gMSBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEgPSBzei5hOwor CitDUkVBVEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAgRE8gSU5T VEVBRAorICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOworRVhQTEFJ TiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3Ig dGhlIHRhYmxlIGJlaW5nIGRyb3BwZWQKK0RST1AgUlVMRSBzal9kZWxfcnVsZSBPTiBzaiBD QVNDQURFOworCityZXNldCBlbmFibGVfaGFzaGpvaW47CityZXNldCBlbmFibGVfbWVyZ2Vq b2luOworCiAtLQogLS0gVGVzdCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJl ZmVyZW5jZXMgYXJlIHVzZWZ1bAogLS0KLS0gCjIuMzQuMQoK --------------Oc8S0Z6y70bKiikVPvhmdCSv--