From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id D43B44D35B for ; Sat, 31 May 2025 14:49:51 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id B5FD568DA47; Sat, 31 May 2025 17:49:47 +0300 (EEST) Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 7773968C660 for ; Sat, 31 May 2025 17:49:41 +0300 (EEST) Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-451d41e1ad1so1123115e9.1 for ; Sat, 31 May 2025 07:49:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748702981; x=1749307781; darn=ffmpeg.org; h=mime-version:thread-topic:message-id:to:from:subject:date :user-agent:from:to:cc:subject:date:message-id:reply-to; bh=T+xn104/4NKifPORiew1k7mK2ZImxpMfEDmSLYcWPQQ=; b=HMLWKgYKPKScbOz42XhuOcvHqdumU8vk4WrvnETNbNQ2Y9cWJnlbMx863fVT6u2Oa7 9WAIgH/VnT7f2d6Lm4QVYBQfS5GlUie1RDxY3rM3AkQhls0WfZIAnbZLCNhKLTqU/Amn kToX5FOdzNIITpmrE4fsIAuWH8W7cSQfMN19iu77Jb0iiq4KbLPKDjc/TWM9RAXREiUh gcwJxo8hSqHt/IycmXgB6cYjiPQzKkKnR9DGZ7zeoEmCAMNLZ214beDwNPJ+tl8bj9KT ReQNrv7MZX+tUgJ8u7hQ3LV0GWrIPvRQU4OQL+lpo79oqbjYyr8iboz75/vU5xVeSY5z /VJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748702981; x=1749307781; h=mime-version:thread-topic:message-id:to:from:subject:date :user-agent:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=T+xn104/4NKifPORiew1k7mK2ZImxpMfEDmSLYcWPQQ=; b=hbCD5xvTAUyT67v5eeQLUYOps6avyOVHhJyMapJIvRiw1m5ldgL5935DXLvoVIDiQY YYNRFBapoo5Ur3bMk46nEdM+HiU7s8MlKgZO1ZEtLK1rO5Tx/2y4Hohd+s7J2UoLRTN7 pyxWpXwyZ76rM3xyDEeOrlUE9YBOjUxe5tG6hzy2ixPvSNOrXrCU8txSxdT+hZ4A/Trv WZXTXL5Me4jwsllEfhzpbOrjLfYz87Zb8xjTOf8lVQL9SSGbDKMUP5dxwgmKZUIfI7MJ bD7b1o5ofa33aLdU1aemMtwr+f8HOjcGR6uw7gGbWAW0/oj8i4mqagcmM5WzwS/xOBdr kvSg== X-Gm-Message-State: AOJu0Yyg0W3oLDx2dQ/sUseiLqCbKM9jH8RdOyc1K3t3CNpblT3yOzWa 0IuKfZdAMrNdA6C/0qsfkhSKJJqBztASCC3VRf8owGOV2fKoXNdlc6HZqvFAOw== X-Gm-Gg: ASbGnctoLh9K+UEclsTSRLEXpjluJwYtVhzh1g1bRCxwF8LwyAchOTBR7t5wr5fGXpy UC9fb/QMp2t1oJcFSgF9N/DA6ECLYZEmHeS4q9/un29/PvEILdHO9jFtonv0LkMq6dQPXNtZpzS J8MPsUQ9lXHsjIUeHNsfBTvwm32rm1bfW1H3D9q2WXskXI9OeiDQiJuAeiuHHri64TLoimiJfnL agPVrf3Dh3vn/2Z8G5bUeWrK82L8VlUHLVIttHArOJbxqLStpA0L1mtvlXnUW0yFrspcVjogAKc Dk8WPQJuCW1RfkFDTpqUWl8oqbEWDKSMpduehWi6tgT9O7Mw3kYNp2T8H1H2xev6t2ipoPRoZDd 912HmhhSzrx37YkfruU3kENPZr+h6BSR6z+AS X-Google-Smtp-Source: AGHT+IEl2OyUMAMHfNvlgR6bnOkJaGPFohHv7cZ/7SYBGV81Dyed+Ny3tm/NXsEXpoGZOKGNj5YwkQ== X-Received: by 2002:a05:600c:871b:b0:43c:f1b8:16ad with SMTP id 5b1f17b1804b1-450d655c68bmr70878045e9.30.1748702980104; Sat, 31 May 2025 07:49:40 -0700 (PDT) Received: from [192.168.1.14] (lfbn-idf1-1-107-128.w82-124.abo.wanadoo.fr. [82.124.194.128]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4efe5b892sm8361055f8f.17.2025.05.31.07.49.39 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 31 May 2025 07:49:39 -0700 (PDT) User-Agent: Microsoft-MacOutlook/16.77.23091003 Date: Sat, 31 May 2025 16:49:39 +0200 From: Quentin RENARD To: Message-ID: Thread-Topic: [PATCH] avfilter: add vf_yazf filter Mime-version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH] avfilter: add vf_yazf filter X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: em9vbXBhbiBmaWx0ZXIgd2l0aCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24KCiAKClNpZ25lZC1v ZmYtYnk6IFF1ZW50aW4gUmVuYXJkIDxjb250YWN0LWdpdGh1YkBhc3RpY29kZS5jb20+CgotLS0K CiBDaGFuZ2Vsb2fCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArCgogZG9j L2ZpbHRlcnMudGV4acKgwqDCoMKgwqDCoMKgwqAgfMKgIDU5ICsrKysrKysKCiBsaWJhdmZpbHRl ci9NYWtlZmlsZcKgwqDCoMKgIHzCoMKgIDEgKwoKIGxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYyB8 wqDCoCAxICsKCiBsaWJhdmZpbHRlci92Zl95YXpmLmPCoMKgwqAgfCAzNjAgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCgogNSBmaWxlcyBjaGFuZ2VkLCA0MjIgaW5zZXJ0 aW9ucygrKQoKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmZpbHRlci92Zl95YXpmLmMKCiAKCmRp ZmYgLS1naXQgYS9DaGFuZ2Vsb2cgYi9DaGFuZ2Vsb2cKCmluZGV4IDQyMTc0NDk0MzguLjYzMmQw ZTAzZDEgMTAwNjQ0CgotLS0gYS9DaGFuZ2Vsb2cKCisrKyBiL0NoYW5nZWxvZwoKQEAgLTE4LDYg KzE4LDcgQEAgdmVyc2lvbiA8bmV4dD46CgogLSBBUFYgZW5jb2Rpbmcgc3VwcG9ydCB0aHJvdWdo IGEgbGlib3BlbmFwdiB3cmFwcGVyCgogLSBWVkMgZGVjb2RlciBzdXBwb3J0cyBhbGwgY29udGVu dCBvZiBTQ0MgKFNjcmVlbiBDb250ZW50IENvZGluZyk6CgrCoMKgIElCQyAoSW50ZXIgQmxvY2sg Q29weSksIFBhbGV0dGUgTW9kZSBhbmQgQUNUIChBZGFwdGl2ZSBDb2xvciBUcmFuc2Zvcm0KCist IHlhemYgZmlsdGVyCgogCgrCoAoKwqB2ZXJzaW9uIDcuMToKCmRpZmYgLS1naXQgYS9kb2MvZmls dGVycy50ZXhpIGIvZG9jL2ZpbHRlcnMudGV4aQoKaW5kZXggNjNmNTVmNTc5NC4uNGZhNWJlOWU5 NCAxMDA2NDQKCi0tLSBhL2RvYy9maWx0ZXJzLnRleGkKCisrKyBiL2RvYy9maWx0ZXJzLnRleGkK CkBAIC0yNTk4Niw2ICsyNTk4Niw2NSBAQCBTZXQgYmx1ciBzdHJlbmd0aC4gRGVmYXVsdCB2YWx1 ZSBpcyAxMjguCgogQHN1YnNlY3Rpb24gQ29tbWFuZHMKCiBUaGlzIGZpbHRlciBzdXBwb3J0cyBz YW1lIEByZWZ7Y29tbWFuZHN9IGFzIG9wdGlvbnMuCgogCgorQHNlY3Rpb24geWF6ZgoKKwoKK0Fw cGx5IFpvb20gJiBQYW4gZWZmZWN0IHdpdGggZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uICgieWF6 ZiIgbWVhbnMgInlldCBhbm90aGVyIHpvb21wYW4gZmlsdGVyIikuCgorCgorVGhpcyBmaWx0ZXIg YWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CgorCgorQHRhYmxlIEBvcHRpb24KCitAaXRl bSB6CgorU2V0IHRoZSB6b29tIGV4cHJlc3Npb24uIFJhbmdlIGlzIDEtMTAuIERlZmF1bHQgaXMg MS4KCisKCitAaXRlbSB4CgorQGl0ZW0geQoKK1NldCB0aGUgeCBhbmQgeSBleHByZXNzaW9uLiBE ZWZhdWx0IGlzIDAuCgorCgorQGl0ZW0gdwoKK0BpdGVtIGgKCitTZXQgdGhlIG91dHB1dCBmcmFt ZSB3aWR0aCBhbmQgaGVpZ2h0IGV4cHJlc3Npb24uIERlZmF1bHQgaXMgMS4KCitAZW5kIHRhYmxl CgorCgorRWFjaCBleHByZXNzaW9uIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRz OgoKKwoKK0B0YWJsZSBAb3B0aW9uCgorQGl0ZW0gaW5fdywgaXcKCitJbnB1dCB3aWR0aC4KCisK CitAaXRlbSBpbl9oLCBpaAoKK0lucHV0IGhlaWdodC4KCisKCitAaXRlbSBuCgorSW5wdXQgZnJh bWUgY291bnQuCgorCgorQGl0ZW0gdAoKK1RoZSBpbnB1dCB0aW1lc3RhbXAgZXhwcmVzc2VkIGlu IHNlY29uZHMuCgorQGVuZCB0YWJsZQoKKwoKK0FkZGl0aW9uYWxseSB4IGFuZCB5IGV4cHJlc3Np b25zIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgoKKwoKK0B0YWJsZSBAb3B0 aW9uCgorQGl0ZW0gegoKK0xhc3QgY2FsY3VsYXRlZCB6b29tIGZyb20gJ3onIGV4cHJlc3Npb24g Zm9yIGN1cnJlbnQgaW5wdXQgZnJhbWUuCgorCgorQGl0ZW0gencKCitMYXN0IGNhbGN1bGF0ZWQg em9vbSB3aWR0aCBmb3IgY3VycmVudCBpbnB1dCBmcmFtZS4KCisKCitAaXRlbSB6aAoKK0xhc3Qg Y2FsY3VsYXRlZCB6b29tIGhlaWdodCBmb3IgY3VycmVudCBpbnB1dCBmcmFtZS4KCitAZW5kIHRh YmxlCgorCgorQHN1YnNlY3Rpb24gRXhhbXBsZXMKCisKCitAaXRlbWl6ZQoKK0BpdGVtCgorWm9v bSBpbiAyeCBpbnRvIGNlbnRlciBvZiBwaWN0dXJlIGZvciBmaXJzdCAzMCBmcmFtZXM6CgorQGV4 YW1wbGUKCit5YXpmPXg9Jyhpdy8yKS0oencvMiknOnk9JyhpaC8yKS0oemgvMiknOno9J21pbigy LCAxK24qLzMwKSc6dz0xMDgwOmg9MTA4MCIKCitAZW5kIGV4YW1wbGUKCisKCitAZW5kIGl0ZW1p emUKCisKCiBAc2VjdGlvbiB6b29tcGFuCgogCgrCoEFwcGx5IFpvb20gJiBQYW4gZWZmZWN0LgoK ZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL01ha2VmaWxlIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUK CmluZGV4IDk3ZjhmMTcyNzIuLjQwOWE5ZjEwZGMgMTAwNjQ0CgotLS0gYS9saWJhdmZpbHRlci9N YWtlZmlsZQoKKysrIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUKCkBAIC01ODIsNiArNTgyLDcgQEAg T0JKUy0kKENPTkZJR19ZQURJRl9WSURFT1RPT0xCT1hfRklMVEVSKcKgwqDCoMKgICs9IHZmX3lh ZGlmX3ZpZGVvdG9vbGJveC5vIFwKCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBtZXRhbC91dGlscy5vIFwKCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB5YWRpZl9jb21tb24ubwoKIE9CSlMtJChDT05GSUdfWUFFUEJMVVJfRklMVEVSKcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfeWFlcGJsdXIubwoKK09CSlMtJChDT05GSUdf WUFaRl9GSUxURVIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZmX3lh emYubwoKIE9CSlMtJChDT05GSUdfWk1RX0ZJTFRFUinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCArPSBmX3ptcS5vCgogT0JKUy0kKENPTkZJR19aT09NUEFOX0ZJTFRFUinC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKz0gdmZfem9vbXBhbi5vCgogT0JKUy0kKENP TkZJR19aU0NBTEVfRklMVEVSKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IHZm X3pzY2FsZS5vCgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jIGIvbGliYXZm aWx0ZXIvYWxsZmlsdGVycy5jCgppbmRleCAzYmMwNDViMjhmLi41ZmM4MDMwM2Y1IDEwMDY0NAoK LS0tIGEvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jCgorKysgYi9saWJhdmZpbHRlci9hbGxmaWx0 ZXJzLmMKCkBAIC01NDQsNiArNTQ0LDcgQEAgZXh0ZXJuIGNvbnN0IEZGRmlsdGVyIGZmX3ZmX3lh ZGlmOwoKIGV4dGVybiBjb25zdCBGRkZpbHRlciBmZl92Zl95YWRpZl9jdWRhOwoKIGV4dGVybiBj b25zdCBGRkZpbHRlciBmZl92Zl95YWRpZl92aWRlb3Rvb2xib3g7CgogZXh0ZXJuIGNvbnN0IEZG RmlsdGVyIGZmX3ZmX3lhZXBibHVyOwoKK2V4dGVybiBjb25zdCBGRkZpbHRlciBmZl92Zl95YXpm OwoKIGV4dGVybiBjb25zdCBGRkZpbHRlciBmZl92Zl96bXE7CgogZXh0ZXJuIGNvbnN0IEZGRmls dGVyIGZmX3ZmX3pvb21wYW47CgogZXh0ZXJuIGNvbnN0IEZGRmlsdGVyIGZmX3ZmX3pzY2FsZTsK CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl95YXpmLmMgYi9saWJhdmZpbHRlci92Zl95YXpm LmMKCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CgppbmRleCAwMDAwMDAwMDAwLi4zNmMxNThmZDMyCgot LS0gL2Rldi9udWxsCgorKysgYi9saWJhdmZpbHRlci92Zl95YXpmLmMKCkBAIC0wLDAgKzEsMzYw IEBACgorLyoKCisgKiBDb3B5cmlnaHQgKGMpIDIwMjUgUXVlbnRpbiBSZW5hcmQKCisgKgoKKyAq IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KCisgKgoKKyAqIEZGbXBlZyBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKCisgKiBtb2RpZnkgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCgorICogTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCgor ICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uCgorICoKCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgoKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS7CoCBTZWUgdGhlIEdOVQoKKyAqIExl c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgorICoKCisgKiBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg UHVibGljCgorICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0 aGUgRnJlZSBTb2Z0d2FyZQoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl dCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKCisgKi8KCisKCisjaW5j bHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgoKKyNp bmNsdWRlICJ2aWRlby5oIgoKKwoKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNb XSA9IHsKCivCoMKgwqAgImluX3ciLMKgwqAgIml3IiwKCivCoMKgwqAgImluX2giLMKgwqAgImlo IiwKCivCoMKgwqAgInoiLAoKK8KgwqDCoCAienciLAoKK8KgwqDCoCAiemgiLAoKK8KgwqDCoCAi biIsCgorwqDCoMKgICJ0IiwKCivCoMKgwqAgTlVMTAoKK307CgorCgorZW51bSB2YXJfbmFtZSB7 CgorwqDCoMKgIFZBUl9JTl9XLMKgwqAgVkFSX0lXLAoKK8KgwqDCoCBWQVJfSU5fSCzCoMKgIFZB Ul9JSCwKCivCoMKgwqAgVkFSX1osCgorwqDCoMKgIFZBUl9aVywKCivCoMKgwqAgVkFSX1pILAoK K8KgwqDCoCBWQVJfTiwKCivCoMKgwqAgVkFSX1QsCgorwqDCoMKgIFZBUlNfTkIKCit9OwoKKwoK K3R5cGVkZWYgc3RydWN0IFlBWkZDb250ZXh0IHsKCivCoMKgwqAgY29uc3QgQVZDbGFzcyAqY2xh c3M7CgorwqDCoMKgIGNoYXIgKnhfZXhwcl9zdHIsICp5X2V4cHJfc3RyLCAqd19leHByX3N0ciwg KmhfZXhwcl9zdHIsICp6b29tX2V4cHJfc3RyOwoKK8KgwqDCoCBBVkV4cHIgKnhfZXhwciwgKnlf ZXhwciwgKndfZXhwciwgKmhfZXhwciwgKnpvb21fZXhwcjsKCivCoMKgwqAgZG91YmxlIHZhcl92 YWx1ZXNbVkFSU19OQl07CgorfSBZQVpGQ29udGV4dDsKCisKCit0eXBlZGVmIHN0cnVjdCBUaHJl YWREYXRhIHsKCivCoMKgwqAgQVZGcmFtZSAqaW4sICpvdXQ7CgorwqDCoMKgIGZsb2F0IGNyb3Bf aCwgY3JvcF94LCBjcm9wX3ksIGNyb3BfdzsKCivCoMKgwqAgaW50IHcsIGg7CgorfSBUaHJlYWRE YXRhOwoKKwoKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoK K3sKCivCoMKgwqAgWUFaRkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CgorwqDCoMKgIGludCByZXQ7 CgorCgorwqDCoMKgIHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPnhfZXhwciwgcy0+eF9leHByX3N0 ciwgdmFyX25hbWVzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOwoKK8KgwqDCoCBp ZiAocmV0IDwgMCkKCivCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0OwoKKwoKK8KgwqDCoCByZXQg PSBhdl9leHByX3BhcnNlKCZzLT55X2V4cHIsIHMtPnlfZXhwcl9zdHIsIHZhcl9uYW1lcywgTlVM TCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKCivCoMKgwqAgaWYgKHJldCA8IDApCgorwqDC oMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKCisKCivCoMKgwqAgcmV0ID0gYXZfZXhwcl9wYXJzZSgm cy0+d19leHByLCBzLT53X2V4cHJfc3RyLCB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5V TEwsIDAsIGN0eCk7CgorwqDCoMKgIGlmIChyZXQgPCAwKQoKK8KgwqDCoMKgwqDCoMKgIHJldHVy biByZXQ7CgorCgorwqDCoMKgIHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPmhfZXhwciwgcy0+aF9l eHByX3N0ciwgdmFyX25hbWVzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOwoKK8Kg wqDCoCBpZiAocmV0IDwgMCkKCivCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0OwoKKwoKK8KgwqDC oCByZXQgPSBhdl9leHByX3BhcnNlKCZzLT56b29tX2V4cHIsIHMtPnpvb21fZXhwcl9zdHIsIHZh cl9uYW1lcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKCivCoMKgwqAgaWYgKHJl dCA8IDApCgorwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKCisKCivCoMKgwqAgcmV0dXJuIDA7 CgorfQoKKwoKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykK Cit7CgorwqDCoMKgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOwoKK8KgwqDC oCBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOwoKK8KgwqDCoCBZQVpGQ29u dGV4dCAqcyA9IGN0eC0+cHJpdjsKCisKCivCoMKgwqAgcy0+dmFyX3ZhbHVlc1tWQVJfSU5fV10g PSBzLT52YXJfdmFsdWVzW1ZBUl9JV10gPSBpbmxpbmstPnc7CgorwqDCoMKgIHMtPnZhcl92YWx1 ZXNbVkFSX0lOX0hdID0gcy0+dmFyX3ZhbHVlc1tWQVJfSUhdID0gaW5saW5rLT5oOwoKKwoKK8Kg wqDCoCBvdXRsaW5rLT53ID0gRkZNQVgoYXZfZXhwcl9ldmFsKHMtPndfZXhwciwgcy0+dmFyX3Zh bHVlcywgTlVMTCksIDEpOwoKK8KgwqDCoCBvdXRsaW5rLT5oID0gRkZNQVgoYXZfZXhwcl9ldmFs KHMtPmhfZXhwciwgcy0+dmFyX3ZhbHVlcywgTlVMTCksIDEpOwoKK8KgwqDCoCByZXR1cm4gMDsK Cit9CgorCgorc3RhdGljIGlubGluZSB1aW50OF90IHpvb21wYW5fcGl4ZWwoY29uc3QgdWludDhf dCAqc3JjLCBjb25zdCBpbnQgc3JjX3N0cmlkZSwgCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBpbnQg c3JjX3csIGNvbnN0IGludCBzcmNfaCwgCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBmbG9hdCB4LCBj b25zdCBmbG9hdCB5KQoKK3sKCivCoMKgwqAgaW50IHgwID0gKGludClmbG9vcmYoeCk7CgorwqDC oMKgIGludCB5MCA9IChpbnQpZmxvb3JmKHkpOwoKK8KgwqDCoCBpbnQgeDEgPSB4MCArIDE7Cgor wqDCoMKgIGludCB5MSA9IHkwICsgMTsKCisKCivCoMKgwqAgZmxvYXQgZnggPSB4IC0geDA7Cgor wqDCoMKgIGZsb2F0IGZ5ID0geSAtIHkwOwoKKwoKK8KgwqDCoCB4MCA9IEZGTUFYKDAsIEZGTUlO KHgwLCBzcmNfdyAtIDEpKTsKCivCoMKgwqAgeDEgPSBGRk1BWCgwLCBGRk1JTih4MSwgc3JjX3cg LSAxKSk7CgorwqDCoMKgIHkwID0gRkZNQVgoMCwgRkZNSU4oeTAsIHNyY19oIC0gMSkpOwoKK8Kg wqDCoCB5MSA9IEZGTUFYKDAsIEZGTUlOKHkxLCBzcmNfaCAtIDEpKTsKCisKCivCoMKgwqAgZmxv YXQgcDAwID0gc3JjW3kwICogc3JjX3N0cmlkZSArIHgwXTsKCivCoMKgwqAgZmxvYXQgcDEwID0g c3JjW3kwICogc3JjX3N0cmlkZSArIHgxXTsKCivCoMKgwqAgZmxvYXQgcDAxID0gc3JjW3kxICog c3JjX3N0cmlkZSArIHgwXTsKCivCoMKgwqAgZmxvYXQgcDExID0gc3JjW3kxICogc3JjX3N0cmlk ZSArIHgxXTsKCisKCivCoMKgwqAgcmV0dXJuICgxIC0gZngpICogKDEgLSBmeSkgKiBwMDAgKwoK K8KgwqDCoMKgwqDCoMKgwqDCoMKgIGZ4ICogKDEgLSBmeSkgKiBwMTAgKwoKK8KgwqDCoMKgwqDC oMKgwqDCoMKgICgxIC0gZngpICogZnkgKiBwMDEgKwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgIGZ4 ICogZnkgKiBwMTE7CgorfQoKKwoKK3N0YXRpYyB2b2lkIHpvb21wYW5fcGxhbmUoY29uc3QgdWlu dDhfdCAqc3JjLCBjb25zdCBpbnQgc3JjX3N0cmlkZSwKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgaW50IHNyY193LCBjb25zdCBp bnQgc3JjX2gsIGNvbnN0IGZsb2F0IGNyb3BfeCwKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3QgZmxvYXQgY3JvcF95LCBjb25zdCBm bG9hdCBjcm9wX3csCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGNvbnN0IGZsb2F0IGNyb3BfaCwgdWludDhfdCAqZHN0LAoKK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb25zdCBpbnQg ZHN0X3N0cmlkZSwgY29uc3QgaW50IGRzdF93LCBjb25zdCBpbnQgZHN0X2gsCgorwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGludCBk c3RfeV9zdGFydCwgY29uc3QgaW50IGRzdF95X2VuZCkKCit7CgorwqDCoMKgIGZsb2F0IHUsIHYs IHgsIHksIHZhbDsKCivCoMKgwqAgZm9yIChpbnQgZHN0X3kgPSBkc3RfeV9zdGFydDsgZHN0X3kg PCBkc3RfeV9lbmQ7IGRzdF95KyspIHsKCivCoMKgwqDCoMKgwqDCoCBmb3IgKGludCBkc3RfeCA9 IDA7IGRzdF94IDwgZHN0X3c7IGRzdF94KyspIHsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUg PSAoZHN0X3cgPiAxKSA/IChmbG9hdClkc3RfeCAvIChmbG9hdCkoZHN0X3cgLSAxKSA6IDAuMGY7 CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2ID0gKGRzdF9oID4gMSkgPyAoZmxvYXQpZHN0X3kg LyAoZmxvYXQpKGRzdF9oIC0gMSkgOiAwLjBmOwoKKwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg eCA9IGNyb3BfeCArIHUgKiBjcm9wX3c7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB5ID0gY3Jv cF95ICsgdiAqIGNyb3BfaDsKCisKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZhbCA9IHpvb21w YW5fcGl4ZWwoc3JjLCBzcmNfc3RyaWRlLCBzcmNfdywgc3JjX2gsIHgsIHkpOwoKKwoKK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZHN0W2RzdF95ICogZHN0X3N0cmlkZSArIGRzdF94XSA9IEZGTUlO KEZGTUFYKHZhbCwgMCksIDI1NSk7CgorwqDCoMKgwqDCoMKgwqAgfQoKK8KgwqDCoCB9CgorfQoK KwoKK3N0YXRpYyBpbnQgem9vbXBhbl9zbGljZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAq YXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoKK3sKCivCoMKgwqAgQVZGaWx0ZXJMaW5rICpp bmxpbmsgPSBjdHgtPmlucHV0c1swXTsKCivCoMKgwqAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7Cgor CgorwqDCoMKgIGNvbnN0IGludCBzbGljZV9zdGFydCA9ICh0ZC0+b3V0LT5oZWlnaHQgKiBqb2Ju cikgLyBuYl9qb2JzOwoKK8KgwqDCoCBjb25zdCBpbnQgc2xpY2VfZW5kID0gKHRkLT5vdXQtPmhl aWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOwoKKwoKK8KgwqDCoCBpbnQgbmJfcGxhbmVzID0g NDsKCivCoMKgwqAgc3RydWN0IHsKCivCoMKgwqDCoMKgwqDCoCBpbnQgcmVzb2x1dGlvbl93OwoK K8KgwqDCoMKgwqDCoMKgIGludCByZXNvbHV0aW9uX2g7CgorwqDCoMKgIH0gcGxhbmVzWzRdID0g ewoKK8KgwqDCoMKgwqDCoMKgIHsucmVzb2x1dGlvbl9oID0gMSwgLnJlc29sdXRpb25fdyA9IDF9 LAoKK8KgwqDCoMKgwqDCoMKgIHsucmVzb2x1dGlvbl9oID0gMSwgLnJlc29sdXRpb25fdyA9IDF9 LAoKK8KgwqDCoMKgwqDCoMKgIHsucmVzb2x1dGlvbl9oID0gMSwgLnJlc29sdXRpb25fdyA9IDF9 LAoKK8KgwqDCoMKgwqDCoMKgIHsucmVzb2x1dGlvbl9oID0gMSwgLnJlc29sdXRpb25fdyA9IDF9 LAoKK8KgwqDCoCB9OwoKK8KgwqDCoCBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CgorwqDCoMKg wqDCoMKgwqAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMFA6CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBuYl9wbGFuZXMgPSAzOwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzFdLnJlc29s dXRpb25faCA9IDQ7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMV0ucmVzb2x1dGlv bl93ID0gNDsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBsYW5lc1syXS5yZXNvbHV0aW9uX2gg PSA0OwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzJdLnJlc29sdXRpb25fdyA9IDQ7 CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKCivCoMKgwqDCoMKgwqDCoCBjYXNlIEFW X1BJWF9GTVRfWVVWNDExUDoKCivCoMKgwqDCoMKgwqDCoCBjYXNlIEFWX1BJWF9GTVRfWVVWSjQx MVA6CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuYl9wbGFuZXMgPSAzOwoKK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcGxhbmVzWzFdLnJlc29sdXRpb25fdyA9IDQ7CgorwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwbGFuZXNbMl0ucmVzb2x1dGlvbl93ID0gNDsKCivCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGJyZWFrOwoKK8KgwqDCoMKgwqDCoMKgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgoKK8Kg wqDCoMKgwqDCoMKgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDIwUDoKCivCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIG5iX3BsYW5lcyA9IDM7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMV0u cmVzb2x1dGlvbl9oID0gMjsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBsYW5lc1sxXS5yZXNv bHV0aW9uX3cgPSAyOwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzJdLnJlc29sdXRp b25faCA9IDI7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMl0ucmVzb2x1dGlvbl93 ID0gMjsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwoKK8KgwqDCoMKgwqDCoMKgIGNh c2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5iX3BsYW5l cyA9IDQ7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMV0ucmVzb2x1dGlvbl9oID0g MjsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBsYW5lc1sxXS5yZXNvbHV0aW9uX3cgPSAyOwoK K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzJdLnJlc29sdXRpb25faCA9IDI7CgorwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMl0ucmVzb2x1dGlvbl93ID0gMjsKCivCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJyZWFrOwoKK8KgwqDCoMKgwqDCoMKgIGNhc2UgQVZfUElYX0ZNVF9Z VVY0MjJQOgoKK8KgwqDCoMKgwqDCoMKgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDIyUDoKCivCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIG5iX3BsYW5lcyA9IDM7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBwbGFuZXNbMV0ucmVzb2x1dGlvbl93ID0gMjsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBs YW5lc1syXS5yZXNvbHV0aW9uX3cgPSAyOwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 CgorwqDCoMKgwqDCoMKgwqAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOgoKK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbmJfcGxhbmVzID0gNDsKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBsYW5l c1sxXS5yZXNvbHV0aW9uX3cgPSAyOwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzJd LnJlc29sdXRpb25fdyA9IDI7CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKCivCoMKg wqDCoMKgwqDCoCBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDoKCivCoMKgwqDCoMKgwqDCoCBjYXNl IEFWX1BJWF9GTVRfWVVWSjQ0MFA6CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuYl9wbGFuZXMg PSAzOwoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGxhbmVzWzFdLnJlc29sdXRpb25faCA9IDI7 CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwbGFuZXNbMl0ucmVzb2x1dGlvbl9oID0gMjsKCivC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwoKK8KgwqDCoMKgwqDCoMKgIGNhc2UgQVZfUElY X0ZNVF9ZVVY0NDRQOgoKK8KgwqDCoMKgwqDCoMKgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQ0UDoK CivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5iX3BsYW5lcyA9IDM7CgorwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBicmVhazsKCivCoMKgwqDCoMKgwqDCoCBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6 CgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuYl9wbGFuZXMgPSA0OwoKK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgYnJlYWs7CgorwqDCoMKgIH0KCisKCivCoMKgwqAgZm9yIChpbnQgaSA9IDA7IGkg PCBuYl9wbGFuZXM7IGkrKykgewoKK8KgwqDCoMKgwqDCoMKgIHpvb21wYW5fcGxhbmUodGQtPmlu LT5kYXRhW2ldLCB0ZC0+aW4tPmxpbmVzaXplW2ldLCB0ZC0+aW4tPndpZHRoL3BsYW5lc1tpXS5y ZXNvbHV0aW9uX3csCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdGQt PmluLT5oZWlnaHQvcGxhbmVzW2ldLnJlc29sdXRpb25faCwgdGQtPmNyb3BfeC9wbGFuZXNbaV0u cmVzb2x1dGlvbl93LAoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRk LT5jcm9wX3kvcGxhbmVzW2ldLnJlc29sdXRpb25faCwgdGQtPmNyb3Bfdy9wbGFuZXNbaV0ucmVz b2x1dGlvbl93LAoKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRkLT5j cm9wX2gvcGxhbmVzW2ldLnJlc29sdXRpb25faCwgdGQtPm91dC0+ZGF0YVtpXSwgdGQtPm91dC0+ bGluZXNpemVbaV0sCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdGQt Pm91dC0+d2lkdGgvcGxhbmVzW2ldLnJlc29sdXRpb25fdywgdGQtPm91dC0+aGVpZ2h0L3BsYW5l c1tpXS5yZXNvbHV0aW9uX2gsCgorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc2xpY2Vfc3RhcnQvcGxhbmVzW2ldLnJlc29sdXRpb25faCwgc2xpY2VfZW5kL3BsYW5lc1tp XS5yZXNvbHV0aW9uX2gpOwoKK8KgwqDCoCB9CgorwqDCoMKgIHJldHVybiAwOwoKK30KCisKCitz dGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4p CgorewoKK8KgwqDCoCBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwoKK8KgwqDC oCBZQVpGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKCivCoMKgwqAgQVZGaWx0ZXJMaW5rICpvdXRs aW5rID0gY3R4LT5vdXRwdXRzWzBdOwoKK8KgwqDCoCBpbnQgcmV0OwoKK8KgwqDCoCBBVkZyYW1l ICpvdXQgPSBOVUxMOwoKK8KgwqDCoCBUaHJlYWREYXRhIHRkOwoKK8KgwqDCoCBmbG9hdCB6b29t LCBhOwoKKwoKK8KgwqDCoCBpbmxpbmstPncgPSBpbi0+d2lkdGg7CgorwqDCoMKgIGlubGluay0+ aCA9IGluLT5oZWlnaHQ7CgorwqDCoMKgIHMtPnZhcl92YWx1ZXNbVkFSX05dID0gZmZfZmlsdGVy X2xpbmsoaW5saW5rKS0+ZnJhbWVfY291bnRfb3V0OwoKK8KgwqDCoCBzLT52YXJfdmFsdWVzW1ZB Ul9UXSA9IFRTMlQoaW4tPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOwoKKwoKK8KgwqDCoCBpZiAo KHJldCA9IGNvbmZpZ19wcm9wcyhvdXRsaW5rKSkgPCAwKQoKK8KgwqDCoMKgwqDCoMKgIGdvdG8g ZXJyOwoKKwoKK8KgwqDCoCB0ZC53ID0gb3V0bGluay0+dzsKCivCoMKgwqAgdGQuaCA9IG91dGxp bmstPmg7CgorwqDCoMKgIGEgPSAoZmxvYXQpb3V0bGluay0+dyAvIChmbG9hdClvdXRsaW5rLT5o OwoKK8KgwqDCoCAKCivCoMKgwqAgcy0+dmFyX3ZhbHVlc1tWQVJfWl0gPSB6b29tID0gYXZfY2xp cGQoYXZfZXhwcl9ldmFsKHMtPnpvb21fZXhwciwgcy0+dmFyX3ZhbHVlcywgTlVMTCksIDEsIDEw KTsKCivCoMKgwqAgCgorwqDCoMKgIHRkLmNyb3BfdyA9IChmbG9hdClpbmxpbmstPncgLyB6b29t OwoKK8KgwqDCoCB0ZC5jcm9wX2ggPSB0ZC5jcm9wX3cgLyBhOwoKK8KgwqDCoCBpZiAodGQuY3Jv cF9oID4gaW5saW5rLT5oKSB7CgorwqDCoMKgwqDCoMKgwqAgdGQuY3JvcF9oID0gaW5saW5rLT5o OwoKK8KgwqDCoMKgwqDCoMKgIHRkLmNyb3BfdyA9IHRkLmNyb3BfaCAqIGE7CgorwqDCoMKgIH0K CivCoMKgwqAgcy0+dmFyX3ZhbHVlc1tWQVJfWlddID0gdGQuY3JvcF93OwoKK8KgwqDCoCBzLT52 YXJfdmFsdWVzW1ZBUl9aSF0gPSB0ZC5jcm9wX2g7CgorwqDCoMKgIAoKK8KgwqDCoCB0ZC5jcm9w X3ggPSBhdl9jbGlwZChhdl9leHByX2V2YWwocy0+eF9leHByLCBzLT52YXJfdmFsdWVzLCBOVUxM KSwgMCwgRkZNQVgoaW5saW5rLT53IC0gdGQuY3JvcF93LCAwKSk7CgorwqDCoMKgIHRkLmNyb3Bf eSA9IGF2X2NsaXBkKGF2X2V4cHJfZXZhbChzLT55X2V4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwp LCAwLCBGRk1BWChpbmxpbmstPmggLSB0ZC5jcm9wX2gsIDApKTsKCisKCivCoMKgwqAgb3V0ID0g ZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKCivC oMKgwqAgaWYgKCFvdXQpIHsKCivCoMKgwqDCoMKgwqDCoCByZXQgPSBBVkVSUk9SKEVOT01FTSk7 CgorwqDCoMKgwqDCoMKgwqAgZ290byBlcnI7CgorwqDCoMKgIH0KCisKCivCoMKgwqAgaWYgKChy ZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pKSA8IDApCgorwqDCoMKgwqDCoMKgwqAg Z290byBlcnI7CgorCgorwqDCoMKgIHRkLm91dCA9IG91dCwgdGQuaW4gPSBpbjsKCivCoMKgwqAg aWYgKChyZXQgPSBmZl9maWx0ZXJfZXhlY3V0ZShjdHgsIHpvb21wYW5fc2xpY2UsICZ0ZCwgTlVM TCwKCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBGRk1JTih0ZC5oLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpKSA8 IDApCgorwqDCoMKgwqDCoMKgwqAgZ290byBlcnI7CgorCgorwqDCoMKgIGF2X2ZyYW1lX2ZyZWUo JmluKTsKCivCoMKgwqAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwoKK8Kg wqDCoCAKCitlcnI6CgorwqDCoMKgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKCivCoMKgwqAgYXZfZnJh bWVfZnJlZSgmb3V0KTsKCivCoMKgwqAgcmV0dXJuIHJldDsKCit9CgorCgorc3RhdGljIGNvbnN0 IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0gewoKK8KgwqDCoCBBVl9QSVhfRk1UX1lV VjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKCivCoMKgwqAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBB Vl9QSVhfRk1UX1lVVjQyMlAsCgorwqDCoMKgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZN VF9ZVVY0NDRQLAoKK8KgwqDCoCBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVko0 MjBQLAoKK8KgwqDCoCBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAoK K8KgwqDCoCBBVl9QSVhfRk1UX1lVVko0NDRQLAoKK8KgwqDCoCBBVl9QSVhfRk1UX1lVVkE0MjBQ LCBBVl9QSVhfRk1UX1lVVkE0MjJQLAoKK8KgwqDCoCBBVl9QSVhfRk1UX1lVVkE0NDRQLAoKK8Kg wqDCoCBBVl9QSVhfRk1UX05PTkUKCit9OwoKKwoKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0 KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoKK3sKCivCoMKgwqAgWUFaRkNvbnRleHQgKnMgPSBjdHgt PnByaXY7CgorCgorwqDCoMKgIGF2X2V4cHJfZnJlZShzLT54X2V4cHIpOwoKK8KgwqDCoCBhdl9l eHByX2ZyZWUocy0+eV9leHByKTsKCivCoMKgwqAgYXZfZXhwcl9mcmVlKHMtPnpvb21fZXhwcik7 CgorwqDCoMKgIGF2X2V4cHJfZnJlZShzLT53X2V4cHIpOwoKK8KgwqDCoCBhdl9leHByX2ZyZWUo cy0+aF9leHByKTsKCit9CgorCgorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWUFaRkNvbnRl eHQsIHgpCgorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxB R19GSUxURVJJTkdfUEFSQU0KCisKCitzdGF0aWMgY29uc3QgQVZPcHRpb24geWF6Zl9vcHRpb25z W10gPSB7CgorwqDCoMKgIHsgInoiLCAic2V0IHRoZSB6b29tIGV4cHJlc3Npb24iLCBPRkZTRVQo em9vbV9leHByX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMSIgfSwgLmZsYWdz ID0gRkxBR1MgfSwKCivCoMKgwqAgeyAieCIsICJzZXQgdGhlIHpvb20geCBleHByZXNzaW9uIiwg T0ZGU0VUKHhfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIjAiIH0sIC5m bGFncyA9IEZMQUdTIH0sCgorwqDCoMKgIHsgInkiLCAic2V0IHRoZSB6b29tIHkgZXhwcmVzc2lv biIsIE9GRlNFVCh5X2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIwIiB9 LCAuZmxhZ3MgPSBGTEFHUyB9LAoKK8KgwqDCoCB7ICJ3IiwgInNldCB0aGUgb3V0cHV0IHcgZXhw cmVzc2lvbiIsIE9GRlNFVCh3X2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9 ICIxIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAoKK8KgwqDCoCB7ICJoIiwgInNldCB0aGUgb3V0cHV0 IGggZXhwcmVzc2lvbiIsIE9GRlNFVChoX2V4cHJfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7 LnN0ciA9ICIxIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAoKK8KgwqDCoCB7IE5VTEwgfQoKK307Cgor CgorQVZGSUxURVJfREVGSU5FX0NMQVNTKHlhemYpOwoKKwoKK3N0YXRpYyBjb25zdCBBVkZpbHRl clBhZCBhdmZpbHRlcl92Zl95YXpmX2lucHV0c1tdID0gewoKK8KgwqDCoCB7CgorwqDCoMKgwqDC oMKgwqAgLm5hbWXCoMKgwqDCoMKgwqDCoMKgID0gImRlZmF1bHQiLAoKK8KgwqDCoMKgwqDCoMKg IC50eXBlwqDCoMKgwqDCoMKgwqDCoCA9IEFWTUVESUFfVFlQRV9WSURFTywKCivCoMKgwqDCoMKg wqDCoCAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAoKK8KgwqDCoCB9LAoKK307CgorCgor c3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX3lhemZfb3V0cHV0c1tdID0gewoK K8KgwqDCoCB7CgorwqDCoMKgwqDCoMKgwqAgLm5hbWXCoMKgwqDCoMKgwqDCoMKgID0gImRlZmF1 bHQiLAoKK8KgwqDCoMKgwqDCoMKgIC50eXBlwqDCoMKgwqDCoMKgwqDCoCA9IEFWTUVESUFfVFlQ RV9WSURFTywKCivCoMKgwqDCoMKgwqDCoCAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAoK K8KgwqDCoCB9LAoKK307CgorCgorY29uc3QgRkZGaWx0ZXIgZmZfdmZfeWF6ZiA9IHsKCivCoMKg wqAgLnAubmFtZcKgwqDCoMKgwqDCoMKgwqDCoCA9ICJ5YXpmIiwKCivCoMKgwqAgLnAuZGVzY3Jp cHRpb27CoMKgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IFpvb20gJiBQYW4gZWZmZWN0 IHdpdGggZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uLiIpLAoKK8KgwqDCoCAucC5wcml2X2NsYXNz wqDCoMKgID0gJnlhemZfY2xhc3MsCgorwqDCoMKgIC5wLmZsYWdzwqDCoMKgwqDCoMKgwqDCoCA9 IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKCivCoMKgwqAgLmluaXTCoMKgwqDCoMKgwqDC oMKgwqDCoMKgID0gaW5pdCwKCivCoMKgwqAgLnByaXZfc2l6ZcKgwqDCoMKgwqDCoCA9IHNpemVv ZihZQVpGQ29udGV4dCksCgorwqDCoMKgIC51bmluaXTCoMKgwqDCoMKgwqDCoMKgwqAgPSB1bmlu aXQsCgorwqDCoMKgIEZJTFRFUl9JTlBVVFMoYXZmaWx0ZXJfdmZfeWF6Zl9pbnB1dHMpLAoKK8Kg wqDCoCBGSUxURVJfT1VUUFVUUyhhdmZpbHRlcl92Zl95YXpmX291dHB1dHMpLAoKK8KgwqDCoCBG SUxURVJfUElYRk1UU19BUlJBWShwaXhfZm10cyksCgorfTsKCi0tIAoKMi4zOS4xCgogCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpmZm1wZWctZGV2ZWwg bWFpbGluZyBsaXN0CmZmbXBlZy1kZXZlbEBmZm1wZWcub3JnCmh0dHBzOi8vZmZtcGVnLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbAoKVG8gdW5zdWJzY3JpYmUsIHZpc2l0IGxpbmsg YWJvdmUsIG9yIGVtYWlsCmZmbXBlZy1kZXZlbC1yZXF1ZXN0QGZmbXBlZy5vcmcgd2l0aCBzdWJq ZWN0ICJ1bnN1YnNjcmliZSIuCg==