From mboxrd@z Thu Jan 1 00:00:00 1970 From: yibin.gong@nxp.com (Robin Gong) Date: Tue, 12 Jun 2018 08:58:49 +0000 Subject: [PATCH v3 0/6] add virt-dma support for imx-sdma In-Reply-To: <1528714877.2842.3.camel@pengutronix.de> References: <1528729173-28684-1-git-send-email-yibin.gong@nxp.com> <1528714877.2842.3.camel@pengutronix.de> Message-ID: <1528822708.13468.9.camel@nxp.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Lucas, Is the below DEAD LOCK issue same as your side? If yes, then I'm afraid that we have to make another patch for uart to split dma functions in uart driver out of the code area which protected by port.lock. The warning make sense since allocate sdma bd memory dynamically in virt-dma instead of static allocated as before. I'll make another uart patch into my next version patchset. [???46.155406] ===================================================== [???46.161503] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected [???46.168122] 4.17.0-rc6-00008-g7caafa3-dirty #48 Not tainted [???46.173696] ----------------------------------------------------- [???46.179795] mxc_uart_stress/419 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire: [???46.186934] fa7c1440 (fs_reclaim){+.+.}, at: fs_reclaim_acquire.part.3+0x0/0x48 [???46.194270] [???46.194270] and this task is already holding: [???46.200106] 09a17fda (&port_lock_key){-.-.}, at: uart_write+0x84/0x190 [???46.206658] which would create a new lock dependency: [???46.211710]??(&port_lock_key){-.-.} -> (fs_reclaim){+.+.} [???46.217132] [???46.217132] but this new dependency connects a HARDIRQ-irq-safe lock: [???46.225051]??(&port_lock_key){-.-.} [???46.225062] [???46.225062] ... which became HARDIRQ-irq-safe at: [???46.234740]???lock_acquire+0x70/0x90 [???46.238326]???_raw_spin_lock_irqsave+0x40/0x54 [???46.242777]???imx_uart_console_write+0x1bc/0x1e0 [???46.247402]???console_unlock+0x320/0x5f0 [???46.251329]???vprintk_emit+0x22c/0x3fc [???46.255082]???vprintk_default+0x28/0x30 [???46.258923]???vprintk_func+0x78/0xcc [???46.262503]???printk+0x34/0x54 [???46.265566]???crng_fast_load+0xf8/0x138 [???46.269407]???add_interrupt_randomness+0x21c/0x24c [???46.274204]???handle_irq_event_percpu+0x40/0x84 [???46.278739]???handle_irq_event+0x40/0x64 [???46.282667]???handle_fasteoi_irq+0xbc/0x178 [???46.286854]???generic_handle_irq+0x28/0x3c [???46.290954]???__handle_domain_irq+0x6c/0xe8 [???46.295148]???gic_handle_irq+0x64/0xc4 [???46.298904]???__irq_svc+0x70/0x98 [???46.302225]???_raw_spin_unlock_irq+0x30/0x34 [???46.306505]???finish_task_switch+0xc0/0x27c [???46.310693]???__schedule+0x2c0/0x79c [???46.314272]???schedule_idle+0x40/0x84 [???46.317941]???do_idle+0x178/0x2b4 [???46.321259]???cpu_startup_entry+0x20/0x24 [???46.325278]???rest_init+0x214/0x264 [???46.328775]???start_kernel+0x39c/0x424 [???46.332527]?????(null) [???46.334891] [???46.334891] to a HARDIRQ-irq-unsafe lock: [???46.340379]??(fs_reclaim){+.+.} [???46.340391] [???46.340391] ... which became HARDIRQ-irq-unsafe at: [???46.349885] ... [???46.349895]???lock_acquire+0x70/0x90 [???46.355225]???fs_reclaim_acquire.part.3+0x38/0x48 [???46.359933]???fs_reclaim_acquire+0x1c/0x20 [???46.364036]???kmem_cache_alloc+0x2c/0x174 [???46.368051]???alloc_worker.constprop.10+0x1c/0x58 [???46.372759]???init_rescuer.part.4+0x18/0xa4 [???46.376952]???workqueue_init+0xc0/0x210 [???46.380793]???kernel_init_freeable+0x58/0x1d8 [???46.385156]???kernel_init+0x10/0x11c [???46.388736]???ret_from_fork+0x14/0x20 [???46.392399]?????(null) [???46.394762] [???46.394762] other info that might help us debug this: [???46.394762] [???46.402769]??Possible interrupt unsafe locking scenario: [???46.402769] [???46.409560]????????CPU0????????????????????CPU1 [???46.414092]????????----????????????????????---- [???46.418622]???lock(fs_reclaim); [???46.421772]????????????????????????????????local_irq_disable(); [???46.427693]????????????????????????????????lock(&port_lock_key); [???46.433707]????????????????????????????????lock(fs_reclaim); [???46.439372]??? [???46.441993]?????lock(&port_lock_key); [???46.445661] [???46.445661]??*** DEADLOCK *** [???46.445661] On ?, 2018-06-11 at 13:01 +0200, Lucas Stach wrote: > Hi Robin, > > this series breaks serial DMA for me. I wasn't able to dig in deeper > yet. Please let me know if you can test/reproduce at your side, if > not > I'll try to find some time to collect some more debug info. > > Regards, > Lucas > > Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong: > > > > The legacy sdma driver has below limitations or drawbacks: > > ? 1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and > > alloc > > ?????one page size for one channel regardless of only few BDs > > needed > > ?????most time. But in few cases, the max PAGE_SIZE maybe not > > enough. > > ? 2. One SDMA channel can't stop immediatley once channel disabled > > which > > ?????means SDMA interrupt may come in after this channel > > terminated.There > > ?????are some patches for this corner case such as commit > > "2746e2c389f9", > > ?????but not cover non-cyclic. > > > > The common virt-dma overcomes the above limitations. It can alloc > > bd > > dynamically and free bd once this tx transfer done. No memory > > wasted or > > maximum limititation here, only depends on how many memory can be > > requested > > from kernel. For No.2, such issue can be workaround by checking if > > there > > is available descript("sdmac->desc") now once the unwanted > > interrupt > > coming. At last the common virt-dma is easier for sdma driver > > maintain. > > > > Change from v2: > > ? 1. include Sascha's patch to make the main patch easier to > > review. > > ?????Thanks Sacha. > > ? 2. remove useless 'desc'/'chan' in struct sdma_channe. > > > > Change from v1: > > ? 1. split v1 patch into 5 patches. > > ? 2. remove some unnecessary condition check. > > ? 3. remove unnecessary 'pending' list. > > > > Robin Gong (5): > > ? dmaengine: imx-sdma: add virt-dma support > > ? Revert "dmaengine: imx-sdma: fix pagefault when channel is > > disabled > > ????during interrupt" > > ? dmaengine: imx-sdma: remove usless lock > > ? dmaengine: imx-sdma: remove the maximum limation for bd numbers > > ? dmaengine: imx-sdma: add sdma_transfer_init to decrease code > > overlap > > > > ?drivers/dma/Kconfig????|???1 + > > ?drivers/dma/imx-sdma.c | 392 ++++++++++++++++++++++++++++--------- > > ------------ > > ?2 files changed, 227 insertions(+), 166 deletions(-) > > > > --? > > 2.7.4 > > > > Robin Gong (5): > > ? dmaengine: imx-sdma: add virt-dma support > > ? Revert "dmaengine: imx-sdma: fix pagefault when channel is > > disabled > > ????during interrupt" > > ? dmaengine: imx-sdma: remove usless lock > > ? dmaengine: imx-sdma: remove the maximum limation for bd numbers > > ? dmaengine: imx-sdma: add sdma_transfer_init to decrease code > > overlap > > > > Sascha Hauer (1): > > ? dmaengine: imx-sdma: factor out a struct sdma_desc from struct > > ????sdma_channel > > > > ?drivers/dma/Kconfig????|???1 + > > ?drivers/dma/imx-sdma.c | 391 ++++++++++++++++++++++++++++--------- > > ------------ > > ?2 files changed, 226 insertions(+), 166 deletions(-) > > 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 X-Spam-Level: X-Spam-Status: No, score=-0.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by aws-us-west-2-korg-lkml-1.web.codeaurora.org (Postfix) with ESMTP id 8DE48C433EF for ; Tue, 12 Jun 2018 08:59:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 24817208AE for ; Tue, 12 Jun 2018 08:59:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=nxp.com header.i=@nxp.com header.b="HcfiPIGp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 24817208AE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933930AbeFLI66 (ORCPT ); Tue, 12 Jun 2018 04:58:58 -0400 Received: from mail-ve1eur01on0046.outbound.protection.outlook.com ([104.47.1.46]:32032 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933363AbeFLI6x (ORCPT ); Tue, 12 Jun 2018 04:58:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8AaA0SQXjqw3C20mVc8ASMlHuEG3Coj9wCdi/Z1YHZ8=; b=HcfiPIGpSnSQU9TReSYG89F8k9NlqUo3CCJ1UqqOn9AbFQh2yCd3jJtKS3KFn9wzP4bM7pRdbHjSmeaOzJl02U5/FE+/atVvFfpbEGiTvPFB6LTdXY2d+0apu0YEkMROyqG/nL40ShZFvzdPzsP1PFOdlTKXY0U5UWBhNhJ3WUI= Received: from DB6PR04MB3223.eurprd04.prod.outlook.com (10.170.211.19) by DB6PR04MB2967.eurprd04.prod.outlook.com (10.170.213.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.841.14; Tue, 12 Jun 2018 08:58:50 +0000 Received: from DB6PR04MB3223.eurprd04.prod.outlook.com ([fe80::15a5:6ba0:ac66:7977]) by DB6PR04MB3223.eurprd04.prod.outlook.com ([fe80::15a5:6ba0:ac66:7977%2]) with mapi id 15.20.0841.011; Tue, 12 Jun 2018 08:58:50 +0000 From: Robin Gong To: "l.stach@pengutronix.de" , "s.hauer@pengutronix.de" , "vkoul@kernel.org" , "dan.j.williams@intel.com" CC: "dmaengine@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , dl-linux-imx Subject: Re: [PATCH v3 0/6] add virt-dma support for imx-sdma Thread-Topic: [PATCH v3 0/6] add virt-dma support for imx-sdma Thread-Index: AQHUAVHamC9wTHQjkEKuAo/ffjDFC6Ra5GaAgAH2IQA= Date: Tue, 12 Jun 2018 08:58:49 +0000 Message-ID: <1528822708.13468.9.camel@nxp.com> References: <1528729173-28684-1-git-send-email-yibin.gong@nxp.com> <1528714877.2842.3.camel@pengutronix.de> In-Reply-To: <1528714877.2842.3.camel@pengutronix.de> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Evolution 3.18.5.2-0ubuntu3.2 x-originating-ip: [119.31.174.66] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;DB6PR04MB2967;7:U1+HRAosX9vCIlxSwMzniQ6KFYqO2ligDoI9iK0b4E/LLlPU9q79iXZeyGh1p2erLzweIo/apdMJtLpdD0mzQEyBp86y5k3D/0p67gON555J5o7lad0m3+TPFP6XTkcO3HaaHmOkKjIbWHMHJlTBYfSc8EA6tztRI244Elf2NYaEs4/76C3c9Dh41h9szmY98cK9n9PwCZ3OI1nDsI3dcXUhvlpiol/XVzM5VJOWqkj03gR0pijq1P77RZM3n4qq x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020);SRVR:DB6PR04MB2967; x-ms-traffictypediagnostic: DB6PR04MB2967: authentication-results: spf=none (sender IP is ) smtp.mailfrom=yibin.gong@nxp.com; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(6072148)(201708071742011)(7699016);SRVR:DB6PR04MB2967;BCL:0;PCL:0;RULEID:;SRVR:DB6PR04MB2967; x-forefront-prvs: 07013D7479 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(366004)(396003)(376002)(346002)(39380400002)(39860400002)(199004)(189003)(59450400001)(11346002)(6436002)(6486002)(186003)(6506007)(3280700002)(316002)(54906003)(26005)(76176011)(66066001)(102836004)(229853002)(99286004)(105586002)(106356001)(2900100001)(2906002)(3660700001)(36756003)(3846002)(50226002)(5660300001)(6116002)(446003)(110136005)(81156014)(103116003)(476003)(81166006)(2616005)(2501003)(8936002)(8676002)(5250100002)(6246003)(486006)(14454004)(25786009)(478600001)(86362001)(2201001)(305945005)(7736002)(4326008)(6512007)(53936002)(68736007)(97736004)(99106002);DIR:OUT;SFP:1101;SCL:1;SRVR:DB6PR04MB2967;H:DB6PR04MB3223.eurprd04.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: a9dMtnSN1lsHFM6Pz1H8jeCfa6nX234QU6NYLMEvdIIKULkPbWM9JiDrd3uzIouaQUS3tOOOjrP/aaHFGuc8LtCBnP0uok5kghbtAefzOTsMfYdKgc1fkbZSIEfUbssFiNaiZJsyDcan29kTIiXsd9vIF4tZDmQrimd+MbAQ23HqBsUAJYNdjKuYObRORajt spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <91E938A98C971F47951A07222CC37233@eurprd04.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: aaa00182-c618-4543-0048-08d5d042b70d X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: aaa00182-c618-4543-0048-08d5d042b70d X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Jun 2018 08:58:49.9825 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR04MB2967 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgTHVjYXMsDQoJSXMgdGhlIGJlbG93IERFQUQgTE9DSyBpc3N1ZSBzYW1lIGFzIHlvdXIgc2lk ZT8gSWYgeWVzLCB0aGVuDQpJJ20gYWZyYWlkIHRoYXQgd2UgaGF2ZSB0byBtYWtlIGFub3RoZXIg cGF0Y2ggZm9yIHVhcnQgdG8gc3BsaXQgZG1hDQpmdW5jdGlvbnMgaW4gdWFydCBkcml2ZXIgb3V0 IG9mIHRoZSBjb2RlIGFyZWEgd2hpY2ggcHJvdGVjdGVkIGJ5DQpwb3J0LmxvY2suIFRoZSB3YXJu aW5nIG1ha2Ugc2Vuc2Ugc2luY2UgYWxsb2NhdGUgc2RtYSBiZCBtZW1vcnkNCmR5bmFtaWNhbGx5 IGluIHZpcnQtZG1hIGluc3RlYWQgb2Ygc3RhdGljIGFsbG9jYXRlZCBhcyBiZWZvcmUuIEknbGwN Cm1ha2UgYW5vdGhlciB1YXJ0IHBhdGNoIGludG8gbXkgbmV4dCB2ZXJzaW9uIHBhdGNoc2V0Lg0K DQoNClvCoMKgwqA0Ni4xNTU0MDZdID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQpbwqDCoMKgNDYuMTYxNTAzXSBXQVJOSU5HOiBIQVJESVJRLXNh ZmUgLT4gSEFSRElSUS11bnNhZmUgbG9jayBvcmRlcg0KZGV0ZWN0ZWQNClvCoMKgwqA0Ni4xNjgx MjJdIDQuMTcuMC1yYzYtMDAwMDgtZzdjYWFmYTMtZGlydHkgIzQ4IE5vdCB0YWludGVkDQpbwqDC oMKgNDYuMTczNjk2XSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KW8KgwqDCoDQ2LjE3OTc5NV0gbXhjX3VhcnRfc3RyZXNzLzQxOSBbSEMwWzBd OlNDMFswXTpIRTA6U0UxXSBpcyB0cnlpbmcgdG8NCmFjcXVpcmU6DQpbwqDCoMKgNDYuMTg2OTM0 XSBmYTdjMTQ0MCAoZnNfcmVjbGFpbSl7Ky4rLn0sIGF0Og0KZnNfcmVjbGFpbV9hY3F1aXJlLnBh cnQuMysweDAvMHg0OA0KW8KgwqDCoDQ2LjE5NDI3MF0NClvCoMKgwqA0Ni4xOTQyNzBdIGFuZCB0 aGlzIHRhc2sgaXMgYWxyZWFkeSBob2xkaW5nOg0KW8KgwqDCoDQ2LjIwMDEwNl0gMDlhMTdmZGEg KCZwb3J0X2xvY2tfa2V5KXstLi0ufSwgYXQ6DQp1YXJ0X3dyaXRlKzB4ODQvMHgxOTANClvCoMKg wqA0Ni4yMDY2NThdIHdoaWNoIHdvdWxkIGNyZWF0ZSBhIG5ldyBsb2NrIGRlcGVuZGVuY3k6DQpb wqDCoMKgNDYuMjExNzEwXcKgwqAoJnBvcnRfbG9ja19rZXkpey0uLS59IC0+IChmc19yZWNsYWlt KXsrLisufQ0KW8KgwqDCoDQ2LjIxNzEzMl0NClvCoMKgwqA0Ni4yMTcxMzJdIGJ1dCB0aGlzIG5l dyBkZXBlbmRlbmN5IGNvbm5lY3RzIGEgSEFSRElSUS1pcnEtc2FmZQ0KbG9jazoNClvCoMKgwqA0 Ni4yMjUwNTFdwqDCoCgmcG9ydF9sb2NrX2tleSl7LS4tLn0NClvCoMKgwqA0Ni4yMjUwNjJdDQpb wqDCoMKgNDYuMjI1MDYyXSAuLi4gd2hpY2ggYmVjYW1lIEhBUkRJUlEtaXJxLXNhZmUgYXQ6DQpb wqDCoMKgNDYuMjM0NzQwXcKgwqDCoGxvY2tfYWNxdWlyZSsweDcwLzB4OTANClvCoMKgwqA0Ni4y MzgzMjZdwqDCoMKgX3Jhd19zcGluX2xvY2tfaXJxc2F2ZSsweDQwLzB4NTQNClvCoMKgwqA0Ni4y NDI3NzddwqDCoMKgaW14X3VhcnRfY29uc29sZV93cml0ZSsweDFiYy8weDFlMA0KW8KgwqDCoDQ2 LjI0NzQwMl3CoMKgwqBjb25zb2xlX3VubG9jaysweDMyMC8weDVmMA0KW8KgwqDCoDQ2LjI1MTMy OV3CoMKgwqB2cHJpbnRrX2VtaXQrMHgyMmMvMHgzZmMNClvCoMKgwqA0Ni4yNTUwODJdwqDCoMKg dnByaW50a19kZWZhdWx0KzB4MjgvMHgzMA0KW8KgwqDCoDQ2LjI1ODkyM13CoMKgwqB2cHJpbnRr X2Z1bmMrMHg3OC8weGNjDQpbwqDCoMKgNDYuMjYyNTAzXcKgwqDCoHByaW50aysweDM0LzB4NTQN ClvCoMKgwqA0Ni4yNjU1NjZdwqDCoMKgY3JuZ19mYXN0X2xvYWQrMHhmOC8weDEzOA0KW8KgwqDC oDQ2LjI2OTQwN13CoMKgwqBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MrMHgyMWMvMHgyNGMNClvC oMKgwqA0Ni4yNzQyMDRdwqDCoMKgaGFuZGxlX2lycV9ldmVudF9wZXJjcHUrMHg0MC8weDg0DQpb wqDCoMKgNDYuMjc4NzM5XcKgwqDCoGhhbmRsZV9pcnFfZXZlbnQrMHg0MC8weDY0DQpbwqDCoMKg NDYuMjgyNjY3XcKgwqDCoGhhbmRsZV9mYXN0ZW9pX2lycSsweGJjLzB4MTc4DQpbwqDCoMKgNDYu Mjg2ODU0XcKgwqDCoGdlbmVyaWNfaGFuZGxlX2lycSsweDI4LzB4M2MNClvCoMKgwqA0Ni4yOTA5 NTRdwqDCoMKgX19oYW5kbGVfZG9tYWluX2lycSsweDZjLzB4ZTgNClvCoMKgwqA0Ni4yOTUxNDhd wqDCoMKgZ2ljX2hhbmRsZV9pcnErMHg2NC8weGM0DQpbwqDCoMKgNDYuMjk4OTA0XcKgwqDCoF9f aXJxX3N2YysweDcwLzB4OTgNClvCoMKgwqA0Ni4zMDIyMjVdwqDCoMKgX3Jhd19zcGluX3VubG9j a19pcnErMHgzMC8weDM0DQpbwqDCoMKgNDYuMzA2NTA1XcKgwqDCoGZpbmlzaF90YXNrX3N3aXRj aCsweGMwLzB4MjdjDQpbwqDCoMKgNDYuMzEwNjkzXcKgwqDCoF9fc2NoZWR1bGUrMHgyYzAvMHg3 OWMNClvCoMKgwqA0Ni4zMTQyNzJdwqDCoMKgc2NoZWR1bGVfaWRsZSsweDQwLzB4ODQNClvCoMKg wqA0Ni4zMTc5NDFdwqDCoMKgZG9faWRsZSsweDE3OC8weDJiNA0KW8KgwqDCoDQ2LjMyMTI1OV3C oMKgwqBjcHVfc3RhcnR1cF9lbnRyeSsweDIwLzB4MjQNClvCoMKgwqA0Ni4zMjUyNzhdwqDCoMKg cmVzdF9pbml0KzB4MjE0LzB4MjY0DQpbwqDCoMKgNDYuMzI4Nzc1XcKgwqDCoHN0YXJ0X2tlcm5l bCsweDM5Yy8weDQyNA0KW8KgwqDCoDQ2LjMzMjUyN13CoMKgwqDCoMKgKG51bGwpDQpbwqDCoMKg NDYuMzM0ODkxXQ0KW8KgwqDCoDQ2LjMzNDg5MV0gdG8gYSBIQVJESVJRLWlycS11bnNhZmUgbG9j azoNClvCoMKgwqA0Ni4zNDAzNzldwqDCoChmc19yZWNsYWltKXsrLisufQ0KW8KgwqDCoDQ2LjM0 MDM5MV0NClvCoMKgwqA0Ni4zNDAzOTFdIC4uLiB3aGljaCBiZWNhbWUgSEFSRElSUS1pcnEtdW5z YWZlIGF0Og0KW8KgwqDCoDQ2LjM0OTg4NV0gLi4uDQpbwqDCoMKgNDYuMzQ5ODk1XcKgwqDCoGxv Y2tfYWNxdWlyZSsweDcwLzB4OTANClvCoMKgwqA0Ni4zNTUyMjVdwqDCoMKgZnNfcmVjbGFpbV9h Y3F1aXJlLnBhcnQuMysweDM4LzB4NDgNClvCoMKgwqA0Ni4zNTk5MzNdwqDCoMKgZnNfcmVjbGFp bV9hY3F1aXJlKzB4MWMvMHgyMA0KW8KgwqDCoDQ2LjM2NDAzNl3CoMKgwqBrbWVtX2NhY2hlX2Fs bG9jKzB4MmMvMHgxNzQNClvCoMKgwqA0Ni4zNjgwNTFdwqDCoMKgYWxsb2Nfd29ya2VyLmNvbnN0 cHJvcC4xMCsweDFjLzB4NTgNClvCoMKgwqA0Ni4zNzI3NTldwqDCoMKgaW5pdF9yZXNjdWVyLnBh cnQuNCsweDE4LzB4YTQNClvCoMKgwqA0Ni4zNzY5NTJdwqDCoMKgd29ya3F1ZXVlX2luaXQrMHhj MC8weDIxMA0KW8KgwqDCoDQ2LjM4MDc5M13CoMKgwqBrZXJuZWxfaW5pdF9mcmVlYWJsZSsweDU4 LzB4MWQ4DQpbwqDCoMKgNDYuMzg1MTU2XcKgwqDCoGtlcm5lbF9pbml0KzB4MTAvMHgxMWMNClvC oMKgwqA0Ni4zODg3MzZdwqDCoMKgcmV0X2Zyb21fZm9yaysweDE0LzB4MjANClvCoMKgwqA0Ni4z OTIzOTldwqDCoMKgwqDCoChudWxsKQ0KW8KgwqDCoDQ2LjM5NDc2Ml0NClvCoMKgwqA0Ni4zOTQ3 NjJdIG90aGVyIGluZm8gdGhhdCBtaWdodCBoZWxwIHVzIGRlYnVnIHRoaXM6DQpbwqDCoMKgNDYu Mzk0NzYyXQ0KW8KgwqDCoDQ2LjQwMjc2OV3CoMKgUG9zc2libGUgaW50ZXJydXB0IHVuc2FmZSBs b2NraW5nIHNjZW5hcmlvOg0KW8KgwqDCoDQ2LjQwMjc2OV0NClvCoMKgwqA0Ni40MDk1NjBdwqDC oMKgwqDCoMKgwqDCoENQVTDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Q1BVMQ0KW8KgwqDCoDQ2LjQxNDA5Ml3CoMKgwqDCoMKgwqDCoMKgLS0tLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAtLS0tDQpbwqDCoMKgNDYuNDE4NjIyXcKgwqDCoGxv Y2soZnNfcmVjbGFpbSk7DQpbwqDCoMKgNDYuNDIxNzcyXcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsb2NhbF9pcnFfZGlzYWJs ZSgpOw0KW8KgwqDCoDQ2LjQyNzY5M13CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbG9jaygmcG9ydF9sb2NrX2tleSk7DQpbwqDC oMKgNDYuNDMzNzA3XcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBsb2NrKGZzX3JlY2xhaW0pOw0KW8KgwqDCoDQ2LjQzOTM3Ml3C oMKgwqA8SW50ZXJydXB0Pg0KW8KgwqDCoDQ2LjQ0MTk5M13CoMKgwqDCoMKgbG9jaygmcG9ydF9s b2NrX2tleSk7DQpbwqDCoMKgNDYuNDQ1NjYxXQ0KW8KgwqDCoDQ2LjQ0NTY2MV3CoMKgKioqIERF QURMT0NLICoqKg0KW8KgwqDCoDQ2LjQ0NTY2MV0NCg0KT24g5LiALCAyMDE4LTA2LTExIGF0IDEz OjAxICswMjAwLCBMdWNhcyBTdGFjaCB3cm90ZToNCj4gSGkgUm9iaW4sDQo+IA0KPiB0aGlzIHNl cmllcyBicmVha3Mgc2VyaWFsIERNQSBmb3IgbWUuIEkgd2Fzbid0IGFibGUgdG8gZGlnIGluIGRl ZXBlcg0KPiB5ZXQuIFBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgY2FuIHRlc3QvcmVwcm9kdWNl IGF0IHlvdXIgc2lkZSwgaWYNCj4gbm90DQo+IEknbGwgdHJ5IHRvIGZpbmQgc29tZSB0aW1lIHRv IGNvbGxlY3Qgc29tZSBtb3JlIGRlYnVnIGluZm8uDQo+IA0KPiBSZWdhcmRzLA0KPiBMdWNhcw0K PiANCj4gQW0gTW9udGFnLCBkZW4gMTEuMDYuMjAxOCwgMjI6NTkgKzA4MDAgc2NocmllYiBSb2Jp biBHb25nOg0KPiA+IA0KPiA+IFRoZSBsZWdhY3kgc2RtYSBkcml2ZXIgaGFzIGJlbG93IGxpbWl0 YXRpb25zIG9yIGRyYXdiYWNrczoNCj4gPiDCoCAxLiBIYXJkY29kZSB0aGUgbWF4IEJEcyBudW1i ZXIgYXMgIlBBR0VfU0laRSAvIHNpemVvZigqKSIsIGFuZA0KPiA+IGFsbG9jDQo+ID4gwqDCoMKg wqDCoG9uZSBwYWdlIHNpemUgZm9yIG9uZSBjaGFubmVsIHJlZ2FyZGxlc3Mgb2Ygb25seSBmZXcg QkRzDQo+ID4gbmVlZGVkDQo+ID4gwqDCoMKgwqDCoG1vc3QgdGltZS4gQnV0IGluIGZldyBjYXNl cywgdGhlIG1heCBQQUdFX1NJWkUgbWF5YmUgbm90DQo+ID4gZW5vdWdoLg0KPiA+IMKgIDIuIE9u ZSBTRE1BIGNoYW5uZWwgY2FuJ3Qgc3RvcCBpbW1lZGlhdGxleSBvbmNlIGNoYW5uZWwgZGlzYWJs ZWQNCj4gPiB3aGljaA0KPiA+IMKgwqDCoMKgwqBtZWFucyBTRE1BIGludGVycnVwdCBtYXkgY29t ZSBpbiBhZnRlciB0aGlzIGNoYW5uZWwNCj4gPiB0ZXJtaW5hdGVkLlRoZXJlDQo+ID4gwqDCoMKg wqDCoGFyZSBzb21lIHBhdGNoZXMgZm9yIHRoaXMgY29ybmVyIGNhc2Ugc3VjaCBhcyBjb21taXQN Cj4gPiAiMjc0NmUyYzM4OWY5IiwNCj4gPiDCoMKgwqDCoMKgYnV0IG5vdCBjb3ZlciBub24tY3lj bGljLg0KPiA+IA0KPiA+IFRoZSBjb21tb24gdmlydC1kbWEgb3ZlcmNvbWVzIHRoZSBhYm92ZSBs aW1pdGF0aW9ucy4gSXQgY2FuIGFsbG9jDQo+ID4gYmQNCj4gPiBkeW5hbWljYWxseSBhbmQgZnJl ZSBiZCBvbmNlIHRoaXMgdHggdHJhbnNmZXIgZG9uZS4gTm8gbWVtb3J5DQo+ID4gd2FzdGVkIG9y DQo+ID4gbWF4aW11bSBsaW1pdGl0YXRpb24gaGVyZSwgb25seSBkZXBlbmRzIG9uIGhvdyBtYW55 IG1lbW9yeSBjYW4gYmUNCj4gPiByZXF1ZXN0ZWQNCj4gPiBmcm9tIGtlcm5lbC4gRm9yIE5vLjIs IHN1Y2ggaXNzdWUgY2FuIGJlIHdvcmthcm91bmQgYnkgY2hlY2tpbmcgaWYNCj4gPiB0aGVyZQ0K PiA+IGlzIGF2YWlsYWJsZSBkZXNjcmlwdCgic2RtYWMtPmRlc2MiKSBub3cgb25jZSB0aGUgdW53 YW50ZWQNCj4gPiBpbnRlcnJ1cHQNCj4gPiBjb21pbmcuIEF0IGxhc3QgdGhlIGNvbW1vbiB2aXJ0 LWRtYSBpcyBlYXNpZXIgZm9yIHNkbWEgZHJpdmVyDQo+ID4gbWFpbnRhaW4uDQo+ID4gDQo+ID4g Q2hhbmdlIGZyb20gdjI6DQo+ID4gwqAgMS4gaW5jbHVkZSBTYXNjaGEncyBwYXRjaCB0byBtYWtl IHRoZSBtYWluIHBhdGNoIGVhc2llciB0bw0KPiA+IHJldmlldy4NCj4gPiDCoMKgwqDCoMKgVGhh bmtzIFNhY2hhLg0KPiA+IMKgIDIuIHJlbW92ZSB1c2VsZXNzICdkZXNjJy8nY2hhbicgaW4gc3Ry dWN0IHNkbWFfY2hhbm5lLg0KPiA+IA0KPiA+IENoYW5nZSBmcm9tIHYxOg0KPiA+IMKgIDEuIHNw bGl0IHYxIHBhdGNoIGludG8gNSBwYXRjaGVzLg0KPiA+IMKgIDIuIHJlbW92ZSBzb21lIHVubmVj ZXNzYXJ5IGNvbmRpdGlvbiBjaGVjay4NCj4gPiDCoCAzLiByZW1vdmUgdW5uZWNlc3NhcnkgJ3Bl bmRpbmcnIGxpc3QuDQo+ID4gDQo+ID4gUm9iaW4gR29uZyAoNSk6DQo+ID4gwqAgZG1hZW5naW5l OiBpbXgtc2RtYTogYWRkIHZpcnQtZG1hIHN1cHBvcnQNCj4gPiDCoCBSZXZlcnQgImRtYWVuZ2lu ZTogaW14LXNkbWE6IGZpeCBwYWdlZmF1bHQgd2hlbiBjaGFubmVsIGlzDQo+ID4gZGlzYWJsZWQN Cj4gPiDCoMKgwqDCoGR1cmluZyBpbnRlcnJ1cHQiDQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2Rt YTogcmVtb3ZlIHVzbGVzcyBsb2NrDQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2RtYTogcmVtb3Zl IHRoZSBtYXhpbXVtIGxpbWF0aW9uIGZvciBiZCBudW1iZXJzDQo+ID4gwqAgZG1hZW5naW5lOiBp bXgtc2RtYTogYWRkIHNkbWFfdHJhbnNmZXJfaW5pdCB0byBkZWNyZWFzZSBjb2RlDQo+ID4gb3Zl cmxhcA0KPiA+IA0KPiA+IMKgZHJpdmVycy9kbWEvS2NvbmZpZ8KgwqDCoMKgfMKgwqDCoDEgKw0K PiA+IMKgZHJpdmVycy9kbWEvaW14LXNkbWEuYyB8IDM5MiArKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0tLS0tLS0tDQo+ID4gLS0tLS0tLS0tLS0tDQo+ID4gwqAyIGZpbGVzIGNoYW5nZWQs IDIyNyBpbnNlcnRpb25zKCspLCAxNjYgZGVsZXRpb25zKC0pDQo+ID4gDQo+ID4gLS3CoA0KPiA+ IDIuNy40DQo+ID4gDQo+ID4gUm9iaW4gR29uZyAoNSk6DQo+ID4gwqAgZG1hZW5naW5lOiBpbXgt c2RtYTogYWRkIHZpcnQtZG1hIHN1cHBvcnQNCj4gPiDCoCBSZXZlcnQgImRtYWVuZ2luZTogaW14 LXNkbWE6IGZpeCBwYWdlZmF1bHQgd2hlbiBjaGFubmVsIGlzDQo+ID4gZGlzYWJsZWQNCj4gPiDC oMKgwqDCoGR1cmluZyBpbnRlcnJ1cHQiDQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2RtYTogcmVt b3ZlIHVzbGVzcyBsb2NrDQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2RtYTogcmVtb3ZlIHRoZSBt YXhpbXVtIGxpbWF0aW9uIGZvciBiZCBudW1iZXJzDQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2Rt YTogYWRkIHNkbWFfdHJhbnNmZXJfaW5pdCB0byBkZWNyZWFzZSBjb2RlDQo+ID4gb3ZlcmxhcA0K PiA+IA0KPiA+IFNhc2NoYSBIYXVlciAoMSk6DQo+ID4gwqAgZG1hZW5naW5lOiBpbXgtc2RtYTog ZmFjdG9yIG91dCBhIHN0cnVjdCBzZG1hX2Rlc2MgZnJvbSBzdHJ1Y3QNCj4gPiDCoMKgwqDCoHNk bWFfY2hhbm5lbA0KPiA+IA0KPiA+IMKgZHJpdmVycy9kbWEvS2NvbmZpZ8KgwqDCoMKgfMKgwqDC oDEgKw0KPiA+IMKgZHJpdmVycy9kbWEvaW14LXNkbWEuYyB8IDM5MSArKysrKysrKysrKysrKysr KysrKysrKysrKysrLS0tLS0tLS0tDQo+ID4gLS0tLS0tLS0tLS0tDQo+ID4gwqAyIGZpbGVzIGNo YW5nZWQsIDIyNiBpbnNlcnRpb25zKCspLCAxNjYgZGVsZXRpb25zKC0pDQo+ID4g