From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 14D09C64ED8 for ; Mon, 27 Feb 2023 16:53:03 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.502822.774822 (Exim 4.92) (envelope-from ) id 1pWgk6-0004J2-Mh; Mon, 27 Feb 2023 16:52:50 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 502822.774822; Mon, 27 Feb 2023 16:52:50 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pWgk6-0004Iv-I4; Mon, 27 Feb 2023 16:52:50 +0000 Received: by outflank-mailman (input) for mailman id 502822; Mon, 27 Feb 2023 16:52:48 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pWgk4-0004Im-7p for xen-devel@lists.xenproject.org; Mon, 27 Feb 2023 16:52:48 +0000 Received: from mail-lf1-x131.google.com (mail-lf1-x131.google.com [2a00:1450:4864:20::131]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 27adf7b1-b6bf-11ed-a82a-c9ca1d2f71af; Mon, 27 Feb 2023 17:52:44 +0100 (CET) Received: by mail-lf1-x131.google.com with SMTP id n2so9346498lfb.12 for ; Mon, 27 Feb 2023 08:52:44 -0800 (PST) Received: from [192.168.8.114] (46.204.108.203.nat.umts.dynamic.t-mobile.pl. [46.204.108.203]) by smtp.gmail.com with ESMTPSA id d13-20020a05651221cd00b004db2b111bf3sm960073lft.21.2023.02.27.08.52.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 08:52:42 -0800 (PST) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 27adf7b1-b6bf-11ed-a82a-c9ca1d2f71af DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject :date:message-id:reply-to; bh=KwJsQyxIb5KnY18DxB3AUagY47WqcQdOBCCPO+/CiUw=; b=PHZgsRFwf/48FChyfhOWOeOv69t7N3PMuXkrlLGX0hu8VaA0C2TPAc4K6SKTu6+GgW Ig7dvfaZrQmdwKMi3h0LaPNuhGye8Wc4k1E/gRuZ/6lKnJoJk7Lw7RSMEOaDwu/9EClh Cvlnq8DHzl6OvgG1YC9n447saB2SEUjGXFASaNvvBe3/nwF2mzkEbBcpB8mDzh4FQTxl SEK09V3sQe7pEmzqo0z/xJrVMXu+DV/1tPbc1mKWZPH6Mg+KeqQiCkBdcwc5Kc1ch5s8 luUjqrIaDmOZvofjK5iON9f7fPqJ76omyYEn+dy6oBI6aZbA89AQqbnYGAef8P1Su9W9 UZ7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=KwJsQyxIb5KnY18DxB3AUagY47WqcQdOBCCPO+/CiUw=; b=gCsDf0n4FS7awbyQYYokHru3cSCtgDL8PTPN//2yOLD/v3WT93/+tNDtmo2nrq7dO1 9kwMqbIB060pwC37XMp4y8VhxRXvw1ywnZli1cbxVsmek7iK7fQaMOKVDYir6/mxSe5u y11D2kmrGaEZYbUHl8rsPiatFxI+LCuuDOJt6SvCpL3tpSaPI/kswAhDkU8Y4U4DTtVa d+8Uv/nd8XFCoAvYfR5igFBUbYgqdxX5u6e7vsYIl0GqVuzmTMxt0Gt1DZv8Ld+KjSfM ZCXco+Vf0Z2ztPDBAkOMCnMWeV1KIlijNRZThBfIrhllJT+D/p10ENQoXoQAj7L6PKE/ tgiQ== X-Gm-Message-State: AO0yUKU08l2UqRJjwLG1tpACciVeYEKMgF0+PABMlStK1f+CShMbWoGR alDRU4ZnfvwAEtMoB8aUIUM= X-Google-Smtp-Source: AK7set9vl4D6ST9vxby9Fyd7gDeNDgHU4yfyvM9nouKxlTPYkfIvdOcNsTvYg4pZnvs3tXaF57WWwg== X-Received: by 2002:ac2:488f:0:b0:4d8:71dd:5c5e with SMTP id x15-20020ac2488f000000b004d871dd5c5emr7342021lfc.37.1677516763094; Mon, 27 Feb 2023 08:52:43 -0800 (PST) Message-ID: Subject: Re: [PATCH v1 1/3] xen/riscv: introduce setup_initial_pages From: Oleksii To: Julien Grall , xen-devel@lists.xenproject.org Cc: Andrew Cooper , Stefano Stabellini , Gianluca Guida , Bob Eshleman , Alistair Francis , Connor Davis Date: Mon, 27 Feb 2023 18:52:41 +0200 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.3 (3.46.3-1.fc37) MIME-Version: 1.0 T24gU2F0LCAyMDIzLTAyLTI1IGF0IDE3OjUzICswMDAwLCBKdWxpZW4gR3JhbGwgd3JvdGU6Cj4g SGkgT2xla3NpaSwKPiAKPiBPbiAyNC8wMi8yMDIzIDE1OjA2LCBPbGVrc2lpIEt1cm9jaGtvIHdy b3RlOgo+ID4gTW9zdGx5IHRoZSBjb2RlIGZvciBzZXR1cF9pbml0aWFsX3BhZ2VzIHdhcyB0YWtl biBmcm9tIEJvYmJ5J3MKPiA+IHJlcG8gZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIGNoYW5nZXM6 Cj4gPiAqIFVzZSBvbmx5IGEgbWluaW1hbCBwYXJ0IG9mIHRoZSBjb2RlIGVub3VnaCB0byBlbmFi bGUgTU1VCj4gPiAqIHJlbmFtZSB7X31zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMgZnVuY3Rpb25z Cj4gPiAqIGFkZCB3cml0YWJsZSBhcmd1bWVudCBmb3IgX3NldHVwX2luaXRpYWxfcGFnZXRhYmxl cyB0byBoYXZlCj4gPiDCoMKgIGFuIG9wcG9ydHVuaXR5IHRvIG1ha2Ugc29tZSBzZWN0aW9ucyBy ZWFkLW9ubHkKPiA+ICogdXBkYXRlIHNldHVwX2luaXRpYWxfcGFnZXRhYmxlcyBmdW5jdGlvbiB0 byBtYWtlIHNvbWUgc2VjdGlvbnMKPiA+IMKgwqAgcmVhZC1vbmx5Cj4gPiAqIGNoYW5nZSB0aGUg b3JkZXIgb2YgX3NldHVwX2luaXRhbF9wYWdldGFibGVzKCkKPiA+IMKgwqAgaW4gc2V0dXBfaW5p dGlhbF9wYWdldGFibGUoKToKPiA+IMKgwqAgKiBmaXJzdCBpdCBpcyBjYWxsZWQgZm9yIHRleHQs IGluaXQsIHJvZGF0YSBzZWN0aW9ucwo+ID4gwqDCoCAqIGFmdGVyIGNhbGwgaXQgZm9yIHJhbmdl cyBbbGlua19hZGRyX3N0YXJ0IDogbGlua19hZGRyX2VuZF0gYW5kCj4gPiDCoMKgwqDCoCBbbG9h ZF9hZGRyX3N0YXJ0IDogbG9hZF9hZGRyX2VuZF0KPiA+IMKgwqAgQmVmb3JlIGl0IHdhcyBkb25l IGZpcnN0IGZvciB0aGUgcmFuZ2VzIGFuZCBhZnRlciBmb3Igc2VjdGlvbnMKPiA+IGJ1dAo+ID4g wqDCoCBpbiB0aGF0IGNhc2UgcmVhZC1vbmx5IHN0YXR1cyB3aWxsIGJlIGVxdWFsIHRvICd0cnVl JyBhbmQKPiA+IMKgwqAgYXMgc2VjdGlvbnMnIGFkZHJlc3Nlc8KgIGNhbi9hcmUgaW5zaWRlIHRo ZSByYW5nZXMgdGhlIHJlYWQtb25seQo+ID4gc3RhdHVzCj4gPiDCoMKgIHdvbid0IGJlIHVwZGF0 ZWQgZm9yIHRoZW0gYXMgaXQgd2FzIHNldCB1cCBiZWZvcmUuCj4gPiAKPiA+IE9yaWdpbjoKPiA+ IGh0dHBzOi8vZ2l0bGFiLmNvbS94ZW4tb24tcmlzYy12L3hlbi8tL3RyZWUvcmlzY3YtcmViYXNl wqA0YWYxNjViNDY4Cj4gPiBhZgo+ID4gU2lnbmVkLW9mZi1ieTogT2xla3NpaSBLdXJvY2hrbyA8 b2xla3NpaS5rdXJvY2hrb0BnbWFpbC5jb20+Cj4gPiAtLS0KPiA+IMKgIHhlbi9hcmNoL3Jpc2N2 L01ha2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArCj4gPiDCoCB4ZW4vYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS9tbS5owqDCoCB8wqDCoCA5ICsrCj4gPiDCoCB4ZW4vYXJjaC9yaXNj di9pbmNsdWRlL2FzbS9wYWdlLmggfMKgIDkwICsrKysrKysrKysrKwo+ID4gwqAgeGVuL2FyY2gv cmlzY3YvbW0uY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAyMjMKPiA+ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gwqAgNCBmaWxlcyBjaGFuZ2VkLCAzMjMgaW5zZXJ0 aW9ucygrKQo+ID4gwqAgY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9hcmNoL3Jpc2N2L2luY2x1ZGUv YXNtL21tLmgKPiA+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vYXJjaC9yaXNjdi9pbmNsdWRl L2FzbS9wYWdlLmgKPiA+IMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vYXJjaC9yaXNjdi9tbS5j Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS94ZW4vYXJjaC9yaXNjdi9NYWtlZmlsZSBiL3hlbi9hcmNo L3Jpc2N2L01ha2VmaWxlCj4gPiBpbmRleCA0NDNmNmJmMTVmLi45NTZjZWIwMmRmIDEwMDY0NAo+ ID4gLS0tIGEveGVuL2FyY2gvcmlzY3YvTWFrZWZpbGUKPiA+ICsrKyBiL3hlbi9hcmNoL3Jpc2N2 L01ha2VmaWxlCj4gPiBAQCAtMSw1ICsxLDYgQEAKPiA+IMKgIG9iai0kKENPTkZJR19FQVJMWV9Q UklOVEspICs9IGVhcmx5X3ByaW50ay5vCj4gPiDCoCBvYmoteSArPSBlbnRyeS5vCj4gPiArb2Jq LXkgKz0gbW0ubwo+ID4gwqAgb2JqLSQoQ09ORklHX1JJU0NWXzY0KSArPSByaXNjdjY0Lwo+ID4g wqAgb2JqLXkgKz0gc2JpLm8KPiA+IMKgIG9iai15ICs9IHNldHVwLm8KPiA+IGRpZmYgLS1naXQg YS94ZW4vYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9tbS5oCj4gPiBiL3hlbi9hcmNoL3Jpc2N2L2lu Y2x1ZGUvYXNtL21tLmgKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAw MDAwLi5mYzE4NjZiMWQ4Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi94ZW4vYXJjaC9yaXNj di9pbmNsdWRlL2FzbS9tbS5oCj4gPiBAQCAtMCwwICsxLDkgQEAKPiA+ICsjaWZuZGVmIF9BU01f UklTQ1ZfTU1fSAo+ID4gKyNkZWZpbmUgX0FTTV9SSVNDVl9NTV9ICj4gPiArCj4gPiArdm9pZCBz ZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXModW5zaWduZWQgbG9uZyBsb2FkX2FkZHJfc3RhcnQsCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nIGxvYWRfYWRkcl9lbmQsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGxp bmtlcl9hZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBsaW5rZXJfYWRkcl9lbmQpOwo+ ID4gKwo+ID4gKyNlbmRpZiAvKiBfQVNNX1JJU0NWX01NX0ggKi8KPiA+IGRpZmYgLS1naXQgYS94 ZW4vYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wYWdlLmgKPiA+IGIveGVuL2FyY2gvcmlzY3YvaW5j bHVkZS9hc20vcGFnZS5oCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAw MDAwMC4uZmFiYmUxMzA1Zgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIveGVuL2FyY2gvcmlz Y3YvaW5jbHVkZS9hc20vcGFnZS5oCj4gPiBAQCAtMCwwICsxLDkwIEBACj4gPiArI2lmbmRlZiBf QVNNX1JJU0NWX1BBR0VfSAo+ID4gKyNkZWZpbmUgX0FTTV9SSVNDVl9QQUdFX0gKPiA+ICsKPiA+ ICsjaW5jbHVkZSA8eGVuL2NvbnN0Lmg+Cj4gPiArI2luY2x1ZGUgPHhlbi90eXBlcy5oPgo+ID4g Kwo+ID4gKyNkZWZpbmUgUEFHRV9FTlRSSUVTwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA1MTIKPiAK PiBOSVQ6IEFGQUlVLCB0aGUgbnVtYmVyIGhlcmUgaXMgYmFzZWQgb24gLi4uCj4gCj4gPiArI2Rl ZmluZSBWUE5fQklUU8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoOSkKPiAKPiAuLi4g dGhpcy4gU28gSSB3b3VsZCBzdWdnZXN0IHRvIGRlZmluZSBQQUdFX0VOVFJJRVMgdXNpbmcgVlBO X0JJVFMuClN1cmUuIEl0IHNob3VsZCBiZSBkZWZpbmVkIHVzaW5nIFZQTl9CSVRTLiBUaGFua3Mu Cj4gCj4gPiArI2RlZmluZSBWUE5fTUFTS8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo KHVuc2lnbmVkIGxvbmcpKCgxIDw8IFZQTl9CSVRTKSAtCj4gPiAxKSkKPiBOSVQ6IFVzZSAxVUwg YW5kIHlvdSBjYW4gYXZvaWQgdGhlIGNhc3QuClRoYW5rcy4gSSdsbCB1cGRhdGUgdGhhdCBpbiB0 aGUgbmV4dCB2ZXJzaW9uIG9mIHBhdGNoIHNlcmllcy4KPiAKPiA+ICsKPiA+ICsjaWZkZWYgQ09O RklHX1JJU0NWXzY0Cj4gPiArLyogTDMgaW5kZXggQml0WzQ3OjM5XSAqLwo+ID4gKyNkZWZpbmUg VEhJUkRfU0hJRlTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKDM5KQo+ID4gKyNkZWZpbmUgVEhJ UkRfTUFTS8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChWUE5fTUFTSyA8PCBUSElSRF9TSElG VCkKPiA+ICsvKiBMMiBpbmRleCBCaXRbMzg6MzBdICovCj4gPiArI2RlZmluZSBTRUNPTkRfU0hJ RlTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgzMCkKPiA+ICsjZGVmaW5lIFNFQ09ORF9NQVNLwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChWUE5fTUFTSyA8PCBTRUNPTkRfU0hJRlQpCj4gPiArLyog TDEgaW5kZXggQml0WzI5OjIxXSAqLwo+ID4gKyNkZWZpbmUgRklSU1RfU0hJRlTCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKDIxKQo+ID4gKyNkZWZpbmUgRklSU1RfTUFTS8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIChWUE5fTUFTSyA8PCBGSVJTVF9TSElGVCkKPiA+ICsvKiBMMCBpbmRleCBC aXRbMjA6MTJdICovCj4gPiArI2RlZmluZSBaRVJPRVRIX1NISUZUwqDCoMKgwqDCoMKgwqDCoMKg wqAgKDEyKQo+ID4gKyNkZWZpbmUgWkVST0VUSF9NQVNLwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo VlBOX01BU0sgPDwgWkVST0VUSF9TSElGVCkKPiAKPiBPbiBBcm0sIHdlIGFyZSB0cnlpbmcgdG8g cGhhc2Ugb3V0IFpFUk9FVEhfKiBhbmQgY28gYmVjYXVzZSB0aGUgbmFtZQo+IGlzIAo+IHRvbyBn ZW5lcmljLiBJbnN0ZWFkLCB3ZSBub3cgaW50cm9kdWNlIGEgZ2VuZXJpYyBtYWNybyB0aGF0IHRh a2UgYQo+IGxldmVsIAo+IGFuZCB0aGVuIGNvbXB1dGUgdGhlIG1hc2svc2hpZnQgKHNlZSBYRU5f UFRfTEVWRUxfKikuCj4gCj4gWW91IHNob3VsZCBiZSBhYmxlIHRvIGRvIGluIFJJU0MtViBhbmQg cmVkdWNlIHRoZSBhbW91bnQgb2YgZGVmaW5lcyAKPiBpbnRyb2R1Y2VkLgpUaGFua3MuIEknbGwg bG9vayBhdCBYRU5fUFRfTEVWRUxfKi4gSSdsbCByZS1yZWFkIEFuZHJldydzIGNvbW1lbnQgYnV0 CmFzIGZhciBhcyBJIHVuZGVyc3RhbmQgYWZ0ZXIgcXVpY2sgcmVhZGluZyB3ZSBjYW4gcmVtb3Zl IG1vc3RseSB0aGF0Lgo+IAo+ID4gKwo+ID4gKyNlbHNlIC8vIENPTkZJR19SSVNDVl8zMgo+IAo+ IENvZGluZyBzdHlsZTogY29tbWVudHMgaW4gWGVuIGFyZSB1c2luZyAvKiAuLi4gKi8KPiAKPiA+ ICsKPiA+ICsvKiBMMSBpbmRleCBCaXRbMzE6MjJdICovCj4gPiArI2RlZmluZSBGSVJTVF9TSElG VMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoMjIpCj4gPiArI2RlZmluZSBGSVJTVF9NQVNLwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFZQTl9NQVNLIDw8IEZJUlNUX1NISUZUKQo+ID4gKwo+ ID4gKy8qIEwwIGluZGV4IEJpdFsyMToxMl0gKi8KPiA+ICsjZGVmaW5lIFpFUk9FVEhfU0hJRlTC oMKgwqDCoMKgwqDCoMKgwqDCoCAoMTIpCj4gPiArI2RlZmluZSBaRVJPRVRIX01BU0vCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIChWUE5fTUFTSyA8PCBaRVJPRVRIX1NISUZUKQo+ID4gKyNlbmRpZgo+ ID4gKwo+ID4gKyNkZWZpbmUgVEhJUkRfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgx IDw8IFRISVJEX1NISUZUKQo+ID4gKyNkZWZpbmUgVEhJUkRfTUFQX01BU0vCoMKgwqDCoMKgwqDC oMKgwqAgKH4oVEhJUkRfU0laRSAtIDEpKQo+ID4gKyNkZWZpbmUgU0VDT05EX1NJWkXCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKDEgPDwgU0VDT05EX1NISUZUKQo+ID4gKyNkZWZpbmUgU0VDT05E X01BUF9NQVNLwqDCoMKgwqDCoMKgwqDCoCAofihTRUNPTkRfU0laRSAtIDEpKQo+ID4gKyNkZWZp bmUgRklSU1RfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgxIDw8IEZJUlNUX1NISUZU KQo+ID4gKyNkZWZpbmUgRklSU1RfTUFQX01BU0vCoMKgwqDCoMKgwqDCoMKgwqAgKH4oRklSU1Rf U0laRSAtIDEpKQo+ID4gKyNkZWZpbmUgWkVST0VUSF9TSVpFwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAoMSA8PCBaRVJPRVRIX1NISUZUKQo+ID4gKyNkZWZpbmUgWkVST0VUSF9NQVBfTUFTS8KgwqDC oMKgwqDCoMKgICh+KFpFUk9FVEhfU0laRSAtIDEpKQo+ID4gKwo+ID4gKyNkZWZpbmUgUFRFX1NI SUZUwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAxMAo+ID4gKwo+ID4gKyNkZWZpbmUgUFRF X1ZBTElEwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMCwgVUwpCj4gPiArI2RlZmlu ZSBQVEVfUkVBREFCTEXCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgxLCBVTCkKPiA+ICsjZGVm aW5lIFBURV9XUklUQUJMRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDIsIFVMKQo+ID4gKyNk ZWZpbmUgUFRFX0VYRUNVVEFCTEXCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDMsIFVMKQo+ID4gKyNk ZWZpbmUgUFRFX1VTRVLCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDQsIFVMKQo+ ID4gKyNkZWZpbmUgUFRFX0dMT0JBTMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCg1LCBV TCkKPiA+ICsjZGVmaW5lIFBURV9BQ0NFU1NFRMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDYs IFVMKQo+ID4gKyNkZWZpbmUgUFRFX0RJUlRZwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBC SVQoNywgVUwpCj4gPiArI2RlZmluZSBQVEVfUlNXwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKEJJVCg4LCBVTCkgfCBCSVQoOSwgVUwpKQo+ID4gKwo+ID4gKyNkZWZpbmUgUFRFX0xF QUZfREVGQVVMVMKgwqDCoMKgwqDCoMKgIChQVEVfVkFMSUQgfCBQVEVfUkVBREFCTEUgfAo+ID4g UFRFX1dSSVRBQkxFIHwgUFRFX0VYRUNVVEFCTEUpCj4gCj4gV2Ugc2hvdWxkIGF2b2lkIHZ1bG5l cmFibGUgZGVmYXVsdCBmbGFncy4gU28gdGhpcyBzaG91bGQgZWl0aGVyIGJlIFJXCj4gb3IgUlgu ClRoYW5rcy4gSSdsbCB0YWtlIGl0IGludG8gYWNjb3VudC4KPiAKPiA+ICsjZGVmaW5lIFBURV9U QUJMRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFBURV9WQUxJRCkKPiA+ICsKPiA+ICsv KiBDYWxjdWxhdGUgdGhlIG9mZnNldHMgaW50byB0aGUgcGFnZXRhYmxlcyBmb3IgYSBnaXZlbiBW QSAqLwo+ID4gKyNkZWZpbmUgemVyb2V0aF9saW5lYXJfb2Zmc2V0KHZhKcKgwqAgKCh2YSkgPj4g WkVST0VUSF9TSElGVCkKPiA+ICsjZGVmaW5lIGZpcnN0X2xpbmVhcl9vZmZzZXQodmEpwqDCoMKg wqAgKCh2YSkgPj4gRklSU1RfU0hJRlQpCj4gPiArI2RlZmluZSBzZWNvbmRfbGluZWFyX29mZnNl dCh2YSnCoMKgwqAgKCh2YSkgPj4gU0VDT05EX1NISUZUKQo+ID4gKyNkZWZpbmUgdGhpcmRfbGlu ZWFyX29mZnNldCh2YSnCoMKgwqDCoCAoKHZhKSA+PiBUSElSRF9TSElGVCkKPiA+ICsKPiA+ICsj ZGVmaW5lIHBhZ2V0YWJsZV96ZXJvZXRoX2luZGV4KHZhKSB6ZXJvZXRoX2xpbmVhcl9vZmZzZXQo KHZhKSAmCj4gPiBaRVJPRVRIX01BU0spCj4gPiArI2RlZmluZSBwYWdldGFibGVfZmlyc3RfaW5k ZXgodmEpwqDCoCBmaXJzdF9saW5lYXJfb2Zmc2V0KCh2YSkgJgo+ID4gRklSU1RfTUFTSykKPiA+ ICsjZGVmaW5lIHBhZ2V0YWJsZV9zZWNvbmRfaW5kZXgodmEpwqAgc2Vjb25kX2xpbmVhcl9vZmZz ZXQoKHZhKSAmCj4gPiBTRUNPTkRfTUFTSykKPiA+ICsjZGVmaW5lIHBhZ2V0YWJsZV90aGlyZF9p bmRleCh2YSnCoMKgIHRoaXJkX2xpbmVhcl9vZmZzZXQoKHZhKSAmCj4gPiBUSElSRF9NQVNLKQo+ ID4gKwo+ID4gKy8qIFBhZ2UgVGFibGUgZW50cnkgKi8KPiA+ICt0eXBlZGVmIHN0cnVjdCB7Cj4g PiArwqDCoMKgIHVpbnQ2NF90IHB0ZTsKPiA+ICt9IHB0ZV90Owo+ID4gKwo+ID4gKy8qIFNoaWZ0 IHRoZSBWUE5beF0gb3IgUFBOW3hdIGZpZWxkcyBvZiBhIHZpcnR1YWwgb3IgcGh5c2ljYWwKPiA+ IGFkZHJlc3MKPiA+ICsgKiB0byBiZWNvbWUgdGhlIHNoaWZ0ZWQgUFBOW3hdIGZpZWxkcyBvZiBh IHBhZ2UgdGFibGUgZW50cnkgKi8KPiA+ICsjZGVmaW5lIGFkZHJfdG9fcHBuKHgpICgoKHgpID4+ IFBBR0VfU0hJRlQpIDw8IFBURV9TSElGVCkKPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHB0ZV90 IHBhZGRyX3RvX3B0ZSh1bnNpZ25lZCBsb25nIHBhZGRyKQo+ID4gK3sKPiA+ICvCoMKgwqAgcmV0 dXJuIChwdGVfdCkgeyAucHRlID0gYWRkcl90b19wcG4ocGFkZHIpIH07Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbmxpbmUgYm9vbCBwdGVfaXNfdmFsaWQocHRlX3QgKnApCj4gPiArewo+ID4g K8KgwqDCoCByZXR1cm4gcC0+cHRlICYgUFRFX1ZBTElEOwo+ID4gK30KPiA+ICsKPiA+ICsjZW5k aWYgLyogX0FTTV9SSVNDVl9QQUdFX0ggKi8KPiA+IGRpZmYgLS1naXQgYS94ZW4vYXJjaC9yaXNj di9tbS5jIGIveGVuL2FyY2gvcmlzY3YvbW0uYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ IGluZGV4IDAwMDAwMDAwMDAuLjZlMTcyMzc2ZWIKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBi L3hlbi9hcmNoL3Jpc2N2L21tLmMKPiA+IEBAIC0wLDAgKzEsMjIzIEBACj4gPiArI2luY2x1ZGUg PHhlbi9pbml0Lmg+Cj4gPiArI2luY2x1ZGUgPHhlbi9saWIuaD4KPiA+ICsKPiA+ICsjaW5jbHVk ZSA8YXNtL2Nzci5oPgo+ID4gKyNpbmNsdWRlIDxhc20vbW0uaD4KPiA+ICsjaW5jbHVkZSA8YXNt L3BhZ2UuaD4KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIHhlbl9zZWNvbmRfcGFnZXRhYmxlIGlzIGlu ZGV4ZWQgd2l0aCB0aGUgVlBOWzJdIHBhZ2UgdGFibGUKPiA+IGVudHJ5IGZpZWxkCj4gPiArICog eGVuX2ZpcnN0X3BhZ2V0YWJsZSBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBWUE5bMV0gcGFnZSB0YWJs ZQo+ID4gZW50cnkgZmllbGQKPiA+ICsgKiB4ZW5femVyb2V0aF9wYWdldGFibGUgaXMgYWNjZXNz ZWQgZnJvbSB0aGUgVlBOWzBdIHBhZ2UgdGFibGUKPiA+IGVudHJ5IGZpZWxkCj4gPiArICovCj4g PiArcHRlX3QgeGVuX3NlY29uZF9wYWdldGFibGVbUEFHRV9FTlRSSUVTXQo+ID4gX19hdHRyaWJ1 dGVfXygoX19hbGlnbmVkX18oUEFHRV9TSVpFKSkpOwo+ID4gK3N0YXRpYyBwdGVfdCB4ZW5fZmly c3RfcGFnZXRhYmxlW1BBR0VfRU5UUklFU10KPiA+ICvCoMKgwqAgX19hdHRyaWJ1dGVfXygoX19h bGlnbmVkX18oUEFHRV9TSVpFKSkpOwo+ID4gK3N0YXRpYyBwdGVfdCB4ZW5femVyb2V0aF9wYWdl dGFibGVbUEFHRV9FTlRSSUVTXQo+ID4gK8KgwqDCoCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRf XyhQQUdFX1NJWkUpKSk7Cj4gPiArCj4gPiArZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX3N0ZXh0Owo+ ID4gK2V4dGVybiB1bnNpZ25lZCBsb25nIF9ldGV4dDsKPiA+ICtleHRlcm4gdW5zaWduZWQgbG9u ZyBfX2luaXRfYmVnaW47Cj4gPiArZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0X2VuZDsKPiA+ ICtleHRlcm4gdW5zaWduZWQgbG9uZyBfc3JvZGF0YTsKPiA+ICtleHRlcm4gdW5zaWduZWQgbG9u ZyBfZXJvZGF0YTsKPiA+ICsKPiA+ICtwYWRkcl90IHBoeXNfb2Zmc2V0Owo+IAo+IFRoaXMgaXMg ZGVmaW5lZCwgc2V0IGJ1dCBub3QgdXNlZC4KPiAKPiA+ICsKPiA+ICsjZGVmaW5lIHJlc29sdmVf ZWFybHlfYWRkcih4KSBcCj4gCj4gVGhpcyBoZWxwZXIgc2VlbXMgdG8gYmVoYXZlIHRoZSBzYW1l IHdhc3kgYXMgbGlua2VyX2FkZHIoKS4gU28gYW55IAo+IHJlYXNvbiB0byBub3QgdXNlIGl0Pwps aW5rZXJfYWRkcigpIHNjcmlwdCBjYW4gYmUgdXNlZCBpbnN0ZWFkLiBJdCBsb29rcyBJIG1pc3Nl ZCBzb21ldGhpbmcKYmVmb3JlIGFuZCBpdCBpcyBzcGlsbGVkIG91dCBpbnRvIHR3byBlcXVhbCBt YWNyb3MuCj4gCj4gSSB3aWxsIG1ha2UgdGhpcyBhc3N1bXB0aW9uIHRoaXMgY2FuIGJlIHVzZWQg YW5kIG5vdCBjb21tZW50IG9uIHRoZSAKPiBpbXBsZW1lbnQgb2YgcmVzb2x2ZV9lYXJseV9hZGRy KCkuCj4gCj4gPiArwqDCoMKgCj4gPiAoe8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiA+IMKgwqDCoMKgwqDC oMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyAqCj4gPiBfXyMjeDvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDC oMKgIGlmICggbG9hZF9hZGRyX3N0YXJ0IDw9IHggJiYgeCA8IGxvYWRfYWRkcl9lbmQKPiA+ICnC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIF9fIyN4ID0gKHVuc2lnbmVkIGxvbmcKPiA+ICopeDvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBcCj4gPiArwqDCoMKgwqDCoMKgwqAKPiA+IGVsc2XCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAKPiA+IMKgwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fIyN4ID0gKHVu c2lnbmVkIGxvbmcgKikoeCArIGxvYWRfYWRkcl9zdGFydCAtCj4gPiBsaW5rZXJfYWRkcl9zdGFy dCk7IFwKPiA+ICvCoMKgwqDCoMKgwqDCoAo+ID4gX18jI3g7wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiA+IMKgwqDCoMKg IFwKPiA+ICvCoMKgwqDCoCB9KQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBjbGVhcl9w YWdldGFibGVzKHVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxv bmcgbG9hZF9hZGRyX2VuZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGxpbmtlcl9hZGRyX3N0YXJ0LAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHVuc2lnbmVkIGxvbmcgbGlua2VyX2FkZHJfZW5kKQo+ID4gK3sKPiA+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyAqcDsKPiA+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBwYWdlOwo+ID4gK8KgwqDC oCB1bnNpZ25lZCBsb25nIGk7Cj4gPiArCj4gPiArwqDCoMKgIHBhZ2UgPSAodW5zaWduZWQgbG9u ZykmeGVuX3NlY29uZF9wYWdldGFibGVbMF07Cj4gPiArCj4gPiArwqDCoMKgIHAgPSByZXNvbHZl X2Vhcmx5X2FkZHIocGFnZSk7Cj4gPiArwqDCoMKgIGZvciAoIGkgPSAwOyBpIDwgQVJSQVlfU0la RSh4ZW5fc2Vjb25kX3BhZ2V0YWJsZSk7IGkrKyApCj4gCj4gVGhlIGVudHJpZXMgaW4geGVuX3Nl Y29uZF9wYWdldGFibGUgYXJlIGEgcHRlX3QgKHVpbnQ2NF90KS4gQnV0IC4uLgo+IAo+ID4gK8Kg wqDCoCB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgcFtpXSA9IDBVTEw7Cj4gCj4gLi4uIHRoZSB0eXBl IGhlcmUgd2lsbCBiZSB1bnNpZ25lZCBsb25nLiBTbyB5b3UgbWF5IG5vdCBmdWxseSB6ZXJvCj4g dGhlIAo+IHBhZ2UtdGFibGUgb24gMzItYml0IGFyY2hpdGVjdHVyZS4gVGhlcmVmb3JlIHlvdSB3 YW50IHRvIGRlZmluZSBhcwo+IHB0ZV90Lgo+IAo+IFRoYXQgc2FpZCwgZ2l2ZW4gdGhlIHBhZ2Ug dGFibGUgd2lsbCBiZSBwYXJ0IG9mIEJTUywgeW91IHNob3VsZCBub3QKPiBuZWVkIAo+IHRvIHpl cm8gYWdhaW4gYXNzdW1pbmcgeW91IGNsZWFyIEJTUyBiZWZvcmUgaGFuZC4KPiAKPiBJZiB5b3Ug Y2xlYXIgYWZ0ZXJ3YXJkcywgdGhlbiB5b3UgKm11c3QqIG1vdmUgdGhlbSBvdXQgb2YgQlNTLgo+ IAo+IFRoZSBzYW1lIGFwcGxpZXMgZm9yIHhlbl97Zmlyc3QsIHplcm9ldGh9X3BhZ2V0YWJsZSBi ZWxvdy4KSSBkaWRuJ3QgaGF2ZSBpbml0aWFsaXplZCBwYWdlIHRhYmxlcyBzbyB0aGF0IGlzIHdo eSBJIG5lZWRlZApjbGVhcl9wYWdldGFibGVzKCkgYnV0IEkgdGhpbmsgeW91IGFyZSByaWdodCBh bmQgY2xlYXJfcGFnZXRhYmxlcyBjYW4KYmUgcmVtb3ZlZCBhdCBhbGwgYXMgcGFnZSB0YWJsZXMg d2lsbCBiZSBpbml0aWFsaXplZCBkdXJpbmcgQlNTCmluaXRpYWxpemF0aW9uLgo+IAo+ID4gK8Kg wqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgIHBhZ2UgPSAodW5zaWduZWQgbG9uZykmeGVuX2ZpcnN0 X3BhZ2V0YWJsZVswXTsKPiA+ICvCoMKgwqAgcCA9IHJlc29sdmVfZWFybHlfYWRkcihwYWdlKTsK PiA+ICvCoMKgwqAgZm9yICggaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhlbl9maXJzdF9wYWdldGFi bGUpOyBpKysgKQo+ID4gK8KgwqDCoCB7Cj4gPiArwqDCoMKgwqDCoMKgwqAgcFtpXSA9IDBVTEw7 Cj4gPiArwqDCoMKgIH0KPiA+ICsKPiA+ICvCoMKgwqAgcGFnZSA9ICh1bnNpZ25lZCBsb25nKSZ4 ZW5femVyb2V0aF9wYWdldGFibGVbMF07Cj4gPiArwqDCoMKgIHAgPSByZXNvbHZlX2Vhcmx5X2Fk ZHIocGFnZSk7Cj4gPiArwqDCoMKgIGZvciAoIGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4ZW5femVy b2V0aF9wYWdldGFibGUpOyBpKysgKQo+ID4gK8KgwqDCoCB7Cj4gPiArwqDCoMKgwqDCoMKgwqAg cFtpXSA9IDBVTEw7Cj4gPiArwqDCoMKgIH0KPiA+ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsgKiBX QVJOSU5HOiBsb2FkX2FkZHIoKSBhbmQgbGlua2VyX2FkZHIoKSBhcmUgdG8gYmUgY2FsbGVkIG9u bHkKPiA+IHdoZW4gdGhlIE1NVSBpcwo+ID4gKyAqIGRpc2FibGVkIGFuZCBvbmx5IHdoZW4gZXhl Y3V0ZWQgYnkgdGhlIHByaW1hcnkgQ1BVLsKgIFRoZXkKPiA+IGNhbm5vdCByZWZlciB0bwo+ID4g KyAqIGFueSBnbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb25zLgo+IAo+IEkgZmluZCBpbnRlcmVz dGluZyB5b3UgYXJlIHNheWluZyB3aGVuIF9zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMoKSBpcwo+ IGNhbGxlZCBmcm9tIHNldHVwX2luaXRpYWxfcGFnZXRhYmxlcygpLiBXb3VsZCB5b3UgYmUgYWJs ZSB0byBleHBsYWluCj4gaG93IAo+IHRoaXMgaXMgZGlmZmVyZW50PwpJIGFtIG5vdCBzdXJlIHRo YXQgSSB1bmRlcnN0YW5kIHlvdXIgcXVlc3Rpb24gY29ycmVjdGx5IGJ1dApfc2V0dXBfaW5pdGlh bF9wYWdldGFibGVzKCkgd2FzIGludHJvZHVjZWQgdG8gbWFwIHNvbWUgYWRkcmVzc2VzIHdpdGgK d3JpdGUvcmVhZCBmbGFnLiBQcm9iYWJseSBJIGhhdmUgdG8gcmVuYW1lIGl0IHRvIHNvbWV0aGlu ZyB0aGF0IGlzIG1vcmUKY2xlYXIuCj4gCj4gPiArICovCj4gPiArCj4gPiArLyoKPiA+ICsgKiBD b252ZXJ0IGFuIGFkZHJlc3NlZCBsYXllZCBvdXQgYXQgbGluayB0aW1lIHRvIHRoZSBhZGRyZXNz Cj4gPiB3aGVyZSBpdCB3YXMgbG9hZGVkCj4gCj4gVHlwbzogcy9hZGRyZXNzZWQvYWRkcmVzcy8g PwpZZXMsIGl0IHNob3VsZCBiZSBhZGRyZXNzLiBhbmQgJ2xheWVkIG91dCcgc2hvdWxkIGJlIGNo YW5nZWQgdG8gJ2xhaWQKb3V0Jy4uLgo+IAo+ID4gKyAqIGJ5IHRoZSBib290bG9hZGVyLgo+ID4g KyAqLwo+IAo+IExvb2tpbmcgYXQgdGhlIGltcGxlbWVudGF0aW9uLCB5b3Ugc2VlbSB0byBjb25z aWRlciB0aGF0IGFueSBhZGRyZXNzCj4gbm90IAo+IGluIHRoZSByYW5nZSBbbGlua2VyX2FkZHJf c3RhcnQsIGxpbmtlcl9hZGRyX2VuZFsgd2lsbCBoYXZlIGEgMToxCj4gbWFwcGluZ3MuCj4gCj4g SSBhbSBub3Qgc3VyZSB0aGlzIGlzIHdoYXQgeW91IHdhbnQuIFNvIEkgd291bGQgY29uc2lkZXIg dG8gdGhyb3cgYW4gCj4gZXJyb3IgaWYgc3VjaCBhZGRyZXNzIGlzIHBhc3NlZC4KSSB0aG91Z2h0 IHRoYXQgYXQgdGhpcyBzdGFnZSBhbmQgaWYgbm8gcmVsb2NhdGlvbiB3YXMgZG9uZSBpdCBpcyAx OjEKZXhjZXB0IHRoZSBjYXNlIHdoZW4gbG9hZF9hZGRyX3N0YXJ0ICE9IGxpbmtlcl9hZGRyX3N0 YXJ0LgoKCj4gCj4gPiArI2RlZmluZQo+ID4gbG9hZF9hZGRyKGxpbmtlcl9hZGRyZXNzKcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+ID4gwqDCoMKgIFwKPiA+ICvCoMKgwqAKPiA+ICh7wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoAo+ID4gwqDCoMKgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgIHVu c2lnbmVkIGxvbmcgX19saW5rZXJfYWRkcmVzcyA9ICh1bnNpZ25lZAo+ID4gbG9uZykobGlua2Vy X2FkZHJlc3MpO8KgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgIGlmICggbGlua2VyX2Fk ZHJfc3RhcnQgPD0gX19saW5rZXJfYWRkcmVzcwo+ID4gJibCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBfX2xpbmtlcl9hZGRyZXNzIDwgbGlua2VyX2FkZHJfZW5kCj4gPiApwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiA+ICvCoMKg wqDCoMKgwqDCoAo+ID4ge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+ID4gwqDCoMKgIFwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIF9fbGlua2VyX2FkZHJlc3MKPiA+ID3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBfX2xpbmtlcl9hZGRyZXNzIC0gbGlua2VyX2FkZHJfc3RhcnQgKwo+ID4gbG9hZF9hZGRy X3N0YXJ0O8KgwqDCoMKgwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoAo+ID4gfcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoAo+ID4gwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoAo+ID4gX19saW5rZXJf YWRkcmVzczvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gPiDC oMKgwqAgXAo+ID4gK8KgwqDCoCB9KQo+ID4gKwo+ID4gKy8qIENvbnZlcnQgYm9vdC10aW1lIFhl biBhZGRyZXNzIGZyb20gd2hlcmUgaXQgd2FzIGxvYWRlZCBieSB0aGUKPiA+IGJvb3QgbG9hZGVy IHRvIHRoZSBhZGRyZXNzIGl0IHdhcyBsYXllZCBvdXQKPiA+ICsgKiBhdCBsaW5rLXRpbWUuCj4g PiArICovCj4gCj4gQ29kaW5nIHN0eWxlOiBUaGUgZmlyc3QgbGluZSBpcyB0b28gbG9uZyBhbmQg bXVsdGktbGluZSBjb21tZW50cyBsb29rCj4gbGlrZToKPiAKPiAvKgo+IMKgICogRm9vCj4gwqAg KiBCYXIKPiDCoCAqLwo+IAo+ID4gKyNkZWZpbmUKPiA+IGxpbmtlcl9hZGRyKGxvYWRfYWRkcmVz cynCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiA+IMKgwqDCoCBcCj4gCj4gU2FtZSByZW1h cmsgYXMgZm9yIGxvYWRfYWRkcigpIGFib3ZlLgo+IAo+ID4gK8KgwqDCoAo+ID4gKHvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgCj4gPiDCoMKgwqDCoMKgwqDCoCBcCj4gPiArwqDCoMKgwqDCoMKgwqAgdW5zaWdu ZWQgbG9uZyBfX2xvYWRfYWRkcmVzcyA9ICh1bnNpZ25lZAo+ID4gbG9uZykobG9hZF9hZGRyZXNz KTvCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgIGlmICggbG9hZF9hZGRy X3N0YXJ0IDw9IF9fbG9hZF9hZGRyZXNzCj4gPiAmJsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgX19sb2FkX2FkZHJlc3MgPCBsb2FkX2FkZHJfZW5kCj4gPiApwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ ID4gK8KgwqDCoMKgwqDCoMKgCj4gPiB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gPiDCoMKgwqAgXAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19sb2FkX2FkZHJlc3MKPiA+ID3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgX19sb2FkX2FkZHJlc3MgLSBsb2FkX2FkZHJfc3RhcnQgKwo+ID4gbGlu a2VyX2FkZHJfc3RhcnQ7wqDCoMKgwqDCoMKgwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoAo+ ID4gfcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+ID4gwqDCoMKgIFwKPiA+ICvCoMKgwqDCoMKgwqDCoAo+ ID4gX19sb2FkX2FkZHJlc3M7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAKPiA+IMKgwqDCoCBcCj4gPiArwqDCoMKgIH0pCj4gPiArCj4gPiArc3RhdGljIHZv aWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmVudHJ5IikpKQo+ID4gK19zZXR1cF9pbml0aWFs X3BhZ2V0YWJsZXMocHRlX3QgKnNlY29uZCwgcHRlX3QgKmZpcnN0LCBwdGVfdAo+ID4gKnplcm9l dGgsCj4gQ2FuIHRoaXMgYmUgbmFtZWQgdG8gc2V0dXBfaW5pdGlhbF9tYXBwaW5nKCkgc28gdGhp cyBpcyBjbGVhcmVyIGFuZCAKPiBhdm9pZCB0aGUgb25lICdfJyBkaWZmZXJlbnQgd2l0aCB0aGUg ZnVuY3Rpb24gYmVsb3cuClN1cmUuIEl0IHdpbGwgYmUgYmV0dGVyLgo+IAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIG1h cF9zdGFydCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdW5zaWduZWQgbG9uZyBtYXBfZW5kLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHBhX3N0YXJ0LAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBib29sIHdyaXRh YmxlKQo+IAo+IFdoYXQgYWJvdXQgdGhlIGV4ZWN1dGFibGUgYml0PwpJdCdzIGFsd2F5cyBleGVj dXRhYmxlLi4uIEJ1dCBhcyB5b3UgbWVudGlvbmVkIGFib3ZlIFBURV9MRUFGX0RFRkFVTFQKc2hv dWxkIGJlIGVpdGhlciBSWCBvciBSVy4KSSB0aGluayBpdCBtYWtlcyBzZW5zZSB0byBhZGQgZmxh Z3MgaW5zdGVhZCBvZiB3cml0YWJsZS4KPiAKPiA+ICt7Cj4gPiArwqDCoMKgIHVuc2lnbmVkIGxv bmcgcGFnZV9hZGRyOwo+ID4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGluZGV4MjsKPiA+ICvCoMKg wqAgdW5zaWduZWQgbG9uZyBpbmRleDE7Cj4gPiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgaW5kZXgw Owo+IAo+IGluZGV4KiBjb3VsZCBiZSBkZWZpbmVkIGluIHRoZSBsb29wIGJlbG93LgpJdCBjb3Vs ZC4gQnV0IEkgYW0gY3VyaW91cyB3aHkgaXQgaXMgYmV0dGVyPwo+IAo+ID4gKwo+ID4gK8KgwqDC oCAvKiBhbGlnbiBzdGFydCBhZGRyZXNzZXMgKi8KPiA+ICvCoMKgwqAgbWFwX3N0YXJ0ICY9IFpF Uk9FVEhfTUFQX01BU0s7Cj4gPiArwqDCoMKgIHBhX3N0YXJ0ICY9IFpFUk9FVEhfTUFQX01BU0s7 Cj4gCj4gSG1tbS4uLiBJIHdvdWxkIGFjdHVhbGx5IGV4cGVjdCB0aGUgYWRkcmVzcyB0byBiZSBw cm9wZXJseSBhbGlnbmVkCj4gYW5kIAo+IHRoZXJlZm9yZSBub3QgcmVxdWlyZSBhbiBhbGlnbm1l bnQgaGVyZS4KPiAKPiBPdGhlcndpc2UsIHRoaXMgcmFpc2UgdGhlIHF1ZXN0aW9uIG9mIHdoYXQg aGFwcGVuIGlmIHlvdSBoYXZlIHJlZ2lvbiAKPiB1c2luZyB0aGUgc2FtZSBwYWdlPwpUaGF0IG1h cF9zdGFydCAmPSAgWkVST0VUSF9NQVBfTUFTSyBpcyBuZWVkZWQgdG8gcGFnZSBudW1iZXIgb2Yg YWRkcmVzcwp3L28gcGFnZSBvZmZzZXQuCgo+IAo+ID4gKwo+ID4gK8KgwqDCoCBwYWdlX2FkZHIg PSBtYXBfc3RhcnQ7Cj4gPiArwqDCoMKgIHdoaWxlICggcGFnZV9hZGRyIDwgbWFwX2VuZCApCj4g Cj4gTG9va2luZyBhdCB0aGUgbG9vcCwgaXQgbG9va3MgbGlrZSB5b3UgYXJlIGFzc3VtaW5nIHRo YXQgdGhlIHJlZ2lvbgo+IHdpbGwgCj4gbmV2ZXIgY3Jvc3MgYSBib3VuZGFyeSBvZiBhIHBhZ2Ut dGFibGUgKGVpdGhlciBMMCwgTDEsIEwyKS4gSSBhbSBub3QgCj4gY29udmluY2VkIHlvdSBjYW4g bWFrZSBzdWNoIGFzc3VtcHRpb24gKHNlZSBiZWxvdykuCj4gCj4gQnV0IGlmIHlvdSByZWFsbHkg d2FudCB0byBtYWtlIHN1Y2ggYXNzdW1wdGlvbiB0aGVuIHlvdSBzaG91bGQgYWRkCj4gc29tZSAK PiBndWFyZCAoZWl0aGVyIEJVSUxEX0JVR19PTigpLCBBU1NFUlQoKSwgcHJvcGVyIGNoZWNrKSBp biB5b3VyIGNvZGUgdG8KPiBhdm9pZCBhbnkgc3VycHJpc2UgaW4gdGhlIGZ1dHVyZS4KSSBhbSBu b3Qgc3VyZSB0aGF0IEkgZnVsbHkgdW5kZXJzdGFuZCB3aGF0IGlzIHRoZSBwcm9ibGVtIGhlcmUu ClRoZSBhZGRyZXNzIGlzIGFsaWduZWQgb24gKDE8PDEyKSBib3VuZGFyeSBhbmQgZWFjaCBpdGVh cmF0aW9uIGlzCm1hcHBlZCAoMTw8MTIpIHBhZ2Ugc28gYWxsIGxvb2tzIGZpbmUgb3IgSSBtaXN1 bmRlcnN0b29kIHlvdS4KPiAKPiA+ICvCoMKgwqAgewo+ID4gK8KgwqDCoMKgwqDCoMKgIGluZGV4 MiA9IHBhZ2V0YWJsZV9zZWNvbmRfaW5kZXgocGFnZV9hZGRyKTsKPiA+ICvCoMKgwqDCoMKgwqDC oCBpbmRleDEgPSBwYWdldGFibGVfZmlyc3RfaW5kZXgocGFnZV9hZGRyKTsKPiA+ICvCoMKgwqDC oMKgwqDCoCBpbmRleDAgPSBwYWdldGFibGVfemVyb2V0aF9pbmRleChwYWdlX2FkZHIpOwo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgIC8qIFNldHVwIGxldmVsMiB0YWJsZSAqLwo+ID4gK8KgwqDC oMKgwqDCoMKgIHNlY29uZFtpbmRleDJdID0gcGFkZHJfdG9fcHRlKCh1bnNpZ25lZCBsb25nKWZp cnN0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoCBzZWNvbmRbaW5kZXgyXS5wdGUgfD0gUFRFX1RBQkxF Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgIC8qIFNldHVwIGxldmVsMSB0YWJsZSAqLwo+ID4g K8KgwqDCoMKgwqDCoMKgIGZpcnN0W2luZGV4MV0gPSBwYWRkcl90b19wdGUoKHVuc2lnbmVkIGxv bmcpemVyb2V0aCk7Cj4gPiArwqDCoMKgwqDCoMKgwqAgZmlyc3RbaW5kZXgxXS5wdGUgfD0gUFRF X1RBQkxFOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgIC8qIFNldHVwIGxldmVsMCB0YWJsZSAq Lwo+ID4gK8KgwqDCoMKgwqDCoMKgIGlmICggIXB0ZV9pc192YWxpZCgmemVyb2V0aFtpbmRleDBd KSApCj4gCj4gQ2FuIHlvdSBleHBsYWluIHdoeSB5b3UgYXJlIGNoZWNraW5nICFwdGVfaXNfdmFs aWQoKSBmb3IgdGhlIEwwIGVudHJ5Cj4gYnV0IG5vdCB0aGUgb3RoZXI/Ck15IG1pc3Rha2UgaXQg c2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVhY2ggbGV2ZWwuCj4gCj4gPiArwqDCoMKgwqDCoMKgwqAg ewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogVXBkYXRlIGxldmVsMCB0YWJsZSAqLwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgemVyb2V0aFtpbmRleDBdID0gcGFkZHJfdG9fcHRl KChwYWdlX2FkZHIgLSBtYXBfc3RhcnQpCj4gPiArIHBhX3N0YXJ0KTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHplcm9ldGhbaW5kZXgwXS5wdGUgfD0gUFRFX0xFQUZfREVGQVVMVDsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHplcm9ldGhbaW5kZXgwXS5wdGUgJj0gfigoIXdyaXRh YmxlKSA/IFBURV9XUklUQUJMRSA6Cj4gPiAwKTsKPiAKPiBMb29raW5nIGF0IHRoZSBkZWZhdWx0 IHZhbHVlLCBpdCB3b3VsZCBtZWFuIHRoYXQgYSBub24td3JpdGFibGUKPiBtYXBwaW5nIAo+IGlz IGF1dG9tYXRpY2FsbHkgZXhlY3V0YWJsZS4gVGhpcyBzZWVtcyB3cm9uZyBmb3IgdGhlIHNlY3Rp b24gaXMgbm90IAo+IG1lYW50IHRvIGJlIGV4ZWN1dGFibGUgKGxpa2Ugcm9kYXRhKS4KWWVzLCB5 b3UgYXJlIHJpZ2h0LiBJJ2xsIHJlb3dyayBzZXR1cF9pbml0aWFsX21hcHBpbmcoKSB0byBwYXNz IGZsYWdzCmluc3RlYWQgb2Ygd3JpdGUvcmVhZCAtIG9ubHkgZmxhZy4KPiAKPiA+ICvCoMKgwqDC oMKgwqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAgLyogUG9pbnQgdG8gbmV4dCBwYWdl ICovCj4gPiArwqDCoMKgwqDCoMKgwqAgcGFnZV9hZGRyICs9IFpFUk9FVEhfU0laRTsKPiA+ICvC oMKgwqAgfQo+ID4gK30KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIHNldHVwX2luaXRpYWxfcGFnZXRh YmxlczoKPiA+ICsgKgo+ID4gKyAqIDEpIEJ1aWxkIHRoZSBwYWdlIHRhYmxlcyBmb3IgWGVuIHRo YXQgbWFwIHRoZSBmb2xsb3dpbmc6Cj4gPiArICrCoMKgIDEuMSnCoCBUaGUgcGh5c2ljYWwgbG9j YXRpb24gb2YgWGVuICh3aGVyZSB0aGUgYm9vdGxvYWRlcgo+ID4gbG9hZGVkIGl0KQo+ID4gKyAq wqDCoCAxLjIpwqAgVGhlIGxpbmstdGltZSBsb2NhdGlvbiBvZiBYZW4gKHdoZXJlIHRoZSBsaW5r ZXIKPiA+IGV4cGVjdGVkIFhlbidzCj4gPiArICrCoMKgwqDCoMKgwqDCoMKgIGFkZHJlc3NlcyB0 byBiZSkKPiA+ICsgKiAyKSBMb2FkIHRoZSBwYWdlIHRhYmxlIGludG8gdGhlIFNBVFAgYW5kIGVu YWJsZSB0aGUgTU1VCj4gPiArICovCj4gPiArdm9pZCBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIu ZW50cnkiKSkpCj4gCj4gSSBjb3VsZG4ndCBmaW5kIGEgc2VjdGlvbiAiLmVudHJ5IiBpbiB0aGUg bGlua2VyLgo+IAo+ID4gK3NldHVwX2luaXRpYWxfcGFnZXRhYmxlcyh1bnNpZ25lZCBsb25nIGxv YWRfYWRkcl9zdGFydCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBsb2FkX2FkZHJfZW5kLAo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGxpbmtl cl9hZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGxpbmtlcl9hZGRyX2VuZCkKPiA+ICt7Cj4gPiArwqDC oMKgIHB0ZV90ICpzZWNvbmQ7Cj4gPiArwqDCoMKgIHB0ZV90ICpmaXJzdDsKPiA+ICvCoMKgwqAg cHRlX3QgKnplcm9ldGg7Cj4gPiArCj4gPiArwqDCoMKgIGNsZWFyX3BhZ2V0YWJsZXMobG9hZF9h ZGRyX3N0YXJ0LCBsb2FkX2FkZHJfZW5kLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbGlua2VyX2FkZHJfc3RhcnQsIGxpbmtlcl9hZGRyX2VuZCk7Cj4gPiAr Cj4gPiArwqDCoMKgIC8qIEdldCB0aGUgYWRkcmVzc2VzIHdoZXJlIHRoZSBwYWdlIHRhYmxlcyB3 ZXJlIGxvYWRlZCAqLwo+ID4gK8KgwqDCoCBzZWNvbmTCoCA9IChwdGVfdCAqKWxvYWRfYWRkcigm eGVuX3NlY29uZF9wYWdldGFibGUpOwo+ID4gK8KgwqDCoCBmaXJzdMKgwqAgPSAocHRlX3QgKils b2FkX2FkZHIoJnhlbl9maXJzdF9wYWdldGFibGUpOwo+ID4gK8KgwqDCoCB6ZXJvZXRoID0gKHB0 ZV90ICopbG9hZF9hZGRyKCZ4ZW5femVyb2V0aF9wYWdldGFibGUpOwo+IAo+IEkgd291bGQgY29u c2lkZXIgdG8gZW1iZWQgdGhlIHR5cGUgY2FzdCBpbiBsb2FkX2FkZHIoKSBzbyB5b3UgYXJlCj4g YWRkaW5nIAo+IHNvbWUgdHlwZSBzYWZldHkgd2l0aGluIHlvdXIgY29kZS4KRGVmaW5pdGVseSBp dCB3aWxsIGJlIGJldHRlciBidXQgc2V0dXBfaW5pdGlhbF9tYXBwaW5nKCkgdXNlcyAndW5zaWdu ZWQKbG9uZycgZm9yIHBhc3NpbmcgYWRkcmVzcyB0aGF0IHNob3VsZCBiZSBtYXBwZWQuCj4gCj4g PiArCj4gPiArwqDCoMKgIC8qCj4gPiArwqDCoMKgwqAgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20g WGVuJ3MgbGluay10aW1lIGFkZHJlc3NlcyB0byB3aGVyZQo+ID4gdGhleSB3ZXJlIGFjdHVhbGx5 IGxvYWRlZC4KPiAKPiBUaGlzIGlzIGxpbmUgaXMgd2F5IGxvbmcgdGhhbiA4MCBjaGFyYWN0ZXJz LiBQbGVhc2UgbWFrZSBzdXJlIHRvIHdyYXAKPiBpdCAKPiA4MCBjaGFyYWN0ZXJzLgo+IAo+ID4g K8KgwqDCoMKgICovCj4gPiArwqDCoMKgIF9zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMoc2Vjb25k LCBmaXJzdCwgemVyb2V0aCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpbmtlcl9hZGRyKCZfc3RleHQpLAo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlu a2VyX2FkZHIoJl9ldGV4dCksCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsb2FkX2FkZHIoJl9zdGV4dCksCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmYWxz ZSk7Cj4gPiArwqDCoMKgIF9zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMoc2Vjb25kLCBmaXJzdCwg emVyb2V0aCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGxpbmtlcl9hZGRyKCZfX2luaXRfYmVnaW4pLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlua2Vy X2FkZHIoJl9faW5pdF9lbmQpLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9hZF9hZGRyKCZfX2luaXRfYmVnaW4pLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdHJ1ZSk7Cj4gPiArwqDCoMKgIF9zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMoc2Vjb25kLCBm aXJzdCwgemVyb2V0aCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpbmtlcl9hZGRyKCZfc3JvZGF0YSksCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsaW5r ZXJfYWRkcigmX2Vyb2RhdGEpLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9hZF9hZGRyKCZfc3JvZGF0YSksCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm YWxzZSk7Cj4gPiArwqDCoMKgIF9zZXR1cF9pbml0aWFsX3BhZ2V0YWJsZXMoc2Vjb25kLCBmaXJz dCwgemVyb2V0aCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGxpbmtlcl9hZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlua2VyX2FkZHJf ZW5kLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbG9hZF9hZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdHJ1ZSk7Cj4gCj4gV2hlcmUgZG8g eW91IGd1YXJhbnRlZSB0aGF0IFhlbiB3aWxsIGFsd2F5cyBmaXQgaW4gYW4gTDAgdGFibGUgYW5k Cj4gdGhlIAo+IHN0YXJ0IGFkZHJlc3MgaXMgYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiBhbiBMMCB0 YWJsZT8KSSBkb24ndCBndWFyYW50ZWUgdGhhdCBpdCBmaXQgaW4gYW4gTDAgdGFibGUgYnV0IHRo ZSBzdGFydCBhZGRyZXNzIGlzCmFsaWduZWQgdG8gdGhlIHNpemUgb2YgdGhlIEwwIHRhYmxlIGF0 IHRoZSBzdGFydC4KPiAKPiA+ICsKPiA+ICvCoMKgwqAgLyoKPiA+ICvCoMKgwqDCoCAqIENyZWF0 ZSBhIG1hcHBpbmcgb2YgdGhlIGxvYWQgdGltZSBhZGRyZXNzIHJhbmdlIHRvLi4uIHRoZQo+ID4g bG9hZCB0aW1lIGFkZHJlc3MgcmFuZ2UuCj4gCj4gU2FtZSBhYm91dCB0aGUgbGluZSBsZW5ndGgg aGVyZS4KPiAKPiA+ICvCoMKgwqDCoCAqIFRoaXMgbWFwcGluZyBpcyB1c2VkIGF0IGJvb3QgdGlt ZSBvbmx5Lgo+ID4gK8KgwqDCoMKgICovCj4gPiArwqDCoMKgIF9zZXR1cF9pbml0aWFsX3BhZ2V0 YWJsZXMoc2Vjb25kLCBmaXJzdCwgemVyb2V0aCwKPiAKPiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYg WGVuIGlzIGxvYWRlZCBhdCBpdHMgbGlua2VkIGFkZHJlc3MuIFNvIHlvdQo+IG5lZWQgYSAKPiBz ZXBhcmF0ZSBzZXQgb2YgTDAsIEwxIHRhYmxlcyBmb3IgdGhlIGlkZW50aXR5IG1hcHBpbmcuCj4g Cj4gVGhhdCBzYWlkLCB0aGlzIHdvdWxkIG5vdCBiZSBzdWZmaWNpZW50IGJlY2F1c2U6Cj4gwqDC oCAxKSBYZW4gbWF5IG5vdCBiZSBsb2FkZWQgYXQgYSAyTSBib3VuZGFyeSAoeW91IGNhbiBjb250 cm9sIHdpdGggCj4gVS1ib290LCBidXQgbm90IHdpdGggRUZJKS4gU28gdGhpcyBtYXkgY3Jvc3Mg YSBib3VuZGFyeSBhbmQgdGhlcmVmb3JlCj4gbmVlZCBtdWx0aXBsZSBwYWdlcy4KPiDCoMKgIDIp IFRoZSBsb2FkIHJlZ2lvbiBtYXkgb3ZlcmxhcCB0aGUgbGluayBhZGRyZXNzCj4gCj4gV2hpbGUg SSB0aGluayBpdCB3b3VsZCBiZSBnb29kIHRvIGhhbmRsZSB0aG9zZSBjYXNlcyBmcm9tIHRoZSBz dGFydCwKPiBJIAo+IHdvdWxkIHVuZGVyc3RhbmQgd2h5IGFyZSBub3QgZWFzeSB0byBzb2x2ZS4g U28gSSB0aGluayB0aGUgbWluaW11bSBpcwo+IHRvIAo+IHRocm93IHNvbWUgZXJyb3JzIGlmIHlv dSBhcmUgaW4gYSBjYXNlIHlvdSBjYW4ndCBzdXBwb3J0LgpEbyB5b3UgbWVhbiB0byB0aHJvdyBz b21lIGVycm9yIGluIGxvYWRfYWRkcigpL2xpbmtkZXJfYWRkcigpPwo+IAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbG9hZF9h ZGRyX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgbG9hZF9hZGRyX2VuZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxvYWRfYWRkcl9zdGFydCwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHRydWUpOyA+ICsKPiA+ICvCoMKgwqAgLyogRW5zdXJlIHBhZ2UgdGFibGUgd3JpdGVz IHByZWNlZGUgbG9hZGluZyB0aGUgU0FUUCAqLwo+ID4gK8KgwqDCoCBhc20gdm9sYXRpbGUoInNm ZW5jZS52bWEiKTsKPiA+ICsKPiA+ICvCoMKgwqAgLyogRW5hYmxlIHRoZSBNTVUgYW5kIGxvYWQg dGhlIG5ldyBwYWdldGFibGUgZm9yIFhlbiAqLwo+ID4gK8KgwqDCoCBjc3Jfd3JpdGUoQ1NSX1NB VFAsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxvYWRfYWRkcih4ZW5fc2Vjb25k X3BhZ2V0YWJsZSkgPj4gUEFHRV9TSElGVCkgfAo+ID4gU0FUUF9NT0RFX1NWMzkgPDwgU0FUUF9N T0RFX1NISUZUKTsKPiAKPiBJSE1PLCBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIGludHJvZHVjZSB3 aXRoaW4gdGhlIHNlcmllcyB0aGUgY29kZSB0byAKPiBqdW1wIG9mZiB0aGUgaWRlbnRpdHkgbWFw cGluZyBhbmQgdGhlbiByZW1vdmUgaXQuClByb2JhYmx5IEkgaGF2ZSB0byBzcGVuZCBtb3JlIHRp bWUgdG8gdW5kZXJzdGFuZCBpZGVudGl0eSBtYXBwaW5nIGJ1dAppdCBsb29rcyBsaWtlIGN1cnJl bnQgIG9uZSBSSVNDLVYgcG9ydCBmcm9tIEJvYmJ5J3MgZG9lc24ndCBqdW1wIG9mZgphbmQgcmVt b3ZlIHRoZSBpZGVudGl0eSBtYXBwaW5nLgo+IAo+ID4gKwo+ID4gK8KgwqDCoCBwaHlzX29mZnNl dCA9IGxvYWRfYWRkcl9zdGFydCAtIGxpbmtlcl9hZGRyX3N0YXJ0Owo+ID4gKwo+ID4gK8KgwqDC oCByZXR1cm47Cj4gPiArfQo+IAo+IENoZWVycywKPiAKfiBPbGVrc2lpCg==