From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 460C11FF16F for ; Tue, 8 Jul 2025 12:57:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 45D90144A2; Tue, 8 Jul 2025 12:58:06 +0200 (CEST) Message-ID: <409f8c3d-dd5b-4769-99f4-a17b2de773cd@proxmox.com> Date: Tue, 8 Jul 2025 12:58:01 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Beta To: Adam Kalisz , Proxmox VE development discussion , Proxmox Backup Server development discussion References: <20250708084900.1068146-1-d.csapak@proxmox.com> <9dc2c099169ee1ed64c274d64cc0a1c19f9f6c92.camel@notnullmakers.com> Content-Language: en-US From: Dominik Csapak In-Reply-To: <9dc2c099169ee1ed64c274d64cc0a1c19f9f6c92.camel@notnullmakers.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.021 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com, restore.rs] Subject: Re: [pbs-devel] [RFC PATCH v2 proxmox-backup-qemu] restore: make chunk loading more parallel X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" T24gNy84LzI1IDEyOjA0LCBBZGFtIEthbGlzeiB3cm90ZToKPiBIaSBEb21pbmlrLAo+IAoKSGks Cgo+IHRoaXMgaXMgYSBiaWcgaW1wcm92ZW1lbnQsIEkgaGF2ZSBkb25lIHNvbWUgcGVyZm9ybWFu Y2UgbWVhc3VyZW1lbnRzCj4gYWdhaW46Cj4gCj4gUnl6ZW46Cj4gNCB3b3JrZXIgdGhyZWFkczoK PiByZXN0b3JlIGltYWdlIGNvbXBsZXRlIChieXRlcz01MzY4NzA5MTIwMCwgZHVyYXRpb249NTIu MDZzLAo+IHNwZWVkPTk4My40N01CL3MpCj4gOCB3b3JrZXIgdGhyZWFkczoKPiByZXN0b3JlIGlt YWdlIGNvbXBsZXRlIChieXRlcz01MzY4NzA5MTIwMCwgZHVyYXRpb249NTAuMTJzLAo+IHNwZWVk PTEwMjEuNTZNQi9zKQo+IAo+IDQgd29ya2VyIHRocmVhZHMsIDQgbWF4LWJsb2NraW5nOgo+IHJl c3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTUzNjg3MDkxMjAwLCBkdXJhdGlvbj01NC4wMHMs Cj4gc3BlZWQ9OTQ4LjIyTUIvcykKPiA4IHdvcmtlciB0aHJlYWRzLCA0IG1heC1ibG9ja2luZzoK PiByZXN0b3JlIGltYWdlIGNvbXBsZXRlIChieXRlcz01MzY4NzA5MTIwMCwgZHVyYXRpb249NTAu NDNzLAo+IHNwZWVkPTEwMTUuMjVNQi9zKQo+IDggd29ya2VyIHRocmVhZHMsIDQgbWF4LWJsb2Nr aW5nLCAzMiBidWZmZXJlZCBmdXR1cmVzOgo+IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVz PTUzNjg3MDkxMjAwLCBkdXJhdGlvbj01Mi4xMXMsCj4gc3BlZWQ9OTgyLjUzTUIvcykKPiAKPiBY ZW9uOgo+IDQgd29ya2VyIHRocmVhZHM6Cj4gcmVzdG9yZSBpbWFnZSBjb21wbGV0ZSAoYnl0ZXM9 MTA3Mzc0MTgyNDAsIGR1cmF0aW9uPTMuMDZzLAo+IHNwZWVkPTMzNDUuOTdNQi9zKQo+IHJlc3Rv cmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTEwNzM3NDE4MjQwMCwgZHVyYXRpb249MTM5LjgwcywK PiBzcGVlZD03MzIuNDdNQi9zKQo+IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTEwNzM3 NDE4MjQwMCwgZHVyYXRpb249MTM2LjY3cywKPiBzcGVlZD03NDkuMjNNQi9zKQo+IDggd29ya2Vy IHRocmVhZHM6Cj4gcmVzdG9yZSBpbWFnZSBjb21wbGV0ZSAoYnl0ZXM9MTA3Mzc0MTgyNDAsIGR1 cmF0aW9uPTIuNTBzLAo+IHNwZWVkPTQwOTUuMzBNQi9zKQo+IHJlc3RvcmUgaW1hZ2UgY29tcGxl dGUgKGJ5dGVzPTEwNzM3NDE4MjQwMCwgZHVyYXRpb249MTI3LjE0cywKPiBzcGVlZD04MDUuNDJN Qi9zKQo+IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTEwNzM3NDE4MjQwMCwgZHVyYXRp b249MTIxLjM5cywKPiBzcGVlZD04NDMuNTlNQi9zKQoKanVzdCBmb3IgbXkgdW5kZXJzdGFuZGlu ZzogeW91IGxlZnQgdGhlIHBhcmFsbGVsIGZ1dHVyZXMgYXQgMTYgYW5kIGNoYW5nZWQKdGhlIHRo cmVhZHMgaW4gdGhlIHRva2lvIHJ1bnRpbWU/CgpUaGUgYmlnZ2VzdCBpc3N1ZSBoZXJlIGlzIHRo YXQgd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSB0aGF0Cm51bWJlciBieSBkZWZh dWx0IGJ5IG11Y2gsIHNpbmNlIG9uIGUuZy4gYSBydW5uaW5nIHN5c3RlbSB0aGlzIHdpbGwKaGF2 ZSBhbiBpbXBhY3Qgb24gb3RoZXIgcnVubmluZyBWTXMuIEFkanVzdGluZyBzdWNoIGEgbnVtYmVy Cihlc3BlY2lhbGx5IGluIGEgd2F5IHdoZXJlIGl0J3Mgbm93IGFjdHVhbGx5IHVzZWQgaW4gY29u dHJhc3QgdG8KYmVmb3JlKSB3aWxsIGNvbWUgYXMgYSBzdXJwcmlzZSBmb3IgbWFueS4KClRoYXQn cyBJTUhPIHRoZSBiaWdnZXN0IGNoYWxsZW5nZSBoZXJlLCB0aGF0J3Mgd2h5IEkgZGlkIG5vdCB0 b3VjaAp0aGUgdG9raW8gcnVudGltZSB0aHJlYWQgc2V0dGluZ3MsIHRvIG5vdCBpbmNyZWFzZSB0 aGUgbG9hZCB0b28gbXVjaC4KCkRpZCB5b3UgYnkgYW55IGNoYW5jZSBvYnNlcnZlIHRoZSBDUFUg dXNhZ2UgZHVyaW5nIHlvdXIgdGVzdHM/CkFzIEkgd3JvdGUgaW4gbXkgY29tbWl0IG1lc3NhZ2Us IHRoZSBjcHUgdXNhZ2UgcXVhZHJ1cGxlZCAocHJvcG9ydGlvbmFsCnRvIHRoZSBtb3JlIGNodW5r cyB3ZSBjb3VsZCBwdXQgdGhyb3VnaCkgd2hlbiB1c2luZyAxNiBmZXRjaGluZwp0YXNrcy4KCkp1 c3QgYW4gYWRkaXRpb25hbCBub3RlOiBXaXRoIG15IHNvbHV0aW9uLHRoZSBibG9ja2luZyB0aHJl YWRzIHNob3VsZApub3QgaGF2ZSBhbnkgaW1wYWN0IGF0IGFsbCwgc2luY2UgdGhlIGZldGNoaW5n IHNob3VsZCBiZSBwdXJlbHkKYXN5bmMgKHNvIG5vIGJsb2NraW5nIGNvZGUgYW55d2hlcmUpIGFu ZCB0aGUgd3JpdGluZyBpcyBkb25lIGluIHRoZQptYWluIHRocmVhZC90YXNrIGluIHNlcXVlbmNl IHNvIG5vIGJsb2NraW5nIHRocmVhZHMgd2lsbCBiZSB1c2VkCmV4Y2VwdCBvbmUuCgo+IAo+IE11 Y2ggYmV0dGVyIGJ1dCBpdCB3b3VsZCBuZWVkIHRvIGJlIDI1JSBmYXN0ZXIgb24gdGhpcyBvbGRl ciBzeXN0ZW0gdG8KPiBoaXQgdGhlIG51bWJlcnMgSSBoYXZlIGFscmVhZHkgc2VlbiB3aXRoIG15 IHNvbHV0aW9uOgo+IAo+IEZvciBjb21wYXJpc29uLCB3aXRoIG15IHNvbHV0aW9uIG9uIHRoZSBz YW1lIFhlb24gc3lzdGVtIEkgd2FzIGhpdHRpbmc6Cj4gV2l0aCA4LXdheSBjb25jdXJyZW5jeSwg MTYgbWF4LWJsb2NraW5nIHRocmVhZHM6Cj4gcmVzdG9yZSBpbWFnZSBjb21wbGV0ZSAoYnl0ZXM9 MTA3Mzc0MTgyNDAsIGF2ZyBmZXRjaCB0aW1lPTE2Ljc1NzJtcywKPiBhdmcgdGltZSBwZXIgbm9u emVybyB3cml0ZT0xLjkzMTBtcywgc3RvcmFnZSBub256ZXJvIHRvdGFsIHdyaXRlCj4gdGltZT0x LjU4MHMsIGR1cmF0aW9uPTIuMjVzLCBzcGVlZD00NTUxLjI1TUIvcykKPiByZXN0b3JlIGltYWdl IGNvbXBsZXRlIChieXRlcz0xMDczNzQxODI0MDAsIGF2ZyBmZXRjaCB0aW1lPTI5LjE3MTRtcywK PiBhdmcgdGltZSBwZXIgbm9uemVybyB3cml0ZT0yLjIyMTZtcywgc3RvcmFnZSBub256ZXJvIHRv dGFsIHdyaXRlCj4gdGltZT01NS43MzlzLCBkdXJhdGlvbj0xMDYuMTdzLCBzcGVlZD05NjQuNTJN Qi9zKQo+IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTEwNzM3NDE4MjQwMCwgYXZnIGZl dGNoIHRpbWU9MjguMjU0M21zLAo+IGF2ZyB0aW1lIHBlciBub256ZXJvIHdyaXRlPTIuMTQ3M21z LCBzdG9yYWdlIG5vbnplcm8gdG90YWwgd3JpdGUKPiB0aW1lPTU0LjEzOXMsIGR1cmF0aW9uPTEw My41MnMsIHNwZWVkPTk4OS4xOE1CL3MpCj4gCj4gV2l0aCAxNi13YXkgY29uY3VycmVuY3ksIDMy IG1heC1ibG9ja2luZyB0aHJlYWRzOgo+IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTEw NzM3NDE4MjQwLCBhdmcgZmV0Y2ggdGltZT0yNS4zNDQ0bXMsCj4gYXZnIHRpbWUgcGVyIG5vbnpl cm8gd3JpdGU9Mi4wNzA5bXMsIHN0b3JhZ2Ugbm9uemVybyB0b3RhbCB3cml0ZQo+IHRpbWU9MS42 OTRzLCBkdXJhdGlvbj0yLjAycywgc3BlZWQ9NTA3NC4xM01CL3MpCj4gcmVzdG9yZSBpbWFnZSBj b21wbGV0ZSAoYnl0ZXM9MTA3Mzc0MTgyNDAwLCBhdmcgZmV0Y2ggdGltZT01My4zMDQ2bXMsCj4g YXZnIHRpbWUgcGVyIG5vbnplcm8gd3JpdGU9Mi42NjkybXMsIHN0b3JhZ2Ugbm9uemVybyB0b3Rh bCB3cml0ZQo+IHRpbWU9NjYuOTY5cywgZHVyYXRpb249MTA2LjY1cywgc3BlZWQ9OTYwLjEzTUIv cykKPiByZXN0b3JlIGltYWdlIGNvbXBsZXRlIChieXRlcz0xMDczNzQxODI0MDAsIGF2ZyBmZXRj aCB0aW1lPTQ3LjM5MDltcywKPiBhdmcgdGltZSBwZXIgbm9uemVybyB3cml0ZT0yLjYzNTJtcywg c3RvcmFnZSBub256ZXJvIHRvdGFsIHdyaXRlCj4gdGltZT02Ni40NDBzLCBkdXJhdGlvbj05OC4w OXMsIHNwZWVkPTEwNDMuOTVNQi9zKQo+IC0+IHRoaXMgc2VlbWVkIHRvIGJlIHRoZSBiZXN0IHNl dHRpbmcgZm9yIHRoaXMgc3lzdGVtCj4gCj4gT24gdGhlIFJ5emVuIHN5c3RlbSBJIHdhcyBoaXR0 aW5nOgo+IFdpdGggOC13YXkgY29uY3VycmVuY3ksIDE2IG1heC1ibG9ja2luZyB0aHJlYWRzOgo+ IHJlc3RvcmUgaW1hZ2UgY29tcGxldGUgKGJ5dGVzPTUzNjg3MDkxMjAwLCBhdmcgZmV0Y2ggdGlt ZT0yNC43MzQybXMsCj4gYXZnIHRpbWUgcGVyIG5vbnplcm8gd3JpdGU9MS42NDc0bXMsIHN0b3Jh Z2Ugbm9uemVybyB0b3RhbCB3cml0ZQo+IHRpbWU9MTkuOTk2cywgZHVyYXRpb249NDUuODNzLCBz cGVlZD0xMTE3LjE1TUIvcykKPiAtPiB0aGlzIHNlZW1lZCB0byBiZSB0aGUgYmVzdCBzZXR0aW5n IGZvciB0aGlzIHN5c3RlbQo+IAo+IEl0IHNlZW1zIHRoZSBjb3VudGluZyBvZiB6ZXJvZXMgd29y a3MgaW4gc29tZSBraW5kIG9mIHN0ZXBzIChzZWVuIG9uCj4gdGhlIFhlb24gc3lzdGVtIHdpdGgg bW9zdGx5IGluY29tcHJlc3NpYmxlIGRhdGEpOgo+IAoKeWVzLCBvbmx5IHdob2xlIHplcm8gY2h1 bmtzIHdpbGwgYmUgY291bnRlZC4KCltzbmlwXQo+IAo+IEVzcGVjaWFsbHkgZHVyaW5nIGEgcmVz dG9yZSB0aGUgc3BlZWQgaXMgcXVpdGUgaW1wb3J0YW50IGlmIHlvdSBuZWVkIHRvCj4gaGl0IFJl c3RvcmUgVGltZSBPYmplY3RpdmVzIHVuZGVyIFNMQXMuIFRoYXQncyB3aHkgd2Ugd2VyZSB0YXJn ZXRpbmcgMQo+IEdCcHMgZm9yIGluY29tcHJlc3NpYmxlIGRhdGEuCgpJIGdldCB0aGF0LCBidXQg dGhpcyB3aWxsIGFsd2F5cyBiZSBhIHRyYWRlb2ZmIGJldHdlZW4gQ1BVIGxvYWQgYW5kCnRocm91 Z2hwdXQgYW5kIHdlIGhhdmUgdG8gZmluZCBhIGdvb2QgbWlkZGxlIGdyb3VuZCBoZXJlLgoKSU1P IHdpdGggbXkgY3VycmVudCBwYXRjaCwgd2UgaGF2ZSBhIHZlcnkgZ29vZCBpbXByb3ZlbWVudCBh bHJlYWR5LAp3aXRob3V0IGluY3JlYXNpbmcgdGhlICh0aGVvcmV0aWNhbCkgbG9hZCB0byB0aGUg c3lzdGVtLgoKSXQgY291bGQgYmUgT0sgZnJvbSBteSBQT1YgdG8gbWFrZSB0aGUgbnVtYmVyIG9m IHRocmVhZHMgb2YgdGhlIHJ1bnRpbWUKY29uZmlndXJhYmxlIGUuZy4gdmlhIHZ6ZHVtcC5jb25m LiAoVGhhdCdzIGEgdGhpbmcgdGhhdCdzIGVhc2lseQpleHBsYWluYWJsZSBpbiB0aGUgZG9jcyBm b3IgYWRtaW5zKQoKSWYgc29tZW9uZSBlbHNlIChARmFiaWFuPykgd2FudHMgdG8gY2hpbWUgaW4g dG8gdGhpcyBkaXNjdXNzaW9uLApJJ2QgYmUgZ2xhZC4KCkFsc28gZmVlZGJhY2sgb24gbXkgY29k ZSBpbiBnZW5lcmFsIHdvdWxkIGJlIG5pY2UgOykKKFRoZXJlIGFyZSBwcm9iYWJseSBiZXR0ZXIg d2F5cyB0byBtYWtlIHRoaXMgY29uY3VycmVudCBpbiBhbgphc3luYyBjb250ZXh0LCBlLmcuIG1h eWJlIHVzaW5nICdhc3luYy1jaGFubmVsJyArIGZpeGVkIG51bWJlcgpvZiB0YXNrcyA/KQoKVGhh bmtzCkRvbWluaWsKCj4gCj4gVGhhbmsgeW91Cj4gQWRhbQo+IAo+IE9uIFR1ZSwgMjAyNS0wNy0w OCBhdCAxMDo0OSArMDIwMCwgRG9taW5payBDc2FwYWsgd3JvdGU6Cj4+IGJ5IHVzaW5nIGFzeW5j IGZ1dHVyZXMgdG8gbG9hZCBjaHVua3MgYW5kIHN0cmVhbTo6YnVmZmVyX3Vub3JkZXJlZCB0bwo+ PiBidWZmZXIgdXAgdG8gMTYgb2YgdGhlbSwgZGVwZW5kaW5nIG9uIHdyaXRlL2xvYWQgc3BlZWQs IHVzZSB0b2tpbydzCj4+IHRhc2sKPj4gc3Bhd24gdG8gbWFrZSBzdXJlIHRoZSBjb250aW51ZSB0 byBydW4gaW4gdGhlIGJhY2tncm91bmQsIHNpbmNlCj4+IGJ1ZmZlcl91bm9yZGVyZWQgc3RhcnRz IHRoZW0sIGJ1dCBkb2VzIG5vdCBwb2xsIHRoZW0gdG8gY29tcGxldGlvbgo+PiB1bmxlc3Mgd2Un cmUgYXdhaXRpbmcuCj4+Cj4+IFdpdGggdGhpcywgd2UgZG9uJ3QgbmVlZCB0byBpbmNyZWFzZSB0 aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlCj4+IHJ1bnRpbWUgdG8gdHJpZ2dlciBwYXJhbGxl bCByZWFkcyBhbmQgbmV0d29yayB0cmFmZmljIHRvIHVzLiBUaGlzIHdheQo+PiBpdCdzIG9ubHkg bGltaXRlZCBieSBDUFUgaWYgZGVjb2RpbmcgYW5kL29yIGRlY3J5cHRpbmcgaXMgdGhlIGJvdHRs ZQo+PiBuZWNrLgo+Pgo+PiBJIG1lYXN1cmVkIHJlc3RvcmluZyBhIFZNIGJhY2t1cCB3aXRoIGEg NjBHaUIgZGlzayAoZmlsbGVkIHdpdGgKPj4gfjQyR2lCCj4+IGRhdGEpIGFuZCBmYXN0IHN0b3Jh Z2Ugb3ZlciBhIGxvY2FsIG5ldHdvcmsgbGluayAoZnJvbSBQQlMgVk0gdG8gdGhlCj4+IGhvc3Qp LiBMZXQgaXQgM8KgIHJ1bnMsIGJ1dCB0aGUgdmFyaWFuY2Ugd2FzIG5vdCB0aGF0IGJpZywgc28g aGVyZSdzCj4+IHNvbWUKPj4gcmVwcmVzZW50YXRpdmUgbG9nIG91dHB1dCB3aXRoIHZhcmlvdXMg TUFYX0JVRkZFUkVEX0ZVVFVSRVMgdmFsdWVzLgo+Pgo+PiBiZW5jaG1hcmvCoMKgIGR1cmF0aW9u wqDCoMKgwqDCoMKgwqAgc3BlZWTCoMKgIGNwdSBwZXJjZW50YWdlCj4+IGN1cnJlbnTCoMKgwqDC oMKgIDEwNy4xOHPCoMKgIDU3My4yNU1CL3PCoMKgwqDCoMKgwqDCoMKgwqDCoCA8IDEwMCUKPj4g NDrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDQ0Ljc0c8KgIDEzNzMuMzRNQi9zwqDCoMKgwqDCoMKg wqDCoMKgwqAgfiAxODAlCj4+IDg6wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAzMi4zMHPCoCAxOTAy LjQyTUIvc8KgwqDCoMKgwqDCoMKgwqDCoMKgIH4gMjkwJQo+PiAxNjrCoMKgwqDCoMKgwqDCoMKg wqDCoCAyNS43NXPCoCAyMzg2LjQ0TUIvc8KgwqDCoMKgwqDCoMKgwqDCoMKgIH4gMzYwJQo+Pgo+ PiBJIHNhdyBhbiBpbmNyZWFzZSBpbiBDUFUgdXNhZ2UgcHJvcG9ydGlvbmFsIHRvIHRoZSBzcGVl ZCBpbmNyZWFzZSwgc28KPj4gd2hpbGUgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpdCB1c2VzIGxl c3MgdGhhbiBhIHNpbmdsZSBjb3JlIHRvdGFsLAo+PiB1c2luZyAxNiBwYXJhbGxlbCBmdXR1cmVz IHJlc3VsdGVkIGluIDMtNCBhdmFpbGFibGUgdGhyZWFkcyBvZiB0aGUKPj4gdG9raW8gcnVudGlt ZSB0byBiZSB1dGlsaXplZC4KPj4KPj4gSW4gZ2VuZXJhbCBJJ2QgbGlrZSB0byBsaW1pdCB0aGUg YnVmZmVyaW5nIHNvbWVob3csIGJ1dCBJIGRvbid0IHRoaW5rCj4+IHRoZXJlIGlzIGEgZ29vZCBh dXRvbWF0aWMgbWV0cmljIHdlIGNhbiB1c2UsIGFuZCBnaXZpbmcgdGhlIGFkbWluIGEKPj4ga25v Ygo+PiB0aGF0IGlzIGhhcmQgdG8gZXhwbGFpbiB3aGF0IHRoZSBhY3R1YWwgcmFtaWZpY2F0aW9u cyBhYm91dCBpdCBhcmUgaXMKPj4gYWxzbyBub3QgZ29vZCwgc28gSSBzZXR0bGVkIGZvciBhIHZh bHVlIHRoYXQgc2hvd2VkIGltcHJvdmVtZW50IGJ1dAo+PiBkb2VzCj4+IG5vdCBzZWVtIHRvbyBo aWdoLgo+Pgo+PiBJbiBhbnkgY2FzZSwgaWYgdGhlIHRhcmdldCBhbmQvb3Igc291cmNlIHN0b3Jh Z2UgaXMgdG9vIHNsb3csIHRoZXJlCj4+IHdpbGwKPj4gYmUgYmFjay9mb3J3YXJkIHByZXNzdXJl LCBhbmQgdGhpcyBjaGFuZ2Ugc2hvdWxkIG9ubHkgbWF0dGVyIGZvcgo+PiBzdG9yYWdlCj4+IHN5 c3RlbXMgd2hlcmUgSU8gZGVwdGggcGxheXMgYSByb2xlIGFuZCB0aGF0IGFyZSBmYXN0IGVub3Vn aC4KPj4KPj4gVGhlIHdheSB3ZSBjb3VudCB0aGUgZmluaXNoZWQgY2h1bmtzIGFsc28gY2hhbmdl cyBhIGJpdCwgc2luY2UgdGhleQo+PiBjYW4gY29tZSB1bm9yZGVyZWQsIHNvIHdlIGNhbid0IHJl bHkgb24gdGhlIGluZGV4IHBvc2l0aW9uIHRvCj4+IGNhbGN1bGF0ZQo+PiB0aGUgcGVyY2VudGFn ZS4KPj4KPj4gVGhpcyBwYXRjaCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBwYXRjaCBmcm9tIEFk YW0gS2FsaXN6WzBdLCBidXQKPj4gcmVtb3Zlcwo+PiB0aGUgbmVlZCB0byBpbmNyZWFzZSB0aGUg YmxvY2tpbmcgdGhyZWFkcyBhbmQgdXNlcyB0aGUgKGFjdHVhbGx5Cj4+IGFsd2F5cwo+PiB1c2Vk KSB1bmRlcmx5aW5nIGFzeW5jIGltcGxlbWVudGF0aW9uIGZvciByZWFkaW5nIHJlbW90ZSBjaHVu a3MuCj4+Cj4+IDA6Cj4+IGh0dHBzOi8vbG9yZS5wcm94bW94LmNvbS9wdmUtZGV2ZWwvbWFpbG1h bi43MTkuMTc1MTA1Mjc5NC4zOTUucHZlLWRldmVsQGxpc3RzLnByb3htb3guY29tLwo+Pgo+PiBT aWduZWQtb2ZmLWJ5OiBEb21pbmlrIENzYXBhayA8ZC5jc2FwYWtAcHJveG1veC5jb20+Cj4+IEJh c2VkLW9uLXBhdGNoLWJ5OiBBZGFtIEthbGlzeiA8YWRhbS5rYWxpc3pAbm90bnVsbG1ha2Vycy5j b20+Cj4+IC0tLQo+PiBjaGFuZ2VzIGZyb20gUkZDIHYxOgo+PiAqIHVzZXMgdG9raW8gdGFzayBz cGF3biB0byBhY3R1YWxseSBydW4gdGhlIGZldGNoaW5nIGluIHRoZQo+PiBiYWNrZ3JvdW5kCj4+ ICogcmVkbyB0aGUgY291bnRpbmcgZm9yIHRoZSB0YXNrIG91dHB1dCAocG9zIHdhcyB1bm9yZGVy ZWQgc28gd2UgZ290Cj4+ICDCoCB3ZWlyZCBvcmRlcmluZyBzb21ldGltZXMpCj4+Cj4+IFdoZW4g YWN0dWFsbHkgcnVubmluZyB0aGUgZmV0Y2hpbmcgaW4gdGhlIGJhY2tncm91bmQgdGhlIHNwZWVk Cj4+IGluY3JlYXNlCj4+IGlzIG11Y2ggaGlnaGVyIHRoYW4ganVzdCB1c2luZyBidWZmZXJfdW5v cmRlcmVkIGZvciB0aGUgZmV0Y2hpbmcKPj4gZnV0dXJlcywgd2hpY2ggaXMgbmljZSAoYWx0b3Vn aCB0aGUgY3B1IHVzYWdlIGlzIG11Y2ggaGlnaGVyIG5vdykuCj4+Cj4+IFNpbmNlIHRoZSBiZW5j aG1hcmsgd2FzIG11Y2ggZmFzdGVyIHdpdGggaGlnaGVyIHZhbHVlcywgSSB1c2VkIGEKPj4gZGlm ZmVyZW50IGJpZ2dlciBWTSB0aGlzIHRpbWUgYXJvdW5kIHNvIHRoZSB0aW1pbmdzIGFyZSBtb3Jl Cj4+IGNvbnNpc3RlbnQKPj4gYW5kIGl0IG1ha2VzIHN1cmUgdGhlIGRpc2sgZG9lcyBub3QgZml0 IGluIHRoZSBQQlMncyBtZW1vcnkuCj4+Cj4+IFRoZSBxdWVzdGlvbiB3aGF0IGNvdW50IHdlIHNo b3VsZCB1c2UgcmVtYWlucyB0aG91Z2guLi4KPj4KPj4gIMKgc3JjL3Jlc3RvcmUucnMgfCA2MyAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0KPj4gLS0KPj4g IMKgMSBmaWxlIGNoYW5nZWQsIDQ3IGluc2VydGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQo+Pgo+ PiBkaWZmIC0tZ2l0IGEvc3JjL3Jlc3RvcmUucnMgYi9zcmMvcmVzdG9yZS5ycwo+PiBpbmRleCA1 YTVhMzk4Li40ZTZjNTM4IDEwMDY0NAo+PiAtLS0gYS9zcmMvcmVzdG9yZS5ycwo+PiArKysgYi9z cmMvcmVzdG9yZS5ycwo+PiBAQCAtMiw2ICsyLDcgQEAgdXNlIHN0ZDo6Y29udmVydDo6VHJ5SW50 bzsKPj4gIMKgdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9Owo+PiAgIAo+PiAgwqB1c2UgYW55 aG93Ojp7YmFpbCwgZm9ybWF0X2VyciwgRXJyb3J9Owo+PiArdXNlIGZ1dHVyZXM6OlN0cmVhbUV4 dDsKPj4gIMKgdXNlIG9uY2VfY2VsbDo6c3luYzo6T25jZUNlbGw7Cj4+ICDCoHVzZSB0b2tpbzo6 cnVudGltZTo6UnVudGltZTsKPj4gICAKPj4gQEAgLTEzLDcgKzE0LDcgQEAgdXNlCj4+IHBic19k YXRhc3RvcmU6OmNhY2hlZF9jaHVua19yZWFkZXI6OkNhY2hlZENodW5rUmVhZGVyOwo+PiAgwqB1 c2UgcGJzX2RhdGFzdG9yZTo6ZGF0YV9ibG9iOjpEYXRhQ2h1bmtCdWlsZGVyOwo+PiAgwqB1c2Ug cGJzX2RhdGFzdG9yZTo6Zml4ZWRfaW5kZXg6OkZpeGVkSW5kZXhSZWFkZXI7Cj4+ICDCoHVzZSBw YnNfZGF0YXN0b3JlOjppbmRleDo6SW5kZXhGaWxlOwo+PiAtdXNlIHBic19kYXRhc3RvcmU6OnJl YWRfY2h1bms6OlJlYWRDaHVuazsKPj4gK3VzZSBwYnNfZGF0YXN0b3JlOjpyZWFkX2NodW5rOjpB c3luY1JlYWRDaHVuazsKPj4gIMKgdXNlIHBic19kYXRhc3RvcmU6OkJhY2t1cE1hbmlmZXN0Owo+ PiAgwqB1c2UgcGJzX2tleV9jb25maWc6OmxvYWRfYW5kX2RlY3J5cHRfa2V5Owo+PiAgwqB1c2Ug cGJzX3Rvb2xzOjpjcnlwdF9jb25maWc6OkNyeXB0Q29uZmlnOwo+PiBAQCAtMjksNiArMzAsOSBA QCBzdHJ1Y3QgSW1hZ2VBY2Nlc3NJbmZvIHsKPj4gIMKgwqDCoMKgIGFyY2hpdmVfc2l6ZTogdTY0 LAo+PiAgwqB9Cj4+ICAgCj4+ICsvLyB1c2UgdGhpcyBtYW55IGJ1ZmZlcmVkIGZ1dHVyZXMgdG8g bWFrZSBsb2FkaW5nIG9mIGNodW5rcyBtb3JlCj4+IGNvbmN1cnJlbnQKPj4gK2NvbnN0IE1BWF9C VUZGRVJFRF9GVVRVUkVTOiB1c2l6ZSA9IDE2Owo+PiArCj4+ICDCoHB1YihjcmF0ZSkgc3RydWN0 IFJlc3RvcmVUYXNrIHsKPj4gIMKgwqDCoMKgIHNldHVwOiBCYWNrdXBTZXR1cCwKPj4gIMKgwqDC oMKgIHJ1bnRpbWU6IEFyYzxSdW50aW1lPiwKPj4gQEAgLTE2NSwyNiArMTY5LDUzIEBAIGltcGwg UmVzdG9yZVRhc2sgewo+PiAgIAo+PiAgwqDCoMKgwqDCoMKgwqDCoCBsZXQgc3RhcnRfdGltZSA9 IHN0ZDo6dGltZTo6SW5zdGFudDo6bm93KCk7Cj4+ICAgCj4+IC3CoMKgwqDCoMKgwqDCoCBmb3Ig cG9zIGluIDAuLmluZGV4LmluZGV4X2NvdW50KCkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBsZXQgZGlnZXN0ID0gaW5kZXguaW5kZXhfZGlnZXN0KHBvcykudW53cmFwKCk7Cj4+ICvCoMKg wqDCoMKgwqDCoCBsZXQgcmVhZF9xdWV1ZSA9ICgwLi5pbmRleC5pbmRleF9jb3VudCgpKS5tYXAo fHBvc3wgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgZGlnZXN0ID0gKmluZGV4Lmlu ZGV4X2RpZ2VzdChwb3MpLnVud3JhcCgpOwo+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxl dCBvZmZzZXQgPSAocG9zICogaW5kZXguY2h1bmtfc2l6ZSkgYXMgdTY0Owo+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiBkaWdlc3QgPT0gJnplcm9fY2h1bmtfZGlnZXN0IHsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgcmVzID0gd3JpdGVfemVyb19jYWxsYmFjayhv ZmZzZXQsCj4+IGluZGV4LmNodW5rX3NpemUgYXMgdTY0KTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiByZXMgPCAwIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGJhaWwhKCJ3cml0ZV96ZXJvX2NhbGxiYWNrIGZhaWxlZCAoe30pIiwgcmVz KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGNodW5rX3JlYWRlciA9IGNodW5rX3Jl YWRlci5jbG9uZSgpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhc3luYyBtb3ZlIHsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgY2h1bmsgPSBpZiBkaWdlc3QgPT0g emVyb19jaHVua19kaWdlc3Qgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgTm9uZQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgcmF3X2RhdGEgPSB0 b2tpbzo6dGFzazo6c3Bhd24oYXN5bmMgbW92ZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFzeW5jUmVhZENodW5rOjpyZWFkX2NodW5rKCZjaHVu a19yZWFkZXIsCj4+ICZkaWdlc3QpLmF3YWl0Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgLmF3YWl0Pz87Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBT b21lKHJhd19kYXRhKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH07Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBPazo6PF8sIEVycm9yPigoY2h1bmss IG9mZnNldCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKg IH0pOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCAvLyB0aGlzIGJ1ZmZlcnMgZnV0dXJlcyBhbmQg cHJlLWZldGNoZXMgc29tZSBjaHVua3MgZm9yIHVzCj4+ICvCoMKgwqDCoMKgwqDCoCBsZXQgbXV0 IHN0cmVhbSA9Cj4+IGZ1dHVyZXM6OnN0cmVhbTo6aXRlcihyZWFkX3F1ZXVlKS5idWZmZXJfdW5v cmRlcmVkKE1BWF9CVUZGRVJFRF9GVVRVUgo+PiBFUyk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKg IGxldCBtdXQgY291bnQgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqAgd2hpbGUgbGV0IFNvbWUocmVz KSA9IHN0cmVhbS5uZXh0KCkuYXdhaXQgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQg cmVzID0gcmVzPzsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWF0Y2ggcmVzIHsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoTm9uZSwgb2Zmc2V0KSA9PiB7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgcmVzID0gd3JpdGVfemVyb19j YWxsYmFjayhvZmZzZXQsCj4+IGluZGV4LmNodW5rX3NpemUgYXMgdTY0KTsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIHJlcyA8IDAgewo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWlsISgid3JpdGVfemVyb19j YWxsYmFjayBmYWlsZWQgKHt9KSIsCj4+IHJlcyk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBieXRlcyArPSBpbmRleC5jaHVua19zaXplOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgemVyb2VzICs9IGluZGV4LmNodW5rX3NpemU7Cj4+ICDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYnl0ZXMgKz0gaW5kZXguY2h1bmtfc2l6ZTsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB6ZXJvZXMgKz0gaW5kZXguY2h1bmtfc2l6ZTsKPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfSBlbHNlIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQg cmF3X2RhdGEgPSBSZWFkQ2h1bms6OnJlYWRfY2h1bmsoJmNodW5rX3JlYWRlciwKPj4gZGlnZXN0 KT87Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IHJlcyA9IHdyaXRlX2Rh dGFfY2FsbGJhY2sob2Zmc2V0LCAmcmF3X2RhdGEpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGlmIHJlcyA8IDAgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYmFpbCEoIndyaXRlX2RhdGFfY2FsbGJhY2sgZmFpbGVkICh7fSkiLCByZXMpOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChTb21lKHJhd19kYXRhKSwgb2Zmc2V0 KSA9PiB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgcmVz ID0gd3JpdGVfZGF0YV9jYWxsYmFjayhvZmZzZXQsCj4+ICZyYXdfZGF0YSk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiByZXMgPCAwIHsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmFpbCEoIndyaXRlX2RhdGFf Y2FsbGJhY2sgZmFpbGVkICh7fSkiLAo+PiByZXMpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYnl0ZXMgKz0gcmF3X2RhdGEubGVuKCk7Cj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB9Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnl0ZXMgKz0g cmF3X2RhdGEubGVuKCk7Cj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvdW50ICs9IDE7Cj4+ICsKPj4gIMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiB2ZXJib3NlIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBsZXQgbmV4dF9wZXIgPSAoKHBvcyArIDEpICogMTAwKSAvCj4+IGluZGV4LmluZGV4X2NvdW50 KCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IG5leHRfcGVyID0gKGNv dW50ICogMTAwKSAvIGluZGV4LmluZGV4X2NvdW50KCk7Cj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiBwZXIgIT0gbmV4dF9wZXIgewo+PiAgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcHJpbnRsbiEoCj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgInByb2dyZXNzIHt9JSAocmVhZCB7fSBieXRl cywgemVyb2VzID0ge30lCj4+ICh7fSBieXRlcyksIGR1cmF0aW9uIHt9IHNlYykiLAo+IAoKCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpwYnMtZGV2ZWwg bWFpbGluZyBsaXN0CnBicy1kZXZlbEBsaXN0cy5wcm94bW94LmNvbQpodHRwczovL2xpc3RzLnBy b3htb3guY29tL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby9wYnMtZGV2ZWwK